Merge branch 'ld/git-p4-branches-and-labels'

* ld/git-p4-branches-and-labels:
  git-p4: label import fails with multiple labels at the same changelist
  git-p4: add test for p4 labels
  git-p4: importing labels should cope with missing owner
  git-p4: cope with labels with empty descriptions
  git-p4: handle p4 branches and labels containing shell chars
This commit is contained in:
Junio C Hamano
2012-01-31 22:01:14 -08:00
3 changed files with 205 additions and 35 deletions

View File

@ -563,6 +563,26 @@ class Command:
class P4UserMap:
def __init__(self):
self.userMapFromPerforceServer = False
self.myP4UserId = None
def p4UserId(self):
if self.myP4UserId:
return self.myP4UserId
results = p4CmdList("user -o")
for r in results:
if r.has_key('User'):
self.myP4UserId = r['User']
return r['User']
die("Could not find your p4 user id")
def p4UserIsMe(self, p4User):
# return True if the given p4 user is actually me
me = self.p4UserId()
if not p4User or p4User != me:
return False
else:
return True
def getUserCacheFilename(self):
home = os.environ.get("HOME", os.environ.get("USERPROFILE"))
@ -700,7 +720,6 @@ class P4Submit(Command, P4UserMap):
self.verbose = False
self.preserveUser = gitConfig("git-p4.preserveUser").lower() == "true"
self.isWindows = (platform.system() == "Windows")
self.myP4UserId = None
def check(self):
if len(p4CmdList("opened ...")) > 0:
@ -799,7 +818,7 @@ class P4Submit(Command, P4UserMap):
def canChangeChangelists(self):
# check to see if we have p4 admin or super-user permissions, either of
# which are required to modify changelists.
results = p4CmdList("protects %s" % self.depotPath)
results = p4CmdList(["protects", self.depotPath])
for r in results:
if r.has_key('perm'):
if r['perm'] == 'admin':
@ -808,25 +827,6 @@ class P4Submit(Command, P4UserMap):
return 1
return 0
def p4UserId(self):
if self.myP4UserId:
return self.myP4UserId
results = p4CmdList("user -o")
for r in results:
if r.has_key('User'):
self.myP4UserId = r['User']
return r['User']
die("Could not find your p4 user id")
def p4UserIsMe(self, p4User):
# return True if the given p4 user is actually me
me = self.p4UserId()
if not p4User or p4User != me:
return False
else:
return True
def prepareSubmitTemplate(self):
# remove lines in the Files section that show changes to files outside the depot path we're committing into
template = ""
@ -1665,6 +1665,12 @@ class P4Sync(Command, P4UserMap):
if self.stream_file.has_key('depotFile'):
self.streamOneP4File(self.stream_file, self.stream_contents)
def make_email(self, userid):
if userid in self.users:
return self.users[userid]
else:
return "%s <a@b>" % userid
def commit(self, details, files, branch, branchPrefixes, parent = ""):
epoch = details["time"]
author = details["user"]
@ -1688,10 +1694,7 @@ class P4Sync(Command, P4UserMap):
committer = ""
if author not in self.users:
self.getUserMapFromPerforceServer()
if author in self.users:
committer = "%s %s %s" % (self.users[author], epoch, self.tz)
else:
committer = "%s <a@b> %s %s" % (author, epoch, self.tz)
committer = "%s %s %s" % (self.make_email(author), epoch, self.tz)
self.gitStream.write("committer %s\n" % committer)
@ -1736,15 +1739,21 @@ class P4Sync(Command, P4UserMap):
self.gitStream.write("from %s\n" % branch)
owner = labelDetails["Owner"]
tagger = ""
if author in self.users:
tagger = "%s %s %s" % (self.users[owner], epoch, self.tz)
# Try to use the owner of the p4 label, or failing that,
# the current p4 user id.
if owner:
email = self.make_email(owner)
else:
tagger = "%s <a@b> %s %s" % (owner, epoch, self.tz)
email = self.make_email(self.p4UserId())
tagger = "%s %s %s" % (email, epoch, self.tz)
self.gitStream.write("tagger %s\n" % tagger)
self.gitStream.write("data <<EOT\n")
self.gitStream.write(labelDetails["Description"])
self.gitStream.write("EOT\n\n")
description = labelDetails["Description"]
self.gitStream.write("data %d\n" % len(description))
self.gitStream.write(description)
self.gitStream.write("\n")
else:
if not self.silent:
@ -1759,7 +1768,7 @@ class P4Sync(Command, P4UserMap):
def getLabels(self):
self.labels = {}
l = p4CmdList("labels %s..." % ' '.join (self.depotPaths))
l = p4CmdList(["labels"] + ["%s..." % p for p in self.depotPaths])
if len(l) > 0 and not self.silent:
print "Finding files belonging to labels in %s" % `self.depotPaths`
@ -1801,7 +1810,7 @@ class P4Sync(Command, P4UserMap):
command = "branches"
for info in p4CmdList(command):
details = p4Cmd("branch -o %s" % info["branch"])
details = p4Cmd(["branch", "-o", info["branch"]])
viewIdx = 0
while details.has_key("View%s" % viewIdx):
paths = details["View%s" % viewIdx].split(" ")
@ -1939,7 +1948,7 @@ class P4Sync(Command, P4UserMap):
sourceRef = self.gitRefForBranch(sourceBranch)
#print "source " + sourceBranch
branchParentChange = int(p4Cmd("changes -m 1 %s...@1,%s" % (sourceDepotPath, firstChange))["change"])
branchParentChange = int(p4Cmd(["changes", "-m", "1", "%s...@1,%s" % (sourceDepotPath, firstChange)])["change"])
#print "branch parent: %s" % branchParentChange
gitParent = self.gitCommitByP4Change(sourceRef, branchParentChange)
if len(gitParent) > 0: