git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Teach git-p4 to ignore case in perforce filenames if configured.

From
Tor Arvid Lund <torarvid@gmail.com>
Date
Feb 8, 2011, 11:11 UTC
Message-ID
<1297163499-18776-1-git-send-email-torarvid@gmail.com>

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.
---
 contrib/fast-import/git-p4     |   22 ++++++++++++++--------
 contrib/fast-import/git-p4.txt |   12 ++++++++++++
 2 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index 04ce7e3..ca3cea0 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -452,6 +452,12 @@ def p4ChangesForPaths(depotPaths, changeRange):
     changelist.sort()
     return changelist
 
+def p4PathStartsWith(path, prefix):
+    ignorecase = gitConfig("git-p4.ignorecase").lower()
+    if ignorecase in ["true", "yes", "1"]:
+        return path.lower().startswith(prefix.lower())
+    return path.startswith(prefix)
+
 class Command:
     def __init__(self):
         self.usage = "usage: %prog [options]"
@@ -599,7 +605,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
@@ -891,11 +897,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
@@ -914,7 +920,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
@@ -925,7 +931,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
@@ -1031,7 +1037,7 @@ class P4Sync(Command):
         for f in files:
             includeFile = True
             for val in self.clientSpecDirs:
-                if f['path'].startswith(val[0]):
+                if p4PathStartsWith(f['path'], val[0]):
                     if val[1] <= 0:
                         includeFile = False
                     break
@@ -1077,7 +1083,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)
@@ -1241,7 +1247,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]
 
diff --git a/contrib/fast-import/git-p4.txt b/contrib/fast-import/git-p4.txt
index 49b3359..bf7904a 100644
--- a/contrib/fast-import/git-p4.txt
+++ b/contrib/fast-import/git-p4.txt
@@ -191,6 +191,18 @@ git-p4.useclientspec
 
   git config [--global] git-p4.useclientspec false
 
+git-p4.ignorecase
+
+If this variable is set to 'true' (or 'yes' or '1'), perforce paths like:
+
+//depot/Path/
+//depot/path/
+//dePoT/PATH/
+
+will all be considered to be the same directory.
+
+  git config [--global] git-p4.ignorecase false
+
 Implementation Details...
 =========================
 
-- 
1.7.3.1.68.g06779.dirty
Next: Pete Wyckoff
Message 1 of 2 in “Teach git-p4 to ignore case in perforce filenames if configured.”
  1. Teach git-p4 to ignore case in perforce filenames if configured.Tor Arvid Lund, Feb 8, 2011
  2. Pete WyckoffFeb 11, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.