From 45b6103997ef07644d78d603938d357a2b3d035a Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Mon, 24 Dec 2012 20:01:49 +0200
Subject: [PATCH 01/23] Update projects in gitolite after namespace moved.
 Added rake task to cleanup garbage from gitolite

---
 app/models/namespace.rb                | 11 +++++++++
 app/roles/namespaced_project.rb        |  2 +-
 lib/tasks/gitlab/gitolite_rebuild.rake | 33 ++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 8c90f5aee26..96f8f291451 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -27,10 +27,13 @@ class Namespace < ActiveRecord::Base
 
   after_create :ensure_dir_exist
   after_update :move_dir
+  after_commit :update_gitolite, on: :update, if: :require_update_gitolite
   after_destroy :rm_dir
 
   scope :root, where('type IS NULL')
 
+  attr_accessor :require_update_gitolite
+
   def self.search query
     where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
   end
@@ -62,10 +65,18 @@ class Namespace < ActiveRecord::Base
 
       if system("mv #{old_path} #{new_path}")
         send_update_instructions
+        @require_update_gitolite = true
+      else
+        raise "Namespace move error #{old_path} #{new_path}"
       end
     end
   end
 
+  def update_gitolite
+    @require_update_gitolite = false
+    projects.each(&:update_repository)
+  end
+
   def rm_dir
     dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
     system("rm -rf #{dir_path}")
diff --git a/app/roles/namespaced_project.rb b/app/roles/namespaced_project.rb
index 8656890a456..dbd533f8494 100644
--- a/app/roles/namespaced_project.rb
+++ b/app/roles/namespaced_project.rb
@@ -24,7 +24,7 @@ module NamespacedProject
       save!
     end
   rescue Gitlab::ProjectMover::ProjectMoveError => ex
-    raise TransferError.new(ex.message)
+    raise Project::TransferError.new(ex.message)
   end
 
   def name_with_namespace
diff --git a/lib/tasks/gitlab/gitolite_rebuild.rake b/lib/tasks/gitlab/gitolite_rebuild.rake
index fce10eb5b69..41b48f73d8f 100644
--- a/lib/tasks/gitlab/gitolite_rebuild.rake
+++ b/lib/tasks/gitlab/gitolite_rebuild.rake
@@ -20,5 +20,38 @@ namespace :gitlab do
       end
       puts "Done with keys"
     end
+
+    desc "GITLAB | Cleanup gitolite config"
+    task :cleanup => :environment  do
+      warn_user_is_not_gitlab
+
+      real_repos = Project.all.map(&:path_with_namespace)
+      real_repos << "gitolite-admin"
+      real_repos << "@all"
+
+      remove_flag = ENV['REMOVE']
+
+      puts "Looking for repositories to remove... "
+      Gitlab::GitoliteConfig.new.apply do |config|
+        all_repos = []
+        garbage_repos = []
+
+        all_repos = config.conf.repos.keys
+        garbage_repos = all_repos - real_repos
+
+        garbage_repos.each do |repo_name|
+          if remove_flag
+            config.conf.rm_repo(repo_name)
+            print "to remove...".red
+          end
+
+          puts repo_name.red
+        end
+      end
+
+      unless remove_flag
+        puts "To cleanup repositories run this command with REMOVE=true".yellow
+      end
+    end
   end
 end
-- 
GitLab


From 19cb29e448f8959d86dde38f8f85ad01c3e1bb72 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Mon, 24 Dec 2012 21:27:12 +0200
Subject: [PATCH 02/23] Fix MR count for group scope

---
 app/views/layouts/group.html.haml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml
index d40d9525bb8..f47e8b3e9ff 100644
--- a/app/views/layouts/group.html.haml
+++ b/app/views/layouts/group.html.haml
@@ -15,7 +15,7 @@
         = nav_link(path: 'groups#merge_requests') do
           = link_to merge_requests_group_path(@group) do
             Merge Requests
-            %span.count= current_user.cared_merge_requests.of_group(@group).count
+            %span.count= current_user.cared_merge_requests.opened.of_group(@group).count
         = nav_link(path: 'groups#search') do
           = link_to "Search", search_group_path(@group)
         = nav_link(path: 'groups#people') do
-- 
GitLab


From c68540e9c94eed7dbe7683e47450b026c9ee3bb6 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Wed, 26 Dec 2012 19:56:56 +0200
Subject: [PATCH 03/23] Fix resque for postgres

---
 config/initializers/4_resque.rb | 2 ++
 lib/tasks/resque.rake           | 1 +
 2 files changed, 3 insertions(+)

diff --git a/config/initializers/4_resque.rb b/config/initializers/4_resque.rb
index 419dbe06061..03c2b785fae 100644
--- a/config/initializers/4_resque.rb
+++ b/config/initializers/4_resque.rb
@@ -27,3 +27,5 @@ Resque::Server.use Authentication
 
 # Mailer
 Resque::Mailer.excluded_environments = []
+
+Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
diff --git a/lib/tasks/resque.rake b/lib/tasks/resque.rake
index 0825324a424..bf031403db8 100644
--- a/lib/tasks/resque.rake
+++ b/lib/tasks/resque.rake
@@ -4,6 +4,7 @@ task "resque:setup" => :environment do
   Resque.after_fork do
     Resque.redis.client.reconnect
   end
+  Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
 end
 
 desc "Alias for resque:work (To run workers on Heroku)"
-- 
GitLab


From 2edb16612f9491af5c1e0e0b6384661fb972b7cf Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Tue, 25 Dec 2012 07:14:05 +0300
Subject: [PATCH 04/23] Cleanup service tasks

---
 lib/tasks/gitlab/cleanup.rake          | 128 +++++++++++++++++++++++++
 lib/tasks/gitlab/gitolite_rebuild.rake |  33 -------
 2 files changed, 128 insertions(+), 33 deletions(-)
 create mode 100644 lib/tasks/gitlab/cleanup.rake

