summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/api/api.rb3
-rw-r--r--lib/api/commits.rb64
-rw-r--r--lib/api/deploy_keys.rb4
-rw-r--r--lib/api/entities.rb37
-rw-r--r--lib/api/files.rb63
-rw-r--r--lib/api/groups.rb6
-rw-r--r--lib/api/helpers.rb4
-rw-r--r--lib/api/internal.rb4
-rw-r--r--lib/api/merge_requests.rb5
-rw-r--r--lib/api/projects.rb22
-rw-r--r--lib/api/repositories.rb65
-rw-r--r--lib/api/users.rb6
-rw-r--r--lib/backup/database.rb20
-rw-r--r--lib/backup/manager.rb26
-rw-r--r--lib/backup/repository.rb3
-rw-r--r--lib/backup/uploads.rb5
-rw-r--r--lib/extracts_path.rb2
-rw-r--r--lib/gitlab/auth.rb2
-rw-r--r--lib/gitlab/blacklist.rb2
-rw-r--r--lib/gitlab/identifier.rb6
-rw-r--r--lib/gitlab/ldap/user.rb4
-rw-r--r--lib/gitlab/popen.rb20
-rw-r--r--lib/gitlab/regex.rb4
-rw-r--r--lib/gitlab/satellite/files/edit_file_action.rb5
-rw-r--r--lib/gitlab/satellite/files/file_action.rb8
-rw-r--r--lib/gitlab/satellite/files/new_file_action.rb4
-rw-r--r--lib/gitlab/satellite/merge_action.rb44
-rw-r--r--lib/gitlab/satellite/satellite.rb2
-rw-r--r--lib/gitlab/upgrader.rb2
-rw-r--r--lib/redcarpet/render/gitlab_html.rb21
-rwxr-xr-xlib/support/deploy/deploy.sh4
-rwxr-xr-xlib/support/init.d/gitlab3
-rwxr-xr-xlib/support/init.d/gitlab.default.example17
-rw-r--r--lib/support/nginx/gitlab20
-rw-r--r--lib/tasks/gitlab/bulk_add_permission.rake26
-rw-r--r--lib/tasks/gitlab/check.rake52
-rw-r--r--lib/tasks/gitlab/enable_namespaces.rake4
-rw-r--r--lib/tasks/gitlab/import.rake12
38 files changed, 368 insertions, 233 deletions
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 283f7642f67..6bec8368b12 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -22,6 +22,8 @@ module API
end
format :json
+ content_type :txt, "text/plain"
+
helpers APIHelpers
mount Groups
@@ -40,6 +42,7 @@ module API
mount ProjectHooks
mount Services
mount Files
+ mount Commits
mount Namespaces
end
end
diff --git a/lib/api/commits.rb b/lib/api/commits.rb
new file mode 100644
index 00000000000..33b8b3d2244
--- /dev/null
+++ b/lib/api/commits.rb
@@ -0,0 +1,64 @@
+require 'mime/types'
+
+module API
+ # Projects API
+ class Commits < Grape::API
+ before { authenticate! }
+ before { authorize! :download_code, user_project }
+
+ resource :projects do
+ helpers do
+ def handle_project_member_errors(errors)
+ if errors[:project_access].any?
+ error!(errors[:project_access], 422)
+ end
+ not_found!
+ end
+ end
+
+ # Get a project repository commits
+ #
+ # Parameters:
+ # id (required) - The ID of a project
+ # ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used
+ # Example Request:
+ # GET /projects/:id/repository/commits
+ get ":id/repository/commits" do
+ page = (params[:page] || 0).to_i
+ per_page = (params[:per_page] || 20).to_i
+ ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
+
+ commits = user_project.repository.commits(ref, nil, per_page, page * per_page)
+ present commits, with: Entities::RepoCommit
+ end
+
+ # Get a specific commit of a project
+ #
+ # Parameters:
+ # id (required) - The ID of a project
+ # sha (required) - The commit hash or name of a repository branch or tag
+ # Example Request:
+ # GET /projects/:id/repository/commits/:sha
+ get ":id/repository/commits/:sha" do
+ sha = params[:sha]
+ commit = user_project.repository.commit(sha)
+ not_found! "Commit" unless commit
+ present commit, with: Entities::RepoCommitDetail
+ end
+
+ # Get the diff for a specific commit of a project
+ #
+ # Parameters:
+ # id (required) - The ID of a project
+ # sha (required) - The commit or branch name
+ # Example Request:
+ # GET /projects/:id/repository/commits/:sha/diff
+ get ":id/repository/commits/:sha/diff" do
+ sha = params[:sha]
+ commit = user_project.repository.commit(sha)
+ not_found! "Commit" unless commit
+ commit.diffs
+ end
+ end
+ end
+end
diff --git a/lib/api/deploy_keys.rb b/lib/api/deploy_keys.rb
index b5997608997..7f5a125038c 100644
--- a/lib/api/deploy_keys.rb
+++ b/lib/api/deploy_keys.rb
@@ -38,14 +38,14 @@ module API
attrs[:key].strip!
# check if key already exist in project
- key = user_project.deploy_keys.find_by_key(attrs[:key])
+ key = user_project.deploy_keys.find_by(key: attrs[:key])
if key
present key, with: Entities::SSHKey
return
end
# Check for available deploy keys in other projects
- key = current_user.accessible_deploy_keys.find_by_key(attrs[:key])
+ key = current_user.accessible_deploy_keys.find_by(key: attrs[:key])
if key
user_project.deploy_keys << key
present key, with: Entities::SSHKey
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 8d2f38c4daa..8557fa074d4 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -1,11 +1,17 @@
module API
module Entities
class User < Grape::Entity
- expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter,
+ expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter, :website_url,
:theme_id, :color_scheme_id, :state, :created_at, :extern_uid, :provider
expose :is_admin?, as: :is_admin
expose :can_create_group?, as: :can_create_group
expose :can_create_project?, as: :can_create_project
+
+ expose :avatar_url do |user, options|
+ if user.avatar.present?
+ user.avatar.url
+ end
+ end
end
class UserSafe < Grape::Entity
@@ -48,19 +54,19 @@ module API
class ProjectMember < UserBasic
expose :project_access, as: :access_level do |user, options|
- options[:project].users_projects.find_by_user_id(user.id).project_access
+ options[:project].users_projects.find_by(user_id: user.id).project_access
end
end
class TeamMember < UserBasic
expose :permission, as: :access_level do |user, options|
- options[:user_team].user_team_user_relationships.find_by_user_id(user.id).permission
+ options[:user_team].user_team_user_relationships.find_by(user_id: user.id).permission
end
end
class TeamProject < Project
expose :greatest_access, as: :greatest_access_level do |project, options|
- options[:user_team].user_team_project_relationships.find_by_project_id(project.id).greatest_access
+ options[:user_team].user_team_project_relationships.find_by(project_id: project.id).greatest_access
end
end
@@ -74,12 +80,21 @@ module API
class GroupMember < UserBasic
expose :group_access, as: :access_level do |user, options|
- options[:group].users_groups.find_by_user_id(user.id).group_access
+ options[:group].users_groups.find_by(user_id: user.id).group_access
end
end
class RepoObject < Grape::Entity
- expose :name, :commit
+ expose :name
+
+ expose :commit do |repo_obj, options|
+ if repo_obj.respond_to?(:commit)
+ repo_obj.commit
+ elsif options[:project]
+ options[:project].repository.commit(repo_obj.target)
+ end
+ end
+
expose :protected do |repo, options|
if options[:project]
options[:project].protected_branch? repo.name
@@ -87,6 +102,16 @@ module API
end
end
+ class RepoTreeObject < Grape::Entity
+ expose :id, :name, :type
+
+ expose :mode do |obj, options|
+ filemode = obj.mode.to_s(8)
+ filemode = "0" + filemode if filemode.length < 6
+ filemode
+ end
+ end
+
class RepoCommit < Grape::Entity
expose :id, :short_id, :title, :author_name, :author_email, :created_at
end
diff --git a/lib/api/files.rb b/lib/api/files.rb
index 6a5419a580f..e0c46f92b84 100644
--- a/lib/api/files.rb
+++ b/lib/api/files.rb
@@ -5,10 +5,61 @@ module API
before { authorize! :push_code, user_project }
resource :projects do
+ # Get file from repository
+ # File content is Base64 encoded
+ #
+ # Parameters:
+ # file_path (required) - The path to the file. Ex. lib/class.rb
+ # ref (required) - The name of branch, tag or commit
+ #
+ # Example Request:
+ # GET /projects/:id/repository/files
+ #
+ # Example response:
+ # {
+ # "file_name": "key.rb",
+ # "file_path": "app/models/key.rb",
+ # "size": 1476,
+ # "encoding": "base64",
+ # "content": "IyA9PSBTY2hlbWEgSW5mb3...",
+ # "ref": "master",
+ # "blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83",
+ # "commit_id": "d5a3ff139356ce33e37e73add446f16869741b50"
+ # }
+ #
+ get ":id/repository/files" do
+ required_attributes! [:file_path, :ref]
+ attrs = attributes_for_keys [:file_path, :ref]
+ ref = attrs.delete(:ref)
+ file_path = attrs.delete(:file_path)
+
+ commit = user_project.repository.commit(ref)
+ not_found! "Commit" unless commit
+
+ blob = user_project.repository.blob_at(commit.sha, file_path)
+
+ if blob
+ status(200)
+
+ {
+ file_name: blob.name,
+ file_path: blob.path,
+ size: blob.size,
+ encoding: "base64",
+ content: Base64.encode64(blob.data),
+ ref: ref,
+ blob_id: blob.id,
+ commit_id: commit.id,
+ }
+ else
+ render_api_error!('File not found', 404)
+ end
+ end
+
# Create new file in repository
#
# Parameters:
- # file_path (optional) - The path to new file. Ex. lib/class.rb
+ # file_path (required) - The path to new file. Ex. lib/class.rb
# branch_name (required) - The name of branch
# content (required) - File content
# commit_message (required) - Commit message
@@ -18,10 +69,10 @@ module API
#
post ":id/repository/files" do
required_attributes! [:file_path, :branch_name, :content, :commit_message]
- attrs = attributes_for_keys [:file_path, :branch_name, :content, :commit_message]
+ attrs = attributes_for_keys [:file_path, :branch_name, :content, :commit_message, :encoding]
branch_name = attrs.delete(:branch_name)
file_path = attrs.delete(:file_path)
- result = ::Files::CreateContext.new(user_project, current_user, attrs, branch_name, file_path).execute
+ result = ::Files::CreateService.new(user_project, current_user, attrs, branch_name, file_path).execute
if result[:status] == :success
status(201)
@@ -48,10 +99,10 @@ module API
#
put ":id/repository/files" do
required_attributes! [:file_path, :branch_name, :content, :commit_message]
- attrs = attributes_for_keys [:file_path, :branch_name, :content, :commit_message]
+ attrs = attributes_for_keys [:file_path, :branch_name, :content, :commit_message, :encoding]
branch_name = attrs.delete(:branch_name)
file_path = attrs.delete(:file_path)
- result = ::Files::UpdateContext.new(user_project, current_user, attrs, branch_name, file_path).execute
+ result = ::Files::UpdateService.new(user_project, current_user, attrs, branch_name, file_path).execute
if result[:status] == :success
status(200)
@@ -81,7 +132,7 @@ module API
attrs = attributes_for_keys [:file_path, :branch_name, :commit_message]
branch_name = attrs.delete(:branch_name)
file_path = attrs.delete(:file_path)
- result = ::Files::DeleteContext.new(user_project, current_user, attrs, branch_name, file_path).execute
+ result = ::Files::DeleteService.new(user_project, current_user, attrs, branch_name, file_path).execute
if result[:status] == :success
status(200)
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index 290b78d8017..03f027706de 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -121,11 +121,11 @@ module API
render_api_error!("Wrong access level", 422)
end
group = find_group(params[:id])
- if group.users_groups.find_by_user_id(params[:user_id])
+ if group.users_groups.find_by(user_id: params[:user_id])
render_api_error!("Already exists", 409)
end
group.add_users([params[:user_id]], params[:access_level])
- member = group.users_groups.find_by_user_id(params[:user_id])
+ member = group.users_groups.find_by(user_id: params[:user_id])
present member.user, with: Entities::GroupMember, group: group
end
@@ -139,7 +139,7 @@ module API
# DELETE /groups/:id/members/:user_id
delete ":id/members/:user_id" do
group = find_group(params[:id])
- member = group.users_groups.find_by_user_id(params[:user_id])
+ member = group.users_groups.find_by(user_id: params[:user_id])
if member.nil?
render_api_error!("404 Not Found - user_id:#{params[:user_id]} not a member of group #{group.name}",404)
else
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index b0f8d5a6da9..f8c48e2f3b2 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -7,7 +7,7 @@ module API
def current_user
private_token = (params[PRIVATE_TOKEN_PARAM] || env[PRIVATE_TOKEN_HEADER]).to_s
- @current_user ||= User.find_by_authentication_token(private_token)
+ @current_user ||= User.find_by(authentication_token: private_token)
identifier = sudo_identifier()
# If the sudo is the current user do nothing
@@ -47,7 +47,7 @@ module API
end
def find_project(id)
- project = Project.find_by_id(id) || Project.find_with_namespace(id)
+ project = Project.find_by(id: id) || Project.find_with_namespace(id)
if project && can?(current_user, :read_project, project)
project
diff --git a/lib/api/internal.rb b/lib/api/internal.rb
index ed6b50c3a6a..ebc9fef07b4 100644
--- a/lib/api/internal.rb
+++ b/lib/api/internal.rb
@@ -35,7 +35,9 @@ module API
user = key.user
return false if user.blocked?
- return false if user.ldap_user? && Gitlab::LDAP::User.blocked?(user.extern_uid)
+ if Gitlab.config.ldap.enabled
+ return false if user.ldap_user? && Gitlab::LDAP::User.blocked?(user.extern_uid)
+ end
action = case git_cmd
when *DOWNLOAD_COMMANDS
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index 3f4bec895bf..58d2f79faff 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -81,14 +81,13 @@ module API
merge_request.target_project = user_project
else
if target_matches_fork(target_project_id,user_project)
- merge_request.target_project = Project.find_by_id(attrs[:target_project_id])
+ merge_request.target_project = Project.find_by(id: attrs[:target_project_id])
else
render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400)
end
end
if merge_request.save
- merge_request.reload_code
present merge_request, with: Entities::MergeRequest
else
handle_merge_request_errors! merge_request.errors
@@ -117,8 +116,6 @@ module API
authorize! :modify_merge_request, merge_request
if merge_request.update_attributes attrs
- merge_request.reload_code
- merge_request.mark_as_unchecked
present merge_request, with: Entities::MergeRequest
else
handle_merge_request_errors! merge_request.errors
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 66e0d1ba3ef..bcca69ff49a 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -11,7 +11,7 @@ module API
end
not_found!
end
-
+
def map_public_to_visibility_level(attrs)
publik = attrs.delete(:public)
publik = [ true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON' ].include?(publik)
@@ -102,7 +102,7 @@ module API
:visibility_level,
:import_url]
attrs = map_public_to_visibility_level(attrs)
- @project = ::Projects::CreateContext.new(current_user, attrs).execute
+ @project = ::Projects::CreateService.new(current_user, attrs).execute
if @project.saved?
present @project, with: Entities::Project
else
@@ -143,7 +143,7 @@ module API
:public,
:visibility_level]
attrs = map_public_to_visibility_level(attrs)
- @project = ::Projects::CreateContext.new(user, attrs).execute
+ @project = ::Projects::CreateService.new(user, attrs).execute
if @project.saved?
present @project, with: Entities::Project
else
@@ -266,7 +266,7 @@ module API
authorize! :admin_project, user_project
required_attributes! [:access_level]
- team_member = user_project.users_projects.find_by_user_id(params[:user_id])
+ team_member = user_project.users_projects.find_by(user_id: params[:user_id])
not_found!("User can not be found") if team_member.nil?
if team_member.update_attributes(project_access: params[:access_level])
@@ -286,7 +286,7 @@ module API
# DELETE /projects/:id/members/:user_id
delete ":id/members/:user_id" do
authorize! :admin_project, user_project
- team_member = user_project.users_projects.find_by_user_id(params[:user_id])
+ team_member = user_project.users_projects.find_by(user_id: params[:user_id])
unless team_member.nil?
team_member.destroy
else
@@ -308,6 +308,18 @@ module API
projects = Project.where("(id in (?) OR visibility_level in (?)) AND (name LIKE (?))", ids, visibility_levels, "%#{params[:query]}%")
present paginate(projects), with: Entities::Project
end
+
+
+ # Get a users list
+ #
+ # Example Request:
+ # GET /users
+ get ':id/users' do
+ @users = User.where(id: user_project.team.users.map(&:id))
+ @users = @users.search(params[:search]) if params[:search].present?
+ @users = paginate @users
+ present @users, with: Entities::User
+ end
end
end
end
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index c99c8f7bdfb..ba53bf9baa4 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -51,7 +51,7 @@ module API
@branch = user_project.repository.find_branch(params[:branch])
not_found! unless @branch
- protected_branch = user_project.protected_branches.find_by_name(@branch.name)
+ protected_branch = user_project.protected_branches.find_by(name: @branch.name)
user_project.protected_branches.create(name: @branch.name) unless protected_branch
present @branch, with: Entities::RepoObject, project: user_project
@@ -69,7 +69,7 @@ module API
@branch = user_project.repository.find_branch(params[:branch])
not_found! unless @branch
- protected_branch = user_project.protected_branches.find_by_name(@branch.name)
+ protected_branch = user_project.protected_branches.find_by(name: @branch.name)
protected_branch.destroy if protected_branch
present @branch, with: Entities::RepoObject, project: user_project
@@ -82,51 +82,7 @@ module API
# Example Request:
# GET /projects/:id/repository/tags
get ":id/repository/tags" do
- present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject
- end
-
- # Get a project repository commits
- #
- # Parameters:
- # id (required) - The ID of a project
- # ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used
- # Example Request:
- # GET /projects/:id/repository/commits
- get ":id/repository/commits" do
- page = (params[:page] || 0).to_i
- per_page = (params[:per_page] || 20).to_i
- ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
-
- commits = user_project.repository.commits(ref, nil, per_page, page * per_page)
- present commits, with: Entities::RepoCommit
- end
-
- # Get a specific commit of a project
- #
- # Parameters:
- # id (required) - The ID of a project
- # sha (required) - The commit hash or name of a repository branch or tag
- # Example Request:
- # GET /projects/:id/repository/commits/:sha
- get ":id/repository/commits/:sha" do
- sha = params[:sha]
- commit = user_project.repository.commit(sha)
- not_found! "Commit" unless commit
- present commit, with: Entities::RepoCommitDetail
- end
-
- # Get the diff for a specific commit of a project
- #
- # Parameters:
- # id (required) - The ID of a project
- # sha (required) - The commit or branch name
- # Example Request:
- # GET /projects/:id/repository/commits/:sha/diff
- get ":id/repository/commits/:sha/diff" do
- sha = params[:sha]
- result = CommitLoadContext.new(user_project, current_user, {id: sha}).execute
- not_found! "Commit" unless result[:commit]
- result[:commit].diffs
+ present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject, project: user_project
end
# Get a project repository tree
@@ -141,15 +97,9 @@ module API
path = params[:path] || nil
commit = user_project.repository.commit(ref)
- tree = Tree.new(user_project.repository, commit.id, path)
+ tree = user_project.repository.tree(commit.id, path)
- trees = []
-
- %w(trees blobs submodules).each do |type|
- trees += tree.send(type).map { |t| {name: t.name, type: type.singularize, mode: t.mode, id: t.id} }
- end
-
- trees
+ present tree.sorted_entries, with: Entities::RepoTreeObject
end
# Get a raw file contents
@@ -173,9 +123,7 @@ module API
blob = Gitlab::Git::Blob.find(repo, commit.id, params[:filepath])
not_found! "File" unless blob
- env['api.format'] = :txt
-
- content_type blob.mime_type
+ content_type 'text/plain'
present blob.data
end
@@ -233,4 +181,3 @@ module API
end
end
end
-
diff --git a/lib/api/users.rb b/lib/api/users.rb
index 475343a3edf..ae808b6272b 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -36,6 +36,7 @@ module API
# skype - Skype ID
# linkedin - Linkedin
# twitter - Twitter account
+ # website_url - Website url
# projects_limit - Number of projects user can create
# extern_uid - External authentication provider UID
# provider - External provider
@@ -67,6 +68,7 @@ module API
# skype - Skype ID
# linkedin - Linkedin
# twitter - Twitter account
+ # website_url - Website url
# projects_limit - Limit projects each user can create
# extern_uid - External authentication provider UID
# provider - External provider
@@ -78,7 +80,7 @@ module API
put ":id" do
authenticated_as_admin!
- attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio, :can_create_group, :admin]
+ attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :website_url, :projects_limit, :username, :extern_uid, :provider, :bio, :can_create_group, :admin]
user = User.find(params[:id])
not_found!("User not found") unless user
@@ -117,7 +119,7 @@ module API
# DELETE /users/:id
delete ":id" do
authenticated_as_admin!
- user = User.find_by_id(params[:id])
+ user = User.find_by(id: params[:id])
if user
user.destroy
diff --git a/lib/backup/database.rb b/lib/backup/database.rb
index 7af7140246a..6552f45ff0b 100644
--- a/lib/backup/database.rb
+++ b/lib/backup/database.rb
@@ -11,23 +11,31 @@ module Backup
end
def dump
- case config["adapter"]
+ success = case config["adapter"]
when /^mysql/ then
+ print "Dumping MySQL database #{config['database']} ... "
system('mysqldump', *mysql_args, config['database'], out: db_file_name)
when "postgresql" then
+ print "Dumping PostgreSQL database #{config['database']} ... "
pg_env
system('pg_dump', config['database'], out: db_file_name)
end
+ report_success(success)
end
def restore
- case config["adapter"]
+ success = case config["adapter"]
when /^mysql/ then
+ print "Restoring MySQL database #{config['database']} ... "
system('mysql', *mysql_args, config['database'], in: db_file_name)
when "postgresql" then
+ puts "Destructively rebuilding database schema for RAILS_ENV #{Rails.env}"
+ Rake::Task["db:schema:load"].invoke
+ print "Restoring PostgreSQL database #{config['database']} ... "
pg_env
system('psql', config['database'], '-f', db_file_name)
end
+ report_success(success)
end
protected
@@ -54,5 +62,13 @@ module Backup
ENV['PGPORT'] = config["port"].to_s if config["port"]
ENV['PGPASSWORD'] = config["password"].to_s if config["password"]
end
+
+ def report_success(success)
+ if success
+ puts '[DONE]'.green
+ else
+ puts '[FAILED]'.red
+ end
+ end
end
end
diff --git a/lib/backup/manager.rb b/lib/backup/manager.rb
index efaefa4ce44..a93d35a1cd1 100644
--- a/lib/backup/manager.rb
+++ b/lib/backup/manager.rb
@@ -7,7 +7,7 @@ module Backup
s = {}
s[:db_version] = "#{ActiveRecord::Migrator.current_version}"
s[:backup_created_at] = Time.now
- s[:gitlab_version] = %x{git rev-parse HEAD}.gsub(/\n/,"")
+ s[:gitlab_version] = Gitlab::VERSION
s[:tar_version] = %x{tar --version | head -1}.gsub(/\n/,"")
Dir.chdir(Gitlab.config.backup.path)
@@ -87,21 +87,15 @@ module Backup
settings = YAML.load_file("backup_information.yml")
ENV["VERSION"] = "#{settings[:db_version]}" if settings[:db_version].to_i > 0
- # backups directory is not always sub of Rails root and able to execute the git rev-parse below
- begin
- Dir.chdir(Rails.root)
-
- # restoring mismatching backups can lead to unexpected problems
- if settings[:gitlab_version] != %x{git rev-parse HEAD}.gsub(/\n/, "")
- puts "GitLab version mismatch:".red
- puts " Your current HEAD differs from the HEAD in the backup!".red
- puts " Please switch to the following revision and try again:".red
- puts " revision: #{settings[:gitlab_version]}".red
- exit 1
- end
- ensure
- # chdir back to original intended dir
- Dir.chdir(Gitlab.config.backup.path)
+ # restoring mismatching backups can lead to unexpected problems
+ if settings[:gitlab_version] != Gitlab::VERSION
+ puts "GitLab version mismatch:".red
+ puts " Your current GitLab version (#{Gitlab::VERSION}) differs from the GitLab version in the backup!".red
+ puts " Please switch to the following version and try again:".red
+ puts " version: #{settings[:gitlab_version]}".red
+ puts
+ puts "Hint: git checkout v#{settings[:gitlab_version]}"
+ exit 1
end
end
end
diff --git a/lib/backup/repository.rb b/lib/backup/repository.rb
index 20fd5ba92a1..552f7eaa5ce 100644
--- a/lib/backup/repository.rb
+++ b/lib/backup/repository.rb
@@ -72,8 +72,7 @@ module Backup
end
print 'Put GitLab hooks in repositories dirs'.yellow
- gitlab_shell_user_home = File.expand_path("~#{Gitlab.config.gitlab_shell.ssh_user}")
- if system("#{gitlab_shell_user_home}/gitlab-shell/support/rewrite-hooks.sh", Gitlab.config.gitlab_shell.repos_path)
+ if system("#{Gitlab.config.gitlab_shell.path}/support/rewrite-hooks.sh", Gitlab.config.gitlab_shell.repos_path)
puts " [DONE]".green
else
puts " [FAILED]".red
diff --git a/lib/backup/uploads.rb b/lib/backup/uploads.rb
index e79da7e8fd2..e50e1ff4f13 100644
--- a/lib/backup/uploads.rb
+++ b/lib/backup/uploads.rb
@@ -3,7 +3,7 @@ module Backup
attr_reader :app_uploads_dir, :backup_uploads_dir, :backup_dir
def initialize
- @app_uploads_dir = Rails.root.join('public', 'uploads')
+ @app_uploads_dir = File.realpath(Rails.root.join('public', 'uploads'))
@backup_dir = Gitlab.config.backup.path
@backup_uploads_dir = File.join(Gitlab.config.backup.path, 'uploads')
end
@@ -21,8 +21,9 @@ module Backup
end
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, Rails.root.join('public', "uploads.#{Time.now.to_i}"))
+ FileUtils.mv(app_uploads_dir, timestamped_uploads_path)
end
end
end
diff --git a/lib/extracts_path.rb b/lib/extracts_path.rb
index 6e7872dcd03..e51cb30bdd9 100644
--- a/lib/extracts_path.rb
+++ b/lib/extracts_path.rb
@@ -117,7 +117,7 @@ module ExtractsPath
end
def tree
- @tree ||= Tree.new(@repo, @commit.id, @path)
+ @tree ||= @repo.tree(@commit.id, @path)
end
private
diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb
index 0f196297477..955abc1bedd 100644
--- a/lib/gitlab/auth.rb
+++ b/lib/gitlab/auth.rb
@@ -1,7 +1,7 @@
module Gitlab
class Auth
def find(login, password)
- user = User.find_by_email(login) || User.find_by_username(login)
+ user = User.find_by(email: login) || User.find_by(username: login)
if user.nil? || user.ldap_user?
# Second chance - try LDAP authentication
diff --git a/lib/gitlab/blacklist.rb b/lib/gitlab/blacklist.rb
index 2f9091e07df..6bc2c3b487c 100644
--- a/lib/gitlab/blacklist.rb
+++ b/lib/gitlab/blacklist.rb
@@ -3,7 +3,7 @@ module Gitlab
extend self
def path
- %w(admin dashboard groups help profile projects search public assets u s teams merge_requests issues users snippets services repository hooks notes)
+ %w(admin dashboard files groups help profile projects search public assets u s teams merge_requests issues users snippets services repository hooks notes)
end
end
end
diff --git a/lib/gitlab/identifier.rb b/lib/gitlab/identifier.rb
index a1ff248a77f..6e4de197eeb 100644
--- a/lib/gitlab/identifier.rb
+++ b/lib/gitlab/identifier.rb
@@ -6,17 +6,17 @@ module Gitlab
if identifier.blank?
# Local push from gitlab
email = project.repository.commit(newrev).author_email rescue nil
- User.find_by_email(email) if email
+ User.find_by(email: email) if email
elsif identifier =~ /\Auser-\d+\Z/
# git push over http
user_id = identifier.gsub("user-", "")
- User.find_by_id(user_id)
+ User.find_by(id: user_id)
elsif identifier =~ /\Akey-\d+\Z/
# git push over ssh
key_id = identifier.gsub("key-", "")
- Key.find_by_id(key_id).try(:user)
+ Key.find_by(id: key_id).try(:user)
end
end
end
diff --git a/lib/gitlab/ldap/user.rb b/lib/gitlab/ldap/user.rb
index 59f0fa64a6a..fd36dda7d22 100644
--- a/lib/gitlab/ldap/user.rb
+++ b/lib/gitlab/ldap/user.rb
@@ -44,13 +44,13 @@ module Gitlab
end
def find_user(email)
- user = model.find_by_email(email)
+ user = model.find_by(email: email)
# If no user found and allow_username_or_email_login is true
# we look for user by extracting part of their email
if !user && email && ldap_conf['allow_username_or_email_login']
uname = email.partition('@').first
- user = model.find_by_username(uname)
+ user = model.find_by(username: uname)
end
user
diff --git a/lib/gitlab/popen.rb b/lib/gitlab/popen.rb
index 2f30fde2078..e2fbafb3899 100644
--- a/lib/gitlab/popen.rb
+++ b/lib/gitlab/popen.rb
@@ -1,15 +1,29 @@
+require 'fileutils'
+require 'open3'
+
module Gitlab
module Popen
- def popen(cmd, path)
+ extend self
+
+ def popen(cmd, path=nil)
+ unless cmd.is_a?(Array)
+ raise "System commands must be given as an array of strings"
+ end
+
+ path ||= Dir.pwd
vars = { "PWD" => path }
options = { chdir: path }
+ unless File.directory?(path)
+ FileUtils.mkdir_p(path)
+ end
+
@cmd_output = ""
@cmd_status = 0
- Open3.popen3(vars, cmd, options) do |stdin, stdout, stderr, wait_thr|
- @cmd_status = wait_thr.value.exitstatus
+ Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|
@cmd_output << stdout.read
@cmd_output << stderr.read
+ @cmd_status = wait_thr.value.exitstatus
end
return @cmd_output, @cmd_status
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index 943dc9dc7ea..d18fc8bf2ce 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -17,7 +17,7 @@ module Gitlab
def path_regex
default_regex
end
-
+
def archive_formats_regex
#|zip|tar| tar.gz | tar.bz2 |
/(zip|tar|tar\.gz|tgz|gz|tar\.bz2|tbz|tbz2|tb2|bz2)/
@@ -49,7 +49,7 @@ module Gitlab
protected
def default_regex
- /\A[a-zA-Z0-9][a-zA-Z0-9_\-\.]*(?<!\.git)\z/
+ /\A[.?]?[a-zA-Z0-9][a-zA-Z0-9_\-\.]*(?<!\.git)\z/
end
end
end
diff --git a/lib/gitlab/satellite/files/edit_file_action.rb b/lib/gitlab/satellite/files/edit_file_action.rb
index f410ecb7984..cbdf70f7d12 100644
--- a/lib/gitlab/satellite/files/edit_file_action.rb
+++ b/lib/gitlab/satellite/files/edit_file_action.rb
@@ -10,7 +10,7 @@ module Gitlab
# Returns false if committing the change fails
# Returns false if pushing from the satellite to bare repo failed or was rejected
# Returns true otherwise
- def commit!(content, commit_message)
+ def commit!(content, commit_message, encoding)
in_locked_and_timed_satellite do |repo|
prepare_satellite!(repo)
@@ -26,7 +26,8 @@ module Gitlab
return false
end
- File.open(file_path_in_satellite, 'w') { |f| f.write(content) }
+ # Write file
+ write_file(file_path_in_satellite, content, encoding)
# commit the changes
# will raise CommandFailed when commit fails
diff --git a/lib/gitlab/satellite/files/file_action.rb b/lib/gitlab/satellite/files/file_action.rb
index 0f7afde647d..7701a6d5d60 100644
--- a/lib/gitlab/satellite/files/file_action.rb
+++ b/lib/gitlab/satellite/files/file_action.rb
@@ -12,6 +12,14 @@ module Gitlab
def safe_path?(path)
File.absolute_path(path) == path
end
+
+ def write_file(abs_file_path, content, file_encoding = 'text')
+ if file_encoding == 'base64'
+ File.open(abs_file_path, 'wb') { |f| f.write(Base64.decode64(content)) }
+ else
+ File.open(abs_file_path, 'w') { |f| f.write(content) }
+ end
+ end
end
end
end
diff --git a/lib/gitlab/satellite/files/new_file_action.rb b/lib/gitlab/satellite/files/new_file_action.rb
index 57d101ff535..15e9b7a6f77 100644
--- a/lib/gitlab/satellite/files/new_file_action.rb
+++ b/lib/gitlab/satellite/files/new_file_action.rb
@@ -9,7 +9,7 @@ module Gitlab
# Returns false if committing the change fails
# Returns false if pushing from the satellite to bare repo failed or was rejected
# Returns true otherwise
- def commit!(content, commit_message)
+ def commit!(content, commit_message, encoding)
in_locked_and_timed_satellite do |repo|
prepare_satellite!(repo)
@@ -29,7 +29,7 @@ module Gitlab
FileUtils.mkdir_p(dir_name_in_satellite)
# Write file
- File.open(file_path_in_satellite, 'w') { |f| f.write(content) }
+ write_file(file_path_in_satellite, content, encoding)
# add new file
repo.add(file_path_in_satellite)
diff --git a/lib/gitlab/satellite/merge_action.rb b/lib/gitlab/satellite/merge_action.rb
index 54afd6ab95c..85615f282c4 100644
--- a/lib/gitlab/satellite/merge_action.rb
+++ b/lib/gitlab/satellite/merge_action.rb
@@ -24,10 +24,10 @@ module Gitlab
# Returns false if the merge produced conflicts
# Returns false if pushing from the satellite to the repository failed or was rejected
# Returns true otherwise
- def merge!
+ def merge!(merge_commit_message = nil)
in_locked_and_timed_satellite do |merge_repo|
prepare_satellite!(merge_repo)
- if merge_in_satellite!(merge_repo)
+ if merge_in_satellite!(merge_repo, merge_commit_message)
# push merge back to bare repo
# will raise CommandFailed when push fails
merge_repo.git.push(default_options, :origin, merge_request.target_branch)
@@ -49,14 +49,7 @@ module Gitlab
in_locked_and_timed_satellite do |merge_repo|
prepare_satellite!(merge_repo)
update_satellite_source_and_target!(merge_repo)
-
- if merge_request.for_fork?
- diff = merge_repo.git.native(:diff, default_options, "origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}")
- else
- diff = merge_repo.git.native(:diff, default_options, "#{merge_request.target_branch}", "#{merge_request.source_branch}")
- end
-
- return diff
+ diff = merge_repo.git.native(:diff, default_options, "origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}")
end
rescue Grit::Git::CommandFailed => ex
handle_exception(ex)
@@ -88,14 +81,7 @@ module Gitlab
in_locked_and_timed_satellite do |merge_repo|
prepare_satellite!(merge_repo)
update_satellite_source_and_target!(merge_repo)
-
- if (merge_request.for_fork?)
- patch = merge_repo.git.format_patch(default_options({stdout: true}), "origin/#{merge_request.target_branch}..source/#{merge_request.source_branch}")
- else
- patch = merge_repo.git.format_patch(default_options({stdout: true}), "#{merge_request.target_branch}..#{merge_request.source_branch}")
- end
-
- return patch
+ patch = merge_repo.git.format_patch(default_options({stdout: true}), "origin/#{merge_request.target_branch}..source/#{merge_request.source_branch}")
end
rescue Grit::Git::CommandFailed => ex
handle_exception(ex)
@@ -125,34 +111,26 @@ module Gitlab
#
# Returns false if the merge produced conflicts
# Returns true otherwise
- def merge_in_satellite!(repo)
+ def merge_in_satellite!(repo, message = nil)
update_satellite_source_and_target!(repo)
+ message ||= "Merge branch '#{merge_request.source_branch}' into '#{merge_request.target_branch}'"
+
# merge the source branch into the satellite
# will raise CommandFailed when merge fails
- if merge_request.for_fork?
- repo.git.pull(default_options({no_ff: true}), 'source', merge_request.source_branch)
- else
- repo.git.pull(default_options({no_ff: true}), 'origin', merge_request.source_branch)
- end
+ repo.git.merge(default_options({no_ff: true}), "-m #{message}", "source/#{merge_request.source_branch}")
rescue Grit::Git::CommandFailed => ex
handle_exception(ex)
end
# Assumes a satellite exists that is a fresh clone of the projects repo, prepares satellite for merges, diffs etc
def update_satellite_source_and_target!(repo)
- if merge_request.for_fork?
- repo.remote_add('source', merge_request.source_project.repository.path_to_repo)
- repo.remote_fetch('source')
- repo.git.checkout(default_options({b: true}), merge_request.target_branch, "origin/#{merge_request.target_branch}")
- else
- repo.git.checkout(default_options, "#{merge_request.source_branch}")
- repo.git.checkout(default_options({t: true}), "origin/#{merge_request.target_branch}")
- end
+ repo.remote_add('source', merge_request.source_project.repository.path_to_repo)
+ repo.remote_fetch('source')
+ repo.git.checkout(default_options({b: true}), merge_request.target_branch, "origin/#{merge_request.target_branch}")
rescue Grit::Git::CommandFailed => ex
handle_exception(ex)
end
-
end
end
end
diff --git a/lib/gitlab/satellite/satellite.rb b/lib/gitlab/satellite/satellite.rb
index 353c3024aad..bcf3012bd92 100644
--- a/lib/gitlab/satellite/satellite.rb
+++ b/lib/gitlab/satellite/satellite.rb
@@ -33,7 +33,7 @@ module Gitlab
end
def create
- output, status = popen("git clone #{project.repository.path_to_repo} #{path}",
+ output, status = popen(%W(git clone -- #{project.repository.path_to_repo} #{path}),
Gitlab.config.satellites.path)
log("PID: #{project.id}: git clone #{project.repository.path_to_repo} #{path}")
diff --git a/lib/gitlab/upgrader.rb b/lib/gitlab/upgrader.rb
index 859923cb563..f46685e4bbe 100644
--- a/lib/gitlab/upgrader.rb
+++ b/lib/gitlab/upgrader.rb
@@ -8,7 +8,7 @@ module Gitlab
puts "Latest available version for GitLab #{current_version.major} is #{latest_version}"
if latest_version?
- puts "You use latest GitLab version"
+ puts "You are using the latest GitLab version"
else
puts "Newer GitLab version is available"
answer = if ARGV.first == "-y"
diff --git a/lib/redcarpet/render/gitlab_html.rb b/lib/redcarpet/render/gitlab_html.rb
index 2d1e0aec5e5..2e18b0592b5 100644
--- a/lib/redcarpet/render/gitlab_html.rb
+++ b/lib/redcarpet/render/gitlab_html.rb
@@ -8,14 +8,11 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
@project = @template.instance_variable_get("@project")
@ref = @template.instance_variable_get("@ref")
@request_path = @template.instance_variable_get("@path")
+ @options = options.dup
super options
end
def block_code(code, language)
- options = { options: {encoding: 'utf-8'} }
- lexer = Pygments::Lexer.find(language) # language can be an alias
- options.merge!(lexer: lexer.aliases[0].downcase) if lexer # downcase is required
-
# New lines are placed to fix an rendering issue
# with code wrapped inside <h1> tag for next case:
#
@@ -25,7 +22,11 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
#
<<-HTML
- <div class="#{h.user_color_scheme_class}">#{Pygments.highlight(code, options)}</div>
+<div class="highlighted-data #{h.user_color_scheme_class}">
+ <div class="highlight">
+ <pre><code class="#{language}">#{h.send(:html_escape, code)}</code></pre>
+ </div>
+</div>
HTML
end
@@ -34,6 +35,16 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
h.link_to_gfm(content, link, title: title)
end
+ def header(text, level)
+ if @options[:no_header_anchors]
+ "<h#{level}>#{text}</h#{level}>"
+ else
+ id = ActionController::Base.helpers.strip_tags(h.gfm(text)).downcase() \
+ .gsub(/[^a-z0-9_-]/, '-').gsub(/-+/, '-').gsub(/^-/, '').gsub(/-$/, '')
+ "<h#{level} id=\"#{id}\">#{text}<a href=\"\##{id}\"></a></h#{level}>"
+ end
+ end
+
def preprocess(full_document)
if @project
h.create_relative_links(full_document, @project, @ref, @request_path, is_wiki?)
diff --git a/lib/support/deploy/deploy.sh b/lib/support/deploy/deploy.sh
index b96f73058b6..4684957233a 100755
--- a/lib/support/deploy/deploy.sh
+++ b/lib/support/deploy/deploy.sh
@@ -28,7 +28,7 @@ sudo -u git -H git pull origin master
echo 'Deploy: Bundle and migrate'
# change it to your needs
-sudo -u git -H bundle --without aws development test postgres --deployment
+sudo -u git -H bundle --without aws development test mysql --deployment
sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
sudo -u git -H bundle exec rake assets:clean RAILS_ENV=production
@@ -42,4 +42,4 @@ echo 'Deploy: Starting GitLab server...'
sudo service gitlab start
sudo -u git -H rm /home/git/gitlab/public/index.html
-echo 'Deploy: Done' \ No newline at end of file
+echo 'Deploy: Done'
diff --git a/lib/support/init.d/gitlab b/lib/support/init.d/gitlab
index f1b94087b6a..c6e570784e0 100755
--- a/lib/support/init.d/gitlab
+++ b/lib/support/init.d/gitlab
@@ -3,7 +3,6 @@
# GITLAB
# Maintainer: @randx
# Authors: rovanion.luckey@gmail.com, @randx
-# App Version: 6.0
### BEGIN INIT INFO
# Provides: gitlab
@@ -20,7 +19,7 @@
# DO NOT EDIT THIS FILE!
# This file will be overwritten on update.
# Instead add/change your variables in /etc/default/gitlab
-# An example defaults file can be found in lib/support/default/gitlab
+# An example defaults file can be found in lib/support/init.d/gitlab.default.example
###
diff --git a/lib/support/init.d/gitlab.default.example b/lib/support/init.d/gitlab.default.example
index 4230783a9d7..9951bacedf5 100755
--- a/lib/support/init.d/gitlab.default.example
+++ b/lib/support/init.d/gitlab.default.example
@@ -12,3 +12,20 @@ app_user="git"
# app_root defines the folder in which gitlab and it's components are installed.
# The default is "/home/$app_user/gitlab"
app_root="/home/$app_user/gitlab"
+
+# pid_path defines a folder in which the gitlab and it's components place their pids.
+# This variable is also used below to define the relevant pids for the gitlab components.
+# The default is "$app_root/tmp/pids"
+pid_path="$app_root/tmp/pids"
+
+# socket_path defines the folder in which gitlab places the sockets
+#The default is "$app_root/tmp/sockets"
+socket_path="$app_root/tmp/sockets"
+
+# web_server_pid_path defines the path in which to create the pid file fo the web_server
+# The default is "$pid_path/unicorn.pid"
+web_server_pid_path="$pid_path/unicorn.pid"
+
+# sidekiq_pid_path defines the path in which to create the pid file for sidekiq
+# The default is "$pid_path/sidekiq.pid"
+sidekiq_pid_path="$pid_path/sidekiq.pid"
diff --git a/lib/support/nginx/gitlab b/lib/support/nginx/gitlab
index d1d959e152e..882f0386046 100644
--- a/lib/support/nginx/gitlab
+++ b/lib/support/nginx/gitlab
@@ -1,6 +1,19 @@
# GITLAB
# Maintainer: @randx
-# App Version: 5.0
+
+# CHUNKED TRANSFER
+# It is a known issue that Git-over-HTTP requires chunked transfer encoding [0] which is not
+# supported by Nginx < 1.3.9 [1]. As a result, pushing a large object with Git (i.e. a single large file)
+# can lead to a 411 error. In theory you can get around this by tweaking this configuration file and either
+# - installing an old version of Nginx with the chunkin module [2] compiled in, or
+# - using a newer version of Nginx.
+#
+# At the time of writing we do not know if either of these theoretical solutions works. As a workaround
+# users can use Git over SSH to push large files.
+#
+# [0] https://git.kernel.org/cgit/git/git.git/tree/Documentation/technical/http-protocol.txt#n99
+# [1] https://github.com/agentzh/chunkin-nginx-module#status
+# [2] https://github.com/agentzh/chunkin-nginx-module
upstream gitlab {
server unix:/home/git/gitlab/tmp/sockets/gitlab.socket;
@@ -12,7 +25,8 @@ server {
server_tokens off; # don't show the version number, a security best practice
root /home/git/gitlab/public;
- # Set value of client_max_body_size to at least the value of git.max_size in gitlab.yml
+ # Increase this if you want to upload large attachments
+ # Or if you want to accept large git objects over http
client_max_body_size 5m;
# individual nginx logs for this gitlab vhost
@@ -39,5 +53,7 @@ server {
proxy_pass http://gitlab;
}
+
+ error_page 502 /502.html;
}
diff --git a/lib/tasks/gitlab/bulk_add_permission.rake b/lib/tasks/gitlab/bulk_add_permission.rake
index c270232edba..0e1a3d071e9 100644
--- a/lib/tasks/gitlab/bulk_add_permission.rake
+++ b/lib/tasks/gitlab/bulk_add_permission.rake
@@ -15,10 +15,34 @@ namespace :gitlab do
desc "GITLAB | Add a specific user to all projects (as a developer)"
task :user_to_projects, [:email] => :environment do |t, args|
- user = User.find_by_email args.email
+ user = User.find_by(email: args.email)
project_ids = Project.pluck(:id)
puts "Importing #{user.email} users into #{project_ids.size} projects"
UsersProject.add_users_into_projects(project_ids, Array.wrap(user.id), UsersProject::DEVELOPER)
end
+
+ desc "GITLAB | Add all users to all groups (admin users are added as owners)"
+ task all_users_to_all_groups: :environment do |t, args|
+ user_ids = User.where(admin: false).pluck(:id)
+ admin_ids = User.where(admin: true).pluck(:id)
+ groups = Group.all
+
+ puts "Importing #{user_ids.size} users into #{groups.size} groups"
+ puts "Importing #{admin_ids.size} admins into #{groups.size} groups"
+ groups.each do |group|
+ group.add_users(user_ids, UsersGroup::DEVELOPER)
+ group.add_users(admin_ids, UsersGroup::OWNER)
+ end
+ end
+
+ desc "GITLAB | Add a specific user to all groups (as a developer)"
+ task :user_to_groups, [:email] => :environment do |t, args|
+ user = User.find_by_email args.email
+ groups = Group.all
+ puts "Importing #{user.email} users into #{groups.size} groups"
+ groups.each do |group|
+ group.add_users(Array.wrap(user.id), UsersGroup::DEVELOPER)
+ end
+ end
end
end
diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index 20d5f03d6ef..c91dedf74c7 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -279,8 +279,6 @@ namespace :gitlab do
start_checking "Environment"
check_gitlab_git_config
- check_python2_exists
- check_python2_version
finished_checking "Environment"
end
@@ -314,52 +312,6 @@ namespace :gitlab do
fix_and_rerun
end
end
-
- def check_python2_exists
- print "Has python2? ... "
-
- # Python prints its version to STDERR
- # so we can't just use run("python2 --version")
- if run_and_match("which python2", /python2$/)
- puts "yes".green
- else
- puts "no".red
- try_fixing_it(
- "Make sure you have Python 2.5+ installed",
- "Link it to python2"
- )
- for_more_information(
- see_installation_guide_section "Packages / Dependencies"
- )
- fix_and_rerun
- end
- end
-
- def check_python2_version
- print "python2 is supported version? ... "
-
- # Python prints its version to STDERR
- # so we can't just use run("python2 --version")
-
- unless run_and_match("which python2", /python2$/)
- puts "can't check because of previous errors".magenta
- return
- end
-
- if `python2 --version 2>&1` =~ /2\.[567]\.\d/
- puts "yes".green
- else
- puts "no".red
- try_fixing_it(
- "Make sure you have Python 2.5+ installed",
- "Link it to python2"
- )
- for_more_information(
- see_installation_guide_section "Packages / Dependencies"
- )
- fix_and_rerun
- end
- end
end
@@ -682,6 +634,8 @@ namespace :gitlab do
namespace :ldap do
task :check, [:limit] => :environment do |t, args|
+ # Only show up to 100 results because LDAP directories can be very big.
+ # This setting only affects the `rake gitlab:check` script.
args.with_defaults(limit: 100)
warn_user_is_not_gitlab
start_checking "LDAP"
@@ -696,7 +650,7 @@ namespace :gitlab do
end
def print_users(limit)
- puts "LDAP users with access to your GitLab server (limit: #{limit}):"
+ puts "LDAP users with access to your GitLab server (only showing the first #{limit} results)"
ldap.search(attributes: attributes, filter: filter, size: limit, return_result: false) do |entry|
puts "DN: #{entry.dn}\t#{ldap_config.uid}: #{entry[ldap_config.uid]}"
end
diff --git a/lib/tasks/gitlab/enable_namespaces.rake b/lib/tasks/gitlab/enable_namespaces.rake
index 927748c0fd5..201f34ab546 100644
--- a/lib/tasks/gitlab/enable_namespaces.rake
+++ b/lib/tasks/gitlab/enable_namespaces.rake
@@ -43,13 +43,13 @@ namespace :gitlab do
username.gsub!("+", ".")
# return username if no matches
- return username unless User.find_by_username(username)
+ return username unless User.find_by(username: username)
# look for same username
(1..10).each do |i|
suffixed_username = "#{username}#{i}"
- return suffixed_username unless User.find_by_username(suffixed_username)
+ return suffixed_username unless User.find_by(username: suffixed_username)
end
end
diff --git a/lib/tasks/gitlab/import.rake b/lib/tasks/gitlab/import.rake
index 8fa89270854..cbfa736c84c 100644
--- a/lib/tasks/gitlab/import.rake
+++ b/lib/tasks/gitlab/import.rake
@@ -2,12 +2,12 @@ namespace :gitlab do
namespace :import do
# How to use:
#
- # 1. copy your bare repos under git repos_path
- # 2. run bundle exec rake gitlab:import:repos RAILS_ENV=production
+ # 1. copy the bare repos under the repos_path (commonly /home/git/repositories)
+ # 2. run: bundle exec rake gitlab:import:repos RAILS_ENV=production
#
# Notes:
- # * project owner will be a first admin
- # * existing projects will be skipped
+ # * The project owner will set to the first administator of the system
+ # * Existing projects will be skipped
#
desc "GITLAB | Import bare repositories from gitlab_shell -> repos_path into GitLab project instance"
task repos: :environment do
@@ -50,7 +50,7 @@ namespace :gitlab do
# find group namespace
if group_name
- group = Group.find_by_path(group_name)
+ group = Group.find_by(path: group_name)
# create group namespace
if !group
group = Group.new(:name => group_name)
@@ -66,7 +66,7 @@ namespace :gitlab do
project_params[:namespace_id] = group.id
end
- project = Projects::CreateContext.new(user, project_params).execute
+ project = Projects::CreateService.new(user, project_params).execute
if project.valid?
puts " * Created #{project.name} (#{repo_path})".green