From a1fe375e44987d89b9f9fbacb784eed83de233b2 Mon Sep 17 00:00:00 2001
From: Sato Hiroyuki <sathiroyuki@gmail.com>
Date: Thu, 21 Mar 2013 14:41:16 +0000
Subject: [PATCH] Fix 404 error while displaying json files.

It uses params[:id] instead of request.fullpath.
It should fix #3132.
---
 app/controllers/blame_controller.rb |  2 --
 app/controllers/blob_controller.rb  |  2 --
 app/controllers/tree_controller.rb  |  1 -
 lib/extracts_path.rb                | 25 +++++------------
 spec/lib/extracts_path_spec.rb      | 42 -----------------------------
 5 files changed, 6 insertions(+), 66 deletions(-)

diff --git a/app/controllers/blame_controller.rb b/app/controllers/blame_controller.rb
index 37d7245ccb4..76caa4a69c4 100644
--- a/app/controllers/blame_controller.rb
+++ b/app/controllers/blame_controller.rb
@@ -7,8 +7,6 @@ class BlameController < ProjectResourceController
   before_filter :authorize_code_access!
   before_filter :require_non_empty_project
 
-  before_filter :assign_ref_vars
-
   def show
     @repo = @project.repo
     @blame = Grit::Blob.blame(@repo, @commit.id, @path)
diff --git a/app/controllers/blob_controller.rb b/app/controllers/blob_controller.rb
index d4a45d9508e..530b72fee7f 100644
--- a/app/controllers/blob_controller.rb
+++ b/app/controllers/blob_controller.rb
@@ -7,8 +7,6 @@ class BlobController < ProjectResourceController
   before_filter :authorize_code_access!
   before_filter :require_non_empty_project
 
