Skip to content

Commit

Permalink
Properly escape double quotes in shell commands on Windows (#552)
Browse files Browse the repository at this point in the history
* Add test for properly escaping double quote on Windows
* Properly escape Windows command line arguments

Signed-off-by: James Couball <jcouball@yahoo.com>
  • Loading branch information
jcouball committed Jan 3, 2022
1 parent db060fc commit ea28118
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lib/git/lib.rb
Expand Up @@ -1191,8 +1191,9 @@ def escape_for_sh(s)
end

def escape_for_windows(s)
# Windows does not need single quote escaping inside double quotes
%Q{"#{s}"}
# Escape existing double quotes in s and then wrap the result with double quotes
escaped_string = s.to_s.gsub('"','\\"')
%Q{"#{escaped_string}"}
end

def windows_platform?
Expand Down
22 changes: 22 additions & 0 deletions tests/units/test_windows_cmd_escaping.rb
@@ -0,0 +1,22 @@
#!/usr/bin/env ruby
# encoding: utf-8

require File.dirname(__FILE__) + '/../test_helper'

# Test diff when the file path has to be quoted according to core.quotePath
# See https://git-scm.com/docs/git-config#Documentation/git-config.txt-corequotePath
#
class TestWindowsCmdEscaping < Test::Unit::TestCase
def test_commit_with_double_quote_in_commit_message
expected_commit_message = 'Commit message with "double quotes"'
in_temp_dir do |path|
create_file('README.md', "# README\n")
git = Git.init('.')
git.add
git.commit(expected_commit_message)
commits = git.log(1)
actual_commit_message = commits.first.message
assert_equal(expected_commit_message, actual_commit_message)
end
end
end

0 comments on commit ea28118

Please sign in to comment.