summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorLauris BH <lauris@nix.lv>2017-10-15 22:59:24 +0300
committerGitHub <noreply@github.com>2017-10-15 22:59:24 +0300
commitf3833b7ce4dc78095194808c6e07d8ae133e7ab5 (patch)
treecdcb53731d4523f068a6e532bf5da9e2759f8cb2 /modules
parentc25303b11c323045718a5af373c11f5807f77fb7 (diff)
downloadgitea-f3833b7ce4dc78095194808c6e07d8ae133e7ab5.tar.gz
gitea-f3833b7ce4dc78095194808c6e07d8ae133e7ab5.zip
Create new branch from branch selection dropdown (#2130)
* Create new branch from branch selection dropdown and rewrite it to VueJS * Make updateLocalCopyToCommit as not exported * Move branch name validation to model * Fix possible race condition
Diffstat (limited to 'modules')
-rw-r--r--modules/auth/repo_branch_form.go20
-rw-r--r--modules/context/repo.go6
-rw-r--r--modules/validation/binding.go12
3 files changed, 35 insertions, 3 deletions
diff --git a/modules/auth/repo_branch_form.go b/modules/auth/repo_branch_form.go
new file mode 100644
index 0000000000..57e63741aa
--- /dev/null
+++ b/modules/auth/repo_branch_form.go
@@ -0,0 +1,20 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package auth
+
+import (
+ "github.com/go-macaron/binding"
+ macaron "gopkg.in/macaron.v1"
+)
+
+// NewBranchForm form for creating a new branch
+type NewBranchForm struct {
+ NewBranchName string `binding:"Required;MaxSize(100);GitRefName"`
+}
+
+// Validate validates the fields
+func (f *NewBranchForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
diff --git a/modules/context/repo.go b/modules/context/repo.go
index 88208922c8..c33396c0f9 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -76,6 +76,11 @@ func (r *Repository) CanEnableEditor() bool {
return r.Repository.CanEnableEditor() && r.IsViewBranch && r.IsWriter()
}
+// CanCreateBranch returns true if repository is editable and user has proper access level.
+func (r *Repository) CanCreateBranch() bool {
+ return r.Repository.CanCreateBranch() && r.IsWriter()
+}
+
// CanCommitToBranch returns true if repository is editable and user has proper access level
// and branch is not protected
func (r *Repository) CanCommitToBranch(doer *models.User) (bool, error) {
@@ -528,6 +533,7 @@ func RepoRef() macaron.Handler {
ctx.Data["IsViewBranch"] = ctx.Repo.IsViewBranch
ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag
ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit
+ ctx.Data["CanCreateBranch"] = ctx.Repo.CanCreateBranch()
ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
if err != nil {
diff --git a/modules/validation/binding.go b/modules/validation/binding.go
index 783499e69a..3f671890b6 100644
--- a/modules/validation/binding.go
+++ b/modules/validation/binding.go
@@ -44,12 +44,18 @@ func addGitRefNameBindingRule() {
}
// Additional rules as described at https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
if strings.HasPrefix(str, "/") || strings.HasSuffix(str, "/") ||
- strings.HasPrefix(str, ".") || strings.HasSuffix(str, ".") ||
- strings.HasSuffix(str, ".lock") ||
- strings.Contains(str, "..") || strings.Contains(str, "//") {
+ strings.HasSuffix(str, ".") || strings.Contains(str, "..") ||
+ strings.Contains(str, "//") {
errs.Add([]string{name}, ErrGitRefName, "GitRefName")
return false, errs
}
+ parts := strings.Split(str, "/")
+ for _, part := range parts {
+ if strings.HasSuffix(part, ".lock") || strings.HasPrefix(part, ".") {
+ errs.Add([]string{name}, ErrGitRefName, "GitRefName")
+ return false, errs
+ }
+ }
return true, errs
},