-  before_filter :assign_ref_vars
-
   def show
     if @tree.is_blob?
       send_data(
diff --git a/app/controllers/tree_controller.rb b/app/controllers/tree_controller.rb
index 2151bd7cbbd..093fd5e512e 100644
--- a/app/controllers/tree_controller.rb
+++ b/app/controllers/tree_controller.rb
@@ -7,7 +7,6 @@ class TreeController < ProjectResourceController
   before_filter :authorize_code_access!
   before_filter :require_non_empty_project
 
-  before_filter :assign_ref_vars
   before_filter :edit_requirements, only: [:edit, :update]
 
   def show
diff --git a/lib/extracts_path.rb b/lib/extracts_path.rb
index 66b2f450545..351fc2f23ae 100644
--- a/lib/extracts_path.rb
+++ b/lib/extracts_path.rb
@@ -8,7 +8,7 @@ module ExtractsPath
 
   included do
     if respond_to?(:before_filter)
-      before_filter :assign_ref_vars, only: [:show]
+      before_filter :assign_ref_vars
     end
   end
 
@@ -33,7 +33,7 @@ module ExtractsPath
   #   extract_ref("v2.0.0/README.md")
   #   # => ['v2.0.0', 'README.md']
   #
-  #   extract_ref('/gitlab/vagrant/tree/master/app/models/project.rb')
+  #   extract_ref('master/app/models/project.rb')
   #   # => ['master', 'app/models/project.rb']
   #
   #   extract_ref('issues/1234/app/models/project.rb')
@@ -45,22 +45,12 @@ module ExtractsPath
   #
   # Returns an Array where the first value is the tree-ish and the second is the
   # path
-  def extract_ref(input)
+  def extract_ref(id)
     pair = ['', '']
 
     return pair unless @project
 
-    # Remove relative_url_root from path
-    input.gsub!(/^#{Gitlab.config.gitlab.relative_url_root}/, "")
-    # Remove project, actions and all other staff from path
-    input.gsub!(/^\/#{Regexp.escape(@project.path_with_namespace)}/, "")
-    input.gsub!(/^\/(tree|commits|blame|blob|refs|graph)\//, "") # remove actions
-    input.gsub!(/\?.*$/, "") # remove stamps suffix
-    input.gsub!(/.atom$/, "") # remove rss feed
-    input.gsub!(/.json$/, "") # remove json suffix
-    input.gsub!(/\/edit$/, "") # remove edit route part
-
-    if input.match(/^([[:alnum:]]{40})(.+)/)
+    if id.match(/^([[:alnum:]]{40})(.+)/)
       # If the ref appears to be a SHA, we're done, just split the string
       pair = $~.captures
     else
@@ -68,7 +58,6 @@ module ExtractsPath
       # branches and tags
 
       # Append a trailing slash if we only get a ref and no file path
-      id = input
       id += '/' unless id.ends_with?('/')
 
       valid_refs = @project.repository.ref_names
@@ -105,11 +94,9 @@ module ExtractsPath
   # Automatically renders `not_found!` if a valid tree path could not be
   # resolved (e.g., when a user inserts an invalid path or ref).
   def assign_ref_vars
-    path = CGI::unescape(request.fullpath.dup)
-
-    @ref, @path = extract_ref(path)
+    @id = params[:id]
 
-    @id = File.join(@ref, @path)
+    @ref, @path = extract_ref(@id)
 
     # It is used "@project.repository.commits(@ref, @path, 1, 0)",
     # because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name.
diff --git a/spec/lib/extracts_path_spec.rb b/spec/lib/extracts_path_spec.rb
index ee20ae79809..aac72c63ea5 100644
--- a/spec/lib/extracts_path_spec.rb
+++ b/spec/lib/extracts_path_spec.rb
@@ -54,47 +54,5 @@ describe ExtractsPath do
         extract_ref('stable/CHANGELOG').should == ['stable', 'CHANGELOG']
       end
     end
-
-    context "with a fullpath" do
-      it "extracts a valid branch" do
-        extract_ref('/gitlab/gitlab-ci/tree/foo/bar/baz/CHANGELOG').should == ['foo/bar/baz', 'CHANGELOG']
-      end
-
-      it "extracts a valid tag" do
-        extract_ref('/gitlab/gitlab-ci/tree/v2.0.0/CHANGELOG').should == ['v2.0.0', 'CHANGELOG']
-      end
-
-      it "extracts a valid commit SHA" do
-        extract_ref('/gitlab/gitlab-ci/tree/f4b14494ef6abf3d144c28e4af0c20143383e062/CHANGELOG').should ==
-          ['f4b14494ef6abf3d144c28e4af0c20143383e062', 'CHANGELOG']
-      end
-
-      it "extracts a timestamp" do
-        extract_ref('/gitlab/gitlab-ci/tree/v2.0.0/CHANGELOG?_=12354435').should == ['v2.0.0', 'CHANGELOG']
-      end
-    end
-
-    context "with a fullpath and a relative_url_root" do
-      before do
-        Gitlab.config.gitlab.stub(relative_url_root: '/relative')
-      end
-
-      it "extracts a valid branch with relative_url_root" do
-        extract_ref('/relative/gitlab/gitlab-ci/tree/foo/bar/baz/CHANGELOG').should == ['foo/bar/baz', 'CHANGELOG']
-      end
-
-      it "extracts a valid tag" do
-        extract_ref('/relative/gitlab/gitlab-ci/tree/v2.0.0/CHANGELOG').should == ['v2.0.0', 'CHANGELOG']
-      end
-
-      it "extracts a valid commit SHA" do
-        extract_ref('/relative/gitlab/gitlab-ci/tree/f4b14494ef6abf3d144c28e4af0c20143383e062/CHANGELOG').should ==
-          ['f4b14494ef6abf3d144c28e4af0c20143383e062', 'CHANGELOG']
-      end
-
-      it "extracts a timestamp" do
-        extract_ref('/relative/gitlab/gitlab-ci/tree/v2.0.0/CHANGELOG?_=12354435').should == ['v2.0.0', 'CHANGELOG']
-      end
-    end
   end
 end
-- 
GitLab