summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-07-05 15:12:19 -0700
committerJunio C Hamano <gitster@pobox.com>2017-07-05 15:12:19 -0700
commitace5b6159847ed15721b27ee5d14c5f39d8bb8b5 (patch)
treefd48d1d5ade8f056ba9ea1aaa49d629802f8ec6c
parentc0b13e077037f9fbfef4096b37161ac912302ab6 (diff)
parent09521c7a0e3fe29b9d26579b852ae5ca49f26869 (diff)
downloadgit-ace5b6159847ed15721b27ee5d14c5f39d8bb8b5.tar.gz
Merge branch 'mt/p4-parse-G-output' into pu
Use "p4 -G" to make "p4 changes" output more Python-friendly to parse. * mt/p4-parse-G-output: git-p4: parse marshal output "p4 -G" in p4 changes
-rwxr-xr-xgit-p4.py90
-rwxr-xr-xt/t9807-git-p4-submit.sh30
2 files changed, 91 insertions, 29 deletions
diff --git a/git-p4.py b/git-p4.py
index 8d151da91b..a262e32530 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -509,7 +509,7 @@ def isModeExec(mode):
def isModeExecChanged(src_mode, dst_mode):
return isModeExec(src_mode) != isModeExec(dst_mode)
-def p4CmdList(cmd, stdin=None, stdin_mode='w+b', cb=None):
+def p4CmdList(cmd, stdin=None, stdin_mode='w+b', cb=None, skip_info=True):
if isinstance(cmd,basestring):
cmd = "-G " + cmd
@@ -545,6 +545,9 @@ def p4CmdList(cmd, stdin=None, stdin_mode='w+b', cb=None):
try:
while True:
entry = marshal.load(p4.stdout)
+ if skip_info:
+ if 'code' in entry and entry['code'] == 'info':
+ continue
if cb is not None:
cb(entry)
else:
@@ -879,8 +882,12 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize):
cmd += ["%s...@%s" % (p, revisionRange)]
# Insert changes in chronological order
- for line in reversed(p4_read_pipe_lines(cmd)):
- changes.add(int(line.split(" ")[1]))
+ for entry in reversed(p4CmdList(cmd)):
+ if entry.has_key('p4ExitCode'):
+ die('Error retrieving changes descriptions ({})'.format(entry['p4ExitCode']))
+ if not entry.has_key('change'):
+ continue
+ changes.add(int(entry['change']))
if not block_size:
break
@@ -1526,37 +1533,62 @@ class P4Submit(Command, P4UserMap):
[upstream, settings] = findUpstreamBranchPoint()
- template = ""
+ template = """\
+# A Perforce Change Specification.
+#
+# Change: The change number. 'new' on a new changelist.
+# Date: The date this specification was last modified.
+# Client: The client on which the changelist was created. Read-only.
+# User: The user who created the changelist.
+# Status: Either 'pending' or 'submitted'. Read-only.
+# Type: Either 'public' or 'restricted'. Default is 'public'.
+# Description: Comments about the changelist. Required.
+# Jobs: What opened jobs are to be closed by this changelist.
+# You may delete jobs from this list. (New changelists only.)
+# Files: What opened files from the default changelist are to be added
+# to this changelist. You may delete files from this list.
+# (New changelists only.)
+"""
+ files_list = []
inFilesSection = False
+ change_entry = None
args = ['change', '-o']
if changelist:
args.append(str(changelist))
-
- for line in p4_read_pipe_lines(args):
- if line.endswith("\r\n"):
- line = line[:-2] + "\n"
- if inFilesSection:
- if line.startswith("\t"):
- # path starts and ends with a tab
- path = line[1:]
- lastTab = path.rfind("\t")
- if lastTab != -1:
- path = path[:lastTab]
- if settings.has_key('depot-paths'):
- if not [p for p in settings['depot-paths']
- if p4PathStartsWith(path, p)]:
- continue
- else:
- if not p4PathStartsWith(path, self.depotPath):
- continue
+ for entry in p4CmdList(args):
+ if not entry.has_key('code'):
+ continue
+ if entry['code'] == 'stat':
+ change_entry = entry
+ break
+ if not change_entry:
+ die('Failed to decode output of p4 change -o')
+ for key, value in change_entry.iteritems():
+ if key.startswith('File'):
+ if settings.has_key('depot-paths'):
+ if not [p for p in settings['depot-paths']
+ if p4PathStartsWith(value, p)]:
+ continue
else:
- inFilesSection = False
- else:
- if line.startswith("Files:"):
- inFilesSection = True
-
- template += line
-
+ if not p4PathStartsWith(value, self.depotPath):
+ continue
+ files_list.append(value)
+ continue
+ # Output in the order expected by prepareLogMessage
+ for key in ['Change','Client','User','Status','Description','Jobs']:
+ if not change_entry.has_key(key):
+ continue
+ template += '\n'
+ template += key + ':'
+ if key == 'Description':
+ template += '\n'
+ for field_line in change_entry[key].splitlines():
+ template += '\t'+field_line+'\n'
+ if len(files_list) > 0:
+ template += '\n'
+ template += 'Files:\n'
+ for path in files_list:
+ template += '\t'+path+'\n'
return template
def edit_template(self, template_file):
diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh
index 3457d5db64..b630895a74 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/t/t9807-git-p4-submit.sh
@@ -409,6 +409,36 @@ test_expect_success 'description with Jobs section and bogus following text' '
)
'
+test_expect_success 'description with extra lines from verbose p4 trigger' '
+ test_when_finished cleanup_git &&
+ git p4 clone --dest="$git" //depot &&
+ (
+ p4 triggers -i <<-EOF
+ Triggers: p4triggertest-command command pre-user-change "echo verbose trigger"
+ EOF
+ ) &&
+ (
+ p4 change -o | grep -s "verbose trigger"
+ ) &&
+ (
+ cd "$git" &&
+ git config git-p4.skipSubmitEdit true &&
+ echo file20 >file20 &&
+ git add file20 &&
+ git commit -m file20 &&
+ git p4 submit
+ ) &&
+ (
+ p4 triggers -i <<-EOF
+ Triggers:
+ EOF
+ ) &&
+ (
+ cd "$cli" &&
+ test_path_is_file file20
+ )
+'
+
test_expect_success 'submit --prepare-p4-only' '
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot &&