From: Miguel Torroja <miguel.torroja@gmail.com>
To: Luke Diamand <luke@diamand.org>
Cc: Lars Schneider <larsxschneider@gmail.com>,
Git Users <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH] git-p4: parse marshal output "p4 -G" in p4 changes
Date: Wed, 12 Jul 2017 00:35:49 +0200 [thread overview]
Message-ID: <CAKYtbVbNMzPe17rBUihm5Q+mgsJUhWMs3LKDp5jEJFdL+ieafg@mail.gmail.com> (raw)
In-Reply-To: <CAE5ih7-Sy9YmGbLs=wzfxXCSFLkEotqLRuu_xNz9x=7BhvrvnA@mail.gmail.com>
Hi Luke,
My bad as I didn't check that case.
It was p4CmdList as you said. the default value of the new field
skip_info (set to True) ignores any info messages. and the script is
waiting for a valid message.
If I set it to False, then it does return an info entry and it accepts
the submit change
I'm sending another patch update
On Tue, Jul 11, 2017 at 10:35 AM, Luke Diamand <luke@diamand.org> wrote:
> On 3 July 2017 at 23:57, Miguel Torroja <miguel.torroja@gmail.com> wrote:
>> The option -G of p4 (python marshal output) gives more context about the
>> data being output. That's useful when using the command "change -o" as
>> we can distinguish between warning/error line and real change description.
>>
>> Some p4 triggers in the server side generate some warnings when
>> executed. Unfortunately those messages are mixed with the output of
>> "p4 change -o". Those extra warning lines are reported as {'code':'info'}
>> in python marshal output (-G). The real change output is reported as
>> {'code':'stat'}
>>
>> the function p4CmdList accepts a new argument: skip_info. When set to
>> True it ignores any 'code':'info' entry (skip_info=True by default).
>>
>> A new test has been created to t9807-git-p4-submit.sh adding a p4 trigger
>> that outputs extra lines with "p4 change -o" and "p4 changes"
>
> The latest version of mt/p4-parse-G-output (09521c7a0) seems to break
> t9813-git-p4-preserve-users.sh.
>
> I don't quite know why, but I wonder if it's the change to p4CmdList() ?
>
> Luke
>
>>
>> Signed-off-by: Miguel Torroja <miguel.torroja@gmail.com>
>> ---
>> git-p4.py | 90 ++++++++++++++++++++++++++++++++----------------
>> t/t9807-git-p4-submit.sh | 30 ++++++++++++++++
>> 2 files changed, 91 insertions(+), 29 deletions(-)
>>
>> diff --git a/git-p4.py b/git-p4.py
>> index 8d151da91..a262e3253 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 3457d5db6..b630895a7 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 &&
>> --
>> 2.11.0
>>
next prev parent reply other threads:[~2017-07-11 22:35 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-20 12:19 [PATCH] git-p4: changelist template with p4 -G change -o Miguel Torroja
2017-06-22 17:32 ` Junio C Hamano
2017-06-24 11:49 ` Luke Diamand
2017-06-24 12:38 ` miguel torroja
2017-06-24 17:36 ` Lars Schneider
[not found] ` <CAKYtbVbGekXGAyPd7HeLot_MdZkp7-1Ss-iAi7o8ze2b+sNB6Q@mail.gmail.com>
2017-06-27 9:20 ` miguel torroja
2017-06-27 19:17 ` [PATCH] git-p4: parse marshal output "p4 -G" in p4 changes Miguel Torroja
2017-06-28 4:08 ` Junio C Hamano
2017-06-28 9:54 ` Luke Diamand
2017-06-28 13:14 ` miguel torroja
[not found] ` <CAE5ih7-x45MD1H6Ahr5oCVtTjgbBkeP4GbKCGB-Cwk6BSQwTcw@mail.gmail.com>
2017-06-29 22:41 ` miguel torroja
2017-06-30 7:56 ` Luke Diamand
2017-06-30 8:22 ` miguel torroja
2017-06-29 22:46 ` Miguel Torroja
2017-06-30 8:26 ` Lars Schneider
2017-06-30 9:41 ` Miguel Torroja
2017-06-30 10:13 ` Lars Schneider
2017-06-30 16:02 ` Miguel Torroja
2017-07-03 22:53 ` Miguel Torroja
2017-07-03 22:57 ` Miguel Torroja
2017-07-11 8:35 ` Luke Diamand
2017-07-11 22:35 ` Miguel Torroja [this message]
2017-07-11 22:53 ` Miguel Torroja
2017-07-12 8:25 ` Luke Diamand
2017-07-12 10:16 ` Miguel Torroja
2017-07-12 17:13 ` Junio C Hamano
2017-07-13 7:00 ` [PATCH 1/3] git-p4: git-p4 tests with p4 triggers Miguel Torroja
2017-07-13 7:00 ` [PATCH 2/3] git-p4: parse marshal output "p4 -G" in p4 changes Miguel Torroja
2017-07-13 7:00 ` [PATCH 3/3] git-p4: filter for {'code':'info'} in p4CmdList Miguel Torroja
2017-07-13 7:12 ` [PATCH] git-p4: parse marshal output "p4 -G" in p4 changes Miguel Torroja
2017-07-13 19:30 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAKYtbVbNMzPe17rBUihm5Q+mgsJUhWMs3LKDp5jEJFdL+ieafg@mail.gmail.com \
--to=miguel.torroja@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=larsxschneider@gmail.com \
--cc=luke@diamand.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).