# HG changeset patch # User Alain Leufroy # Date 1316711920 -7200 # Node ID e672cb1263cb17d23890c794c934751ebf58580f # Parent d5170cc7881c45c98cd7d9f9f01022fe782443f2 [states] make disabling state saftier It is not allowed to disable a state that is not empty because "Explicit is better than implicit". A hint is displayed to help the user. diff -r d5170cc7881c -r e672cb1263cb hgext/states.py --- a/hgext/states.py Sun Sep 25 12:43:00 2011 +0200 +++ b/hgext/states.py Thu Sep 22 19:18:40 2011 +0200 @@ -517,7 +517,7 @@ return 1 if off: if st in repo._enabledstates: - repo._enabledstates.remove(st) + repo.disablestate(st) else: ui.write_err(_('state %s already deactivated\n') % state_name) @@ -786,7 +786,24 @@ break return state - + def disablestate(self, state): + """Disable empty state. + Raise error.Abort if the state is not empty. + """ + # the lowest is mandatory + if state == ST0: + raise error.Abort(_('could not disable %s' % state.name)) + enabled = self._enabledstates + # look up for lower state that is enabled (at least published) + lower = max(st for st in self._enabledstates if st < state) + if repo.stateheads(state) != repo.stateheads(lower): + raise error.Abort( + _('could not disable non empty state %s' % state.name), + hint=_("You may want to use `hg %s '%sheads()'`" + % (lower.name, state.name)) + ) + else: + enabled.remove(state) def stateheads(self, state): """Return the set of head that define the state""" diff -r d5170cc7881c -r e672cb1263cb tests/test-draft.t --- a/tests/test-draft.t Sun Sep 25 12:43:00 2011 +0200 +++ b/tests/test-draft.t Thu Sep 22 19:18:40 2011 +0200 @@ -75,6 +75,10 @@ turn draft off again (repo side) $ hg states --off draft + abort: could not disable non empty state draft + (You may want to use `hg published 'draftheads()'`) + [255] + $ hg published tip $ hg log --template='{rev}:{node|short}: {state}\n' 3:73585b17392a: published 2:3c8695235a32: published @@ -88,6 +92,7 @@ turn draft on again (repo side) $ hg states draft + $ hg draft --exact 2 test incoming and pull @@ -164,6 +169,11 @@ $ cd .. $ "$TESTDIR/killdaemons.py" $ hg -R local states --off draft + abort: could not disable non empty state draft + (You may want to use `hg published 'draftheads()'`) + [255] + $ hg -R local published tip + $ hg -R local states --off draft $ hg -R local serve -p $HGPORT -d --pid-file=local.pid $ cat local.pid >> "$DAEMON_PIDS" $ cd fromhttp2 @@ -195,11 +205,13 @@ searching for changes 0:5caa672bac26 1:710fe444b3b0 + 2:3c8695235a32 + 3:73585b17392a $ hg push http://localhost:$HGPORT/ pushing to http://localhost:$HGPORT/ searching for changes remote: adding changesets remote: adding manifests remote: adding file changes - remote: added 2 changesets with 2 changes to 1 files + remote: added 4 changesets with 4 changes to 2 files $ "$TESTDIR/killdaemons.py"