view tests/test-revlog.t @ 49396:ece490b02a9b

setup: use the full executable manifest from `python.exe` The manifest embedded by the build process (before the string here is added) already accounts for the `<requestedExecutionLevel level="asInvoker" ...>` setting. (Note that the PyOxidizer build is missing this, so it will likely trigger the UAC escalation prompt on each run.) However, using `mt.exe` to merge the fragment with what is already in the manifest seems to strip all whitespace, making it unreadable. Since Mercurial can be run via `python.exe`, it makes sense that we would have the same manifest settings (like the supported OS list), though I'm unaware of any functionality this enables. It also has the nice effect of making the content readable from a resource editor. The manifest comes from python 3.9.12. Note that this seems to strip the `<?xml ... ?>` declaration when viewed with ResourceHacker 5.1.7, but this was also the state of things with the previous commit, and `mt.exe "-inputresource:hg.exe;#1" -out:extracted` does contain the declaration and the BOM in both cases. No idea why this differs from other executables.
author Matt Harbison <matt_harbison@yahoo.com>
date Mon, 18 Jul 2022 19:18:00 -0400
parents a94f28be2e6e
children b10e4c19f8c5
line wrap: on
line source

  $ hg init empty-repo
  $ cd empty-repo

Flags on revlog version 0 are rejected

  >>> with open('.hg/store/00changelog.i', 'wb') as fh:
  ...     fh.write(b'\x00\x01\x00\x00') and None

  $ hg log
  abort: unknown flags (0x01) in version 0 revlog 00changelog
  [50]

Unknown flags on revlog version 1 are rejected

  >>> with open('.hg/store/00changelog.i', 'wb') as fh:
  ...     fh.write(b'\x00\x04\x00\x01') and None

  $ hg log
  abort: unknown flags (0x04) in version 1 revlog 00changelog
  [50]

Unknown version is rejected

  >>> with open('.hg/store/00changelog.i', 'wb') as fh:
  ...     fh.write(b'\x00\x00\xbe\xef') and None

  $ hg log
  abort: unknown version (48879) in revlog 00changelog
  [50]

  $ cd ..

Test for CVE-2016-3630

  $ mkdir test2; cd test2
  $ hg init

  >>> import codecs
  >>> open("a.i", "wb").write(codecs.decode(codecs.decode(
  ... b"""eJxjYGZgZIAAYQYGxhgom+k/FMx8YKx9ZUaKSOyqo4cnuKb8mbqHV5cBCVTMWb1Cwqkhe4Gsg9AD
  ... Joa3dYtcYYYBAQ8Qr4OqZAYRICPTSr5WKd/42rV36d+8/VmrNpv7NP1jQAXrQE4BqQUARngwVA==""",
  ... "base64"), "zlib")) and None

  $ hg debugrevlogindex a.i
     rev linkrev nodeid       p1           p2
       0       2 99e0332bd498 000000000000 000000000000
       1       3 6674f57a23d8 99e0332bd498 000000000000

  >>> from mercurial.revlogutils.constants import KIND_OTHER
  >>> from mercurial import revlog, vfs
  >>> tvfs = vfs.vfs(b'.')
  >>> tvfs.options = {b'revlogv1': True}
  >>> rl = revlog.revlog(tvfs, target=(KIND_OTHER, b'test'), radix=b'a')
  >>> rl.revision(1)
  mpatchError(*'patch cannot be decoded'*) (glob)

  $ cd ..


Regression test for support for the old repos with strange diff encoding.
Apparently it used to be possible (maybe it's still possible, but we don't know how)
to create commits whose diffs are encoded relative to a nullrev.
This test checks that a repo with that encoding can still be read.

This is what we did to produce the repo in test-revlog-diff-relative-to-nullrev.tar:

- tweak the code in mercurial/revlogutils/deltas.py to produce such "trivial" deltas:
>          if deltainfo is None:
> -            deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
> +            deltainfo = self._builddeltainfo(revinfo, nullrev, fh)
- hg init
- echo hi > a
- hg commit -Am_
- remove some cache files

  $ tar --force-local -xf "$TESTDIR"/bundles/test-revlog-diff-relative-to-nullrev.tar
  $ cd nullrev-diff
  $ hg debugdeltachain a
      rev      p1      p2  chain# chainlen     prev   delta       size    rawsize  chainsize     ratio   lindist extradist extraratio   readsize largestblk rddensity srchunks
        0      -1      -1       1        2       -1      p1         15          3         15   5.00000        15         0    0.00000         15         15   1.00000        1
        1       0      -1       1        2       -1      p2         15          3         15   5.00000        30        15    1.00000         30         30   0.50000        1
        2      -1      -1       1        2       -1      p1         15          3         15   5.00000        45        30    2.00000         45         45   0.33333        1
  $ hg cat --config rhg.cat=true -r 0 a
  hi
  $ hg cat --config rhg.cat=true -r 1 a
  ho
  $ hg cat --config rhg.cat=true -r 2 a
  ha
  $ cd ..