# HG changeset patch # User Raphaël Gomès # Date 1704991933 -3600 # Node ID 7e6aae033d8d17a8e2749c028e94be22858efcdc # Parent 87bfd17035978600db14c75d02f35ee418eb22ae# Parent 3f87e0d305cda6e66139a1969cd2cedd45477139 branching: merge stable into default diff -r 87bfd1703597 -r 7e6aae033d8d .hgsigs --- a/.hgsigs Mon Jan 08 13:35:02 2024 +0100 +++ b/.hgsigs Thu Jan 11 17:52:13 2024 +0100 @@ -254,3 +254,4 @@ 27055614b68538576fb0439007009acf93fe0a49 0 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 diff -r 87bfd1703597 -r 7e6aae033d8d .hgtags --- a/.hgtags Mon Jan 08 13:35:02 2024 +0100 +++ b/.hgtags Thu Jan 11 17:52:13 2024 +0100 @@ -270,3 +270,4 @@ 27055614b68538576fb0439007009acf93fe0a49 6.6rc0 26c57e7a0890b96e2c473b394de380d6753c9230 6.6 71bd09bebbe36a09569cbfb388f371433360056b 6.6.1 +136902b3a95db38854ebaf5198a627641065c2ea 6.6.2 diff -r 87bfd1703597 -r 7e6aae033d8d hgext/narrow/narrowwirepeer.py --- a/hgext/narrow/narrowwirepeer.py Mon Jan 08 13:35:02 2024 +0100 +++ b/hgext/narrow/narrowwirepeer.py Thu Jan 11 17:52:13 2024 +0100 @@ -6,6 +6,10 @@ # GNU General Public License version 2 or any later version. +from mercurial.i18n import _ + +from mercurial.utils import stringutil + from mercurial import ( bundle2, error, @@ -82,20 +86,38 @@ # work around ''.split(',') => [''] return data.split(b',') if data else [] - oldincludes = splitpaths(oldincludes) - newincludes = splitpaths(newincludes) - oldexcludes = splitpaths(oldexcludes) - newexcludes = splitpaths(newexcludes) + oldincludes = set(splitpaths(oldincludes)) + newincludes = set(splitpaths(newincludes)) + oldexcludes = set(splitpaths(oldexcludes)) + newexcludes = set(splitpaths(newexcludes)) # enforce narrow acl if set if repo.ui.has_section(exchange._NARROWACL_SECTION): - exchange.applynarrowacl(repo, {'includepats': newincludes}) + kwargs = exchange.applynarrowacl( + repo, {'includepats': newincludes, 'excludepats': newexcludes} + ) + newincludes = kwargs['includepats'] + requiredexcludes = kwargs['excludepats'] - newexcludes + if requiredexcludes: + # XXX: The below code to get the username was copied from exchange.py, + # where it is noted that this is technically a layering violation for + # assuming the existence of HTTP. Using it anyway to make the error + # message consistent with the error message for invalid includes. + ui = repo.ui + username = ui.shortuser( + ui.environ.get(b'REMOTE_USER') or ui.username() + ) + raise error.Abort( + _(b"The following excludes cannot be removed for %s: %s") + % (username, stringutil.pprint(list(requiredexcludes))) + ) + newexcludes = kwargs['excludepats'] # validate the patterns - narrowspec.validatepatterns(set(oldincludes)) - narrowspec.validatepatterns(set(newincludes)) - narrowspec.validatepatterns(set(oldexcludes)) - narrowspec.validatepatterns(set(newexcludes)) + narrowspec.validatepatterns(oldincludes) + narrowspec.validatepatterns(newincludes) + narrowspec.validatepatterns(oldexcludes) + narrowspec.validatepatterns(newexcludes) common = wireprototypes.decodelist(commonheads) known = wireprototypes.decodelist(known) diff -r 87bfd1703597 -r 7e6aae033d8d mercurial/commands.py --- a/mercurial/commands.py Mon Jan 08 13:35:02 2024 +0100 +++ b/mercurial/commands.py Thu Jan 11 17:52:13 2024 +0100 @@ -1593,13 +1593,13 @@ _(b'packed bundles cannot be produced by "hg bundle"'), hint=_(b"use 'hg debugcreatestreamclonebundle'"), ) - + base_opt = opts.get('base') if opts.get('all'): if dests: raise error.InputError( _(b"--all is incompatible with specifying destinations") ) - if opts.get('base'): + if base_opt: ui.warn(_(b"ignoring --base because --all was specified\n")) if opts.get('exact'): ui.warn(_(b"ignoring --exact because --all was specified\n")) @@ -1609,19 +1609,24 @@ raise error.InputError( _(b"--exact is incompatible with specifying destinations") ) - if opts.get('base'): + if base_opt: ui.warn(_(b"ignoring --base because --exact was specified\n")) base = repo.revs(b'parents(%ld) - %ld', revs, revs) if not base: base = [nullrev] + elif base_opt: + base = logcmdutil.revrange(repo, base_opt) + if not base: + # base specified, but nothing was selected + base = [nullrev] else: - base = logcmdutil.revrange(repo, opts.get('base')) + base = None if cgversion not in changegroup.supportedoutgoingversions(repo): raise error.Abort( _(b"repository does not support bundle version %s") % cgversion ) - if base: + if base is not None: if dests: raise error.InputError( _(b"--base is incompatible with specifying destinations") diff -r 87bfd1703597 -r 7e6aae033d8d mercurial/pycompat.py --- a/mercurial/pycompat.py Mon Jan 08 13:35:02 2024 +0100 +++ b/mercurial/pycompat.py Thu Jan 11 17:52:13 2024 +0100 @@ -202,6 +202,13 @@ >>> bytestr(bytesable()) 'bytes' + ...unless the argument is the bytes *type* itself: it gets a + __bytes__() method in Python 3.11, which cannot be used as in an instance + of bytes: + + >>> bytestr(bytes) + "" + There's no implicit conversion from non-ascii str as its encoding is unknown: @@ -251,10 +258,9 @@ def __new__(cls: Type[_Tbytestr], s: object = b'') -> _Tbytestr: if isinstance(s, bytestr): return s - if not isinstance( - s, (bytes, bytearray) - ) and not builtins.hasattr( # hasattr-py3-only - s, u'__bytes__' + if not isinstance(s, (bytes, bytearray)) and ( + isinstance(s, type) + or not builtins.hasattr(s, u'__bytes__') # hasattr-py3-only ): s = str(s).encode('ascii') return bytes.__new__(cls, s) diff -r 87bfd1703597 -r 7e6aae033d8d relnotes/6.6 --- a/relnotes/6.6 Mon Jan 08 13:35:02 2024 +0100 +++ b/relnotes/6.6 Thu Jan 11 17:52:13 2024 +0100 @@ -1,3 +1,12 @@ += Mercurial 6.6.2 = + + * histedit: remove superfluous echo() and endwin() calls (issue6859) + * persistent-nodemap: avoid writing nodemap for empty revlog + * persistent-nodemap: respect the mmap setting when refreshing data + * bundle: do not detect --base argument that match nothing as lack of argument + * narrow: prevent removal of ACL-defined excludes + * pycompat: fix bytestr(bytes) in Python 3.11 + = Mercurial 6.6.1 = The first two patches fix aborted transactions that could happen since 6.6. diff -r 87bfd1703597 -r 7e6aae033d8d tests/test-bundle-r.t --- a/tests/test-bundle-r.t Mon Jan 08 13:35:02 2024 +0100 +++ b/tests/test-bundle-r.t Thu Jan 11 17:52:13 2024 +0100 @@ -140,6 +140,10 @@ $ hg -R test bundle --base 2 --all test-bundle-all-2.hg ignoring --base because --all was specified 9 changesets found + $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-with-dest.hg --config paths.default=$TESTTMP/test-3 + 5 changesets found + $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-no-dest.hg + 5 changesets found $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg 1 changesets found diff -r 87bfd1703597 -r 7e6aae033d8d tests/test-narrow-acl-excludes.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-narrow-acl-excludes.t Thu Jan 11 17:52:13 2024 +0100 @@ -0,0 +1,75 @@ +Test exclusion-based ACL enforcement + $ . "$TESTDIR/narrow-library.sh" + + $ hg init master + $ cd master + + $ for x in `$TESTDIR/seq.py 3`; do + > echo $x > "f$x" + > hg add "f$x" + > hg commit -m "Add $x" + > done + $ cat >> .hg/hgrc << EOF + > [narrowacl] + > default.includes=* + > default.excludes=f2 f3 + > test.excludes=f3 + > EOF + $ hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid + $ cat hg.pid >> "$DAEMON_PIDS" + + $ cd .. + $ hg clone http://localhost:$HGPORT1 narrowclone1 + requesting all changes + adding changesets + adding manifests + adding file changes + added 3 changesets with 2 changes to 2 files + new changesets * (glob) + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +The clone directory should only contain f1 and f2 + $ ls -A -1 narrowclone1 | sort + .hg + f1 + f2 + +Requirements should contain narrowhg + $ hg debugrequires -R narrowclone1 | grep narrowhg + narrowhg-experimental + +NarrowHG should exclude f3. + $ hg -R narrowclone1 tracked + I path:. + X path:f3 + +Narrow should not be able to widen to include f3 + $ hg -R narrowclone1 tracked --addinclude f3 + comparing with http://localhost:$HGPORT1/ + searching for changes + adding changesets + adding manifests + adding file changes + $ ls -A -1 narrowclone1 | sort + .hg + f1 + f2 + $ hg -R narrowclone1 tracked + I path:. + X path:f3 + + +Narrow should not be able to remove the exclusion for f3 + $ hg -R narrowclone1 tracked --removeexclude f3 + comparing with http://localhost:$HGPORT1/ + searching for changes + abort: The following excludes cannot be removed for test: ['path:f3'] + [255] + $ ls -A -1 narrowclone1 | sort + .hg + f1 + f2 + $ hg -R narrowclone1 tracked + I path:. + X path:f3