# HG changeset patch # User Mads Kiilerich # Date 2014-11-28 02:09:06 # Node ID a5c94ea3b8af7933bf6ba450959cdf4994fbbb90 # Parent d289ba74dba30f37cb3404d470fe8f6faa18d954 mq: smarter handling of plain headers 6333412245ec and 5ccced6eab0b fixed issue4453 with a simple insertplainheader function that fixed the regression but didn't make the implementation more stable. Now we introduce plain header handling similar to how we handle hg patches. The whole header is scanned for fields to update while determining the best position for inserting the field if it is missing. It also makes sure there is an empty line between headers and body. diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -114,6 +114,12 @@ HGHEADERS = [ '# Node ID ', '# Parent ', # can occur twice for merges - but that is not relevant for mq ] +# The order of headers in plain 'mail style' patches: +PLAINHEADERS = { + 'from': 0, + 'date': 1, + 'subject': 2, + } def inserthgheader(lines, header, value): """Assuming lines contains a HG patch header, add a header line with value. @@ -156,9 +162,40 @@ def inserthgheader(lines, header, value) return lines def insertplainheader(lines, header, value): - if lines and lines[0] and ':' not in lines[0]: - lines.insert(0, '') - lines.insert(0, '%s: %s' % (header, value)) + """For lines containing a plain patch header, add a header line with value. + >>> insertplainheader([], 'Date', 'z') + ['Date: z'] + >>> insertplainheader([''], 'Date', 'z') + ['Date: z', ''] + >>> insertplainheader(['x'], 'Date', 'z') + ['Date: z', '', 'x'] + >>> insertplainheader(['From: y', 'x'], 'Date', 'z') + ['From: y', 'Date: z', '', 'x'] + >>> insertplainheader([' date : x', ' from : y', ''], 'From', 'z') + [' date : x', 'From: z', ''] + >>> insertplainheader(['', 'Date: y'], 'Date', 'z') + ['Date: z', '', 'Date: y'] + >>> insertplainheader(['foo: bar', 'DATE: z', 'x'], 'From', 'y') + ['From: y', 'foo: bar', 'DATE: z', '', 'x'] + """ + newprio = PLAINHEADERS[header.lower()] + bestpos = len(lines) + for i, line in enumerate(lines): + if ':' in line: + lheader = line.split(':', 1)[0].strip().lower() + lprio = PLAINHEADERS.get(lheader, newprio + 1) + if lprio == newprio: + lines[i] = '%s: %s' % (header, value) + return lines + if lprio > newprio and i < bestpos: + bestpos = i + else: + if line: + lines.insert(i, '') + if i < bestpos: + bestpos = i + break + lines.insert(bestpos, '%s: %s' % (header, value)) return lines class patchheader(object): diff --git a/tests/test-mq-header-date.t b/tests/test-mq-header-date.t --- a/tests/test-mq-header-date.t +++ b/tests/test-mq-header-date.t @@ -412,8 +412,8 @@ 1: Three (again) - test 0: [mq]: 1.patch - test ==== qref -d + From: jane Date: 12 0 - From: jane diff -r ... 6 --- /dev/null @@ -465,8 +465,8 @@ 1: Three (again) - test 0: [mq]: 1.patch - test ==== qref -u -d + From: john Date: 14 0 - From: john diff -r ... 8 --- /dev/null @@ -495,8 +495,8 @@ 1: Three (again) - test 0: [mq]: 1.patch - test ==== qref -u -d + From: john Date: 15 0 - From: john Nine