status: intersect matcher with narrow matcher instead of filtering afterwards
I seem to have done a very naive move of the code from the narrow
extension into core in
e411774a2e0f (narrow: move status-filtering to
core and to ctx, 2018-08-02). It seems obvious that a better way is to
intersect the matchers.
Note that this means that when requesting status for the working
directory in a narrow repo, we now pass the narrow matcher (possibly
intersected with a user-provided matcher) into _buildstatus() and then
into dirstate.status() and dirstate.walk(), which will the intersect
it again with the narrow matcher. That's functionally fine, but
wasteful. I hope to later remove the dirstate wrapping that adds the
second layer of matcher intersection.
Differential Revision: https://phab.mercurial-scm.org/D4897
Test histedit extension: Fold commands
======================================
This test file is dedicated to testing the fold command in non conflicting
case.
Initialization
---------------
$ . "$TESTDIR/histedit-helpers.sh"
$ cat >> $HGRCPATH <<EOF
> [alias]
> logt = log --template '{rev}:{node|short} {desc|firstline}\n'
> [extensions]
> histedit=
> EOF
Simple folding
--------------------
$ addwithdate ()
> {
> echo $1 > $1
> hg add $1
> hg ci -m $1 -d "$2 0"
> }
$ initrepo ()
> {
> hg init r
> cd r
> addwithdate a 1
> addwithdate b 2
> addwithdate c 3
> addwithdate d 4
> addwithdate e 5
> addwithdate f 6
> }
$ initrepo
log before edit
$ hg logt --graph
@ 5:178e35e0ce73 f
|
o 4:1ddb6c90f2ee e
|
o 3:532247a8969b d
|
o 2:ff2c9fa2018b c
|
o 1:97d72e5f12c7 b
|
o 0:8580ff50825a a
$ hg histedit ff2c9fa2018b --commands - 2>&1 <<EOF | fixbundle
> pick 1ddb6c90f2ee e
> pick 178e35e0ce73 f
> fold ff2c9fa2018b c
> pick 532247a8969b d
> EOF
log after edit
$ hg logt --graph
@ 4:c4d7f3def76d d
|
o 3:575228819b7e f
|
o 2:505a591af19e e
|
o 1:97d72e5f12c7 b
|
o 0:8580ff50825a a
post-fold manifest
$ hg manifest
a
b
c
d
e
f
check histedit_source, including that it uses the later date, from the first changeset
$ hg log --debug --rev 3
changeset: 3:575228819b7e6ed69e8c0a6a383ee59a80db7358
phase: draft
parent: 2:505a591af19eed18f560af827b9e03d2076773dc
parent: -1:0000000000000000000000000000000000000000
manifest: 3:81eede616954057198ead0b2c73b41d1f392829a
user: test
date: Thu Jan 01 00:00:06 1970 +0000
files+: c f
extra: branch=default
extra: histedit_source=7cad1d7030207872dfd1c3a7cb430f24f2884086,ff2c9fa2018b15fa74b33363bda9527323e2a99f
description:
f
***
c
rollup will fold without preserving the folded commit's message or date
$ OLDHGEDITOR=$HGEDITOR
$ HGEDITOR=false
$ hg histedit 97d72e5f12c7 --commands - 2>&1 <<EOF | fixbundle
> pick 97d72e5f12c7 b
> roll 505a591af19e e
> pick 575228819b7e f
> pick c4d7f3def76d d
> EOF
$ HGEDITOR=$OLDHGEDITOR
log after edit
$ hg logt --graph
@ 3:bab801520cec d
|
o 2:58c8f2bfc151 f
|
o 1:5d939c56c72e b
|
o 0:8580ff50825a a
description is taken from rollup target commit
$ hg log --debug --rev 1
changeset: 1:5d939c56c72e77e29f5167696218e2131a40f5cf
phase: draft
parent: 0:8580ff50825a50c8f716709acdf8de0deddcd6ab
parent: -1:0000000000000000000000000000000000000000
manifest: 1:b5e112a3a8354e269b1524729f0918662d847c38
user: test
date: Thu Jan 01 00:00:02 1970 +0000
files+: b e
extra: branch=default
extra: histedit_source=97d72e5f12c7e84f85064aa72e5a297142c36ed9,505a591af19eed18f560af827b9e03d2076773dc
description:
b
check saving last-message.txt
$ cat > $TESTTMP/abortfolding.py <<EOF
> from mercurial import util
> def abortfolding(ui, repo, hooktype, **kwargs):
> ctx = repo[kwargs.get('node')]
> if set(ctx.files()) == {b'c', b'd', b'f'}:
> return True # abort folding commit only
> ui.warn(b'allow non-folding commit\\n')
> EOF
$ cat > .hg/hgrc <<EOF
> [hooks]
> pretxncommit.abortfolding = python:$TESTTMP/abortfolding.py:abortfolding
> EOF
$ cat > $TESTTMP/editor.sh << EOF
> echo "==== before editing"
> cat \$1
> echo "===="
> echo "check saving last-message.txt" >> \$1
> EOF
$ rm -f .hg/last-message.txt
$ hg status --rev '58c8f2bfc151^1::bab801520cec'
A c
A d
A f
$ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit 58c8f2bfc151 --commands - 2>&1 <<EOF
> pick 58c8f2bfc151 f
> fold bab801520cec d
> EOF
allow non-folding commit
==== before editing
f
***
c
***
d
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: test
HG: branch 'default'
HG: added c
HG: added d
HG: added f
====
transaction abort!
rollback completed
abort: pretxncommit.abortfolding hook failed
[255]
$ cat .hg/last-message.txt
f
***
c
***
d
check saving last-message.txt
$ cd ..
$ rm -r r
folding preserves initial author but uses later date
----------------------------------------------------
$ initrepo
$ hg ci -d '7 0' --user "someone else" --amend --quiet
tip before edit
$ hg log --rev .
changeset: 5:10c36dd37515
tag: tip
user: someone else
date: Thu Jan 01 00:00:07 1970 +0000
summary: f
$ hg --config progress.debug=1 --debug \
> histedit 1ddb6c90f2ee --commands - 2>&1 <<EOF | \
> egrep 'editing|unresolved'
> pick 1ddb6c90f2ee e
> fold 10c36dd37515 f
> EOF
editing: pick 1ddb6c90f2ee 4 e 1/2 changes (50.00%)
editing: fold 10c36dd37515 5 f 2/2 changes (100.00%)
tip after edit, which should use the later date, from the second changeset
$ hg log --rev .
changeset: 4:e4f3ec5d0b40
tag: tip
user: test
date: Thu Jan 01 00:00:07 1970 +0000
summary: e
$ cd ..
$ rm -r r
folding and creating no new change doesn't break:
-------------------------------------------------
folded content is dropped during a merge. The folded commit should properly disappear.
$ mkdir fold-to-empty-test
$ cd fold-to-empty-test
$ hg init
$ printf "1\n2\n3\n" > file
$ hg add file
$ hg commit -m '1+2+3'
$ echo 4 >> file
$ hg commit -m '+4'
$ echo 5 >> file
$ hg commit -m '+5'
$ echo 6 >> file
$ hg commit -m '+6'
$ hg logt --graph
@ 3:251d831eeec5 +6
|
o 2:888f9082bf99 +5
|
o 1:617f94f13c0f +4
|
o 0:0189ba417d34 1+2+3
$ hg histedit 1 --commands - << EOF
> pick 617f94f13c0f 1 +4
> drop 888f9082bf99 2 +5
> fold 251d831eeec5 3 +6
> EOF
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
merging file
warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
Fix up the change (fold 251d831eeec5)
(hg histedit --continue to resume)
[1]
There were conflicts, we keep P1 content. This
should effectively drop the changes from +6.
$ hg status -v
M file
? file.orig
# The repository is in an unfinished *histedit* state.
# Unresolved merge conflicts:
#
# file
#
# To mark files as resolved: hg resolve --mark FILE
# To continue: hg histedit --continue
# To abort: hg histedit --abort
$ hg resolve -l
U file
$ hg revert -r 'p1()' file
$ hg resolve --mark file
(no more unresolved files)
continue: hg histedit --continue
$ hg histedit --continue
251d831eeec5: empty changeset
saved backup bundle to $TESTTMP/fold-to-empty-test/.hg/strip-backup/888f9082bf99-daa0b8b3-histedit.hg
$ hg logt --graph
@ 1:617f94f13c0f +4
|
o 0:0189ba417d34 1+2+3
$ cd ..
Test fold through dropped
-------------------------
Test corner case where folded revision is separated from its parent by a
dropped revision.
$ hg init fold-with-dropped
$ cd fold-with-dropped
$ printf "1\n2\n3\n" > file
$ hg commit -Am '1+2+3'
adding file
$ echo 4 >> file
$ hg commit -m '+4'
$ echo 5 >> file
$ hg commit -m '+5'
$ echo 6 >> file
$ hg commit -m '+6'
$ hg logt -G
@ 3:251d831eeec5 +6
|
o 2:888f9082bf99 +5
|
o 1:617f94f13c0f +4
|
o 0:0189ba417d34 1+2+3
$ hg histedit 1 --commands - << EOF
> pick 617f94f13c0f 1 +4
> drop 888f9082bf99 2 +5
> fold 251d831eeec5 3 +6
> EOF
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
merging file
warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
Fix up the change (fold 251d831eeec5)
(hg histedit --continue to resume)
[1]
$ cat > file << EOF
> 1
> 2
> 3
> 4
> 5
> EOF
$ hg resolve --mark file
(no more unresolved files)
continue: hg histedit --continue
$ hg commit -m '+5.2'
created new head
$ echo 6 >> file
$ HGEDITOR=cat hg histedit --continue
+4
***
+5.2
***
+6
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: test
HG: branch 'default'
HG: changed file
saved backup bundle to $TESTTMP/fold-with-dropped/.hg/strip-backup/617f94f13c0f-3d69522c-histedit.hg
$ hg logt -G
@ 1:10c647b2cdd5 +4
|
o 0:0189ba417d34 1+2+3
$ hg export tip
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 10c647b2cdd54db0603ecb99b2ff5ce66d5a5323
# Parent 0189ba417d34df9dda55f88b637dcae9917b5964
+4
***
+5.2
***
+6
diff -r 0189ba417d34 -r 10c647b2cdd5 file
--- a/file Thu Jan 01 00:00:00 1970 +0000
+++ b/file Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +1,6 @@
1
2
3
+4
+5
+6
$ cd ..
Folding with initial rename (issue3729)
---------------------------------------
$ hg init fold-rename
$ cd fold-rename
$ echo a > a.txt
$ hg add a.txt
$ hg commit -m a
$ hg rename a.txt b.txt
$ hg commit -m rename
$ echo b >> b.txt
$ hg commit -m b
$ hg logt --follow b.txt
2:e0371e0426bc b
1:1c4f440a8085 rename
0:6c795aa153cb a
$ hg histedit 1c4f440a8085 --commands - 2>&1 << EOF | fixbundle
> pick 1c4f440a8085 rename
> fold e0371e0426bc b
> EOF
$ hg logt --follow b.txt
1:cf858d235c76 rename
0:6c795aa153cb a
$ cd ..
Folding with swapping
---------------------
This is an excuse to test hook with histedit temporary commit (issue4422)
$ hg init issue4422
$ cd issue4422
$ echo a > a.txt
$ hg add a.txt
$ hg commit -m a
$ echo b > b.txt
$ hg add b.txt
$ hg commit -m b
$ echo c > c.txt
$ hg add c.txt
$ hg commit -m c
$ hg logt
2:a1a953ffb4b0 c
1:199b6bb90248 b
0:6c795aa153cb a
$ hg histedit 6c795aa153cb --config hooks.commit='echo commit $HG_NODE' --config hooks.tonative.commit=True \
> --commands - 2>&1 << EOF | fixbundle
> pick 199b6bb90248 b
> fold a1a953ffb4b0 c
> pick 6c795aa153cb a
> EOF
commit 9599899f62c05f4377548c32bf1c9f1a39634b0c
$ hg logt
1:9599899f62c0 a
0:79b99e9c8e49 b
Test unix -> windows style variable substitution in external hooks.
$ cat > $TESTTMP/tmp.hgrc <<'EOF'
> [hooks]
> pre-add = echo no variables
> post-add = echo ran $HG_ARGS, literal \$non-var, 'also $non-var', $HG_RESULT
> tonative.post-add = True
> EOF
$ echo "foo" > amended.txt
$ HGRCPATH=$TESTTMP/tmp.hgrc hg add -v amended.txt
running hook pre-add: echo no variables
no variables
adding amended.txt
converting hook "post-add" to native (windows !)
running hook post-add: echo ran %HG_ARGS%, literal $non-var, "also $non-var", %HG_RESULT% (windows !)
running hook post-add: echo ran $HG_ARGS, literal \$non-var, 'also $non-var', $HG_RESULT (no-windows !)
ran add -v amended.txt, literal $non-var, "also $non-var", 0 (windows !)
ran add -v amended.txt, literal $non-var, also $non-var, 0 (no-windows !)
$ hg ci -q --config extensions.largefiles= --amend -I amended.txt
The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !)
Test that folding multiple changes in a row doesn't show multiple
editors.
$ echo foo >> foo
$ hg add foo
$ hg ci -m foo1
$ echo foo >> foo
$ hg ci -m foo2
$ echo foo >> foo
$ hg ci -m foo3
$ hg logt
4:21679ff7675c foo3
3:b7389cc4d66e foo2
2:0e01aeef5fa8 foo1
1:578c7455730c a
0:79b99e9c8e49 b
$ cat > "$TESTTMP/editor.sh" <<EOF
> echo ran editor >> "$TESTTMP/editorlog.txt"
> cat \$1 >> "$TESTTMP/editorlog.txt"
> echo END >> "$TESTTMP/editorlog.txt"
> echo merged foos > \$1
> EOF
$ HGEDITOR="sh \"$TESTTMP/editor.sh\"" hg histedit 1 --commands - 2>&1 <<EOF | fixbundle
> pick 578c7455730c 1 a
> pick 0e01aeef5fa8 2 foo1
> fold b7389cc4d66e 3 foo2
> fold 21679ff7675c 4 foo3
> EOF
$ hg logt
2:e8bedbda72c1 merged foos
1:578c7455730c a
0:79b99e9c8e49 b
Editor should have run only once
$ cat $TESTTMP/editorlog.txt
ran editor
foo1
***
foo2
***
foo3
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: test
HG: branch 'default'
HG: added foo
END
$ cd ..
Test rolling into a commit with multiple children (issue5498)
$ hg init roll
$ cd roll
$ echo a > a
$ hg commit -qAm aa
$ echo b > b
$ hg commit -qAm bb
$ hg up -q ".^"
$ echo c > c
$ hg commit -qAm cc
$ hg log -G -T '{node|short} {desc}'
@ 5db65b93a12b cc
|
| o 301d76bdc3ae bb
|/
o 8f0162e483d0 aa
$ hg histedit . --commands - << EOF
> r 5db65b93a12b
> EOF
hg: parse error: first changeset cannot use verb "roll"
[255]
$ hg log -G -T '{node|short} {desc}'
@ 5db65b93a12b cc
|
| o 301d76bdc3ae bb
|/
o 8f0162e483d0 aa