531 |
529 |
532 cmdtable = {'states': (cmdstates, [ ('', 'off', False, _('desactivate the state') )], '<state>')} |
530 cmdtable = {'states': (cmdstates, [ ('', 'off', False, _('desactivate the state') )], '<state>')} |
533 |
531 |
534 # automatic generation of command that set state |
532 # automatic generation of command that set state |
535 def makecmd(state): |
533 def makecmd(state): |
536 def cmdmoveheads(ui, repo, *changesets): |
534 def cmdmoveheads(ui, repo, *changesets, **opts): |
537 """set revisions in %s state |
535 """set revisions in %s state |
538 |
536 |
539 This command also alter state of ancestors if necessary. |
537 This command also alter state of ancestors if necessary. |
540 """ % state |
538 """ % state |
|
539 if not state in repo._enabledstates: |
|
540 raise error.Abort( |
|
541 _('state %s is not activated' % state), |
|
542 hint=_('try ``hg states %s`` before' % state)) |
|
543 if opts.get('exact'): |
|
544 repo.setstate_unsafe(state, changesets) |
|
545 return 0 |
541 revs = scmutil.revrange(repo, changesets) |
546 revs = scmutil.revrange(repo, changesets) |
542 repo.setstate(state, [repo.changelog.node(rev) for rev in revs]) |
547 repo.setstate(state, [repo.changelog.node(rev) for rev in revs]) |
543 return 0 |
548 return 0 |
544 return cmdmoveheads |
549 return cmdmoveheads |
545 |
550 |
546 for state in STATES: |
551 for state in STATES: |
547 if state.trackheads: |
552 cmdmoveheads = makecmd(state) |
548 cmdmoveheads = makecmd(state) |
553 cmdtable[state.name] = (cmdmoveheads, [ |
549 cmdtable[state.name] = (cmdmoveheads, [], '<revset>') |
554 ('e', 'exact', False, _('move boundary so that revs are exactly in ' |
|
555 'state <state> ( all([rev.state == <state> for ' |
|
556 'rev in revs]))')) |
|
557 ], '<revset>') |
550 |
558 |
551 # Pushkey mechanism for mutable |
559 # Pushkey mechanism for mutable |
552 ######################################### |
560 ######################################### |
553 |
561 |
554 def pushstatesheads(repo, key, old, new): |
562 def pushstatesheads(repo, key, old, new): |
792 |
800 |
793 @util.propertycache |
801 @util.propertycache |
794 def _statesheads(self): |
802 def _statesheads(self): |
795 """{ state-object -> set(defining head)} mapping""" |
803 """{ state-object -> set(defining head)} mapping""" |
796 return _readstatesheads(self) |
804 return _readstatesheads(self) |
|
805 |
|
806 def setstate_unsafe(self, state, changesets): |
|
807 """Change state of targets changesets and it's ancestors. |
|
808 |
|
809 Simplify the list of heads. |
|
810 |
|
811 Unlike ``setstate``, the "lower" states are also changed |
|
812 """ |
|
813 #modify "lower" states |
|
814 req_nodes_rst = '|'.join('((%s)::)' % rst for rst in changesets) |
|
815 for st in STATES: |
|
816 if st >= state: # only modify lower state heads for now |
|
817 continue |
|
818 try: |
|
819 heads = self._statesheads[st] |
|
820 except KeyError: # forget non-activated states |
|
821 continue |
|
822 olds = heads[:] |
|
823 rst = "heads((::%s()) - (%s))" % (st.headssymbol, req_nodes_rst) |
|
824 heads[:] = noderange(repo, [rst]) |
|
825 if olds != heads: |
|
826 _writestateshead(self) |
|
827 #modify the state |
|
828 if state in self._statesheads: |
|
829 revs = scmutil.revrange(repo, changesets) |
|
830 repo.setstate(state, [repo.changelog.node(rev) for rev in revs]) |
797 |
831 |
798 def setstate(self, state, nodes): |
832 def setstate(self, state, nodes): |
799 """change state of targets changeset and it's ancestors. |
833 """change state of targets changeset and it's ancestors. |
800 |
834 |
801 Simplify the list of head.""" |
835 Simplify the list of head.""" |