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

[PATCH v2] git-p4: map a P4 user to Git author name and email address

From
larsxschneider@gmail.com <larsxschneider@gmail.com>
Date
Mar 1, 2016, 10:49 UTC
Message-ID
<1456829396-38659-1-git-send-email-larsxschneider@gmail.com>
From: Lars Schneider <lars.schneider@autodesk.com>

Map a P4 user to a specific name and email address in Git with the "git-p4.mapUser" config. The config value must be a string adhering to the format "p4user = First Lastname <email@address.com>".

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
---
diff to v1:
* use '=' instead of '->' to mimic SVN user mapping format (thanks Eric)
* fix ASCII doc formatting (thanks Eric)
* fix broken && chain in test (thanks Eric)
* use more innocuous names for test users (thanks Luke and Torsten)
* make regex accept more blank characters

Cheers, Lars

 Documentation/git-p4.txt   | 11 +++++++++
 git-p4.py                  |  9 +++++++
 t/t9828-git-p4-map-user.sh | 61 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 81 insertions(+)
 create mode 100755 t/t9828-git-p4-map-user.sh
diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index 738cfde..9f077fd 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -553,6 +553,17 @@ git-p4.keepEmptyCommits::
 	A changelist that contains only excluded files will be imported
 	as an empty commit if this boolean option is set to true.

+git-p4.mapUser::
+	Map a P4 user to a name and email address in Git. Use a string
+	with the following format to create a mapping:
++
+-------------
+git config --add git-p4.mapUser "p4user = First Last <mail@address.com>"
+-------------
++
+A mapping will override any user information from P4. Mappings for
+multiple P4 user can be defined.
+
 Submit variables
 ~~~~~~~~~~~~~~~~
 git-p4.detectRenames::
diff --git a/git-p4.py b/git-p4.py
index c33dece..bac341d 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1160,6 +1160,15 @@ class P4UserMap:
             self.users[output["User"]] = output["FullName"] + " <" + output["Email"] + ">"
             self.emails[output["Email"]] = output["User"]

+        mapUserConfigRegex = re.compile(r"^\s*(\S+)\s*=\s*(.+)\s*<(\S+)>\s*$", re.VERBOSE)
+        for mapUserConfig in gitConfigList("git-p4.mapUser"):
+            mapUser = mapUserConfigRegex.findall(mapUserConfig)
+            if mapUser and len(mapUser[0]) == 3:
+                user = mapUser[0][0]
+                fullname = mapUser[0][1]
+                email = mapUser[0][2]
+                self.users[user] = fullname + " <" + email + ">"
+                self.emails[email] = user

         s = ''
         for (key, val) in self.users.items():
diff --git a/t/t9828-git-p4-map-user.sh b/t/t9828-git-p4-map-user.sh
new file mode 100755
index 0000000..e20395c
--- /dev/null
+++ b/t/t9828-git-p4-map-user.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+test_description='Clone repositories and map users'
+
+. ./lib-git-p4.sh
+
+test_expect_success 'start p4d' '
+	start_p4d
+'
+
+test_expect_success 'Create a repo with different users' '
+	client_view "//depot/... //client/..." &&
+	(
+		cd "$cli" &&
+
+		>author.txt &&
+		p4 add author.txt &&
+		p4 submit -d "Add file author\\n" &&
+
+		P4USER=mmax &&
+		>max.txt &&
+		p4 add max.txt &&
+		p4 submit -d "Add file max" &&
+
+		P4USER=eri &&
+		>moritz.txt &&
+		p4 add moritz.txt &&
+		p4 submit -d "Add file moritz" &&
+
+		P4USER=no &&
+		>nobody.txt &&
+		p4 add nobody.txt &&
+		p4 submit -d "Add file nobody"
+	)
+'
+
+test_expect_success 'Clone repo root path with all history' '
+	client_view "//depot/... //client/..." &&
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init . &&
+		git config --add git-p4.mapUser "mmax = Max Musterman   <max@example.com> "  &&
+		git config --add git-p4.mapUser "  eri=Erika Musterman <erika@example.com>" &&
+		git p4 clone --use-client-spec --destination="$git" //depot@all &&
+		cat >expect <<-\EOF &&
+			no <no@client>
+			Erika Musterman <erika@example.com>
+			Max Musterman <max@example.com>
+			Dr. author <author@example.com>
+		EOF
+		git log --format="%an <%ae>" >actual &&
+		test_cmp expect actual
+	)
+'
+
+test_expect_success 'kill p4d' '
+	kill_p4d
+'
+
+test_done
--
2.5.1
Next: Lars Schneider
Message 1 of 9 in “git-p4: map a P4 user to Git author name and email address”
  1. git-p4: map a P4 user to Git author name and email addresslarsxschneider@gmail.com, Mar 1, 2016
  2. Lars SchneiderMar 1, 2016
  3. Eric SunshineMar 1, 2016
  4. Luke DiamandMar 2, 2016
  5. Lars SchneiderMar 2, 2016
  6. Lars SchneiderMar 13, 2016
  7. Luke DiamandMar 15, 2016
  8. Junio C HamanoMar 15, 2016
  9. Luke DiamandMar 15, 2016

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.