Merge branch 'master' into remove-satellites
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
This commit is contained in:
commit
4a0fa27017
19
CHANGELOG
19
CHANGELOG
|
@ -7,6 +7,7 @@ v 8.0.0 (unreleased)
|
|||
- Ability to fetch merge requests from refs/merge-requests/:id
|
||||
|
||||
v 7.14.0 (unreleased)
|
||||
- Provide more feedback what went wrong if HipChat service failed test (Stan Hu)
|
||||
- Disable turbolinks when linking to Bitbucket import status (Stan Hu)
|
||||
- Fix broken code import and display error messages if something went wrong with creating project (Stan Hu)
|
||||
- Fix corrupted binary files when using API files endpoint (Stan Hu)
|
||||
|
@ -33,14 +34,11 @@ v 7.14.0 (unreleased)
|
|||
- Fix file upload dialog for comment editing (Daniel Gerhardt)
|
||||
- Set OmniAuth full_host parameter to ensure redirect URIs are correct (Stan Hu)
|
||||
- Return comments in created order in merge request API (Stan Hu)
|
||||
- Disable internal issue tracker controller if external tracker is used (Stan Hu)
|
||||
- Expire Rails cache entries after two weeks to prevent endless Redis growth
|
||||
- Add support for destroying project milestones (Stan Hu)
|
||||
- Add fetch command to the MR page.
|
||||
- Allow custom backup archive permissions
|
||||
- Add fetch command to the MR page
|
||||
- Add project star and fork count, group avatar URL and user/group web URL attributes to API
|
||||
- Fix bug causing Bitbucket importer to crash when OAuth application had been removed.
|
||||
- Add fetch command to the MR page.
|
||||
- Show who last edited a comment if it wasn't the original author
|
||||
- Send notification to all participants when MR is merged.
|
||||
- Add ability to manage user email addresses via the API.
|
||||
|
@ -61,6 +59,19 @@ v 7.14.0 (unreleased)
|
|||
- Fix bug causing error when the target branch of a symbolic ref was deleted
|
||||
- Include branch/tag name in archive file and directory name
|
||||
- Add dropzone upload progress
|
||||
- Add a label for merged branches on branches page (Florent Baldino)
|
||||
- Detect .mkd and .mkdn files as markdown (Ben Boeckel)
|
||||
- Fix: User search feature in admin area does not respect filters
|
||||
- Set max-width for README, issue and merge request description for easier read on big screens
|
||||
- Update Flowdock integration to support new Flowdock API (Boyan Tabakov)
|
||||
- Remove author from files view (Sven Strickroth)
|
||||
|
||||
v 7.13.5
|
||||
- Satellites reverted
|
||||
|
||||
v 7.13.4
|
||||
- Allow users to send abuse reports
|
||||
- Fix redirection after sign in when using auto_sign_in_with_provider
|
||||
|
||||
v 7.13.3
|
||||
- Fix bug causing Bitbucket importer to crash when OAuth application had been removed.
|
||||
|
|
4
Gemfile
4
Gemfile
|
@ -24,7 +24,7 @@ gem 'omniauth-shibboleth'
|
|||
gem 'omniauth-kerberos', group: :kerberos
|
||||
gem 'omniauth-gitlab'
|
||||
gem 'omniauth-bitbucket'
|
||||
gem 'omniauth-saml'
|
||||
gem 'omniauth-saml', '~> 1.4.0'
|
||||
gem 'doorkeeper', '2.1.3'
|
||||
gem "rack-oauth2", "~> 1.0.5"
|
||||
|
||||
|
@ -150,7 +150,7 @@ gem 'tinder', '~> 1.9.2'
|
|||
gem 'hipchat', '~> 1.5.0'
|
||||
|
||||
# Flowdock integration
|
||||
gem "gitlab-flowdock-git-hook", "~> 0.4.2"
|
||||
gem "gitlab-flowdock-git-hook", "~> 1.0.1"
|
||||
|
||||
# Gemnasium integration
|
||||
gem "gemnasium-gitlab-service", "~> 0.2"
|
||||
|
|
20
Gemfile.lock
20
Gemfile.lock
|
@ -183,6 +183,9 @@ GEM
|
|||
ffi (1.9.8)
|
||||
fission (0.5.0)
|
||||
CFPropertyList (~> 2.2)
|
||||
flowdock (0.7.0)
|
||||
httparty (~> 0.7)
|
||||
multi_json
|
||||
fog (1.25.0)
|
||||
fog-brightbox (~> 0.4)
|
||||
fog-core (~> 1.25)
|
||||
|
@ -255,7 +258,8 @@ GEM
|
|||
racc
|
||||
github-markup (1.3.1)
|
||||
posix-spawn (~> 0.3.8)
|
||||
gitlab-flowdock-git-hook (0.4.2.2)
|
||||
gitlab-flowdock-git-hook (1.0.1)
|
||||
flowdock (~> 0.7)
|
||||
gitlab-grit (>= 2.4.1)
|
||||
multi_json
|
||||
gitlab-grack (2.0.2)
|
||||
|
@ -422,9 +426,9 @@ GEM
|
|||
omniauth-oauth2 (1.1.1)
|
||||
oauth2 (~> 0.8.0)
|
||||
omniauth (~> 1.0)
|
||||
omniauth-saml (1.3.1)
|
||||
omniauth-saml (1.4.1)
|
||||
omniauth (~> 1.1)
|
||||
ruby-saml (~> 0.8.1)
|
||||
ruby-saml (~> 1.0.0)
|
||||
omniauth-shibboleth (1.1.1)
|
||||
omniauth (>= 1.0.0)
|
||||
omniauth-twitter (1.0.1)
|
||||
|
@ -568,8 +572,8 @@ GEM
|
|||
rainbow (>= 1.99.1, < 3.0)
|
||||
ruby-progressbar (~> 1.4)
|
||||
ruby-progressbar (1.7.1)
|
||||
ruby-saml (0.8.2)
|
||||
nokogiri (>= 1.5.0)
|
||||
ruby-saml (1.0.0)
|
||||
nokogiri (>= 1.5.10)
|
||||
uuid (~> 2.3)
|
||||
ruby2ruby (2.1.3)
|
||||
ruby_parser (~> 3.1)
|
||||
|
@ -709,7 +713,7 @@ GEM
|
|||
raindrops (~> 0.7)
|
||||
unicorn-worker-killer (0.4.2)
|
||||
unicorn (~> 4)
|
||||
uuid (2.3.7)
|
||||
uuid (2.3.8)
|
||||
macaddr (~> 1.0)
|
||||
version_sorter (2.0.0)
|
||||
virtus (1.0.1)
|
||||
|
@ -779,7 +783,7 @@ DEPENDENCIES
|
|||
fuubar (~> 2.0.0)
|
||||
gemnasium-gitlab-service (~> 0.2)
|
||||
github-markup
|
||||
gitlab-flowdock-git-hook (~> 0.4.2)
|
||||
gitlab-flowdock-git-hook (~> 1.0.1)
|
||||
gitlab-grack (~> 2.0.2)
|
||||
gitlab-linguist (~> 3.0.1)
|
||||
gitlab_emoji (~> 0.1)
|
||||
|
@ -813,7 +817,7 @@ DEPENDENCIES
|
|||
omniauth-gitlab
|
||||
omniauth-google-oauth2
|
||||
omniauth-kerberos
|
||||
omniauth-saml
|
||||
omniauth-saml (~> 1.4.0)
|
||||
omniauth-shibboleth
|
||||
omniauth-twitter
|
||||
org-ruby (= 0.9.12)
|
||||
|
|
|
@ -24,8 +24,3 @@ class @Project
|
|||
$.cookie('hide_no_password_message', 'false', { path: path })
|
||||
$(@).parents('.no-password-message').remove()
|
||||
e.preventDefault()
|
||||
|
||||
$('.js-toggle-clone-holder').on 'click', (e) ->
|
||||
cloneHolder.toggle()
|
||||
|
||||
cloneHolder.hide() unless $('.empty-project').length
|
||||
|
|
|
@ -13,6 +13,7 @@ $code_line_height: 1.5;
|
|||
$border-color: #E5E5E5;
|
||||
$background-color: #f5f5f5;
|
||||
$header-height: 50px;
|
||||
$readable-width: 1100px;
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -45,3 +45,9 @@
|
|||
|
||||
.btn { font-size: 13px; }
|
||||
}
|
||||
|
||||
.issuable-details {
|
||||
.description {
|
||||
max-width: $readable-width;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,14 +4,25 @@
|
|||
position: relative;
|
||||
|
||||
.issue-title {
|
||||
margin-bottom: 5px;
|
||||
font-size: $list-font-size;
|
||||
margin-bottom: 5px;
|
||||
font-weight: bold;
|
||||
float: left;
|
||||
width: 97.7%;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1100px) {
|
||||
.issues-list .issue .issue-title {
|
||||
width: 97%;
|
||||
}
|
||||
}
|
||||
|
||||
.issue-info {
|
||||
color: #999;
|
||||
font-size: 13px;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
padding: 0 0 0 20px;
|
||||
}
|
||||
|
||||
.issue-check {
|
||||
|
|
|
@ -116,6 +116,9 @@
|
|||
}
|
||||
|
||||
.readme-holder {
|
||||
margin: 0 auto;
|
||||
max-width: $readable-width;
|
||||
|
||||
.readme-file-title {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
|
|
|
@ -131,7 +131,7 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def module_enabled
|
||||
return render_404 unless @project.issues_enabled
|
||||
return render_404 unless @project.issues_enabled && @project.default_issues_tracker?
|
||||
end
|
||||
|
||||
# Since iids are implemented only in 6.1
|
||||
|
|
|
@ -39,10 +39,13 @@ class Projects::ServicesController < Projects::ApplicationController
|
|||
|
||||
def test
|
||||
data = Gitlab::PushDataBuilder.build_sample(project, current_user)
|
||||
if @service.execute(data)
|
||||
outcome = @service.test(data)
|
||||
if outcome[:success]
|
||||
message = { notice: 'We sent a request to the provided URL' }
|
||||
else
|
||||
message = { alert: 'We tried to send a request to the provided URL but an error occured' }
|
||||
error_message = "We tried to send a request to the provided URL but an error occurred"
|
||||
error_message << ": #{outcome[:result]}" if outcome[:result].present?
|
||||
message = { alert: error_message }
|
||||
end
|
||||
|
||||
redirect_to :back, message
|
||||
|
|
|
@ -2,27 +2,10 @@ class SessionsController < Devise::SessionsController
|
|||
include AuthenticatesWithTwoFactor
|
||||
|
||||
prepend_before_action :authenticate_with_two_factor, only: [:create]
|
||||
prepend_before_action :store_redirect_path, only: [:new]
|
||||
before_action :auto_sign_in_with_provider, only: [:new]
|
||||
|
||||
def new
|
||||
redirect_path =
|
||||
if request.referer.present? && (params['redirect_to_referer'] == 'yes')
|
||||
referer_uri = URI(request.referer)
|
||||
if referer_uri.host == Gitlab.config.gitlab.host
|
||||
referer_uri.path
|
||||
else
|
||||
request.fullpath
|
||||
end
|
||||
else
|
||||
request.fullpath
|
||||
end
|
||||
|
||||
# Prevent a 'you are already signed in' message directly after signing:
|
||||
# we should never redirect to '/users/sign_in' after signing in successfully.
|
||||
unless redirect_path == new_user_session_path
|
||||
store_location_for(:redirect, redirect_path)
|
||||
end
|
||||
|
||||
if Gitlab.config.ldap.enabled
|
||||
@ldap_servers = Gitlab::LDAP::Config.servers
|
||||
end
|
||||
|
@ -55,6 +38,26 @@ class SessionsController < Devise::SessionsController
|
|||
User.find(session[:otp_user_id])
|
||||
end
|
||||
end
|
||||
|
||||
def store_redirect_path
|
||||
redirect_path =
|
||||
if request.referer.present? && (params['redirect_to_referer'] == 'yes')
|
||||
referer_uri = URI(request.referer)
|
||||
if referer_uri.host == Gitlab.config.gitlab.host
|
||||
referer_uri.path
|
||||
else
|
||||
request.fullpath
|
||||
end
|
||||
else
|
||||
request.fullpath
|
||||
end
|
||||
|
||||
# Prevent a 'you are already signed in' message directly after signing:
|
||||
# we should never redirect to '/users/sign_in' after signing in successfully.
|
||||
unless redirect_path == new_user_session_path
|
||||
store_location_for(:redirect, redirect_path)
|
||||
end
|
||||
end
|
||||
|
||||
def authenticate_with_two_factor
|
||||
user = self.resource = find_user
|
||||
|
|
|
@ -360,6 +360,10 @@ class Note < ActiveRecord::Base
|
|||
create_new_cross_references!(project, author)
|
||||
end
|
||||
|
||||
def system?
|
||||
read_attribute(:system)
|
||||
end
|
||||
|
||||
def editable?
|
||||
!read_attribute(:system)
|
||||
end
|
||||
|
|
|
@ -38,7 +38,7 @@ class FlowdockService < Service
|
|||
|
||||
def fields
|
||||
[
|
||||
{ type: 'text', name: 'token', placeholder: '' }
|
||||
{ type: 'text', name: 'token', placeholder: 'Flowdock Git source token' }
|
||||
]
|
||||
end
|
||||
|
||||
|
|
|
@ -60,6 +60,16 @@ class HipchatService < Service
|
|||
gate[room].send('GitLab', message, message_options)
|
||||
end
|
||||
|
||||
def test(data)
|
||||
begin
|
||||
result = execute(data)
|
||||
rescue StandardError => error
|
||||
return { success: false, result: error }
|
||||
end
|
||||
|
||||
{ success: true, result: result }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def gate
|
||||
|
|
|
@ -452,6 +452,17 @@ class Repository
|
|||
end
|
||||
end
|
||||
|
||||
def merged_to_root_ref?(branch_name)
|
||||
branch_commit = commit(branch_name)
|
||||
root_ref_commit = commit(root_ref)
|
||||
|
||||
if branch_commit
|
||||
rugged.merge_base(root_ref_commit.id, branch_commit.id) == branch_commit.id
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def search_files(query, ref)
|
||||
offset = 2
|
||||
args = %W(git grep -i -n --before-context #{offset} --after-context #{offset} #{query} #{ref || root_ref})
|
||||
|
|
|
@ -87,10 +87,16 @@ class Service < ActiveRecord::Base
|
|||
%w(push tag_push issue merge_request)
|
||||
end
|
||||
|
||||
def execute
|
||||
def execute(data)
|
||||
# implement inside child
|
||||
end
|
||||
|
||||
def test(data)
|
||||
# default implementation
|
||||
result = execute(data)
|
||||
{ success: result.present?, result: result }
|
||||
end
|
||||
|
||||
def can_test?
|
||||
!project.empty_repo?
|
||||
end
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
= form_tag admin_users_path, method: :get, class: 'form-inline' do
|
||||
.form-group
|
||||
= search_field_tag :name, params[:name], placeholder: 'Name, email or username', class: 'form-control'
|
||||
= hidden_field_tag "filter", params[:filter]
|
||||
= button_tag class: 'btn btn-primary' do
|
||||
%i.fa.fa-search
|
||||
%hr
|
||||
|
|
|
@ -20,11 +20,6 @@
|
|||
Forked from
|
||||
= forked_from_project.namespace.try(:name)
|
||||
|
||||
- if can? current_user, :download_code, @project
|
||||
= link_to "#", class: 'btn js-toggle-clone-holder' do
|
||||
= icon('cloud-download fw')
|
||||
Clone
|
||||
|
||||
- if can? current_user, :download_code, @project
|
||||
= link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: @ref, format: 'zip'), class: 'btn', rel: 'nofollow' do
|
||||
= icon('download fw')
|
||||
|
|
|
@ -5,6 +5,11 @@
|
|||
%strong.str-truncated= branch.name
|
||||
- if branch.name == @repository.root_ref
|
||||
%span.label.label-info default
|
||||
- elsif @repository.merged_to_root_ref? branch.name
|
||||
%span.label.label-primary.has_tooltip(title="Merged into #{@repository.root_ref}")
|
||||
%i.fa.fa-check
|
||||
merged
|
||||
|
||||
- if @project.protected_branch? branch.name
|
||||
%span.label.label-success
|
||||
%i.fa.fa-lock
|
||||
|
|
|
@ -22,19 +22,19 @@
|
|||
%li= link_to "Email Patches", merge_request_path(@merge_request, format: :patch)
|
||||
%li= link_to "Plain Diff", merge_request_path(@merge_request, format: :diff)
|
||||
.light
|
||||
%div
|
||||
%span Request to merge
|
||||
%span.label-branch #{source_branch_with_namespace(@merge_request)}
|
||||
%span into
|
||||
%span.label-branch #{@merge_request.target_branch}
|
||||
- if @merge_request.open? && !@merge_request.branch_missing?
|
||||
%div
|
||||
If you want to try or merge this request manually, you can use the
|
||||
= link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal"
|
||||
%span Request to merge
|
||||
%span.label-branch #{source_branch_with_namespace(@merge_request)}
|
||||
%span into
|
||||
%span.label-branch #{@merge_request.target_branch}
|
||||
|
||||
= render "projects/merge_requests/show/how_to_merge"
|
||||
= render "projects/merge_requests/widget/show.html.haml"
|
||||
|
||||
- if @merge_request.open? && @merge_request.can_be_merged?
|
||||
.light
|
||||
You can also accept this merge request manually using the
|
||||
= link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal"
|
||||
|
||||
- if @commits.present?
|
||||
%ul.nav.nav-tabs.merge-request-tabs
|
||||
%li.notes-tab
|
||||
|
|
|
@ -23,4 +23,3 @@
|
|||
btn = $('.accept_merge_request')
|
||||
btn.disable()
|
||||
btn.html("<i class='fa fa-spinner fa-spin'></i> Merge in progress")
|
||||
|
||||
|
|
|
@ -31,7 +31,10 @@ Parameters:
|
|||
"state": "active",
|
||||
"created_at": "2013-09-30T13:46:01Z"
|
||||
},
|
||||
"created_at": "2013-10-02T09:22:45Z"
|
||||
"created_at": "2013-10-02T09:22:45Z",
|
||||
"system": true,
|
||||
"upvote": false,
|
||||
"downvote": false
|
||||
},
|
||||
{
|
||||
"id": 305,
|
||||
|
@ -45,7 +48,10 @@ Parameters:
|
|||
"state": "active",
|
||||
"created_at": "2013-09-30T13:46:01Z"
|
||||
},
|
||||
"created_at": "2013-10-02T09:56:03Z"
|
||||
"created_at": "2013-10-02T09:56:03Z",
|
||||
"system": false,
|
||||
"upvote": false,
|
||||
"downvote": false
|
||||
}
|
||||
]
|
||||
```
|
||||
|
|
|
@ -20,4 +20,6 @@ Step-by-step guides on the basics of working with Git and GitLab.
|
|||
|
||||
* [Add a file](add-file.md)
|
||||
|
||||
* [Add an image](add-image.md)
|
||||
|
||||
* [Create a Merge Request](add-merge-request.md)
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
# How to add an image
|
||||
|
||||
The following are the steps to add images to your repository in
|
||||
GitLab:
|
||||
|
||||
Find the image that you’d like to add.
|
||||
|
||||
In your computer files, find the GitLab project to which you'd like to add the image
|
||||
(you'll find it as a regular file). Click on every file until you find exactly where you'd
|
||||
like to add the image. There, paste the image.
|
||||
|
||||
Go to your [shell](command-line-commands.md), and add the following commands:
|
||||
|
||||
Add this command for every directory that you'd like to open:
|
||||
```
|
||||
cd NAME-OF-FILE-YOU'D-LIKE-TO-OPEN
|
||||
```
|
||||
|
||||
Create a new branch:
|
||||
```
|
||||
git checkout -b NAME-OF-BRANCH
|
||||
```
|
||||
|
||||
Check if your image was correctly added to the directory:
|
||||
```
|
||||
ls
|
||||
```
|
||||
|
||||
You should see the name of the image in the list shown.
|
||||
|
||||
Move up the hierarchy through directories:
|
||||
```
|
||||
cd ../
|
||||
```
|
||||
|
||||
Check the status and you should see your image’s name in red:
|
||||
```
|
||||
git status
|
||||
```
|
||||
|
||||
Add your changes:
|
||||
```
|
||||
git add NAME-OF-YOUR-IMAGE
|
||||
```
|
||||
|
||||
Check the status and you should see your image’s name in green:
|
||||
```
|
||||
git status
|
||||
```
|
||||
|
||||
Add the commit:
|
||||
```
|
||||
git commit -m “DESCRIBE COMMIT IN A FEW WORDS”
|
||||
```
|
||||
|
||||
Now you can push (send) your changes (in the branch NAME-OF-BRANCH) to GitLab (the git remote named 'origin'):
|
||||
```
|
||||
git push origin NAME-OF-BRANCH
|
||||
```
|
||||
|
||||
Your image will be added to your branch in your repository in GitLab. Create a [Merge Request](add-merge-request.md)
|
||||
to integrate your changes to your project.
|
|
@ -205,6 +205,9 @@ module API
|
|||
expose :attachment_identifier, as: :attachment
|
||||
expose :author, using: Entities::UserBasic
|
||||
expose :created_at
|
||||
expose :system?, as: :system
|
||||
expose :upvote?, as: :upvote
|
||||
expose :downvote?, as: :downvote
|
||||
end
|
||||
|
||||
class MRNote < Grape::Entity
|
||||
|
|
|
@ -18,6 +18,8 @@ module Backup
|
|||
success = case config["adapter"]
|
||||
when /^mysql/ then
|
||||
$progress.print "Dumping MySQL database #{config['database']} ... "
|
||||
# Workaround warnings from MySQL 5.6 about passwords on cmd line
|
||||
ENV['MYSQL_PWD'] = config["password"].to_s if config["password"]
|
||||
system('mysqldump', *mysql_args, config['database'], out: db_file_name)
|
||||
when "postgresql" then
|
||||
$progress.print "Dumping PostgreSQL database #{config['database']} ... "
|
||||
|
@ -43,6 +45,8 @@ module Backup
|
|||
success = case config["adapter"]
|
||||
when /^mysql/ then
|
||||
$progress.print "Restoring MySQL database #{config['database']} ... "
|
||||
# Workaround warnings from MySQL 5.6 about passwords on cmd line
|
||||
ENV['MYSQL_PWD'] = config["password"].to_s if config["password"]
|
||||
system('mysql', *mysql_args, config['database'], in: db_file_name)
|
||||
when "postgresql" then
|
||||
$progress.print "Restoring PostgreSQL database #{config['database']} ... "
|
||||
|
@ -69,8 +73,7 @@ module Backup
|
|||
'port' => '--port',
|
||||
'socket' => '--socket',
|
||||
'username' => '--user',
|
||||
'encoding' => '--default-character-set',
|
||||
'password' => '--password'
|
||||
'encoding' => '--default-character-set'
|
||||
}
|
||||
args.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact
|
||||
end
|
||||
|
|
|
@ -21,7 +21,7 @@ module Gitlab
|
|||
#
|
||||
# Returns boolean
|
||||
def gitlab_markdown?(filename)
|
||||
filename.downcase.end_with?(*%w(.mdown .md .markdown))
|
||||
filename.downcase.end_with?(*%w(.mdown .mkd .mkdn .md .markdown))
|
||||
end
|
||||
|
||||
# Public: Determines if the given filename has AsciiDoc extension.
|
||||
|
|
|
@ -693,7 +693,7 @@ namespace :gitlab do
|
|||
end
|
||||
|
||||
def check_ruby_version
|
||||
required_version = Gitlab::VersionInfo.new(2, 0, 0)
|
||||
required_version = Gitlab::VersionInfo.new(2, 1, 0)
|
||||
current_version = Gitlab::VersionInfo.parse(run(%W(ruby --version)))
|
||||
|
||||
print "Ruby version >= #{required_version} ? ... "
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
require('spec_helper')
|
||||
|
||||
describe Projects::IssuesController do
|
||||
let(:project) { create(:project) }
|
||||
let(:user) { create(:user) }
|
||||
let(:issue) { create(:issue, project: project) }
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
project.team << [user, :developer]
|
||||
controller.instance_variable_set(:@project, project)
|
||||
end
|
||||
|
||||
describe "GET #index" do
|
||||
it "returns index" do
|
||||
get :index, namespace_id: project.namespace.id, project_id: project.id
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
|
||||
it "returns 404 when issues are disabled" do
|
||||
project.issues_enabled = false
|
||||
project.save
|
||||
|
||||
get :index, namespace_id: project.namespace.id, project_id: project.id
|
||||
expect(response.status).to eq(404)
|
||||
end
|
||||
|
||||
it "returns 404 when external issue tracker is enabled" do
|
||||
allow(project).to receive(:default_issues_tracker?).and_return(false)
|
||||
|
||||
get :index, namespace_id: project.namespace.id, project_id: project.id
|
||||
expect(response.status).to eq(404)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
|
@ -0,0 +1,35 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Projects::ServicesController do
|
||||
let(:project) { create(:project) }
|
||||
let(:user) { create(:user) }
|
||||
let(:service) { create(:service, project: project) }
|
||||
|
||||
before do
|
||||
sign_in(user)
|
||||
project.team << [user, :master]
|
||||
controller.instance_variable_set(:@project, project)
|
||||
controller.instance_variable_set(:@service, service)
|
||||
request.env["HTTP_REFERER"] = "/"
|
||||
end
|
||||
|
||||
describe "#test" do
|
||||
context 'success' do
|
||||
it "should redirect and show success message" do
|
||||
expect(service).to receive(:test).and_return({ success: true, result: 'done' })
|
||||
get :test, namespace_id: project.namespace.id, project_id: project.id, id: service.id, format: :html
|
||||
expect(response.status).to redirect_to('/')
|
||||
expect(flash[:notice]).to eq('We sent a request to the provided URL')
|
||||
end
|
||||
end
|
||||
|
||||
context 'failure' do
|
||||
it "should redirect and show failure message" do
|
||||
expect(service).to receive(:test).and_return({ success: false, result: 'Bad test' })
|
||||
get :test, namespace_id: project.namespace.id, project_id: project.id, id: service.id, format: :html
|
||||
expect(response.status).to redirect_to('/')
|
||||
expect(flash[:alert]).to eq('We tried to send a request to the provided URL but an error occurred: Bad test')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -15,7 +15,7 @@ describe Gitlab::MarkupHelper do
|
|||
end
|
||||
|
||||
describe '#gitlab_markdown?' do
|
||||
%w(mdown md markdown).each do |type|
|
||||
%w(mdown mkd mkdn md markdown).each do |type|
|
||||
it "returns true for #{type} files" do
|
||||
expect(Gitlab::MarkupHelper.gitlab_markdown?("README.#{type}")).to be_truthy
|
||||
end
|
||||
|
|
|
@ -39,15 +39,19 @@ describe FlowdockService do
|
|||
token: 'verySecret'
|
||||
)
|
||||
@sample_data = Gitlab::PushDataBuilder.build_sample(project, user)
|
||||
@api_url = 'https://api.flowdock.com/v1/git/verySecret'
|
||||
@api_url = 'https://api.flowdock.com/v1/messages'
|
||||
WebMock.stub_request(:post, @api_url)
|
||||
end
|
||||
|
||||
it "should call FlowDock API" do
|
||||
@flowdock_service.execute(@sample_data)
|
||||
expect(WebMock).to have_requested(:post, @api_url).with(
|
||||
body: /#{@sample_data[:before]}.*#{@sample_data[:after]}.*#{project.path}/
|
||||
).once
|
||||
@sample_data[:commits].each do |commit|
|
||||
# One request to Flowdock per new commit
|
||||
next if commit[:id] == @sample_data[:before]
|
||||
expect(WebMock).to have_requested(:post, @api_url).with(
|
||||
body: /#{commit[:id]}.*#{project.path}/
|
||||
).once
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -47,6 +47,14 @@ describe HipchatService do
|
|||
WebMock.stub_request(:post, api_url)
|
||||
end
|
||||
|
||||
it 'should test and return errors' do
|
||||
allow(hipchat).to receive(:execute).and_raise(StandardError, 'no such room')
|
||||
result = hipchat.test(push_sample_data)
|
||||
|
||||
expect(result[:success]).to be_falsey
|
||||
expect(result[:result].to_s).to eq('no such room')
|
||||
end
|
||||
|
||||
it 'should use v1 if version is provided' do
|
||||
allow(hipchat).to receive(:api_version).and_return('v1')
|
||||
expect(HipChat::Client).to receive(:new).
|
||||
|
|
|
@ -34,6 +34,14 @@ describe Repository do
|
|||
end
|
||||
end
|
||||
|
||||
describe :merged_to_root_ref? do
|
||||
context 'merged branch' do
|
||||
subject { repository.merged_to_root_ref?('improve/awesome') }
|
||||
|
||||
it { is_expected.to be_truthy }
|
||||
end
|
||||
end
|
||||
|
||||
describe :can_be_merged? do
|
||||
context 'mergeable branches' do
|
||||
subject { repository.can_be_merged?('0b4bc9a49b562e85de7cc9e834518ea6828729b9', 'master') }
|
||||
|
@ -46,6 +54,18 @@ describe Repository do
|
|||
|
||||
it { is_expected.to be_falsey }
|
||||
end
|
||||
|
||||
context 'non merged branch' do
|
||||
subject { repository.merged_to_root_ref?('fix') }
|
||||
|
||||
it { is_expected.to be_falsey }
|
||||
end
|
||||
|
||||
context 'non existent branch' do
|
||||
subject { repository.merged_to_root_ref?('non_existent_branch') }
|
||||
|
||||
it { is_expected.to be_nil }
|
||||
end
|
||||
end
|
||||
|
||||
describe "search_files" do
|
||||
|
|
|
@ -46,6 +46,16 @@ describe Service do
|
|||
describe :can_test do
|
||||
it { expect(@testable).to eq(true) }
|
||||
end
|
||||
|
||||
describe :test do
|
||||
let(:data) { 'test' }
|
||||
|
||||
it 'test runs execute' do
|
||||
expect(@service).to receive(:execute).with(data)
|
||||
|
||||
@service.test(data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "With commits" do
|
||||
|
|
Loading…
Reference in New Issue