diff --git a/lib/git/status.rb b/lib/git/status.rb index d31dc7b4..f937cba1 100644 --- a/lib/git/status.rb +++ b/lib/git/status.rb @@ -34,7 +34,11 @@ def changed # changed?('lib/git.rb') # @return [Boolean] def changed?(file) - changed.member?(file) + if ignore_case? + changed.keys.map(&:downcase).include?(file.downcase) + else + changed.member?(file) + end end # Returns an Enumerable containing files that have been added. @@ -54,7 +58,11 @@ def added # added?('lib/git.rb') # @return [Boolean] def added?(file) - added.member?(file) + if ignore_case? + added.keys.map(&:downcase).include?(file.downcase) + else + added.member?(file) + end end # @@ -75,7 +83,11 @@ def deleted # deleted?('lib/git.rb') # @return [Boolean] def deleted?(file) - deleted.member?(file) + if ignore_case? + deleted.keys.map(&:downcase).include?(file.downcase) + else + deleted.member?(file) + end end # @@ -96,7 +108,11 @@ def untracked # untracked?('lib/git.rb') # @return [Boolean] def untracked?(file) - untracked.member?(file) + if ignore_case? + untracked.keys.map(&:downcase).include?(file.downcase) + else + untracked.member?(file) + end end def pretty @@ -264,5 +280,15 @@ def fetch_added end end end + + # It's worth noting that (like git itself) this gem will not behave well if + # ignoreCase is set inconsistently with the file-system itself. For details: + # https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreignoreCase + def ignore_case? + return @_ignore_case if defined?(@_ignore_case) + @_ignore_case = @base.config('core.ignoreCase') == 'true' + rescue Git::FailedError + @_ignore_case = false + end end end diff --git a/tests/units/test_status.rb b/tests/units/test_status.rb index b7ad4888..36543bc1 100644 --- a/tests/units/test_status.rb +++ b/tests/units/test_status.rb @@ -92,6 +92,7 @@ def test_dot_files_status def test_added_boolean in_temp_dir do |path| git = Git.clone(@wdir, 'test_dot_files_status') + git.config('core.ignorecase', 'false') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') create_file('test_dot_files_status/test_file_2', 'content tets_file_2') @@ -100,12 +101,17 @@ def test_added_boolean assert(git.status.added?('test_file_1')) assert(!git.status.added?('test_file_2')) + assert(!git.status.added?('TEST_FILE_1')) + + git.config('core.ignorecase', 'true') + assert(git.status.added?('TEST_FILE_1')) end end def test_changed_boolean in_temp_dir do |path| git = Git.clone(@wdir, 'test_dot_files_status') + git.config('core.ignorecase', 'false') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') create_file('test_dot_files_status/test_file_2', 'content tets_file_2') @@ -117,12 +123,20 @@ def test_changed_boolean assert(git.status.changed?('test_file_1')) assert(!git.status.changed?('test_file_2')) + + update_file('test_dot_files_status/scott/text.txt', 'definitely different') + assert(git.status.changed?('scott/text.txt')) + assert(!git.status.changed?('scott/TEXT.txt')) + + git.config('core.ignorecase', 'true') + assert(git.status.changed?('scott/TEXT.txt')) end end def test_deleted_boolean in_temp_dir do |path| git = Git.clone(@wdir, 'test_dot_files_status') + git.config('core.ignorecase', 'false') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') create_file('test_dot_files_status/test_file_2', 'content tets_file_2') @@ -133,6 +147,10 @@ def test_deleted_boolean assert(git.status.deleted?('test_file_1')) assert(!git.status.deleted?('test_file_2')) + assert(!git.status.deleted?('TEST_FILE_1')) + + git.config('core.ignorecase', 'true') + assert(git.status.deleted?('TEST_FILE_1')) end end @@ -189,6 +207,7 @@ def test_untracked_from_subdir def test_untracked_boolean in_temp_dir do |path| git = Git.clone(@wdir, 'test_dot_files_status') + git.config('core.ignorecase', 'false') create_file('test_dot_files_status/test_file_1', 'content tets_file_1') create_file('test_dot_files_status/test_file_2', 'content tets_file_2') @@ -196,6 +215,10 @@ def test_untracked_boolean assert(git.status.untracked?('test_file_1')) assert(!git.status.untracked?('test_file_2')) + assert(!git.status.untracked?('TEST_FILE_1')) + + git.config('core.ignorecase', 'true') + assert(git.status.untracked?('TEST_FILE_1')) end end