$ setconfig extensions.treemanifest=! $ enable pushrebase amend remotenames $ setconfig experimental.evolution= $ setconfig experimental.narrow-heads=true $ setconfig visibility.enabled=true $ setconfig mutation.record=true mutation.enabled=true mutation.date="0 0" $ setconfig ui.ssh="python \"$RUNTESTDIR/dummyssh\"" $ setconfig pushrebase.trystackpush=true Set up server repository $ hg init server $ cd server $ setconfig experimental.narrow-heads=false $ echo 1 > a $ echo 2 > b $ hg commit -Aqm base migrating repo to old-style visibility and phases (this restores the behavior to a known good state; post in Source Control @ FB if you have issues) $ hg bookmark master Set up client repository $ cd .. $ hg clone ssh://user@dummy/server client -q Add more commits on the server $ cd server $ echo 3 > c $ hg commit -Aqm s1 $ echo 4 > d $ hg commit -Aqm s2 $ hg bookmark master Pushrebase some commits from the client $ cd ../client $ echo 5 > e $ hg commit -Aqm c1 $ echo 6 > f $ hg commit -Aqm c2 $ echo 6a > f $ hg amend -qm "c2 (amended)" $ tglogp @ 3: e52ebff26308 draft 'c2 (amended)' | o 1: b0c40d8745c8 draft 'c1' | o 0: a7d6a32ae4ec public 'base' $ hg push --to master pushing rev e52ebff26308 to destination ssh://user@dummy/server bookmark master searching for changes remote: pushing 2 changesets: remote: b0c40d8745c8 c1 remote: e52ebff26308 c2 (amended) remote: 4 new changesets from the server will be downloaded adding changesets adding manifests adding file changes added 4 changesets with 2 changes to 4 files updating bookmark master 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ tglogp @ 7: bc165ecd11df public 'c2 (amended)' | o 6: 466bbcaf803c public 'c1' | o 5: 1f850c9f0d59 public 's2' | o 4: 06569a64c141 public 's1' | o 0: a7d6a32ae4ec public 'base' $ hg debugmutation ::tip * a7d6a32ae4ecf473d6f934e731f1868dda4d3fc9 * 06569a64c14156339463c64337f9cb5dc3a25442 * 1f850c9f0d599261fce148d3d19cdc89d8eb391f * 466bbcaf803c40b7121013141b842e654ee07f7f pushrebase by test at 1970-01-01T00:00:00 (synthetic) from: b0c40d8745c83226015263d45e60a0d12722c515 * bc165ecd11df56066a4d73e8294a85ecb255d3cf pushrebase by test at 1970-01-01T00:00:00 (synthetic) from: e52ebff2630810cbc8bc0e3a8de78cb662f0865f amend by test at 1970-01-01T00:00:00 from: f558c5855324eea33b5f046b45b85db1fb98bca7 $ cd ../server $ tglogp o 4: bc165ecd11df public 'c2 (amended)' master | o 3: 466bbcaf803c public 'c1' | @ 2: 1f850c9f0d59 public 's2' | o 1: 06569a64c141 public 's1' | o 0: a7d6a32ae4ec public 'base' $ hg debugmutation ::tip * a7d6a32ae4ecf473d6f934e731f1868dda4d3fc9 * 06569a64c14156339463c64337f9cb5dc3a25442 * 1f850c9f0d599261fce148d3d19cdc89d8eb391f * 466bbcaf803c40b7121013141b842e654ee07f7f pushrebase by test at 1970-01-01T00:00:00 from: b0c40d8745c83226015263d45e60a0d12722c515 * bc165ecd11df56066a4d73e8294a85ecb255d3cf pushrebase by test at 1970-01-01T00:00:00 from: e52ebff2630810cbc8bc0e3a8de78cb662f0865f Test pushing to a server that does not have mutation recording enabled. Synthetic mutation entries will be contructed from the obsmarkers that pushrebase returns. $ cd ../server $ cat >> .hg/hgrc < [mutation] > record=false > enabled=false > EOF Push an original commit to the server. This doesn't get pushrebased. $ cd ../client $ echo 9 > i $ hg commit -Aqm c3 $ hg push --to master pushing rev 5cfa12ac15ac to destination ssh://user@dummy/server bookmark master searching for changes remote: pushing 1 changeset: remote: 5cfa12ac15ac c3 updating bookmark master $ hg debugmutation . * 5cfa12ac15aca3668b5f91e5a7b92aa309b320a9 Add commits on the server to pushrebase over. $ cd ../server $ hg up -q master $ echo 7 > g $ hg commit -Aqm s3 $ echo 8 > h $ hg commit -Aqm s4 Add another commit on the client. $ cd ../client $ echo 10 > j $ hg commit -Aqm c4 $ echo 10a > j $ hg amend -qm "c4 (amended)" $ tglogp @ 10: 254a42c0dcef draft 'c4 (amended)' | o 8: 5cfa12ac15ac public 'c3' | o 7: bc165ecd11df public 'c2 (amended)' | o 6: 466bbcaf803c public 'c1' | o 5: 1f850c9f0d59 public 's2' | o 4: 06569a64c141 public 's1' | o 0: a7d6a32ae4ec public 'base' Push this commit to the server. We should create local mutation information. $ hg push --to master pushing rev 254a42c0dcef to destination ssh://user@dummy/server bookmark master searching for changes remote: pushing 1 changeset: remote: 254a42c0dcef c4 (amended) remote: 3 new changesets from the server will be downloaded adding changesets adding manifests adding file changes added 3 changesets with 2 changes to 3 files updating bookmark master 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg debugmutation ".~4::." * bc165ecd11df56066a4d73e8294a85ecb255d3cf pushrebase by test at 1970-01-01T00:00:00 (synthetic) from: e52ebff2630810cbc8bc0e3a8de78cb662f0865f amend by test at 1970-01-01T00:00:00 from: f558c5855324eea33b5f046b45b85db1fb98bca7 * 5cfa12ac15aca3668b5f91e5a7b92aa309b320a9 * 34295f2adc0954d129b43d9ad2d785376eacc3b6 * b6dffa66e38820804c5eaf4d2c9477718f537ce3 * 56ff167c1749dc765639745247323a6139cd9514 pushrebase by test at 1970-01-01T00:00:00 (synthetic) from: 254a42c0dcef8381419add47e4f0ff6cd50ea8c7 amend by test at 1970-01-01T00:00:00 from: 3f1b3b3d517fcd3c8cef763476c588fb99343c3d Test pushing to a futuristic server that doesn't support obsmarkers at all will still behave correctly. $ cd ../server $ cat >> .hg/hgrc << EOF > [mutation] > record=true > enabled=true > [pushrebase] > pushback.obsmarkers=false > EOF $ hg up -q master $ echo 11 > k $ hg commit -Aqm s5 $ cd ../client $ echo 12 > l $ hg commit -Aqm c5 $ echo 12a > l $ hg amend -qm "c5 (amended)" $ hg push --to master pushing rev 6b21e03c2693 to destination ssh://user@dummy/server bookmark master searching for changes remote: pushing 1 changeset: remote: 6b21e03c2693 c5 (amended) remote: 2 new changesets from the server will be downloaded adding changesets adding manifests adding file changes added 2 changesets with 1 changes to 2 files updating bookmark master 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ tglogp @ 17: 7a5f07a2de1e public 'c5 (amended)' | o 16: 4c6ed9931ef5 public 's5' | o 13: 56ff167c1749 public 'c4 (amended)' | o 12: b6dffa66e388 public 's4' | o 11: 34295f2adc09 public 's3' | o 8: 5cfa12ac15ac public 'c3' | o 7: bc165ecd11df public 'c2 (amended)' | o 6: 466bbcaf803c public 'c1' | o 5: 1f850c9f0d59 public 's2' | o 4: 06569a64c141 public 's1' | o 0: a7d6a32ae4ec public 'base' $ hg debugmutation . * 7a5f07a2de1e5def6fa3288bde454239ed183ac1 pushrebase by test at 1970-01-01T00:00:00 (synthetic) from: 6b21e03c2693b7ccaea8bbc2ed465bf0f20669ea amend by test at 1970-01-01T00:00:00 from: 9407986f3421a1339098ddb424e7f4652626e70d $ tglogm --hidden @ 17: 7a5f07a2de1e 'c5 (amended)' | o 16: 4c6ed9931ef5 's5' | | x 15: 6b21e03c2693 'c5 (amended)' (Rewritten using pushrebase into 7a5f07a2de1e) |/ | x 14: 9407986f3421 'c5' (Rewritten using amend into 6b21e03c2693) |/ o 13: 56ff167c1749 'c4 (amended)' | o 12: b6dffa66e388 's4' | o 11: 34295f2adc09 's3' | | x 10: 254a42c0dcef 'c4 (amended)' (Rewritten using pushrebase into 56ff167c1749) |/ | x 9: 3f1b3b3d517f 'c4' (Rewritten using amend into 254a42c0dcef) |/ o 8: 5cfa12ac15ac 'c3' | o 7: bc165ecd11df 'c2 (amended)' | o 6: 466bbcaf803c 'c1' | o 5: 1f850c9f0d59 's2' | o 4: 06569a64c141 's1' | | x 3: e52ebff26308 'c2 (amended)' (Rewritten using pushrebase into bc165ecd11df) | | | | x 2: f558c5855324 'c2' (Rewritten using amend into e52ebff26308) | |/ | x 1: b0c40d8745c8 'c1' (Rewritten using pushrebase into 466bbcaf803c) |/ o 0: a7d6a32ae4ec 'base'