summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG5
-rw-r--r--GITLAB_SHELL_VERSION2
-rw-r--r--PROCESS.md2
-rw-r--r--VERSION2
-rw-r--r--app/controllers/dashboard_controller.rb24
-rw-r--r--app/controllers/explore/projects_controller.rb2
-rw-r--r--app/controllers/files_controller.rb5
-rw-r--r--app/controllers/groups_controller.rb26
-rw-r--r--app/controllers/projects_controller.rb13
-rw-r--r--app/controllers/users_controller.rb24
-rw-r--r--app/finders/trending_projects_finder.rb2
-rw-r--r--app/helpers/application_helper.rb8
-rw-r--r--app/helpers/blob_helper.rb2
-rw-r--r--app/helpers/gitlab_markdown_helper.rb9
-rw-r--r--app/models/event.rb1
-rw-r--r--app/models/group.rb2
-rw-r--r--app/models/project.rb2
-rw-r--r--app/models/user.rb15
-rw-r--r--app/uploaders/attachment_uploader.rb8
-rw-r--r--app/uploaders/avatar_uploader.rb32
-rw-r--r--app/views/dashboard/_activities.html.haml7
-rw-r--r--app/views/dashboard/_project.html.haml2
-rw-r--r--app/views/groups/_projects.html.haml2
-rw-r--r--app/views/groups/show.html.haml5
-rw-r--r--app/views/projects/_home_panel.html.haml2
-rw-r--r--app/views/projects/merge_requests/_merge_request.html.haml2
-rw-r--r--app/views/users/calendar.html.haml2
-rw-r--r--db/migrate/20150213111727_move_note_folder.rb19
-rw-r--r--doc/README.md1
-rw-r--r--doc/api/README.md3
-rw-r--r--doc/api/branches.md131
-rw-r--r--doc/api/oauth2.md11
-rw-r--r--doc/integration/README.md3
-rw-r--r--doc/integration/external-issue-tracker.md3
-rw-r--r--doc/integration/github.md2
-rw-r--r--doc/integration/gitlab.md27
-rw-r--r--doc/integration/gitlab_app.pngbin0 -> 55325 bytes
-rw-r--r--doc/integration/oauth_provider.md6
-rw-r--r--doc/integration/omniauth.md2
-rw-r--r--features/steps/groups.rb2
-rw-r--r--features/steps/profile/profile.rb2
-rw-r--r--features/steps/project/project.rb2
-rw-r--r--lib/api/helpers.rb4
-rw-r--r--lib/api/internal.rb2
-rw-r--r--lib/backup/manager.rb2
-rw-r--r--lib/backup/uploads.rb40
-rw-r--r--lib/gitlab/current_settings.rb14
-rw-r--r--lib/gitlab/git_access.rb2
-rw-r--r--spec/helpers/gitlab_markdown_helper_spec.rb14
-rw-r--r--spec/requests/api/internal_spec.rb3
-rw-r--r--uploads/.gitkeep0
51 files changed, 242 insertions, 261 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 107bda8ebcb..35387538d39 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,7 @@
-v 7.8.0 (unreleased)
+v 7.9.0 (unreleased)
- Fix broken access control for note attachments (Hannes Rosenögger)
+
+v 7.8.0 (unreleased)
- Replace highlight.js with rouge-fork rugments (Stefan Tatschner)
- Make project search case insensitive (Hannes Rosenögger)
- Include issue/mr participants in list of recipients for reassign/close/reopen emails
@@ -60,6 +62,7 @@ v 7.8.0 (unreleased)
- Make sure Markdown previews always use the same styling as the eventual destination.
- Remove deprecated Group#owner_id from API
- Show projects user contributed to on user page. Show stars near project on user page.
+ - Improve database performance for GitLab
v 7.7.2
- Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch
diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION
index 437459cd94c..73462a5a134 100644
--- a/GITLAB_SHELL_VERSION
+++ b/GITLAB_SHELL_VERSION
@@ -1 +1 @@
-2.5.0
+2.5.1
diff --git a/PROCESS.md b/PROCESS.md
index 5cc25de05a4..1b6b3e7d32d 100644
--- a/PROCESS.md
+++ b/PROCESS.md
@@ -71,7 +71,7 @@ Thanks for the issue report. Please reformat your issue to conform to the issue
### Feature requests
-Thank you for your interest in improving GitLab. We don't use the issue tracker for feature requests. Things that are wrong but are not a regression compared to older versions of GitLab are considered feature requests and not issues. Please use the [feature request forum](http://feedback.gitlab.com/) for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
+Thank you for your interest in improving GitLab. We don't use the issue tracker for feature requests. Things that are wrong but are not a regression compared to older versions of GitLab are considered feature requests and not issues. Please use the \[feature request forum\]\(http://feedback.gitlab.com/) for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
### Issue report for old version
diff --git a/VERSION b/VERSION
index ccc446c2f8c..e5d25bf79a9 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-7.8.0.pre
+7.9.0.pre
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index 9e59264e418..eca7b39bcdf 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -12,11 +12,7 @@ class DashboardController < ApplicationController
@groups = current_user.authorized_groups.order_name_asc
@has_authorized_projects = @projects.count > 0
@projects_count = @projects.count
- @projects = @projects.limit(@projects_limit)
-
- @events = Event.in_projects(current_user.authorized_projects.pluck(:id))
- @events = @event_filter.apply_filter(@events)
- @events = @events.limit(20).offset(params[:offset] || 0)
+ @projects = @projects.includes(:namespace).limit(@projects_limit)
@last_push = current_user.recent_push
@@ -24,8 +20,16 @@ class DashboardController < ApplicationController
respond_to do |format|
format.html
- format.json { pager_json("events/_events", @events.count) }
- format.atom { render layout: false }
+
+ format.json do
+ load_events
+ pager_json("events/_events", @events.count)
+ end
+
+ format.atom do
+ load_events
+ render layout: false
+ end
end
end
@@ -74,4 +78,10 @@ class DashboardController < ApplicationController
def load_projects
@projects = current_user.authorized_projects.sorted_by_activity.non_archived
end
+
+ def load_events
+ @events = Event.in_projects(current_user.authorized_projects.pluck(:id))
+ @events = @event_filter.apply_filter(@events).with_associations
+ @events = @events.limit(20).offset(params[:offset] || 0)
+ end
end
diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb
index d75fd8e72fa..0e5891ae807 100644
--- a/app/controllers/explore/projects_controller.rb
+++ b/app/controllers/explore/projects_controller.rb
@@ -18,7 +18,7 @@ class Explore::ProjectsController < ApplicationController
def starred
@starred_projects = ProjectsFinder.new.execute(current_user)
- @starred_projects = @starred_projects.order('star_count DESC')
+ @starred_projects = @starred_projects.reorder('star_count DESC')
@starred_projects = @starred_projects.page(params[:page]).per(10)
end
end
diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb
index 15523cbc2e7..9671245d3f4 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -5,11 +5,8 @@ class FilesController < ApplicationController
if uploader.file_storage?
if can?(current_user, :read_project, note.project)
- # Replace old notes location in /public with the new one in / and send the file
- path = uploader.file.path.gsub("#{Rails.root}/public", Rails.root.to_s)
-
disposition = uploader.image? ? 'inline' : 'attachment'
- send_file path, disposition: disposition
+ send_file uploader.file.path, disposition: disposition
else
not_found!
end
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index aad3709090e..d011523c94f 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -10,11 +10,11 @@ class GroupsController < ApplicationController
# Load group projects
before_filter :load_projects, except: [:new, :create, :projects, :edit, :update]
+ before_filter :event_filter, only: :show
+ before_filter :set_title, only: [:new, :create]
layout :determine_layout
- before_filter :set_title, only: [:new, :create]
-
def new
@group = Group.new
end
@@ -32,15 +32,21 @@ class GroupsController < ApplicationController
end
def show
- @events = Event.in_projects(project_ids)
- @events = event_filter.apply_filter(@events)
- @events = @events.limit(20).offset(params[:offset] || 0)
@last_push = current_user.recent_push if current_user
+ @projects = @projects.includes(:namespace)
respond_to do |format|
format.html
- format.json { pager_json("events/_events", @events.count) }
- format.atom { render layout: false }
+
+ format.json do
+ load_events
+ pager_json("events/_events", @events.count)
+ end
+
+ format.atom do
+ load_events
+ render layout: false
+ end
end
end
@@ -149,4 +155,10 @@ class GroupsController < ApplicationController
def group_params
params.require(:group).permit(:name, :description, :path, :avatar)
end
+
+ def load_events
+ @events = Event.in_projects(project_ids)
+ @events = event_filter.apply_filter(@events).with_associations
+ @events = @events.limit(20).offset(params[:offset] || 0)
+ end
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 462ab3d4749..b0fde88babc 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -5,9 +5,10 @@ class ProjectsController < ApplicationController
# Authorize
before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive]
+ before_filter :set_title, only: [:new, :create]
+ before_filter :event_filter, only: :show
layout 'navless', only: [:new, :create, :fork]
- before_filter :set_title, only: [:new, :create]
def new
@project = Project.new
@@ -56,9 +57,6 @@ class ProjectsController < ApplicationController
end
limit = (params[:limit] || 20).to_i
- @events = @project.events.recent
- @events = event_filter.apply_filter(@events)
- @events = @events.limit(limit).offset(params[:offset] || 0)
@show_star = !(current_user && current_user.starred?(@project))
@@ -76,7 +74,12 @@ class ProjectsController < ApplicationController
end
end
- format.json { pager_json('events/_events', @events.count) }
+ format.json do
+ @events = @project.events.recent
+ @events = event_filter.apply_filter(@events).with_associations
+ @events = @events.limit(limit).offset(params[:offset] || 0)
+ pager_json('events/_events', @events.count)
+ end
end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index e4f588c6a60..4c2fe4c3c8d 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -4,22 +4,20 @@ class UsersController < ApplicationController
layout :determine_layout
def show
- # Projects user can view
- visible_projects = ProjectsFinder.new.execute(current_user)
- authorized_projects_ids = visible_projects.pluck(:id)
-
- @contributed_projects = Project.where(id: authorized_projects_ids).
- in_group_namespace
+ @contributed_projects = Project.
+ where(id: authorized_projects_ids & @user.contributed_projects_ids).
+ in_group_namespace.includes(:namespace)
@projects = @user.personal_projects.
- where(id: authorized_projects_ids)
+ where(id: authorized_projects_ids).includes(:namespace)
# Collect only groups common for both users
@groups = @user.groups & GroupsFinder.new.execute(current_user)
# Get user activity feed for projects common for both users
@events = @user.recent_events.
- where(project_id: authorized_projects_ids).limit(30)
+ where(project_id: authorized_projects_ids).
+ with_associations.limit(30)
@title = @user.name
@title_url = user_path(@user)
@@ -31,8 +29,8 @@ class UsersController < ApplicationController
end
def calendar
- visible_projects = ProjectsFinder.new.execute(current_user)
- calendar = Gitlab::CommitsCalendar.new(visible_projects, @user)
+ projects = Project.where(id: authorized_projects_ids & @user.contributed_projects_ids)
+ calendar = Gitlab::CommitsCalendar.new(projects, @user)
@timestamps = calendar.timestamps
@starting_year = calendar.starting_year
@starting_month = calendar.starting_month
@@ -57,4 +55,10 @@ class UsersController < ApplicationController
return authenticate_user!
end
end
+
+ def authorized_projects_ids
+ # Projects user can view
+ @authorized_projects_ids ||=
+ ProjectsFinder.new.execute(current_user).pluck(:id)
+ end
end
diff --git a/app/finders/trending_projects_finder.rb b/app/finders/trending_projects_finder.rb
index 32d7968924a..a79bd47d986 100644
--- a/app/finders/trending_projects_finder.rb
+++ b/app/finders/trending_projects_finder.rb
@@ -8,7 +8,7 @@ class TrendingProjectsFinder
# for period of time - ex. month
projects.joins(:notes).where('notes.created_at > ?', start_date).
select("projects.*, count(notes.id) as ncount").
- group("projects.id").order("ncount DESC")
+ group("projects.id").reorder("ncount DESC")
end
private
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index e45f4650309..f65c5335a62 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -51,7 +51,13 @@ module ApplicationHelper
end
def project_icon(project_id, options = {})
- project = Project.find_with_namespace(project_id)
+ project =
+ if project_id.is_a?(Project)
+ project = project_id
+ else
+ Project.find_with_namespace(project_id)
+ end
+
if project.avatar.present?
image_tag project.avatar.url, options
elsif project.avatar_in_git
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index e75eebd2da9..d754de0bd76 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -17,7 +17,7 @@ module BlobHelper
end
def no_highlight_files
- %w(credits changelog copying copyright license authors)
+ %w(credits changelog news copying copyright license authors)
end
def edit_blob_link(project, ref, path, options = {})
diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb
index 800cacdc2c2..ab30f498c01 100644
--- a/app/helpers/gitlab_markdown_helper.rb
+++ b/app/helpers/gitlab_markdown_helper.rb
@@ -110,7 +110,7 @@ module GitlabMarkdownHelper
end
def link_to_ignore?(link)
- if link =~ /\#\w+/
+ if link =~ /\A\#\w+/
# ignore anchors like <a href="#my-header">
true
else
@@ -122,10 +122,11 @@ module GitlabMarkdownHelper
["http://","https://", "ftp://", "mailto:"]
end
- def rebuild_path(path)
- path.gsub!(/(#.*)/, "")
+ def rebuild_path(file_path)
+ file_path = file_path.dup
+ file_path.gsub!(/(#.*)/, "")
id = $1 || ""
- file_path = relative_file_path(path)
+ file_path = relative_file_path(file_path)
file_path = sanitize_slashes(file_path)
[
diff --git a/app/models/event.rb b/app/models/event.rb
index cae7f0be85b..5579ab1dbb0 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -47,6 +47,7 @@ class Event < ActiveRecord::Base
scope :recent, -> { order("created_at DESC") }
scope :code_push, -> { where(action: PUSHED) }
scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
+ scope :with_associations, -> { includes(project: :namespace) }
class << self
def reset_event_cache_for(target)
diff --git a/app/models/group.rb b/app/models/group.rb
index da9621a2a1a..d6ec0be6081 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -23,7 +23,7 @@ class Group < Namespace
validate :avatar_type, if: ->(user) { user.avatar_changed? }
validates :avatar, file_size: { maximum: 200.kilobytes.to_i }
- mount_uploader :avatar, AvatarUploader
+ mount_uploader :avatar, AttachmentUploader
after_create :post_create_hook
after_destroy :post_destroy_hook
diff --git a/app/models/project.rb b/app/models/project.rb
index e2c7f76eb09..56e1aa29040 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -138,7 +138,7 @@ class Project < ActiveRecord::Base
if: ->(project) { project.avatar && project.avatar_changed? }
validates :avatar, file_size: { maximum: 200.kilobytes.to_i }
- mount_uploader :avatar, AvatarUploader
+ mount_uploader :avatar, AttachmentUploader
# Scopes
scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) }
diff --git a/app/models/user.rb b/app/models/user.rb
index 2ffcd1478d8..a9776b633a6 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -177,7 +177,7 @@ class User < ActiveRecord::Base
end
end
- mount_uploader :avatar, AvatarUploader
+ mount_uploader :avatar, AttachmentUploader
# Scopes
scope :admins, -> { where(admin: true) }
@@ -255,7 +255,7 @@ class User < ActiveRecord::Base
counter = 0
base = username
while User.by_login(username).present? || Namespace.by_path(username).present?
- counter += 1
+ counter += 1
username = "#{base}#{counter}"
end
@@ -459,7 +459,7 @@ class User < ActiveRecord::Base
def set_notification_email
if self.notification_email.blank? || !self.all_emails.include?(self.notification_email)
- self.notification_email = self.email
+ self.notification_email = self.email
end
end
@@ -607,4 +607,13 @@ class User < ActiveRecord::Base
def oauth_authorized_tokens
Doorkeeper::AccessToken.where(resource_owner_id: self.id, revoked_at: nil)
end
+
+ def contributed_projects_ids
+ Event.where(author_id: self).
+ where("created_at > ?", Time.now - 1.year).
+ code_push.
+ reorder(project_id: :desc).
+ select('DISTINCT(project_id)').
+ map(&:project_id)
+ end
end
diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb
index 22742d287a4..b122b6c8658 100644
--- a/app/uploaders/attachment_uploader.rb
+++ b/app/uploaders/attachment_uploader.rb
@@ -3,8 +3,10 @@
class AttachmentUploader < CarrierWave::Uploader::Base
storage :file
+ after :store, :reset_events_cache
+
def store_dir
- "#{Rails.root}/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def image?
@@ -27,4 +29,8 @@ class AttachmentUploader < CarrierWave::Uploader::Base
def file_storage?
self.class.storage == CarrierWave::Storage::File
end
+
+ def reset_events_cache(file)
+ model.reset_events_cache if model.is_a?(User)
+ end
end
diff --git a/app/uploaders/avatar_uploader.rb b/app/uploaders/avatar_uploader.rb
deleted file mode 100644
index 7cad044555b..00000000000
--- a/app/uploaders/avatar_uploader.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# encoding: utf-8
-
-class AvatarUploader < CarrierWave::Uploader::Base
- storage :file
-
- after :store, :reset_events_cache
-
- def store_dir
- "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
- end
-
- def image?
- img_ext = %w(png jpg jpeg gif bmp tiff)
- if file.respond_to?(:extension)
- img_ext.include?(file.extension.downcase)
- else
- # Not all CarrierWave storages respond to :extension
- ext = file.path.split('.').last.downcase
- img_ext.include?(ext)
- end
- rescue
- false
- end
-
- def file_storage?
- self.class.storage == CarrierWave::Storage::File
- end
-
- def reset_events_cache(file)
- model.reset_events_cache if model.is_a?(User)
- end
-end
diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml
index fdf96dd6f56..c1fc1602d0a 100644
--- a/app/views/dashboard/_activities.html.haml
+++ b/app/views/dashboard/_activities.html.haml
@@ -1,9 +1,4 @@
= render "events/event_last_push", event: @last_push
= render 'shared/event_filter'
-
-- if @events.any?
- .content_list
-- else
- .nothing-here-block Projects activity will be displayed here
-
+.content_list
= spinner
diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml
index f0fb2c1881b..fa9179cb249 100644
--- a/app/views/dashboard/_project.html.haml
+++ b/app/views/dashboard/_project.html.haml
@@ -1,6 +1,6 @@
= link_to project_path(project), class: dom_class(project) do
.dash-project-avatar
- = project_icon(project.to_param, alt: '', class: 'avatar project-avatar s40')
+ = project_icon(project, alt: '', class: 'avatar project-avatar s40')
.dash-project-access-icon
= visibility_level_icon(project.visibility_level)
%span.str-truncated
diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml
index a2f1d28a275..b505760fa8f 100644
--- a/app/views/groups/_projects.html.haml
+++ b/app/views/groups/_projects.html.haml
@@ -13,7 +13,7 @@
%li.project-row
= link_to project_path(project), class: dom_class(project) do
.dash-project-avatar
- = project_icon(project.to_param, alt: '', class: 'avatar s40')
+ = project_icon(project, alt: '', class: 'avatar s40')
.dash-project-access-icon
= visibility_level_icon(project.visibility_level)
%span.str-truncated
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index f2e591c1939..d5af859ee62 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -13,10 +13,7 @@
- if current_user
= render "events/event_last_push", event: @last_push
= render 'shared/event_filter'
- - if @events.any?
- .content_list
- - else
- .nothing-here-block Project activity will be displayed here
+ .content_list
= spinner
%aside.side.col-md-4
= render "projects", projects: @projects
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 5697f9ea1af..d8545dd2c85 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -1,7 +1,7 @@
- empty_repo = @project.empty_repo?
.project-home-panel{:class => ("empty-project" if empty_repo)}
.project-identicon-holder
- = project_icon(@project.to_param, alt: '', class: 'avatar project-avatar')
+ = project_icon(@project, alt: '', class: 'avatar project-avatar')
.project-home-row
.project-home-desc
- if @project.description.present?
diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml
index 5afc87fb6b1..1686ca0e876 100644
--- a/app/views/projects/merge_requests/_merge_request.html.haml
+++ b/app/views/projects/merge_requests/_merge_request.html.haml
@@ -18,7 +18,7 @@
- if merge_request.assignee
assigned to #{link_to_member(merge_request.source_project, merge_request.assignee)}
- else
- Work In Progress
+ Unassigned
- if merge_request.votes_count > 0
= render 'votes/votes_inline', votable: merge_request
- if merge_request.notes.any?
diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml
index 13bdc5ed1e7..1d1c974da24 100644
--- a/app/views/users/calendar.html.haml
+++ b/app/views/users/calendar.html.haml
@@ -1,4 +1,4 @@
-%h4 Calendar
+%h4 Commits calendar
#cal-heatmap.calendar
:javascript
new calendar(
diff --git a/db/migrate/20150213111727_move_note_folder.rb b/db/migrate/20150213111727_move_note_folder.rb
deleted file mode 100644
index ca7f87d984f..00000000000
--- a/db/migrate/20150213111727_move_note_folder.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-class MoveNoteFolder < ActiveRecord::Migration
- def up
- system(
- "if [ -d '#{Rails.root}/public/uploads/note' ];
- then mv #{Rails.root}/public/uploads/note #{Rails.root}/uploads/note;
- echo 'note folder has been moved successfully';
- else
- echo 'note folder has already been moved or does not exist yet. Nothing to do here.'; fi")
- end
-
- def down
- system(
- "if [ -d '#{Rails.root}/uploads/note' ];
- then mv #{Rails.root}/uploads/note #{Rails.root}/public/uploads/note;
- echo 'note folder has been moved successfully';
- else
- echo 'note folder has already been moved or does not exist yet. Nothing to do here.'; fi")
- end
-end
diff --git a/doc/README.md b/doc/README.md
index 932e90e359a..4e00dceac2b 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -10,6 +10,7 @@
- [SSH](ssh/README.md) Setup your ssh keys and deploy keys for secure access to your projects.
- [Web hooks](web_hooks/web_hooks.md) Let GitLab notify you when new code has been pushed to your project.
- [Workflow](workflow/README.md) Using GitLab functionality and importing projects from GitHub and SVN.
+- [GitLab as OAuth2 authentication service provider](integration/oauth_provider.md). It allows you to login to other applications from GitLab.
## Administrator documentation
diff --git a/doc/api/README.md b/doc/api/README.md
index 8cbba8598d5..dec530d0b81 100644
--- a/doc/api/README.md
+++ b/doc/api/README.md
@@ -22,6 +22,7 @@
## Clients
Find API Clients for GitLab [on our website](https://about.gitlab.com/applications/#api-clients).
+You can use [GitLab as an OAuth2 client](oauth2.md) to make API calls.
## Introduction
@@ -67,7 +68,7 @@ curl https://localhost:3000/api/v3/user?access_token=OAUTH-TOKEN
curl -H "Authorization: Bearer OAUTH-TOKEN" https://localhost:3000/api/v3/user
```
-Read more about [OAuth2 in GitLab](oauth2.md).
+Read more about [GitLab as an OAuth2 client](oauth2.md).
## Status codes
diff --git a/doc/api/branches.md b/doc/api/branches.md
index 319f0b47386..6a9c10c8520 100644
--- a/doc/api/branches.md
+++ b/doc/api/branches.md
@@ -15,27 +15,20 @@ Parameters:
```json
[
{
- "name": "master",
"commit": {
+ "author_email": "john@example.com",
+ "author_name": "John Smith",
+ "authored_date": "2012-06-27T05:51:39-07:00",
+ "committed_date": "2012-06-28T03:44:20-07:00",
+ "committer_email": "john@example.com",
+ "committer_name": "John Smith",
"id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
- "parents": [
- {
- "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
- }
- ],
- "tree": "46e82de44b1061621357f24c05515327f2795a95",
"message": "add projects API",
- "author": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "committer": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "authored_date": "2012-06-27T05:51:39-07:00",
- "committed_date": "2012-06-28T03:44:20-07:00"
+ "parent_ids": [
+ "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
+ ]
},
+ "name": "master",
"protected": true
}
]
@@ -56,27 +49,20 @@ Parameters:
```json
{
- "name": "master",
"commit": {
+ "author_email": "john@example.com",
+ "author_name": "John Smith",
+ "authored_date": "2012-06-27T05:51:39-07:00",
+ "committed_date": "2012-06-28T03:44:20-07:00",
+ "committer_email": "john@example.com",
+ "committer_name": "John Smith",
"id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
- "parents": [
- {
- "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
- }
- ],
- "tree": "46e82de44b1061621357f24c05515327f2795a95",
"message": "add projects API",
- "author": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "committer": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "authored_date": "2012-06-27T05:51:39-07:00",
- "committed_date": "2012-06-28T03:44:20-07:00"
+ "parent_ids": [
+ "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
+ ]
},
+ "name": "master",
"protected": true
}
```
@@ -97,27 +83,20 @@ Parameters:
```json
{
- "name": "master",
"commit": {
+ "author_email": "john@example.com",
+ "author_name": "John Smith",
+ "authored_date": "2012-06-27T05:51:39-07:00",
+ "committed_date": "2012-06-28T03:44:20-07:00",
+ "committer_email": "john@example.com",
+ "committer_name": "John Smith",
"id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
- "parents": [
- {
- "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
- }
- ],
- "tree": "46e82de44b1061621357f24c05515327f2795a95",
"message": "add projects API",
- "author": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "committer": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "authored_date": "2012-06-27T05:51:39-07:00",
- "committed_date": "2012-06-28T03:44:20-07:00"
+ "parent_ids": [
+ "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
+ ]
},
+ "name": "master",
"protected": true
}
```
@@ -138,27 +117,20 @@ Parameters:
```json
{
- "name": "master",
"commit": {
+ "author_email": "john@example.com",
+ "author_name": "John Smith",
+ "authored_date": "2012-06-27T05:51:39-07:00",
+ "committed_date": "2012-06-28T03:44:20-07:00",
+ "committer_email": "john@example.com",
+ "committer_name": "John Smith",
"id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
- "parents": [
- {
- "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
- }
- ],
- "tree": "46e82de44b1061621357f24c05515327f2795a95",
"message": "add projects API",
- "author": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "committer": {
- "name": "John Smith",
- "email": "john@example.com"
- },
- "authored_date": "2012-06-27T05:51:39-07:00",
- "committed_date": "2012-06-28T03:44:20-07:00"
+ "parent_ids": [
+ "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
+ ]
},
+ "name": "master",
"protected": false
}
```
@@ -177,21 +149,20 @@ Parameters:
```json
{
- "name": "my-new-branch",
"commit": {
- "id": "8848c0e90327a0b70f1865b843fb2fbfb9345e57",
- "message": "Merge pull request #54 from brightbox/use_fog_brightbox_module\n\nUpdate to use fog-brightbox module",
- "parent_ids": [
- "fff449e0bf453576f16c91d6544f00a2664009d8",
- "f93a93626fec20fd659f4ed3ab2e64019b6169ae"
- ],
- "authored_date": "2014-02-20T19:54:55+02:00",
- "author_name": "john smith",
"author_email": "john@example.com",
- "committed_date": "2014-02-20T19:54:55+02:00",
- "committer_name": "john smith",
- "committer_email": "john@example.com"
+ "author_name": "John Smith",
+ "authored_date": "2012-06-27T05:51:39-07:00",
+ "committed_date": "2012-06-28T03:44:20-07:00",
+ "committer_email": "john@example.com",
+ "committer_name": "John Smith",
+ "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
+ "message": "add projects API",
+ "parent_ids": [
+ "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
+ ]
},
+ "name": "master",
"protected": false
}
```
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index 7bb391054ce..d416a826f79 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -1,14 +1,17 @@
-# OAuth2 authentication
+# GitLab as an OAuth2 client
-OAuth2 is a protocol that enables us to get access to private details of user's account without getting its password.
+This document is about using other OAuth authentication service providers to sign into GitLab.
+If you want GitLab to be an OAuth authentication service provider to sign into other services please see the [Oauth2 provider documentation](../integration/oauth_provider.md).
-Before using the OAuth2 you should create an application in user's account. Each application getting unique App ID and App Secret parameters. You should not share them.
+OAuth2 is a protocol that enables us to authenticate a user without requiring them to give their password.
+
+Before using the OAuth2 you should create an application in user's account. Each application gets a unique App ID and App Secret parameters. You should not share these.
This functionality is based on [doorkeeper gem](https://github.com/doorkeeper-gem/doorkeeper)
## Web Application Flow
-This flow is using for authentication from third-party web sites and probably is most used.
+This flow is using for authentication from third-party web sites and is probably used the most.
It basically consists of an exchange of an authorization token for an access token. For more detailed info, check out the [RFC spec here](http://tools.ietf.org/html/rfc6749#section-4.1)
This flow consists from 3 steps.
diff --git a/doc/integration/README.md b/doc/integration/README.md
index 1fc8ab997ec..e5f33d8deed 100644
--- a/doc/integration/README.md
+++ b/doc/integration/README.md
@@ -8,9 +8,8 @@ See the documentation below for details on how to configure these services.
- [LDAP](ldap.md) Set up sign in via LDAP
- [OmniAuth](omniauth.md) Sign in via Twitter, GitHub, GitLab, and Google via OAuth.
- [Slack](slack.md) Integrate with the Slack chat service
-- [OAuth2 provider](oauth_provider.md) OAuth2 application creation
-Jenkins support is [available in GitLab EE](http://doc.gitlab.com/ee/integration/jenkins.html).
+GitLab Enterprise Edition contains [advanced JIRA support](http://doc.gitlab.com/ee/integration/jira.html) and [advanced Jenkins support](http://doc.gitlab.com/ee/integration/jenkins.html).
## Project services
diff --git a/doc/integration/external-issue-tracker.md b/doc/integration/external-issue-tracker.md
index 53d6898b6e8..96755707dee 100644
--- a/doc/integration/external-issue-tracker.md
+++ b/doc/integration/external-issue-tracker.md
@@ -8,6 +8,8 @@ GitLab has a great issue tracker but you can also use an external issue tracker
![Jira screenshot](jira-integration-points.png)
+GitLab Enterprise Edition contains [advanced JIRA support](http://doc.gitlab.com/ee/integration/jira.html).
+
## Configuration
### Project Service
@@ -23,7 +25,6 @@ Fill in the required details on the page:
* `issues_url` The URL to the issue in Redmine project that is linked to this GitLab project. Note that the `issues_url` requires `:id` in the url. This id is used by GitLab as a placeholder to replace the issue number.
* `new_issue_url` This is the URL to create a new issue in Redmine for the project linked to this GitLab project.
-
### Service Template
It is necessary to configure the external issue tracker per project, because project specific details are needed for the integration with GitLab.
diff --git a/doc/integration/github.md b/doc/integration/github.md
index c9c27859c5e..137d7e9d632 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -35,7 +35,7 @@ To enable the GitHub OmniAuth provider you must register your application with G
sudo -u git -H editor config/gitlab.yml
```
-1. See [Initial OmniAuth Configuration](README.md#initial-omniauth-configuration) for inital settings.
+1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for inital settings.
1. Add the provider configuration:
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index b95ef5c0af3..87400bed5b5 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -1,10 +1,13 @@
-# GitLab OAuth2 OmniAuth Provider
+# Integrate your server with GitLab.com
-To enable the GitLab OmniAuth provider you must register your application with GitLab. GitLab will generate a client ID and secret key for you to use.
+Import projects from GitLab.com and login to your GitLab instance with your GitLab.com account.
-1. Sign in to GitLab.
+To enable the GitLab.com OmniAuth provider you must register your application with GitLab.com.
+GitLab.com will generate a application ID and secret key for you to use.
-1. Navigate to your settings.
+1. Sign in to GitLab.com
+
+1. Navigate to your profile settings.
1. Select "Applications" in the left menu.
@@ -15,17 +18,17 @@ To enable the GitLab OmniAuth provider you must register your application with G
- Redirect URI:
```
- http://gitlab.example.com/import/gitlab/callback
- http://gitlab.example.com/users/auth/gitlab/callback
+ http://your-gitlab.example.com/import/gitlab/callback
+ http://your-gitlab.example.com/users/auth/gitlab/callback
```
The first link is required for the importer and second for the authorization.
1. Select "Submit".
-1. You should now see a Application ID and Secret. Keep this page open as you continue configuration.
-
-1. You should now see a Client ID and Client Secret near the top right of the page (see screenshot). Keep this page open as you continue configuration. ![GitHub app](github_app.png)
+1. You should now see a Client ID and Client Secret near the top right of the page (see screenshot).
+ Keep this page open as you continue configuration.
+ ![GitLab app](gitlab_app.png)
1. On your GitLab server, open the configuration file.
@@ -43,7 +46,7 @@ To enable the GitLab OmniAuth provider you must register your application with G
sudo -u git -H editor config/gitlab.yml
```
-1. See [Initial OmniAuth Configuration](README.md#initial-omniauth-configuration) for inital settings.
+1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for inital settings.
1. Add the provider configuration:
@@ -76,4 +79,6 @@ To enable the GitLab OmniAuth provider you must register your application with G
1. Restart GitLab for the changes to take effect.
-On the sign in page there should now be a GitLab icon below the regular sign in form. Click the icon to begin the authentication process. GitLab will ask the user to sign in and authorize the GitLab application. If everything goes well the user will be returned to your GitLab instance and will be signed in.
+On the sign in page there should now be a GitLab.com icon below the regular sign in form.
+Click the icon to begin the authentication process. GitLab.com will ask the user to sign in and authorize the GitLab application.
+If everything goes well the user will be returned to your GitLab instance and will be signed in.
diff --git a/doc/integration/gitlab_app.png b/doc/integration/gitlab_app.png
new file mode 100644
index 00000000000..3f9391a821b
--- /dev/null
+++ b/doc/integration/gitlab_app.png
Binary files differ
diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md
index 5fdb74a43df..192c321f712 100644
--- a/doc/integration/oauth_provider.md
+++ b/doc/integration/oauth_provider.md
@@ -1,4 +1,8 @@
-## GitLab as OAuth2 provider
+## GitLab as OAuth2 authentication service provider
+
+This document is about using GitLab as an OAuth authentication service provider to sign into other services.
+If you want to use other OAuth authentication service providers to sign into GitLab please see the [OAuth2 client documentation](../api/oauth2.md)
+
OAuth2 provides client applications a 'secure delegated access' to server resources on behalf of a resource owner. Or you can allow users to sign in to your application with their GitLab.com account.
In fact OAuth allows to issue access token to third-party clients by an authorization server,
with the approval of the resource owner, or end-user.
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index 7433de33909..c92fa3ee4b7 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -70,7 +70,7 @@ Now we can choose one or more of the Supported Providers below to continue confi
## Supported Providers
- [GitHub](github.md)
-- [GitLab](gitlab.md)
+- [GitLab.com](gitlab.md)
- [Google](google.md)
- [Shibboleth](shibboleth.md)
- [Twitter](twitter.md)
diff --git a/features/steps/groups.rb b/features/steps/groups.rb
index 0a9b4ccba53..610e7fd3a48 100644
--- a/features/steps/groups.rb
+++ b/features/steps/groups.rb
@@ -110,7 +110,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps
end
step 'I should see new group "Owned" avatar' do
- Group.find_by(name: "Owned").avatar.should be_instance_of AvatarUploader
+ Group.find_by(name: "Owned").avatar.should be_instance_of AttachmentUploader
Group.find_by(name: "Owned").avatar.url.should == "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/gitlab_logo.png"
end
diff --git a/features/steps/profile/profile.rb b/features/steps/profile/profile.rb
index 4efd2176782..a907b0b7dcf 100644
--- a/features/steps/profile/profile.rb
+++ b/features/steps/profile/profile.rb
@@ -29,7 +29,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
end
step 'I should see new avatar' do
- @user.avatar.should be_instance_of AvatarUploader
+ @user.avatar.should be_instance_of AttachmentUploader
@user.avatar.url.should == "/uploads/user/avatar/#{ @user.id }/gitlab_logo.png"
end
diff --git a/features/steps/project/project.rb b/features/steps/project/project.rb
index d39c8e7d2db..033d45e0253 100644
--- a/features/steps/project/project.rb
+++ b/features/steps/project/project.rb
@@ -35,7 +35,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps
end
step 'I should see new project avatar' do
- @project.avatar.should be_instance_of AvatarUploader
+ @project.avatar.should be_instance_of AttachmentUploader
url = @project.avatar.url
url.should == "/uploads/project/avatar/#{ @project.id }/gitlab_logo.png"
end
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index a50ee4659a3..228a719fbdf 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -83,7 +83,7 @@ module API
end
def authenticate_by_gitlab_shell_token!
- unauthorized! unless secret_token == params['secret_token']
+ unauthorized! unless secret_token == params['secret_token'].try(:chomp)
end
def authenticated_as_admin!
@@ -236,7 +236,7 @@ module API
end
def secret_token
- File.read(Rails.root.join('.gitlab_shell_secret'))
+ File.read(Rails.root.join('.gitlab_shell_secret')).chomp
end
def handle_member_errors(errors)
diff --git a/lib/api/internal.rb b/lib/api/internal.rb
index b5542c1874b..ba3fe619b92 100644
--- a/lib/api/internal.rb
+++ b/lib/api/internal.rb
@@ -74,7 +74,7 @@ module API
if message = BroadcastMessage.current
present message, with: Entities::BroadcastMessage
else
- not_found!
+ {}
end
end
end
diff --git a/lib/backup/manager.rb b/lib/backup/manager.rb
index 06cd40a5b1c..ab8db4e9837 100644
--- a/lib/backup/manager.rb
+++ b/lib/backup/manager.rb
@@ -1,6 +1,6 @@
module Backup
class Manager
- BACKUP_CONTENTS = %w{repositories/ db/ public/ uploads/ backup_information.yml}
+ BACKUP_CONTENTS = %w{repositories/ db/ uploads/ backup_information.yml}
def pack
# saving additional informations
diff --git a/lib/backup/uploads.rb b/lib/backup/uploads.rb
index 75d8e18a862..e50e1ff4f13 100644
--- a/lib/backup/uploads.rb
+++ b/lib/backup/uploads.rb
@@ -1,45 +1,29 @@
module Backup
class Uploads
- attr_reader :app_public_uploads_dir, :app_private_uploads_dir, :backup_public_uploads_dir,
- :backup_private_uploads_dir, :backup_dir, :backup_public_dir
+ attr_reader :app_uploads_dir, :backup_uploads_dir, :backup_dir
def initialize
- @app_public_uploads_dir = File.realpath(Rails.root.join('public', 'uploads'))
- @app_private_uploads_dir = File.realpath(Rails.root.join('uploads'))
+ @app_uploads_dir = File.realpath(Rails.root.join('public', 'uploads'))
@backup_dir = Gitlab.config.backup.path
- @backup_public_dir = File.join(backup_dir, 'public')
- @backup_public_uploads_dir = File.join(backup_dir, 'public', 'uploads')
- @backup_private_uploads_dir = File.join(backup_dir, 'uploads')
+ @backup_uploads_dir = File.join(Gitlab.config.backup.path, 'uploads')
end
- # Copy uploads from public/uploads to backup/public/uploads and from /uploads to backup/uploads
+ # Copy uploads from public/uploads to backup/uploads
def dump
- FileUtils.mkdir_p(backup_public_uploads_dir)
- FileUtils.cp_r(app_public_uploads_dir, backup_public_dir)
-
- FileUtils.mkdir_p(backup_private_uploads_dir)
- FileUtils.cp_r(app_private_uploads_dir, backup_dir)
+ FileUtils.mkdir_p(backup_uploads_dir)
+ FileUtils.cp_r(app_uploads_dir, backup_dir)
end
def restore
- backup_existing_public_uploads_dir
- backup_existing_private_uploads_dir
+ backup_existing_uploads_dir
- FileUtils.cp_r(backup_public_uploads_dir, app_public_uploads_dir)
- FileUtils.cp_r(backup_private_uploads_dir, app_private_uploads_dir)
+ FileUtils.cp_r(backup_uploads_dir, app_uploads_dir)
end
- def backup_existing_public_uploads_dir
- timestamped_public_uploads_path = File.join(app_public_uploads_dir, '..', "uploads.#{Time.now.to_i}")
- if File.exists?(app_public_uploads_dir)
- FileUtils.mv(app_public_uploads_dir, timestamped_public_uploads_path)
- end
- end
-
- def backup_existing_private_uploads_dir
- timestamped_private_uploads_path = File.join(app_private_uploads_dir, '..', "uploads.#{Time.now.to_i}")
- if File.exists?(app_private_uploads_dir)
- FileUtils.mv(app_private_uploads_dir, timestamped_private_uploads_path)
+ def backup_existing_uploads_dir
+ timestamped_uploads_path = File.join(app_uploads_dir, '..', "uploads.#{Time.now.to_i}")
+ if File.exists?(app_uploads_dir)
+ FileUtils.mv(app_uploads_dir, timestamped_uploads_path)
end
end
end
diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb
index 93e7edf508c..1a25eebe7d1 100644
--- a/lib/gitlab/current_settings.rb
+++ b/lib/gitlab/current_settings.rb
@@ -1,11 +1,15 @@
module Gitlab
module CurrentSettings
def current_application_settings
- if ActiveRecord::Base.connected? && ActiveRecord::Base.connection.table_exists?('application_settings')
- ApplicationSetting.current ||
- ApplicationSetting.create_from_defaults
- else
- fake_application_settings
+ key = :current_application_settings
+
+ RequestStore.store[key] ||= begin
+ if ActiveRecord::Base.connected? && ActiveRecord::Base.connection.table_exists?('application_settings')
+ RequestStore.store[:current_application_settings] =
+ (ApplicationSetting.current || ApplicationSetting.create_from_defaults)
+ else
+ fake_application_settings
+ end
end
end
diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb
index 6444cec7eb5..9b31190a882 100644
--- a/lib/gitlab/git_access.rb
+++ b/lib/gitlab/git_access.rb
@@ -6,6 +6,8 @@ module Gitlab
attr_reader :params, :project, :git_cmd, :user
def self.can_push_to_branch?(user, project, ref)
+ return false unless user
+
if project.protected_branch?(ref) &&
!(project.developers_can_push_to_protected_branch?(ref) && project.team.developer?(user))
user.can?(:push_code_to_protected_branches, project)
diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb
index 317a559f83c..ab908a3d61e 100644
--- a/spec/helpers/gitlab_markdown_helper_spec.rb
+++ b/spec/helpers/gitlab_markdown_helper_spec.rb
@@ -584,7 +584,7 @@ describe GitlabMarkdownHelper do
it "should leave code blocks untouched" do
allow(helper).to receive(:user_color_scheme_class).and_return(:white)
- target_html = "<pre class=\"code highlight white plaintext\"><code>some code from $40\nhere too\n</code></pre>\n"
+ target_html = "<pre class=\"code highlight white plaintext\"><code>some code from $#{snippet.id}\nhere too\n</code></pre>\n"
expect(helper.markdown("\n some code from $#{snippet.id}\n here too\n")).
to eq(target_html)
@@ -638,6 +638,18 @@ describe GitlabMarkdownHelper do
expect(markdown(actual)).to match(expected)
end
+ it "should handle relative urls for a file in master with an anchor" do
+ actual = "[GitLab API doc](doc/api/README.md#section)\n"
+ expected = "<p><a href=\"/#{project.path_with_namespace}/blob/#{@ref}/doc/api/README.md#section\">GitLab API doc</a></p>\n"
+ expect(markdown(actual)).to match(expected)
+ end
+
+ it "should not handle relative urls for the current file with an anchor" do
+ actual = "[GitLab API doc](#section)\n"
+ expected = "<p><a href=\"#section\">GitLab API doc</a></p>\n"
+ expect(markdown(actual)).to match(expected)
+ end
+
it "should handle relative urls for a directory in master" do
actual = "[GitLab API doc](doc/api)\n"
expected = "<p><a href=\"/#{project.path_with_namespace}/tree/#{@ref}/doc/api\">GitLab API doc</a></p>\n"
diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb
index 10b467d85fd..4c7d15d6594 100644
--- a/spec/requests/api/internal_spec.rb
+++ b/spec/requests/api/internal_spec.rb
@@ -32,7 +32,8 @@ describe API::API, api: true do
it do
get api("/internal/broadcast_message"), secret_token: secret_token
- expect(response.status).to eq(404)
+ expect(response.status).to eq(200)
+ expect(json_response).to be_empty
end
end
end
diff --git a/uploads/.gitkeep b/uploads/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/uploads/.gitkeep
+++ /dev/null