From 21e55ca318bb829399c85b10e678b596d6fd414e Mon Sep 17 00:00:00 2001
From: Chris Frohoff <chris@frohoff.org>
Date: Fri, 28 Dec 2012 18:11:28 +0000
Subject: [PATCH] added RAILS_RELATIVE_URL_ROOT support

---
 app/mailers/notify.rb             | 1 +
 config.ru                         | 5 ++++-
 config/gitlab.yml.example         | 3 +++
 config/initializers/1_settings.rb | 4 +++-
 config/routes.rb                  | 2 +-
 config/unicorn.rb.example         | 4 ++++
 lib/gitlab/backend/grack_auth.rb  | 4 ----
 7 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index 5cd9b82900c1b..46b8e05450929 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -6,6 +6,7 @@ class Notify < ActionMailer::Base
   default_url_options[:host]     = Gitlab.config.gitlab.host
   default_url_options[:protocol] = Gitlab.config.gitlab.protocol
   default_url_options[:port]     = Gitlab.config.gitlab.port if Gitlab.config.gitlab_on_non_standard_port?
+  default_url_options[:script_name] = Gitlab.config.gitlab.relative_url_root
 
   default from: Gitlab.config.gitlab.email_from
 
diff --git a/config.ru b/config.ru
index 5ef2a0289fee1..dfd2d86223732 100644
--- a/config.ru
+++ b/config.ru
@@ -1,4 +1,7 @@
 # This file is used by Rack-based servers to start the application.
 
 require ::File.expand_path('../config/environment',  __FILE__)
-run Gitlab::Application
+
+map ENV['RAILS_RELATIVE_URL_ROOT'] || "/" do
+  run Gitlab::Application
+end
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index f47625eb132ab..5546632cb7f8c 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -18,6 +18,9 @@ gitlab:
   host: localhost
   port: 80
   https: false
+  # uncomment and customize to run in non-root path
+  # note that ENV['RAILS_RELATIVE_URL_ROOT'] in config/unicorn.rb may need to be changed
+  # relative_url_root: /gitlab
 
   ## Email settings
   # Email address used in the "From" field in mails sent by GitLab
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index efc816118355a..6b47a9cc948a4 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -25,7 +25,8 @@ def build_gitlab_url
       [ gitlab.protocol,
         "://",
         gitlab.host,
-        custom_port
+        custom_port,
+        gitlab.relative_url_root
       ].join('')
     end
   end
@@ -45,6 +46,7 @@ def build_gitlab_url
 Settings.gitlab['host']       ||= 'localhost'
 Settings.gitlab['https']      ||= false
 Settings.gitlab['port']       ||= Settings.gitlab.https ? 443 : 80
+Settings.gitlab['relative_url_root'] ||= ''
 Settings.gitlab['protocol']   ||= Settings.gitlab.https ? "https" : "http"
 Settings.gitlab['email_from'] ||= "gitlab@#{Settings.gitlab.host}"
 Settings.gitlab['url']        ||= Settings.send(:build_gitlab_url)
diff --git a/config/routes.rb b/config/routes.rb
index 4a02bd9f80981..1259496f6344b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -18,7 +18,7 @@
     project_root: Gitlab.config.gitolite.repos_path,
     upload_pack:  Gitlab.config.gitolite.upload_pack,
     receive_pack: Gitlab.config.gitolite.receive_pack
-  }), at: '/:path', constraints: { path: /[-\/\w\.-]+\.git/ }
+  }), at: '/', constraints: lambda { |request| /[-\/\w\.-]+\.git/.match(request.path_info) }
 
   #
   # Help
diff --git a/config/unicorn.rb.example b/config/unicorn.rb.example
index 425dbf33f8696..4852cd65daadd 100644
--- a/config/unicorn.rb.example
+++ b/config/unicorn.rb.example
@@ -1,3 +1,7 @@
+# uncomment and customize to run in non-root path
+# note that config/gitlab.yml web path should also be changed
+# ENV['RAILS_RELATIVE_URL_ROOT'] = "/gitlab"
+
 app_dir = "/home/gitlab/gitlab/"
 worker_processes 2
 working_directory app_dir
diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb
index 7c31117f01d9e..cfad532a06ca4 100644
--- a/lib/gitlab/backend/grack_auth.rb
+++ b/lib/gitlab/backend/grack_auth.rb
@@ -17,10 +17,6 @@ def valid?
       # Pass Gitolite update hook
       ENV['GL_BYPASS_UPDATE_HOOK'] = "true"
 
-      # Need this patch due to the rails mount
-      @env['PATH_INFO'] = @request.path
-      @env['SCRIPT_NAME'] = ""
-
       # Find project by PATH_INFO from env
       if m = /^\/([\w\.\/-]+)\.git/.match(@request.path_info).to_a
         self.project = Project.find_with_namespace(m.last)
-- 
GitLab