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

[PATCH] git-p4: Fix race between p4_edit and p4_change

From
KGKevin Green <kevin.t.green@morganstanley.com>
Date
Apr 1, 2008, 22:28 UTC
Message-ID
<20080401222856.GA22542@morganstanley.com>
Hi,

Ran into a nasty race today with git-p4. The changelist Files: section was showing up empty and it turned out to be a race between the p4_edit and p4_change -o, e.g.

$ p4 edit $file && p4 change -o
will show no files in the Files: section.

I attach a patch after my .sig as a suggested fix. It simply loops over the p4_changes -o as long as we're not finding any files (and we always should since we just did a p4_edit!); sleeping for 3 secs in between to allow Perforce to catch up with itself.

Thanks
--Kevin
>From 9b3b151f46dc30b9087010bb06defad9d06dfc72 Mon Sep 17 00:00:00 2001
From: Kevin Green <Kevin.Green@morganstanley.com>
Date: Tue, 1 Apr 2008 18:11:32 -0400
Subject: [PATCH] git-p4: Fix race between p4_edit and p4_change

While generating the changelist from 'p4 change -o' it's possible that perforce hasn't caught up from the preceding 'p4 edit $file'. This leaves us with a Files: section that is completely empty and subsequently the p4_submit fails.

This fix loops over a flag for finding something in the Files: section. We just did a p4_edit so there must be something there. If nothing's found, then sleep for a short time (3 secs) and try all over again.

Signed-off-by: Kevin Green <Kevin.Green@morganstanley.com>
---
 contrib/fast-import/git-p4 |   46 +++++++++++++++++++++++++------------------
 1 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index d8de9f6..5ae71ad 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -510,27 +510,35 @@ 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
+        notdone = True
+        while notdone:
+            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:
+                                notdone = False
+                    else:
+                        inFilesSection = False
                 else:
-                    inFilesSection = False
-            else:
-                if line.startswith("Files:"):
-                    inFilesSection = True
+                    if line.startswith("Files:"):
+                        inFilesSection = True
+
+                template += line
 
-            template += line
+            # Perforce hasn't caught up with itself yet, so wait a bit and try again
+            print "Waiting for Perforce to catch up"
+            time.sleep(3)
 
         return template
 
-- 
1.5.4.2
Next: Simon Hausmann
Message 1 of 5 in “git-p4: Fix race between p4_edit and p4_change”
  1. git-p4: Fix race between p4_edit and p4_changeKevin Green, Apr 1, 2008
  2. Simon HausmannApr 3, 2008
  3. Kevin GreenApr 3, 2008
  4. git-p4: Work around race between p4_edit and p4_changeKevin Green, Apr 3, 2008
  5. Kevin GreenApr 11, 2008

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.