Commit fcc906e6 authored by Jason Hollingsworth's avatar Jason Hollingsworth

Better submodule links.

Detect if submodule is hosted on this GitLab server, gitlab.com or github.com.
Hash links directly to commit in repo.
parent 883409b9
module SubmoduleHelper
include Gitlab::ShellAdapter
# links to files listing for submodule if submodule is a project on this server
def submodule_links(submodule_item)
url = submodule_item.submodule_url
return url, nil unless url =~ /([^\/:]+\/[^\/]+\.git)\Z/
project = $1
project.chomp!('.git')
if self_url?(url, project)
return project_path(project), project_tree_path(project, submodule_item.id)
elsif github_dot_com_url?(url)
standard_links('github.com', project, submodule_item.id)
elsif gitlab_dot_com_url?(url)
standard_links('gitlab.com', project, submodule_item.id)
else
return url, nil
end
end
protected
def github_dot_com_url?(url)
url =~ /github\.com[\/:][^\/]+\/[^\/]+\Z/
end
def gitlab_dot_com_url?(url)
url =~ /gitlab\.com[\/:][^\/]+\/[^\/]+\Z/
end
def self_url?(url, project)
return true if url == [ Gitlab.config.gitlab.url, '/', project, '.git' ].join('')
url == gitlab_shell.url_to_repo(project)
end
def standard_links(host, project, commit)
base = [ 'https://', host, '/', project ].join('')
return base, [ base, '/tree/', commit ].join('')
end
end
\ No newline at end of file
class GollumWiki class GollumWiki
include Gitlab::ShellAdapter
MARKUPS = { MARKUPS = {
"Markdown" => :markdown, "Markdown" => :markdown,
...@@ -113,10 +114,6 @@ class GollumWiki ...@@ -113,10 +114,6 @@ class GollumWiki
"#{@user.username} #{action} page: #{title}" "#{@user.username} #{action} page: #{title}"
end end
def gitlab_shell
@gitlab_shell ||= Gitlab::Shell.new
end
def path_to_repo def path_to_repo
@path_to_repo ||= File.join(Gitlab.config.gitlab_shell.repos_path, "#{path_with_namespace}.git") @path_to_repo ||= File.join(Gitlab.config.gitlab_shell.repos_path, "#{path_with_namespace}.git")
end end
......
- tree, commit = submodule_links(submodule_item)
%tr{ class: "tree-item" } %tr{ class: "tree-item" }
%td.tree-item-file-name %td.tree-item-file-name
= image_tag "submodule.png" = image_tag "submodule.png"
%span %span
= link_to truncate(submodule_item.name, length: 40), submodule_item.submodule_url = link_to truncate(submodule_item.name, length: 40), tree
@ @
%span.monospace #{submodule_item.id[0..10]} %span.monospace
- if commit.nil?
#{submodule_item.id[0..10]}
- else
= link_to "#{submodule_item.id[0..10]}", commit
%td %td
%td %td
%td %td
require 'spec_helper'
describe SubmoduleHelper do
describe 'submodule links' do
let(:submodule_item) { double(submodule_url: '', id: 'hash') }
let(:config) { Gitlab.config.gitlab }
context 'submodule on self' do
before do
Gitlab.config.gitlab.stub(protocol: 'http') # set this just to be sure
end
it 'should detect ssh on standard port' do
Gitlab.config.gitlab.stub(ssh_port: 22) # set this just to be sure
submodule_item.stub(submodule_url: [ config.user, '@', config.host, ':gitlab-org/gitlab-ce.git' ].join(''))
submodule_links(submodule_item).should == [ project_path('gitlab-org/gitlab-ce'), project_tree_path('gitlab-org/gitlab-ce', 'hash') ]
end
it 'should detect ssh on non-standard port' do
Gitlab.config.gitlab_shell.stub(ssh_port: 2222)
Gitlab.config.gitlab_shell.stub(ssh_path_prefix: Settings.send(:build_gitlab_shell_ssh_path_prefix))
submodule_item.stub(submodule_url: [ 'ssh://', config.user, '@', config.host, ':2222/gitlab-org/gitlab-ce.git' ].join(''))
submodule_links(submodule_item).should == [ project_path('gitlab-org/gitlab-ce'), project_tree_path('gitlab-org/gitlab-ce', 'hash') ]
end
it 'should detect http on standard port' do
Gitlab.config.gitlab.stub(port: 80)
Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
submodule_item.stub(submodule_url: [ 'http://', config.host, '/gitlab-org/gitlab-ce.git' ].join(''))
submodule_links(submodule_item).should == [ project_path('gitlab-org/gitlab-ce'), project_tree_path('gitlab-org/gitlab-ce', 'hash') ]
end
it 'should detect http on non-standard port' do
Gitlab.config.gitlab.stub(port: 3000)
Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
submodule_item.stub(submodule_url: [ 'http://', config.host, ':3000/gitlab-org/gitlab-ce.git' ].join(''))
submodule_links(submodule_item).should == [ project_path('gitlab-org/gitlab-ce'), project_tree_path('gitlab-org/gitlab-ce', 'hash') ]
end
it 'should work with relative_url_root' do
Gitlab.config.gitlab.stub(port: 80) # set this just to be sure
Gitlab.config.gitlab.stub(relative_url_root: '/gitlab/root')
Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url))
submodule_item.stub(submodule_url: [ 'http://', config.host, '/gitlab/root/gitlab-org/gitlab-ce.git' ].join(''))
submodule_links(submodule_item).should == [ project_path('gitlab-org/gitlab-ce'), project_tree_path('gitlab-org/gitlab-ce', 'hash') ]
end
end
context 'submodule on github.com' do
it 'should detect ssh' do
submodule_item.stub(submodule_url: 'git@github.com:gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ 'https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash' ]
end
it 'should detect http' do
submodule_item.stub(submodule_url: 'http://github.com/gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ 'https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash' ]
end
it 'should detect https' do
submodule_item.stub(submodule_url: 'https://github.com/gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ 'https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash' ]
end
it 'should return original with non-standard url' do
submodule_item.stub(submodule_url: 'http://github.com/gitlab-org/gitlab-ce')
submodule_links(submodule_item).should == [ submodule_item.submodule_url, nil ]
submodule_item.stub(submodule_url: 'http://github.com/another/gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ submodule_item.submodule_url, nil ]
end
end
context 'submodule on gitlab.com' do
it 'should detect ssh' do
submodule_item.stub(submodule_url: 'git@gitlab.com:gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ 'https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash' ]
end
it 'should detect http' do
submodule_item.stub(submodule_url: 'http://gitlab.com/gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ 'https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash' ]
end
it 'should detect https' do
submodule_item.stub(submodule_url: 'https://gitlab.com/gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ 'https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash' ]
end
it 'should return original with non-standard url' do
submodule_item.stub(submodule_url: 'http://gitlab.com/gitlab-org/gitlab-ce')
submodule_links(submodule_item).should == [ submodule_item.submodule_url, nil ]
submodule_item.stub(submodule_url: 'http://gitlab.com/another/gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ submodule_item.submodule_url, nil ]
end
end
context 'submodule on unsupported' do
it 'should return original' do
submodule_item.stub(submodule_url: 'http://mygitserver.com/gitlab-org/gitlab-ce')
submodule_links(submodule_item).should == [ submodule_item.submodule_url, nil ]
submodule_item.stub(submodule_url: 'http://mygitserver.com/gitlab-org/gitlab-ce.git')
submodule_links(submodule_item).should == [ submodule_item.submodule_url, nil ]
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment