[PATCH STABLE] hgweb: use introrev() for finding parents (issue4506)
Augie Fackler
raf at durin42.com
Thu Feb 19 15:14:57 CST 2015
On Thu, Feb 19, 2015 at 09:41:46PM +0800, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <engored at ya.ru>
> # Date 1424345526 -28800
> # Thu Feb 19 19:32:06 2015 +0800
> # Branch stable
> # Node ID c5c1ffca678395337f8ef415423f990a9397d4ef
> # Parent 942a5a34b2d0611ab284380fbe45b9bb1897af98
> hgweb: use introrev() for finding parents (issue4506)
This patch LGTM, but I want marmoute's eyes on it before I push it.
>
> The issue is titled "filtered revision 'XXX' (not in 'served' subset)" and that
> is the error message you sometimes get when trying to look at a file (/file or
> /annotate) in hgweb. For example:
>
> http://hg.intevation.org/mercurial/crew/file/90cf454edd70/mercurial/cmdutil.py
>
> This happens when a parent revision for a file is hidden, thus it is
> not 'served' and isn't accessible in hgweb by default. When hgweb tries to
> access such changeset, it produces the error and HTTP status code 404.
>
> Another detail is that the parents() function, that is used in multiple places
> in hgweb, sometimes returned changesets that were obsoleted by the current
> changeset for the file. For example, when using rebase with evolve and rebasing
> a divergent changeset that introduces a file on top of current branch. Or
> grafting a change and making the new grafted changeset obsolete the source
> (shown in the test case). The result is the same - the obsoleted changeset was
> mistakingly returned from parents(), even though it's not a parent and the only
> link to the new changeset is an obsoletion marker (and rebase/graft metadata?
> not sure it matters).
>
> The problem is fixed by using introrev() instead of linkrev() for finding
> parents. This prevents parents() function from returning unrelated obsolete
> changesets.
>
> The test case prepares a separate repo because (afaict) all other test cases
> never reuse file names, so there are no files that were changed in multiple
> changesets. So no previously available files have obsolete changesets in their
> history.
>
> diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
> --- a/mercurial/hgweb/webutil.py
> +++ b/mercurial/hgweb/webutil.py
> @@ -139,8 +139,8 @@ def _siblings(siblings=[], hiderev=None)
>
> def parents(ctx, hide=None):
> if (isinstance(ctx, context.basefilectx) and
> - ctx.changectx().rev() != ctx.linkrev()):
> - return _siblings([ctx._repo[ctx.linkrev()]], hide)
> + ctx.changectx().rev() != ctx.introrev()):
> + return _siblings([ctx._repo[ctx.introrev()]], hide)
> return _siblings(ctx.parents(), hide)
>
> def children(ctx, hide=None):
> diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
> --- a/tests/test-obsolete.t
> +++ b/tests/test-obsolete.t
> @@ -753,3 +753,42 @@ Test that removing a local tag does not
> $ hg tags
> visible 0:193e9254ce7e
> tip 0:193e9254ce7e
> +
> +#if serve
> +
> +Test issue 4506
> +
> + $ cd ..
> + $ hg init repo-issue4506
> + $ cd repo-issue4506
> + $ echo "0" > foo
> + $ hg add foo
> + $ hg ci -m "0"
> +
> + $ hg up null
> + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + $ echo "1" > bar
> + $ hg add bar
> + $ hg ci -m "1"
> + created new head
> + $ hg up 0
> + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
> + $ hg graft 1
> + grafting 1:9fe6fab2acbd "1" (tip)
> +
> + $ hg debugobsolete `hg log -r1 -T'{node}'` `hg log -r2 -T'{node}'`
> +
> + $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
> + $ cat hg.pid >> $DAEMON_PIDS
> +
> + $ "$TESTDIR/get-with-headers.py" --headeronly localhost:$HGPORT 'rev/1'
> + 404 Not Found
> + [1]
> + $ "$TESTDIR/get-with-headers.py" --headeronly localhost:$HGPORT 'file/tip/bar'
> + 200 Script output follows
> + $ "$TESTDIR/get-with-headers.py" --headeronly localhost:$HGPORT 'annotate/tip/bar'
> + 200 Script output follows
> +
> + $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
> +
> +#endif
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list