From cf465b472166ccf6d3e001e3043e4bf43e16e6b3 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Thu, 27 Apr 2023 09:36:26 +0800 Subject: [PATCH] Support uploading file to empty repo by API (#24357) The uploading API already works (the only nit is the the IsEmpty flag is out-of-sync, this PR also fixes it) Close #14633 --- services/repository/files/update.go | 5 +++++ tests/integration/empty_repo_test.go | 33 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/services/repository/files/update.go b/services/repository/files/update.go index 45a4692396..25014f4418 100644 --- a/services/repository/files/update.go +++ b/services/repository/files/update.go @@ -458,6 +458,11 @@ func CreateOrUpdateRepoFile(ctx context.Context, repo *repo_model.Repository, do if err != nil { return nil, err } + + if repo.IsEmpty { + _ = repo_model.UpdateRepositoryCols(ctx, &repo_model.Repository{ID: repo.ID, IsEmpty: false}, "is_empty") + } + return file, nil } diff --git a/tests/integration/empty_repo_test.go b/tests/integration/empty_repo_test.go index e6e5f7b18c..73331bc933 100644 --- a/tests/integration/empty_repo_test.go +++ b/tests/integration/empty_repo_test.go @@ -5,17 +5,21 @@ package integration import ( "bytes" + "encoding/base64" + "fmt" "io" "mime/multipart" "net/http" "testing" + auth_model "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/tests" @@ -105,3 +109,32 @@ func TestEmptyRepoUploadFile(t *testing.T) { resp = session.MakeRequest(t, req, http.StatusOK) assert.Contains(t, resp.Body.String(), "uploaded-file.txt") } + +func TestEmptyRepoAddFileByAPI(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + err := user_model.UpdateUserCols(db.DefaultContext, &user_model.User{ID: 30, ProhibitLogin: false}, "prohibit_login") + assert.NoError(t, err) + + session := loginUser(t, "user30") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeRepo) + + url := fmt.Sprintf("/api/v1/repos/user30/empty/contents/new-file.txt?token=%s", token) + req := NewRequestWithJSON(t, "POST", url, &api.CreateFileOptions{ + FileOptions: api.FileOptions{ + NewBranchName: "new_branch", + Message: "init", + }, + Content: base64.StdEncoding.EncodeToString([]byte("newly-added-api-file")), + }) + + resp := MakeRequest(t, req, http.StatusCreated) + var fileResponse api.FileResponse + DecodeJSON(t, resp, &fileResponse) + expectedHTMLURL := setting.AppURL + "user30/empty/src/branch/new_branch/new-file.txt" + assert.EqualValues(t, expectedHTMLURL, *fileResponse.Content.HTMLURL) + + req = NewRequest(t, "GET", "/user30/empty/src/branch/new_branch/new-file.txt") + resp = session.MakeRequest(t, req, http.StatusOK) + assert.Contains(t, resp.Body.String(), "newly-added-api-file") +}