Mercurial > hg
view tests/test-eol-update.t @ 44712:a825bfbf6642
templatekw: cache mergestate even if merge is not ongoing
While playing with eBPF, I noticed .hg/merge/state{,2} files were tried
to open() for each revision. That's not healthy. Let's cache the "inactive"
state as well.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Wed, 15 Apr 2020 23:11:55 +0900 |
parents | e88549a02f5e |
children |
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