amend: add a new flag `--patch` to `hg amend`
This patch adds a new flag `--patch` to `hg amend` which pops up an editor with
the patch of working directory parent which you can change, and when you exit
the editor the patch with changes is applied to current working directory with
old changeset being obsoleted in favour of new one created by the applied patch.
If supplied filenames, only those filenames are present in the popped editor and
rest files stay the same way in the commit as they were.
The extension of the file which opens up in editor is '.diff', we cannot have it
as '.patch' as there will be develwarns related to that. We need to change to
patch core and undo some change to achieve this.
The implementation does not use any core API rather it has picked chunks from
API which are required. One main reason to not use core import API is that we
have to change wdir parent before using patch.patch() which I will like to avoid
to make sure we handle merge cases too. While writing this patch I have spend
lot of time try to use internal API's to work for this but none of them served
the purpose well. If I have time in future and work on similar problem again, I
am going to write better high-level API's which uses patchstore to achieve this.
A new test file test-amend-patch.t which contains a lot of testing of the
feature.
============================================
Testing obsolescence markers push: Cases A.2
============================================
Mercurial pushes obsolescences markers relevant to the "pushed-set", the set of
all changesets that requested to be "in sync" after the push (even if they are
already on both side).
This test belongs to a series of tests checking such set is properly computed
and applied. This does not tests "obsmarkers" discovery capabilities.
Category A: simple cases
TestCase 2: Two heads, only one of them pushed
A.2 Two heads, only on of then pushed
=====================================
.. {{{
.. ⇠○ B
.. ⇠◔ | A
.. |/
.. ● O
.. }}}
..
.. Markers exist from:
..
.. * A
.. * B
..
..
.. Command runs:
..
.. * hg push -r A
..
.. Expected exchange:
..
.. * chain from A
..
.. Expected Exclude:
..
.. * chain from B
Setup
-----
$ . $TESTDIR/testlib/exchange-obsmarker-util.sh
initial
$ setuprepos A.2
creating test repo for test case A.2
- pulldest
- main
- pushdest
cd into `main` and proceed with env setup
$ cd main
$ mkcommit A
$ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A)'`
$ hg up '.~1'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit B
created new head
$ hg debugobsolete bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb `getid 'desc(B)'`
$ hg log -G
@ 35b183996678 (draft): B
|
| o f5bc6836db60 (draft): A
|/
o a9bdc8b26820 (public): O
$ inspect_obsmarkers
obsstore content
================
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
obshashtree
===========
a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04 0000000000000000000000000000000000000000
f5bc6836db60e308a17ba08bf050154ba9c4fad7 50656e04a95ecdfed94659dd61f663b2caa55e98
35b1839966785d5703a01607229eea932db42f87 b9c8f20eef8938ebab939fe6a592587feacf3245
obshashrange
============
rev node index size depth obshash
2 35b183996678 0 2 2 b9c8f20eef89
1 f5bc6836db60 0 2 2 50656e04a95e
2 35b183996678 1 1 2 b9c8f20eef89
0 a9bdc8b26820 0 1 1 000000000000
1 f5bc6836db60 1 1 2 50656e04a95e
$ cd ..
$ cd ..
Actual Test
-----------
$ dotest A.2 A
## Running testcase A.2
# testing echange of "A" (f5bc6836db60)
## initial state
# obstore: main
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
# obstore: pushdest
# obstore: pulldest
## pushing "A" from main to pushdest
pushing to pushdest
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
remote: 1 new obsolescence markers
## post push state
# obstore: main
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
# obstore: pushdest
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
# obstore: pulldest
## pulling "f5bc6836db60" from main into pulldest
pulling from main
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
1 new obsolescence markers
new changesets f5bc6836db60
(run 'hg update' to get a working copy)
## post pull state
# obstore: main
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
# obstore: pushdest
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
# obstore: pulldest
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
$ cd ..