tests/test-largefiles-misc.t
author Gregory Szorc <gregory.szorc@gmail.com>
Thu, 02 Aug 2018 09:53:22 -0700
changeset 38886 66cf046ef60f
parent 37439 556984ae0005
child 39405 cb70501d8b71
permissions -rw-r--r--
changegroup: move revchunk() from narrow The monkeypatched revchunk for ellipses serving is a completely independent implementation. We model it as such in the changegroup code. revchunk() is now a simple proxy function. Again, I wish we had better APIs here. Especially since this narrow code is part of cg1packer and cg1packer can't be used with narrow. Class inheritance is wonky. And I will definitely be making changes to changegroup code for delta generation. As part of the code move, `node.nullrev` was replaced by `nullrev`. And a reference to `orig` was replaced to call `self._revchunknormal` directly. Differential Revision: https://phab.mercurial-scm.org/D4063

This file contains testcases that tend to be related to special cases or less
common commands affecting largefile.

Each sections should be independent of each others.

  $ USERCACHE="$TESTTMP/cache"; export USERCACHE
  $ mkdir "${USERCACHE}"
  $ cat >> $HGRCPATH <<EOF
  > [extensions]
  > largefiles=
  > purge=
  > rebase=
  > transplant=
  > [phases]
  > publish=False
  > [largefiles]
  > minsize=2
  > patterns=glob:**.dat
  > usercache=${USERCACHE}
  > [hooks]
  > precommit=sh -c "echo \\"Invoking status precommit hook\\"; hg status"
  > EOF



Test copies and moves from a directory other than root (issue3516)
=========================================================================

  $ hg init lf_cpmv
  $ cd lf_cpmv
  $ mkdir dira
  $ mkdir dira/dirb
  $ touch dira/dirb/largefile
  $ hg add --large dira/dirb/largefile
  $ hg commit -m "added"
  Invoking status precommit hook
  A dira/dirb/largefile
  $ cd dira
  $ hg cp dirb/largefile foo/largefile

TODO: Ideally, this should mention the largefile, not the standin
  $ hg log -T '{rev}\n' --stat 'set:clean()'
  0
   .hglf/dira/dirb/largefile |  1 +
   1 files changed, 1 insertions(+), 0 deletions(-)
  
  $ hg ci -m "deep copy"
  Invoking status precommit hook
  A dira/foo/largefile
  $ find . | sort
  .
  ./dirb
  ./dirb/largefile
  ./foo
  ./foo/largefile
  $ hg mv foo/largefile baz/largefile
  $ hg ci -m "moved"
  Invoking status precommit hook
  A dira/baz/largefile
  R dira/foo/largefile
  $ find . | sort
  .
  ./baz
  ./baz/largefile
  ./dirb
  ./dirb/largefile
  $ cd ..
  $ hg mv dira dirc
  moving .hglf/dira/baz/largefile to .hglf/dirc/baz/largefile
  moving .hglf/dira/dirb/largefile to .hglf/dirc/dirb/largefile
  $ find * | sort
  dirc
  dirc/baz
  dirc/baz/largefile
  dirc/dirb
  dirc/dirb/largefile

  $ hg clone -q . ../fetch
  $ hg --config extensions.fetch= fetch ../fetch
  abort: uncommitted changes
  [255]
  $ hg up -qC
  $ cd ..

Clone a local repository owned by another user
===================================================

#if unix-permissions

We have to simulate that here by setting $HOME and removing write permissions
  $ ORIGHOME="$HOME"
  $ mkdir alice
  $ HOME="`pwd`/alice"
  $ cd alice
  $ hg init pubrepo
  $ cd pubrepo
  $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
  $ hg add --large a-large-file
  $ hg commit -m "Add a large file"
  Invoking status precommit hook
  A a-large-file
  $ cd ..
  $ chmod -R a-w pubrepo
  $ cd ..
  $ mkdir bob
  $ HOME="`pwd`/bob"
  $ cd bob
  $ hg clone --pull ../alice/pubrepo pubrepo
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  new changesets 09a186cfa6da
  updating to branch default
  getting changed largefiles
  1 largefiles updated, 0 removed
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd ..
  $ chmod -R u+w alice/pubrepo
  $ HOME="$ORIGHOME"

#endif


Symlink to a large largefile should behave the same as a symlink to a normal file
=====================================================================================

#if symlink

  $ hg init largesymlink
  $ cd largesymlink
  $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
  $ hg add --large largefile
  $ hg commit -m "commit a large file"
  Invoking status precommit hook
  A largefile
  $ ln -s largefile largelink
  $ hg add largelink
  $ hg commit -m "commit a large symlink"
  Invoking status precommit hook
  A largelink
  $ rm -f largelink
  $ hg up >/dev/null
  $ test -f largelink
  [1]
  $ test -L largelink
  [1]
  $ rm -f largelink # make next part of the test independent of the previous
  $ hg up -C >/dev/null
  $ test -f largelink
  $ test -L largelink
  $ cd ..

#endif


