Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import argparse | 6 import argparse |
| 7 import json | |
| 7 import re | 8 import re |
| 8 import sys | 9 import sys |
| 9 | 10 |
| 10 from collections import defaultdict | 11 from collections import defaultdict |
| 11 | 12 |
| 12 import git_common as git | 13 import git_common as git |
| 13 | 14 |
| 14 | 15 |
| 15 FOOTER_PATTERN = re.compile(r'^\s*([\w-]+): (.*)$') | 16 FOOTER_PATTERN = re.compile(r'^\s*([\w-]+): (.*)$') |
| 16 CHROME_COMMIT_POSITION_PATTERN = re.compile(r'^([\w/-]+)@{#(\d+)}$') | 17 CHROME_COMMIT_POSITION_PATTERN = re.compile(r'^([\w/-]+)@{#(\d+)}$') |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 # svn commit numbers do not map to branches. | 157 # svn commit numbers do not map to branches. |
| 157 return ('refs/branch-heads/%s' % branch_match.group(1), None) | 158 return ('refs/branch-heads/%s' % branch_match.group(1), None) |
| 158 | 159 |
| 159 raise ValueError('Unable to infer commit position from footers') | 160 raise ValueError('Unable to infer commit position from footers') |
| 160 | 161 |
| 161 | 162 |
| 162 def main(args): | 163 def main(args): |
| 163 parser = argparse.ArgumentParser( | 164 parser = argparse.ArgumentParser( |
| 164 formatter_class=argparse.ArgumentDefaultsHelpFormatter | 165 formatter_class=argparse.ArgumentDefaultsHelpFormatter |
| 165 ) | 166 ) |
| 166 parser.add_argument('ref') | 167 parser.add_argument('ref', nargs='?', help="Git ref to retrieve footers from." |
| 168 " Omit to parse stdin.") | |
| 167 | 169 |
| 168 g = parser.add_mutually_exclusive_group() | 170 g = parser.add_mutually_exclusive_group() |
| 169 g.add_argument('--key', metavar='KEY', | 171 g.add_argument('--key', metavar='KEY', |
| 170 help='Get all values for the given footer name, one per ' | 172 help='Get all values for the given footer name, one per ' |
| 171 'line (case insensitive)') | 173 'line (case insensitive)') |
| 172 g.add_argument('--position', action='store_true') | 174 g.add_argument('--position', action='store_true') |
| 173 g.add_argument('--position-ref', action='store_true') | 175 g.add_argument('--position-ref', action='store_true') |
| 174 g.add_argument('--position-num', action='store_true') | 176 g.add_argument('--position-num', action='store_true') |
| 177 g.add_argument('--json', help="filename to dump JSON serialized headers to.") | |
| 175 | 178 |
| 176 | 179 |
| 177 opts = parser.parse_args(args) | 180 opts = parser.parse_args(args) |
| 178 | 181 |
| 179 message = git.run('log', '-1', '--format=%B', opts.ref) | 182 if opts.ref: |
| 183 message = git.run('log', '-1', '--format=%B', opts.ref) | |
| 184 else: | |
| 185 message = '\n'.join(l for l in sys.stdin) | |
|
iannucci
2016/05/23 19:52:33
isn't this just sys.stdin.read().strip('\n')?
martiniss
2016/05/23 21:30:01
You can't mock out sys.stdin.read with StringIO, s
| |
| 186 | |
| 180 footers = parse_footers(message) | 187 footers = parse_footers(message) |
| 181 | 188 |
| 182 if opts.key: | 189 if opts.key: |
| 183 for v in footers.get(normalize_name(opts.key), []): | 190 for v in footers.get(normalize_name(opts.key), []): |
| 184 print v | 191 print v |
| 185 elif opts.position: | 192 elif opts.position: |
| 186 pos = get_position(footers) | 193 pos = get_position(footers) |
| 187 print '%s@{#%s}' % (pos[0], pos[1] or '?') | 194 print '%s@{#%s}' % (pos[0], pos[1] or '?') |
| 188 elif opts.position_ref: | 195 elif opts.position_ref: |
| 189 print get_position(footers)[0] | 196 print get_position(footers)[0] |
| 190 elif opts.position_num: | 197 elif opts.position_num: |
| 191 pos = get_position(footers) | 198 pos = get_position(footers) |
| 192 assert pos[1], 'No valid position for commit' | 199 assert pos[1], 'No valid position for commit' |
| 193 print pos[1] | 200 print pos[1] |
| 201 elif opts.json: | |
| 202 with open(opts.json, 'w') as f: | |
| 203 json.dump(footers, f) | |
| 194 else: | 204 else: |
| 195 for k in footers.keys(): | 205 for k, v in footers.items(): |
| 196 for v in footers[k]: | 206 print '%s: %s' % (k, v) |
|
iannucci
2016/05/23 19:52:33
this change is not orthographic. Previously this w
martiniss
2016/05/23 21:30:01
Ah whoops, I thought I was optimizing ;) changed b
| |
| 197 print '%s: %s' % (k, v) | |
| 198 return 0 | 207 return 0 |
| 199 | 208 |
| 200 | 209 |
| 201 if __name__ == '__main__': | 210 if __name__ == '__main__': |
| 202 try: | 211 try: |
| 203 sys.exit(main(sys.argv[1:])) | 212 sys.exit(main(sys.argv[1:])) |
| 204 except KeyboardInterrupt: | 213 except KeyboardInterrupt: |
| 205 sys.stderr.write('interrupted\n') | 214 sys.stderr.write('interrupted\n') |
| 206 sys.exit(1) | 215 sys.exit(1) |
| OLD | NEW |