Skip to content

Commit

Permalink
Teach git-p4 to ignore case in perforce filenames if configured.
Browse files Browse the repository at this point in the history
When files are added to perforce, the path to that file has whichever case
configuration that exists on the machine of the user who added the file.
What does that mean? It means that when Alice adds a file

//depot/DirA/FileA.txt

... and Bob adds:

//depot/dirA/FileB.txt

... we may or may not get a problem. If a user sets the config variable
git-p4.ignorecase to "true", we will consider //depot/DirA and //depot/dirA
to be the same directory.

Signed-off-by: Tor Arvid Lund <torarvid@gmail.com>
Acked-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Tor Arvid Lund authored and Junio C Hamano committed Mar 15, 2011
1 parent 99f790f commit d53de8b
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions contrib/fast-import/git-p4
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,19 @@ def p4ChangesForPaths(depotPaths, changeRange):
changelist.sort()
return changelist

def p4PathStartsWith(path, prefix):
# This method tries to remedy a potential mixed-case issue:
#
# If UserA adds //depot/DirA/file1
# and UserB adds //depot/dira/file2
#
# we may or may not have a problem. If you have core.ignorecase=true,
# we treat DirA and dira as the same directory
ignorecase = gitConfig("core.ignorecase", "--bool") == "true"
if ignorecase:
return path.lower().startswith(prefix.lower())
return path.startswith(prefix)

class Command:
def __init__(self):
self.usage = "usage: %prog [options]"
Expand Down Expand Up @@ -603,7 +616,7 @@ class P4Submit(Command):
lastTab = path.rfind("\t")
if lastTab != -1:
path = path[:lastTab]
if not path.startswith(self.depotPath):
if not p4PathStartsWith(path, self.depotPath):
continue
else:
inFilesSection = False
Expand Down Expand Up @@ -941,11 +954,11 @@ class P4Sync(Command):
path = commit["depotFile%s" % fnum]

if [p for p in self.cloneExclude
if path.startswith (p)]:
if p4PathStartsWith(path, p)]:
found = False
else:
found = [p for p in self.depotPaths
if path.startswith (p)]
if p4PathStartsWith(path, p)]
if not found:
fnum = fnum + 1
continue
Expand Down Expand Up @@ -980,7 +993,7 @@ class P4Sync(Command):
prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])]

for p in prefixes:
if path.startswith(p):
if p4PathStartsWith(path, p):
path = path[len(p):]

return path
Expand All @@ -991,7 +1004,7 @@ class P4Sync(Command):
while commit.has_key("depotFile%s" % fnum):
path = commit["depotFile%s" % fnum]
found = [p for p in self.depotPaths
if path.startswith (p)]
if p4PathStartsWith(path, p)]
if not found:
fnum = fnum + 1
continue
Expand Down Expand Up @@ -1144,7 +1157,7 @@ class P4Sync(Command):
# create a commit.
new_files = []
for f in files:
if [p for p in branchPrefixes if f['path'].startswith(p)]:
if [p for p in branchPrefixes if p4PathStartsWith(f['path'], p)]:
new_files.append (f)
else:
sys.stderr.write("Ignoring file outside of prefix: %s\n" % path)
Expand Down Expand Up @@ -1308,7 +1321,7 @@ class P4Sync(Command):
source = paths[0]
destination = paths[1]
## HACK
if source.startswith(self.depotPaths[0]) and destination.startswith(self.depotPaths[0]):
if p4PathStartsWith(source, self.depotPaths[0]) and p4PathStartsWith(destination, self.depotPaths[0]):
source = source[len(self.depotPaths[0]):-4]
destination = destination[len(self.depotPaths[0]):-4]

Expand Down

0 comments on commit d53de8b

Please sign in to comment.