states.py
changeset 24 20ac7fa3fd29
parent 23 423c62a146c7
child 25 b372166d460d
--- a/states.py	Fri Jul 01 16:00:19 2011 +0200
+++ b/states.py	Fri Jul 01 16:58:40 2011 +0200
@@ -82,10 +82,6 @@
         else:
             return 'heads'
 
-    def enabled(self, ui):
-        return ui.configbool('states', self.name, False)
-
-
 ST2 = state('draft', _NOSHARE | _MUTABLE)
 ST1 = state('ready', _MUTABLE, next=ST2)
 ST0 = state('published', next=ST1)
@@ -131,6 +127,7 @@
         repo.setstate(state, [repo.changelog.node(rev) for rev in revs])
         return 0
     return cmdmoveheads
+
 for state in STATES:
     if state.trackheads:
         cmdmoveheads = makecmd(state)
@@ -218,7 +215,7 @@
 
         def stateheads(self, state):
             # look for a relevant state
-            while state.trackheads and not state.next.enabled(self.ui):
+            while state.trackheads and state.next not in self._enabledstates:
                 state = state.next
             # last state have no cached head.
             if state.trackheads:
@@ -300,10 +297,41 @@
                     selected.add(candidate)
             return sorted(selected)
 
+        ### enable // disable logic
+
+        @util.propertycache
+        def _enabledstates(self):
+            return self._readenabledstates()
+
+        def _readenabledstates(self):
+            states = set()
+            mapping = dict([(st.name, st) for st in STATES])
+            try:
+                f = self.opener('states/Enabled')
+                for line in f:
+                    st =  mapping.get(line.strip())
+                    if st is not None:
+                        states.add(st)
+            finally:
+                return states
+
+        def _writeenabledstates(self):
+            f = self.opener('states/Enabled', 'w', atomictemp=True)
+            try:
+                for st in self._enabledstates:
+                    f.write(st.name + '\n')
+                f.rename()
+            finally:
+                f.close()
+
+        ### local clone support
+
         def cancopy(self):
             st = laststatewithout(_NOSHARE)
             return ocancopy() and (self.stateheads(st) == self.heads())
 
+        ### pull // push support
+
         def pull(self, remote, *args, **kwargs):
             result = opull(remote, *args, **kwargs)
             remoteheads = self._pullimmutableheads(remote)