hidden: use _domainancestors to compute revs revealed by dynamic blocker
The complexity of computing the revealed changesets is now 'O(revealed)'.
This massively speeds up the computation on large repository. Moving it to the
millisecond range.
Below are timing from two Mozilla repositories with different contents:
1) mozilla repository with:
* 400667 changesets
* 35 hidden changesets (first rev-268334)
* 288 visible drafts
* obsolete working copy (dynamicblockers),
Before:
! visible
! wall 0.030247 comb 0.030000 user 0.030000 sys 0.000000 (best of 100)
After:
! visible
! wall 0.000585 comb 0.000000 user 0.000000 sys 0.000000 (best of 4221)
The timing above include the computation of obsolete changeset:
! obsolete
! wall 0.000396 comb 0.000000 user 0.000000 sys 0.000000 (best of 6816)
So adjusted time give 30ms before versus 0.2ms after. A 150x speedup.
2) mozilla repository with:
* 405645 changesets
* 4312 hidden changesets (first rev-326004)
* 264 visible drafts
* obsolete working copy (dynamicblockers),
Before:
! visible
! wall 0.168658 comb 0.170000 user 0.170000 sys 0.000000 (best of 48)
After
! visible
! wall 0.008612 comb 0.010000 user 0.010000 sys 0.000000 (best of 325)
The timing above include the computation of obsolete changeset:
! obsolete
! wall 0.006408 comb 0.010000 user 0.010000 sys 0.000000 (best of 404)
So adjusted time give 160ms before versus 2ms after. A 75x speedup.
$ hg init repo
$ cd repo
$ i=0; while [ "$i" -lt 213 ]; do echo a >> a; i=`expr $i + 1`; done
$ hg add a
$ cp a b
$ hg add b
Wide diffstat:
$ hg diff --stat
a | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
b | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 426 insertions(+), 0 deletions(-)
diffstat width:
$ COLUMNS=24 hg diff --config ui.interactive=true --stat
a | 213 ++++++++++++++
b | 213 ++++++++++++++
2 files changed, 426 insertions(+), 0 deletions(-)
$ hg ci -m adda
$ cat >> a <<EOF
> a
> a
> a
> EOF
Narrow diffstat:
$ hg diff --stat
a | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
$ hg ci -m appenda
>>> open("c", "wb").write("\0")
$ touch d
$ hg add c d
Binary diffstat:
$ hg diff --stat
c | Bin
1 files changed, 0 insertions(+), 0 deletions(-)
Binary git diffstat:
$ hg diff --stat --git
c | Bin
d | 0
2 files changed, 0 insertions(+), 0 deletions(-)
$ hg ci -m createb
>>> open("file with spaces", "wb").write("\0")
$ hg add "file with spaces"
Filename with spaces diffstat:
$ hg diff --stat
file with spaces | Bin
1 files changed, 0 insertions(+), 0 deletions(-)
Filename with spaces git diffstat:
$ hg diff --stat --git
file with spaces | Bin
1 files changed, 0 insertions(+), 0 deletions(-)
diffstat within directories:
$ hg rm -f 'file with spaces'
$ mkdir dir1 dir2
$ echo new1 > dir1/new
$ echo new2 > dir2/new
$ hg add dir1/new dir2/new
$ hg diff --stat
dir1/new | 1 +
dir2/new | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
$ hg diff --stat --root dir1
new | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
$ hg diff --stat --root dir1 dir2
warning: dir2 not inside relative root dir1
$ hg diff --stat --root dir1 -I dir1/old
$ cd dir1
$ hg diff --stat .
dir1/new | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
$ hg diff --stat --root .
new | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
$ hg diff --stat --root ../dir1 ../dir2
warning: ../dir2 not inside relative root . (glob)
$ hg diff --stat --root . -I old
$ cd ..
Files with lines beginning with '--' or '++' should be properly counted in diffstat
$ hg up -Cr tip
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ rm dir1/new
$ rm dir2/new
$ rm "file with spaces"
$ cat > file << EOF
> line 1
> line 2
> line 3
> EOF
$ hg commit -Am file
adding file
Lines added starting with '--' should count as additions
$ cat > file << EOF
> line 1
> -- line 2, with dashes
> line 3
> EOF
$ hg diff --root .
diff -r be1569354b24 file
--- a/file Thu Jan 01 00:00:00 1970 +0000
+++ b/file * (glob)
@@ -1,3 +1,3 @@
line 1
-line 2
+-- line 2, with dashes
line 3
$ hg diff --root . --stat
file | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
Lines changed starting with '--' should count as deletions
$ hg commit -m filev2
$ cat > file << EOF
> line 1
> -- line 2, with dashes, changed again
> line 3
> EOF
$ hg diff --root .
diff -r 160f7c034df6 file
--- a/file Thu Jan 01 00:00:00 1970 +0000
+++ b/file * (glob)
@@ -1,3 +1,3 @@
line 1
--- line 2, with dashes
+-- line 2, with dashes, changed again
line 3
$ hg diff --root . --stat
file | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
Lines changed starting with '--' should count as deletions
and starting with '++' should count as additions
$ cat > file << EOF
> line 1
> ++ line 2, switched dashes to plusses
> line 3
> EOF
$ hg diff --root .
diff -r 160f7c034df6 file
--- a/file Thu Jan 01 00:00:00 1970 +0000
+++ b/file * (glob)
@@ -1,3 +1,3 @@
line 1
--- line 2, with dashes
+++ line 2, switched dashes to plusses
line 3
$ hg diff --root . --stat
file | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)