diff --git a/hggit/overlay.py b/hggit/overlay.py index 4538981d2c3f3fcb594ad7f2ae7622380929e226_aGdnaXQvb3ZlcmxheS5weQ==..15d2b119ca993e010ea63f4e6ccf6707f9a7a610_aGdnaXQvb3ZlcmxheS5weQ== 100644 --- a/hggit/overlay.py +++ b/hggit/overlay.py @@ -20,7 +20,7 @@ self.repo = repo self.tree = repo.handler.git.get_object(sha) self._map = None - self._flagmap = None + self._flags = None def withflags(self): self.load() @@ -24,8 +24,8 @@ def withflags(self): self.load() - return set([path for path, flag in self._flagmap.iteritems() - if flag & 020100]) + return set([path for path, flag in self._flags.iteritems() + if flag != '']) def copy(self): return overlaymanifest(self.repo, self.tree.id) @@ -40,6 +40,15 @@ def flags(self, path): self.load() + return hgflag(self._flags[path]) + + def load(self): + if self._map is not None: + return + + self._map = {} + self._flags = {} + def hgflag(gitflag): if gitflag & 0100: return 'x' @@ -48,15 +57,6 @@ else: return '' - return hgflag(self._flagmap[path]) - - def load(self): - if self._map is not None: - return - - self._map = {} - self._flagmap = {} - def addtree(tree, dirname): for entry in tree.iteritems(): if entry.mode & 040000: @@ -66,7 +66,7 @@ else: path = dirname + entry.path self._map[path] = bin(entry.sha) - self._flagmap[path] = entry.mode + self._flags[path] = hgflag(entry.mode) addtree(self.tree, '') @@ -93,6 +93,40 @@ self.load() return self._map[path] + def __contains__(self, path): + self.load() + return path in self._map + + def get(self, path, default=None): + self.load() + return self._map.get(path, default) + + def diff(self, m2, clean=False): + self.load() + if isinstance(m2, overlaymanifest): + m2.load() + + # below code copied from manifest.py:manifestdict.diff + diff = {} + + for fn, n1 in self.iteritems(): + fl1 = self._flags.get(fn, '') + n2 = m2.get(fn, None) + fl2 = m2._flags.get(fn, '') + if n2 is None: + fl2 = '' + if n1 != n2 or fl1 != fl2: + diff[fn] = ((n1, fl1), (n2, fl2)) + elif clean: + diff[fn] = None + + for fn, n2 in m2.iteritems(): + if fn not in self: + fl2 = m2._flags.get(fn, '') + diff[fn] = ((None, ''), (n2, fl2)) + + return diff + def __delitem__(self, path): del self._map[path]