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