diff options
| author | Miguel Torroja <miguel.torroja@gmail.com> | 2017-07-13 09:00:34 +0200 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2017-07-13 10:52:40 -0700 | 
| commit | b596b3b920208acb775bb632288976377636ccd1 (patch) | |
| tree | 13d22c73681c7ae82a199f201267742976bb95ff /git-p4.py | |
| parent | c625bf0ee80a2362ce59819ce011ee17f2a6b2ce (diff) | |
| download | git-b596b3b920208acb775bb632288976377636ccd1.tar.gz | |
git-p4: parse marshal output "p4 -G" in p4 changes
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.
This fixes the case where a p4 trigger for  "p4 change" is set and the command git-p4 submit is run.
Signed-off-by: Miguel Torroja <miguel.torroja@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-p4.py')
| -rwxr-xr-x | git-p4.py | 85 | 
1 files changed, 57 insertions, 28 deletions
@@ -879,8 +879,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 +1530,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):  | 
