From 0b46b13343db632b26b7ee29b0186b2bbe8a4fd2 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 12:31:18 +0100 Subject: [PATCH 1/9] GetFile: use ref in-query if posible --- gitea/repo_file.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gitea/repo_file.go b/gitea/repo_file.go index 87f5d06..8efd526 100644 --- a/gitea/repo_file.go +++ b/gitea/repo_file.go @@ -116,9 +116,12 @@ type FileDeleteResponse struct { } // GetFile downloads a file of repository, ref can be branch/tag/commit. -// e.g.: ref -> master, tree -> macaron.go(no leading slash) -func (c *Client) GetFile(user, repo, ref, tree string) ([]byte, *Response, error) { - return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s/%s", user, repo, ref, tree), nil, nil) +// e.g.: ref -> master, tree -> README.md (no leading slash) +func (c *Client) GetFile(owner, repo, ref, tree string) ([]byte, *Response, error) { + if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { + return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s/%s", owner, repo, ref, tree), nil, nil) + } + return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s?ref=%s", owner, repo, tree, ref), nil, nil) } // GetContents get the metadata and contents of a file in a repository -- 2.40.1 From 42dfc52e3d6dcdd45acb81eb408b141266b9cdcf Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 15:36:24 +0100 Subject: [PATCH 2/9] GetFile: test with ref="" and ref not default branch --- gitea/repo_file_test.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/gitea/repo_file_test.go b/gitea/repo_file_test.go index cec6db8..3771d08 100644 --- a/gitea/repo_file_test.go +++ b/gitea/repo_file_test.go @@ -56,6 +56,27 @@ func TestFileCreateUpdateGet(t *testing.T) { SHA: updatedFile.Content.SHA, }) assert.NoError(t, err) - _, _, err = c.GetFile(repo.Owner.UserName, repo.Name, "master", "A") + _, resp, err := c.GetFile(repo.Owner.UserName, repo.Name, "master", "A") assert.EqualValues(t, "404 Not Found", err.Error()) + assert.EqualValues(t, 404, resp.StatusCode ) + + licence, _, err := c.GetContents(repo.Owner.UserName, repo.Name, "", "LICENSE") + assert.NoError(t, err) + assert.NotNil(t, licence) + sha := licence.SHA + updatedFile, _, err = c.UpdateFile(repo.Owner.UserName, repo.Name, "LICENSE", UpdateFileOptions{ + FileOptions: FileOptions{ + Message: "Overwrite", + BranchName: "master", + NewBranchName: "overwrite_licence", + }, + SHA: licence.SHA, + Content: "Tk9USElORyBJUyBIRVJFIEFOWU1PUkUKSUYgWU9VIExJS0UgVE8gRklORCBTT01FVEhJTkcKV0FJVCBGT1IgVEhFIEZVVFVSRQo=", + }) + assert.NoError(t, err) + assert.NotNil(t, updatedFile) + licence, _, err = c.GetContents(repo.Owner.UserName, repo.Name, "overwrite_licence", "LICENSE") + assert.NoError(t, err) + assert.NotNil(t, licence) + assert.True(t, sha != licence.SHA) } -- 2.40.1 From 58f3add6277bed2bd41462b58d961382ef806996 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 15:47:36 +0100 Subject: [PATCH 3/9] bytes.Equal --- gitea/repo_file_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gitea/repo_file_test.go b/gitea/repo_file_test.go index 3771d08..ee19814 100644 --- a/gitea/repo_file_test.go +++ b/gitea/repo_file_test.go @@ -5,6 +5,7 @@ package gitea import ( + "bytes" "encoding/base64" "log" "testing" @@ -62,8 +63,7 @@ func TestFileCreateUpdateGet(t *testing.T) { licence, _, err := c.GetContents(repo.Owner.UserName, repo.Name, "", "LICENSE") assert.NoError(t, err) - assert.NotNil(t, licence) - sha := licence.SHA + licenceRaw, _, err := c.GetFile(repo.Owner.UserName, repo.Name, "", "LICENSE") updatedFile, _, err = c.UpdateFile(repo.Owner.UserName, repo.Name, "LICENSE", UpdateFileOptions{ FileOptions: FileOptions{ Message: "Overwrite", @@ -75,8 +75,8 @@ func TestFileCreateUpdateGet(t *testing.T) { }) assert.NoError(t, err) assert.NotNil(t, updatedFile) - licence, _, err = c.GetContents(repo.Owner.UserName, repo.Name, "overwrite_licence", "LICENSE") + licenceRawNew, _, err := c.GetFile(repo.Owner.UserName, repo.Name, "overwrite_licence", "LICENSE") assert.NoError(t, err) assert.NotNil(t, licence) - assert.True(t, sha != licence.SHA) + assert.False(t, bytes.Equal(licenceRaw, licenceRawNew)) } -- 2.40.1 From c60731a1f2028840e84d3486ed841301e79fca67 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 17:51:40 +0100 Subject: [PATCH 4/9] QueryEscape --- gitea/repo_file.go | 3 ++- gitea/repo_file_test.go | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gitea/repo_file.go b/gitea/repo_file.go index 8efd526..404d8cd 100644 --- a/gitea/repo_file.go +++ b/gitea/repo_file.go @@ -9,6 +9,7 @@ import ( "bytes" "encoding/json" "fmt" + "net/url" "strings" ) @@ -121,7 +122,7 @@ func (c *Client) GetFile(owner, repo, ref, tree string) ([]byte, *Response, erro if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s/%s", owner, repo, ref, tree), nil, nil) } - return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s?ref=%s", owner, repo, tree, ref), nil, nil) + return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s?ref=%s", owner, repo, tree, url.QueryEscape(ref)), nil, nil) } // GetContents get the metadata and contents of a file in a repository diff --git a/gitea/repo_file_test.go b/gitea/repo_file_test.go index ee19814..7c3e8b5 100644 --- a/gitea/repo_file_test.go +++ b/gitea/repo_file_test.go @@ -59,7 +59,7 @@ func TestFileCreateUpdateGet(t *testing.T) { assert.NoError(t, err) _, resp, err := c.GetFile(repo.Owner.UserName, repo.Name, "master", "A") assert.EqualValues(t, "404 Not Found", err.Error()) - assert.EqualValues(t, 404, resp.StatusCode ) + assert.EqualValues(t, 404, resp.StatusCode) licence, _, err := c.GetContents(repo.Owner.UserName, repo.Name, "", "LICENSE") assert.NoError(t, err) @@ -68,14 +68,14 @@ func TestFileCreateUpdateGet(t *testing.T) { FileOptions: FileOptions{ Message: "Overwrite", BranchName: "master", - NewBranchName: "overwrite_licence", + NewBranchName: "overwrite/licence", }, SHA: licence.SHA, Content: "Tk9USElORyBJUyBIRVJFIEFOWU1PUkUKSUYgWU9VIExJS0UgVE8gRklORCBTT01FVEhJTkcKV0FJVCBGT1IgVEhFIEZVVFVSRQo=", }) assert.NoError(t, err) assert.NotNil(t, updatedFile) - licenceRawNew, _, err := c.GetFile(repo.Owner.UserName, repo.Name, "overwrite_licence", "LICENSE") + licenceRawNew, _, err := c.GetFile(repo.Owner.UserName, repo.Name, "overwrite/licence", "LICENSE") assert.NoError(t, err) assert.NotNil(t, licence) assert.False(t, bytes.Equal(licenceRaw, licenceRawNew)) -- 2.40.1 From e1bfd1ce6f95ad9033ded42642d426ee3368d479 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 18:48:48 +0100 Subject: [PATCH 5/9] extreme test branch naming --- gitea/repo_file_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitea/repo_file_test.go b/gitea/repo_file_test.go index 7c3e8b5..5e3ffa4 100644 --- a/gitea/repo_file_test.go +++ b/gitea/repo_file_test.go @@ -68,14 +68,14 @@ func TestFileCreateUpdateGet(t *testing.T) { FileOptions: FileOptions{ Message: "Overwrite", BranchName: "master", - NewBranchName: "overwrite/licence", + NewBranchName: "overwrite-a+/&licence", }, SHA: licence.SHA, Content: "Tk9USElORyBJUyBIRVJFIEFOWU1PUkUKSUYgWU9VIExJS0UgVE8gRklORCBTT01FVEhJTkcKV0FJVCBGT1IgVEhFIEZVVFVSRQo=", }) assert.NoError(t, err) assert.NotNil(t, updatedFile) - licenceRawNew, _, err := c.GetFile(repo.Owner.UserName, repo.Name, "overwrite/licence", "LICENSE") + licenceRawNew, _, err := c.GetFile(repo.Owner.UserName, repo.Name, "overwrite-a+/&licence", "LICENSE") assert.NoError(t, err) assert.NotNil(t, licence) assert.False(t, bytes.Equal(licenceRaw, licenceRawNew)) -- 2.40.1 From c2b7a504b9be661dd9bb9b6a2f3a2e4b10315a2f Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 19:00:35 +0100 Subject: [PATCH 6/9] test content itselve too --- gitea/repo_file_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gitea/repo_file_test.go b/gitea/repo_file_test.go index 5e3ffa4..ea9ed05 100644 --- a/gitea/repo_file_test.go +++ b/gitea/repo_file_test.go @@ -64,6 +64,7 @@ func TestFileCreateUpdateGet(t *testing.T) { licence, _, err := c.GetContents(repo.Owner.UserName, repo.Name, "", "LICENSE") assert.NoError(t, err) licenceRaw, _, err := c.GetFile(repo.Owner.UserName, repo.Name, "", "LICENSE") + testContent := "Tk9USElORyBJUyBIRVJFIEFOWU1PUkUKSUYgWU9VIExJS0UgVE8gRklORCBTT01FVEhJTkcKV0FJVCBGT1IgVEhFIEZVVFVSRQo=" updatedFile, _, err = c.UpdateFile(repo.Owner.UserName, repo.Name, "LICENSE", UpdateFileOptions{ FileOptions: FileOptions{ Message: "Overwrite", @@ -71,7 +72,7 @@ func TestFileCreateUpdateGet(t *testing.T) { NewBranchName: "overwrite-a+/&licence", }, SHA: licence.SHA, - Content: "Tk9USElORyBJUyBIRVJFIEFOWU1PUkUKSUYgWU9VIExJS0UgVE8gRklORCBTT01FVEhJTkcKV0FJVCBGT1IgVEhFIEZVVFVSRQo=", + Content: testContent, }) assert.NoError(t, err) assert.NotNil(t, updatedFile) @@ -79,4 +80,5 @@ func TestFileCreateUpdateGet(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, licence) assert.False(t, bytes.Equal(licenceRaw, licenceRawNew)) + assert.EqualValues(t, testContent, base64.StdEncoding.EncodeToString(licenceRawNew)) } -- 2.40.1 From 12c4dc167bed464d66fd24ff9d79618b6d489713 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 20:21:52 +0100 Subject: [PATCH 7/9] pathEscapeSegments --- gitea/repo_file.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/gitea/repo_file.go b/gitea/repo_file.go index 404d8cd..bd0173f 100644 --- a/gitea/repo_file.go +++ b/gitea/repo_file.go @@ -116,18 +116,30 @@ type FileDeleteResponse struct { Verification *PayloadCommitVerification `json:"verification"` } +// pathEscapeSegments escapes segments of a path while not escaping forward slash +func pathEscapeSegments(path string) string { + slice := strings.Split(path, "/") + for index := range slice { + slice[index] = url.PathEscape(slice[index]) + } + escapedPath := strings.Join(slice, "/") + return escapedPath +} + // GetFile downloads a file of repository, ref can be branch/tag/commit. // e.g.: ref -> master, tree -> README.md (no leading slash) -func (c *Client) GetFile(owner, repo, ref, tree string) ([]byte, *Response, error) { +func (c *Client) GetFile(owner, repo, ref, filepath string) ([]byte, *Response, error) { + filepath = pathEscapeSegments(filepath) if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { - return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s/%s", owner, repo, ref, tree), nil, nil) + return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s/%s", owner, repo, ref, filepath), nil, nil) } - return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s?ref=%s", owner, repo, tree, url.QueryEscape(ref)), nil, nil) + return c.getResponse("GET", fmt.Sprintf("/repos/%s/%s/raw/%s?ref=%s", owner, repo, filepath, url.QueryEscape(ref)), nil, nil) } // GetContents get the metadata and contents of a file in a repository // ref is optional func (c *Client) GetContents(owner, repo, ref, filepath string) (*ContentsResponse, *Response, error) { + filepath = pathEscapeSegments(filepath) cr := new(ContentsResponse) filepath = strings.TrimPrefix(filepath, "/") resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/contents/%s?ref=%s", owner, repo, filepath, ref), jsonHeader, nil, cr) @@ -137,6 +149,7 @@ func (c *Client) GetContents(owner, repo, ref, filepath string) (*ContentsRespon // ListContents gets a list of entries in a dir // ref is optional func (c *Client) ListContents(owner, repo, ref, filepath string) ([]*ContentsResponse, *Response, error) { + filepath = pathEscapeSegments(filepath) cr := make([]*ContentsResponse, 0) filepath = strings.TrimPrefix(filepath, "/") resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/contents/%s?ref=%s", owner, repo, filepath, ref), jsonHeader, nil, &cr) @@ -145,6 +158,7 @@ func (c *Client) ListContents(owner, repo, ref, filepath string) ([]*ContentsRes // CreateFile create a file in a repository func (c *Client) CreateFile(owner, repo, filepath string, opt CreateFileOptions) (*FileResponse, *Response, error) { + filepath = pathEscapeSegments(filepath) var err error if opt.BranchName, err = c.setDefaultBranchForOldVersions(owner, repo, opt.BranchName); err != nil { return nil, nil, err @@ -161,6 +175,7 @@ func (c *Client) CreateFile(owner, repo, filepath string, opt CreateFileOptions) // UpdateFile update a file in a repository func (c *Client) UpdateFile(owner, repo, filepath string, opt UpdateFileOptions) (*FileResponse, *Response, error) { + filepath = pathEscapeSegments(filepath) var err error if opt.BranchName, err = c.setDefaultBranchForOldVersions(owner, repo, opt.BranchName); err != nil { return nil, nil, err @@ -177,6 +192,7 @@ func (c *Client) UpdateFile(owner, repo, filepath string, opt UpdateFileOptions) // DeleteFile delete a file from repository func (c *Client) DeleteFile(owner, repo, filepath string, opt DeleteFileOptions) (*Response, error) { + filepath = pathEscapeSegments(filepath) var err error if opt.BranchName, err = c.setDefaultBranchForOldVersions(owner, repo, opt.BranchName); err != nil { return nil, err -- 2.40.1 From 91ddcb988addb16bb01533473dac646d1dda831d Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 20:36:49 +0100 Subject: [PATCH 8/9] ... --- gitea/repo_file.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gitea/repo_file.go b/gitea/repo_file.go index bd0173f..935102e 100644 --- a/gitea/repo_file.go +++ b/gitea/repo_file.go @@ -127,7 +127,7 @@ func pathEscapeSegments(path string) string { } // GetFile downloads a file of repository, ref can be branch/tag/commit. -// e.g.: ref -> master, tree -> README.md (no leading slash) +// e.g.: ref -> master, filepath -> README.md (no leading slash) func (c *Client) GetFile(owner, repo, ref, filepath string) ([]byte, *Response, error) { filepath = pathEscapeSegments(filepath) if c.checkServerVersionGreaterThanOrEqual(version1_14_0) != nil { @@ -142,7 +142,7 @@ func (c *Client) GetContents(owner, repo, ref, filepath string) (*ContentsRespon filepath = pathEscapeSegments(filepath) cr := new(ContentsResponse) filepath = strings.TrimPrefix(filepath, "/") - resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/contents/%s?ref=%s", owner, repo, filepath, ref), jsonHeader, nil, cr) + resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/contents/%s?ref=%s", owner, repo, filepath, url.QueryEscape(ref)), jsonHeader, nil, cr) return cr, resp, err } @@ -152,7 +152,7 @@ func (c *Client) ListContents(owner, repo, ref, filepath string) ([]*ContentsRes filepath = pathEscapeSegments(filepath) cr := make([]*ContentsResponse, 0) filepath = strings.TrimPrefix(filepath, "/") - resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/contents/%s?ref=%s", owner, repo, filepath, ref), jsonHeader, nil, &cr) + resp, err := c.getParsedResponse("GET", fmt.Sprintf("/repos/%s/%s/contents/%s?ref=%s", owner, repo, filepath, url.QueryEscape(ref)), jsonHeader, nil, &cr) return cr, resp, err } -- 2.40.1 From c19c73c06b5a8e8c05968021fc9b501d275e1f61 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 16 Feb 2021 20:39:22 +0100 Subject: [PATCH 9/9] Test: use strange file name --- gitea/repo_file_test.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/gitea/repo_file_test.go b/gitea/repo_file_test.go index ea9ed05..21c972e 100644 --- a/gitea/repo_file_test.go +++ b/gitea/repo_file_test.go @@ -25,17 +25,18 @@ func TestFileCreateUpdateGet(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, "IyBDaGFuZ2VGaWxlcwoKQSB0ZXN0IFJlcG86IENoYW5nZUZpbGVz", base64.StdEncoding.EncodeToString(raw)) - newFile, _, err := c.CreateFile(repo.Owner.UserName, repo.Name, "A", CreateFileOptions{ + testFileName := "A+#&รค" + newFile, _, err := c.CreateFile(repo.Owner.UserName, repo.Name, testFileName, CreateFileOptions{ FileOptions: FileOptions{ - Message: "create file A", + Message: "create file " + testFileName, }, Content: "ZmlsZUEK", }) assert.NoError(t, err) - raw, _, _ = c.GetFile(repo.Owner.UserName, repo.Name, "master", "A") + raw, _, _ = c.GetFile(repo.Owner.UserName, repo.Name, "master", testFileName) assert.EqualValues(t, "ZmlsZUEK", base64.StdEncoding.EncodeToString(raw)) - updatedFile, _, err := c.UpdateFile(repo.Owner.UserName, repo.Name, "A", UpdateFileOptions{ + updatedFile, _, err := c.UpdateFile(repo.Owner.UserName, repo.Name, testFileName, UpdateFileOptions{ FileOptions: FileOptions{ Message: "add a new line", }, @@ -45,19 +46,19 @@ func TestFileCreateUpdateGet(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, updatedFile) - file, _, err := c.GetContents(repo.Owner.UserName, repo.Name, "master", "A") + file, _, err := c.GetContents(repo.Owner.UserName, repo.Name, "master", testFileName) assert.NoError(t, err) assert.EqualValues(t, updatedFile.Content.SHA, file.SHA) assert.EqualValues(t, &updatedFile.Content.Content, &file.Content) - _, err = c.DeleteFile(repo.Owner.UserName, repo.Name, "A", DeleteFileOptions{ + _, err = c.DeleteFile(repo.Owner.UserName, repo.Name, testFileName, DeleteFileOptions{ FileOptions: FileOptions{ - Message: "Delete File A", + Message: "Delete File " + testFileName, }, SHA: updatedFile.Content.SHA, }) assert.NoError(t, err) - _, resp, err := c.GetFile(repo.Owner.UserName, repo.Name, "master", "A") + _, resp, err := c.GetFile(repo.Owner.UserName, repo.Name, "master", testFileName) assert.EqualValues(t, "404 Not Found", err.Error()) assert.EqualValues(t, 404, resp.StatusCode) -- 2.40.1