From a90988d63f25f510886073f2b4f00780e775fed0 Mon Sep 17 00:00:00 2001
From: wxiaoguang <wxiaoguang@gmail.com>
Date: Wed, 31 May 2023 17:07:51 +0800
Subject: [PATCH] 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.
---
 .gitignore                           |  1 +
 services/repository/files/update.go  | 16 ++++++++--------
 tests/integration/empty_repo_test.go |  6 ++++++
 3 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/.gitignore b/.gitignore
index 7ae3455d46..c53caa9806 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,6 +47,7 @@ cpu.out
 
 *.db
 *.log
+*.log.*.gz
 
 /gitea
 /gitea-vet
diff --git a/services/repository/files/update.go b/services/repository/files/update.go
index 81d5e32773..01bf2ace00 100644
--- a/services/repository/files/update.go
+++ b/services/repository/files/update.go
@@ -50,7 +50,7 @@ type ChangeRepoFile struct {
 	Options      *RepoFileOptions
 }
 
-// UpdateRepoFilesOptions holds the repository files update options
+// ChangeRepoFilesOptions holds the repository files update options
 type ChangeRepoFilesOptions struct {
 	LastCommitID string
 	OldBranch    string
@@ -159,7 +159,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
 		return nil, err
 	}
 
-	treePaths := []string{}
+	var treePaths []string
 	for _, file := range opts.Files {
 		// If FromTreePath is not set, set it to the opts.TreePath
 		if file.TreePath != "" && file.FromTreePath == "" {
@@ -302,7 +302,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
 				return nil, err
 			}
 		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
 	}
 
-	filesReponse, err := GetFilesResponseFromCommit(ctx, repo, commit, opts.NewBranch, treePaths)
+	filesResponse, err := GetFilesResponseFromCommit(ctx, repo, commit, opts.NewBranch, treePaths)
 	if err != nil {
 		return nil, err
 	}
 
 	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
@@ -437,7 +437,7 @@ func handleCheckErrors(file *ChangeRepoFile, commit *git.Commit, opts *ChangeRep
 	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 {
 	// 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)
@@ -540,7 +540,7 @@ func CreateOrUpdateFile(ctx context.Context, t *TemporaryUploadRepository, file
 		if !exist {
 			if err := contentStore.Put(lfsMetaObject.Pointer, strings.NewReader(file.Content)); err != 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
 			}
diff --git a/tests/integration/empty_repo_test.go b/tests/integration/empty_repo_test.go
index 73331bc933..cfb2456223 100644
--- a/tests/integration/empty_repo_test.go
+++ b/tests/integration/empty_repo_test.go
@@ -137,4 +137,10 @@ func TestEmptyRepoAddFileByAPI(t *testing.T) {
 	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")
+
+	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)
 }