Update repo's default branch when adding new files in an empty one (#25017)

Fix #25014

Only API needs this fix. On the Web UI, users could only add new file on
the default branch.
pull/25018/head
wxiaoguang 2 years ago committed by GitHub
parent a5acec329e
commit a90988d63f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .gitignore
  2. 16
      services/repository/files/update.go
  3. 6
      tests/integration/empty_repo_test.go

1
.gitignore vendored

@ -47,6 +47,7 @@ cpu.out
*.db *.db
*.log *.log
*.log.*.gz
/gitea /gitea
/gitea-vet /gitea-vet

@ -50,7 +50,7 @@ type ChangeRepoFile struct {
Options *RepoFileOptions Options *RepoFileOptions
} }
// UpdateRepoFilesOptions holds the repository files update options // ChangeRepoFilesOptions holds the repository files update options
type ChangeRepoFilesOptions struct { type ChangeRepoFilesOptions struct {
LastCommitID string LastCommitID string
OldBranch string OldBranch string
@ -159,7 +159,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
return nil, err return nil, err
} }
treePaths := []string{} var treePaths []string
for _, file := range opts.Files { for _, file := range opts.Files {
// If FromTreePath is not set, set it to the opts.TreePath // If FromTreePath is not set, set it to the opts.TreePath
if file.TreePath != "" && file.FromTreePath == "" { if file.TreePath != "" && file.FromTreePath == "" {
@ -302,7 +302,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
return nil, err return nil, err
} }
default: default:
return nil, fmt.Errorf("Invalid file operation: %s %s, supported operations are create, update, delete", file.Operation, file.Options.treePath) return nil, fmt.Errorf("invalid file operation: %s %s, supported operations are create, update, delete", file.Operation, file.Options.treePath)
} }
} }
@ -334,16 +334,16 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
return nil, err return nil, err
} }
filesReponse, err := GetFilesResponseFromCommit(ctx, repo, commit, opts.NewBranch, treePaths) filesResponse, err := GetFilesResponseFromCommit(ctx, repo, commit, opts.NewBranch, treePaths)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if repo.IsEmpty { if repo.IsEmpty {
_ = repo_model.UpdateRepositoryCols(ctx, &repo_model.Repository{ID: repo.ID, IsEmpty: false}, "is_empty") _ = repo_model.UpdateRepositoryCols(ctx, &repo_model.Repository{ID: repo.ID, IsEmpty: false, DefaultBranch: opts.NewBranch}, "is_empty", "default_branch")
} }
return filesReponse, nil return filesResponse, nil
} }
// handles the check for various issues for ChangeRepoFiles // handles the check for various issues for ChangeRepoFiles
@ -437,7 +437,7 @@ func handleCheckErrors(file *ChangeRepoFile, commit *git.Commit, opts *ChangeRep
return nil return nil
} }
// handle creating or updating a file for ChangeRepoFiles // CreateOrUpdateFile handles creating or updating a file for ChangeRepoFiles
func CreateOrUpdateFile(ctx context.Context, t *TemporaryUploadRepository, file *ChangeRepoFile, contentStore *lfs.ContentStore, repoID int64, hasOldBranch bool) error { func CreateOrUpdateFile(ctx context.Context, t *TemporaryUploadRepository, file *ChangeRepoFile, contentStore *lfs.ContentStore, repoID int64, hasOldBranch bool) error {
// Get the two paths (might be the same if not moving) from the index if they exist // Get the two paths (might be the same if not moving) from the index if they exist
filesInIndex, err := t.LsFiles(file.TreePath, file.FromTreePath) filesInIndex, err := t.LsFiles(file.TreePath, file.FromTreePath)
@ -540,7 +540,7 @@ func CreateOrUpdateFile(ctx context.Context, t *TemporaryUploadRepository, file
if !exist { if !exist {
if err := contentStore.Put(lfsMetaObject.Pointer, strings.NewReader(file.Content)); err != nil { if err := contentStore.Put(lfsMetaObject.Pointer, strings.NewReader(file.Content)); err != nil {
if _, err2 := git_model.RemoveLFSMetaObjectByOid(ctx, repoID, lfsMetaObject.Oid); err2 != nil { if _, err2 := git_model.RemoveLFSMetaObjectByOid(ctx, repoID, lfsMetaObject.Oid); err2 != nil {
return fmt.Errorf("Error whilst removing failed inserted LFS object %s: %v (Prev Error: %w)", lfsMetaObject.Oid, err2, err) return fmt.Errorf("unable to remove failed inserted LFS object %s: %v (Prev Error: %w)", lfsMetaObject.Oid, err2, err)
} }
return err return err
} }

@ -137,4 +137,10 @@ func TestEmptyRepoAddFileByAPI(t *testing.T) {
req = NewRequest(t, "GET", "/user30/empty/src/branch/new_branch/new-file.txt") req = NewRequest(t, "GET", "/user30/empty/src/branch/new_branch/new-file.txt")
resp = session.MakeRequest(t, req, http.StatusOK) resp = session.MakeRequest(t, req, http.StatusOK)
assert.Contains(t, resp.Body.String(), "newly-added-api-file") assert.Contains(t, resp.Body.String(), "newly-added-api-file")
req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/user30/empty?token=%s", token))
resp = session.MakeRequest(t, req, http.StatusOK)
var apiRepo api.Repository
DecodeJSON(t, resp, &apiRepo)
assert.Equal(t, "new_branch", apiRepo.DefaultBranch)
} }

Loading…
Cancel
Save