Merge branch 'project-path-case-sensitivity' into 'master'
Prefer project with exact path to differently cased one when both exist. Fixes #3113. See merge request !1649
This commit is contained in:
commit
7924dd5c9f
4 changed files with 35 additions and 12 deletions
|
@ -124,7 +124,6 @@ class ApplicationController < ActionController::Base
|
|||
project_path = "#{namespace}/#{id}"
|
||||
@project = Project.find_with_namespace(project_path)
|
||||
|
||||
|
||||
if @project and can?(current_user, :read_project, @project)
|
||||
if @project.path_with_namespace != project_path
|
||||
redirect_to request.original_url.gsub(project_path, @project.path_with_namespace) and return
|
||||
|
|
|
@ -243,11 +243,12 @@ class Project < ActiveRecord::Base
|
|||
# Use of unscoped ensures we're not secretly adding any ORDER BYs, which
|
||||
# have a negative impact on performance (and aren't needed for this
|
||||
# query).
|
||||
unscoped.
|
||||
projects = unscoped.
|
||||
joins(:namespace).
|
||||
iwhere('namespaces.path' => namespace_path).
|
||||
iwhere('projects.path' => project_path).
|
||||
take
|
||||
iwhere('namespaces.path' => namespace_path)
|
||||
|
||||
projects.where('projects.path' => project_path).take ||
|
||||
projects.iwhere('projects.path' => project_path).take
|
||||
end
|
||||
|
||||
def visibility_levels
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module Gitlab
|
||||
module Database
|
||||
def self.mysql?
|
||||
ActiveRecord::Base.connection.adapter_name.downcase == 'mysql'
|
||||
ActiveRecord::Base.connection.adapter_name.downcase == 'mysql2'
|
||||
end
|
||||
|
||||
def self.postgresql?
|
||||
|
|
|
@ -51,16 +51,39 @@ describe ProjectsController do
|
|||
end
|
||||
|
||||
context "when requested with case sensitive namespace and project path" do
|
||||
it "redirects to the normalized path for case mismatch" do
|
||||
get :show, namespace_id: public_project.namespace.path, id: public_project.path.upcase
|
||||
context "when there is a match with the same casing" do
|
||||
it "loads the project" do
|
||||
get :show, namespace_id: public_project.namespace.path, id: public_project.path
|
||||
|
||||
expect(response).to redirect_to("/#{public_project.path_with_namespace}")
|
||||
expect(assigns(:project)).to eq(public_project)
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
end
|
||||
|
||||
it "loads the page if normalized path matches request path" do
|
||||
get :show, namespace_id: public_project.namespace.path, id: public_project.path
|
||||
context "when there is a match with different casing" do
|
||||
it "redirects to the normalized path" do
|
||||
get :show, namespace_id: public_project.namespace.path, id: public_project.path.upcase
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(assigns(:project)).to eq(public_project)
|
||||
expect(response).to redirect_to("/#{public_project.path_with_namespace}")
|
||||
end
|
||||
|
||||
|
||||
# MySQL queries are case insensitive by default, so this spec would fail.
|
||||
if Gitlab::Database.postgresql?
|
||||
context "when there is also a match with the same casing" do
|
||||
|
||||
let!(:other_project) { create(:project, :public, namespace: public_project.namespace, path: public_project.path.upcase) }
|
||||
|
||||
it "loads the exactly matched project" do
|
||||
|
||||
get :show, namespace_id: public_project.namespace.path, id: public_project.path.upcase
|
||||
|
||||
expect(assigns(:project)).to eq(other_project)
|
||||
expect(response.status).to eq(200)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue