view tests/test-py3-commands.t @ 32697:19b9fc40cc51

revlog: skeleton support for version 2 revlogs There are a number of improvements we want to make to revlogs that will require a new version - version 2. It is unclear what the full set of improvements will be or when we'll be done with them. What I do know is that the process will likely take longer than a single release, will require input from various stakeholders to evaluate changes, and will have many contentious debates and bikeshedding. It is unrealistic to develop revlog version 2 up front: there are just too many uncertainties that we won't know until things are implemented and experiments are run. Some changes will also be invasive and prone to bit rot, so sitting on dozens of patches is not practical. This commit introduces skeleton support for version 2 revlogs in a way that is flexible and not bound by backwards compatibility concerns. An experimental repo requirement for denoting revlog v2 has been added. The requirement string has a sub-version component to it. This will allow us to declare multiple requirements in the course of developing revlog v2. Whenever we change the in-development revlog v2 format, we can tweak the string, creating a new requirement and locking out old clients. This will allow us to make as many backwards incompatible changes and experiments to revlog v2 as we want. In other words, we can land code and make meaningful progress towards revlog v2 while still maintaining extreme format flexibility up until the point we freeze the format and remove the experimental labels. To enable the new repo requirement, you must supply an experimental and undocumented config option. But not just any boolean flag will do: you need to explicitly use a value that no sane person should ever type. This is an additional guard against enabling revlog v2 on an installation it shouldn't be enabled on. The specific scenario I'm trying to prevent is say a user with a 4.4 client with a frozen format enabling the option but then downgrading to 4.3 and accidentally creating repos with an outdated and unsupported repo format. Requiring a "challenge" string should prevent this. Because the format is not yet finalized and I don't want to take any chances, revlog v2's version is currently 0xDEAD. I figure squatting on a value we're likely never to use as an actual revlog version to mean "internal testing only" is acceptable. And "dead" is easily recognized as something meaningful. There is a bunch of cleanup that is needed before work on revlog v2 begins in earnest. I plan on doing that work once this patch is accepted and we're comfortable with the idea of starting down this path.
author Gregory Szorc <gregory.szorc@gmail.com>
date Fri, 19 May 2017 20:29:11 -0700
parents 74e9496e4986
children 90ce5f0366ba
line wrap: on
line source

#require py3exe

This test helps in keeping a track on which commands we can run on
Python 3 and see what kind of errors are coming up.
The full traceback is hidden to have a stable output.
  $ HGBIN=`which hg`

  $ for cmd in version debuginstall ; do
  >   echo $cmd
  >   $PYTHON3 $HGBIN $cmd 2>&1 2>&1 | tail -1
  > done
  version
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  debuginstall
  no problems detected

#if test-repo
Make a clone so that any features in the developer's .hg/hgrc that
might confuse Python 3 don't break this test. When we can do commit in
Python 3, we'll stop doing this. We use e76ed1e480ef for the clone
because it has different files than 273ce12ad8f1, so we can test both
`files` from dirstate and `files` loaded from a specific revision.

  $ hg clone -r e76ed1e480ef "`dirname "$TESTDIR"`" testrepo 2>&1 | tail -1
  15 files updated, 0 files merged, 0 files removed, 0 files unresolved

Test using -R, which exercises some URL code:
  $ $PYTHON3 $HGBIN -R testrepo files -r 273ce12ad8f1 | tail -1
  testrepo/tkmerge

Now prove `hg files` is reading the whole manifest. We have to grep
out some potential warnings that come from hgrc as yet.
  $ cd testrepo
  $ $PYTHON3 $HGBIN files -r 273ce12ad8f1
  .hgignore
  PKG-INFO
  README
  hg
  mercurial/__init__.py
  mercurial/byterange.py
  mercurial/fancyopts.py
  mercurial/hg.py
  mercurial/mdiff.py
  mercurial/revlog.py
  mercurial/transaction.py
  notes.txt
  setup.py
  tkmerge

  $ $PYTHON3 $HGBIN files -r 273ce12ad8f1 | wc -l
  \s*14 (re)
  $ $PYTHON3 $HGBIN files | wc -l
  \s*15 (re)

Test if log-like commands work:

  $ $PYTHON3 $HGBIN tip
  changeset:   10:e76ed1e480ef
  tag:         tip
  user:        oxymoron@cinder.waste.org
  date:        Tue May 03 23:37:43 2005 -0800
  summary:     Fix linking of changeset revs when merging
  

  $ $PYTHON3 $HGBIN log -r0
  changeset:   0:9117c6561b0b
  user:        mpm@selenic.com
  date:        Tue May 03 13:16:10 2005 -0800
  summary:     Add back links from file revisions to changeset revisions
  

  $ cd ..
