##// END OF EJS Templates
phase: add a dedicated pretxnclose-phase hook...
Boris Feld -
r34712:f6d17075 default
parent child Browse files
Show More
@@ -1002,6 +1002,17 b' be ``$HG_HOOKTYPE=incoming`` and ``$HG_H'
1002 1002 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1003 1003 ``HG_TXNID``.
1004 1004
1005 ``pretxnclose-phase``
1006 Run right before a phase change is actually finalized. Any repository change
1007 will be visible to the hook program. This lets you validate the transaction
1008 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1009 status will cause the transaction to be rolled back.
1010 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1011 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1012 will be empty. In addition, the reason for the transaction opening will be in
1013 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1014 ``HG_TXNID``.
1015
1005 1016 ``txnclose``
1006 1017 Run after any repository transaction has been committed. At this
1007 1018 point, the transaction can no longer be rolled back. The hook will run
@@ -1017,12 +1028,8 b' be ``$HG_HOOKTYPE=incoming`` and ``$HG_H'
1017 1028 ``txnclose-phase``
1018 1029 Run after any phase change has been committed. At this point, the
1019 1030 transaction can no longer be rolled back. The hook will run after the lock
1020 is released.
1021 The affected node is available in ``$HG_NODE``, the new phase will be
1022 available in ``$HG_PHASE`` while the previous phase will be available in
1023 ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE`` will be empty. In
1024 addition, the reason for the transaction opening will be in ``$HG_TXNNAME``,
1025 and a unique identifier for the transaction will be in ``HG_TXNID``.
1031 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1032 available variables.
1026 1033
1027 1034 ``txnabort``
1028 1035 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
@@ -1243,6 +1243,14 b' class localrepository(object):'
1243 1243 repo.hook('pretxnclose-bookmark', throw=True,
1244 1244 txnname=desc,
1245 1245 **pycompat.strkwargs(args))
1246 if hook.hashook(repo.ui, 'pretxnclose-phase'):
1247 cl = repo.unfiltered().changelog
1248 for rev, (old, new) in tr.changes['phases'].items():
1249 args = tr.hookargs.copy()
1250 node = hex(cl.node(rev))
1251 args.update(phases.preparehookargs(node, old, new))
1252 repo.hook('pretxnclose-phase', throw=True, txnname=desc,
1253 **pycompat.strkwargs(args))
1246 1254
1247 1255 repo.hook('pretxnclose', throw=True,
1248 1256 txnname=desc, **pycompat.strkwargs(tr.hookargs))
@@ -732,3 +732,94 b' repositories visible to an external hook'
732 732 rollback completed
733 733 abort: pretxnclose hook exited with status 1
734 734 [255]
735
736 Check that pretxnclose-phase hook can control phase movement
737
738 $ hg phase --force b3325c91a4d9 --secret
739 test-debug-phase: move rev 3: 0 -> 2
740 test-debug-phase: move rev 4: 0 -> 2
741 test-debug-phase: move rev 5: 1 -> 2
742 test-debug-phase: move rev 7: 0 -> 2
743 test-hook-close-phase: b3325c91a4d916bcc4cdc83ea3fe4ece46a42f6e: 0 -> 2
744 test-hook-close-phase: a603bfb5a83e312131cebcd05353c217d4d21dde: 0 -> 2
745 test-hook-close-phase: a030c6be5127abc010fcbff1851536552e6951a8: 1 -> 2
746 test-hook-close-phase: 17a481b3bccb796c0521ae97903d81c52bfee4af: 0 -> 2
747 $ hg log -G -T phases
748 @ changeset: 7:17a481b3bccb
749 |\ tag: tip
750 | | phase: secret
751 | | parent: 6:cf9fe039dfd6
752 | | parent: 4:a603bfb5a83e
753 | | user: test
754 | | date: Thu Jan 01 00:00:00 1970 +0000
755 | | summary: merge B' and E
756 | |
757 | o changeset: 6:cf9fe039dfd6
758 | | phase: public
759 | | parent: 1:27547f69f254
760 | | user: test
761 | | date: Thu Jan 01 00:00:00 1970 +0000
762 | | summary: B'
763 | |
764 o | changeset: 4:a603bfb5a83e
765 | | phase: secret
766 | | user: test
767 | | date: Thu Jan 01 00:00:00 1970 +0000
768 | | summary: E
769 | |
770 o | changeset: 3:b3325c91a4d9
771 | | phase: secret
772 | | user: test
773 | | date: Thu Jan 01 00:00:00 1970 +0000
774 | | summary: D
775 | |
776 o | changeset: 2:f838bfaca5c7
777 |/ phase: public
778 | user: test
779 | date: Thu Jan 01 00:00:00 1970 +0000
780 | summary: C
781 |
782 o changeset: 1:27547f69f254
783 | phase: public
784 | user: test
785 | date: Thu Jan 01 00:00:00 1970 +0000
786 | summary: B
787 |
788 o changeset: 0:4a2df7238c3b
789 phase: public
790 user: test
791 date: Thu Jan 01 00:00:00 1970 +0000
792 summary: A
793
794
795 Install a hook that prevent b3325c91a4d9 to become public
796
797 $ cat >> .hg/hgrc << EOF
798 > [hooks]
799 > pretxnclose-phase.nopublish_D = (echo \$HG_NODE| grep -v b3325c91a4d9>/dev/null) || [ 0 -lt \$HG_PHASE ]
800 > EOF
801
802 Try various actions. only the draft move should succeed
803
804 $ hg phase --public b3325c91a4d9
805 transaction abort!
806 rollback completed
807 abort: pretxnclose-phase.nopublish_D hook exited with status 1
808 [255]
809 $ hg phase --public a603bfb5a83e
810 transaction abort!
811 rollback completed
812 abort: pretxnclose-phase.nopublish_D hook exited with status 1
813 [255]
814 $ hg phase --draft 17a481b3bccb
815 test-debug-phase: move rev 3: 2 -> 1
816 test-debug-phase: move rev 4: 2 -> 1
817 test-debug-phase: move rev 7: 2 -> 1
818 test-hook-close-phase: b3325c91a4d916bcc4cdc83ea3fe4ece46a42f6e: 2 -> 1
819 test-hook-close-phase: a603bfb5a83e312131cebcd05353c217d4d21dde: 2 -> 1
820 test-hook-close-phase: 17a481b3bccb796c0521ae97903d81c52bfee4af: 2 -> 1
821 $ hg phase --public 17a481b3bccb
822 transaction abort!
823 rollback completed
824 abort: pretxnclose-phase.nopublish_D hook exited with status 1
825 [255]
General Comments 0
You need to be logged in to leave comments. Login now