Commit 705e43bf authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'master' of gitlab.com:gitlab-org/gitlab-ce

parents 24d139ba 63317597
Please view this file on the master branch, on stable branches it's out of date. Please view this file on the master branch, on stable branches it's out of date.
v 7.10.0 (unreleased) v 7.10.0 (unreleased)
- Fix broken file browsing with a submodule that contains a relative link (Stan Hu)
- Fix bug where Wiki pages that included a '/' were no longer accessible (Stan Hu) - Fix bug where Wiki pages that included a '/' were no longer accessible (Stan Hu)
- Fix bug where error messages from Dropzone would not be displayed on the issues page (Stan Hu) - Fix bug where error messages from Dropzone would not be displayed on the issues page (Stan Hu)
- Add ability to configure Reply-To address in gitlab.yml (Stan Hu) - Add ability to configure Reply-To address in gitlab.yml (Stan Hu)
- Move current user to the top of the list in assignee/author filters (Stan Hu)
- Fix broken side-by-side diff view on merge request page (Stan Hu) - Fix broken side-by-side diff view on merge request page (Stan Hu)
- Set Application controller default URL options to ensure all url_for calls are consistent (Stan Hu) - Set Application controller default URL options to ensure all url_for calls are consistent (Stan Hu)
- Allow HTML tags in Markdown input - Allow HTML tags in Markdown input
...@@ -64,6 +66,7 @@ v 7.10.0 (unreleased) ...@@ -64,6 +66,7 @@ v 7.10.0 (unreleased)
- Fixed link paths for HTTP and SSH on the admin project view (Jeremy Maziarz) - Fixed link paths for HTTP and SSH on the admin project view (Jeremy Maziarz)
- Fix and improve help rendering (Sullivan Sénéchal) - Fix and improve help rendering (Sullivan Sénéchal)
- Fix final line in EmailsOnPush email diff being rendered as error. - Fix final line in EmailsOnPush email diff being rendered as error.
- Authometic setup GitLab CI project for forks if origin project has GitLab CI enabled
v 7.9.3 v 7.9.3
- Contains no changes - Contains no changes
......
...@@ -8,6 +8,7 @@ class @UsersSelect ...@@ -8,6 +8,7 @@ class @UsersSelect
@groupId = $(select).data('group-id') @groupId = $(select).data('group-id')
showNullUser = $(select).data('null-user') showNullUser = $(select).data('null-user')
showAnyUser = $(select).data('any-user') showAnyUser = $(select).data('any-user')
firstUser = $(select).data('first-user')
$(select).select2 $(select).select2
placeholder: "Search for a user" placeholder: "Search for a user"
...@@ -32,6 +33,13 @@ class @UsersSelect ...@@ -32,6 +33,13 @@ class @UsersSelect
id: 0 id: 0
} }
if firstUser
# Move current user to the front of the list
for obj, index in data.results
if obj.username == firstUser
data.results.splice(index, 1)
data.results.unshift(obj)
break
if showNullUser if showNullUser
data.results.unshift(nullUser) data.results.unshift(nullUser)
if showAnyUser if showAnyUser
......
...@@ -8,12 +8,14 @@ module SelectsHelper ...@@ -8,12 +8,14 @@ module SelectsHelper
null_user = opts[:null_user] || false null_user = opts[:null_user] || false
any_user = opts[:any_user] || false any_user = opts[:any_user] || false
first_user = opts[:first_user] && current_user ? current_user.username : false
html = { html = {
class: css_class, class: css_class,
'data-placeholder' => placeholder, 'data-placeholder' => placeholder,
'data-null-user' => null_user, 'data-null-user' => null_user,
'data-any-user' => any_user, 'data-any-user' => any_user,
'data-first-user' => first_user
} }
unless opts[:scope] == :all unless opts[:scope] == :all
......
...@@ -53,15 +53,22 @@ module SubmoduleHelper ...@@ -53,15 +53,22 @@ module SubmoduleHelper
end end
def relative_self_links(url, commit) def relative_self_links(url, commit)
if url.scan(/(\.\.\/)/).size == 2 # Map relative links to a namespace and project
base = url[/([^\/]*\/[^\/]*)\.git/, 1] # For example:
else # ../bar.git -> same namespace, repo bar
base = [ @project.group.path, '/', url[/([^\/]*)\.git/, 1] ].join('') # ../foo/bar.git -> namespace foo, repo bar
# ../../foo/bar/baz.git -> namespace bar, repo baz
components = url.split('/')
base = components.pop.gsub(/.git$/, '')
namespace = components.pop.gsub(/^\.\.$/, '')
if namespace.empty?
namespace = @project.group.path
end end
[ [
namespace_project_path(base.namespace, base), namespace_project_path(namespace, base),
namespace_project_tree_path(base.namespace, base, commit) namespace_project_tree_path(namespace, base, commit)
] ]
end end
end end
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
# #
class GitlabCiService < CiService class GitlabCiService < CiService
API_PREFIX = "api/v1"
prop_accessor :project_url, :token prop_accessor :project_url, :token
validates :project_url, presence: true, if: :activated? validates :project_url, presence: true, if: :activated?
validates :token, presence: true, if: :activated? validates :token, presence: true, if: :activated?
...@@ -59,6 +61,26 @@ class GitlabCiService < CiService ...@@ -59,6 +61,26 @@ class GitlabCiService < CiService
end end
end end
def fork_registration(new_project, private_token)
params = {
id: new_project.id,
name_with_namespace: new_project.name_with_namespace,
web_url: new_project.web_url,
default_branch: new_project.default_branch,
ssh_url_to_repo: new_project.ssh_url_to_repo
}
HTTParty.post(
fork_registration_path,
body: {
project_id: project.id,
project_token: token,
private_token: private_token,
data: params },
verify: false
)
end
def commit_coverage(sha, ref) def commit_coverage(sha, ref)
response = get_ci_build(sha, ref) response = get_ci_build(sha, ref)
...@@ -97,4 +119,10 @@ class GitlabCiService < CiService ...@@ -97,4 +119,10 @@ class GitlabCiService < CiService
{ type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3' } { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3' }
] ]
end end
private
def fork_registration_path
project_url.sub(/projects\/\d*/, "#{API_PREFIX}/forks")
end
end end
...@@ -40,12 +40,18 @@ module Projects ...@@ -40,12 +40,18 @@ module Projects
if project.save if project.save
project.team << [@current_user, :master] project.team << [@current_user, :master]
end end
#Now fork the repo #Now fork the repo
unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path) unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path)
raise 'forking failed in gitlab-shell' raise 'forking failed in gitlab-shell'
end end
project.ensure_satellite_exists project.ensure_satellite_exists
end end
if @from_project.gitlab_ci?
ForkRegistrationWorker.perform_async(@from_project.id, project.id, @current_user.private_token)
end
rescue => ex rescue => ex
project.errors.add(:base, 'Fork transaction failed.') project.errors.add(:base, 'Fork transaction failed.')
project.destroy project.destroy
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
- else - else
none none
- if can?(current_user, :modify_issue, @issue) - if can?(current_user, :modify_issue, @issue)
= users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id, null_user: true) = users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id, null_user: true, first_user: true)
%div.prepend-top-20.clearfix %div.prepend-top-20.clearfix
.issuable-context-title .issuable-context-title
......
...@@ -24,11 +24,11 @@ ...@@ -24,11 +24,11 @@
.issues-other-filters .issues-other-filters
.filter-item.inline .filter-item.inline
= users_select_tag(:assignee_id, selected: params[:assignee_id], = users_select_tag(:assignee_id, selected: params[:assignee_id],
placeholder: 'Assignee', class: 'trigger-submit', any_user: true, null_user: true) placeholder: 'Assignee', class: 'trigger-submit', any_user: true, null_user: true, first_user: true)
.filter-item.inline .filter-item.inline
= users_select_tag(:author_id, selected: params[:author_id], = users_select_tag(:author_id, selected: params[:author_id],
placeholder: 'Author', class: 'trigger-submit', any_user: true) placeholder: 'Author', class: 'trigger-submit', any_user: true, first_user: true)
.filter-item.inline.milestone-filter .filter-item.inline.milestone-filter
= select_tag('milestone_id', projects_milestones_options, class: "select2 trigger-submit", prompt: 'Milestone') = select_tag('milestone_id', projects_milestones_options, class: "select2 trigger-submit", prompt: 'Milestone')
......
class ForkRegistrationWorker
include Sidekiq::Worker
sidekiq_options queue: :default
def perform(from_project_id, to_project_id, private_token)
from_project = Project.find(from_project_id)
to_project = Project.find(to_project_id)
from_project.gitlab_ci_service.fork_registration(to_project, private_token)
end
end
...@@ -25,6 +25,12 @@ Feature: Project Issues ...@@ -25,6 +25,12 @@ Feature: Project Issues
Given I click link "Release 0.4" Given I click link "Release 0.4"
Then I should see issue "Release 0.4" Then I should see issue "Release 0.4"
@javascript
Scenario: I visit issue page
Given I add a user to project "Shop"
And I click "author" dropdown
Then I see current user as the first user
Scenario: I submit new unassigned issue Scenario: I submit new unassigned issue
Given I click link "New Issue" Given I click link "New Issue"
And I submit new issue "500 error on profile" And I submit new issue "500 error on profile"
......
...@@ -59,6 +59,18 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps ...@@ -59,6 +59,18 @@ class Spinach::Features::ProjectIssues < Spinach::FeatureSteps
click_link "New Issue" click_link "New Issue"
end end
step 'I click "author" dropdown' do
first('.ajax-users-select').click
end
step 'I see current user as the first user' do
expect(page).to have_selector('.user-result', visible: true, count: 4)
users = page.all('.user-name')
users[0].text.should == 'Any'
users[1].text.should == 'Unassigned'
users[2].text.should == current_user.name
end
step 'I submit new issue "500 error on profile"' do step 'I submit new issue "500 error on profile"' do
fill_in "issue_title", with: "500 error on profile" fill_in "issue_title", with: "500 error on profile"
click_button "Submit new issue" click_button "Submit new issue"
......
...@@ -14,6 +14,13 @@ module SharedProject ...@@ -14,6 +14,13 @@ module SharedProject
@project.team << [@user, :master] @project.team << [@user, :master]
end end
# Add another user to project "Shop"
step 'I add a user to project "Shop"' do
@project = Project.find_by(name: "Shop")
other_user = create(:user, name: 'Alpha')
@project.team << [other_user, :master]
end
# Create another specific project called "Forum" # Create another specific project called "Forum"
step 'I own project "Forum"' do step 'I own project "Forum"' do
@project = Project.find_by(name: "Forum") @project = Project.find_by(name: "Forum")
......
require 'spec_helper' require 'spec_helper'
describe SubmoduleHelper do describe SubmoduleHelper do
include RepoHelpers
describe 'submodule links' do describe 'submodule links' do
let(:submodule_item) { double(id: 'hash', path: 'rack') } let(:submodule_item) { double(id: 'hash', path: 'rack') }
let(:config) { Gitlab.config.gitlab } let(:config) { Gitlab.config.gitlab }
...@@ -111,6 +113,39 @@ describe SubmoduleHelper do ...@@ -111,6 +113,39 @@ describe SubmoduleHelper do
expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ]) expect(submodule_links(submodule_item)).to eq([ repo.submodule_url_for, nil ])
end end
end end
context 'submodules with relative links' do
let(:group) { create(:group) }
let(:project) { create(:project, group: group) }
before do
self.instance_variable_set(:@project, project)
end
it 'one level down' do
commit_id = sample_commit[:id]
result = relative_self_links('../test.git', commit_id)
expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
end
it 'two levels down' do
commit_id = sample_commit[:id]
result = relative_self_links('../../test.git', commit_id)
expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
end
it 'one level down with namespace and repo' do
commit_id = sample_commit[:id]
result = relative_self_links('../foobar/test.git', commit_id)
expect(result).to eq(["/foobar/test", "/foobar/test/tree/#{commit_id}"])
end
it 'two levels down with namespace and repo' do
commit_id = sample_commit[:id]
result = relative_self_links('../foobar/baz/test.git', commit_id)
expect(result).to eq(["/baz/test", "/baz/test/tree/#{commit_id}"])
end
end
end end
def stub_url(url) def stub_url(url)
......
...@@ -46,4 +46,25 @@ describe GitlabCiService do ...@@ -46,4 +46,25 @@ describe GitlabCiService do
it { expect(@service.build_page("2ab7834c", 'master')).to eq("http://ci.gitlab.org/projects/2/refs/master/commits/2ab7834c")} it { expect(@service.build_page("2ab7834c", 'master')).to eq("http://ci.gitlab.org/projects/2/refs/master/commits/2ab7834c")}
end end
end end
describe "Fork registration" do
before do
@old_project = create(:empty_project)
@project = create(:empty_project)
@user = create(:user)
@service = GitlabCiService.new
@service.stub(
service_hook: true,
project_url: 'http://ci.gitlab.org/projects/2',
token: 'verySecret',
project: @old_project
)
end
it "performs http reuquest to ci" do
stub_request(:post, "http://ci.gitlab.org/api/v1/forks")
@service.fork_registration(@project, @user.private_token)
end
end
end end
...@@ -40,6 +40,17 @@ describe Projects::ForkService do ...@@ -40,6 +40,17 @@ describe Projects::ForkService do
expect(@to_project.errors[:base]).not_to include("Fork transaction failed.") expect(@to_project.errors[:base]).not_to include("Fork transaction failed.")
end end
end end
context 'GitLab CI is enabled' do
it "calls fork registrator for CI" do
@from_project.build_missing_services
@from_project.gitlab_ci_service.update_attributes(active: true)
expect(ForkRegistrationWorker).to receive(:perform_async)
fork_project(@from_project, @to_user)
end
end
end end
describe :fork_to_namespace do describe :fork_to_namespace do
...@@ -89,7 +100,8 @@ describe Projects::ForkService do ...@@ -89,7 +100,8 @@ describe Projects::ForkService do
def fork_project(from_project, user, fork_success = true, params = {}) def fork_project(from_project, user, fork_success = true, params = {})
context = Projects::ForkService.new(from_project, user, params) context = Projects::ForkService.new(from_project, user, params)
shell = double('gitlab_shell').stub(fork_repository: fork_success) shell = double('gitlab_shell')
shell.stub(fork_repository: fork_success)
context.stub(gitlab_shell: shell) context.stub(gitlab_shell: shell)
context.execute context.execute
end end
......
require 'spec_helper'
describe ForkRegistrationWorker do
context "as a resque worker" do
it "reponds to #perform" do
expect(ForkRegistrationWorker.new).to respond_to(:perform)
end
end
end
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