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

[PATCH v2 7/8] git-p4: decode p4 wildcard characters

From
PWPete Wyckoff <pw@padd.com>
Date
Feb 19, 2011, 13:18 UTC
Message-ID
<1298121481-7005-8-git-send-email-pw@padd.com>
In-Reply-To
<1298121481-7005-1-git-send-email-pw@padd.com>

There are four wildcard characters in p4. Files with these characters can be added to p4 repos using the "-f" option. They are stored in %xx notation, and when checked out, p4 converts them back to normal.

This patch does the same thing when importing into git, converting the four special characters. Without this change, the files appear with literal %xx in their names.

Be careful not to produce "*" in filenames on windows. That will fail.

Signed-off-by: Pete Wyckoff <pw@padd.com>
---
 contrib/fast-import/git-p4 |   18 ++++++++++++++++++
 t/t9800-git-p4.sh          |   22 ++++++++++++++++++++++
 2 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index 04e6c3d..98597d3 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -884,6 +884,23 @@ class P4Sync(Command):
         if gitConfig("git-p4.syncFromOrigin") == "false":
             self.syncWithOrigin = False
 
+    #
+    # P4 wildcards are not allowed in filenames.  P4 complains
+    # if you simply add them, but you can force it with "-f", in
+    # which case it translates them into %xx encoding internally.
+    # Search for and fix just these four characters.  Do % last so
+    # that fixing it does not inadvertently create new %-escapes.
+    #
+    def wildcard_decode(self, path):
+        # Cannot have * in a filename in windows; untested as to
+        # what p4 would do in such a case.
+        if not self.isWindows:
+            path = path.replace("%2A", "*")
+        path = path.replace("%23", "#") \
+                   .replace("%40", "@") \
+                   .replace("%25", "%")
+        return path
+
     def extractFilesFromCommit(self, commit):
         self.cloneExclude = [re.sub(r"\.\.\.$", "", path)
                              for path in self.cloneExclude]
@@ -962,6 +979,7 @@ class P4Sync(Command):
 	    return
 
         relPath = self.stripRepoPath(file['depotFile'], self.branchPrefixes)
+        relPath = self.wildcard_decode(relPath)
         if verbose:
             sys.stderr.write("%s\n" % relPath)
 
diff --git a/t/t9800-git-p4.sh b/t/t9800-git-p4.sh
index c1ea4d4..026277a 100755
--- a/t/t9800-git-p4.sh
+++ b/t/t9800-git-p4.sh
@@ -58,6 +58,28 @@ test_expect_success 'exit when p4 fails to produce marshaled output' '
 	test_must_fail grep -q Traceback errs
 '
 
+test_expect_success 'add p4 files with wildcards in the names' '
+	cd "$cli" &&
+	echo file-wild-hash >file-wild#hash &&
+	echo file-wild-star >file-wild\*star &&
+	echo file-wild-at >file-wild@at &&
+	echo file-wild-percent >file-wild%percent &&
+	p4 add -f file-wild* &&
+	p4 submit -d "file wildcards" &&
+	cd "$TRASH_DIRECTORY"
+'
+
+test_expect_success 'wildcard files git-p4 clone' '
+	"$GITP4" clone --dest="$git" //depot &&
+	cd "$git" &&
+	test -f file-wild#hash &&
+	test -f file-wild\*star &&
+	test -f file-wild@at &&
+	test -f file-wild%percent &&
+	cd "$TRASH_DIRECTORY" &&
+	rm -rf "$git" && mkdir "$git"
+'
+
 test_expect_success 'shutdown' '
 	pid=`pgrep -f p4d` &&
 	test -n "$pid" &&
-- 
1.7.4.1
Previous: Pete WyckoffNext: Junio C Hamano
Message 10 of 16 in “git-p4 fixes and enhancements”
  1. 0/8 git-p4 fixes and enhancementsPete Wyckoff, Feb 19, 2011
  2. 1/8 git-p4: test scriptPete Wyckoff, Feb 19, 2011
  3. 2/8 git-p4: fix key error for p4 problemPete Wyckoff, Feb 19, 2011
  4. 3/8 git-p4: add missing newline in initial import messagePete Wyckoff, Feb 19, 2011
  5. 4/8 git-p4: accommodate new move/delete type in p4Pete Wyckoff, Feb 19, 2011
  6. Junio C HamanoFeb 21, 2011
  7. 5/8 git-p4: reinterpret confusing p4 messagePete Wyckoff, Feb 19, 2011
  8. Tor Arvid LundFeb 23, 2011
  9. 6/8 git-p4: better message for "git-p4 sync" when not clonedPete Wyckoff, Feb 19, 2011
  10. 7/8 git-p4: decode p4 wildcard charactersPete Wyckoff, Feb 19, 2011
  11. Junio C HamanoFeb 21, 2011
  12. Pete WyckoffFeb 24, 2011
  13. Tor Arvid LundFeb 24, 2011
  14. Junio C HamanoFeb 24, 2011
  15. Pete WyckoffFeb 27, 2011
  16. 8/8 git-p4: support clone --barePete Wyckoff, Feb 19, 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.