]> source.dussan.org Git - gitea.git/commitdiff
Diff patch (#3345)
authorDennis Chen <barracks510@gmail.com>
Sat, 30 Jul 2016 15:02:22 +0000 (11:02 -0400)
committer无闻 <u@gogs.io>
Sat, 30 Jul 2016 15:02:22 +0000 (23:02 +0800)
* 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>
models/git_diff.go
routers/repo/commit.go

index 33a63295f02dcd989dc23b3f853b85b418ee5fec..9cec5f62b69e28372ee5ed870316f74d0ec230c2 100644 (file)
@@ -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)
 }
index 436a06ee9b87315bba1acd4b17000fc53d9c1177..779fd644d3f9d3f554185f3707bc5fdc2d3435c1 100644 (file)
@@ -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) {