test for pattern matching on 'hg status':
==============================================


to boost performance, largefiles checks whether specified patterns are
related to largefiles in working directory (NOT to STANDIN) or not.

  $ hg init statusmatch
  $ cd statusmatch

  $ mkdir -p a/b/c/d
  $ echo normal > a/b/c/d/e.normal.txt
  $ hg add a/b/c/d/e.normal.txt
  $ echo large > a/b/c/d/e.large.txt
  $ hg add --large a/b/c/d/e.large.txt
  $ mkdir -p a/b/c/x
  $ echo normal > a/b/c/x/y.normal.txt
  $ hg add a/b/c/x/y.normal.txt
  $ hg commit -m 'add files'
  Invoking status precommit hook
  A a/b/c/d/e.large.txt
  A a/b/c/d/e.normal.txt
  A a/b/c/x/y.normal.txt

(1) no pattern: no performance boost
  $ hg status -A
  C a/b/c/d/e.large.txt
  C a/b/c/d/e.normal.txt
  C a/b/c/x/y.normal.txt

(2) pattern not related to largefiles: performance boost
  $ hg status -A a/b/c/x
  C a/b/c/x/y.normal.txt

(3) pattern related to largefiles: no performance boost
  $ hg status -A a/b/c/d
  C a/b/c/d/e.large.txt
  C a/b/c/d/e.normal.txt

(4) pattern related to STANDIN (not to largefiles): performance boost
  $ hg status -A .hglf/a
  C .hglf/a/b/c/d/e.large.txt

(5) mixed case: no performance boost
  $ hg status -A a/b/c/x a/b/c/d
  C a/b/c/d/e.large.txt
  C a/b/c/d/e.normal.txt
  C a/b/c/x/y.normal.txt

verify that largefiles doesn't break filesets

  $ hg log --rev . --exclude "set:binary()"
  changeset:   0:41bd42f10efa
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     add files
  
sharing a largefile repo automatically enables largefiles on the share

  $ hg share --config extensions.share= . ../shared_lfrepo
  updating working directory
  getting changed largefiles
  1 largefiles updated, 0 removed
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cat ../shared_lfrepo/.hg/hgrc
  
  [extensions]
  largefiles=

verify that large files in subrepos handled properly
  $ hg init subrepo
  $ echo "subrepo = subrepo" > .hgsub
  $ hg add .hgsub
  $ hg ci -m "add subrepo"
  Invoking status precommit hook
  A .hgsub
  ? .hgsubstate
  $ echo "rev 1" > subrepo/large.txt
  $ hg add --large subrepo/large.txt
  $ hg sum
  parent: 1:8ee150ea2e9c tip
   add subrepo
  branch: default
  commit: 1 subrepos
  update: (current)
  phases: 2 draft
  $ hg st
  $ hg st -S
  A subrepo/large.txt
  $ hg ci -S -m "commit top repo"
  committing subrepository subrepo
  Invoking status precommit hook
  A large.txt
  Invoking status precommit hook
  M .hgsubstate
# No differences
  $ hg st -S
  $ hg sum
  parent: 2:ce4cd0c527a6 tip
   commit top repo
  branch: default
  commit: (clean)
  update: (current)
  phases: 3 draft
  $ echo "rev 2" > subrepo/large.txt
  $ hg st -S
  M subrepo/large.txt
  $ hg sum
  parent: 2:ce4cd0c527a6 tip
   commit top repo
  branch: default
  commit: 1 subrepos
  update: (current)
  phases: 3 draft
  $ hg ci -m "this commit should fail without -S"
  abort: uncommitted changes in subrepository "subrepo"
  (use --subrepos for recursive commit)
  [255]

Add a normal file to the subrepo, then test archiving

  $ echo 'normal file' > subrepo/normal.txt
  $ touch large.dat
  $ mv subrepo/large.txt subrepo/renamed-large.txt
  $ hg addremove -S --dry-run
  adding large.dat as a largefile
  removing subrepo/large.txt
  adding subrepo/normal.txt
  adding subrepo/renamed-large.txt
  $ hg status -S
  ! subrepo/large.txt
  ? large.dat
  ? subrepo/normal.txt
  ? subrepo/renamed-large.txt

  $ hg addremove --dry-run subrepo
  removing subrepo/large.txt
  adding subrepo/normal.txt
  adding subrepo/renamed-large.txt
  $ hg status -S
  ! subrepo/large.txt
  ? large.dat
  ? subrepo/normal.txt
  ? subrepo/renamed-large.txt
  $ cd ..

  $ hg -R statusmatch addremove --dry-run statusmatch/subrepo
  removing statusmatch/subrepo/large.txt
  adding statusmatch/subrepo/normal.txt
  adding statusmatch/subrepo/renamed-large.txt
  $ hg -R statusmatch status -S
  ! subrepo/large.txt
  ? large.dat
  ? subrepo/normal.txt
  ? subrepo/renamed-large.txt

  $ hg -R statusmatch addremove --dry-run -S
  adding large.dat as a largefile
  removing subrepo/large.txt
  adding subrepo/normal.txt
  adding subrepo/renamed-large.txt
  $ cd statusmatch

  $ mv subrepo/renamed-large.txt subrepo/large.txt
  $ hg addremove subrepo
  adding subrepo/normal.txt
  $ hg forget subrepo/normal.txt

  $ hg addremove -S
  adding large.dat as a largefile
  adding subrepo/normal.txt
  $ rm large.dat

  $ hg addremove subrepo
  $ hg addremove -S
  removing large.dat

Lock in subrepo, otherwise the change isn't archived

  $ hg ci -S -m "add normal file to top level"
  committing subrepository subrepo
  Invoking status precommit hook
  M large.txt
  A normal.txt
  Invoking status precommit hook
  M .hgsubstate
  $ hg archive -S ../lf_subrepo_archive
  $ find ../lf_subrepo_archive | sort
  ../lf_subrepo_archive
  ../lf_subrepo_archive/.hg_archival.txt
  ../lf_subrepo_archive/.hgsub
  ../lf_subrepo_archive/.hgsubstate
  ../lf_subrepo_archive/a
  ../lf_subrepo_archive/a/b
  ../lf_subrepo_archive/a/b/c
  ../lf_subrepo_archive/a/b/c/d
  ../lf_subrepo_archive/a/b/c/d/e.large.txt
  ../lf_subrepo_archive/a/b/c/d/e.normal.txt
  ../lf_subrepo_archive/a/b/c/x
  ../lf_subrepo_archive/a/b/c/x/y.normal.txt
  ../lf_subrepo_archive/subrepo
  ../lf_subrepo_archive/subrepo/large.txt
  ../lf_subrepo_archive/subrepo/normal.txt
  $ cat ../lf_subrepo_archive/.hg_archival.txt
  repo: 41bd42f10efa43698cc02052ea0977771cba506d
  node: d56a95e6522858bc08a724c4fe2bdee066d1c30b
  branch: default
  latesttag: null
  latesttagdistance: 4
  changessincelatesttag: 4

Test update with subrepos.

  $ hg update 0
  getting changed largefiles
  0 largefiles updated, 1 removed
  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
  $ hg status -S
  $ hg update tip
  getting changed largefiles
  1 largefiles updated, 0 removed
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg status -S
# modify a large file
  $ echo "modified" > subrepo/large.txt
  $ hg st -S
  M subrepo/large.txt
# update -C should revert the change.
  $ hg update -C
  getting changed largefiles
  1 largefiles updated, 0 removed
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg status -S

Forget doesn't change the content of the file
  $ echo 'pre-forget content' > subrepo/large.txt
  $ hg forget -v subrepo/large.txt
  removing subrepo/large.txt
  $ cat subrepo/large.txt
  pre-forget content

Test reverting a forgotten file
  $ hg revert -R subrepo subrepo/large.txt
  $ hg status -SA subrepo/large.txt
  C subrepo/large.txt

  $ hg rm -v subrepo/large.txt
  removing subrepo/large.txt
  $ hg revert -R subrepo subrepo/large.txt
  $ rm subrepo/large.txt
  $ hg addremove -S
  removing subrepo/large.txt
  $ hg st -S
  R subrepo/large.txt

Test archiving a revision that references a subrepo that is not yet
cloned (see test-subrepo-recursion.t):

  $ hg clone -U . ../empty
  $ cd ../empty
  $ hg archive --subrepos -r tip ../archive.tar.gz
  cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo
  $ cd ..






Test addremove, forget and others
==============================================

Test that addremove picks up largefiles prior to the initial commit (issue3541)

  $ hg init addrm2
  $ cd addrm2
  $ touch large.dat
  $ touch large2.dat
  $ touch normal
  $ hg add --large large.dat
  $ hg addremove -v
  adding large2.dat as a largefile
  adding normal

Test that forgetting all largefiles reverts to islfilesrepo() == False
(addremove will add *.dat as normal files now)
  $ hg forget large.dat
  $ hg forget large2.dat
  $ hg addremove -v
  adding large.dat
  adding large2.dat

Test commit's addremove option prior to the first commit
  $ hg forget large.dat
  $ hg forget large2.dat
  $ hg add --large large.dat
  $ hg ci -Am "commit"
  adding large2.dat as a largefile
  Invoking status precommit hook
  A large.dat
  A large2.dat
  A normal
  $ find .hglf | sort
  .hglf
  .hglf/large.dat
  .hglf/large2.dat

