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

[PATCH] git-p4: add p4 shelf support

From
NSNuno Subtil <subtil@gmail.com>
Date
Dec 6, 2016, 02:02 UTC
Message-ID
<01020158d1de0e71-ac079bb9-bc7d-4fb7-9ff7-60fd6955116b-000000@eu-west-1.amazonses.com>

Extends the submit command to support shelving a commit instead of submitting it to p4 (similar to --prepare-p4-only).

Signed-off-by: Nuno Subtil <subtil@gmail.com>
---
 git-p4.py | 36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)
diff --git a/git-p4.py b/git-p4.py
index fd5ca52..3c4be22 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1286,6 +1286,8 @@ def __init__(self):
                 optparse.make_option("--export-labels", dest="exportLabels", action="store_true"),
                 optparse.make_option("--dry-run", "-n", dest="dry_run", action="store_true"),
                 optparse.make_option("--prepare-p4-only", dest="prepare_p4_only", action="store_true"),
+                optparse.make_option("--shelve-only", dest="shelve_only", action="store_true", help="Create P4 shelf for first change that would be submitted (using a new CL)"),
+                optparse.make_option("--shelve-cl", dest="shelve_cl", help="Replace shelf under existing CL number (previously shelved files will be deleted)"),
                 optparse.make_option("--conflict", dest="conflict_behavior",
                                      choices=self.conflict_behavior_choices),
                 optparse.make_option("--branch", dest="branch"),
@@ -1297,6 +1299,8 @@ def __init__(self):
         self.preserveUser = gitConfigBool("git-p4.preserveUser")
         self.dry_run = False
         self.prepare_p4_only = False
+        self.shelve_only = False
+        self.shelve_cl = None
         self.conflict_behavior = None
         self.isWindows = (platform.system() == "Windows")
         self.exportLabels = False
@@ -1496,6 +1500,12 @@ def prepareSubmitTemplate(self):
                 else:
                     inFilesSection = False
             else:
+                if self.shelve_only and self.shelve_cl:
+                    if line.startswith("Change:"):
+                        line = "Change: %s\n" % self.shelve_cl
+                    if line.startswith("Status:"):
+                        line = "Status: pending\n"
+
                 if line.startswith("Files:"):
                     inFilesSection = True
 
@@ -1785,7 +1795,11 @@ def applyCommit(self, id):
                 if self.isWindows:
                     message = message.replace("\r\n", "\n")
                 submitTemplate = message[:message.index(separatorLine)]
-                p4_write_pipe(['submit', '-i'], submitTemplate)
+
+                if self.shelve_only:
+                    p4_write_pipe(['shelve', '-i', '-r'], submitTemplate)
+                else:
+                    p4_write_pipe(['submit', '-i'], submitTemplate)
 
                 if self.preserveUser:
                     if p4User:
@@ -1799,12 +1813,17 @@ def applyCommit(self, id):
                 # new file.  This leaves it writable, which confuses p4.
                 for f in pureRenameCopy:
                     p4_sync(f, "-f")
-                submitted = True
+
+                if not self.shelve_only:
+                    submitted = True
 
         finally:
             # skip this patch
             if not submitted:
-                print "Submission cancelled, undoing p4 changes."
+                if not self.shelve_only:
+                    print "Submission cancelled, undoing p4 changes."
+                else:
+                    print "Change shelved, undoing p4 changes."
                 for f in editedFiles:
                     p4_revert(f)
                 for f in filesToAdd:
@@ -2034,9 +2053,13 @@ def run(self, args):
             if ok:
                 applied.append(commit)
             else:
-                if self.prepare_p4_only and i < last:
-                    print "Processing only the first commit due to option" \
-                          " --prepare-p4-only"
+                if (self.prepare_p4_only or self.shelve_only) and i < last:
+                    if self.prepare_p4_only:
+                        print "Processing only the first commit due to option" \
+                              " --prepare-p4-only"
+                    else:
+                        print "Processing only the first commit due to option" \
+                              " --shelve-only"
                     break
                 if i < last:
                     quit = False
@@ -3638,6 +3661,7 @@ def printUsage(commands):
     "debug" : P4Debug,
     "submit" : P4Submit,
     "commit" : P4Submit,
+    "shelve" : P4Submit,
     "sync" : P4Sync,
     "rebase" : P4Rebase,
     "clone" : P4Clone,

--
https://github.com/git/git/pull/309
Next: Luke Diamand
Message 1 of 4 in “git-p4: add p4 shelf support”
  1. git-p4: add p4 shelf supportNuno Subtil, Dec 6, 2016
  2. Luke DiamandDec 6, 2016
  3. Vinicius KursancewDec 6, 2016
  4. Luke DiamandDec 7, 2016

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.