Subject: [PATCH v3] git-p4: show Perforce error to the user

From: "Fahad Alrashed via GitGitGadget" <[email-masked]>
Date: Wed, 08 May 2024 22:11:05 +0000

From: Fahad Alrashed <[email-masked]>

During "git p4 clone" if p4 process returns an error from the server,
it will store the message in the 'err' variable. Then it will send a
text command "die-now" to git-fast-import. However, git-fast-import
raises an exception: "fatal: Unsupported command: die-now" and err is
never displayed. This patch ensures that err is shown to the end user.

Signed-off-by: Fahad Alrashed <[email-masked]>
---
    In git p4, git fast-import fails from die-now command and err (from
    Perforce) is not shown
    
    When importing from Perforce using git p4 clone <depot location>,
    cloning works fine until Perforce command p4 raises an error. This error
    message is stored in err variable then git-fast-import is sent a die-now
    command to kill it. An exception is raised fatal: Unsupported command:
    die-now.
    
    This patch forces python to call die() with the err message returned
    from Perforce.
    
    This commit fixes the root cause of a bug that took me hours to find.
    I'm sure many faced the cryptic error and declared that git-p4 is not
    working for them.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1668%2Falrashedf%2Fmaster-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1668/alrashedf/master-v3
Pull-Request: https://github.com/git/git/pull/1668

Range-diff vs v2:

 1:  8d5b982bd08 ! 1:  16a0693b932 Bug fix: ensure P4 "err" is displayed when exception is raised.
     @@ Metadata
      Author: Fahad Alrashed <[email-masked]>
      
       ## Commit message ##
     -    Bug fix: ensure P4 "err" is displayed when exception is raised.
     +    git-p4: show Perforce error to the user
      
          During "git p4 clone" if p4 process returns an error from the server,
          it will store the message in the 'err' variable. Then it will send a
          text command "die-now" to git-fast-import. However, git-fast-import
          raises an exception: "fatal: Unsupported command: die-now" and err is
     -    never displayed. This patch ensures that err is dispayed using
     -    "finally:".
     +    never displayed. This patch ensures that err is shown to the end user.
      
          Signed-off-by: Fahad Alrashed <[email-masked]>

 git-p4.py | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/git-p4.py b/git-p4.py
index 28ab12c72b6..f1ab31d5403 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -3253,17 +3253,19 @@ def streamP4FilesCb(self, marshalled):
             if self.stream_have_file_info:
                 if "depotFile" in self.stream_file:
                     f = self.stream_file["depotFile"]
-            # force a failure in fast-import, else an empty
-            # commit will be made
-            self.gitStream.write("\n")
-            self.gitStream.write("die-now\n")
-            self.gitStream.close()
-            # ignore errors, but make sure it exits first
-            self.importProcess.wait()
-            if f:
-                die("Error from p4 print for %s: %s" % (f, err))
-            else:
-                die("Error from p4 print: %s" % err)
+            try:
+                # force a failure in fast-import, else an empty
+                # commit will be made
+                self.gitStream.write("\n")
+                self.gitStream.write("die-now\n")
+                self.gitStream.close()
+                # ignore errors, but make sure it exits first
+                self.importProcess.wait()
+            finally:
+                if f:
+                    die("Error from p4 print for %s: %s" % (f, err))
+                else:
+                    die("Error from p4 print: %s" % err)
 
         if 'depotFile' in marshalled and self.stream_have_file_info:
             # start of a new file - output the old one first

base-commit: 235986be822c9f8689be2e9a0b7804d0b1b6d821
-- 
gitgitgadget