From a5b1c1b0b32a3746690fc10c9a4594a5b5b5c54f Mon Sep 17 00:00:00 2001 From: Gusted Date: Thu, 14 Sep 2023 21:53:57 +0200 Subject: [PATCH] [GITEA] Detect file rename and show in history - Add a indication to the file history if the file has been renamed, this indication contains a link to browse the history of the file further. - Added unit testing. - Added integration testing. - Resolves https://codeberg.org/forgejo/forgejo/issues/1279 (cherry picked from commit 72c297521b1830360aab4b50e37efcc7e67e0d5d) (cherry picked from commit 283f9648947f8dd2f315ecca19566ccca2b49c18) Conflicts: options/locale/locale_en-US.ini https://codeberg.org/forgejo/forgejo/pulls/1550 (cherry picked from commit 7c30af7fdee08efd02041c01abca47394a69bb8b) (cherry picked from commit f3be6eb269526a9f4ea7861189f07977f2d4a32f) (cherry picked from commit 78e1755b94c18c043e0c8f8c2849803cc8069feb) (cherry picked from commit 73799479e0fb68534dac10f809ee246dbc809b62) (cherry picked from commit 938359b94120b7ea7bcdfbfda265ada691620da1) (cherry picked from commit b168a9c081f93c10d40319333fc24d68a4f9763c) [GITEA] Detect file rename and show in history (squash) ctx.Locale (cherry picked from commit 40447752ff97aa306295685dcf4ddd3b13f48320) (cherry picked from commit ea23594cdbb12c32dc28638f65bf40e37d344e5f) (cherry picked from commit cdc473850c85abcbe38c799c2d2446966978f2b2) (cherry picked from commit 86e6641c29df213d7db1b85867dafebcafeee1dd) (cherry picked from commit 2757de586b80834513e61033692ac72d25381431) (cherry picked from commit def4ae32ddb4b0b83f6bb9c197e00fdcd784928e) (cherry picked from commit 6dada09329e28840f7ad890bed333ae122838fb2) (cherry picked from commit 5d6d5272513629b126917c30f7bfde421fdcbe27) Conflicts: tests/integration/repo_test.go https://codeberg.org/forgejo/forgejo/pulls/2119 (cherry picked from commit d3c1bce7db31b243a7142b71bf4af36506752e6e) (cherry picked from commit 04bcb22d5c00d1fa8b39e2a3cf2e73f0a8c1204f) (cherry picked from commit e16241fd992c22203d113a4a11e7f57f9ed2ddb3) (cherry picked from commit 8e2beb3ed5da1ac8a58608acdf059f607576ff96) --- modules/git/commit.go | 56 ++++++++++++++++++ modules/git/commit_test.go | 27 +++++++++ routers/web/repo/commit.go | 16 +++++ templates/repo/commits.tmpl | 5 ++ .../40/8bbd3bd1f96950f8cf2f98c479557f6b18817a | Bin 63 -> 0 bytes .../5d/5c87a90af64cc67f22d60a942d5efaef8bc96b | Bin 50 -> 0 bytes .../88/3e2970ed6937cbb63311e941adb97df0ae3a52 | Bin 49 -> 0 bytes .../8c/ac7a8f434451410cc91ab9c04d07baff974ad8 | Bin 120 -> 0 bytes .../a0/ccafed39086ef520be6886d9395eb2100d317e | Bin 102 -> 0 bytes .../ab/e2a9ddfd7f542ff89bc13960a929dc8ca86c99 | Bin 36 -> 0 bytes .../cd/879fb6cf5b7bbe0fbc3a0ef44c8695fde89a56 | Bin 108 -> 0 bytes .../d8/f53dfb33f6ccf4169c34970b5e747511c18beb | Bin 784 -> 0 bytes .../f3/c1ec36c0e7605be54e71f24035caa675b7ba41 | Bin 48 -> 0 bytes .../repo59.git/objects/info/commit-graph | Bin 0 -> 1292 bytes .../user2/repo59.git/objects/info/packs | 2 + ...d3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.idx | Bin 0 -> 1660 bytes ...3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.pack | Bin 0 -> 6316 bytes ...d3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.rev | Bin 0 -> 136 bytes .../user2/repo59.git/packed-refs | 3 +- .../user2/repo59.git/refs/heads/cake-recipe | 1 - tests/integration/repo_test.go | 30 ++++++++++ 21 files changed, 138 insertions(+), 2 deletions(-) delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/40/8bbd3bd1f96950f8cf2f98c479557f6b18817a delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/5d/5c87a90af64cc67f22d60a942d5efaef8bc96b delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/88/3e2970ed6937cbb63311e941adb97df0ae3a52 delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/8c/ac7a8f434451410cc91ab9c04d07baff974ad8 delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/a0/ccafed39086ef520be6886d9395eb2100d317e delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/ab/e2a9ddfd7f542ff89bc13960a929dc8ca86c99 delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/cd/879fb6cf5b7bbe0fbc3a0ef44c8695fde89a56 delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/d8/f53dfb33f6ccf4169c34970b5e747511c18beb delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/f3/c1ec36c0e7605be54e71f24035caa675b7ba41 create mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/info/commit-graph create mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/info/packs create mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.idx create mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.pack create mode 100644 tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.rev delete mode 100644 tests/gitea-repositories-meta/user2/repo59.git/refs/heads/cake-recipe diff --git a/modules/git/commit.go b/modules/git/commit.go index 5d960e92f3..012ba975e8 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -515,6 +515,62 @@ func GetCommitFileStatus(ctx context.Context, repoPath, commitID string) (*Commi return fileStatus, nil } +func parseCommitRenames(renames *[][2]string, stdout io.Reader) { + rd := bufio.NewReader(stdout) + for { + // Skip (R || three digits || NULL byte) + _, err := rd.Discard(5) + if err != nil { + if err != io.EOF { + log.Error("Unexpected error whilst reading from git log --name-status. Error: %v", err) + } + return + } + oldFileName, err := rd.ReadString('\x00') + if err != nil { + if err != io.EOF { + log.Error("Unexpected error whilst reading from git log --name-status. Error: %v", err) + } + return + } + newFileName, err := rd.ReadString('\x00') + if err != nil { + if err != io.EOF { + log.Error("Unexpected error whilst reading from git log --name-status. Error: %v", err) + } + return + } + oldFileName = strings.TrimSuffix(oldFileName, "\x00") + newFileName = strings.TrimSuffix(newFileName, "\x00") + *renames = append(*renames, [2]string{oldFileName, newFileName}) + } +} + +// GetCommitFileRenames returns the renames that the commit contains. +func GetCommitFileRenames(ctx context.Context, repoPath, commitID string) ([][2]string, error) { + renames := [][2]string{} + stdout, w := io.Pipe() + done := make(chan struct{}) + go func() { + parseCommitRenames(&renames, stdout) + close(done) + }() + + stderr := new(bytes.Buffer) + err := NewCommand(ctx, "show", "--name-status", "--pretty=format:", "-z", "--diff-filter=R").AddDynamicArguments(commitID).Run(&RunOpts{ + Dir: repoPath, + Stdout: w, + Stderr: stderr, + }) + w.Close() // Close writer to exit parsing goroutine + if err != nil { + return nil, ConcatenateError(err, stderr.String()) + } + + <-done + return renames, nil +} + // GetFullCommitID returns full length (40) of commit ID by given short SHA in a repository. func GetFullCommitID(ctx context.Context, repoPath, shortID string) (string, error) { commitID, _, err := NewCommand(ctx, "rev-parse").AddDynamicArguments(shortID).RunStdString(&RunOpts{Dir: repoPath}) diff --git a/modules/git/commit_test.go b/modules/git/commit_test.go index e512eecc56..2de6feeb31 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -278,3 +278,30 @@ func TestGetCommitFileStatusMerges(t *testing.T) { assert.Equal(t, commitFileStatus.Removed, expected.Removed) assert.Equal(t, commitFileStatus.Modified, expected.Modified) } + +func TestParseCommitRenames(t *testing.T) { + testcases := []struct { + output string + renames [][2]string + }{ + { + output: "R090\x00renamed.txt\x00history.txt\x00", + renames: [][2]string{{"renamed.txt", "history.txt"}}, + }, + { + output: "R090\x00renamed.txt\x00history.txt\x00R000\x00corruptedstdouthere", + renames: [][2]string{{"renamed.txt", "history.txt"}}, + }, + { + output: "R100\x00renamed.txt\x00history.txt\x00R001\x00readme.md\x00README.md\x00", + renames: [][2]string{{"renamed.txt", "history.txt"}, {"readme.md", "README.md"}}, + }, + } + + for _, testcase := range testcases { + renames := [][2]string{} + parseCommitRenames(&renames, strings.NewReader(testcase.output)) + + assert.Equal(t, testcase.renames, renames) + } +} diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index 32fa973ef6..3b6e482281 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -244,6 +244,22 @@ func FileHistory(ctx *context.Context) { ctx.ServerError("CommitsByFileAndRange", err) return } + oldestCommit := commits[len(commits)-1] + + renamedFiles, err := git.GetCommitFileRenames(ctx, ctx.Repo.GitRepo.Path, oldestCommit.ID.String()) + if err != nil { + ctx.ServerError("GetCommitFileRenames", err) + return + } + + for _, renames := range renamedFiles { + if renames[1] == fileName { + ctx.Data["OldFilename"] = renames[0] + ctx.Data["OldFilenameHistory"] = fmt.Sprintf("%s/commits/commit/%s/%s", ctx.Repo.RepoLink, oldestCommit.ID.String(), renames[0]) + break + } + } + ctx.Data["Commits"] = git_model.ConvertFromGitCommit(ctx, commits, ctx.Repo.Repository) ctx.Data["Username"] = ctx.Repo.Owner.Name diff --git a/templates/repo/commits.tmpl b/templates/repo/commits.tmpl index 42004c2610..7b3b27af1d 100644 --- a/templates/repo/commits.tmpl +++ b/templates/repo/commits.tmpl @@ -13,6 +13,11 @@ {{template "repo/commits_table" .}} + {{if .OldFilename}} +
+ {{ctx.Locale.Tr "repo.commits.renamed_from" .OldFilename}} ({{ctx.Locale.Tr "repo.commits.browse_further"}}) +
+ {{end}} {{template "base/footer" .}} diff --git a/tests/gitea-repositories-meta/user2/repo59.git/objects/40/8bbd3bd1f96950f8cf2f98c479557f6b18817a b/tests/gitea-repositories-meta/user2/repo59.git/objects/40/8bbd3bd1f96950f8cf2f98c479557f6b18817a deleted file mode 100644 index 567284ef1c21f472841f3d729cbfe024d78c448c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63 zcmbzoYm2=O@SLD?b)pd2*&HWbdRdp|;I$KX0GgzwX}g{l~lBcl+PIvR^-~ Lm673rw}uP=dp#I3H~j5TXAQHQ+ow_Wkasm1_tS$dJ})t`gvJeukLj3eGz{+`4&fF zR*1>6n!=KE)qA`<*cXa!KKc8S;Q#cQH?1~)oh`hP)p2E3>!KeVSF)`04+hP46q_T$ PsXhP0y}u04Wz+=$$I&oG diff --git a/tests/gitea-repositories-meta/user2/repo59.git/objects/d8/f53dfb33f6ccf4169c34970b5e747511c18beb b/tests/gitea-repositories-meta/user2/repo59.git/objects/d8/f53dfb33f6ccf4169c34970b5e747511c18beb deleted file mode 100644 index bea28c9f69b13925696567043b55ee3a544ce94c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784 zcmb2I zRlakVz$fZ?QehHK*YK-&?^&`(A#(Gv)97xQn96 zp$+l>yF5hBGW9)bSiLOb$FtZI_vbK)tcb}KHWX9s3Eru+z{jCd-JY{Ie*=zJ~P6;jg9q7f<5=%9fk+zedU>b#dZ6lJ>jiB4S}m!Je_$?zc+Ya zQ1#~P?PmTbFJA1Bsq(p0E1>yd-&OC#?UJ=C-1mI;Pk+|co@L>gxIa?s&l`^4Tg$)v zR#vQHsx@2xwEf?;Ki7XAzU_E2FyUl)`fTQ%*O`q<&m7Mw+a5mssz>$)5Z3NX?P9YtCFd*8YlW-LR%CO6_|gL-{c_|H)5h9egDwUY%;v z{++i<_Dpy~aiZ|@SC3NOTc7EhSh=&t{*`I_t3O%44^CfqwD)t*EY7?nq1EA)++jA` zq%K}`zQy0BDo{67uhLj&MwsFM3x^_?Gw`hb^*F>-=x31K<;1gUmD5tgPrlG9_smbS z$Ynul&CFtjPUJh`Hs|edWii)t-v2 zot3|7v$jZJ_N2;L<+48=8|CGkn7{TLAF=v7-7w_qs%2WM4sM@*)#WdX(0kWr0P4Gg AUjP6A diff --git a/tests/gitea-repositories-meta/user2/repo59.git/objects/f3/c1ec36c0e7605be54e71f24035caa675b7ba41 b/tests/gitea-repositories-meta/user2/repo59.git/objects/f3/c1ec36c0e7605be54e71f24035caa675b7ba41 deleted file mode 100644 index b6803eb5a271b9d33c981d1ba24fa4126ae409db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48 zcmbE5Aa}QWMT04ba7*V02hBx7as_d#l_jhF$BtPaCdPug0kO0Xb{Qr14LrMj0_A6 zqj+S50TTlQ!ziX*7%($1FbrDEx;Eo=h)=_#NlwKtcS;zx1yxTqYS>{D)1+{Cl_lGQ z#!pO(mWSD$sJ!vj_P6o3Ghf8!m`vx6D=8H`*!?;r?APL_Of6~*9$S`Ft(RtD}So#!DFEE2C9Z5m4*FM&zh=!XO}=n zo|95L5BRe0`aj+421p)+LFS~~H<<>~1H&u4TiP@pZx`n(aW0aa{zWD#Dx?Mgj^ literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo59.git/objects/info/packs b/tests/gitea-repositories-meta/user2/repo59.git/objects/info/packs new file mode 100644 index 0000000000..0374746b5e --- /dev/null +++ b/tests/gitea-repositories-meta/user2/repo59.git/objects/info/packs @@ -0,0 +1,2 @@ +P pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.pack + diff --git a/tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.idx b/tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.idx new file mode 100644 index 0000000000000000000000000000000000000000..aaa9981cf5982e0cdf26f13d8095020ce465ddef GIT binary patch literal 1660 zcmexg;-AdGz`(?S9WXL5Fp!HuW`Zy?0|UcQz$^?54AjJ|3=9l}FdG8{!(hSe3=9nT zFb4wz11A#ZVqjpvhq)OT7;s@81_lOn%*VjM0K)tX3=D*@00RR9J+L4H0|P!R#K6En zEEZ;9U?2yJFfcHXibWY17)ZjbYcpPl_%uA4jjd8r=qQOvX4hW$5Rzu|&QJ%{Hdk~k2!SjwZ8Z>GvLR0{TW9pL+i688mmIW zel32=)S|}Vv1LisddZfxc9Ukt#O~7y4Uoec?^2?AY>iioHQs z&7yS=B@VT_EVb6Hdst{&=o}D|e`ochm3RNvhv@&9eb6#trRJTU6*)7H@|^ve+@<*X z{gRq@!LwKM-<)HraJGH^w)4@|`}p@*@qO`WoBH>~tgstjZGRhoJM%?sj>&ZHxRO%A zgWa#6&3!a`)5UAf-rbt(%A;-^deRd-@$Ou`dL=j ztRIp;CHxo|Bq|vg#M>AcL@zQh@GoUx5PQnNAYR14z~;`tAby^Kfir}GLHsQPgV0F^ z28n(K2C?0_mzVt$?w2ip=%bh2m*e1|`<42uMWcGu-|@vvtw>R8Woap12>?WC BB9#CD literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.pack b/tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.pack new file mode 100644 index 0000000000000000000000000000000000000000..ddb8c16caf1f0600bf22af94b7f41c3799679617 GIT binary patch literal 6316 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 literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.rev b/tests/gitea-repositories-meta/user2/repo59.git/objects/pack/pack-6dd3a6fe138f1d77e14c2e6b8e6c41e5ae242adf.rev new file mode 100644 index 0000000000000000000000000000000000000000..81554dba7405b86a5e8db6c52a81b9c6590b0f0e GIT binary patch literal 136 zcmWIYbctYKU|@t|HUyXp^sj6UykF`bt+o- Zy+ni?7|rG?Ypz-q+FrA+{L8ESI{;jk6!HK7 literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo59.git/packed-refs b/tests/gitea-repositories-meta/user2/repo59.git/packed-refs index 114c84d2aa..77fedbf67d 100644 --- a/tests/gitea-repositories-meta/user2/repo59.git/packed-refs +++ b/tests/gitea-repositories-meta/user2/repo59.git/packed-refs @@ -1,3 +1,4 @@ # pack-refs with: peeled fully-peeled sorted -d8f53dfb33f6ccf4169c34970b5e747511c18beb refs/heads/master +d8f53dfb33f6ccf4169c34970b5e747511c18beb refs/heads/cake-recipe +80b83c5c8220c3aa3906e081f202a2a7563ec879 refs/heads/master d8f53dfb33f6ccf4169c34970b5e747511c18beb refs/tags/v1.0 diff --git a/tests/gitea-repositories-meta/user2/repo59.git/refs/heads/cake-recipe b/tests/gitea-repositories-meta/user2/repo59.git/refs/heads/cake-recipe deleted file mode 100644 index 63bbea6692..0000000000 --- a/tests/gitea-repositories-meta/user2/repo59.git/refs/heads/cake-recipe +++ /dev/null @@ -1 +0,0 @@ -d8f53dfb33f6ccf4169c34970b5e747511c18beb diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 157d2ba99d..8176fea5e8 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -473,6 +473,36 @@ func TestViewRepoDirectoryReadme(t *testing.T) { missing("symlink-loop", "/user2/readme-test/src/branch/symlink-loop/") } +func TestRenamedFileHistory(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + t.Run("Renamed file", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", "/user2/repo59/commits/branch/master/license") + resp := MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + + renameNotice := htmlDoc.doc.Find(".ui.bottom.attached.header") + assert.Equal(t, 1, renameNotice.Length()) + assert.Contains(t, renameNotice.Text(), "Renamed from licnse (Browse further)") + + oldFileHistoryLink, ok := renameNotice.Find("a").Attr("href") + assert.True(t, ok) + assert.Equal(t, "/user2/repo59/commits/commit/80b83c5c8220c3aa3906e081f202a2a7563ec879/licnse", oldFileHistoryLink) + }) + + t.Run("Non renamed file", func(t *testing.T) { + req := NewRequest(t, "GET", "/user2/repo59/commits/branch/master/README.md") + resp := MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + + htmlDoc.AssertElement(t, ".ui.bottom.attached.header", false) + }) +} + func TestMarkDownReadmeImage(t *testing.T) { defer tests.PrepareTestEnv(t)()