dagop: fix subsetparentswalker to set p1/p2 chains at merge revision
The previous implementation was wrong because the '1'/'2' key would be
appended at a fork revision. Since we traverse the graph from heads, a merge
revision is actually a branching point, where the sort key must be generated.
#require pygit2
Setup:
$ GIT_AUTHOR_NAME='test'; export GIT_AUTHOR_NAME
> GIT_AUTHOR_EMAIL='test@example.org'; export GIT_AUTHOR_EMAIL
> GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0000"; export GIT_AUTHOR_DATE
> GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME
> GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL
> GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE
> count=10
> gitcommit() {
> GIT_AUTHOR_DATE="2007-01-01 00:00:$count +0000";
> GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
> git commit "$@" >/dev/null 2>/dev/null || echo "git commit error"
> count=`expr $count + 1`
> }
Test auto-loading extension works:
$ mkdir nogit
$ cd nogit
$ mkdir .hg
$ echo git >> .hg/requires
$ hg status
abort: repository specified git format in .hg/requires but has no .git directory
[255]
$ git init
Initialized empty Git repository in $TESTTMP/nogit/.git/
This status invocation shows some hg gunk because we didn't use
`hg init --git`, which fixes up .git/info/exclude for us.
$ hg status
? .hg/cache/git-commits.sqlite
? .hg/cache/git-commits.sqlite-shm
? .hg/cache/git-commits.sqlite-wal
? .hg/requires
$ cd ..
Now globally enable extension for the rest of the test:
$ echo "[extensions]" >> $HGRCPATH
> echo "git=" >> $HGRCPATH
Make a new repo with git:
$ mkdir foo
$ cd foo
$ git init
Initialized empty Git repository in $TESTTMP/foo/.git/
Ignore the .hg directory within git:
$ echo .hg >> .git/info/exclude
$ echo alpha > alpha
$ git add alpha
$ gitcommit -am 'Add alpha'
$ echo beta > beta
$ git add beta
$ gitcommit -am 'Add beta'
$ echo gamma > gamma
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
gamma
nothing added to commit but untracked files present (use "git add" to track)
Without creating the .hg, hg status fails:
$ hg status
abort: no repository found in '$TESTTMP/foo' (.hg not found)!
[255]
But if you run hg init --git, it works:
$ hg init --git
$ hg id --traceback
3d9be8deba43 tip master
$ hg status
? gamma
Log works too:
$ hg log
changeset: 1:3d9be8deba43
bookmark: master
tag: tip
user: test <test@example.org>
date: Mon Jan 01 00:00:11 2007 +0000
summary: Add beta
changeset: 0:c5864c9d16fb
user: test <test@example.org>
date: Mon Jan 01 00:00:10 2007 +0000
summary: Add alpha
and bookmarks:
$ hg bookmarks
* master 1:3d9be8deba43
diff even works transparently in both systems:
$ echo blah >> alpha
$ git diff
diff --git a/alpha b/alpha
index 4a58007..faed1b7 100644
--- a/alpha
+++ b/alpha
@@ -1* +1,2 @@ (glob)
alpha
+blah
$ hg diff --git
diff --git a/alpha b/alpha
--- a/alpha
+++ b/alpha
@@ -1,1 +1,2 @@
alpha
+blah
Remove a file, it shows as such:
$ rm alpha
$ hg status
! alpha
? gamma
Revert works:
$ hg revert alpha --traceback
$ hg status
? gamma
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
gamma
nothing added to commit but untracked files present (use "git add" to track)
Add shows sanely in both:
$ hg add gamma
$ hg status
A gamma
$ hg files
alpha
beta
gamma
$ git ls-files
alpha
beta
gamma
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: gamma
forget does what it should as well:
$ hg forget gamma
$ hg status
? gamma
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
gamma
nothing added to commit but untracked files present (use "git add" to track)
clean up untracked file
$ rm gamma
hg log FILE
$ echo a >> alpha
$ hg ci -m 'more alpha' --traceback --date '1583522787 18000'
$ echo b >> beta
$ hg ci -m 'more beta'
$ echo a >> alpha
$ hg ci -m 'even more alpha'
$ hg log -G alpha
@ changeset: 4:6626247b7dc8
: bookmark: master
: tag: tip
: user: test <test>
: date: Thu Jan 01 00:00:00 1970 +0000
: summary: even more alpha
:
o changeset: 2:a1983dd7fb19
: user: test <test>
: date: Fri Mar 06 14:26:27 2020 -0500
: summary: more alpha
:
o changeset: 0:c5864c9d16fb
user: test <test@example.org>
date: Mon Jan 01 00:00:10 2007 +0000
summary: Add alpha
$ hg log -G beta
o changeset: 3:d8ee22687733
: user: test <test>
: date: Thu Jan 01 00:00:00 1970 +0000
: summary: more beta
:
o changeset: 1:3d9be8deba43
| user: test <test@example.org>
~ date: Mon Jan 01 00:00:11 2007 +0000
summary: Add beta
hg annotate
$ hg annotate alpha
0: alpha
2: a
4: a
$ hg annotate beta
1: beta
3: b
Files in subdirectories. TODO: case-folding support, make this `A`
instead of `a`.
$ mkdir a
$ echo "This is file mu." > a/mu
$ hg ci -A -m 'Introduce file a/mu'
adding a/mu
Both hg and git agree a/mu is part of the repo
$ git ls-files
a/mu
alpha
beta
$ hg files
a/mu
alpha
beta
hg and git status both clean
$ git status
On branch master
nothing to commit, working tree clean
$ hg status
node|shortest works correctly
$ hg log -T '{node}\n' | sort
3d9be8deba43482be2c81a4cb4be1f10d85fa8bc
6626247b7dc8f231b183b8a4761c89139baca2ad
a1983dd7fb19cbd83ad5a1c2fc8bf3d775dea12f
ae1ab744f95bfd5b07cf573baef98a778058537b
c5864c9d16fb3431fe2c175ff84dc6accdbb2c18
d8ee22687733a1991813560b15128cd9734f4b48
$ hg log -r ae1ab744f95bfd5b07cf573baef98a778058537b --template "{shortest(node,1)}\n"
ae