summaryrefslogtreecommitdiff
path: root/git-p4.py
diff options
context:
space:
mode:
authorLuke Diamand <luke@diamand.org>2020-01-29 11:12:45 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-01-30 20:20:58 (GMT)
commit6026aff5bbe7389fa276188237b58afbef1b07ff (patch)
tree14d8791638c3104dea31569079a10e6d0143c0bc /git-p4.py
parentca5b5cce6290351f8cb63ee4ff466ed4a2285319 (diff)
downloadgit-6026aff5bbe7389fa276188237b58afbef1b07ff.zip
git-6026aff5bbe7389fa276188237b58afbef1b07ff.tar.gz
git-6026aff5bbe7389fa276188237b58afbef1b07ff.tar.bz2
git-p4: cleanup better on error exit
After an error, git-p4 calls die(). This just exits, and leaves child processes still running. Instead of calling die(), raise an exception and catch it where the child process(es) (git-fastimport) are created. This was analyzed in detail here: https://public-inbox.org/git/20190227094926.GE19739@szeder.dev/ This change does not address the particular issue of p4CmdList() invoking a subchild and not waiting for it on error. Signed-off-by: Luke Diamand <luke@diamand.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-p4.py')
-rwxr-xr-xgit-p4.py43
1 files changed, 28 insertions, 15 deletions
diff --git a/git-p4.py b/git-p4.py
index f90b43f..a69a24b 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -169,6 +169,9 @@ def calcDiskFree():
return st.f_bavail * st.f_frsize
def die(msg):
+ """ Terminate execution. Make sure that any running child processes have been wait()ed for before
+ calling this.
+ """
if verbose:
raise Exception(msg)
else:
@@ -3574,7 +3577,7 @@ class P4Sync(Command, P4UserMap):
# does not have any existing p4 branches
if len(args) == 0:
if not self.p4BranchesInGit:
- die("No remote p4 branches. Perhaps you never did \"git p4 clone\" in here.")
+ raise P4CommandException("No remote p4 branches. Perhaps you never did \"git p4 clone\" in here.")
# The default branch is master, unless --branch is used to
# specify something else. Make sure it exists, or complain
@@ -3582,9 +3585,9 @@ class P4Sync(Command, P4UserMap):
if not self.detectBranches:
if not branch_exists(self.branch):
if branch_arg_given:
- die("Error: branch %s does not exist." % self.branch)
+ raise P4CommandException("Error: branch %s does not exist." % self.branch)
else:
- die("Error: no branch %s; perhaps specify one with --branch." %
+ raise P4CommandException("Error: no branch %s; perhaps specify one with --branch." %
self.branch)
if self.verbose:
@@ -3825,22 +3828,32 @@ class P4Sync(Command, P4UserMap):
self.openStreams()
- if revision:
- self.importHeadRevision(revision)
- else:
- self.importRevisions(args, branch_arg_given)
+ err = None
- if gitConfigBool("git-p4.importLabels"):
- self.importLabels = True
+ try:
+ if revision:
+ self.importHeadRevision(revision)
+ else:
+ self.importRevisions(args, branch_arg_given)
- if self.importLabels:
- p4Labels = getP4Labels(self.depotPaths)
- gitTags = getGitTags()
+ if gitConfigBool("git-p4.importLabels"):
+ self.importLabels = True
- missingP4Labels = p4Labels - gitTags
- self.importP4Labels(self.gitStream, missingP4Labels)
+ if self.importLabels:
+ p4Labels = getP4Labels(self.depotPaths)
+ gitTags = getGitTags()
- self.closeStreams()
+ missingP4Labels = p4Labels - gitTags
+ self.importP4Labels(self.gitStream, missingP4Labels)
+
+ except P4CommandException as e:
+ err = e
+
+ finally:
+ self.closeStreams()
+
+ if err:
+ die(str(err))
# Cleanup temporary branches created during import
if self.tempBranches != []: