# HG changeset patch # User Pierre-Yves David # Date 1315848950 -7200 # Node ID bd33e749dfccee413e001c8887a81f9601a225be # Parent 0dfe459c7b1c158bfd98ed5b73ac750837f4b835 [states] move IO logic outside the repository subclass This is meant to lighted this part a bit diff -r 0dfe459c7b1c -r bd33e749dfcc hgext/states.py --- a/hgext/states.py Mon Sep 12 19:23:35 2011 +0200 +++ b/hgext/states.py Mon Sep 12 19:35:50 2011 +0200 @@ -572,6 +572,58 @@ heads = remote._reducehead(heads) return common, anyinc, heads +# states boundary IO +##################### + +def _readheadsfile(repo, filename): + """read head from the given file + + XXX move me elsewhere""" + heads = [nullid] + try: + f = repo.opener(filename) + try: + heads = sorted([node.bin(n) for n in f.read().split() if n]) + finally: + f.close() + except IOError: + pass + return heads + +def _readstatesheads(repo, undo=False): + """read all state heads + + XXX move me elsewhere""" + statesheads = {} + for state in STATES: + if state.trackheads: + filemask = 'states/%s-heads' + filename = filemask % state.name + statesheads[state] = _readheadsfile(repo, filename) + return statesheads + +def _writeheadsfile(repo, filename, heads): + """write given in the file with at + + XXX move me elsewhere""" + f = repo.opener(filename, 'w', atomictemp=True) + try: + for h in heads: + f.write(hex(h) + '\n') + f.rename() + finally: + f.close() + +def _writestateshead(repo): + """write all heads + + XXX move me elsewhere""" + # XXX transaction! + for state in STATES: + if state.trackheads: + filename = 'states/%s-heads' % state.name + _writeheadsfile(repo, filename, repo._statesheads[state]) + # WireProtocols #################### def wireheads(repo, proto): @@ -605,6 +657,8 @@ if state.trackheads: revset.symbols[state.headssymbol] = state._revsetheads + + def reposetup(ui, repo): """Repository setup @@ -654,57 +708,7 @@ @util.propertycache def _statesheads(self): """{ state-object -> set(defining head)} mapping""" - return self._readstatesheads() - - - def _readheadsfile(self, filename): - """read head from the given file - - XXX move me elsewhere""" - heads = [nullid] - try: - f = self.opener(filename) - try: - heads = sorted([node.bin(n) for n in f.read().split() if n]) - finally: - f.close() - except IOError: - pass - return heads - - def _readstatesheads(self, undo=False): - """read all state heads - - XXX move me elsewhere""" - statesheads = {} - for state in STATES: - if state.trackheads: - filemask = 'states/%s-heads' - filename = filemask % state.name - statesheads[state] = self._readheadsfile(filename) - return statesheads - - def _writeheadsfile(self, filename, heads): - """write given in the file with at - - XXX move me elsewhere""" - f = self.opener(filename, 'w', atomictemp=True) - try: - for h in heads: - f.write(hex(h) + '\n') - f.rename() - finally: - f.close() - - def _writestateshead(self): - """write all heads - - XXX move me elsewhere""" - # XXX transaction! - for state in STATES: - if state.trackheads: - filename = 'states/%s-heads' % state.name - self._writeheadsfile(filename, self._statesheads[state]) + return _readstatesheads(self) def setstate(self, state, nodes): """change state of targets changeset and it's ancestors. @@ -720,7 +724,7 @@ heads[:] = noderange(repo, ["heads(::%s())" % state.headssymbol]) heads.sort() if olds != heads: - self._writestateshead() + _writestateshead(self) if state.next is not None and state.next.trackheads: self.setstate(state.next, nodes) # cascading