git-p4: allow submit to create shelved changelists.
Add a --shelve command line argument which invokes p4 shelve instead of submitting changes. After shelving the changes are reverted from the p4 workspace. Signed-off-by: Vinicius Kursancew <viniciusalexandre@gmail.com> Reviewed-by: Luke Diamand <luke@diamand.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ac84098b7e
commit
b34fa5777d
@ -303,6 +303,11 @@ These options can be used to modify 'git p4 submit' behavior.
|
|||||||
submit manually or revert. This option always stops after the
|
submit manually or revert. This option always stops after the
|
||||||
first (oldest) commit. Git tags are not exported to p4.
|
first (oldest) commit. Git tags are not exported to p4.
|
||||||
|
|
||||||
|
--shelve::
|
||||||
|
Instead of submitting create a series of shelved changelists.
|
||||||
|
After creating each shelve, the relevant files are reverted/deleted.
|
||||||
|
If you have multiple commits pending multiple shelves will be created.
|
||||||
|
|
||||||
--conflict=(ask|skip|quit)::
|
--conflict=(ask|skip|quit)::
|
||||||
Conflicts can occur when applying a commit to p4. When this
|
Conflicts can occur when applying a commit to p4. When this
|
||||||
happens, the default behavior ("ask") is to prompt whether to
|
happens, the default behavior ("ask") is to prompt whether to
|
||||||
|
36
git-p4.py
36
git-p4.py
@ -1289,6 +1289,9 @@ class P4Submit(Command, P4UserMap):
|
|||||||
optparse.make_option("--conflict", dest="conflict_behavior",
|
optparse.make_option("--conflict", dest="conflict_behavior",
|
||||||
choices=self.conflict_behavior_choices),
|
choices=self.conflict_behavior_choices),
|
||||||
optparse.make_option("--branch", dest="branch"),
|
optparse.make_option("--branch", dest="branch"),
|
||||||
|
optparse.make_option("--shelve", dest="shelve", action="store_true",
|
||||||
|
help="Shelve instead of submit. Shelved files are reverted, "
|
||||||
|
"restoring the workspace to the state before the shelve"),
|
||||||
]
|
]
|
||||||
self.description = "Submit changes from git to the perforce depot."
|
self.description = "Submit changes from git to the perforce depot."
|
||||||
self.usage += " [name of git branch to submit into perforce depot]"
|
self.usage += " [name of git branch to submit into perforce depot]"
|
||||||
@ -1296,6 +1299,7 @@ class P4Submit(Command, P4UserMap):
|
|||||||
self.detectRenames = False
|
self.detectRenames = False
|
||||||
self.preserveUser = gitConfigBool("git-p4.preserveUser")
|
self.preserveUser = gitConfigBool("git-p4.preserveUser")
|
||||||
self.dry_run = False
|
self.dry_run = False
|
||||||
|
self.shelve = False
|
||||||
self.prepare_p4_only = False
|
self.prepare_p4_only = False
|
||||||
self.conflict_behavior = None
|
self.conflict_behavior = None
|
||||||
self.isWindows = (platform.system() == "Windows")
|
self.isWindows = (platform.system() == "Windows")
|
||||||
@ -1785,7 +1789,14 @@ class P4Submit(Command, P4UserMap):
|
|||||||
if self.isWindows:
|
if self.isWindows:
|
||||||
message = message.replace("\r\n", "\n")
|
message = message.replace("\r\n", "\n")
|
||||||
submitTemplate = message[:message.index(separatorLine)]
|
submitTemplate = message[:message.index(separatorLine)]
|
||||||
p4_write_pipe(['submit', '-i'], submitTemplate)
|
if self.shelve:
|
||||||
|
p4_write_pipe(['shelve', '-i'], submitTemplate)
|
||||||
|
else:
|
||||||
|
p4_write_pipe(['submit', '-i'], submitTemplate)
|
||||||
|
# The rename/copy happened by applying a patch that created a
|
||||||
|
# new file. This leaves it writable, which confuses p4.
|
||||||
|
for f in pureRenameCopy:
|
||||||
|
p4_sync(f, "-f")
|
||||||
|
|
||||||
if self.preserveUser:
|
if self.preserveUser:
|
||||||
if p4User:
|
if p4User:
|
||||||
@ -1795,23 +1806,20 @@ class P4Submit(Command, P4UserMap):
|
|||||||
changelist = self.lastP4Changelist()
|
changelist = self.lastP4Changelist()
|
||||||
self.modifyChangelistUser(changelist, p4User)
|
self.modifyChangelistUser(changelist, p4User)
|
||||||
|
|
||||||
# The rename/copy happened by applying a patch that created a
|
|
||||||
# new file. This leaves it writable, which confuses p4.
|
|
||||||
for f in pureRenameCopy:
|
|
||||||
p4_sync(f, "-f")
|
|
||||||
submitted = True
|
submitted = True
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
# skip this patch
|
# skip this patch
|
||||||
if not submitted:
|
if not submitted or self.shelve:
|
||||||
print "Submission cancelled, undoing p4 changes."
|
if self.shelve:
|
||||||
for f in editedFiles:
|
print ("Reverting shelved files.")
|
||||||
|
else:
|
||||||
|
print ("Submission cancelled, undoing p4 changes.")
|
||||||
|
for f in editedFiles | filesToDelete:
|
||||||
p4_revert(f)
|
p4_revert(f)
|
||||||
for f in filesToAdd:
|
for f in filesToAdd:
|
||||||
p4_revert(f)
|
p4_revert(f)
|
||||||
os.remove(f)
|
os.remove(f)
|
||||||
for f in filesToDelete:
|
|
||||||
p4_revert(f)
|
|
||||||
|
|
||||||
os.remove(fileName)
|
os.remove(fileName)
|
||||||
return submitted
|
return submitted
|
||||||
@ -2067,13 +2075,13 @@ class P4Submit(Command, P4UserMap):
|
|||||||
break
|
break
|
||||||
|
|
||||||
chdir(self.oldWorkingDirectory)
|
chdir(self.oldWorkingDirectory)
|
||||||
|
shelved_applied = "shelved" if self.shelve else "applied"
|
||||||
if self.dry_run:
|
if self.dry_run:
|
||||||
pass
|
pass
|
||||||
elif self.prepare_p4_only:
|
elif self.prepare_p4_only:
|
||||||
pass
|
pass
|
||||||
elif len(commits) == len(applied):
|
elif len(commits) == len(applied):
|
||||||
print "All commits applied!"
|
print ("All commits {0}!".format(shelved_applied))
|
||||||
|
|
||||||
sync = P4Sync()
|
sync = P4Sync()
|
||||||
if self.branch:
|
if self.branch:
|
||||||
@ -2085,9 +2093,9 @@ class P4Submit(Command, P4UserMap):
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
if len(applied) == 0:
|
if len(applied) == 0:
|
||||||
print "No commits applied."
|
print ("No commits {0}.".format(shelved_applied))
|
||||||
else:
|
else:
|
||||||
print "Applied only the commits marked with '*':"
|
print ("{0} only the commits marked with '*':".format(shelved_applied.capitalize()))
|
||||||
for c in commits:
|
for c in commits:
|
||||||
if c in applied:
|
if c in applied:
|
||||||
star = "*"
|
star = "*"
|
||||||
|
@ -413,6 +413,37 @@ test_expect_success 'submit --prepare-p4-only' '
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'submit --shelve' '
|
||||||
|
test_when_finished cleanup_git &&
|
||||||
|
git p4 clone --dest="$git" //depot &&
|
||||||
|
(
|
||||||
|
cd "$cli" &&
|
||||||
|
p4 revert ... &&
|
||||||
|
cd "$git" &&
|
||||||
|
git config git-p4.skipSubmitEdit true &&
|
||||||
|
test_commit "shelveme1" &&
|
||||||
|
git p4 submit --origin=HEAD^ &&
|
||||||
|
|
||||||
|
echo 654321 >shelveme2.t &&
|
||||||
|
echo 123456 >>shelveme1.t &&
|
||||||
|
git add shelveme* &&
|
||||||
|
git commit -m"shelvetest" &&
|
||||||
|
git p4 submit --shelve --origin=HEAD^ &&
|
||||||
|
|
||||||
|
test_path_is_file shelveme1.t &&
|
||||||
|
test_path_is_file shelveme2.t
|
||||||
|
) &&
|
||||||
|
(
|
||||||
|
cd "$cli" &&
|
||||||
|
change=$(p4 -G changes -s shelved -m 1 //depot/... | \
|
||||||
|
marshal_dump change) &&
|
||||||
|
p4 describe -S $change | grep shelveme2 &&
|
||||||
|
p4 describe -S $change | grep 123456 &&
|
||||||
|
test_path_is_file shelveme1.t &&
|
||||||
|
test_path_is_missing shelveme2.t
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'kill p4d' '
|
test_expect_success 'kill p4d' '
|
||||||
kill_p4d
|
kill_p4d
|
||||||
'
|
'
|
||||||
|
Loading…
Reference in New Issue
Block a user