[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