mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 01:07:15 +03:00
73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
import cStringIO
|
|
|
|
from mercurial import util as merc_util
|
|
|
|
class externalsfile(dict):
|
|
"""Map svn directories to lists of externals entries.
|
|
"""
|
|
def __init__(self):
|
|
super(externalsfile, self).__init__()
|
|
self.encoding = 'utf-8'
|
|
|
|
def __setitem__(self, key, value):
|
|
if value is None:
|
|
value = []
|
|
elif isinstance(value, basestring):
|
|
value = value.splitlines()
|
|
if key == '.':
|
|
key = ''
|
|
if not value:
|
|
if key in self:
|
|
del self[key]
|
|
else:
|
|
super(externalsfile, self).__setitem__(key, value)
|
|
|
|
def write(self):
|
|
fp = cStringIO.StringIO()
|
|
for target in merc_util.sort(self):
|
|
lines = self[target]
|
|
if not lines:
|
|
continue
|
|
if not target:
|
|
target = '.'
|
|
fp.write('[%s]\n' % target)
|
|
for l in lines:
|
|
l = ' ' + l + '\n'
|
|
fp.write(l)
|
|
return fp.getvalue()
|
|
|
|
def read(self, data):
|
|
self.clear()
|
|
fp = cStringIO.StringIO(data)
|
|
dirs = {}
|
|
target = None
|
|
for line in fp.readlines():
|
|
if not line.strip():
|
|
continue
|
|
if line.startswith('['):
|
|
line = line.strip()
|
|
if line[-1] != ']':
|
|
raise merc_util.Abort('invalid externals section name: %s' % line)
|
|
target = line[1:-1]
|
|
if target == '.':
|
|
target = ''
|
|
elif line.startswith(' '):
|
|
line = line.rstrip('\n')
|
|
if target is None or not line:
|
|
continue
|
|
self.setdefault(target, []).append(line[1:])
|
|
|
|
def diff(ext1, ext2):
|
|
"""Compare 2 externalsfile and yield tuples like (dir, value1, value2)
|
|
where value1 is the external value in ext1 for dir or None, and
|
|
value2 the same in ext2.
|
|
"""
|
|
for d in ext1:
|
|
if d not in ext2:
|
|
yield d, '\n'.join(ext1[d]), None
|
|
elif ext1[d] != ext2[d]:
|
|
yield d, '\n'.join(ext1[d]), '\n'.join(ext2[d])
|
|
for d in ext2:
|
|
if d not in ext1:
|
|
yield d, None, '\n'.join(ext2[d])
|