diff --git a/app/assets/stylesheets/gitlab_bootstrap/common.scss b/app/assets/stylesheets/gitlab_bootstrap/common.scss index cb292bc711fa14123278a3e0bf3590752ebcd97b..dcfd610e2c4f4d0ac816320341013b70322f5d76 100644 --- a/app/assets/stylesheets/gitlab_bootstrap/common.scss +++ b/app/assets/stylesheets/gitlab_bootstrap/common.scss @@ -20,6 +20,7 @@ .hint { font-style: italic; color: #999; } .light { color: #888 } .tiny { font-weight: normal } +.vtop { vertical-align: top; } /** ALERT MESSAGES **/ diff --git a/app/controllers/graph_controller.rb b/app/controllers/graph_controller.rb index 30ec5e89db2e99bee4695b546a4b4bd946f6667a..c370433e500a4c8cd6d050d952d4efb7fba503c0 100644 --- a/app/controllers/graph_controller.rb +++ b/app/controllers/graph_controller.rb @@ -7,10 +7,20 @@ class GraphController < ProjectResourceController before_filter :require_non_empty_project def show + if params.has_key?(:q) && params[:q].blank? + redirect_to project_graph_path(@project, params[:id]) + return + end + + if params.has_key?(:q) + @q = params[:q] + @commit = @project.repository.commit(@q) || @commit + end + respond_to do |format| format.html format.json do - graph = Gitlab::Graph::JsonBuilder.new(project, @ref) + graph = Gitlab::Graph::JsonBuilder.new(project, @ref, @commit) render :json => graph.to_json end end diff --git a/app/controllers/public/projects_controller.rb b/app/controllers/public/projects_controller.rb index 4108fe5f363aafc1a49fcdc73fff4b12c4897149..b929b23e68cba53db8343866d01c295b3fbb9380 100644 --- a/app/controllers/public/projects_controller.rb +++ b/app/controllers/public/projects_controller.rb @@ -6,7 +6,7 @@ class Public::ProjectsController < ApplicationController layout 'public' def index - @projects = Project.public + @projects = Project.public_only @projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]).per(20) end end diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index cbac7613e597d3ec30c36508c59651225693e458..b7ee75619cb50428ee12327cfee4e9480e2163ab 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -1,6 +1,17 @@ class RegistrationsController < Devise::RegistrationsController before_filter :signup_enabled? + def destroy + if current_user.owned_projects.count > 0 + redirect_to account_profile_path, alert: "Remove projects and groups before removing account." and return + end + current_user.destroy + + respond_to do |format| + format.html { redirect_to new_user_session_path, notice: "Account successfully removed." } + end + end + private def signup_enabled? diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 8872cf59a2cfa17fed8f461dc7e9037090911082..645b35ec660506107683f23186c626c277b25ac9 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -19,12 +19,12 @@ module Issuable validates :title, presence: true, length: { within: 0..255 } validates :closed, inclusion: { in: [true, false] } - scope :opened, where(closed: false) - scope :closed, where(closed: true) + scope :opened, -> { where(closed: false) } + scope :closed, -> { where(closed: true) } scope :of_group, ->(group) { where(project_id: group.project_ids) } scope :of_user_team, ->(team) { where(project_id: team.project_ids, assignee_id: team.member_ids) } scope :assigned, ->(u) { where(assignee_id: u.id)} - scope :recent, order("created_at DESC") + scope :recent, -> { order("created_at DESC") } delegate :name, :email, diff --git a/app/models/event.rb b/app/models/event.rb index d0ba61544d1157af3595a5e9339ae45eee0f5928..97b1e3306aa95ee08632c2b95e11cb498f1576fc 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -42,8 +42,8 @@ class Event < ActiveRecord::Base serialize :data # Scopes - scope :recent, order("created_at DESC") - scope :code_push, where(action: Pushed) + scope :recent, -> { order("created_at DESC") } + scope :code_push, -> { where(action: Pushed) } scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent } class << self diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 8b4c895dc17c288a45ed93a8c6236862a1ff4e17..457fe18f35b9fb689e3fc27b3a0b5c7002745a71 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -20,8 +20,8 @@ class Milestone < ActiveRecord::Base has_many :issues has_many :merge_requests - scope :active, where(closed: false) - scope :closed, where(closed: true) + scope :active, -> { where(closed: false) } + scope :closed, -> { where(closed: true) } validates :title, presence: true validates :project, presence: true diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 547d383d911f34a8d13e18d96edb1aeb164d0a99..4e157839369bdab3ff6c41ce013e195aeb704ce6 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -29,7 +29,7 @@ class Namespace < ActiveRecord::Base after_update :move_dir after_destroy :rm_dir - scope :root, where('type IS NULL') + scope :root, -> { where('type IS NULL') } def self.search query where("name LIKE :query OR path LIKE :query", query: "%#{query}%") diff --git a/app/models/note.rb b/app/models/note.rb index ded126b4bf1c6591c99501e606443fa0a00df3b5..97f6bf6e3a73f6a273bca4572c67c49be75ba90e 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -43,8 +43,8 @@ class Note < ActiveRecord::Base # Scopes scope :for_commit_id, ->(commit_id) { where(noteable_type: "Commit", commit_id: commit_id) } - scope :inline, where("line_code IS NOT NULL") - scope :not_inline, where("line_code IS NULL") + scope :inline, -> { where("line_code IS NOT NULL") } + scope :not_inline, -> { where("line_code IS NULL") } scope :common, ->{ where(noteable_type: ["", nil]) } scope :fresh, ->{ order("created_at ASC, id ASC") } diff --git a/app/models/project.rb b/app/models/project.rb index 8c747743813c42bfae3b73a4a27c46a716f20086..acc1b8d232870682b4dc24f787a5cd782f733d1d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -91,7 +91,7 @@ class Project < ActiveRecord::Base scope :sorted_by_activity, ->() { order("(SELECT max(events.created_at) FROM events WHERE events.project_id = projects.id) DESC") } scope :personal, ->(user) { where(namespace_id: user.namespace_id) } scope :joined, ->(user) { where("namespace_id != ?", user.namespace_id) } - scope :public, where(public: true) + scope :public_only, -> { where(public: true) } class << self def abandoned diff --git a/app/models/snippet.rb b/app/models/snippet.rb index 806d346cf1084d0e4c3f2d96894ee62c084b1de2..c4ee35e055696f1df901ae5a27364b2386b8c077 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -31,9 +31,9 @@ class Snippet < ActiveRecord::Base validates :content, presence: true # Scopes - scope :fresh, order("created_at DESC") - scope :non_expired, where(["expires_at IS NULL OR expires_at > ?", Time.current]) - scope :expired, where(["expires_at IS NOT NULL AND expires_at < ?", Time.current]) + scope :fresh, -> { order("created_at DESC") } + scope :non_expired, -> { where(["expires_at IS NULL OR expires_at > ?", Time.current]) } + scope :expired, -> { where(["expires_at IS NOT NULL AND expires_at < ?", Time.current]) } def self.content_types [ diff --git a/app/models/user.rb b/app/models/user.rb index 5b0df09a439780bbcc90ae731ffabb3e8af6bac6..8c1a8b42b672d775c18c0019962a89f1c01630b1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -87,10 +87,10 @@ class User < ActiveRecord::Base delegate :path, to: :namespace, allow_nil: true, prefix: true # Scopes - scope :admins, where(admin: true) - scope :blocked, where(blocked: true) - scope :active, where(blocked: false) - scope :alphabetically, order('name ASC') + scope :admins, -> { where(admin: true) } + scope :blocked, -> { where(blocked: true) } + scope :active, -> { where(blocked: false) } + scope :alphabetically, -> { order('name ASC') } scope :in_team, ->(team){ where(id: team.member_ids) } scope :not_in_team, ->(team){ where('users.id NOT IN (:ids)', ids: team.member_ids) } scope :potential_team_members, ->(team) { team.members.any? ? active.not_in_team(team) : active } diff --git a/app/models/users_project.rb b/app/models/users_project.rb index dd8ceb9da70e51ef7a16c548530948435c665d92..486aaa6966a4ded3168c4d6c8953064f4d10416c 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -32,10 +32,10 @@ class UsersProject < ActiveRecord::Base delegate :name, :username, :email, to: :user, prefix: true - scope :guests, where(project_access: GUEST) - scope :reporters, where(project_access: REPORTER) - scope :developers, where(project_access: DEVELOPER) - scope :masters, where(project_access: MASTER) + scope :guests, -> { where(project_access: GUEST) } + scope :reporters, -> { where(project_access: REPORTER) } + scope :developers, -> { where(project_access: DEVELOPER) } + scope :masters, -> { where(project_access: MASTER) } scope :in_project, ->(project) { where(project_id: project.id) } scope :in_projects, ->(projects) { where(project_id: project_ids) } diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index 51b05c05993cf647530ffeea93da4546b4ad017e..48876338a23bb771136bdb732610987cf4b153a9 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -11,17 +11,17 @@ .clearfix = f.label :name .input - = f.text_field :name, required: true + = f.text_field :name, required: true, autocomplete: "off" %span.help-inline * required .clearfix = f.label :username .input - = f.text_field :username, required: true + = f.text_field :username, required: true, autocomplete: "off" %span.help-inline * required .clearfix = f.label :email .input - = f.text_field :email, required: true + = f.text_field :email, required: true, autocomplete: "off" %span.help-inline * required %fieldset diff --git a/app/views/graph/_head.html.haml b/app/views/graph/_head.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..fba9a958a191426605884fb2a9dbf834e43382dd --- /dev/null +++ b/app/views/graph/_head.html.haml @@ -0,0 +1,16 @@ +%h3.page_title Project Network Graph +%hr + +.clearfix + .pull-left + = render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path} + + .search.pull-right + = form_tag project_graph_path(@project, params[:id]), method: :get do |f| + .control-group + = label_tag :search , "Looking for commit:", class: 'control-label light' + .controls + = text_field_tag :q, @q, placeholder: "Input SHA", class: "search-input xlarge" + = button_tag type: 'submit', class: 'btn vtop' do + %i.icon-search + diff --git a/app/views/graph/show.html.haml b/app/views/graph/show.html.haml index ca3a8706313ee75af30ccab845ae850aac356760..e45aca1ddcba18918dbc31878a038ffd451ab33b 100644 --- a/app/views/graph/show.html.haml +++ b/app/views/graph/show.html.haml @@ -1,7 +1,4 @@ -%h3.page_title Project Network Graph -%br -= render partial: 'shared/ref_switcher', locals: {destination: 'graph', path: @path} -%br += render "head" .graph_holder %h4 %small You can move around the graph by using the arrow keys. @@ -12,8 +9,9 @@ var branch_graph; $(function(){ branch_graph = new BranchGraph($("#holder"), { - url: '#{project_graph_path(@project, @ref, format: :json)}', + url: '#{project_graph_path(@project, @ref, q: @q, format: :json)}', commit_url: '#{project_commit_path(@project, 'ae45ca32').gsub("ae45ca32", "%s")}', - ref: '#{@ref}' + ref: '#{@ref}', + commit_id: '#{@commit.id}' }); }); diff --git a/app/views/profiles/account.html.haml b/app/views/profiles/account.html.haml index 2ad000b815bd86cf36e85478b511e87c98adaa00..5465d1f96e9edc1c6f6c3ee6ae0672ebad346061 100644 --- a/app/views/profiles/account.html.haml +++ b/app/views/profiles/account.html.haml @@ -77,4 +77,10 @@ .input = f.submit 'Save username', class: "btn btn-save" - +- if Gitlab.config.gitlab.signup_enabled + %fieldset.remove-account + %legend + Remove account + %small.cred.pull-right + Before removing the account you must remove all projects! + = link_to 'Delete account', user_registration_path, confirm: "REMOVE #{current_user.name}? Are you sure?", method: :delete, class: "btn btn-remove delete-key btn-small pull-right" \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 366ed85cbc6204eadc41be747af52d284eb3d0a3..125ec6bc5880b2982d4b4914556ea19e9c869a42 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -167,12 +167,12 @@ Gitlab::Application.routes.draw do get "files" end + resources :blob, only: [:show], constraints: {id: /.+/} resources :tree, only: [:show, :edit, :update], constraints: {id: /.+/} resources :commit, only: [:show], constraints: {id: /[[:alnum:]]{6,40}/} resources :commits, only: [:show], constraints: {id: /.+/} resources :compare, only: [:index, :create] resources :blame, only: [:show], constraints: {id: /.+/} - resources :blob, only: [:show], constraints: {id: /.+/} resources :graph, only: [:show], constraints: {id: /.+/} match "/compare/:from...:to" => "compare#show", as: "compare", :via => [:get, :post], constraints: {from: /.+/, to: /.+/} diff --git a/doc/api/repositories.md b/doc/api/repositories.md index bc6ca70aa50064045cdd836797a07e1a7abbb50c..fd0ef1f53eb51aa218630828367d741097091aeb 100644 --- a/doc/api/repositories.md +++ b/doc/api/repositories.md @@ -79,6 +79,9 @@ Parameters: } ``` +Will return status code `200` on success or `404 Not found` if the branch is not available. + + ## Protect a project repository branch Protect a single project repository branch. diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 293353ab286869cb51f0f42be6f122a2fb2312ad..f8c9701ecaf714103118b4e75bca7779ca1fa78d 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -265,6 +265,7 @@ module Gitlab # GET /projects/:id/repository/branches/:branch get ":id/repository/branches/:branch" do @branch = user_project.repo.heads.find { |item| item.name == params[:branch] } + not_found!("Branch does not exist") if @branch.nil? present @branch, with: Entities::RepoObject, project: user_project end diff --git a/lib/extracts_path.rb b/lib/extracts_path.rb index 976ac01820429b285a215200e42e7e7641bfeae7..fb595e18b2401123d9b47d4ff2a29c1c9136ca6d 100644 --- a/lib/extracts_path.rb +++ b/lib/extracts_path.rb @@ -117,7 +117,10 @@ module ExtractsPath @id = File.join(@ref, @path) - @commit = CommitDecorator.decorate(@project.repository.commit(@ref)) + # It is used "@project.repository.commits(@ref, @path, 1, 0)", + # because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name. + commits = @project.repository.commits(@ref, @path, 1, 0) + @commit = CommitDecorator.decorate(commits.first) @tree = Tree.new(@commit.tree, @ref, @path) @tree = TreeDecorator.new(@tree) diff --git a/lib/gitlab/graph/json_builder.rb b/lib/gitlab/graph/json_builder.rb index 4b3687e06c36f48abe9718c6daab736629544865..cc971a245a7044a36ced79bea36d52fc2b6a75ab 100644 --- a/lib/gitlab/graph/json_builder.rb +++ b/lib/gitlab/graph/json_builder.rb @@ -9,9 +9,10 @@ module Gitlab @max_count ||= 650 end - def initialize project, ref + def initialize project, ref, commit @project = project @ref = ref + @commit = commit @repo = project.repo @ref_cache = {} @@ -31,7 +32,8 @@ module Gitlab # Get commits from repository # def collect_commits - @commits = Grit::Commit.find_all(repo, nil, {max_count: self.class.max_count}).dup + + @commits = Grit::Commit.find_all(repo, nil, {topo_order: true, max_count: self.class.max_count, skip: to_commit}).dup # Decorate with app/models/commit.rb @commits.map! { |commit| ::Commit.new(commit) } @@ -49,41 +51,28 @@ module Gitlab # list of commits. As well as returns date list # corelated with time set on commits. # - # @param [Array] comits to index + # @param [Array] commits to index # # @return [Array] list of commit dates corelated with time on commits def index_commits - days, heads, times = [], [], [] + days, times = [], [] map = {} commits.reverse.each_with_index do |c,i| c.time = i days[i] = c.committed_date map[c.id] = c - heads += c.refs unless c.refs.nil? times[i] = c end - heads.select!{|h| h.is_a? Grit::Head or h.is_a? Grit::Remote} - # sort heads so the master is top and current branches are closer - heads.sort! do |a,b| - if a.name == @ref - -1 - elsif b.name == @ref - 1 - else - b.commit.committed_date <=> a.commit.committed_date - end - end - @_reserved = {} days.each_index do |i| @_reserved[i] = [] end - heads.each do |h| - if map.include? h.commit.id then - place_chain(map[h.commit.id], map) + commits_sort_by_ref.each do |commit| + if map.include? commit.id then + place_chain(map[commit.id], map) end end @@ -95,6 +84,45 @@ module Gitlab days end + # Skip count that the target commit is displayed in center. + def to_commit + commits = Grit::Commit.find_all(repo, nil, {topo_order: true}) + commit_index = commits.index do |c| + c.id == @commit.id + end + + if commit_index && (self.class.max_count / 2 < commit_index) then + # get max index that commit is displayed in the center. + commit_index - self.class.max_count / 2 + else + 0 + end + end + + def commits_sort_by_ref + commits.sort do |a,b| + if include_ref?(a) + -1 + elsif include_ref?(b) + 1 + else + b.committed_date <=> a.committed_date + end + end + end + + def include_ref?(commit) + heads = commit.refs.select do |ref| + ref.is_a?(Grit::Head) or ref.is_a?(Grit::Remote) or ref.is_a?(Grit::Tag) + end + + heads.map! do |head| + head.name + end + + heads.include?(@ref) + end + def find_free_parent_spaces(commit, map, times) spaces = [] diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake index 4e252f026bc0b48e2599c302be65e813bfe39028..6a1383960877f91972dd2d758ae245385ef552ee 100644 --- a/lib/tasks/gitlab/check.rake +++ b/lib/tasks/gitlab/check.rake @@ -311,7 +311,7 @@ namespace :gitlab do "Remove \"-e \" so the line starts with PATH" ) for_more_information( - see_installation_guide_section("Gitolite"), + see_installation_guide_section("Gitlab Shell"), "https://github.com/gitlabhq/gitlabhq/issues/1059" ) fix_and_rerun @@ -368,10 +368,10 @@ namespace :gitlab do namespace :gitlab_shell do - desc "GITLAB | Check the configuration of Gitolite" + desc "GITLAB | Check the configuration of Gitlab Shell" task check: :environment do warn_user_is_not_gitlab - start_checking "Gitolite" + start_checking "Gitlab Shell" check_repo_base_exists check_repo_base_is_not_symlink @@ -380,7 +380,7 @@ namespace :gitlab do check_post_receive_hook_is_up_to_date check_repos_post_receive_hooks_is_link - finished_checking "Gitolite" + finished_checking "Gitlab Shell" end @@ -392,7 +392,7 @@ namespace :gitlab do print "post-receive hook up-to-date? ... " hook_file = "post-receive" - gitlab_shell_hooks_path = File.join(Gitlab.config.gitlab_shell.hooks_path, "common") + gitlab_shell_hooks_path = Gitlab.config.gitlab_shell.hooks_path gitlab_shell_hook_file = File.join(gitlab_shell_hooks_path, hook_file) gitlab_shell_ssh_user = Gitlab.config.gitlab_shell.ssh_user @@ -401,22 +401,7 @@ namespace :gitlab do return end - gitlab_shell_hook_content = File.read(gitlab_shell_hook_file) - gitlab_hook_file = Rails.root.join.join("lib", "hooks", hook_file) - gitlab_hook_content = File.read(gitlab_hook_file) - - if gitlab_shell_hook_content == gitlab_hook_content - puts "yes".green - else - puts "no".red - try_fixing_it( - "sudo -u #{gitlab_shell_ssh_user} cp #{gitlab_hook_file} #{gitlab_shell_hook_file}" - ) - for_more_information( - see_installation_guide_section "Setup GitLab Hooks" - ) - fix_and_rerun - end + puts "yes".green end def check_repo_base_exists @@ -430,12 +415,12 @@ namespace :gitlab do puts "no".red puts "#{repo_base_path} is missing".red try_fixing_it( - "This should have been created when setting up Gitolite.", + "This should have been created when setting up Gitlab Shell.", "Make sure it's set correctly in config/gitlab.yml", - "Make sure Gitolite is installed correctly." + "Make sure Gitlab Shell is installed correctly." ) for_more_information( - see_installation_guide_section "Gitolite" + see_installation_guide_section "Gitlab Shell" ) fix_and_rerun end @@ -480,7 +465,7 @@ namespace :gitlab do "find #{repo_base_path} -type d -print0 | sudo xargs -0 chmod g+s" ) for_more_information( - see_installation_guide_section "Gitolite" + see_installation_guide_section "Gitlab Shell" ) fix_and_rerun end @@ -506,7 +491,7 @@ namespace :gitlab do "sudo chown -R #{gitlab_shell_ssh_user}:#{gitlab_shell_owner_group} #{repo_base_path}" ) for_more_information( - see_installation_guide_section "Gitolite" + see_installation_guide_section "Gitlab Shell" ) fix_and_rerun end @@ -516,7 +501,7 @@ namespace :gitlab do print "post-receive hooks in repos are links: ... " hook_file = "post-receive" - gitlab_shell_hooks_path = File.join(Gitlab.config.gitlab_shell.hooks_path, "common") + gitlab_shell_hooks_path = Gitlab.config.gitlab_shell.hooks_path gitlab_shell_hook_file = File.join(gitlab_shell_hooks_path, hook_file) gitlab_shell_ssh_user = Gitlab.config.gitlab_shell.ssh_user @@ -545,7 +530,7 @@ namespace :gitlab do "sudo -u #{gitlab_shell_ssh_user} ln -sf #{gitlab_shell_hook_file} #{project_hook_file}" ) for_more_information( - "lib/support/rewrite-hooks.sh" + "#{gitlab_shell_user_home}/gitlab-shell/support/rewrite-hooks.sh" ) fix_and_rerun next @@ -555,7 +540,7 @@ namespace :gitlab do File.realpath(project_hook_file) == File.realpath(gitlab_shell_hook_file) puts "ok".green else - puts "not a link to Gitolite's hook".red + puts "not a link to Gitlab Shell's hook".red try_fixing_it( "sudo -u #{gitlab_shell_ssh_user} ln -sf #{gitlab_shell_hook_file} #{project_hook_file}" ) @@ -577,7 +562,7 @@ namespace :gitlab do end def gitlab_shell_version - gitlab_shell_version_file = "#{gitlab_shell_user_home}/gitlab_shell/src/VERSION" + gitlab_shell_version_file = "#{gitlab_shell_user_home}/gitlab-shell/VERSION" if File.readable?(gitlab_shell_version_file) File.read(gitlab_shell_version_file) end diff --git a/lib/tasks/sidekiq.rake b/lib/tasks/sidekiq.rake index 67e8daafec7dbab1e333ebf7e1470a34c151c83d..cf99951e02795df1139e866b0a61fe7ef28466c0 100644 --- a/lib/tasks/sidekiq.rake +++ b/lib/tasks/sidekiq.rake @@ -8,7 +8,12 @@ namespace :sidekiq do task :start do run "nohup bundle exec sidekiq -q post_receive,mailer,system_hook,project_web_hook,gitlab_shell,common,default -e #{Rails.env} -P #{pidfile} >> #{Rails.root.join("log", "sidekiq.log")} 2>&1 &" end - + + desc "GITLAB | Start sidekiq with launchd on Mac OS X" + task :launchd do + run "bundle exec sidekiq -q post_receive,mailer,system_hook,project_web_hook,gitlab_shell,common,default -e #{Rails.env} -P #{pidfile} >> #{Rails.root.join("log", "sidekiq.log")} 2>&1" + end + def pidfile Rails.root.join("tmp", "pids", "sidekiq.pid") end diff --git a/spec/factories.rb b/spec/factories.rb index 0e0c04f98751ef17db30e5dd1d88b8a64f6b400b..ae9066cb30c0b1f27f028fec0792a5e2ef812215 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -123,7 +123,7 @@ FactoryGirl.define do factory :event do factory :closed_issue_event do project - action Event::Closed + action { Event::Closed } target factory: :closed_issue author factory: :user end diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 9881ece350605a84ed97058f717620d924c509d7..7a3677d157d1d87b76235dfe146245e639192602 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -115,6 +115,11 @@ describe Gitlab::API do json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' json_response['protected'].should == false end + + it "should return a 404 error if branch is not available" do + get api("/projects/#{project.id}/repository/branches/unknown", user) + response.status.should == 404 + end end describe "PUT /projects/:id/repository/branches/:branch/protect" do diff --git a/spec/requests/profile_spec.rb b/spec/requests/profile_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..c18d8f921a3a60bc95ae8eb397c8f0cd8751dbdc --- /dev/null +++ b/spec/requests/profile_spec.rb @@ -0,0 +1,48 @@ +require 'spec_helper' + +describe "Profile account page" do + let(:user) { create(:user) } + + before do + login_as :user + end + + describe "when signup is enabled" do + before do + Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) + visit account_profile_path + end + it { page.should have_content("Remove account") } + + it "should delete the account", js: true do + expect { click_link "Delete account" }.to change {User.count}.by(-1) + current_path.should == new_user_session_path + end + end + + describe "when signup is enabled and user has a project" do + before do + Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) + @project = create(:project, namespace: @user.namespace) + @project.team << [@user, :master] + visit account_profile_path + end + it { page.should have_content("Remove account") } + + it "should not allow user to delete the account" do + expect { click_link "Delete account" }.not_to change {User.count}.by(-1) + end + end + + describe "when signup is disabled" do + before do + Gitlab.config.gitlab.stub(:signup_enabled).and_return(false) + visit account_profile_path + end + + it "should not have option to remove account" do + page.should_not have_content("Remove account") + current_path.should == account_profile_path + end + end +end \ No newline at end of file diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb index f94bedc79a1d1cb36edd6402cf32686c25da13e0..9cf5d91349f5fd6067e7816477846ee557a1a747 100644 --- a/spec/routing/project_routing_spec.rb +++ b/spec/routing/project_routing_spec.rb @@ -392,6 +392,7 @@ end describe BlobController, "routing" do it "to #show" do get("/gitlabhq/blob/master/app/models/project.rb").should route_to('blob#show', project_id: 'gitlabhq', id: 'master/app/models/project.rb') + get("/gitlabhq/blob/master/app/models/compare.rb").should route_to('blob#show', project_id: 'gitlabhq', id: 'master/app/models/compare.rb') end end diff --git a/vendor/assets/javascripts/branch-graph.js b/vendor/assets/javascripts/branch-graph.js index 7929d3b2a14c867e607d71547883a25dfb452004..fb22953acd284aa51761b0fc80bac6957824dca8 100644 --- a/vendor/assets/javascripts/branch-graph.js +++ b/vendor/assets/javascripts/branch-graph.js @@ -161,14 +161,23 @@ if (this.commits[i].refs) { this.appendLabel(x, y, this.commits[i].refs); - - // The main branch is displayed in the center. - re = new RegExp('(^| )' + this.options.ref + '( |$)'); - if (this.commits[i].refs.match(re)) { - scrollLeft = x - graphWidth / 2; - } } + // mark commit and displayed in the center + if (this.commits[i].id == this.options.commit_id) { + r.path([ + 'M', x, y - 5, + 'L', x + 4, y - 15, + 'L', x - 4, y - 15, + 'Z' + ]).attr({ + "fill": "#000", + "fill-opacity": .7, + "stroke": "none" + }); + scrollLeft = x - graphWidth / 2; + } + this.appendAnchor(top, this.commits[i], x, y); } top.toFront();