Add JS validation for invalid characters in branch name

More info about valid ref names:

https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.ht
ml
parent c91cf1f6
class @NewBranchForm
constructor: (form, availableRefs) ->
@branchNameError = form.find('.js-branch-name-error')
@name = form.find('.js-branch-name')
@ref = form.find('#ref')
@setupAvailableRefs(availableRefs)
@setupRestrictions()
@addBinding()
@init()
addBinding: ->
@name.on 'blur', @validate
init: ->
@name.trigger 'blur'if @name.val().length > 0
setupAvailableRefs: (availableRefs) ->
@ref.autocomplete {
source: availableRefs,
minLength: 1
}
setupRestrictions: ->
startsWith = {
pattern: /^(\/|\.)/g,
prefix: "can't start with ",
conjunction: "or"
}
endsWith = {
pattern: /(\/|\.|\.lock)$/g,
prefix: "can't end in ",
conjunction: "or"
}
characters = {
pattern: /(\s|~|\^|:|\?|\*|\[|\\|\.\.|@\{|\/{2,}){1}/g
prefix: "can't contains ",
conjunction: ", "
}
@restrictions = [startsWith, characters, endsWith]
validate: =>
@branchNameError.empty()
unique = (values, value) ->
values.push(value) unless value in values
values
formatter = (values, restriction) ->
formatted = values.map (value) ->
switch
when /\s/.test value then 'spaces'
when /\/{2,}/g.test value then 'consecutive slashes'
else "'#{value}'"
"#{restriction.prefix} #{formatted.join(restriction.conjunction)}"
validator = (errors, restriction) =>
matched = @name.val().match(restriction.pattern)
if matched
errors.concat formatter(matched.reduce(unique, []), restriction)
else
errors
errors = @restrictions.reduce validator, []
if errors.length > 0
errorMessage = $("<span/>").text(errors.join(', '))
@branchNameError.append(errorMessage)
...@@ -4,7 +4,7 @@ class CreateBranchService < BaseService ...@@ -4,7 +4,7 @@ class CreateBranchService < BaseService
def execute(branch_name, ref) def execute(branch_name, ref)
valid_branch = Gitlab::GitRefValidator.validate(branch_name) valid_branch = Gitlab::GitRefValidator.validate(branch_name)
if valid_branch == false if valid_branch == false
return error("Branch name can't contains space, '~', '^', ':', '?', '*', '[', '\', '..', '@{', and consecutive slashes, start with '/' or '.' or end in '/' or '.' or '.lock'") return error('Branch name is invalid')
end end
repository = project.repository repository = project.repository
......
...@@ -9,11 +9,12 @@ ...@@ -9,11 +9,12 @@
New Branch New Branch
%hr %hr
= form_tag namespace_project_branches_path, method: :post, id: "new-branch-form", class: "form-horizontal js-requires-input" do = form_tag namespace_project_branches_path, method: :post, id: "new-branch-form", class: "form-horizontal js-create-branch-form js-requires-input" do
.form-group .form-group
= label_tag :branch_name, nil, class: 'control-label' = label_tag :branch_name, nil, class: 'control-label'
.col-sm-10 .col-sm-10
= text_field_tag :branch_name, params[:branch_name], required: true, tabindex: 1, autofocus: true, class: 'form-control' = text_field_tag :branch_name, params[:branch_name], required: true, tabindex: 1, autofocus: true, class: 'form-control js-branch-name'
.help-block.text-danger.js-branch-name-error
.form-group .form-group
= label_tag :ref, 'Create from', class: 'control-label' = label_tag :ref, 'Create from', class: 'control-label'
.col-sm-10 .col-sm-10
...@@ -26,7 +27,4 @@ ...@@ -26,7 +27,4 @@
:javascript :javascript
var availableRefs = #{@project.repository.ref_names.to_json}; var availableRefs = #{@project.repository.ref_names.to_json};
$("#ref").autocomplete({ new NewBranchForm($('.js-create-branch-form'), availableRefs)
source: availableRefs,
minLength: 1
});
...@@ -25,6 +25,7 @@ Feature: Project Commits Branches ...@@ -25,6 +25,7 @@ Feature: Project Commits Branches
And I click branch 'improve/awesome' delete link And I click branch 'improve/awesome' delete link
Then I should not see branch 'improve/awesome' Then I should not see branch 'improve/awesome'
@javascript
Scenario: I create a branch with invalid name Scenario: I create a branch with invalid name
Given I visit project branches page Given I visit project branches page
And I click new branch link And I click new branch link
......
...@@ -61,7 +61,8 @@ class Spinach::Features::ProjectCommitsBranches < Spinach::FeatureSteps ...@@ -61,7 +61,8 @@ class Spinach::Features::ProjectCommitsBranches < Spinach::FeatureSteps
end end
step 'I should see new an error that branch is invalid' do step 'I should see new an error that branch is invalid' do
expect(page).to have_content "Branch name can't contains space, '~', '^', ':', '?', '*', '[', '\', '..', '@{', and consecutive slashes, start with '/' or '.' or end in '/' or '.' or '.lock'" expect(page).to have_content 'Branch name is invalid'
expect(page).to have_content "can't contains spaces"
end end
step 'I should see new an error that ref is invalid' do step 'I should see new an error that ref is invalid' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment