Move state activitation in a dedicated file repo-side
authorPierre-Yves David <pierre-yves.david@logilab.fr>
Fri, 01 Jul 2011 16:58:40 +0200
changeset 24 20ac7fa3fd29
parent 23 423c62a146c7
child 25 b372166d460d
Move state activitation in a dedicated file repo-side The main issue with having state information is hgrc is that hgrc can be ignored for trust reason.
states.py
tests/test-draft.t
tests/test-ready.t
--- 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)
--- a/tests/test-draft.t	Fri Jul 01 16:00:19 2011 +0200
+++ b/tests/test-draft.t	Fri Jul 01 16:58:40 2011 +0200
@@ -42,10 +42,7 @@
   0:5caa672bac26: published
 
 turn draft on (repo side)
-  $ cat > .hg/hgrc << EOF
-  > [states]
-  > draft=yes
-  > EOF
+  $ echo draft > .hg/states/Enabled
   $ hg log --template='{rev}:{node|short}: {state}\n'
   3:73585b17392a: draft
   2:3c8695235a32: draft
@@ -77,7 +74,7 @@
   added 2 changesets with 2 changes to 1 files
 
 turn draft off again (repo side)
-  $ sed -i 's/^draft=.*$/draft=no/' .hg/hgrc
+  $ sed -i 's/draft//' .hg/states/Enabled
   $ hg log --template='{rev}:{node|short}: {state}\n'
   3:73585b17392a: published
   2:3c8695235a32: published
@@ -90,7 +87,7 @@
   3:73585b17392a
 
 turn draft on again (repo side)
-  $ sed -i 's/^draft=.*$/draft=yes/' .hg/hgrc
+  $ echo draft > .hg/states/Enabled
 
 test incoming and pull
 
@@ -166,7 +163,7 @@
 turn draft off again (repo side)
   $ cd ..
   $ "$TESTDIR/killdaemons.py"
-  $ sed -i 's/^draft=.*$/draft=off/' ./local/.hg/hgrc
+  $ sed -i 's/draft//' ./local/.hg/states/Enabled
   $ hg -R local serve -p $HGPORT -d --pid-file=local.pid
   $ cat local.pid >> "$DAEMON_PIDS"
   $ cd fromhttp2
@@ -188,7 +185,7 @@
   $ "$TESTDIR/killdaemons.py"
 
 turn draft on again (repo side)
-  $ sed -i 's/^draft=.*$/draft=on/' local/.hg/hgrc
+  $ echo draft > ./local/.hg/states/Enabled
   $ hg init httpto
   $ hg -R httpto serve -p $HGPORT -d --pid-file=remote.pid
   $ cat remote.pid >> "$DAEMON_PIDS"
--- a/tests/test-ready.t	Fri Jul 01 16:00:19 2011 +0200
+++ b/tests/test-ready.t	Fri Jul 01 16:58:40 2011 +0200
@@ -14,10 +14,8 @@
 
   $ hg init alpha
   $ cd alpha
-  $ cat > .hg/hgrc << EOF
-  > [states]
-  > ready=yes
-  > EOF
+  $ mkdir .hg/states
+  $ echo ready > .hg/states/Enabled
   $ mkcommit z
   $ mkcommit a
   $ mkcommit b
@@ -71,10 +69,8 @@
   $ cd ..
   $ hg init beta
   $ cd beta
-  $ cat > .hg/hgrc << EOF
-  > [states]
-  > ready=yes
-  > EOF
+  $ mkdir .hg/states
+  $ echo ready > .hg/states/Enabled
   $ hg pull ../alpha --update
   pulling from ../alpha
   requesting all changes