#endif

Test if `hg config` works:

  $ $PYTHON3 $HGBIN config
  devel.all-warnings=true
  devel.default-date=0 0
  largefiles.usercache=$TESTTMP/.cache/largefiles
  ui.slash=True
  ui.interactive=False
  ui.mergemarkers=detailed
  ui.promptecho=True
  web.address=localhost
  web.ipv6=False

  $ cat > included-hgrc <<EOF
  > [extensions]
  > babar = imaginary_elephant
  > EOF
  $ cat >> $HGRCPATH <<EOF
  > %include $TESTTMP/included-hgrc
  > EOF
  $ $PYTHON3 $HGBIN version | tail -1
  *** failed to import extension babar from imaginary_elephant: *: 'imaginary_elephant' (glob)
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

  $ rm included-hgrc
  $ touch included-hgrc

Test bytes-ness of policy.policy with HGMODULEPOLICY

  $ HGMODULEPOLICY=py
  $ export HGMODULEPOLICY
  $ $PYTHON3 `which hg` debuginstall 2>&1 2>&1 | tail -1
  no problems detected

`hg init` can create empty repos
`hg status works fine`
`hg summary` also works!

  $ $PYTHON3 `which hg` init py3repo
  $ cd py3repo
  $ echo "This is the file 'iota'." > iota
  $ $PYTHON3 $HGBIN status
  ? iota
  $ $PYTHON3 $HGBIN add iota
  $ $PYTHON3 $HGBIN status
  A iota
  $ hg diff --nodates --git
  diff --git a/iota b/iota
  new file mode 100644
  --- /dev/null
  +++ b/iota
  @@ -0,0 +1,1 @@
  +This is the file 'iota'.
  $ $PYTHON3 $HGBIN commit --message 'commit performed in Python 3'
  $ $PYTHON3 $HGBIN status

  $ mkdir A
  $ echo "This is the file 'mu'." > A/mu
  $ $PYTHON3 $HGBIN addremove
  adding A/mu
  $ $PYTHON3 $HGBIN status
  A A/mu
  $ HGEDITOR='echo message > ' $PYTHON3 $HGBIN commit
  $ $PYTHON3 $HGBIN status
  $ $PYHON3 $HGBIN summary
  parent: 1:e1e9167203d4 tip
   message
  branch: default
  commit: (clean)
  update: (current)
  phases: 2 draft

Test weird unicode-vs-bytes stuff

  $ $PYTHON3 $HGBIN help | egrep -v '^ |^$'
  Mercurial Distributed SCM
  list of commands:
  additional help topics:
  (use 'hg help -v' to show built-in aliases and global options)

  $ $PYTHON3 $HGBIN help help | egrep -v '^ |^$'
  hg help [-ecks] [TOPIC]
  show help for a given topic or a help overview
  options ([+] can be repeated):
  (some details hidden, use --verbose to show complete help)

  $ $PYTHON3 $HGBIN help -k notopic
  abort: no matches
  (try 'hg help' for a list of topics)
  [255]

Prove the repo is valid using the Python 2 `hg`:
  $ hg verify
  checking changesets
  checking manifests
  crosschecking files in changesets and manifests
  checking files
  2 files, 2 changesets, 2 total revisions
  $ hg log
  changeset:   1:e1e9167203d4
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     message
  
  changeset:   0:71c96e924262
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     commit performed in Python 3
  

  $ hg log -G
  @  changeset:   1:e1e9167203d4
  |  tag:         tip
  |  user:        test
  |  date:        Thu Jan 01 00:00:00 1970 +0000
  |  summary:     message
  |
  o  changeset:   0:71c96e924262
     user:        test
     date:        Thu Jan 01 00:00:00 1970 +0000
     summary:     commit performed in Python 3
  
  $ hg log -Tjson
  [
   {
    "rev": 1,
    "node": "e1e9167203d450ca2f558af628955b5f5afd4489",
    "branch": "default",
    "phase": "draft",
    "user": "test",
    "date": [0, 0],
    "desc": "message",
    "bookmarks": [],
    "tags": ["tip"],
    "parents": ["71c96e924262969ff0d8d3d695b0f75412ccc3d8"]
   },
   {
    "rev": 0,
    "node": "71c96e924262969ff0d8d3d695b0f75412ccc3d8",
    "branch": "default",
    "phase": "draft",
    "user": "test",
    "date": [0, 0],
    "desc": "commit performed in Python 3",
    "bookmarks": [],
    "tags": [],
    "parents": ["0000000000000000000000000000000000000000"]
   }
  ]

Show that update works now!

  $ hg up 0
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ hg identify
  71c96e924262