Test actions on largefiles using relative paths from subdir

  $ mkdir sub
  $ cd sub
  $ echo anotherlarge > anotherlarge
  $ hg add --large anotherlarge
  $ hg st
  A sub/anotherlarge
  $ hg st anotherlarge
  A anotherlarge
  $ hg commit -m anotherlarge anotherlarge
  Invoking status precommit hook
  A sub/anotherlarge
  $ hg log anotherlarge
  changeset:   1:9627a577c5e9
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     anotherlarge
  
  $ hg --debug log -T '{rev}: {desc}\n' ../sub/anotherlarge
  updated patterns: ../.hglf/sub/../sub/anotherlarge, ../sub/anotherlarge
  1: anotherlarge

  $ hg log -G anotherlarge
  @  changeset:   1:9627a577c5e9
  |  tag:         tip
  ~  user:        test
     date:        Thu Jan 01 00:00:00 1970 +0000
     summary:     anotherlarge
  

  $ hg log glob:another*
  changeset:   1:9627a577c5e9
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     anotherlarge
  
  $ hg --debug log -T '{rev}: {desc}\n' -G glob:another*
  updated patterns: glob:../.hglf/sub/another*, glob:another*
  @  1: anotherlarge
  |
  ~

#if no-msys
  $ hg --debug log -T '{rev}: {desc}\n' 'glob:../.hglf/sub/another*' # no-msys
  updated patterns: glob:../.hglf/sub/another*
  1: anotherlarge

  $ hg --debug log -G -T '{rev}: {desc}\n' 'glob:../.hglf/sub/another*' # no-msys
  updated patterns: glob:../.hglf/sub/another*
  @  1: anotherlarge
  |
  ~
#endif

  $ echo more >> anotherlarge
  $ hg st .
  M anotherlarge
  $ hg cat anotherlarge
  anotherlarge
  $ hg revert anotherlarge
  $ hg st
  ? sub/anotherlarge.orig

Test orig files go where we want them
  $ echo moremore >> anotherlarge
  $ hg revert anotherlarge -v --config 'ui.origbackuppath=.hg/origbackups'
  creating directory: $TESTTMP/addrm2/.hg/origbackups/.hglf/sub
  saving current version of ../.hglf/sub/anotherlarge as $TESTTMP/addrm2/.hg/origbackups/.hglf/sub/anotherlarge
  reverting ../.hglf/sub/anotherlarge
  creating directory: $TESTTMP/addrm2/.hg/origbackups/sub
  found 90c622cf65cebe75c5842f9136c459333faf392e in store
  found 90c622cf65cebe75c5842f9136c459333faf392e in store
  $ ls ../.hg/origbackups/sub
  anotherlarge
  $ cd ..

Test glob logging from the root dir
  $ hg log glob:**another*
  changeset:   1:9627a577c5e9
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     anotherlarge
  
  $ hg log -G glob:**another*
  @  changeset:   1:9627a577c5e9
  |  tag:         tip
  ~  user:        test
     date:        Thu Jan 01 00:00:00 1970 +0000
     summary:     anotherlarge
  

  $ cd ..

Log from outer space
  $ hg --debug log -R addrm2 -T '{rev}: {desc}\n' 'addrm2/sub/anotherlarge'
  updated patterns: addrm2/.hglf/sub/anotherlarge, addrm2/sub/anotherlarge
  1: anotherlarge
  $ hg --debug log -R addrm2 -T '{rev}: {desc}\n' 'addrm2/.hglf/sub/anotherlarge'
  updated patterns: addrm2/.hglf/sub/anotherlarge
  1: anotherlarge


Check error message while exchange
=========================================================

issue3651: summary/outgoing with largefiles shows "no remote repo"
unexpectedly

  $ mkdir issue3651
  $ cd issue3651

  $ hg init src
  $ echo a > src/a
  $ hg -R src add --large src/a
  $ hg -R src commit -m '#0'
  Invoking status precommit hook
  A a

check messages when no remote repository is specified:
"no remote repo" route for "hg outgoing --large" is not tested here,
because it can't be reproduced easily.

  $ hg init clone1
  $ hg -R clone1 -q pull src
  $ hg -R clone1 -q update
  $ hg -R clone1 paths | grep default
  [1]

  $ hg -R clone1 summary --large
  parent: 0:fc0bd45326d3 tip
   #0
  branch: default
  commit: (clean)
  update: (current)
  phases: 1 draft
  largefiles: (no remote repo)

check messages when there is no files to upload:

  $ hg -q clone src clone2
  $ hg -R clone2 paths | grep default
  default = $TESTTMP/issue3651/src

  $ hg -R clone2 summary --large
  parent: 0:fc0bd45326d3 tip
   #0
  branch: default
  commit: (clean)
  update: (current)
  phases: 1 draft
  largefiles: (no files to upload)
  $ hg -R clone2 outgoing --large
  comparing with $TESTTMP/issue3651/src
  searching for changes
  no changes found
  largefiles: no files to upload
  [1]

  $ hg -R clone2 outgoing --large --graph --template "{rev}"
  comparing with $TESTTMP/issue3651/src
  searching for changes
  no changes found
  largefiles: no files to upload

check messages when there are files to upload:

  $ echo b > clone2/b
  $ hg -R clone2 add --large clone2/b
  $ hg -R clone2 commit -m '#1'
  Invoking status precommit hook
  A b
  $ hg -R clone2 summary --large
  parent: 1:1acbe71ce432 tip
   #1
  branch: default
  commit: (clean)
  update: (current)
  phases: 2 draft
  largefiles: 1 entities for 1 files to upload
  $ hg -R clone2 outgoing --large
  comparing with $TESTTMP/issue3651/src
  searching for changes
  changeset:   1:1acbe71ce432
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     #1
  
  largefiles to upload (1 entities):
  b
  
  $ hg -R clone2 outgoing --large --graph --template "{rev}"
  comparing with $TESTTMP/issue3651/src
  searching for changes
  @  1
  
  largefiles to upload (1 entities):
  b
  

  $ cp clone2/b clone2/b1
  $ cp clone2/b clone2/b2
  $ hg -R clone2 add --large clone2/b1 clone2/b2
  $ hg -R clone2 commit -m '#2: add largefiles referring same entity'
  Invoking status precommit hook
  A b1
  A b2
  $ hg -R clone2 summary --large
  parent: 2:6095d0695d70 tip
   #2: add largefiles referring same entity
  branch: default
  commit: (clean)
  update: (current)
  phases: 3 draft
  largefiles: 1 entities for 3 files to upload
  $ hg -R clone2 outgoing --large -T "{rev}:{node|short}\n"
  comparing with $TESTTMP/issue3651/src
  searching for changes
  1:1acbe71ce432
  2:6095d0695d70
  largefiles to upload (1 entities):
  b
  b1
  b2
  
  $ hg -R clone2 cat -r 1 clone2/.hglf/b
  89e6c98d92887913cadf06b2adb97f26cde4849b
  $ hg -R clone2 outgoing --large -T "{rev}:{node|short}\n" --debug --config progress.debug=true
  comparing with $TESTTMP/issue3651/src
  query 1; heads
  searching for changes
  all remote heads known locally
  1:1acbe71ce432
  2:6095d0695d70
  finding outgoing largefiles: 0/2 revisions (0.00%)
  finding outgoing largefiles: 1/2 revisions (50.00%)
  largefiles to upload (1 entities):
  b
      89e6c98d92887913cadf06b2adb97f26cde4849b
  b1
      89e6c98d92887913cadf06b2adb97f26cde4849b
  b2
      89e6c98d92887913cadf06b2adb97f26cde4849b
  

  $ echo bbb > clone2/b
  $ hg -R clone2 commit -m '#3: add new largefile entity as existing file'
  Invoking status precommit hook
  M b
  $ echo bbbb > clone2/b
  $ hg -R clone2 commit -m '#4: add new largefile entity as existing file'
  Invoking status precommit hook
  M b
  $ cp clone2/b1 clone2/b
  $ hg -R clone2 commit -m '#5: refer existing largefile entity again'
  Invoking status precommit hook
  M b
  $ hg -R clone2 summary --large
  parent: 5:036794ea641c tip
   #5: refer existing largefile entity again
  branch: default
  commit: (clean)
  update: (current)
  phases: 6 draft
  largefiles: 3 entities for 3 files to upload
  $ hg -R clone2 outgoing --large -T "{rev}:{node|short}\n"
  comparing with $TESTTMP/issue3651/src
  searching for changes
  1:1acbe71ce432
  2:6095d0695d70
  3:7983dce246cc
  4:233f12ada4ae
  5:036794ea641c
  largefiles to upload (3 entities):
  b
  b1
  b2
  
  $ hg -R clone2 cat -r 3 clone2/.hglf/b
  c801c9cfe94400963fcb683246217d5db77f9a9a
  $ hg -R clone2 cat -r 4 clone2/.hglf/b
  13f9ed0898e315bf59dc2973fec52037b6f441a2
  $ hg -R clone2 outgoing --large -T "{rev}:{node|short}\n" --debug --config progress.debug=true
  comparing with $TESTTMP/issue3651/src
  query 1; heads
  searching for changes
  all remote heads known locally
  1:1acbe71ce432
  2:6095d0695d70
  3:7983dce246cc
  4:233f12ada4ae
  5:036794ea641c
  finding outgoing largefiles: 0/5 revisions (0.00%)
  finding outgoing largefiles: 1/5 revisions (20.00%)
  finding outgoing largefiles: 2/5 revisions (40.00%)
  finding outgoing largefiles: 3/5 revisions (60.00%)
  finding outgoing largefiles: 4/5 revisions (80.00%)
  largefiles to upload (3 entities):
  b
      13f9ed0898e315bf59dc2973fec52037b6f441a2
      89e6c98d92887913cadf06b2adb97f26cde4849b
      c801c9cfe94400963fcb683246217d5db77f9a9a
  b1
      89e6c98d92887913cadf06b2adb97f26cde4849b
  b2
      89e6c98d92887913cadf06b2adb97f26cde4849b
  

Pushing revision #1 causes uploading entity 89e6c98d9288, which is
shared also by largefiles b1, b2 in revision #2 and b in revision #5.

Then, entity 89e6c98d9288 is not treated as "outgoing entity" at "hg
summary" and "hg outgoing", even though files in outgoing revision #2
and #5 refer it.

  $ hg -R clone2 push -r 1 -q
  $ hg -R clone2 summary --large
  parent: 5:036794ea641c tip
   #5: refer existing largefile entity again
  branch: default
  commit: (clean)
  update: (current)
  phases: 6 draft
  largefiles: 2 entities for 1 files to upload
  $ hg -R clone2 outgoing --large -T "{rev}:{node|short}\n"
  comparing with $TESTTMP/issue3651/src
  searching for changes
  2:6095d0695d70
  3:7983dce246cc
  4:233f12ada4ae
  5:036794ea641c
  largefiles to upload (2 entities):
  b
  
  $ hg -R clone2 outgoing --large -T "{rev}:{node|short}\n" --debug --config progress.debug=true
  comparing with $TESTTMP/issue3651/src
  query 1; heads
  searching for changes
  all remote heads known locally
  2:6095d0695d70
  3:7983dce246cc
  4:233f12ada4ae
  5:036794ea641c
  finding outgoing largefiles: 0/4 revisions (0.00%)
  finding outgoing largefiles: 1/4 revisions (25.00%)
  finding outgoing largefiles: 2/4 revisions (50.00%)
  finding outgoing largefiles: 3/4 revisions (75.00%)
  largefiles to upload (2 entities):
  b
      13f9ed0898e315bf59dc2973fec52037b6f441a2
      c801c9cfe94400963fcb683246217d5db77f9a9a
  

  $ cd ..

merge action 'd' for 'local renamed directory to d2/g' which has no filename
==================================================================================

  $ hg init merge-action
  $ cd merge-action
  $ touch l
  $ hg add --large l
  $ mkdir d1
  $ touch d1/f
  $ hg ci -Aqm0
  Invoking status precommit hook
  A d1/f
  A l
  $ echo > d1/f
  $ touch d1/g
  $ hg ci -Aqm1
  Invoking status precommit hook
  M d1/f
  A d1/g
  $ hg up -qr0
  $ hg mv d1 d2
  moving d1/f to d2/f
  $ hg ci -qm2
  Invoking status precommit hook
  A d2/f
  R d1/f
  $ hg merge
  merging d2/f and d1/f to d2/f
  1 files updated, 1 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ cd ..


Merge conflicts:
=====================

  $ hg init merge
  $ cd merge
  $ echo 0 > f-different
  $ echo 0 > f-same
  $ echo 0 > f-unchanged-1
  $ echo 0 > f-unchanged-2
  $ hg add --large *
  $ hg ci -m0
  Invoking status precommit hook
  A f-different
  A f-same
  A f-unchanged-1
  A f-unchanged-2
  $ echo tmp1 > f-unchanged-1
  $ echo tmp1 > f-unchanged-2
  $ echo tmp1 > f-same
  $ hg ci -m1
  Invoking status precommit hook
  M f-same
  M f-unchanged-1
  M f-unchanged-2
  $ echo 2 > f-different
  $ echo 0 > f-unchanged-1
  $ echo 1 > f-unchanged-2
  $ echo 1 > f-same
  $ hg ci -m2
  Invoking status precommit hook
  M f-different
  M f-same
  M f-unchanged-1
  M f-unchanged-2
  $ hg up -qr0
  $ echo tmp2 > f-unchanged-1
  $ echo tmp2 > f-unchanged-2
  $ echo tmp2 > f-same
  $ hg ci -m3
  Invoking status precommit hook
  M f-same
  M f-unchanged-1
  M f-unchanged-2
  created new head
  $ echo 1 > f-different
  $ echo 1 > f-unchanged-1
  $ echo 0 > f-unchanged-2
  $ echo 1 > f-same
  $ hg ci -m4
  Invoking status precommit hook
  M f-different
  M f-same
  M f-unchanged-1
  M f-unchanged-2
  $ hg merge
  largefile f-different has a merge conflict
  ancestor was 09d2af8dd22201dd8d48e5dcfcaed281ff9422c7
  keep (l)ocal e5fa44f2b31c1fb553b6021e7360d07d5d91ff5e or
  take (o)ther 7448d8798a4380162d4b56f9b452e2f6f9e24e7a? l
  getting changed largefiles
  1 largefiles updated, 0 removed
  0 files updated, 4 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ cat f-different
  1
  $ cat f-same
  1
  $ cat f-unchanged-1
  1
  $ cat f-unchanged-2
  1
  $ cd ..

Test largefile insulation (do not enabled a side effect
========================================================

Check whether "largefiles" feature is supported only in repositories
enabling largefiles extension.

  $ mkdir individualenabling
  $ cd individualenabling

  $ hg init enabledlocally
  $ echo large > enabledlocally/large
  $ hg -R enabledlocally add --large enabledlocally/large
  $ hg -R enabledlocally commit -m '#0'
  Invoking status precommit hook
  A large

  $ hg init notenabledlocally
  $ echo large > notenabledlocally/large
  $ hg -R notenabledlocally add --large notenabledlocally/large
  $ hg -R notenabledlocally commit -m '#0'
  Invoking status precommit hook
  A large

  $ cat >> $HGRCPATH <<EOF
  > [extensions]
  > # disable globally
  > largefiles=!
  > EOF
  $ cat >> enabledlocally/.hg/hgrc <<EOF
  > [extensions]
  > # enable locally
  > largefiles=
  > EOF
  $ hg -R enabledlocally root
  $TESTTMP/individualenabling/enabledlocally
  $ hg -R notenabledlocally root
  abort: repository requires features unknown to this Mercurial: largefiles!
  (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
  [255]

  $ hg init push-dst
  $ hg -R enabledlocally push push-dst
  pushing to push-dst
  abort: required features are not supported in the destination: largefiles
  [255]

  $ hg init pull-src
  $ hg -R pull-src pull enabledlocally
  pulling from enabledlocally
  abort: required features are not supported in the destination: largefiles
  [255]

  $ hg clone enabledlocally clone-dst
  abort: repository requires features unknown to this Mercurial: largefiles!
  (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
  [255]
  $ test -d clone-dst
  [1]
  $ hg clone --pull enabledlocally clone-pull-dst
  abort: required features are not supported in the destination: largefiles
  [255]
  $ test -d clone-pull-dst
  [1]

#if serve

Test largefiles specific peer setup, when largefiles is enabled
locally (issue4109)

  $ hg showconfig extensions | grep largefiles
  extensions.largefiles=!
  $ mkdir -p $TESTTMP/individualenabling/usercache

  $ hg serve -R enabledlocally -d -p $HGPORT --pid-file hg.pid
  $ cat hg.pid >> $DAEMON_PIDS

  $ hg init pull-dst
  $ cat > pull-dst/.hg/hgrc <<EOF
  > [extensions]
  > # enable locally
  > largefiles=
  > [largefiles]
  > # ignore system cache to force largefiles specific wire proto access
  > usercache=$TESTTMP/individualenabling/usercache
  > EOF
  $ hg -R pull-dst -q pull -u http://localhost:$HGPORT

  $ killdaemons.py
#endif

Test overridden functions work correctly even for repos disabling
largefiles (issue4547)

  $ hg showconfig extensions | grep largefiles
  extensions.largefiles=!

(test updating implied by clone)

  $ hg init enabled-but-no-largefiles
  $ echo normal1 > enabled-but-no-largefiles/normal1
  $ hg -R enabled-but-no-largefiles add enabled-but-no-largefiles/normal1
  $ hg -R enabled-but-no-largefiles commit -m '#0@enabled-but-no-largefiles'
  Invoking status precommit hook
  A normal1
  $ cat >> enabled-but-no-largefiles/.hg/hgrc <<EOF
  > [extensions]
  > # enable locally
  > largefiles=
  > EOF
  $ hg clone -q enabled-but-no-largefiles no-largefiles

  $ echo normal2 > enabled-but-no-largefiles/normal2
  $ hg -R enabled-but-no-largefiles add enabled-but-no-largefiles/normal2
  $ hg -R enabled-but-no-largefiles commit -m '#1@enabled-but-no-largefiles'
  Invoking status precommit hook
  A normal2

  $ echo normal3 > no-largefiles/normal3
  $ hg -R no-largefiles add no-largefiles/normal3
  $ hg -R no-largefiles commit -m '#1@no-largefiles'
  Invoking status precommit hook
  A normal3

  $ hg -R no-largefiles -q pull --rebase
  Invoking status precommit hook
  A normal3

(test reverting)

  $ hg init subrepo-root
  $ cat >> subrepo-root/.hg/hgrc <<EOF
  > [extensions]
  > # enable locally
  > largefiles=
  > EOF
  $ echo large > subrepo-root/large
  $ mkdir -p subrepo-root/dir/subdir
  $ echo large2 > subrepo-root/dir/subdir/large.bin
  $ hg -R subrepo-root add --large subrepo-root/large subrepo-root/dir/subdir/large.bin
  $ hg clone -q no-largefiles subrepo-root/no-largefiles
  $ cat > subrepo-root/.hgsub <<EOF
  > no-largefiles = no-largefiles
  > EOF
  $ hg -R subrepo-root add subrepo-root/.hgsub
  $ hg -R subrepo-root commit -m '#0'
  Invoking status precommit hook
  A .hgsub
  A dir/subdir/large.bin
  A large
  ? .hgsubstate
  $ echo dirty >> subrepo-root/large
  $ echo dirty >> subrepo-root/no-largefiles/normal1
  $ hg -R subrepo-root status -S
  M large
  M no-largefiles/normal1
  $ hg -R subrepo-root extdiff -p echo -S --config extensions.extdiff=
  "*\\no-largefiles\\normal1" "*\\no-largefiles\\normal1" (glob) (windows !)
  */no-largefiles/normal1 */no-largefiles/normal1 (glob) (no-windows !)
  [1]
  $ hg -R subrepo-root revert --all
  reverting subrepo-root/.hglf/large
  reverting subrepo no-largefiles
  reverting subrepo-root/no-largefiles/normal1

Move (and then undo) a directory move with only largefiles.

  $ cd subrepo-root
  $ $PYTHON $TESTDIR/list-tree.py .hglf dir* large*
  .hglf/
  .hglf/dir/
  .hglf/dir/subdir/
  .hglf/dir/subdir/large.bin
  .hglf/large
  dir/
  dir/subdir/
  dir/subdir/large.bin
  large
  large.orig

  $ hg mv dir/subdir dir/subdir2
  moving .hglf/dir/subdir/large.bin to .hglf/dir/subdir2/large.bin

  $ $PYTHON $TESTDIR/list-tree.py .hglf dir* large*
  .hglf/
  .hglf/dir/
  .hglf/dir/subdir2/
  .hglf/dir/subdir2/large.bin
  .hglf/large
  dir/
  dir/subdir2/
  dir/subdir2/large.bin
  large
  large.orig
  $ hg status -C
  A dir/subdir2/large.bin
    dir/subdir/large.bin
  R dir/subdir/large.bin
  ? large.orig

  $ echo 'modified' > dir/subdir2/large.bin
  $ hg status -C
  A dir/subdir2/large.bin
    dir/subdir/large.bin
  R dir/subdir/large.bin
  ? large.orig

  $ hg revert --all
  undeleting .hglf/dir/subdir/large.bin
  forgetting .hglf/dir/subdir2/large.bin
  reverting subrepo no-largefiles

  $ hg status -C
  ? dir/subdir2/large.bin
  ? large.orig

The content of the forgotten file shouldn't be clobbered

  $ cat dir/subdir2/large.bin
  modified

The standin for subdir2 should be deleted, not just dropped

  $ $PYTHON $TESTDIR/list-tree.py .hglf dir* large*
  .hglf/
  .hglf/dir/
  .hglf/dir/subdir/
  .hglf/dir/subdir/large.bin
  .hglf/large
  dir/
  dir/subdir/
  dir/subdir/large.bin
  dir/subdir2/
  dir/subdir2/large.bin
  large
  large.orig

  $ rm -r dir/subdir2

'subdir' should not be in the destination.  It would be if the subdir2 directory
existed under .hglf/.
  $ hg mv dir/subdir dir/subdir2
  moving .hglf/dir/subdir/large.bin to .hglf/dir/subdir2/large.bin

  $ hg status -C
  A dir/subdir2/large.bin
    dir/subdir/large.bin
  R dir/subdir/large.bin
  ? large.orig

  $ $PYTHON $TESTDIR/list-tree.py .hglf dir* large*
  .hglf/
  .hglf/dir/
  .hglf/dir/subdir2/
  .hglf/dir/subdir2/large.bin
  .hglf/large
  dir/
  dir/subdir2/
  dir/subdir2/large.bin
  large
  large.orig

Start from scratch, and rename something other than the final path component.

  $ hg up -qC .
  $ hg --config extensions.purge= purge

  $ hg mv dir/subdir dir2/subdir
  moving .hglf/dir/subdir/large.bin to .hglf/dir2/subdir/large.bin

  $ hg status -C
  A dir2/subdir/large.bin
    dir/subdir/large.bin
  R dir/subdir/large.bin

  $ $PYTHON $TESTDIR/list-tree.py .hglf dir* large*
  .hglf/
  .hglf/dir2/
  .hglf/dir2/subdir/
  .hglf/dir2/subdir/large.bin
  .hglf/large
  dir2/
  dir2/subdir/
  dir2/subdir/large.bin
  large

  $ hg revert --all
  undeleting .hglf/dir/subdir/large.bin
  forgetting .hglf/dir2/subdir/large.bin
  reverting subrepo no-largefiles

  $ hg status -C
  ? dir2/subdir/large.bin

  $ $PYTHON $TESTDIR/list-tree.py .hglf dir* large*
  .hglf/
  .hglf/dir/
  .hglf/dir/subdir/
  .hglf/dir/subdir/large.bin
  .hglf/large
  dir/
  dir/subdir/
  dir/subdir/large.bin
  dir2/
  dir2/subdir/
  dir2/subdir/large.bin
  large

  $ cd ../..

Test "pull --rebase" when rebase is enabled before largefiles (issue3861)
=========================================================================

  $ hg showconfig extensions | grep largefiles
  extensions.largefiles=!

  $ mkdir issue3861
  $ cd issue3861
  $ hg init src
  $ hg clone -q src dst
  $ echo a > src/a
  $ hg -R src commit -Aqm "#0"
  Invoking status precommit hook
  A a

  $ cat >> dst/.hg/hgrc <<EOF
  > [extensions]
  > largefiles=
  > EOF
  $ hg -R dst pull --rebase
  pulling from $TESTTMP/issue3861/src
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  new changesets bf5e395ced2c
  nothing to rebase - updating instead
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ cd ..