view tests/test-url-download.t @ 46706:93e9f448273c

rhg: Add support for automatic fallback to Python `rhg` is a command-line application that can do a small subset of what `hg` can. It is written entirely in Rust, which avoids the cost of starting a Python interpreter and importing many Python modules. In a script that runs many `hg` commands, this cost can add up. However making users decide when to use `rhg` instead of `hg` is not practical as we want the subset of supported functionality to grow over time. Instead we introduce "fallback" behavior where, when `rhg` encounters something (a sub-command, a repository format, …) that is not implemented in Rust-only, it does nothing but silently start a subprocess of Python-based `hg` running the same command. That way `rhg` becomes a drop-in replacement for `hg` that sometimes goes faster. Whether Python is used should be an implementation detail not apparent to users (other than through speed). A new `fallback` value is added to the previously introduced `rhg.on-unsupported` configuration key. When in this mode, the new `rhg.fallback-executable` config is determine what command to use to run a Python-based `hg`. The previous `rhg.on-unsupported = abort-silent` configuration was designed to let a wrapper script call `rhg` and then fall back to `hg` based on the exit code. This is still available, but having fallback behavior built-in in rhg might be easier for users instead of leaving that script "as an exercise for the reader". Using a subprocess like this is not idea, especially when `rhg` is to be installed in `$PATH` as `hg`, since the other `hg.py` executable needs to still be available… somewhere. Eventually this could be replaced by using PyOxidizer to a have a single executable that embeds a Python interpreter, but only starts it when needed. Differential Revision: https://phab.mercurial-scm.org/D10093
author Simon Sapin <simon.sapin@octobus.net>
date Mon, 01 Mar 2021 20:36:06 +0100
parents 8214c71589f6
children 2d0daf9c9d5d
line wrap: on
line source

#require serve

  $ hg init server
  $ hg serve -R server -p $HGPORT -d --pid-file=hg1.pid -E ../error.log
  $ cat hg1.pid >> $DAEMON_PIDS

Check basic fetching

  $ hg debugdownload "http://localhost:$HGPORT/?cmd=lookup&key=tip"
  1 0000000000000000000000000000000000000000
  $ hg debugdownload  -o null.txt "http://localhost:$HGPORT/?cmd=lookup&key=null"
  $ cat null.txt
  1 0000000000000000000000000000000000000000

Check the request is made from the usual Mercurial logic
(rev details, give different content if the request has a Mercurial user agent)

  $ get-with-headers.py --headeronly "localhost:$HGPORT" "rev/tip" content-type
  200 Script output follows
  content-type: text/html; charset=ascii
  $ hg debugdownload "http://localhost:$HGPORT/rev/tip"
  
  # HG changeset patch
  # User 
  # Date 0 0
  # Node ID 0000000000000000000000000000000000000000
  
  
  
  

Check other kind of compatible url

  $ hg debugdownload ./null.txt
  1 0000000000000000000000000000000000000000

  $ cat ../error.log

Test largefile URL
------------------

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

  $ killdaemons.py
  $ rm -f error.log hg1.pid
  $ hg serve -R server -p $HGPORT -d --pid-file=hg1.pid -E error.log
  $ cat hg1.pid >> $DAEMON_PIDS

  $ hg -R server debuglfput null.txt
  a57b57b39ee4dc3da1e03526596007f480ecdbe8

  $ hg --traceback debugdownload "largefile://a57b57b39ee4dc3da1e03526596007f480ecdbe8" --config paths.default=http://localhost:$HGPORT/
  1 0000000000000000000000000000000000000000

from within a repository

  $ hg clone http://localhost:$HGPORT/ client
  no changes found
  updating to branch default
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ cd client
  $ hg path
  default = http://localhost:$HGPORT/
  $ hg debugdownload "largefile://a57b57b39ee4dc3da1e03526596007f480ecdbe8"
  1 0000000000000000000000000000000000000000
  $ cd ..

  $ cat error.log