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>
This commit is contained in:
Dennis Chen 2016-07-30 11:02:22 -04:00 committed by 无闻
parent 3e22ae3412
commit dfab54d5a2
2 changed files with 56 additions and 3 deletions

View file

@ -422,6 +422,50 @@ func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxLine
return diff, nil return diff, nil
} }
func GetDiffCommit(repoPath, commitId string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) { func GetRawDiff(repoPath, commitID, diffType string) (string, error) {
return GetDiffRange(repoPath, "", commitId, maxLines, maxLineCharacteres, maxFiles) 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)
} }

View file

@ -195,7 +195,16 @@ func Diff(ctx *context.Context) {
} }
func RawDiff(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) { func CompareDiff(ctx *context.Context) {