From bcf6e82dd033d2c82fce8fded8f621b41bd35c09 Mon Sep 17 00:00:00 2001 From: Norwin Date: Fri, 8 Oct 2021 19:53:54 +0200 Subject: [PATCH 1/4] don't try to interpret treepath as hash (#17272) ...when path contains no hash-path-separator ('/') This is a workaround to #17179. Entering this case when `path` does not contain a '/' does not really make sense, as that means the tree path is empty, but this case is only entered for routes that expect a non-empty tree path. Treepaths like <40-char-dirname>/ will still fail, but hopefully don't occur that often. A more complete fix that avoids this case too is outlined in #17185, but too big of a change to backport --- services/context/repo.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/context/repo.go b/services/context/repo.go index 2df2b7ea40387..68c404e5711e4 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -823,7 +823,7 @@ func getRefName(ctx *Base, repo *Repository, pathType RepoRefType) string { // For legacy and API support only full commit sha parts := strings.Split(path, "/") - if len(parts) > 0 && len(parts[0]) == git.ObjectFormatFromName(repo.Repository.ObjectFormatName).FullLength() { + if len(parts) > 1 && len(parts[0]) == git.ObjectFormatFromName(repo.Repository.ObjectFormatName).FullLength() { repo.TreePath = strings.Join(parts[1:], "/") return parts[0] } From 30a2ff1af6a6e1e5baa67cb9a14e152b0f79ac09 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 24 Oct 2024 16:50:09 -0700 Subject: [PATCH 2/4] Fix raw file visit --- services/context/repo.go | 15 +++++++++------ .../34/865bf344ac1b427da08fcb845a2eab4706067c | Bin 0 -> 832 bytes .../83/c831f0b085c70509b1fbb0a0131a9a32e691ac | Bin 0 -> 22 bytes .../ee/fede97f06326aa8fabe2701e8e691ef444670e | Bin 0 -> 182 bytes .../f9/49334063847781b5aa4a193920ebe4077db154 | Bin 0 -> 59 bytes .../user2/repo1.git/refs/heads/master | 2 +- tests/integration/api_repo_get_contents_test.go | 14 ++++++++++++++ 7 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 tests/gitea-repositories-meta/user2/repo1.git/objects/34/865bf344ac1b427da08fcb845a2eab4706067c create mode 100644 tests/gitea-repositories-meta/user2/repo1.git/objects/83/c831f0b085c70509b1fbb0a0131a9a32e691ac create mode 100644 tests/gitea-repositories-meta/user2/repo1.git/objects/ee/fede97f06326aa8fabe2701e8e691ef444670e create mode 100644 tests/gitea-repositories-meta/user2/repo1.git/objects/f9/49334063847781b5aa4a193920ebe4077db154 diff --git a/services/context/repo.go b/services/context/repo.go index 68c404e5711e4..5e03f8356b9f5 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -823,13 +823,16 @@ func getRefName(ctx *Base, repo *Repository, pathType RepoRefType) string { // For legacy and API support only full commit sha parts := strings.Split(path, "/") - if len(parts) > 1 && len(parts[0]) == git.ObjectFormatFromName(repo.Repository.ObjectFormatName).FullLength() { - repo.TreePath = strings.Join(parts[1:], "/") - return parts[0] - } - if refName := getRefName(ctx, repo, RepoRefBlob); len(refName) > 0 { - return refName + if len(parts) > 1 { + if len(parts[0]) == git.ObjectFormatFromName(repo.Repository.ObjectFormatName).FullLength() { + repo.TreePath = strings.Join(parts[1:], "/") + return parts[0] + } + if refName := getRefName(ctx, repo, RepoRefBlob); len(refName) > 0 { + return refName + } } + repo.TreePath = path return repo.Repository.DefaultBranch case RepoRefBranch: diff --git a/tests/gitea-repositories-meta/user2/repo1.git/objects/34/865bf344ac1b427da08fcb845a2eab4706067c b/tests/gitea-repositories-meta/user2/repo1.git/objects/34/865bf344ac1b427da08fcb845a2eab4706067c new file mode 100644 index 0000000000000000000000000000000000000000..f790d91a5dac3f4069a96b63c1abc13c7b0a76c7 GIT binary patch literal 832 zcmV-G1Hb%u0iBb}va&`Lg)`m03pF zgEjc7_O7)DU)nVd8v%kU{$=bb1(fDAqpF-kiN{hLD|wtyEJH*UDyfL(f*?pTq})C3 zX*&W*%u$kKIZ62>mtigmk|;}}BJm=XB&Z5BOVUKhxcE8Vx*j;swq3x5#U1!<{$%}Z zC))l|G%>4xO}plIfMl#H2qOuBA5eyn`_NCvk^Zmc;$94_06+d3O*btU9LxhaS*A;Z z(AWRw9N+*uT5pXIZ9_%B+6E_eUh7O>Ke%FT1Icv)fvY2l&xir?p^S!4Qg=DUxK?rV5UwWn1Bfx9~g^7+L- z{kk2(Yn>^~`>Kin8y=hAC4;IFupHx9G(@Q$(9B5T2b!->FUE39A zXX=xsu9a;yv$Ndwgbj|2Z)l1oe1H+$tiHwZ@A3T=iYRz6=mp8Ok6eD18?eN@b8 zJCxxr^`o=R^o>}0jzpH8ZY;BS?>0fxkTu<#XE6v?c3b9W4)B+me^n>>g&&8^jm3K@ z?3+|^oi*G>i(T&^A?gZc{^VUtDR9)Lwc;0+=iFl+dgL5Kq%b}F@3YPpHq-;{0N?0<6LXLvf>+&|9f?)JZo;o>X<7H)b$2FfcPQQ7|)2GfYY|GEYi2PD(R3NHa4rGc`9ewJ4<)$!rdjzfx zyq{G&U-e|ANo3`#*U={Pp^6gY(=u~X;|mf?GUCfKfrN=cd~!x&QDSmQYEf}~T7FS{ kNosLPF+=kS!w(x;kF#=a{Jmj;u+%K0XA{=|0KT0;R_J9+EC2ui literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo1.git/objects/f9/49334063847781b5aa4a193920ebe4077db154 b/tests/gitea-repositories-meta/user2/repo1.git/objects/f9/49334063847781b5aa4a193920ebe4077db154 new file mode 100644 index 0000000000000000000000000000000000000000..e49eb69a83134b8a64439ce5fcd8f817aba7a9aa GIT binary patch literal 59 zcmbjv6-)_vGE2IPhU?j OKO@hFOboG4c*_9|yAgT- literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master b/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master index f98a263be62ff..247173ed91f18 100644 --- a/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master +++ b/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master @@ -1 +1 @@ -65f1bf27bc3bf70f64657658635e66094edbcb4d +34865bf344ac1b427da08fcb845a2eab4706067c diff --git a/tests/integration/api_repo_get_contents_test.go b/tests/integration/api_repo_get_contents_test.go index 68a8608117208..bf1e59941d8cf 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -191,5 +191,19 @@ func TestAPIGetContentsRefFormats(t *testing.T) { raw, err = io.ReadAll(resp.Body) assert.NoError(t, err) assert.EqualValues(t, content, string(raw)) + + // Test with a filepath with 40 characters + fileWith40c := setting.AppURL + "api/v1/repos/user2/repo1/raw/" + "a_file_path_with_40_characters_for_tests" + resp = MakeRequest(t, NewRequest(t, http.MethodGet, fileWith40c), http.StatusOK) + raw, err = io.ReadAll(resp.Body) + assert.NoError(t, err) + assert.EqualValues(t, "# test\n", string(raw)) + + // Test with a filepath with 40 characters and name is a commit SHA + fileWith40c = setting.AppURL + "api/v1/repos/user2/repo1/raw/" + "65f1bf27bc3bf70f64657658635e66094edbcb4d" + resp = MakeRequest(t, NewRequest(t, http.MethodGet, fileWith40c), http.StatusOK) + raw, err = io.ReadAll(resp.Body) + assert.NoError(t, err) + assert.EqualValues(t, "# 65f1bf27bc3bf70f64657658635e66094edbcb4d\n", string(raw)) }) } From 3230afdf6ad623a75dd25b5e051523280e4e2780 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 26 Oct 2024 00:07:38 -0700 Subject: [PATCH 3/4] Use another repo for testing --- .../42/27deb2ed773f536082805c08f5cebd22da9779 | Bin 0 -> 182 bytes .../83/c831f0b085c70509b1fbb0a0131a9a32e691ac | Bin .../9f/c855a7ff0b67fc2f98f878d852b6937810971f | Bin 0 -> 57 bytes .../c5/66fa45406b2f02c181df08077a03f177cf9ba8 | Bin 0 -> 825 bytes .../user13/repo11.git/refs/heads/master | 2 +- .../34/865bf344ac1b427da08fcb845a2eab4706067c | Bin 832 -> 0 bytes .../ee/fede97f06326aa8fabe2701e8e691ef444670e | Bin 182 -> 0 bytes .../f9/49334063847781b5aa4a193920ebe4077db154 | Bin 59 -> 0 bytes .../user2/repo1.git/refs/heads/master | 2 +- tests/integration/api_repo_get_contents_test.go | 4 ++-- 10 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 tests/gitea-repositories-meta/user13/repo11.git/objects/42/27deb2ed773f536082805c08f5cebd22da9779 rename tests/gitea-repositories-meta/{user2/repo1.git => user13/repo11.git}/objects/83/c831f0b085c70509b1fbb0a0131a9a32e691ac (100%) create mode 100644 tests/gitea-repositories-meta/user13/repo11.git/objects/9f/c855a7ff0b67fc2f98f878d852b6937810971f create mode 100644 tests/gitea-repositories-meta/user13/repo11.git/objects/c5/66fa45406b2f02c181df08077a03f177cf9ba8 delete mode 100644 tests/gitea-repositories-meta/user2/repo1.git/objects/34/865bf344ac1b427da08fcb845a2eab4706067c delete mode 100644 tests/gitea-repositories-meta/user2/repo1.git/objects/ee/fede97f06326aa8fabe2701e8e691ef444670e delete mode 100644 tests/gitea-repositories-meta/user2/repo1.git/objects/f9/49334063847781b5aa4a193920ebe4077db154 diff --git a/tests/gitea-repositories-meta/user13/repo11.git/objects/42/27deb2ed773f536082805c08f5cebd22da9779 b/tests/gitea-repositories-meta/user13/repo11.git/objects/42/27deb2ed773f536082805c08f5cebd22da9779 new file mode 100644 index 0000000000000000000000000000000000000000..0a826eaa65bb0836a85c07392b585f3fd5b998ad GIT binary patch literal 182 zcmV;n07?IN0V^p=O;s>7H)b$2FfcPQQ7|)2GfYY|GEYi2PD(R3NHa4rGc`9ewJv2}jjlVZ65SE%{^lai9s2M@7jxN5gdbueK-X4K# z1Mg?m&R0EIX%boa>UFfqe5j(t__WNN)cAtLl8pHBOdw%m5TBfpSd^Gtl3G+8pO#+~ kUy@o}Qp_;_MCkJW-06SxXZ)zR5wvY`g}`)q0C`_S2Sp)IIRF3v literal 0 HcmV?d00001 diff --git a/tests/gitea-repositories-meta/user2/repo1.git/objects/83/c831f0b085c70509b1fbb0a0131a9a32e691ac b/tests/gitea-repositories-meta/user13/repo11.git/objects/83/c831f0b085c70509b1fbb0a0131a9a32e691ac similarity index 100% rename from tests/gitea-repositories-meta/user2/repo1.git/objects/83/c831f0b085c70509b1fbb0a0131a9a32e691ac rename to tests/gitea-repositories-meta/user13/repo11.git/objects/83/c831f0b085c70509b1fbb0a0131a9a32e691ac diff --git a/tests/gitea-repositories-meta/user13/repo11.git/objects/9f/c855a7ff0b67fc2f98f878d852b6937810971f b/tests/gitea-repositories-meta/user13/repo11.git/objects/9f/c855a7ff0b67fc2f98f878d852b6937810971f new file mode 100644 index 0000000000000000000000000000000000000000..db867795705c62e6bf6ab7ac5e158c42960bf139 GIT binary patch literal 57 zcmV-90LK4#0ZYosPf{>3W>8j0j8DtVNsTW^EXjy3&jb=C2Jy)miA9OYC8eyE6XgDc?tYrM24Zh^y^5_{~BjqHsl%j@mEx1XF1@!JA=U5Im+eg z8-H^OP$2iLRaF#KQ7C+j2P!;U>o3E!GZoh0S@QM9b|{^b-% z_`Wh{MIq5~(4r`R&9^u*N|9!{(OmLF^%-^tbUToedm!#z}}de2r*tulE>6o7-~ zgvh4Hcse}#GMHcvpTgb?mkq1%_D#)AI+slbEvq@6oH@JndB6Cbe-jw(T+0;Lm{lJZ zAMD-sH~DH^(|6D^FY-3rOETn(U+{?pW#kV!W~+AI8Tylr26y9x=XGW_M*3ljZG#j01eC#A-rJ2cHt={-M*ii;lUfcb*;{NgPXobnT=GT`yhj4#d^= zk-^%pG+HFpSn6%ZVKN4HNc5ejJACEoAz)*bOs93TX4WVe_sM!ecq$yY5kYvXTj{aYdp`tVe1Puh>yh7BU^Dm03pF zgEjc7_O7)DU)nVd8v%kU{$=bb1(fDAqpF-kiN{hLD|wtyEJH*UDyfL(f*?pTq})C3 zX*&W*%u$kKIZ62>mtigmk|;}}BJm=XB&Z5BOVUKhxcE8Vx*j;swq3x5#U1!<{$%}Z zC))l|G%>4xO}plIfMl#H2qOuBA5eyn`_NCvk^Zmc;$94_06+d3O*btU9LxhaS*A;Z z(AWRw9N+*uT5pXIZ9_%B+6E_eUh7O>Ke%FT1Icv)fvY2l&xir?p^S!4Qg=DUxK?rV5UwWn1Bfx9~g^7+L- z{kk2(Yn>^~`>Kin8y=hAC4;IFupHx9G(@Q$(9B5T2b!->FUE39A zXX=xsu9a;yv$Ndwgbj|2Z)l1oe1H+$tiHwZ@A3T=iYRz6=mp8Ok6eD18?eN@b8 zJCxxr^`o=R^o>}0jzpH8ZY;BS?>0fxkTu<#XE6v?c3b9W4)B+me^n>>g&&8^jm3K@ z?3+|^oi*G>i(T&^A?gZc{^VUtDR9)Lwc;0+=iFl+dgL5Kq%b}F@3YPpHq-;{0N?0<6LXLvf>+&|9f?)JZo;o>X<7H)b$2FfcPQQ7|)2GfYY|GEYi2PD(R3NHa4rGc`9ewJ4<)$!rdjzfx zyq{G&U-e|ANo3`#*U={Pp^6gY(=u~X;|mf?GUCfKfrN=cd~!x&QDSmQYEf}~T7FS{ kNosLPF+=kS!w(x;kF#=a{Jmj;u+%K0XA{=|0KT0;R_J9+EC2ui diff --git a/tests/gitea-repositories-meta/user2/repo1.git/objects/f9/49334063847781b5aa4a193920ebe4077db154 b/tests/gitea-repositories-meta/user2/repo1.git/objects/f9/49334063847781b5aa4a193920ebe4077db154 deleted file mode 100644 index e49eb69a83134b8a64439ce5fcd8f817aba7a9aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59 zcmbjv6-)_vGE2IPhU?j OKO@hFOboG4c*_9|yAgT- diff --git a/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master b/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master index 247173ed91f18..f98a263be62ff 100644 --- a/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master +++ b/tests/gitea-repositories-meta/user2/repo1.git/refs/heads/master @@ -1 +1 @@ -34865bf344ac1b427da08fcb845a2eab4706067c +65f1bf27bc3bf70f64657658635e66094edbcb4d diff --git a/tests/integration/api_repo_get_contents_test.go b/tests/integration/api_repo_get_contents_test.go index bf1e59941d8cf..bedc1dcfa5a55 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -193,14 +193,14 @@ func TestAPIGetContentsRefFormats(t *testing.T) { assert.EqualValues(t, content, string(raw)) // Test with a filepath with 40 characters - fileWith40c := setting.AppURL + "api/v1/repos/user2/repo1/raw/" + "a_file_path_with_40_characters_for_tests" + fileWith40c := setting.AppURL + "api/v1/repos/user13/repo11/raw/" + "a_file_path_with_40_characters_for_tests" resp = MakeRequest(t, NewRequest(t, http.MethodGet, fileWith40c), http.StatusOK) raw, err = io.ReadAll(resp.Body) assert.NoError(t, err) assert.EqualValues(t, "# test\n", string(raw)) // Test with a filepath with 40 characters and name is a commit SHA - fileWith40c = setting.AppURL + "api/v1/repos/user2/repo1/raw/" + "65f1bf27bc3bf70f64657658635e66094edbcb4d" + fileWith40c = setting.AppURL + "api/v1/repos/user13/repo11/raw/" + "65f1bf27bc3bf70f64657658635e66094edbcb4d" resp = MakeRequest(t, NewRequest(t, http.MethodGet, fileWith40c), http.StatusOK) raw, err = io.ReadAll(resp.Body) assert.NoError(t, err) From 09c7c906e99130557d2f85d5ba0aab85444b84bf Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 26 Oct 2024 00:09:47 -0700 Subject: [PATCH 4/4] Fix test --- tests/integration/api_repo_get_contents_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/api_repo_get_contents_test.go b/tests/integration/api_repo_get_contents_test.go index bedc1dcfa5a55..8c03fb2d5d6dc 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -197,13 +197,13 @@ func TestAPIGetContentsRefFormats(t *testing.T) { resp = MakeRequest(t, NewRequest(t, http.MethodGet, fileWith40c), http.StatusOK) raw, err = io.ReadAll(resp.Body) assert.NoError(t, err) - assert.EqualValues(t, "# test\n", string(raw)) + assert.EqualValues(t, "# a_file_path_with_40_characters_for_tests\n", string(raw)) // Test with a filepath with 40 characters and name is a commit SHA fileWith40c = setting.AppURL + "api/v1/repos/user13/repo11/raw/" + "65f1bf27bc3bf70f64657658635e66094edbcb4d" resp = MakeRequest(t, NewRequest(t, http.MethodGet, fileWith40c), http.StatusOK) raw, err = io.ReadAll(resp.Body) assert.NoError(t, err) - assert.EqualValues(t, "# 65f1bf27bc3bf70f64657658635e66094edbcb4d\n", string(raw)) + assert.EqualValues(t, "# test\n", string(raw)) }) }