diff options
author | Dennis Chen <barracks510@gmail.com> | 2016-07-30 11:02:22 -0400 |
---|---|---|
committer | 无闻 <u@gogs.io> | 2016-07-30 23:02:22 +0800 |
commit | dfab54d5a2739b3b2a1fe45481c2269d1aeec1a9 (patch) | |
tree | 28ee62bf282ef7117a1d499a821a2e1d8ca90052 | |
parent | 3e22ae3412409caa6f1a456a59d9524f96a3dce2 (diff) | |
download | gitea-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.go | 48 | ||||
-rw-r--r-- | routers/repo/commit.go | 11 |
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) { |