diff --git a/lib/tasks/gitlab/cleanup.rake b/lib/tasks/gitlab/cleanup.rake
new file mode 100644
index 00000000000..2a0ffe0f4bd
--- /dev/null
+++ b/lib/tasks/gitlab/cleanup.rake
@@ -0,0 +1,128 @@
+namespace :gitlab do
+  namespace :cleanup do
+    desc "GITLAB | Cleanup | Clean gitolite config"
+    task :config => :environment  do
+      warn_user_is_not_gitlab
+
+      real_repos = Project.all.map(&:path_with_namespace)
+      real_repos << "gitolite-admin"
+      real_repos << "@all"
+
+      remove_flag = ENV['REMOVE']
+
+      puts "Looking for repositories to remove... "
+      Gitlab::GitoliteConfig.new.apply do |config|
+        all_repos = []
+        garbage_repos = []
+
+        all_repos = config.conf.repos.keys
+        garbage_repos = all_repos - real_repos
+
+        garbage_repos.each do |repo_name|
+          if remove_flag
+            config.conf.rm_repo(repo_name)
+            print "to remove...".red
+          end
+
+          puts repo_name.red
+        end
+      end
+
+      unless remove_flag
+        puts "To cleanup repositories run this command with REMOVE=true".yellow
+      end
+    end
+
+    desc "GITLAB | Cleanup | Clean namespaces"
+    task :dirs => :environment  do
+      warn_user_is_not_gitlab
+      remove_flag = ENV['REMOVE']
+
+
+      namespaces = Namespace.pluck(:path)
+      git_base_path = Gitlab.config.gitolite.repos_path
+      all_dirs = Dir.glob(git_base_path + '/*')
+
+      puts git_base_path.yellow
+      puts "Looking for directories to remove... "
+
+      all_dirs.reject! do |dir|
+        # skip if git repo
+        dir =~ /.git$/
+      end
+
+      all_dirs.reject! do |dir|
+        dir_name = File.basename dir
+
+        # skip if namespace present
+        namespaces.include?(dir_name)
+      end
+
+      all_dirs.each do |dir_path|
+
+        if remove_flag
+          if FileUtils.rm_rf dir_path
+            puts "Removed...#{dir_path}".red
+          else
+            puts "Cannot remove #{dir_path}".red
+          end
+        else
+          puts "Can be removed: #{dir_path}".red
+        end
+      end
+
+      unless remove_flag
+        puts "To cleanup this directories run this command with REMOVE=true".yellow
+      end
+    end
+
+    desc "GITLAB | Cleanup | Clean respositories"
+    task :repos => :environment  do
+      warn_user_is_not_gitlab
+      remove_flag = ENV['REMOVE']
+
+      git_base_path = Gitlab.config.gitolite.repos_path
+      all_dirs = Dir.glob(git_base_path + '/*')
+
+      global_projects = Project.where(namespace_id: nil).pluck(:path)
+
+      puts git_base_path.yellow
+      puts "Looking for global repos to remove... "
+
+      # skip non git repo
+      all_dirs.select! do |dir|
+        dir =~ /.git$/
+      end
+
+      # skip existing repos
+      all_dirs.reject! do |dir|
+        repo_name = File.basename dir
+        path = repo_name.gsub(/\.git$/, "")
+        global_projects.include?(path)
+      end
+
+      # skip gitolite admin
+      all_dirs.reject! do |dir|
+        repo_name = File.basename dir
+        repo_name == 'gitolite-admin.git'
+      end
+
+
+      all_dirs.each do |dir_path|
+        if remove_flag
+          if FileUtils.rm_rf dir_path
+            puts "Removed...#{dir_path}".red
+          else
+            puts "Cannot remove #{dir_path}".red
+          end
+        else
+          puts "Can be removed: #{dir_path}".red
+        end
+      end
+
+      unless remove_flag
+        puts "To cleanup this directories run this command with REMOVE=true".yellow
+      end
+    end
+  end
+end
diff --git a/lib/tasks/gitlab/gitolite_rebuild.rake b/lib/tasks/gitlab/gitolite_rebuild.rake
index 41b48f73d8f..fce10eb5b69 100644
--- a/lib/tasks/gitlab/gitolite_rebuild.rake
+++ b/lib/tasks/gitlab/gitolite_rebuild.rake
@@ -20,38 +20,5 @@ namespace :gitlab do
       end
       puts "Done with keys"
     end
-
-    desc "GITLAB | Cleanup gitolite config"
-    task :cleanup => :environment  do
-      warn_user_is_not_gitlab
-
-      real_repos = Project.all.map(&:path_with_namespace)
-      real_repos << "gitolite-admin"
-      real_repos << "@all"
-
-      remove_flag = ENV['REMOVE']
-
-      puts "Looking for repositories to remove... "
-      Gitlab::GitoliteConfig.new.apply do |config|
-        all_repos = []
-        garbage_repos = []
-
-        all_repos = config.conf.repos.keys
-        garbage_repos = all_repos - real_repos
-
-        garbage_repos.each do |repo_name|
-          if remove_flag
-            config.conf.rm_repo(repo_name)
-            print "to remove...".red
-          end
-
-          puts repo_name.red
-        end
-      end
-
-      unless remove_flag
-        puts "To cleanup repositories run this command with REMOVE=true".yellow
-      end
-    end
   end
 end
-- 
GitLab


From 91405d1f989010d7e5676b2707e2797b16b62ecd Mon Sep 17 00:00:00 2001
From: "Phil. Austermann" <phil@patient-radio.de>
Date: Thu, 27 Dec 2012 11:03:54 +0100
Subject: [PATCH 05/23] - Fix PostgreSql Migration issue to 4.0 (fixes
 https://github.com/gitlabhq/gitlabhq/issues/2398)

---
 db/migrate/20121218164840_move_noteable_commit_to_own_field.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/db/migrate/20121218164840_move_noteable_commit_to_own_field.rb b/db/migrate/20121218164840_move_noteable_commit_to_own_field.rb
index 6f2da4136a3..f6b97390b93 100644
--- a/db/migrate/20121218164840_move_noteable_commit_to_own_field.rb
+++ b/db/migrate/20121218164840_move_noteable_commit_to_own_field.rb
@@ -5,7 +5,7 @@ class MoveNoteableCommitToOwnField < ActiveRecord::Migration
     Note.where(noteable_type: 'Commit').update_all('commit_id = noteable_id')
 
     if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
-      Note.where("noteable_type != 'Commit'").update_all('new_noteable_id = CAST (noteable_id AS INTEGER)')
+      Note.where("noteable_type != 'Commit'").update_all('new_noteable_id = CAST (CASE noteable_id WHEN \'\' THEN NULL ELSE noteable_id END AS INTEGER)')
     else
       Note.where("noteable_type != 'Commit'").update_all('new_noteable_id = noteable_id')
     end
-- 
GitLab


From 708a0d421e42522c6f10ff272d40db36b2205d96 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Fri, 28 Dec 2012 06:14:05 +0300
Subject: [PATCH 06/23] Fixed and improved enable_naamespace migration task

---
 app/models/namespace.rb                 | 13 +++-
 app/observers/user_observer.rb          |  2 +-
 lib/tasks/gitlab/enable_namespaces.rake | 84 ++++++++++++++++++++-----
 3 files changed, 79 insertions(+), 20 deletions(-)

diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 96f8f291451..d34e5a99c79 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -51,8 +51,17 @@ class Namespace < ActiveRecord::Base
   end
 
   def ensure_dir_exist
-    namespace_dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
-    system("mkdir -m 770 #{namespace_dir_path}") unless File.exists?(namespace_dir_path)
+    unless dir_exists?
+      system("mkdir -m 770 #{namespace_full_path}")
+    end
+  end
+
+  def dir_exists?
+    File.exists?(namespace_full_path)
+  end
+
+  def namespace_full_path
+    @namespace_full_path ||= File.join(Gitlab.config.gitolite.repos_path, path)
   end
 
   def move_dir
diff --git a/app/observers/user_observer.rb b/app/observers/user_observer.rb
index 09b3c1d622f..73a1d00ca3b 100644
--- a/app/observers/user_observer.rb
+++ b/app/observers/user_observer.rb
@@ -14,7 +14,7 @@ class UserObserver < ActiveRecord::Observer
       if user.namespace
         user.namespace.update_attributes(path: user.username)
       else
-        user.create_namespace!(path: user.username, name: user.name)
+        user.create_namespace!(path: user.username, name: user.username)
       end
     end
   end
diff --git a/lib/tasks/gitlab/enable_namespaces.rake b/lib/tasks/gitlab/enable_namespaces.rake
index 1be9ba6469d..ee80c0905cb 100644
--- a/lib/tasks/gitlab/enable_namespaces.rake
+++ b/lib/tasks/gitlab/enable_namespaces.rake
@@ -1,34 +1,87 @@
 namespace :gitlab do
   desc "GITLAB | Enable usernames and namespaces for user projects"
   task enable_namespaces: :environment do
-    print "\nUsernames for users:".yellow
+    warn_user_is_not_gitlab
 
+    migrate_user_namespaces
+    migrate_groups
+    migrate_projects
+
+    puts "Rebuild Gitolite ... "
+    gitolite = Gitlab::Gitolite.new
+    gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
+    puts "... #{"done".green}"
+  end
+
+  def migrate_user_namespaces
+    puts "\nGenerate usernames for users without one: ".blue
     User.find_each(batch_size: 500) do |user|
-      next if user.namespace
+      if user.namespace
+        print '-'.cyan
+        next
+      end
 
-      User.transaction do
-        username = user.email.match(/^[^@]*/)[0]
-        if user.update_attributes!(username: username)
+      username = if user.username.present?
+                   # if user already has username filled
+                   user.username
+                 else
+                   build_username(user)
+                 end
+
+      begin
+        User.transaction do
+          user.update_attributes!(username: username)
           print '.'.green
-        else
-          print 'F'.red
         end
+      rescue
+        print 'F'.red
       end
     end
+    puts "\nDone"
+  end
+
+  def build_username(user)
+    username = nil
+
+    # generate username
+    username = user.email.match(/^[^@]*/)[0]
+    username.gsub!("+", ".")
+
+    # return username if no mathes
+    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)
+    end
+  end
 
