On 04/03/08 14:45:38, Kevin Green wrote: > On 04/03/08 14:32:32, Simon Hausmann wrote: > > > > Last but not least we could of course also generate the entire Files: section > > ourselves, using 'p4 change -o' just to get the rest of the template right. > > > > I almost prefer the last approach, since we know the base depot path and the > > relative paths of all edited/added files. > > > > What do you think? > > > > Thank you... That's the right approach. Stop as soon as we get to the Files: > section and then just add in the depot + filepath string for each change... > And here's the patch that does what we just described... --Kevin >From dff9c9a00e3aaf41023ff11ecc75902a87b4c16b Mon Sep 17 00:00:00 2001 From: Kevin Green <Kevin.Green@xxxxxxxxxxxxxxxxx> Date: Thu, 3 Apr 2008 15:47:07 -0400 Subject: [PATCH] git-p4: Work around race between p4_edit and p4_change There exists a race in p4, such that p4_edit immediately followed by a p4_change will not show the new edits in the changelist template. Instead of removing files not in our concerned depot from the Files: section we instead use p4_change as a template only up to the Files: section and then file in the files explicitly ourselves, since we know the full list of files and they current state, e.g. add, delete, edit. Signed-off-by: Kevin Green <Kevin.Green@xxxxxxxxxxxxxxxxx> --- contrib/fast-import/git-p4 | 30 ++++++++++++++---------------- 1 files changed, 14 insertions(+), 16 deletions(-) diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4 index d8de9f6..7760764 100755 --- a/contrib/fast-import/git-p4 +++ b/contrib/fast-import/git-p4 @@ -511,29 +511,20 @@ class P4Submit(Command): def prepareSubmitTemplate(self): # remove lines in the Files section that show changes to files outside the depot path we're committing into template = "" - inFilesSection = False for line in read_pipe_lines("p4 change -o"): if line.endswith("\r\n"): line = line[:-2] + "\n" - if inFilesSection: - if line.startswith("\t"): - # path starts and ends with a tab - path = line[1:] - lastTab = path.rfind("\t") - if lastTab != -1: - path = path[:lastTab] - if not path.startswith(self.depotPath): - continue - else: - inFilesSection = False - else: - if line.startswith("Files:"): - inFilesSection = True + if line.startswith("Files:"): + template += line + break template += line return template + def addToFilesSection(self, path, type): + return "\t" + self.depotPath + "/" + path + "\t# " + type + "\n" + def applyCommit(self, id): print "Applying %s" % (read_pipe("git log --max-count=1 --pretty=oneline %s" % id)) diffOpts = ("", "-M")[self.detectRename] @@ -609,11 +600,19 @@ class P4Submit(Command): system(applyPatchCmd) + template = self.prepareSubmitTemplate() + for f in filesToAdd: system("p4 add \"%s\"" % f) + template += self.addToFilesSection(f,"add") + for f in filesToDelete: system("p4 revert \"%s\"" % f) system("p4 delete \"%s\"" % f) + template += self.addToFilesSection(f,"delete") + + for f in editedFiles: + template += self.addToFilesSection(f,"edit") # Set/clear executable bits for f in filesToChangeExecBit.keys(): @@ -623,7 +622,6 @@ class P4Submit(Command): logMessage = extractLogMessageFromGitCommit(id) logMessage = logMessage.strip() - template = self.prepareSubmitTemplate() if self.interactive: submitTemplate = self.prepareLogMessage(template, logMessage) -- 1.5.4.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html