diff --git a/modules/git/tree.go b/modules/git/tree.go index f6fdff97d0..8e04b721fa 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -73,3 +73,14 @@ func (repo *Repository) GetTreePathLatestCommit(refName, treePath string) (*Comm } return repo.GetCommit(strings.TrimSpace(stdout)) } + +// rev-parse parses the output of `git rev-parse` command +func (repo *Repository) RevParse(ref string, file string) (string, error) { + stdout, _, err := NewCommand("rev-parse"). + AddDynamicArguments(ref+":"+file). + RunStdString(repo.Ctx, &RunOpts{Dir: repo.Path}) + if err != nil { + return "", err + } + return strings.TrimSpace(stdout), nil +} diff --git a/tests/integration/compare_test.go b/tests/integration/compare_test.go index 712328db86..634a6b5652 100644 --- a/tests/integration/compare_test.go +++ b/tests/integration/compare_test.go @@ -9,6 +9,7 @@ import ( "net/url" "strings" "testing" + "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" @@ -160,7 +161,7 @@ func TestCompareCodeExpand(t *testing.T) { }) } -func TestCompareRawDiff(t *testing.T) { +func TestCompareRawDiffNormal(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) repo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user1, user1, repo_service.CreateRepoOptions{ @@ -171,16 +172,19 @@ func TestCompareRawDiff(t *testing.T) { }, true) assert.NoError(t, err) session := loginUser(t, user1.Name) + r, _ := gitrepo.OpenRepository(db.DefaultContext, repo) + oldRef, _ := r.GetBranchCommit(repo.DefaultBranch) + oldBlobRef, _ := r.RevParse(oldRef.ID.String(), "README.md") + testEditFile(t, session, user1.Name, repo.Name, "main", "README.md", strings.Repeat("a\n", 2)) + newRef, _ := r.GetBranchCommit(repo.DefaultBranch) - fmt.Println("oldRef", oldRef.ID.String()) - fmt.Println("newRef", newRef.ID.String()) + newBlobRef, _ := r.RevParse(newRef.ID.String(), "README.md") req := NewRequest(t, "GET", fmt.Sprintf("/user1/test_raw_diff/compare/%s...%s.diff", oldRef.ID.String(), newRef.ID.String())) resp := session.MakeRequest(t, req, http.StatusOK) - fmt.Println("resp", resp.Body.String()) expected := fmt.Sprintf(`diff --git a/README.md b/README.md index %s..%s 100644 @@ -191,9 +195,64 @@ index %s..%s 100644 - +a +a -`, - oldRef.ID.String()[:7], newRef.ID.String()[:7]) - - assert.Equal(t, resp.Body.String(), expected) +`, oldBlobRef[:7], newBlobRef[:7]) + assert.Equal(t, expected, resp.Body.String()) + }) +} + +func TestCompareRawDiffPatch(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + repo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user1, user1, repo_service.CreateRepoOptions{ + Name: "test_raw_diff", + Readme: "Default", + AutoInit: true, + DefaultBranch: "main", + }, true) + assert.NoError(t, err) + session := loginUser(t, user1.Name) + + r, _ := gitrepo.OpenRepository(db.DefaultContext, repo) + + // Get the old commit and blob reference + oldRef, _ := r.GetBranchCommit(repo.DefaultBranch) + oldBlobRef, _ := r.RevParse(oldRef.ID.String(), "README.md") + + resp := testEditFile(t, session, user1.Name, repo.Name, "main", "README.md", strings.Repeat("a\n", 2)) + + newRef, _ := r.GetBranchCommit(repo.DefaultBranch) + newBlobRef, _ := r.RevParse(newRef.ID.String(), "README.md") + + // Get the last modified time from the response header + respTs, _ := time.Parse(time.RFC1123, resp.Result().Header.Get("Last-Modified")) + respTs = respTs.In(time.Local) + + // Format the timestamp to match the expected format in the patch + customFormat := "Mon, 02 Jan 2006 15:04:05" + respTsStr := respTs.Format(customFormat) + + req := NewRequest(t, "GET", fmt.Sprintf("/user1/test_raw_diff/compare/%s...%s.patch", oldRef.ID.String(), newRef.ID.String())) + resp = session.MakeRequest(t, req, http.StatusOK) + + expected := fmt.Sprintf(`From %s Mon Sep 17 00:00:00 2001 +From: User One +Date: %s +0300 +Subject: [PATCH] Update README.md + +--- + README.md | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/README.md b/README.md +index %s..%s 100644 +--- a/README.md ++++ b/README.md +@@ -1,2 +1,2 @@ +-# test_raw_diff +- ++a ++a +`, newRef.ID.String(), respTsStr, oldBlobRef[:7], newBlobRef[:7]) + assert.Equal(t, expected, resp.Body.String()) }) }