-    print "\n\nDirs for groups:".yellow
+  def migrate_groups
+    puts "\nCreate directories for groups: ".blue
 
     Group.find_each(batch_size: 500) do |group|
-      if group.ensure_dir_exist
-        print '.'.green
-      else
+      begin
+        if group.dir_exists?
+          print '-'.cyan
+        else
+          if group.ensure_dir_exist
+            print '.'.green
+          else
+            print 'F'.red
+          end
+        end
+      rescue
         print 'F'.red
       end
     end
+    puts "\nDone"
+  end
 
-    print "\n\nMove projects from groups under groups dirs:".yellow
+  def migrate_projects
     git_path = Gitlab.config.gitolite.repos_path
-
+    puts "\nMove projects in groups into respective directories ... ".blue
     Project.where('namespace_id IS NOT NULL').find_each(batch_size: 500) do |project|
       next unless project.group
 
@@ -59,9 +112,6 @@ namespace :gitlab do
       end
     end
 
-    print "\n\nRebuild gitolite:".yellow
-    gitolite = Gitlab::Gitolite.new
-    gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
-    puts "\n"
+    puts "\nDone"
   end
 end
-- 
GitLab


From 260ab8d67a81b0efac0a389f123dae7c527dacbe Mon Sep 17 00:00:00 2001
From: David Van Duzer <dvd@tennica.net>
Date: Sun, 6 Jan 2013 00:46:40 -0700
Subject: [PATCH 07/23] updating rails to 3.2.10 in response to CVE-2012-5664

See also:
https://github.com/gitlabhq/gitlabhq/issues/2464
http://www.securityfocus.com/bid/57084
---
 Gemfile      |  2 +-
 Gemfile.lock | 58 ++++++++++++++++++++++++++--------------------------
 2 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/Gemfile b/Gemfile
index 49fbcad04fc..213e5659d20 100644
--- a/Gemfile
+++ b/Gemfile
@@ -8,7 +8,7 @@ def linux_only(require_as)
   RUBY_PLATFORM.include?('linux') && require_as
 end
 
-gem "rails", "3.2.9"
+gem "rails", "3.2.10"
 
 # Supported DBs
 gem "mysql2", group: :mysql
diff --git a/Gemfile.lock b/Gemfile.lock
index d8be14ba80a..25903a99ab8 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -81,12 +81,12 @@ GIT
 GEM
   remote: http://rubygems.org/
   specs:
-    actionmailer (3.2.9)
-      actionpack (= 3.2.9)
+    actionmailer (3.2.10)
+      actionpack (= 3.2.10)
       mail (~> 2.4.4)
-    actionpack (3.2.9)
-      activemodel (= 3.2.9)
-      activesupport (= 3.2.9)
+    actionpack (3.2.10)
+      activemodel (= 3.2.10)
+      activesupport (= 3.2.10)
       builder (~> 3.0.0)
       erubis (~> 2.7.0)
       journey (~> 1.0.4)
@@ -94,18 +94,18 @@ GEM
       rack-cache (~> 1.2)
       rack-test (~> 0.6.1)
       sprockets (~> 2.2.1)
-    activemodel (3.2.9)
-      activesupport (= 3.2.9)
+    activemodel (3.2.10)
+      activesupport (= 3.2.10)
       builder (~> 3.0.0)
-    activerecord (3.2.9)
-      activemodel (= 3.2.9)
-      activesupport (= 3.2.9)
+    activerecord (3.2.10)
+      activemodel (= 3.2.10)
+      activesupport (= 3.2.10)
       arel (~> 3.0.2)
       tzinfo (~> 0.3.29)
-    activeresource (3.2.9)
-      activemodel (= 3.2.9)
-      activesupport (= 3.2.9)
-    activesupport (3.2.9)
+    activeresource (3.2.10)
+      activemodel (= 3.2.10)
+      activesupport (= 3.2.10)
+    activesupport (3.2.10)
       i18n (~> 0.6)
       multi_json (~> 1.0)
     acts-as-taggable-on (2.3.3)
@@ -240,7 +240,7 @@ GEM
     jquery-ui-rails (2.0.2)
       jquery-rails
       railties (>= 3.1.0)
-    json (1.7.5)
+    json (1.7.6)
     jwt (0.1.5)
       multi_json (>= 1.0)
     kaminari (0.14.1)
@@ -264,7 +264,7 @@ GEM
     mime-types (1.19)
     modernizr (2.6.2)
       sprockets (~> 2.0)
-    multi_json (1.3.7)
+    multi_json (1.5.0)
     multi_xml (0.5.1)
     multipart-post (1.1.5)
     mysql2 (0.3.11)
@@ -321,26 +321,26 @@ GEM
       rack
     rack-test (0.6.2)
       rack (>= 1.0)
-    rails (3.2.9)
-      actionmailer (= 3.2.9)
-      actionpack (= 3.2.9)
-      activerecord (= 3.2.9)
-      activeresource (= 3.2.9)
-      activesupport (= 3.2.9)
+    rails (3.2.10)
+      actionmailer (= 3.2.10)
+      actionpack (= 3.2.10)
+      activerecord (= 3.2.10)
+      activeresource (= 3.2.10)
+      activesupport (= 3.2.10)
       bundler (~> 1.0)
-      railties (= 3.2.9)
+      railties (= 3.2.10)
     rails-dev-tweaks (0.6.1)
       actionpack (~> 3.1)
       railties (~> 3.1)
-    railties (3.2.9)
-      actionpack (= 3.2.9)
-      activesupport (= 3.2.9)
+    railties (3.2.10)
+      actionpack (= 3.2.10)
+      activesupport (= 3.2.10)
       rack-ssl (~> 1.3.2)
       rake (>= 0.8.7)
       rdoc (~> 3.4)
       thor (>= 0.14.6, < 2.0)
     raindrops (0.10.0)
-    rake (10.0.1)
+    rake (10.0.3)
     raphael-rails (1.5.2)
     rb-fsevent (0.9.2)
     rb-inotify (0.8.8)
@@ -411,7 +411,7 @@ GEM
       capybara (~> 1)
       railties (>= 3)
       spinach (>= 0.4)
-    sprockets (2.2.1)
+    sprockets (2.2.2)
       hike (~> 1.2)
       multi_json (~> 1.0)
       rack (~> 1.0)
@@ -506,7 +506,7 @@ DEPENDENCIES
   pygments.rb!
   quiet_assets (~> 1.0.1)
   rack-mini-profiler
-  rails (= 3.2.9)
+  rails (= 3.2.10)
   rails-dev-tweaks
   raphael-rails (= 1.5.2)
   rb-fsevent
-- 
GitLab


From 0e2880b7404f8dc51de2da251502095da65bdeb6 Mon Sep 17 00:00:00 2001
From: Riyad Preukschas <riyad@informatik.uni-bremen.de>
Date: Mon, 7 Jan 2013 21:32:29 +0100
Subject: [PATCH 08/23] Backport fixes to the check and info tasks

---
 config/gitlab.yml.example          |   1 +
 lib/tasks/gitlab/check.rake        | 130 +++++++++++++----------------
 lib/tasks/gitlab/info.rake         |  31 +------
 lib/tasks/gitlab/task_helpers.rake |  39 +++++++++
 4 files changed, 101 insertions(+), 100 deletions(-)
 create mode 100644 lib/tasks/gitlab/task_helpers.rake

diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index f47625eb132..3aac21d3771 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -89,6 +89,7 @@ backup:
 ## Gitolite settings
 gitolite:
   admin_uri: git@localhost:gitolite-admin
+  # repos_path must not be a symlink
   repos_path: /home/git/repositories/
   hooks_path: /home/git/.gitolite/hooks/
   admin_key: gitlab
diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index 5f1ed080fa5..b25d0122334 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -48,7 +48,7 @@ namespace :gitlab do
           see_database_guide,
           "http://guides.rubyonrails.org/getting_started.html#configuring-a-database"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -65,7 +65,7 @@ namespace :gitlab do
           "https://github.com/gitlabhq/gitlabhq/wiki/Migrate-from-SQLite-to-MySQL",
           see_database_guide
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -85,7 +85,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "GitLab"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -98,7 +98,7 @@ namespace :gitlab do
       end
 
       # omniauth or ldap could have been deleted from the file
-      unless Gitlab.config.pre_40_config
+      unless Gitlab.config['git_host']
         puts "no".green
       else
         puts "yes".red
@@ -110,7 +110,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "GitLab"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -129,7 +129,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Install Init Script"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -155,7 +155,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Install Init Script"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -171,7 +171,7 @@ namespace :gitlab do
         try_fixing_it(
           "sudo -u gitlab -H bundle exec rake db:migrate"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -201,7 +201,7 @@ namespace :gitlab do
           for_more_information(
             "doc/raketasks/maintenance.md "
           )
-          check_failed
+          fix_and_rerun
         end
       end
     end
@@ -222,7 +222,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "GitLab"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -242,7 +242,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "GitLab"
         )
-        check_failed
+        fix_and_rerun
       end
     end
   end
@@ -256,7 +256,7 @@ namespace :gitlab do
       start_checking "Environment"
 
       check_gitlab_in_git_group
-      check_issue_1056_shell_profile_error
+      check_issue_1059_shell_profile_error
       check_gitlab_git_config
       check_python2_exists
       check_python2_version
@@ -290,7 +290,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "GitLab"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -308,12 +308,12 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "System Users"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
     # see https://github.com/gitlabhq/gitlabhq/issues/1059
-    def check_issue_1056_shell_profile_error
+    def check_issue_1059_shell_profile_error
       gitolite_ssh_user = Gitlab.config.gitolite.ssh_user
       print "Has no \"-e\" in ~#{gitolite_ssh_user}/.profile ... "
 
@@ -332,7 +332,7 @@ namespace :gitlab do
           see_installation_guide_section("Gitolite"),
           "https://github.com/gitlabhq/gitlabhq/issues/1059"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -352,7 +352,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Packages / Dependencies"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -378,7 +378,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Packages / Dependencies"
         )
-        check_failed
+        fix_and_rerun
       end
     end
   end
@@ -398,6 +398,7 @@ namespace :gitlab do
       check_dot_gitolite_user_and_group
       check_dot_gitolite_permissions
       check_repo_base_exists
+      check_repo_base_is_not_symlink
       check_repo_base_user_and_group
       check_repo_base_permissions
       check_can_clone_gitolite_admin
@@ -434,7 +435,7 @@ namespace :gitlab do
       for_more_information(
         see_installation_guide_section "Gitolite"
       )
-      check_failed
+      fix_and_rerun
     end
 
     # assumes #check_can_clone_gitolite_admin has been run before
@@ -466,7 +467,7 @@ namespace :gitlab do
       for_more_information(
         see_installation_guide_section "Gitolite"
       )
-      check_failed
+      fix_and_rerun
     ensure
       FileUtils.rm_rf("/tmp/gitolite_gitlab_test")
     end
@@ -488,7 +489,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -511,7 +512,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -537,13 +538,13 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
     def check_gitolite_is_up_to_date
       print "Using recommended version ... "
-      if gitolite_version.try(:start_with?, "v3.04")
+      if gitolite_version.try(:start_with?, "v3.2")
         puts "yes".green
       else
         puts "no".red
@@ -582,7 +583,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -611,7 +612,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -635,7 +636,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Setup GitLab Hooks"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -666,7 +667,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Setup GitLab Hooks"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -688,7 +689,27 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
+      end
+    end
+
+    def check_repo_base_is_not_symlink
+      print "Repo base directory is a symlink? ... "
+
+      repo_base_path = Gitlab.config.gitolite.repos_path
+      unless File.exists?(repo_base_path)
+        puts "can't check because of previous errors".magenta
+        return
+      end
+
+      unless File.symlink?(repo_base_path)
+        puts "no".green
+      else
+        puts "yes".red
+        try_fixing_it(
+          "Make sure it's set to the real directory in config/gitlab.yml"
+        )
+        fix_and_rerun
       end
     end
 
@@ -712,7 +733,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -738,7 +759,7 @@ namespace :gitlab do
         for_more_information(
           see_installation_guide_section "Gitolite"
         )
-        check_failed
+        fix_and_rerun
       end
     end
 
@@ -772,7 +793,7 @@ namespace :gitlab do
           for_more_information(
             "doc/raketasks/maintenance.md"
           )
-          check_failed
+          fix_and_rerun
         end
       end
     end
@@ -808,7 +829,7 @@ namespace :gitlab do
           for_more_information(
             "lib/support/rewrite-hooks.sh"
           )
-          check_failed
+          fix_and_rerun
           next
         end
 
@@ -822,7 +843,7 @@ namespace :gitlab do
           for_more_information(
             "lib/support/rewrite-hooks.sh"
           )
-          check_failed
+          fix_and_rerun
         end
       end
     end
@@ -880,7 +901,7 @@ namespace :gitlab do
           see_installation_guide_section("Install Init Script"),
           "see log/resque.log for possible errors"
         )
-        check_failed
+        fix_and_rerun
       end
     end
   end
@@ -889,7 +910,7 @@ namespace :gitlab do
   # Helper methods
   ##########################
 
-  def check_failed
+  def fix_and_rerun
     puts "  Please #{"fix the error above"} and rerun the checks.".red
   end
 
@@ -908,29 +929,6 @@ namespace :gitlab do
     puts ""
   end
 
-  # Runs the given command
-  #
-  # Returns nil if the command was not found
-  # Returns the output of the command otherwise
-  #
-  # see also #run_and_match
-  def run(command)
-    unless `#{command} 2>/dev/null`.blank?
-      `#{command}`
-    end
-  end
-
-  # Runs the given command and matches the output agains the given pattern
-  #
-  # Returns nil if nothing matched
-  # Retunrs the MatchData if the pattern matched
-  #
-  # see also #run
-  # see also String#match
-  def run_and_match(command, pattern)
-    run(command).try(:match, pattern)
-  end
-
   def see_database_guide
     "doc/install/databases.md"
   end
@@ -952,18 +950,4 @@ namespace :gitlab do
       puts "  #{step}"
     end
   end
-
-  def warn_user_is_not_gitlab
-    unless @warned_user_not_gitlab
-      current_user = run("whoami").chomp
-      unless current_user == "gitlab"
-        puts "#{Colored.color(:black)+Colored.color(:on_yellow)} Warning #{Colored.extra(:clear)}"
-        puts "  You are running as user #{current_user.magenta}, we hope you know what you are doing."
-        puts "  Some tests may pass\/fail for the wrong reason."
-        puts "  For meaningful results you should run this as user #{"gitlab".magenta}."
-        puts ""
-      end
-      @warned_user_not_gitlab = true
-    end
-  end
 end
diff --git a/lib/tasks/gitlab/info.rake b/lib/tasks/gitlab/info.rake
index 85458fe2c43..fd3e83e8338 100644
--- a/lib/tasks/gitlab/info.rake
+++ b/lib/tasks/gitlab/info.rake
@@ -12,7 +12,10 @@ namespace :gitlab do
                     debian_version = File.read('/etc/debian_version')
                     "Debian #{debian_version}"
                   end
-      os_name.squish!
+      os_name ||= if File.readable?('/etc/SuSE-release')
+                    File.read('/etc/SuSE-release')
+                  end
+      os_name.try(:squish!)
 
       # check if there is an RVM environment
       rvm_version = run_and_match("rvm --version", /[\d\.]+/).try(:to_s)
@@ -80,31 +83,5 @@ namespace :gitlab do
       puts "Git:\t\t#{Gitlab.config.git.bin_path}"
 
     end
-
-
-    # Helper methods
-
-    # Runs the given command and matches the output agains the given pattern
-    #
-    # Returns nil if nothing matched
-    # Retunrs the MatchData if the pattern matched
-    #
-    # see also #run
-    # see also String#match
-    def run_and_match(command, regexp)
-      run(command).try(:match, regexp)
-    end
-
-    # Runs the given command
-    #
-    # Returns nil if the command was not found
-    # Returns the output of the command otherwise
-    #
-    # see also #run_and_match
-    def run(command)
-      unless `#{command} 2>/dev/null`.blank?
-        `#{command}`
-      end
-    end
   end
 end
diff --git a/lib/tasks/gitlab/task_helpers.rake b/lib/tasks/gitlab/task_helpers.rake
new file mode 100644
index 00000000000..c9635f058ee
--- /dev/null
+++ b/lib/tasks/gitlab/task_helpers.rake
@@ -0,0 +1,39 @@
+namespace :gitlab do
+
+  # Runs the given command and matches the output agains the given pattern
+  #
+  # Returns nil if nothing matched
+  # Retunrs the MatchData if the pattern matched
+  #
+  # see also #run
+  # see also String#match
+  def run_and_match(command, regexp)
+    run(command).try(:match, regexp)
+  end
+
+  # Runs the given command
+  #
+  # Returns nil if the command was not found
+  # Returns the output of the command otherwise
+  #
+  # see also #run_and_match
+  def run(command)
+    unless `#{command} 2>/dev/null`.blank?
+      `#{command}`
+    end
+  end
+
+  def warn_user_is_not_gitlab
+    unless @warned_user_not_gitlab
+      current_user = run("whoami").chomp
+      unless current_user == "gitlab"
+        puts "#{Colored.color(:black)+Colored.color(:on_yellow)} Warning #{Colored.extra(:clear)}"
+        puts "  You are running as user #{current_user.magenta}, we hope you know what you are doing."
+        puts "  Things may work\/fail for the wrong reasons."
+        puts "  For correct results you should run this as user #{"gitlab".magenta}."
+        puts ""
+      end
+      @warned_user_not_gitlab = true
+    end
+  end
+end
-- 
GitLab


From 2e7e6e6ee1da6d1e37f80df4bb7a27dbb486271f Mon Sep 17 00:00:00 2001
From: rmp <code@mike-pretzlaw.de>
Date: Tue, 8 Jan 2013 23:40:09 +0100
Subject: [PATCH 09/23] Disable automatic mailing to the group.

Most comments are not so essential for the whole team and plenty are private notes. It's recommended to disable those and enable by hand when a comment is important.
---
 app/views/notes/_common_form.html.haml   | 4 ++--
 app/views/notes/_per_line_form.html.haml | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/views/notes/_common_form.html.haml b/app/views/notes/_common_form.html.haml
index d76be75bc27..236742d105e 100644
--- a/app/views/notes/_common_form.html.haml
+++ b/app/views/notes/_common_form.html.haml
@@ -22,12 +22,12 @@
       .span4.notify_opts
         %h6.left Notify via email:
         = label_tag :notify do
-          = check_box_tag :notify, 1, @note.noteable_type != "Commit"
+          = check_box_tag :notify, 0, @note.noteable_type != "Commit"
           %span Project team
 
         - if @note.notify_only_author?(current_user)
           = label_tag :notify_author do
-            = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit"
+            = check_box_tag :notify_author, 0 , @note.noteable_type == "Commit"
             %span Commit author
       .span5.attachments
         %h6.left Attachment:
diff --git a/app/views/notes/_per_line_form.html.haml b/app/views/notes/_per_line_form.html.haml
index ff80ad4e0d5..7b19c6dc83e 100644
--- a/app/views/notes/_per_line_form.html.haml
+++ b/app/views/notes/_per_line_form.html.haml
@@ -23,12 +23,12 @@
                 %h6.left Notify via email:
                 .labels
                   = label_tag :notify do
-                    = check_box_tag :notify, 1, @note.noteable_type != "Commit"
+                    = check_box_tag :notify, 0, @note.noteable_type != "Commit"
                     %span Project team
 
                   - if @note.notify_only_author?(current_user)
                     = label_tag :notify_author do
-                      = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit"
+                      = check_box_tag :notify_author, 0 , @note.noteable_type == "Commit"
                       %span Commit author
 
 :javascript
-- 
GitLab


From 3cccbf8a4378963caf5b7bd49bf971b7ca87bd87 Mon Sep 17 00:00:00 2001
From: rmp <code@mike-pretzlaw.de>
Date: Tue, 8 Jan 2013 23:42:09 +0100
Subject: [PATCH 10/23] Possibility to open a new issue form after viewing
 another one.

While looking at an issue you no longer need to go back to the issue list for creating the next one.
---
 app/views/issues/show.html.haml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/views/issues/show.html.haml b/app/views/issues/show.html.haml
index 1d4d6a13c2b..7996c317548 100644
--- a/app/views/issues/show.html.haml
+++ b/app/views/issues/show.html.haml
@@ -6,6 +6,10 @@
     = @issue.created_at.stamp("Aug 21, 2011")
 
   %span.right
