summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDennis Chen <barracks510@gmail.com>2016-07-30 11:02:22 -0400
committer无闻 <u@gogs.io>2016-07-30 23:02:22 +0800
commitdfab54d5a2739b3b2a1fe45481c2269d1aeec1a9 (patch)
tree28ee62bf282ef7117a1d499a821a2e1d8ca90052
parent3e22ae3412409caa6f1a456a59d9524f96a3dce2 (diff)
downloadgitea-dfab54d5a2739b3b2a1fe45481c2269d1aeec1a9.tar.gz
gitea-dfab54d5a2739b3b2a1fe45481c2269d1aeec1a9.zip
Diff patch (#3345)
* Add support for .diff and .patch Add the ability to get text-diff and format-patch by adding .diff or .patch in the end of a commit url. Issue #2641 * models: git_diff: various fixes * Renames commitId to commitID. * Writes stderr to a bytes.Buffer and displays proper error message on command failure. * Various style changes. Signed-off-by: Dennis Chen <barracks510@gmail.com>
-rw-r--r--models/git_diff.go48
-rw-r--r--routers/repo/commit.go11
2 files changed, 56 insertions, 3 deletions
diff --git a/models/git_diff.go b/models/git_diff.go
index 33a63295f0..9cec5f62b6 100644
--- a/models/git_diff.go
+++ b/models/git_diff.go
@@ -422,6 +422,50 @@ func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxLine
return diff, nil
}
-func GetDiffCommit(repoPath, commitId string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) {
- return GetDiffRange(repoPath, "", commitId, maxLines, maxLineCharacteres, maxFiles)
+func GetRawDiff(repoPath, commitID, diffType string) (string, error) {
+ repo, err := git.OpenRepository(repoPath)
+ if err != nil {
+ return "", err
+ }
+
+ commit, err := repo.GetCommit(commitID)
+ if err != nil {
+ return "", err
+ }
+
+ var cmd *exec.Cmd
+ switch diffType {
+ case "diff":
+ if commit.ParentCount() == 0 {
+ cmd = exec.Command("git", "show", commitID)
+ } else {
+ c, _ := commit.Parent(0)
+ cmd = exec.Command("git", "diff", "-M", c.ID.String(), commitID)
+ }
+ case "patch":
+ if commit.ParentCount() == 0 {
+ cmd = exec.Command("git", "format-patch", "--no-signature", "--stdout", "--root", commitID)
+ } else {
+ c, _ := commit.Parent(0)
+ query := fmt.Sprintf("%s...%s", commitID, c.ID.String())
+ cmd = exec.Command("git", "format-patch", "--no-signature", "--stdout", query)
+ }
+ default:
+ return "", fmt.Errorf("Invalid diffType '%s'", diffType)
+ }
+
+ stderr := new(bytes.Buffer)
+
+ cmd.Dir = repoPath
+ cmd.Stderr = stderr
+
+ stdout, err := cmd.Output()
+ if err != nil {
+ return "", fmt.Errorf("%v - %s", err, stderr)
+ }
+ return string(stdout), nil
+}
+
+func GetDiffCommit(repoPath, commitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) {
+ return GetDiffRange(repoPath, "", commitID, maxLines, maxLineCharacteres, maxFiles)
}
diff --git a/routers/repo/commit.go b/routers/repo/commit.go
index 436a06ee9b..779fd644d3 100644
--- a/routers/repo/commit.go
+++ b/routers/repo/commit.go
@@ -195,7 +195,16 @@ func Diff(ctx *context.Context) {
}
func RawDiff(ctx *context.Context) {
- panic("not implemented")
+ diff, err := models.GetRawDiff(
+ models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name),
+ ctx.Params(":sha"),
+ ctx.Params(":ext"),
+ )
+ if err != nil {
+ ctx.Handle(404, "GetRawDiff", err)
+ return
+ }
+ ctx.HandleText(200, diff)
}
func CompareDiff(ctx *context.Context) {