Skip to content

Commit d943bf4

Browse files
nevinerajcouball
authored andcommittedJun 1, 2024
When core.ignoreCase, check for changed files case-insensitively
Fixed #586. Include a note about the inconsistent behavior when ignoreCase is not set to match the case-sensitivity of the file-system itself.
1 parent 3d73448 commit d943bf4

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed
 

Diff for: ‎lib/git/status.rb

+15-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ def changed
3434
# changed?('lib/git.rb')
3535
# @return [Boolean]
3636
def changed?(file)
37-
changed.member?(file)
37+
if ignore_case?
38+
changed.keys.map(&:downcase).include?(file.downcase)
39+
else
40+
changed.member?(file)
41+
end
3842
end
3943

4044
# Returns an Enumerable containing files that have been added.
@@ -264,5 +268,15 @@ def fetch_added
264268
end
265269
end
266270
end
271+
272+
# It's worth noting that (like git itself) this gem will not behave well if
273+
# ignoreCase is set inconsistently with the file-system itself. For details:
274+
# https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreignoreCase
275+
def ignore_case?
276+
return @_ignore_case if defined?(@_ignore_case)
277+
@_ignore_case = @base.config('core.ignoreCase') == 'true'
278+
rescue Git::FailedError
279+
@_ignore_case = false
280+
end
267281
end
268282
end

Diff for: ‎tests/units/test_status.rb

+8
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def test_added_boolean
106106
def test_changed_boolean
107107
in_temp_dir do |path|
108108
git = Git.clone(@wdir, 'test_dot_files_status')
109+
git.config('core.ignorecase', 'false')
109110

110111
create_file('test_dot_files_status/test_file_1', 'content tets_file_1')
111112
create_file('test_dot_files_status/test_file_2', 'content tets_file_2')
@@ -117,6 +118,13 @@ def test_changed_boolean
117118

118119
assert(git.status.changed?('test_file_1'))
119120
assert(!git.status.changed?('test_file_2'))
121+
122+
update_file('test_dot_files_status/scott/text.txt', 'definitely different')
123+
assert(git.status.changed?('scott/text.txt'))
124+
assert(!git.status.changed?('scott/TEXT.txt'))
125+
126+
git.config('core.ignorecase', 'true')
127+
assert(git.status.changed?('scott/TEXT.txt'))
120128
end
121129
end
122130

0 commit comments

Comments
 (0)