+    - if can? current_user, :write_issue, @project
+      = link_to new_project_issue_path(@project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn grouped" do
+        %i.icon-plus
+        New Issue
     - if can?(current_user, :admin_project, @project) || @issue.author == current_user
       - if @issue.closed
         = link_to 'Reopen', project_issue_path(@project, @issue, issue: {closed: false }, status_only: true), method: :put,  class: "btn grouped reopen_issue"
-- 
GitLab


From 1abc70fbf67fd1c23f8a79b2b56102af397c2519 Mon Sep 17 00:00:00 2001
From: rmp <code@mike-pretzlaw.de>
Date: Wed, 9 Jan 2013 16:44:00 +0100
Subject: [PATCH 11/23] Comment wont be mailed to team by default.

No more magic for deciding which comment is important or not.
---
 app/views/notes/_common_form.html.haml   | 4 ++--
 app/views/notes/_per_line_form.html.haml | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/views/notes/_common_form.html.haml b/app/views/notes/_common_form.html.haml
index 236742d105e..ae5d7250421 100644
--- a/app/views/notes/_common_form.html.haml
+++ b/app/views/notes/_common_form.html.haml
@@ -22,12 +22,12 @@
       .span4.notify_opts
         %h6.left Notify via email:
         = label_tag :notify do
-          = check_box_tag :notify, 0, @note.noteable_type != "Commit"
+          = check_box_tag :notify, 1, false
           %span Project team
 
         - if @note.notify_only_author?(current_user)
           = label_tag :notify_author do
-            = check_box_tag :notify_author, 0 , @note.noteable_type == "Commit"
+            = check_box_tag :notify_author, 1 , false
             %span Commit author
       .span5.attachments
         %h6.left Attachment:
diff --git a/app/views/notes/_per_line_form.html.haml b/app/views/notes/_per_line_form.html.haml
index 7b19c6dc83e..ce391dccae7 100644
--- a/app/views/notes/_per_line_form.html.haml
+++ b/app/views/notes/_per_line_form.html.haml
@@ -23,12 +23,12 @@
                 %h6.left Notify via email:
                 .labels
                   = label_tag :notify do
-                    = check_box_tag :notify, 0, @note.noteable_type != "Commit"
+                    = check_box_tag :notify, 1, false
                     %span Project team
 
                   - if @note.notify_only_author?(current_user)
                     = label_tag :notify_author do
-                      = check_box_tag :notify_author, 0 , @note.noteable_type == "Commit"
+                      = check_box_tag :notify_author, 1 , false
                       %span Commit author
 
 :javascript
-- 
GitLab


From d40215746ef241e91a142a83a90302dcd4358d72 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Wed, 9 Jan 2013 19:48:03 +0200
Subject: [PATCH 12/23] Update docs to use 4-0-stable recipes

---
 doc/install/installation.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/doc/install/installation.md b/doc/install/installation.md
index 718e4cf6419..79cac8b67e5 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -288,7 +288,7 @@ Although this is the case, there are still a few steps to go.
 
 Download the init script (will be /etc/init.d/gitlab):
 
-    sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/init.d/gitlab -P /etc/init.d/
+    sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/4-0-stable/init.d/gitlab -P /etc/init.d/
     sudo chmod +x /etc/init.d/gitlab
 
 Make GitLab start on boot:
@@ -316,7 +316,7 @@ If you can't or don't want to use Nginx as your web server, have a look at the
 
 Download an example site config:
 
-    sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/nginx/gitlab -P /etc/nginx/sites-available/
+    sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/4-0-stable/nginx/gitlab -P /etc/nginx/sites-available/
     sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
 
 Make sure to edit the config file to match your setup:
-- 
GitLab


From 6e067482dc1d7b4d551eab0e63fe436a658e653e Mon Sep 17 00:00:00 2001
From: David Van Duzer <dvd@tennica.net>
Date: Wed, 9 Jan 2013 10:57:41 -0700
Subject: [PATCH 13/23] updating rails to 3.2.11 in response to CVE-2013-0156

See also:
https://github.com/gitlabhq/gitlabhq/issues/2526
http://www.securityfocus.com/bid/57187
---
 Gemfile      |  2 +-
 Gemfile.lock | 52 ++++++++++++++++++++++++++--------------------------
 2 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/Gemfile b/Gemfile
index 213e5659d20..375929a7444 100644
--- a/Gemfile
+++ b/Gemfile
@@ -8,7 +8,7 @@ def linux_only(require_as)
   RUBY_PLATFORM.include?('linux') && require_as
 end
 
-gem "rails", "3.2.10"
+gem "rails", "3.2.11"
 
 # Supported DBs
 gem "mysql2", group: :mysql
diff --git a/Gemfile.lock b/Gemfile.lock
index 25903a99ab8..bf14bd93d7c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -81,12 +81,12 @@ GIT
 GEM
   remote: http://rubygems.org/
   specs:
-    actionmailer (3.2.10)
-      actionpack (= 3.2.10)
+    actionmailer (3.2.11)
+      actionpack (= 3.2.11)
       mail (~> 2.4.4)
-    actionpack (3.2.10)
-      activemodel (= 3.2.10)
-      activesupport (= 3.2.10)
+    actionpack (3.2.11)
+      activemodel (= 3.2.11)
+      activesupport (= 3.2.11)
       builder (~> 3.0.0)
       erubis (~> 2.7.0)
       journey (~> 1.0.4)
@@ -94,18 +94,18 @@ GEM
       rack-cache (~> 1.2)
       rack-test (~> 0.6.1)
       sprockets (~> 2.2.1)
-    activemodel (3.2.10)
-      activesupport (= 3.2.10)
+    activemodel (3.2.11)
+      activesupport (= 3.2.11)
       builder (~> 3.0.0)
-    activerecord (3.2.10)
-      activemodel (= 3.2.10)
-      activesupport (= 3.2.10)
+    activerecord (3.2.11)
+      activemodel (= 3.2.11)
+      activesupport (= 3.2.11)
       arel (~> 3.0.2)
       tzinfo (~> 0.3.29)
-    activeresource (3.2.10)
-      activemodel (= 3.2.10)
-      activesupport (= 3.2.10)
-    activesupport (3.2.10)
+    activeresource (3.2.11)
+      activemodel (= 3.2.11)
+      activesupport (= 3.2.11)
+    activesupport (3.2.11)
       i18n (~> 0.6)
       multi_json (~> 1.0)
     acts-as-taggable-on (2.3.3)
@@ -306,7 +306,7 @@ GEM
     pyu-ruby-sasl (0.0.3.3)
     quiet_assets (1.0.1)
       railties (~> 3.1)
-    rack (1.4.1)
+    rack (1.4.3)
     rack-accept (0.4.5)
       rack (>= 0.4)
     rack-cache (1.2)
@@ -321,20 +321,20 @@ GEM
       rack
     rack-test (0.6.2)
       rack (>= 1.0)
-    rails (3.2.10)
-      actionmailer (= 3.2.10)
-      actionpack (= 3.2.10)
-      activerecord (= 3.2.10)
-      activeresource (= 3.2.10)
-      activesupport (= 3.2.10)
+    rails (3.2.11)
+      actionmailer (= 3.2.11)
+      actionpack (= 3.2.11)
+      activerecord (= 3.2.11)
+      activeresource (= 3.2.11)
+      activesupport (= 3.2.11)
       bundler (~> 1.0)
-      railties (= 3.2.10)
+      railties (= 3.2.11)
     rails-dev-tweaks (0.6.1)
       actionpack (~> 3.1)
       railties (~> 3.1)
-    railties (3.2.10)
-      actionpack (= 3.2.10)
-      activesupport (= 3.2.10)
+    railties (3.2.11)
+      actionpack (= 3.2.11)
+      activesupport (= 3.2.11)
       rack-ssl (~> 1.3.2)
       rake (>= 0.8.7)
       rdoc (~> 3.4)
@@ -506,7 +506,7 @@ DEPENDENCIES
   pygments.rb!
   quiet_assets (~> 1.0.1)
   rack-mini-profiler
-  rails (= 3.2.10)
+  rails (= 3.2.11)
   rails-dev-tweaks
   raphael-rails (= 1.5.2)
   rb-fsevent
-- 
GitLab


From e52332735533f245e60819bece7cf4eff995b8b8 Mon Sep 17 00:00:00 2001
From: David Southard <nacengineer@gmail.com>
Date: Thu, 10 Jan 2013 13:21:54 -0600
Subject: [PATCH 14/23] update grammar in check application status section

---
 doc/install/installation.md | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/doc/install/installation.md b/doc/install/installation.md
index 79cac8b67e5..f2722151d2d 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -280,9 +280,8 @@ To make sure you didn't miss anything run a more thorough check with:
 
     sudo -u gitlab -H bundle exec rake gitlab:check RAILS_ENV=production
 
-If you are all green: congratulations, you successfully installed GitLab!
-Although this is the case, there are still a few steps to go.
-
+If all items are green, then congratulations on successfully installing GitLab!
+However there are still a few steps left.
 
 ## Install Init Script
 
-- 
GitLab


From c312a8d7d138e471bbd48da0a1c51032ec118e6e Mon Sep 17 00:00:00 2001
From: Riyad Preukschas <riyad@informatik.uni-bremen.de>
Date: Fri, 11 Jan 2013 18:58:13 +0100
Subject: [PATCH 15/23] Move checks after init script installation in docs

---
 doc/install/installation.md | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/doc/install/installation.md b/doc/install/installation.md
index f2722151d2d..26cfc4a1124 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -270,6 +270,18 @@ used for the `email.from` setting in `config/gitlab.yml`)
     sudo -u gitlab -H bundle exec rake gitlab:app:setup RAILS_ENV=production
 
 
+## Install Init Script
+
+Download the init script (will be /etc/init.d/gitlab):
+
+    sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/4-0-stable/init.d/gitlab -P /etc/init.d/
+    sudo chmod +x /etc/init.d/gitlab
+
+Make GitLab start on boot:
+
+    sudo update-rc.d gitlab defaults 21
+
+
 ## Check Application Status
 
 Check if GitLab and its environment is configured correctly:
@@ -283,19 +295,8 @@ To make sure you didn't miss anything run a more thorough check with:
 If all items are green, then congratulations on successfully installing GitLab!
 However there are still a few steps left.
 
-## Install Init Script
-
-Download the init script (will be /etc/init.d/gitlab):
-
-    sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/4-0-stable/init.d/gitlab -P /etc/init.d/
-    sudo chmod +x /etc/init.d/gitlab
-
-Make GitLab start on boot:
-
-    sudo update-rc.d gitlab defaults 21
-
 
-Start your GitLab instance:
+## Start Your GitLab Instance
 
     sudo service gitlab start
     # or
-- 
GitLab


