1  $ cat >> $HGRCPATH << EOF
2  > [diff]
3  > git=1
4  > [extensions]
5  > absorb=
6  > EOF
7
8  $ sedi() { # workaround check-code
9  > pattern="$1"
10  > shift
11  > for i in "$@"; do
12  >     sed "$pattern" "$i" > "$i".tmp
13  >     mv "$i".tmp "$i"
14  > done
15  > }
16
17rename a to b, then b to a
18
19  $ hg init repo1
20  $ cd repo1
21
22  $ echo 1 > a
23  $ hg ci -A a -m 1
24  $ hg mv a b
25  $ echo 2 >> b
26  $ hg ci -m 2
27  $ hg mv b a
28  $ echo 3 >> a
29  $ hg ci -m 3
30
31  $ hg annotate -ncf a
32  0 eff892de26ec a: 1
33  1 bf56e1f4f857 b: 2
34  2 0b888b00216c a: 3
35
36  $ sedi 's/$/a/' a
37  $ hg absorb -apq
38  showing changes for a
39          @@ -0,3 +0,3 @@
40  eff892d -1
41  bf56e1f -2
42  0b888b0 -3
43  eff892d +1a
44  bf56e1f +2a
45  0b888b0 +3a
46
47  3 changesets affected
48  0b888b0 3
49  bf56e1f 2
50  eff892d 1
51
52  $ hg status
53
54  $ hg annotate -ncf a
55  0 5d1c5620e6f2 a: 1a
56  1 9a14ffe67ae9 b: 2a
57  2 9191d121a268 a: 3a
58
59when the first changeset is public
60
61  $ hg phase --public -r 0
62
63  $ sedi 's/a/A/' a
64
65  $ hg absorb -apq
66  showing changes for a
67          @@ -0,3 +0,3 @@
68          -1a
69  9a14ffe -2a
70  9191d12 -3a
71          +1A
72  9a14ffe +2A
73  9191d12 +3A
74
75  2 changesets affected
76  9191d12 3
77  9a14ffe 2
78
79  $ hg diff
80  diff --git a/a b/a
81  --- a/a
82  +++ b/a
83  @@ -1,3 +1,3 @@
84  -1a
85  +1A
86   2A
87   3A
88
89copy a to b
90
91  $ cd ..
92  $ hg init repo2
93  $ cd repo2
94
95  $ echo 1 > a
96  $ hg ci -A a -m 1
97  $ hg cp a b
98  $ echo 2 >> b
99  $ hg ci -m 2
100
101  $ hg log -T '{rev}:{node|short} {desc}\n'
102  1:17b72129ab68 2
103  0:eff892de26ec 1
104
105  $ sedi 's/$/a/' a
106  $ sedi 's/$/b/' b
107
108  $ hg absorb -apq
109  showing changes for a
110          @@ -0,1 +0,1 @@
111  eff892d -1
112  eff892d +1a
113  showing changes for b
114          @@ -0,2 +0,2 @@
115          -1
116  17b7212 -2
117          +1b
118  17b7212 +2b
119
120  2 changesets affected
121  17b7212 2
122  eff892d 1
123
124  $ hg diff
125  diff --git a/b b/b
126  --- a/b
127  +++ b/b
128  @@ -1,2 +1,2 @@
129  -1
130  +1b
131   2b
132
133copy b to a
134
135  $ cd ..
136  $ hg init repo3
137  $ cd repo3
138
139  $ echo 1 > b
140  $ hg ci -A b -m 1
141  $ hg cp b a
142  $ echo 2 >> a
143  $ hg ci -m 2
144
145  $ hg log -T '{rev}:{node|short} {desc}\n'
146  1:e62c256d8b24 2
147  0:55105f940d5c 1
148
149  $ sedi 's/$/a/' a
150  $ sedi 's/$/a/' b
151
152  $ hg absorb -apq
153  showing changes for a
154          @@ -0,2 +0,2 @@
155          -1
156  e62c256 -2
157          +1a
158  e62c256 +2a
159  showing changes for b
160          @@ -0,1 +0,1 @@
161  55105f9 -1
162  55105f9 +1a
163
164  2 changesets affected
165  e62c256 2
166  55105f9 1
167
168  $ hg diff
169  diff --git a/a b/a
170  --- a/a
171  +++ b/a
172  @@ -1,2 +1,2 @@
173  -1
174  +1a
175   2a
176
177"move" b to both a and c, follow a - sorted alphabetically
178
179  $ cd ..
180  $ hg init repo4
181  $ cd repo4
182
183  $ echo 1 > b
184  $ hg ci -A b -m 1
185  $ hg cp b a
186  $ hg cp b c
187  $ hg rm b
188  $ echo 2 >> a
189  $ echo 3 >> c
190  $ hg commit -m cp
191
192  $ hg log -T '{rev}:{node|short} {desc}\n'
193  1:366daad8e679 cp
194  0:55105f940d5c 1
195
196  $ sedi 's/$/a/' a
197  $ sedi 's/$/c/' c
198
199  $ hg absorb -apq
200  showing changes for a
201          @@ -0,2 +0,2 @@
202  55105f9 -1
203  366daad -2
204  55105f9 +1a
205  366daad +2a
206  showing changes for c
207          @@ -0,2 +0,2 @@
208          -1
209  366daad -3
210          +1c
211  366daad +3c
212
213  2 changesets affected
214  366daad cp
215  55105f9 1
216
217  $ hg log -G -p -T '{rev}:{node|short} {desc}\n'
218  @  1:70606019f91b cp
219  |  diff --git a/b b/a
220  |  rename from b
221  |  rename to a
222  |  --- a/b
223  |  +++ b/a
224  |  @@ -1,1 +1,2 @@
225  |   1a
226  |  +2a
227  |  diff --git a/b b/c
228  |  copy from b
229  |  copy to c
230  |  --- a/b
231  |  +++ b/c
232  |  @@ -1,1 +1,2 @@
233  |  -1a
234  |  +1
235  |  +3c
236  |
237  o  0:bfb67c3539c1 1
238     diff --git a/b b/b
239     new file mode 100644
240     --- /dev/null
241     +++ b/b
242     @@ -0,0 +1,1 @@
243     +1a
244
245run absorb again would apply the change to c
246
247  $ hg absorb -apq
248  showing changes for c
249          @@ -0,1 +0,1 @@
250  7060601 -1
251  7060601 +1c
252
253  1 changesets affected
254  7060601 cp
255
256  $ hg log -G -p -T '{rev}:{node|short} {desc}\n'
257  @  1:8bd536cce368 cp
258  |  diff --git a/b b/a
259  |  rename from b
260  |  rename to a
261  |  --- a/b
262  |  +++ b/a
263  |  @@ -1,1 +1,2 @@
264  |   1a
265  |  +2a
266  |  diff --git a/b b/c
267  |  copy from b
268  |  copy to c
269  |  --- a/b
270  |  +++ b/c
271  |  @@ -1,1 +1,2 @@
272  |  -1a
273  |  +1c
274  |  +3c
275  |
276  o  0:bfb67c3539c1 1
277     diff --git a/b b/b
278     new file mode 100644
279     --- /dev/null
280     +++ b/b
281     @@ -0,0 +1,1 @@
282     +1a
283
284"move" b to a, c and d, follow d if a gets renamed to e, and c is deleted
285
286  $ cd ..
287  $ hg init repo5
288  $ cd repo5
289
290  $ echo 1 > b
291  $ hg ci -A b -m 1
292  $ hg cp b a
293  $ hg cp b c
294  $ hg cp b d
295  $ hg rm b
296  $ echo 2 >> a
297  $ echo 3 >> c
298  $ echo 4 >> d
299  $ hg commit -m cp
300  $ hg mv a e
301  $ hg rm c
302  $ hg commit -m mv
303
304  $ hg log -T '{rev}:{node|short} {desc}\n'
305  2:49911557c471 mv
306  1:7bc3d43ede83 cp
307  0:55105f940d5c 1
308
309  $ sedi 's/$/e/' e
310  $ sedi 's/$/d/' d
311
312  $ hg absorb -apq
313  showing changes for d
314          @@ -0,2 +0,2 @@
315  55105f9 -1
316  7bc3d43 -4
317  55105f9 +1d
318  7bc3d43 +4d
319  showing changes for e
320          @@ -0,2 +0,2 @@
321          -1
322  7bc3d43 -2
323          +1e
324  7bc3d43 +2e
325
326  2 changesets affected
327  7bc3d43 cp
328  55105f9 1
329
330  $ hg diff
331  diff --git a/e b/e
332  --- a/e
333  +++ b/e
334  @@ -1,2 +1,2 @@
335  -1
336  +1e
337   2e
338
339  $ hg log -G -p -T '{rev}:{node|short} {desc}\n'
340  @  2:34be9b0c786e mv
341  |  diff --git a/c b/c
342  |  deleted file mode 100644
343  |  --- a/c
344  |  +++ /dev/null
345  |  @@ -1,2 +0,0 @@
346  |  -1
347  |  -3
348  |  diff --git a/a b/e
349  |  rename from a
350  |  rename to e
351  |
352  o  1:13e56db5948d cp
353  |  diff --git a/b b/a
354  |  rename from b
355  |  rename to a
356  |  --- a/b
357  |  +++ b/a
358  |  @@ -1,1 +1,2 @@
359  |  -1d
360  |  +1
361  |  +2e
362  |  diff --git a/b b/c
363  |  copy from b
364  |  copy to c
365  |  --- a/b
366  |  +++ b/c
367  |  @@ -1,1 +1,2 @@
368  |  -1d
369  |  +1
370  |  +3
371  |  diff --git a/b b/d
372  |  copy from b
373  |  copy to d
374  |  --- a/b
375  |  +++ b/d
376  |  @@ -1,1 +1,2 @@
377  |   1d
378  |  +4d
379  |
380  o  0:0037613a5dc6 1
381     diff --git a/b b/b
382     new file mode 100644
383     --- /dev/null
384     +++ b/b
385     @@ -0,0 +1,1 @@
386     +1d
387
388