view tests/test-eol-update.t @ 51547:8e2a68e10f5c

stream: in v3, skip the "size" fast path if the entries as some unknown size We are about to prefetch size during the lock less in the v3 case. So we need to avoid trying to use that prefetched size when it is not available. See next changeset for the motivation.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 26 Mar 2024 18:55:40 +0000
parents e88549a02f5e
children 87faafd6ea83
line wrap: on
line source

Test EOL update

  $ cat >> $HGRCPATH <<EOF
  > [diff]
  > git = 1
  > EOF

  $ seteol () {
  >     if [ $1 = "LF" ]; then
  >         EOL='\n'
  >     else
  >         EOL='\r\n'
  >     fi
  > }

  $ makerepo () {
  >     echo
  >     echo "# ==== setup repository ===="
  >     echo '% hg init'
  >     hg init repo
  >     cd repo
  > 
  >     cat > .hgeol <<EOF
  > [patterns]
  > **.txt = LF
  > EOF
  > 
  >     printf "first\nsecond\nthird\n" > a.txt
  >     printf "f\r\n" > f
  >     hg commit --addremove -m 'LF commit'
  > 
  >     cat > .hgeol <<EOF
  > [patterns]
  > **.txt = CRLF
  > f = LF
  > EOF
  > 
  >     printf "first\r\nsecond\r\nthird\r\n" > a.txt
  >     printf "f\n" > f
  >     hg commit -m 'CRLF commit'
  > 
  >     cd ..
  > }

  $ dotest () {
  >     seteol $1
  > 
  >     echo
  >     echo "% hg clone repo repo-$1"
  >     hg clone --noupdate repo repo-$1
  >     cd repo-$1
  > 
  >     cat > .hg/hgrc <<EOF
  > [extensions]
  > eol =
  > EOF
  > 
  >     hg update
  > 
  >     echo '% a.txt (before)'
  >     cat a.txt
  > 
  >     printf "first${EOL}third${EOL}" > a.txt
  > 
  >     echo '% a.txt (after)'
  >     cat a.txt
  >     echo '% hg diff'
  >     hg diff
  > 
  >     echo '% hg update 0'
  >     hg update 0
  > 
  >     echo '% a.txt'
  >     cat a.txt
  >     echo '% hg diff'
  >     hg diff
  > 
  > 
  >     cd ..
  >     rm -r repo-$1
  > }

  $ makerepo
  
  # ==== setup repository ====
  % hg init
  adding .hgeol
  adding a.txt
  adding f
  $ dotest LF
  
  % hg clone repo repo-LF
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
  % a.txt (before)
  first\r (esc)
  second\r (esc)
  third\r (esc)
  % a.txt (after)
  first
  third
  % hg diff
  diff --git a/a.txt b/a.txt
  --- a/a.txt
  +++ b/a.txt
  @@ -1,3 +1,2 @@
   first\r (esc)
  -second\r (esc)
   third\r (esc)
  % hg update 0
  merging a.txt
  2 files updated, 1 files merged, 0 files removed, 0 files unresolved
  % a.txt
  first
  third
  % hg diff
  diff --git a/a.txt b/a.txt
  --- a/a.txt
  +++ b/a.txt
  @@ -1,3 +1,2 @@
   first
  -second
   third
  $ dotest CRLF
  
  % hg clone repo repo-CRLF
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
  % a.txt (before)
  first\r (esc)
  second\r (esc)
  third\r (esc)
  % a.txt (after)
  first\r (esc)
  third\r (esc)
  % hg diff
  diff --git a/a.txt b/a.txt
  --- a/a.txt
  +++ b/a.txt
  @@ -1,3 +1,2 @@
   first\r (esc)
  -second\r (esc)
   third\r (esc)
  % hg update 0
  merging a.txt
  2 files updated, 1 files merged, 0 files removed, 0 files unresolved
  % a.txt
  first
  third
  % hg diff
  diff --git a/a.txt b/a.txt
  --- a/a.txt
  +++ b/a.txt
  @@ -1,3 +1,2 @@
   first
  -second
   third

Test in repo using eol extension, while keeping an eye on how filters are
applied:

  $ cd repo

  $ hg up -q -c -r null
  $ cat > .hg/hgrc <<EOF
  > [extensions]
  > eol =
  > EOF

Update to revision 0 which has no .hgeol, shouldn't use any filters, and
obviously should leave things as tidy as they were before the clean update.

  $ hg up -c -r 0 -v --debug
  resolving manifests
   branchmerge: False, force: False, partial: False
   ancestor: 000000000000, local: 000000000000+, remote: 15cbdf8ca3db
  calling hook preupdate.eol: hgext.eol.preupdate
   .hgeol: remote created -> g
  getting .hgeol
  filtering .hgeol through isbinary
   a.txt: remote created -> g
  getting a.txt
  filtering a.txt through tolf
   f: remote created -> g
  getting f
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg st

  $ hg branch b
  marked working directory as branch b
  (branches are permanent and global, did you want a bookmark?)
  $ hg ci -m b

Merge changes that apply a filter to f:

  $ hg merge 1
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ hg st
  M .hgeol
  M a.txt
  M f
  $ hg diff
  diff --git a/.hgeol b/.hgeol
  --- a/.hgeol
  +++ b/.hgeol
  @@ -1,2 +1,3 @@
   [patterns]
  -**.txt = LF
  +**.txt = CRLF
  +f = LF
  diff --git a/a.txt b/a.txt
  --- a/a.txt
  +++ b/a.txt
  @@ -1,3 +1,3 @@
  -first
  -second
  -third
  +first\r (esc)
  +second\r (esc)
  +third\r (esc)
  diff --git a/f b/f
  --- a/f
  +++ b/f
  @@ -1,1 +1,1 @@
  -f\r (esc)
  +f

Abort the merge with up -C to revision 0.
Note that files are filtered correctly for revision 0: f is not filtered, a.txt
is filtered with tolf, and everything is left tidy.

  $ touch .hgeol *  # ensure consistent dirtyness checks ignoring dirstate
  $ hg up -C -r 0 -v --debug
  eol: detected change in .hgeol
  resolving manifests
   branchmerge: False, force: True, partial: False
   ancestor: 1db78bdd3bd6+, local: 1db78bdd3bd6+, remote: 15cbdf8ca3db
  calling hook preupdate.eol: hgext.eol.preupdate
   .hgeol: remote is newer -> g
  getting .hgeol
  filtering .hgeol through isbinary
   a.txt: remote is newer -> g
  getting a.txt
  filtering a.txt through tolf
   f: remote is newer -> g
  getting f
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ touch .hgeol *
  $ hg st --debug
  eol: detected change in .hgeol
  filtering .hgeol through isbinary
  filtering a.txt through tolf
  skip updating dirstate: identity mismatch (?)
  $ hg diff

Things were clean, and updating again will not change anything:

  $ touch .hgeol *
  $ hg up -C -r 0 -v --debug
  eol: detected change in .hgeol
  filtering .hgeol through isbinary
  filtering a.txt through tolf
  resolving manifests
   branchmerge: False, force: True, partial: False
   ancestor: 15cbdf8ca3db+, local: 15cbdf8ca3db+, remote: 15cbdf8ca3db
  calling hook preupdate.eol: hgext.eol.preupdate
  starting 4 threads for background file closing (?)
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved

  $ touch .hgeol *
  $ hg st --debug
  eol: detected change in .hgeol
  filtering .hgeol through isbinary
  filtering a.txt through tolf

  $ cd ..

  $ rm -r repo