diff --git a/modules/structs/repo_file.go b/modules/structs/repo_file.go index 53ce5aeae2..688387cec0 100644 --- a/modules/structs/repo_file.go +++ b/modules/structs/repo_file.go @@ -139,6 +139,8 @@ type ContentsResponse struct { // `type` will be `file`, `dir`, `symlink`, or `submodule` Type string `json:"type"` + // `mode` is the Git file mode as an octal string, e.g. `100644` (regular), `100755` (executable), `120000` (symlink), `160000` (submodule) + Mode string `json:"mode"` // Size is the file size in bytes Size int64 `json:"size"` // `encoding` is populated when `type` is `file`, otherwise null diff --git a/services/repository/files/content.go b/services/repository/files/content.go index 3f161a9aca..93252f59d1 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -148,6 +148,7 @@ func getFileContentsByEntryInternal(ctx context.Context, repo *repo_model.Reposi Name: entry.Name(), Path: opts.TreePath, SHA: entry.ID.String(), + Mode: entry.Mode().String(), Size: entry.GetSize(ctx, gitRepo), URL: &selfURLString, Links: &api.FileLinksResponse{ diff --git a/templates/swagger/v1-openapi3.generated.json b/templates/swagger/v1-openapi3.generated.json index eaa1e3a31f..031576ebd3 100644 --- a/templates/swagger/v1-openapi3.generated.json +++ b/templates/swagger/v1-openapi3.generated.json @@ -3594,6 +3594,11 @@ "type": "integer", "x-go-name": "LfsSize" }, + "mode": { + "description": "`mode` is the Git file mode as an octal string, e.g. `100644` (regular), `100755` (executable), `120000` (symlink), `160000` (submodule)", + "type": "string", + "x-go-name": "Mode" + }, "name": { "description": "Name is the file or directory name", "type": "string", diff --git a/templates/swagger/v1-swagger.generated.json b/templates/swagger/v1-swagger.generated.json index 3dfea78f76..ee72660568 100644 --- a/templates/swagger/v1-swagger.generated.json +++ b/templates/swagger/v1-swagger.generated.json @@ -23998,6 +23998,11 @@ "format": "int64", "x-go-name": "LfsSize" }, + "mode": { + "description": "`mode` is the Git file mode as an octal string, e.g. `100644` (regular), `100755` (executable), `120000` (symlink), `160000` (submodule)", + "type": "string", + "x-go-name": "Mode" + }, "name": { "description": "Name is the file or directory name", "type": "string", diff --git a/tests/integration/api_repo_file_create_test.go b/tests/integration/api_repo_file_create_test.go index 04a5e68b35..631a9248a3 100644 --- a/tests/integration/api_repo_file_create_test.go +++ b/tests/integration/api_repo_file_create_test.go @@ -79,6 +79,7 @@ func getExpectedFileResponseForCreate(info apiFileResponseInfo) *api.FileRespons LastAuthorDate: new(info.lastAuthorWhen), Size: 16, Type: "file", + Mode: "100644", Encoding: &encoding, Content: &content, URL: &selfURL, diff --git a/tests/integration/api_repo_file_update_test.go b/tests/integration/api_repo_file_update_test.go index 9e49fe5e90..a4b6cde689 100644 --- a/tests/integration/api_repo_file_update_test.go +++ b/tests/integration/api_repo_file_update_test.go @@ -62,6 +62,7 @@ func getExpectedFileResponseForUpdate(info apiFileResponseInfo) *api.FileRespons LastCommitterDate: new(info.lastCommitterWhen), LastAuthorDate: new(info.lastAuthorWhen), Type: "file", + Mode: "100644", Size: 20, Encoding: &encoding, Content: &content, diff --git a/tests/integration/api_repo_get_contents_list_test.go b/tests/integration/api_repo_get_contents_list_test.go index 1ecd46d9f5..8b96751033 100644 --- a/tests/integration/api_repo_get_contents_list_test.go +++ b/tests/integration/api_repo_get_contents_list_test.go @@ -38,6 +38,7 @@ func getExpectedContentsListResponseForContents(ref, refType, lastCommitSHA stri LastCommitterDate: new(time.Date(2017, time.March, 19, 16, 47, 59, 0, time.FixedZone("", -14400))), LastAuthorDate: new(time.Date(2017, time.March, 19, 16, 47, 59, 0, time.FixedZone("", -14400))), Type: "file", + Mode: "100644", Size: 30, URL: &selfURL, HTMLURL: &htmlURL, diff --git a/tests/integration/api_repo_get_contents_test.go b/tests/integration/api_repo_get_contents_test.go index 96ec57b622..a9fb288a95 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -37,6 +37,7 @@ func getExpectedContentsResponseForContents(inputRef string, expectedRef git.Ref LastCommitterDate: new(time.Date(2017, time.March, 19, 16, 47, 59, 0, time.FixedZone("", -14400))), LastAuthorDate: new(time.Date(2017, time.March, 19, 16, 47, 59, 0, time.FixedZone("", -14400))), Type: "file", + Mode: "100644", Size: 30, Encoding: new("base64"), Content: new("IyByZXBvMQoKRGVzY3JpcHRpb24gZm9yIHJlcG8x"), diff --git a/tests/integration/repofiles_change_test.go b/tests/integration/repofiles_change_test.go index d9187f897f..0def14034f 100644 --- a/tests/integration/repofiles_change_test.go +++ b/tests/integration/repofiles_change_test.go @@ -109,6 +109,7 @@ func getExpectedFileResponseForRepoFilesCreate(commitID string, lastCommit *git. LastCommitterDate: new(lastCommit.Committer.When), LastAuthorDate: new(lastCommit.Author.When), Type: "file", + Mode: "100644", Size: 18, Encoding: &encoding, Content: &content, @@ -179,6 +180,7 @@ func getExpectedFileResponseForRepoFilesUpdate(commitID, filename, lastCommitSHA LastCommitterDate: new(lastCommitterWhen), LastAuthorDate: new(lastAuthorWhen), Type: "file", + Mode: "100644", Size: 43, Encoding: &encoding, Content: &content, @@ -283,6 +285,7 @@ func getExpectedFileResponseForRepoFilesUpdateRename(commitID, lastCommitSHA str SHA: detail.sha, LastCommitSHA: new(lastCommitSHA), Type: "file", + Mode: "100644", Size: detail.size, Encoding: new("base64"), Content: &detail.content,