From 5687bd24844b5a244b4888ae0f9e26c13aea720e Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 6 Aug 2017 21:46:38 -0700 Subject: Fix SSH support for Git for Windows v2.14 Git For Windows 2.14 has a patch that changes `git-upload-pack` to `git upload-pack`. To make this work for gitlab-shell, just map this to `git-upload-pack`. Closes gitlab-org/gitlab-ce#36028 --- CHANGELOG | 3 +++ lib/gitlab_shell.rb | 15 ++++++++++++--- spec/gitlab_shell_spec.rb | 12 ++++++++++-- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index aba2035..96e9346 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +v5.8.0 + - Fix SSH support for Git for Windows v2.14 + v5.7.0 - Support unhiding of all refs via Gitaly diff --git a/lib/gitlab_shell.rb b/lib/gitlab_shell.rb index fbbc0da..243c629 100644 --- a/lib/gitlab_shell.rb +++ b/lib/gitlab_shell.rb @@ -38,7 +38,7 @@ class GitlabShell end args = Shellwords.shellwords(origin_cmd) - parse_cmd(args) + args = parse_cmd(args) if GIT_COMMANDS.include?(args.first) GitlabMetrics.measure('verify-access') { verify_access } @@ -70,10 +70,17 @@ class GitlabShell protected def parse_cmd(args) - @command = args.first + # Handle Git for Windows 2.14 using "git upload-pack" instead of git-upload-pack + if args.length == 3 && args.first == 'git' + @command = "git-#{args[1]}" + args = [@command, args.last] + else + @command = args.first + end + @git_access = @command - return if API_COMMANDS.include?(@command) + return args if API_COMMANDS.include?(@command) raise DisallowedCommandError unless GIT_COMMANDS.include?(@command) @@ -93,6 +100,8 @@ class GitlabShell raise DisallowedCommandError unless args.count == 2 @repo_name = args.last end + + args end def verify_access diff --git a/spec/gitlab_shell_spec.rb b/spec/gitlab_shell_spec.rb index 6f4f363..8b72cdd 100644 --- a/spec/gitlab_shell_spec.rb +++ b/spec/gitlab_shell_spec.rb @@ -132,8 +132,8 @@ describe GitlabShell do describe :exec do let(:gitaly_message) { JSON.dump({ 'repository' => { 'relative_path' => repo_name, 'storage_name' => 'default' }, 'gl_repository' => gl_repository , 'gl_id' => key_id}) } - context 'git-upload-pack' do - let(:ssh_cmd) { "git-upload-pack gitlab-ci.git" } + shared_examples_for 'upload-pack' do |command| + let(:ssh_cmd) { "#{command} gitlab-ci.git" } after { subject.exec(ssh_cmd) } it "should process the command" do @@ -157,6 +157,14 @@ describe GitlabShell do end end + context 'git-upload-pack' do + it_behaves_like 'upload-pack', 'git-upload-pack' + end + + context 'git upload-pack' do + it_behaves_like 'upload-pack', 'git upload-pack' + end + context 'gitaly-upload-pack with GeoNode' do let(:ssh_cmd) { "git-upload-pack gitlab-ci.git" } let(:gitaly_check_access_with_geo) { GitAccessStatus.new(true, 'ok', gl_repository, repo_path, { 'repository' => { 'relative_path' => repo_name, 'storage_name' => 'default'} , 'address' => 'unix:gitaly.socket' }, true) } -- cgit v1.2.1