1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-22 17:56:09 +02:00

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:
Vinicius Kursancew 2016-11-28 09:33:18 +00:00 committed by Junio C Hamano
parent ac84098b7e
commit b34fa5777d
3 changed files with 58 additions and 14 deletions

View File

@ -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

View File

@ -1289,6 +1289,9 @@ def __init__(self):
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 @@ def __init__(self):
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 @@ def applyCommit(self, id):
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 @@ def applyCommit(self, id):
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 @@ def run(self, args):
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 @@ def run(self, args):
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 = "*"

View File

@ -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
' '