view tests/test-show.t @ 38732:be4984261611

merge: mark file gets as not thread safe (issue5933) In default installs, this has the effect of disabling the thread-based worker on Windows when manifesting files in the working directory. My measurements have shown that with revlog-based repositories, Mercurial spends a lot of CPU time in revlog code resolving file data. This ends up incurring a lot of context switching across threads and slows down `hg update` operations when going from an empty working directory to the tip of the repo. On mozilla-unified (246,351 files) on an i7-6700K (4+4 CPUs): before: 487s wall after: 360s wall (equivalent to worker.enabled=false) cpus=2: 379s wall Even with only 2 threads, the thread pool is still slower. The introduction of the thread-based worker (02b36e860e0b) states that it resulted in a "~50%" speedup for `hg sparse --enable-profile` and `hg sparse --disable-profile`. This disagrees with my measurement above. I theorize a few reasons for this: 1) Removal of files from the working directory is I/O - not CPU - bound and should benefit from a thread pool (unless I/O is insanely fast and the GIL release is near instantaneous). So tests like `hg sparse --enable-profile` may exercise deletion throughput and aren't good benchmarks for worker tasks that are CPU heavy. 2) The patch was authored by someone at Facebook. The results were likely measured against a repository using remotefilelog. And I believe that revision retrieval during working directory updates with remotefilelog will often use a remote store, thus being I/O and not CPU bound. This probably resulted in an overstated performance gain. Since there appears to be a need to enable the thread-based worker with some stores, I've made the flagging of file gets as thread safe configurable. I've made it experimental because I don't want to formalize a boolean flag for this option and because this attribute is best captured against the store implementation. But we don't have a proper store API for this yet. I'd rather cross this bridge later. It is possible there are revlog-based repositories that do benefit from a thread-based worker. I didn't do very comprehensive testing. If there are, we may want to devise a more proper algorithm for whether to use the thread-based worker, including possibly config options to limit the number of threads to use. But until I see evidence that justifies complexity, simplicity wins. Differential Revision: https://phab.mercurial-scm.org/D3963
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 18 Jul 2018 09:49:34 -0700
parents e6b5e7329ff2
children
line wrap: on
line source

  $ cat >> $HGRCPATH << EOF
  > [extensions]
  > show =
  > EOF

No arguments shows available views

  $ hg init empty
  $ cd empty
  $ hg show
  available views:
  
  bookmarks -- bookmarks and their associated changeset
  stack -- current line of work
  work -- changesets that aren't finished
  
  abort: no view requested
  (use "hg show VIEW" to choose a view)
  [255]

`hg help show` prints available views

  $ hg help show
  hg show VIEW
  
  show various repository information
  
      A requested view of repository data is displayed.
  
      If no view is requested, the list of available views is shown and the
      command aborts.
  
      Note:
         There are no backwards compatibility guarantees for the output of this
         command. Output may change in any future Mercurial release.
  
         Consumers wanting stable command output should specify a template via
         "-T/--template".
  
      List of available views:
  
      bookmarks   bookmarks and their associated changeset
  
      stack       current line of work
  
      work        changesets that aren't finished
  
  (use 'hg help -e show' to show help for the show extension)
  
  options:
  
   -T --template TEMPLATE display with template
  
  (some details hidden, use --verbose to show complete help)

Unknown view prints error

  $ hg show badview
  abort: unknown view: badview
  (run "hg show" to see available views)
  [255]

HGPLAIN results in abort

  $ HGPLAIN=1 hg show bookmarks
  abort: must specify a template in plain mode
  (invoke with -T/--template to control output format)
  [255]

But not if a template is specified

  $ HGPLAIN=1 hg show bookmarks -T '{bookmark}\n'
  (no bookmarks set)

  $ cd ..

bookmarks view with no bookmarks prints empty message

  $ hg init books
  $ cd books
  $ touch f0
  $ hg -q commit -A -m initial

  $ hg show bookmarks
  (no bookmarks set)

bookmarks view shows bookmarks in an aligned table

  $ echo book1 > f0
  $ hg commit -m 'commit for book1'
  $ echo book2 > f0
  $ hg commit -m 'commit for book2'

  $ hg bookmark -r 1 book1
  $ hg bookmark a-longer-bookmark

  $ hg show bookmarks
  * a-longer-bookmark    7b57
    book1                b757

A custom bookmarks template works

  $ hg show bookmarks -T '{node} {bookmark} {active}\n'
  7b5709ab64cbc34da9b4367b64afff47f2c4ee83 a-longer-bookmark True
  b757f780b8ffd71267c6ccb32e0882d9d32a8cc0 book1 False

bookmarks JSON works

  $ hg show bookmarks -T json
  [
   {
    "active": true,
    "bookmark": "a-longer-bookmark",
    "longestbookmarklen": 17,
    "node": "7b5709ab64cbc34da9b4367b64afff47f2c4ee83",
    "nodelen": 4
   },
   {
    "active": false,
    "bookmark": "book1",
    "longestbookmarklen": 17,
    "node": "b757f780b8ffd71267c6ccb32e0882d9d32a8cc0",
    "nodelen": 4
   }
  ]

JSON works with no bookmarks

  $ hg book -d a-longer-bookmark
  $ hg book -d book1
  $ hg show bookmarks -T json
  [
  ]

commands.show.aliasprefix aliases values to `show <view>`

  $ hg --config commands.show.aliasprefix=s sbookmarks
  (no bookmarks set)

  $ hg --config commands.show.aliasprefix=sh shwork
  @  7b57 commit for book2
  o  b757 commit for book1
  o  ba59 initial

  $ hg --config commands.show.aliasprefix='s sh' swork
  @  7b57 commit for book2
  o  b757 commit for book1
  o  ba59 initial

  $ hg --config commands.show.aliasprefix='s sh' shwork
  @  7b57 commit for book2
  o  b757 commit for book1
  o  ba59 initial

The aliases don't appear in `hg config`

  $ hg --config commands.show.aliasprefix=s config alias
  [1]

Doesn't overwrite existing alias

  $ hg --config alias.swork='log -r .' --config commands.show.aliasprefix=s swork
  changeset:   2:7b5709ab64cb
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     commit for book2
  

  $ hg --config alias.swork='log -r .' --config commands.show.aliasprefix=s config alias
  alias.swork=log -r .

  $ cd ..