diff --git a/modules/context/repo.go b/modules/context/repo.go index e3d66fc3b98ac..093a5e030511b 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -74,7 +74,7 @@ type Repository struct { // CanEnableEditor returns true if repository is editable and user has proper access level. func (r *Repository) CanEnableEditor() bool { - return r.Permission.CanWrite(unit_model.TypeCode) && r.Repository.CanEnableEditor() && r.IsViewBranch && !r.Repository.IsArchived + return r.Permission.CanWrite(unit_model.TypeCode) && r.Repository.CanEnableEditor() && (r.IsViewBranch || r.Repository.IsEmpty) && !r.Repository.IsArchived } // CanCreateBranch returns true if repository is editable and user has proper access level. @@ -753,6 +753,10 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context return func(ctx *Context) (cancel context.CancelFunc) { // Empty repository does not have reference information. if ctx.Repo.Repository.IsEmpty { + ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch + ctx.Repo.TreePath = "" + ctx.Data["TreePath"] = ctx.Repo.TreePath + ctx.Repo.IsViewBranch = true return } diff --git a/modules/repofiles/update.go b/modules/repofiles/update.go index d25accff1873a..d432029b2838e 100644 --- a/modules/repofiles/update.go +++ b/modules/repofiles/update.go @@ -131,9 +131,11 @@ func CreateOrUpdateRepoFile(repo *models.Repository, doer *models.User, opts *Up opts.NewBranch = opts.OldBranch } - // oldBranch must exist for this operation - if _, err := repo_module.GetBranch(repo, opts.OldBranch); err != nil { - return nil, err + if !repo.IsEmpty { + // oldBranch must exist for this operation + if _, err := repo_module.GetBranch(repo, opts.OldBranch); err != nil { + return nil, err + } } // A NewBranch can be specified for the file to be created/updated in a new branch. @@ -177,6 +179,19 @@ func CreateOrUpdateRepoFile(repo *models.Repository, doer *models.User, opts *Up author, committer := GetAuthorAndCommitterUsers(opts.Author, opts.Committer, doer) + if repo.IsEmpty { + err := repo_module.CheckInitRepository(repo.OwnerName, repo.Name) + if err != nil && !models.IsErrRepoFilesAlreadyExist(err) { + return nil, err + } + + repo.IsEmpty = false + repo.DefaultBranch = opts.OldBranch + if err := models.UpdateRepository(repo, false); err != nil { + return nil, err + } + } + t, err := NewTemporaryUploadRepository(repo) if err != nil { log.Error("%v", err) @@ -204,7 +219,6 @@ func CreateOrUpdateRepoFile(repo *models.Repository, doer *models.User, opts *Up return nil, fmt.Errorf("DeleteRepoFile: Invalid last commit ID: %v", err) } opts.LastCommitID = lastCommitID.String() - } encoding := "UTF-8" diff --git a/modules/repository/generate.go b/modules/repository/generate.go index f6b76b14affa2..d3e48373ee6e4 100644 --- a/modules/repository/generate.go +++ b/modules/repository/generate.go @@ -271,7 +271,7 @@ func GenerateRepository(ctx context.Context, doer, owner *models.User, templateR } } - if err = checkInitRepository(owner.Name, generateRepo.Name); err != nil { + if err = CheckInitRepository(owner.Name, generateRepo.Name); err != nil { return generateRepo, err } diff --git a/modules/repository/init.go b/modules/repository/init.go index 076dbf748e687..ca86a0918e18d 100644 --- a/modules/repository/init.go +++ b/modules/repository/init.go @@ -172,7 +172,8 @@ func initRepoCommit(tmpPath string, repo *models.Repository, u *models.User, def return nil } -func checkInitRepository(owner, name string) (err error) { +// CheckInitRepository check and init git repository +func CheckInitRepository(owner, name string) (err error) { // Somehow the directory could exist. repoPath := models.RepoPath(owner, name) isExist, err := util.IsExist(repoPath) @@ -198,7 +199,7 @@ func checkInitRepository(owner, name string) (err error) { // InitRepository initializes README and .gitignore if needed. func initRepository(ctx context.Context, repoPath string, u *models.User, repo *models.Repository, opts models.CreateRepoOptions) (err error) { - if err = checkInitRepository(repo.OwnerName, repo.Name); err != nil { + if err = CheckInitRepository(repo.OwnerName, repo.Name); err != nil { return err } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 6e39b4b03d833..c5e5bddc35e3a 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -942,7 +942,7 @@ download_archive = Download Repository no_desc = No Description quick_guide = Quick Guide -clone_this_repo = Clone this repository +clone_this_repo = Upload files or Clone this repository create_new_repo_command = Creating a new repository on the command line push_exist_repo = Pushing an existing repository from the command line empty_message = This repository does not contain any content. diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 72726f0545f02..3a0e6c6a7c7e8 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -826,6 +826,10 @@ func renderCode(ctx *context.Context) { ctx.Data["PageIsViewCode"] = true if ctx.Repo.Repository.IsEmpty { + if ctx.Repo.CanWrite(unit_model.TypeCode) { + ctx.Data["CanAddFile"] = true + ctx.Data["CanUploadFile"] = setting.Repository.Upload.Enabled + } ctx.HTML(http.StatusOK, tplRepoEMPTY) return } diff --git a/routers/web/web.go b/routers/web/web.go index f84d357bb126e..87f59fd6509c0 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -791,6 +791,9 @@ func RegisterRoutes(m *web.Route) { Get(repo.UploadFile). Post(bindIgnErr(forms.UploadRepoFileForm{}), repo.UploadFilePost) }, context.RepoRefByType(context.RepoRefBranch), repo.MustBeEditable) + }, context.RepoMustNotBeArchived(), reqRepoCodeWriter) + + m.Group("", func() { m.Group("", func() { m.Post("/upload-file", repo.UploadFileToServer) m.Post("/upload-remove", bindIgnErr(forms.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer) diff --git a/templates/repo/empty.tmpl b/templates/repo/empty.tmpl index 485a6aa4e55f0..edfdaf7cb70e9 100644 --- a/templates/repo/empty.tmpl +++ b/templates/repo/empty.tmpl @@ -17,8 +17,26 @@

{{.i18n.Tr "repo.clone_this_repo"}} {{.i18n.Tr "repo.clone_helper" "http://git-scm.com/book/en/Git-Basics-Getting-a-Git-Repository" | Str2html}}

-
- {{template "repo/clone_buttons" .}} +
+
+ {{if .Repository.CanEnableEditor}} + {{if .CanAddFile}} + + {{.i18n.Tr "repo.editor.new_file"}} + + {{end}} + {{if .CanUploadFile}} + + {{.i18n.Tr "repo.editor.upload_file"}} + + {{end}} + {{end}} +
+
+
+
+ {{template "repo/clone_buttons" .}} +