diff options
Diffstat (limited to 'libbe/mapfile.py')
-rw-r--r-- | libbe/mapfile.py | 136 |
1 files changed, 40 insertions, 96 deletions
diff --git a/libbe/mapfile.py b/libbe/mapfile.py index 6a304fd..559d713 100644 --- a/libbe/mapfile.py +++ b/libbe/mapfile.py @@ -14,7 +14,11 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +import os.path +import errno import utility +import doctest + class IllegalKey(Exception): def __init__(self, key): Exception.__init__(self, 'Illegal key "%s"' % key) @@ -25,28 +29,27 @@ class IllegalValue(Exception): Exception.__init__(self, 'Illegal value "%s"' % value) self.value = value -def generate(f, map, context=3): - """Generate a format-2 mapfile. This is a simpler format, but should merge - better, because there's no chance of confusion for appends, and lines - are unique for both key and value. +def generate(map, context=3): + """Generate a format-2 mapfile content string. This is a simpler + format, but should merge better, because there's no chance of + confusion for appends, and lines are unique for both key and + value. - >>> f = utility.FileString() - >>> generate(f, {"q":"p"}) - >>> f.str + >>> generate({"q":"p"}) '\\n\\n\\nq=p\\n\\n\\n\\n' - >>> generate(f, {"q=":"p"}) + >>> generate({"q=":"p"}) Traceback (most recent call last): IllegalKey: Illegal key "q=" - >>> generate(f, {"q\\n":"p"}) + >>> generate({"q\\n":"p"}) Traceback (most recent call last): IllegalKey: Illegal key "q\\n" - >>> generate(f, {"":"p"}) + >>> generate({"":"p"}) Traceback (most recent call last): IllegalKey: Illegal key "" - >>> generate(f, {">q":"p"}) + >>> generate({">q":"p"}) Traceback (most recent call last): IllegalKey: Illegal key ">q" - >>> generate(f, {"q":"p\\n"}) + >>> generate({"q":"p\\n"}) Traceback (most recent call last): IllegalValue: Illegal value "p\\n" """ @@ -64,107 +67,48 @@ def generate(f, map, context=3): if "\n" in map[key]: raise IllegalValue(map[key].encode('string_escape')) + lines = [] for key in keys: for i in range(context): - f.write("\n") - f.write("%s=%s\n" % (key.encode("utf-8"), map[key].encode("utf-8"))) + lines.append("") + lines.append("%s=%s" % (key, map[key])) for i in range(context): - f.write("\n") + lines.append("") + return '\n'.join(lines) + '\n' -def parse(f): +def parse(contents): """ - Parse a format-2 mapfile. + Parse a format-2 mapfile string. >>> parse('\\n\\n\\nq=p\\n\\n\\n\\n')['q'] - u'p' + 'p' >>> parse('\\n\\nq=\\'p\\'\\n\\n\\n\\n')['q'] - u"\'p\'" - >>> f = utility.FileString() - >>> generate(f, {"a":"b", "c":"d", "e":"f"}) - >>> dict = parse(f) + "\'p\'" + >>> contents = generate({"a":"b", "c":"d", "e":"f"}) + >>> dict = parse(contents) >>> dict["a"] - u'b' + 'b' >>> dict["c"] - u'd' + 'd' >>> dict["e"] - u'f' + 'f' """ - f = utility.get_file(f) result = {} - for line in f: + for line in contents.splitlines(): line = line.rstrip('\n') if len(line) == 0: continue - name,value = [f.decode('utf-8') for f in line.split('=', 1)] - assert not result.has_key('name') + name,value = [field for field in line.split('=', 1)] + assert not result.has_key(name) result[name] = value return result +def map_save(rcs, path, map, allow_no_rcs=False): + """Save the map as a mapfile to the specified path""" + contents = generate(map) + rcs.set_file_contents(path, contents, allow_no_rcs) -def split_diff3(this, other, f): - """Split a file or string with diff3 conflicts into two files. - - :param this: The THIS file to write. May be a utility.FileString - :param other: The OTHER file to write. May be a utility.FileString - :param f: The file or string to split. - :return: True if there were conflicts - - >>> split_diff3(utility.FileString(), utility.FileString(), - ... "a\\nb\\nc\\nd\\n") - False - >>> this = utility.FileString() - >>> other = utility.FileString() - >>> split_diff3(this, other, "<<<<<<< values1\\nstatus=closed\\n=======\\nstatus=closedd\\n>>>>>>> values2\\n") - True - >>> this.str - 'status=closed\\n' - >>> other.str - 'status=closedd\\n' - """ - f = utility.get_file(f) - this_active = True - other_active = True - conflicts = False - for line in f: - if line.startswith("<<<<<<<"): - conflicts = True - this_active = True - other_active = False - elif line.startswith("======="): - this_active = False - other_active = True - elif line.startswith(">>>>>>>"): - this_active = True - other_active = True - else: - if this_active: - this.write(line) - if other_active: - other.write(line) - return conflicts - -def split_diff3_str(f): - """Split a file/string with diff3 conflicts into two strings. If there - were no conflicts, one string is returned. +def map_load(rcs, path, allow_no_rcs=False): + contents = rcs.get_file_contents(path, allow_no_rcs=allow_no_rcs) + return parse(contents) - >>> result = split_diff3_str("<<<<<<< values1\\nstatus=closed\\n=======\\nstatus=closedd\\n>>>>>>> values2\\n") - >>> len(result) - 2 - >>> result[0] != result[1] - True - >>> result = split_diff3_str("<<<<<<< values1\\nstatus=closed\\n=======\\nstatus=closed\\n>>>>>>> values2\\n") - >>> len(result) - 2 - >>> result[0] == result[1] - True - >>> result = split_diff3_str("a\\nb\\nc\\nd\\n") - >>> len(result) - 1 - >>> result[0] - 'a\\nb\\nc\\nd\\n' - """ - this = utility.FileString() - other = utility.FileString() - if split_diff3(this, other, f): - return (this.str, other.str) - else: - return (this.str,) +suite = doctest.DocTestSuite() |