Skip to content

Commit 2c86adf

Browse files
committed
fix upload and tests
1 parent a4e74bd commit 2c86adf

File tree

4 files changed

+81
-22
lines changed

4 files changed

+81
-22
lines changed

modules/context/repo.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
883883
// assume the user is viewing the (non-existent) default branch
884884
ctx.Repo.IsViewBranch = true
885885
ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch
886-
ctx.Data["TreePath"] = ctx.Repo.BranchName
886+
ctx.Data["TreePath"] = ""
887887
return
888888
}
889889

routers/web/repo/editor.go

+21-17
Original file line numberDiff line numberDiff line change
@@ -621,25 +621,25 @@ func UploadFilePost(ctx *context.Context) {
621621
return
622622
}
623623

624-
var newTreePath string
625-
for _, part := range treeNames {
626-
newTreePath = path.Join(newTreePath, part)
627-
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(newTreePath)
628-
if err != nil {
629-
if git.IsErrNotExist(err) {
630-
// Means there is no item with that name, so we're good
631-
break
624+
if !ctx.Repo.Repository.IsEmpty {
625+
var newTreePath string
626+
for _, part := range treeNames {
627+
newTreePath = path.Join(newTreePath, part)
628+
entry, err := ctx.Repo.Commit.GetTreeEntryByPath(newTreePath)
629+
if err != nil {
630+
if git.IsErrNotExist(err) {
631+
break // Means there is no item with that name, so we're good
632+
}
633+
ctx.ServerError("Repo.Commit.GetTreeEntryByPath", err)
634+
return
632635
}
633636

634-
ctx.ServerError("Repo.Commit.GetTreeEntryByPath", err)
635-
return
636-
}
637-
638-
// User can only upload files to a directory.
639-
if !entry.IsDir() {
640-
ctx.Data["Err_TreePath"] = true
641-
ctx.RenderWithErr(ctx.Tr("repo.editor.directory_is_a_file", part), tplUploadFile, &form)
642-
return
637+
// User can only upload files to a directory, the directory name shouldn't be an existing file.
638+
if !entry.IsDir() {
639+
ctx.Data["Err_TreePath"] = true
640+
ctx.RenderWithErr(ctx.Tr("repo.editor.directory_is_a_file", part), tplUploadFile, &form)
641+
return
642+
}
643643
}
644644
}
645645

@@ -718,6 +718,10 @@ func UploadFilePost(ctx *context.Context) {
718718
return
719719
}
720720

721+
if ctx.Repo.Repository.IsEmpty {
722+
_ = repo_model.UpdateRepositoryCols(ctx, &repo_model.Repository{ID: ctx.Repo.Repository.ID, IsEmpty: false}, "is_empty")
723+
}
724+
721725
if form.CommitChoice == frmCommitChoiceNewBranch && ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) {
722726
ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ctx.Repo.BranchName) + "..." + util.PathEscapeSegments(form.NewBranchName))
723727
} else {

services/repository/files/upload.go

+15-4
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,22 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
8686
return err
8787
}
8888
defer t.Close()
89-
if err := t.Clone(opts.OldBranch); err != nil {
90-
return err
89+
90+
hasOldBranch := true
91+
if err = t.Clone(opts.OldBranch); err != nil {
92+
if !git.IsErrBranchNotExist(err) || !repo.IsEmpty {
93+
return err
94+
}
95+
if err = t.Init(); err != nil {
96+
return err
97+
}
98+
hasOldBranch = false
99+
opts.LastCommitID = ""
91100
}
92-
if err := t.SetDefaultIndex(); err != nil {
93-
return err
101+
if hasOldBranch {
102+
if err = t.SetDefaultIndex(); err != nil {
103+
return err
104+
}
94105
}
95106

96107
var filename2attribute2info map[string]map[string]string

tests/integration/empty_repo_test.go

+44
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
package integration
55

66
import (
7+
"bytes"
8+
"io"
9+
"mime/multipart"
710
"net/http"
811
"testing"
912

1013
"code.gitea.io/gitea/models/db"
1114
repo_model "code.gitea.io/gitea/models/repo"
1215
"code.gitea.io/gitea/models/unittest"
1316
user_model "code.gitea.io/gitea/models/user"
17+
"code.gitea.io/gitea/modules/json"
1418
"code.gitea.io/gitea/modules/setting"
1519
"code.gitea.io/gitea/modules/test"
1620
"code.gitea.io/gitea/tests"
@@ -61,3 +65,43 @@ func TestEmptyRepoAddFile(t *testing.T) {
6165
resp = session.MakeRequest(t, req, http.StatusOK)
6266
assert.Contains(t, resp.Body.String(), "newly-added-test-file")
6367
}
68+
69+
func TestEmptyRepoUploadFile(t *testing.T) {
70+
defer tests.PrepareTestEnv(t)()
71+
72+
err := user_model.UpdateUserCols(db.DefaultContext, &user_model.User{ID: 30, ProhibitLogin: false}, "prohibit_login")
73+
assert.NoError(t, err)
74+
75+
session := loginUser(t, "user30")
76+
req := NewRequest(t, "GET", "/user30/empty/_new/"+setting.Repository.DefaultBranch)
77+
resp := session.MakeRequest(t, req, http.StatusOK)
78+
doc := NewHTMLParser(t, resp.Body).Find(`input[name="commit_choice"]`)
79+
assert.Equal(t, "", doc.AttrOr("checked", "_no_"))
80+
81+
body := &bytes.Buffer{}
82+
mpForm := multipart.NewWriter(body)
83+
_ = mpForm.WriteField("_csrf", GetCSRF(t, session, "/user/settings"))
84+
file, _ := mpForm.CreateFormFile("file", "uploaded-file.txt")
85+
_, _ = io.Copy(file, bytes.NewBufferString("newly-uploaded-test-file"))
86+
_ = mpForm.Close()
87+
88+
req = NewRequestWithBody(t, "POST", "/user30/empty/upload-file", body)
89+
req.Header.Add("Content-Type", mpForm.FormDataContentType())
90+
resp = session.MakeRequest(t, req, http.StatusOK)
91+
respMap := map[string]string{}
92+
assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), &respMap))
93+
94+
req = NewRequestWithValues(t, "POST", "/user30/empty/_upload/"+setting.Repository.DefaultBranch, map[string]string{
95+
"_csrf": GetCSRF(t, session, "/user/settings"),
96+
"commit_choice": "direct",
97+
"files": respMap["uuid"],
98+
"tree_path": "",
99+
})
100+
resp = session.MakeRequest(t, req, http.StatusSeeOther)
101+
redirect := test.RedirectURL(resp)
102+
assert.Equal(t, "/user30/empty/src/branch/"+setting.Repository.DefaultBranch+"/", redirect)
103+
104+
req = NewRequest(t, "GET", redirect)
105+
resp = session.MakeRequest(t, req, http.StatusOK)
106+
assert.Contains(t, resp.Body.String(), "uploaded-file.txt")
107+
}

0 commit comments

Comments
 (0)