# # # patch "tracvc/mtn/basic_io.py" # from [645fd874583a084b3a062cfd1a61531424c06289] # to [91697e27e19bd7bfd3521ed66b8e662008fd54e9] # ============================================================ --- tracvc/mtn/basic_io.py 645fd874583a084b3a062cfd1a61531424c06289 +++ tracvc/mtn/basic_io.py 91697e27e19bd7bfd3521ed66b8e662008fd54e9 @@ -24,7 +24,7 @@ import re STR = r'"(?P(\\\\|\\"|[^"])*)" *' -ID = r'\[(?P[a-f0-9]{40})\] *' +ID = r'\[(?P[a-f0-9]{40}|)\] *' VAL = STR + r'|' + ID LINE = r' *(?P\w+) *(?P(' + VAL + r')+)' + '\n' STANZA = r'(?P(' + LINE + r')+)(\n|$)' @@ -40,25 +40,33 @@ yield match.group('stanza') def get_pairs(stanza): - """Generator, returns (key, value) pairs in one stanza.""" + """ + Generator, returns (key, value) pairs in one stanza. + + Empty string values ("") are passed through, while empty + revision ids ([]) are converted to None. + + If a key exists more than once in a stanza, value becomes a list + containing all the values. + """ for match in LINE_RULE.finditer(stanza): key = match.group('key') values = match.group('values') valarray = [] for match in VAL_RULE.finditer(values): - value = match.group('strval') or match.group('idval') - if value: + value = match.group('strval') + if value != None: # dequote: replace \" with " value = re.sub(r'\\"', '"', value) # dequote: replace \\ with \ value = re.sub(r'\\\\', r'\\', value) - valarray.append(value) + else: + value = match.group('idval') or None + valarray.append(value) if len(valarray) == 1: yield key, valarray[0] - elif not valarray: - yield key, '' else: yield key, valarray