diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index 78e5b3a..7d66aa9 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -561,6 +561,8 @@ class P4Submit(Command):
optparse.make_option("--verbose", dest="verbose", action="store_true"),
optparse.make_option("--origin", dest="origin"),
optparse.make_option("-M", dest="detectRenames", action="store_true"),
+ # preserve the user, assumes relevant p4 permissions available
+ optparse.make_option("--preserve-user", dest="preserveUser", action="store_true"),
]
self.description = "Submit changes from git to the perforce depot."
self.usage += " [name of git branch to submit into perforce depot]"@@ -568,6 +570,7 @@ class P4Submit(Command):
self.origin = ""
self.detectRenames = False
self.verbose = False
+ self.preserveUser = False
self.isWindows = (platform.system() == "Windows")
def check(self):@@ -592,6 +595,11 @@ class P4Submit(Command):
else:
continue
else:
+ if self.preserveUser:
+ if self.p4user:
+ if line.startswith("User:"):
+ line = "User: %s" % self.p4user
+
if line.startswith("Description:"):
inDescriptionSection = True
line += "\n"@@ -602,6 +610,18 @@ class P4Submit(Command):
return result
+ def p4User(self,id):
+ # Return the perforce user for a given git commit id
+ git_email = read_pipe("git log --max-count=1 --format='%%ae' %s" % id)
+ git_email = git_email.strip()
+ if not self.email_to_user.has_key(git_email):
+ print("Cannot find perforce user for email %s in commit %s." %
+ (git_email, id))
+ print("Submitting changelist with default user - fixup later manually!")
+ return None
+ else:
+ return self.email_to_user[git_email]
+
def prepareSubmitTemplate(self):
# remove lines in the Files section that show changes to files outside the depot path we're committing into
template = ""@@ -631,6 +651,12 @@ class P4Submit(Command):
def applyCommit(self, id):
print "Applying %s" % (read_pipe("git log --max-count=1 --pretty=oneline %s" % id))
+ if self.preserveUser:
+ p4user = self.p4User(id)
+ self.p4user = p4user
+ if p4user:
+ os.putenv('P4USER', p4user)
+
if not self.detectRenames:
# If not explicitly set check the config variable
self.detectRenames = gitConfig("git-p4.detectRenames").lower() == "true"@@ -847,6 +873,13 @@ class P4Submit(Command):
print "Perforce checkout for depot path %s located at %s" % (self.depotPath, self.clientPath)
self.oldWorkingDirectory = os.getcwd()
+ if self.preserveUser:
+ self.email_to_user = {}
+ for output in p4CmdList("users"):
+ if not output.has_key("User"):
+ continue
+ self.email_to_user[output["Email"]] = output["User"]
+
chdir(self.clientPath)
print "Synchronizing p4 checkout..."
p4_system("sync ...")diff --git a/contrib/fast-import/git-p4.txt b/contrib/fast-import/git-p4.txt
index e09da44..7c3c794 100644
--- a/contrib/fast-import/git-p4.txt
+++ b/contrib/fast-import/git-p4.txt
@@ -110,6 +110,12 @@ is not your current git branch you can also pass that as an argument:
You can override the reference branch with the --origin=mysourcebranch option.
+The Perforce changelists will be created with the user who ran git-p4. If you
+use --preserve-user then git-p4 will attempt to create Perforce changelists
+with the Perforce user corresponding to the git commit author. You need to
+have sufficient permissions within Perforce, and the git users need to have
+Perforce accounts.
+
If a submit fails you may have to "p4 resolve" and submit manually. You can
continue importing the remaining changes with
--
1.7.1