[PATCH 1 of 2 v2] histedit: add execute method
Augie Fackler
raf at durin42.com
Tue Sep 23 13:05:17 CDT 2014
On Fri, Sep 19, 2014 at 05:57:32PM -0700, Pierre-Yves David wrote:
>
>
> On 09/16/2014 05:58 PM, David Soria Parra wrote:
> ># HG changeset patch
> ># User David Soria Parra <davidsp at fb.com>
> ># Date 1410901051 25200
> ># Tue Sep 16 13:57:31 2014 -0700
> ># Node ID d4e975e2707a0ea606c22ed472d56fab4fda7ae2
> ># Parent ca854cd4a26a8770fbc22b4d7ee1ac6823b682a5
> >histedit: add execute method
> >
> >Add a method to execute command after a changeset is picked, folded, etc.
>
> We need more details about what happens if the command rewrite history. and
> what happen when the repo is left dirty (I assume the logic from edit kicks
> in an get you to commit them)
+1
>
> >
> >diff --git a/hgext/histedit.py b/hgext/histedit.py
> >--- a/hgext/histedit.py
> >+++ b/hgext/histedit.py
> >@@ -152,6 +152,7 @@
> > import errno
> > import os
> > import sys
> >+import subprocess
> >
> > from mercurial import cmdutil
> > from mercurial import discovery
> >@@ -406,6 +407,30 @@
> > return ctx, [(repo[ha].node(), ())]
> >
> >
> >+def execute(ui, repo, ctx, cmd, opts):
> >+ hg.update(repo, ctx.node())
> >+
> >+ # release locks so the programm can call hg and then relock.
> >+ release(repo._histeditlock, repo._histeditwlock)
> >+
> >+ process = subprocess.Popen(cmd, close_fds=True, shell=True,
> >+ cwd=repo.root)
> >+ process.communicate()
> >+
> >+ # relock the repository
> >+ repo._histeditlock = repo.lock()
> >+ repo._histeditwlock = repo.wlock()
>
> You are locking in the wrong order, wlock should go first.
Eep. I don't think I knew that. I wonder if we can add that to the
lock-checker that's in contrib.
>
> Also, can we use something else than monkey patching localrepo?
>
> Finally, We need a stronger unlocking here. If someone else took the lock
> before call histedit, the release call will just decrement the depth and not
> unlock the underlying repo.
I defer to marmoute in this area - I've not thought too hard about our locking.
>
> >+ if process.returncode != 0:
> >+ raise error.InterventionRequired(
> >+ _("Command '%s' failed with exit status %d.") % (cmd,
> >+ process.returncode))
> >+ if util.any(repo.status()[:4]):
> >+ raise error.InterventionRequired(
> >+ _('Working copy dirty, please check the files listed above.\n'
> >+ 'When you are finished, run hg histedit --continue to resume.'))
> >+ return ctx, []
> >+
> > def message(ui, repo, ctx, ha, opts):
> > oldctx = repo[ha]
> > hg.update(repo, ctx.node())
> >@@ -500,11 +525,11 @@
> > """
> > lock = wlock = None
> > try:
> >- wlock = repo.wlock()
> >- lock = repo.lock()
> >+ repo._histeditwlock = repo.wlock()
> >+ repo._histeditlock = repo.lock()
> > _histedit(ui, repo, *freeargs, **opts)
> > finally:
> >- release(lock, wlock)
> >+ release(repo._histeditlock, repo._histeditwlock)
> >
> > def _histedit(ui, repo, *freeargs, **opts):
> > # TODO only abort if we try and histedit mq patches, not just
> >_______________________________________________
> >Mercurial-devel mailing list
> >Mercurial-devel at selenic.com
> >http://selenic.com/mailman/listinfo/mercurial-devel
> >
>
> --
> Pierre-Yves David
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list