[PATCH 1 of 4 RFC] hook: have a generic hook for transaction opening

Augie Fackler raf at durin42.com
Tue Mar 10 08:02:10 CDT 2015


On Tue, Mar 10, 2015 at 01:07:13AM -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1418264389 28800
> #      Wed Dec 10 18:19:49 2014 -0800
> # Node ID 82dea52f27319896a8d33a0b805f439107a94845
> # Parent  4ef4e3c3c00693868ba428e21ac092e559e4fcea
> hook: have a generic hook for transaction opening
>
> We are adding generic hooking for all transaction. We do not really have any
> useful information to including when opening the transaction but this is a
> useful time to allow hook anyway.

If we can't provide useful information, then why bother? Do you have a
practical use case?

>
> diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
> --- a/mercurial/help/config.txt
> +++ b/mercurial/help/config.txt
> @@ -806,10 +806,14 @@ variables it is passed are listed with n
>    Run before creating a tag. Exit status 0 allows the tag to be
>    created. Non-zero status will cause the tag to fail. ID of
>    changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
>    local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
>
> +``txnopen``
> +  Run before any new repository transaction is open. Reason for the transaction
> +  opening will be in ``$HG_TXNNAME``. This hook can abort transaction opening.
> +
>  ``pretxnchangegroup``
>    Run after a changegroup has been added via push, pull or unbundle,
>    but before the transaction has been committed. Changegroup is
>    visible to hook program. This lets you validate incoming changes
>    before accepting them. Passed the ID of the first new changeset in
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -906,10 +906,12 @@ class localrepository(object):
>          if self.svfs.exists("journal"):
>              raise error.RepoError(
>                  _("abandoned transaction found"),
>                  hint=_("run 'hg recover' to clean up transaction"))
>
> +        self.hook('txnopen', throw=True, txnname=desc)
> +
>          self._writejournal(desc)
>          renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
>          rp = report and report or self.ui.warn
>          vfsmap = {'plain': self.vfs} # root of .hg/
>          tr = transaction.transaction(rp, self.svfs, vfsmap,
> diff --git a/tests/test-hook.t b/tests/test-hook.t
> --- a/tests/test-hook.t
> +++ b/tests/test-hook.t
> @@ -10,15 +10,17 @@ commit hooks can see env vars
>    > pretxncommit = sh -c "HG_LOCAL= HG_TAG= python \"$TESTDIR/printenv.py\" pretxncommit"
>    > pretxncommit.tip = hg -q tip
>    > pre-identify = python "$TESTDIR/printenv.py" pre-identify 1
>    > pre-cat = python "$TESTDIR/printenv.py" pre-cat
>    > post-cat = python "$TESTDIR/printenv.py" post-cat
> +  > txnopen = sh -c "HG_LOCAL= HG_TAG= python \"$TESTDIR/printenv.py\" txnopen"
>    > EOF
>    $ echo a > a
>    $ hg add a
>    $ hg commit -m a
>    precommit hook: HG_PARENT1=0000000000000000000000000000000000000000
> +  txnopen hook: HG_TXNNAME=commit
>    pretxncommit hook: HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000 HG_PENDING=$TESTTMP/a
>    0:cb9a9f314b8b
>    commit hook: HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
>    commit.b hook: HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
>
> @@ -40,30 +42,33 @@ pretxncommit and commit hooks can see bo
>
>    $ cd ../a
>    $ echo b >> a
>    $ hg commit -m a1 -d "1 0"
>    precommit hook: HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
> +  txnopen hook: HG_TXNNAME=commit
>    pretxncommit hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
>    1:ab228980c14d
>    commit hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
>    commit.b hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
>    $ hg update -C 0
>    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>    $ echo b > b
>    $ hg add b
>    $ hg commit -m b -d '1 0'
>    precommit hook: HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
> +  txnopen hook: HG_TXNNAME=commit
>    pretxncommit hook: HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
>    2:ee9deb46ab31
>    commit hook: HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
>    commit.b hook: HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
>    created new head
>    $ hg merge 1
>    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>    (branch merge, don't forget to commit)
>    $ hg commit -m merge -d '2 0'
>    precommit hook: HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
> +  txnopen hook: HG_TXNNAME=commit
>    pretxncommit hook: HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd HG_PENDING=$TESTTMP/a
>    3:07f3376c1e65
>    commit hook: HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
>    commit.b hook: HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
>
> @@ -101,10 +106,11 @@ tag hooks can see env vars
>    > tag = sh -c "HG_PARENT1= HG_PARENT2= python \"$TESTDIR/printenv.py\" tag"
>    > EOF
>    $ hg tag -d '3 0' a
>    pretag hook: HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
>    precommit hook: HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
> +  txnopen hook: HG_TXNNAME=commit
>    pretxncommit hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PENDING=$TESTTMP/a
>    4:539e4b31b6dc
>    tag hook: HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
>    commit hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
>    commit.b hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
> @@ -135,10 +141,11 @@ more there after
>    $ hg add z
>    $ hg -q tip
>    4:539e4b31b6dc
>    $ hg commit -m 'fail' -d '4 0'
>    precommit hook: HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
> +  txnopen hook: HG_TXNNAME=commit
>    pretxncommit hook: HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
>    5:6f611f8018c1
>    5:6f611f8018c1
>    pretxncommit.forbid hook: HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
>    transaction abort!
> @@ -196,10 +203,11 @@ pushkey hook
>    $ hg bookmark -r null foo
>    $ hg push -B foo ../a
>    pushing to ../a
>    searching for changes
>    no changes found
> +  txnopen hook: HG_TXNNAME=bookmarks
>    pushkey hook: HG_KEY=foo HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_RET=1
>    exporting bookmark foo
>    [1]
>    $ cd ../a
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list