From ab1241963367ae08e7f961e34c95de3a437c80a2 Mon Sep 17 00:00:00 2001
From: Riyad Preukschas <riyad@informatik.uni-bremen.de>
Date: Sat, 12 Jan 2013 01:24:51 +0100
Subject: [PATCH 16/23] Move OS detection to task helpers and add detection of
 OS X

---
 lib/tasks/gitlab/info.rake         | 14 --------------
 lib/tasks/gitlab/task_helpers.rake | 22 ++++++++++++++++++++++
 2 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/lib/tasks/gitlab/info.rake b/lib/tasks/gitlab/info.rake
index fd3e83e8338..4b906684dcd 100644
--- a/lib/tasks/gitlab/info.rake
+++ b/lib/tasks/gitlab/info.rake
@@ -3,20 +3,6 @@ namespace :gitlab do
     desc "GITLAB | Show information about GitLab and its environment"
     task info: :environment  do
 
-      # check which OS is running
-      os_name = run("lsb_release -irs")
-      os_name ||= if File.readable?('/etc/system-release')
-                    File.read('/etc/system-release')
-                  end
-      os_name ||= if File.readable?('/etc/debian_version')
-                    debian_version = File.read('/etc/debian_version')
-                    "Debian #{debian_version}"
-                  end
-      os_name ||= if File.readable?('/etc/SuSE-release')
-                    File.read('/etc/SuSE-release')
-                  end
-      os_name.try(:squish!)
-
       # check if there is an RVM environment
       rvm_version = run_and_match("rvm --version", /[\d\.]+/).try(:to_s)
       # check Ruby version
diff --git a/lib/tasks/gitlab/task_helpers.rake b/lib/tasks/gitlab/task_helpers.rake
index c9635f058ee..5b5c3c30ba2 100644
--- a/lib/tasks/gitlab/task_helpers.rake
+++ b/lib/tasks/gitlab/task_helpers.rake
@@ -1,5 +1,27 @@
 namespace :gitlab do
 
+  # Check which OS is running
+  #
+  # It will primarily use lsb_relase to determine the OS.
+  # It has fallbacks to Debian, SuSE and OS X.
+  def os_name
+    os_name = run("lsb_release -irs")
+    os_name ||= if File.readable?('/etc/system-release')
+                  File.read('/etc/system-release')
+                end
+    os_name ||= if File.readable?('/etc/debian_version')
+                  debian_version = File.read('/etc/debian_version')
+                  "Debian #{debian_version}"
+                end
+    os_name ||= if File.readable?('/etc/SuSE-release')
+                  File.read('/etc/SuSE-release')
+                end
+    os_name ||= if os_x_version = run("sw_vers -productVersion")
+                  "Mac OS X #{os_x_version}"
+                end
+    os_name.try(:squish!)
+  end
+
   # Runs the given command and matches the output agains the given pattern
   #
   # Returns nil if nothing matched
-- 
GitLab


From f73dd4af5eb24e7ddc2e829dd7826b63f926c2a6 Mon Sep 17 00:00:00 2001
From: Riyad Preukschas <riyad@informatik.uni-bremen.de>
Date: Fri, 11 Jan 2013 22:25:18 +0100
Subject: [PATCH 17/23] Make method names clearer in check.rake

---
 lib/tasks/gitlab/check.rake | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index b25d0122334..8a08048ba9b 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -317,7 +317,7 @@ namespace :gitlab do
       gitolite_ssh_user = Gitlab.config.gitolite.ssh_user
       print "Has no \"-e\" in ~#{gitolite_ssh_user}/.profile ... "
 
-      profile_file = File.join(gitolite_home, ".profile")
+      profile_file = File.join(gitolite_user_home, ".profile")
 
       unless File.read(profile_file) =~ /^-e PATH/
         puts "yes".green
@@ -475,7 +475,7 @@ namespace :gitlab do
     def check_dot_gitolite_exists
       print "Config directory exists? ... "
 
-      gitolite_config_path = File.join(gitolite_home, ".gitolite")
+      gitolite_config_path = File.join(gitolite_user_home, ".gitolite")
 
       if File.directory?(gitolite_config_path)
         puts "yes".green
@@ -496,7 +496,7 @@ namespace :gitlab do
     def check_dot_gitolite_permissions
       print "Config directory access is drwxr-x---? ... "
 
-      gitolite_config_path = File.join(gitolite_home, ".gitolite")
+      gitolite_config_path = File.join(gitolite_user_home, ".gitolite")
       unless File.exists?(gitolite_config_path)
         puts "can't check because of previous errors".magenta
         return
@@ -520,7 +520,7 @@ namespace :gitlab do
       gitolite_ssh_user = Gitlab.config.gitolite.ssh_user
       print "Config directory owned by #{gitolite_ssh_user}:#{gitolite_ssh_user} ... "
 
-      gitolite_config_path = File.join(gitolite_home, ".gitolite")
+      gitolite_config_path = File.join(gitolite_user_home, ".gitolite")
       unless File.exists?(gitolite_config_path)
         puts "can't check because of previous errors".magenta
         return
@@ -559,7 +559,7 @@ namespace :gitlab do
     end
 
     def check_gitoliterc_git_config_keys
-      gitoliterc_path = File.join(gitolite_home, ".gitolite.rc")
+      gitoliterc_path = File.join(gitolite_user_home, ".gitolite.rc")
 
       print "Allow all Git config keys in .gitolite.rc ... "
       option_name = if has_gitolite3?
@@ -588,7 +588,7 @@ namespace :gitlab do
     end
 
     def check_gitoliterc_repo_umask
-      gitoliterc_path = File.join(gitolite_home, ".gitolite.rc")
+      gitoliterc_path = File.join(gitolite_user_home, ".gitolite.rc")
 
       print "Repo umask is 0007 in .gitolite.rc? ... "
       option_name = if has_gitolite3?
@@ -726,7 +726,6 @@ namespace :gitlab do
         puts "yes".green
       else
         puts "no".red
-        puts "#{repo_base_path} is not writable".red
         try_fixing_it(
           "sudo chmod -R ug+rwXs,o-rwx #{repo_base_path}"
         )
@@ -852,12 +851,12 @@ namespace :gitlab do
     # Helper methods
     ########################
 
-    def gitolite_home
+    def gitolite_user_home
       File.expand_path("~#{Gitlab.config.gitolite.ssh_user}")
     end
 
     def gitolite_version
-      gitolite_version_file = "#{gitolite_home}/gitolite/src/VERSION"
+      gitolite_version_file = "#{gitolite_user_home}/gitolite/src/VERSION"
       if File.readable?(gitolite_version_file)
         File.read(gitolite_version_file)
       end
-- 
GitLab


From 147dfd16566ae8e06aa8db699630e0f19dc422bf Mon Sep 17 00:00:00 2001
From: Riyad Preukschas <riyad@informatik.uni-bremen.de>
Date: Sat, 12 Jan 2013 00:44:40 +0100
Subject: [PATCH 18/23] Replace all stat command line calls with ruby
 equivalents

---
 lib/tasks/gitlab/check.rake        | 17 ++++++++---------
 lib/tasks/gitlab/task_helpers.rake |  9 +++++++++
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index 8a08048ba9b..73ce2712314 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -502,7 +502,7 @@ namespace :gitlab do
         return
       end
 
-      if `stat --printf %a #{gitolite_config_path}` == "750"
+      if File.stat(gitolite_config_path).mode.to_s(8).ends_with?("750")
         puts "yes".green
       else
         puts "no".red
@@ -526,12 +526,11 @@ namespace :gitlab do
         return
       end
 
-      if `stat --printf %U #{gitolite_config_path}` == gitolite_ssh_user && # user
-         `stat --printf %G #{gitolite_config_path}` == gitolite_ssh_user #group
+      if File.stat(gitolite_config_path).uid == uid_for(gitolite_ssh_user) &&
+         File.stat(gitolite_config_path).gid == gid_for(gitolite_ssh_user)
         puts "yes".green
       else
         puts "no".red
