X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Fparser.py;h=2b5e9a093c478756d65ef001cdb59e48eb0af0c5;hb=31ddb24d608597721e9660f90a9c8c11a47b7fb0;hp=bb6fce022a98a4bb61b734ac2a5189878e1c6491;hpb=97d8d152a5f832f6266a33622e25f4ae5f7dc068;p=patchwork diff --git a/apps/patchwork/parser.py b/apps/patchwork/parser.py index bb6fce0..2b5e9a0 100644 --- a/apps/patchwork/parser.py +++ b/apps/patchwork/parser.py @@ -21,6 +21,7 @@ import re + try: import hashlib sha1_hash = hashlib.sha1 @@ -132,6 +133,9 @@ def parse_patch(text): lc[0] -= 1 elif line.startswith('+'): lc[1] -= 1 + elif line.startswith('\ No newline at end of file'): + # Special case: Not included as part of the hunk's line count + pass else: lc[0] -= 1 lc[1] -= 1 @@ -157,10 +161,10 @@ def parse_patch(text): return (patchbuf, commentbuf) -def patch_hash(str): +def hash_patch(str): + # normalise spaces str = str.replace('\r', '') str = str.strip() + '\n' - lines = str.split('\n') prefixes = ['-', '+', ' '] hash = sha1_hash() @@ -170,8 +174,8 @@ def patch_hash(str): if len(line) <= 0: continue - hunk_match = _hunk_re.match(line) - filename_match = _filename_re.match(line) + hunk_match = _hunk_re.match(line) + filename_match = _filename_re.match(line) if filename_match: # normalise -p1 top-directories @@ -183,9 +187,8 @@ def patch_hash(str): line = filename_match.group(1) + ' ' + filename - - elif hunk_match: - # remove line numbers + elif hunk_match: + # remove line numbers, but leave line counts def fn(x): if not x: return 1 @@ -194,18 +197,45 @@ def patch_hash(str): line = '@@ -%d +%d @@' % tuple(line_nos) elif line[0] in prefixes: + # if we have a +, - or context line, leave as-is pass else: + # other lines are ignored continue - hash.update(line + '\n') + hash.update(line.encode('utf-8') + '\n') + + return hash + + +def main(args): + from optparse import OptionParser + + parser = OptionParser() + parser.add_option('-p', '--patch', action = 'store_true', + dest = 'print_patch', help = 'print parsed patch') + parser.add_option('-c', '--comment', action = 'store_true', + dest = 'print_comment', help = 'print parsed comment') + parser.add_option('-#', '--hash', action = 'store_true', + dest = 'print_hash', help = 'print patch hash') + + (options, args) = parser.parse_args() + + # decode from (assumed) UTF-8 + content = sys.stdin.read().decode('utf-8') + + (patch, comment) = parse_patch(content) + + if options.print_hash and patch: + print hash_patch(patch).hexdigest() + + if options.print_patch and patch: + print "Patch: ------\n" + patch + + if options.print_comment and comment: + print "Comment: ----\n" + comment if __name__ == '__main__': import sys -# (patch, comment) = parse_patch(sys.stdin.read()) -# if patch: -# print "Patch: ------\n" + patch -# if comment: -# print "Comment: ----\n" + comment - normalise_patch_content(sys.stdin.read()) + sys.exit(main(sys.argv))