-        puts "#{gitolite_config_path} is not owned by #{gitolite_ssh_user}".red
         try_fixing_it(
           "sudo chown -R #{gitolite_ssh_user}:#{gitolite_ssh_user} #{gitolite_config_path}"
         )
@@ -722,7 +721,7 @@ namespace :gitlab do
         return
       end
 
-      if `stat --printf %a #{repo_base_path}` == "6770"
+      if File.stat(repo_base_path).mode.to_s(8).ends_with?("6770")
         puts "yes".green
       else
         puts "no".red
@@ -746,12 +745,11 @@ namespace :gitlab do
         return
       end
 
-      if `stat --printf %U #{repo_base_path}` == gitolite_ssh_user && # user
-         `stat --printf %G #{repo_base_path}` == gitolite_ssh_user #group
+      if File.stat(repo_base_path).uid == uid_for(gitolite_ssh_user) &&
+         File.stat(repo_base_path).gid == gid_for(gitolite_ssh_user)
         puts "yes".green
       else
         puts "no".red
-        puts "#{repo_base_path} is not owned by #{gitolite_ssh_user}".red
         try_fixing_it(
           "sudo chown -R #{gitolite_ssh_user}:#{gitolite_ssh_user} #{repo_base_path}"
         )
@@ -832,7 +830,8 @@ namespace :gitlab do
           next
         end
 
-        if run_and_match("stat --format %N #{project_hook_file}", /#{hook_file}.+->.+#{gitolite_hook_file}/)
+        if File.lstat(project_hook_file).symlink? &&
+            File.realpath(project_hook_file) == File.realpath(gitolite_hook_file)
           puts "ok".green
         else
           puts "not a link to Gitolite's hook".red
diff --git a/lib/tasks/gitlab/task_helpers.rake b/lib/tasks/gitlab/task_helpers.rake
index 5b5c3c30ba2..5dd97fa2f92 100644
--- a/lib/tasks/gitlab/task_helpers.rake
+++ b/lib/tasks/gitlab/task_helpers.rake
@@ -45,6 +45,15 @@ namespace :gitlab do
     end
   end
 
+  def uid_for(user_name)
+    run("id -u #{user_name}").chomp.to_i
+  end
+
+  def gid_for(group_name)
+    group_line = File.read("/etc/group").lines.select{|l| l.start_with?("#{group_name}:")}.first
+    group_line.split(":")[2].to_i
+  end
+
   def warn_user_is_not_gitlab
     unless @warned_user_not_gitlab
       current_user = run("whoami").chomp
-- 
GitLab


From f254de7337b9d3fe9c5b89a2d6f2add00c59a681 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Tue, 15 Jan 2013 17:14:53 +0200
Subject: [PATCH 19/23] 4.0.1

---
 VERSION | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/VERSION b/VERSION
index fcdb2e109f6..1454f6ed4b7 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.0.0
+4.0.1
-- 
GitLab


From 9cf993972a3aec68219a37e0a0d26435046d9d33 Mon Sep 17 00:00:00 2001
From: Riyad Preukschas <riyad@informatik.uni-bremen.de>
Date: Thu, 17 Jan 2013 00:43:35 +0100
Subject: [PATCH 20/23] Fix gitolite config checks for old Gitolite versions

Fixes #2608
---
 lib/tasks/gitlab/check.rake | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index 73ce2712314..b330377fb2d 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -567,7 +567,7 @@ namespace :gitlab do
                     else
                       # assume older version
                       # see https://github.com/sitaramc/gitolite/blob/v2.3/conf/example.gitolite.rc#L49
-                      "$GL_GITCONFIG_KEYS"
+                      "\\$GL_GITCONFIG_KEYS"
                     end
       option_value = ".*"
       if open(gitoliterc_path).grep(/#{option_name}\s*=[>]?\s*["']#{option_value}["']/).any?
@@ -596,7 +596,7 @@ namespace :gitlab do
                     else
                       # assume older version
                       # see https://github.com/sitaramc/gitolite/blob/v2.3/conf/example.gitolite.rc#L32
-                      "$REPO_UMASK"
+                      "\\$REPO_UMASK"
                     end
       option_value = "0007"
       if open(gitoliterc_path).grep(/#{option_name}\s*=[>]?\s*#{option_value}/).any?
-- 
GitLab


From 7b6cbebaad0c3e23eefd4a7312a25d7781a39ffc Mon Sep 17 00:00:00 2001
From: Cyril <jv.cyril@gmail.com>
Date: Fri, 18 Jan 2013 00:11:15 +0100
Subject: [PATCH 21/23] fix #2492

---
 config/initializers/1_settings.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 4fe3ced4d8d..08ea63f7f8d 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -324,7 +324,7 @@ Settings.gitlab['email_from'] ||= Settings.pre_40_config ? Settings.email_from :
 Settings.gitlab['url']        ||= Settings.pre_40_config ? Settings.url : Settings.send(:build_gitlab_url)
 
 Settings['gravatar'] ||= Settingslogic.new({})
-Settings.gravatar['enabled']    ||= Settings.pre_40_config ? !Settings.disable_gravatar? : true
+Settings.gravatar['enabled']      = Settings.pre_40_config ? !Settings.disable_gravatar? : true if Settings.gravatar['enabled'].nil?
 Settings.gravatar['plain_url']  ||= Settings.pre_40_config ? Settings.gravatar_url      : 'http://www.gravatar.com/avatar/%{hash}?s=%{size}&d=mm'
 Settings.gravatar['ssl_url']    ||= Settings.pre_40_config ? Settings.gravatar_ssl_url  : 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=mm'
 
-- 
GitLab


From c84fcb265cb096c08e86e4e084496b329eaa2798 Mon Sep 17 00:00:00 2001
From: Riyad Preukschas <riyad@informatik.uni-bremen.de>
Date: Sun, 20 Jan 2013 15:58:41 +0100
Subject: [PATCH 22/23] Fix checking the init script in check.rake

Fixes #2671
---
 lib/tasks/gitlab/check.rake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index b330377fb2d..c11ea91b7e6 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -142,7 +142,7 @@ namespace :gitlab do
         return
       end
 
-      recipe_content = `curl https://raw.github.com/gitlabhq/gitlab-recipes/master/init.d/gitlab 2>/dev/null`
+      recipe_content = `curl https://raw.github.com/gitlabhq/gitlab-recipes/4-0-stable/init.d/gitlab 2>/dev/null`
       script_content = File.read(script_path)
 
       if recipe_content == script_content
-- 
GitLab


From 22d181b104829b48976b48824982751babc690d6 Mon Sep 17 00:00:00 2001
From: Jacob Vosmaer <contact@jacobvosmaer.nl>
Date: Mon, 30 Sep 2013 09:53:08 +0200
Subject: [PATCH 23/23] Specify RAILS_ENV when suggesting fixes

---
 lib/tasks/gitlab/check.rake | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index c11ea91b7e6..9cf021717c6 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -169,7 +169,7 @@ namespace :gitlab do
       else
         puts "no".red
         try_fixing_it(
-          "sudo -u gitlab -H bundle exec rake db:migrate"
+          "sudo -u gitlab -H bundle exec rake db:migrate RAILS_ENV=production"
         )
         fix_and_rerun
       end
@@ -194,7 +194,7 @@ namespace :gitlab do
         else
           puts "no".red
           try_fixing_it(
-            "sudo -u gitlab -H bundle exec rake gitlab:satellites:create",
+            "sudo -u gitlab -H bundle exec rake gitlab:satellites:create RAILS_ENV=production",
             "If necessary, remove the tmp/repo_satellites directory ...",
             "... and rerun the above command"
           )
@@ -785,7 +785,7 @@ namespace :gitlab do
         else
           puts "wrong or missing".red
           try_fixing_it(
-            "sudo -u gitlab -H bundle exec rake gitlab:gitolite:update_repos"
+            "sudo -u gitlab -H bundle exec rake gitlab:gitolite:update_repos RAILS_ENV=production"
           )
           for_more_information(
             "doc/raketasks/maintenance.md"
-- 
GitLab