##// END OF EJS Templates
merge with stable
Matt Mackall -
r21832:4b93e19c merge default
parent child Browse files
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,91 +1,92 b''
1 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0 iD8DBQBEYmO2ywK+sNU5EO8RAnaYAKCO7x15xUn5mnhqWNXqk/ehlhRt2QCfRDfY0LrUq2q4oK/KypuJYPHgq1A=
1 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0 iD8DBQBEYmO2ywK+sNU5EO8RAnaYAKCO7x15xUn5mnhqWNXqk/ehlhRt2QCfRDfY0LrUq2q4oK/KypuJYPHgq1A=
2 2be3001847cb18a23c403439d9e7d0ace30804e9 0 iD8DBQBExUbjywK+sNU5EO8RAhzxAKCtyHAQUzcTSZTqlfJ0by6vhREwWQCghaQFHfkfN0l9/40EowNhuMOKnJk=
2 2be3001847cb18a23c403439d9e7d0ace30804e9 0 iD8DBQBExUbjywK+sNU5EO8RAhzxAKCtyHAQUzcTSZTqlfJ0by6vhREwWQCghaQFHfkfN0l9/40EowNhuMOKnJk=
3 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0 iD8DBQBFfL2QywK+sNU5EO8RAjYFAKCoGlaWRTeMsjdmxAjUYx6diZxOBwCfY6IpBYsKvPTwB3oktnPt5Rmrlys=
3 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0 iD8DBQBFfL2QywK+sNU5EO8RAjYFAKCoGlaWRTeMsjdmxAjUYx6diZxOBwCfY6IpBYsKvPTwB3oktnPt5Rmrlys=
4 27230c29bfec36d5540fbe1c976810aefecfd1d2 0 iD8DBQBFheweywK+sNU5EO8RAt7VAKCrqJQWT2/uo2RWf0ZI4bLp6v82jACgjrMdsaTbxRsypcmEsdPhlG6/8F4=
4 27230c29bfec36d5540fbe1c976810aefecfd1d2 0 iD8DBQBFheweywK+sNU5EO8RAt7VAKCrqJQWT2/uo2RWf0ZI4bLp6v82jACgjrMdsaTbxRsypcmEsdPhlG6/8F4=
5 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0 iD8DBQBGgHicywK+sNU5EO8RAgNxAJ0VG8ixAaeudx4sZbhngI1syu49HQCeNUJQfWBgA8bkJ2pvsFpNxwYaX3I=
5 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0 iD8DBQBGgHicywK+sNU5EO8RAgNxAJ0VG8ixAaeudx4sZbhngI1syu49HQCeNUJQfWBgA8bkJ2pvsFpNxwYaX3I=
6 23889160905a1b09fffe1c07378e9fc1827606eb 0 iD8DBQBHGTzoywK+sNU5EO8RAr/UAJ0Y8s4jQtzgS+G9vM8z6CWBThZ8fwCcCT5XDj2XwxKkz/0s6UELwjsO3LU=
6 23889160905a1b09fffe1c07378e9fc1827606eb 0 iD8DBQBHGTzoywK+sNU5EO8RAr/UAJ0Y8s4jQtzgS+G9vM8z6CWBThZ8fwCcCT5XDj2XwxKkz/0s6UELwjsO3LU=
7 bae2e9c838e90a393bae3973a7850280413e091a 0 iD8DBQBH6DO5ywK+sNU5EO8RAsfrAJ0e4r9c9GF/MJsM7Xjd3NesLRC3+ACffj6+6HXdZf8cswAoFPO+DY00oD0=
7 bae2e9c838e90a393bae3973a7850280413e091a 0 iD8DBQBH6DO5ywK+sNU5EO8RAsfrAJ0e4r9c9GF/MJsM7Xjd3NesLRC3+ACffj6+6HXdZf8cswAoFPO+DY00oD0=
8 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 0 iD8DBQBINdwsywK+sNU5EO8RAjIUAKCPmlFJSpsPAAUKF+iNHAwVnwmzeQCdEXrL27CWclXuUKdbQC8De7LICtE=
8 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 0 iD8DBQBINdwsywK+sNU5EO8RAjIUAKCPmlFJSpsPAAUKF+iNHAwVnwmzeQCdEXrL27CWclXuUKdbQC8De7LICtE=
9 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 0 iD8DBQBIo1wpywK+sNU5EO8RAmRNAJ94x3OFt6blbqu/yBoypm/AJ44fuACfUaldXcV5z9tht97hSp22DVTEPGc=
9 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 0 iD8DBQBIo1wpywK+sNU5EO8RAmRNAJ94x3OFt6blbqu/yBoypm/AJ44fuACfUaldXcV5z9tht97hSp22DVTEPGc=
10 2a67430f92f15ea5159c26b09ec4839a0c549a26 0 iEYEABECAAYFAkk1hykACgkQywK+sNU5EO85QACeNJNUanjc2tl4wUoPHNuv+lSj0ZMAoIm93wSTc/feyYnO2YCaQ1iyd9Nu
10 2a67430f92f15ea5159c26b09ec4839a0c549a26 0 iEYEABECAAYFAkk1hykACgkQywK+sNU5EO85QACeNJNUanjc2tl4wUoPHNuv+lSj0ZMAoIm93wSTc/feyYnO2YCaQ1iyd9Nu
11 3773e510d433969e277b1863c317b674cbee2065 0 iEYEABECAAYFAklNbbAACgkQywK+sNU5EO8o+gCfeb2/lfIJZMvyDA1m+G1CsBAxfFsAoIa6iAMG8SBY7hW1Q85Yf/LXEvaE
11 3773e510d433969e277b1863c317b674cbee2065 0 iEYEABECAAYFAklNbbAACgkQywK+sNU5EO8o+gCfeb2/lfIJZMvyDA1m+G1CsBAxfFsAoIa6iAMG8SBY7hW1Q85Yf/LXEvaE
12 11a4eb81fb4f4742451591489e2797dc47903277 0 iEYEABECAAYFAklcAnsACgkQywK+sNU5EO+uXwCbBVHNNsLy1g7BlAyQJwadYVyHOXoAoKvtAVO71+bv7EbVoukwTzT+P4Sx
12 11a4eb81fb4f4742451591489e2797dc47903277 0 iEYEABECAAYFAklcAnsACgkQywK+sNU5EO+uXwCbBVHNNsLy1g7BlAyQJwadYVyHOXoAoKvtAVO71+bv7EbVoukwTzT+P4Sx
13 11efa41037e280d08cfb07c09ad485df30fb0ea8 0 iEYEABECAAYFAkmvJRQACgkQywK+sNU5EO9XZwCeLMgDgPSMWMm6vgjL4lDs2pEc5+0AnRxfiFbpbBfuEFTqKz9nbzeyoBlx
13 11efa41037e280d08cfb07c09ad485df30fb0ea8 0 iEYEABECAAYFAkmvJRQACgkQywK+sNU5EO9XZwCeLMgDgPSMWMm6vgjL4lDs2pEc5+0AnRxfiFbpbBfuEFTqKz9nbzeyoBlx
14 02981000012e3adf40c4849bd7b3d5618f9ce82d 0 iEYEABECAAYFAknEH3wACgkQywK+sNU5EO+uXwCeI+LbLMmhjU1lKSfU3UWJHjjUC7oAoIZLvYDGOL/tNZFUuatc3RnZ2eje
14 02981000012e3adf40c4849bd7b3d5618f9ce82d 0 iEYEABECAAYFAknEH3wACgkQywK+sNU5EO+uXwCeI+LbLMmhjU1lKSfU3UWJHjjUC7oAoIZLvYDGOL/tNZFUuatc3RnZ2eje
15 196d40e7c885fa6e95f89134809b3ec7bdbca34b 0 iEYEABECAAYFAkpL2X4ACgkQywK+sNU5EO9FOwCfXJycjyKJXsvQqKkHrglwOQhEKS4An36GfKzptfN8b1qNc3+ya/5c2WOM
15 196d40e7c885fa6e95f89134809b3ec7bdbca34b 0 iEYEABECAAYFAkpL2X4ACgkQywK+sNU5EO9FOwCfXJycjyKJXsvQqKkHrglwOQhEKS4An36GfKzptfN8b1qNc3+ya/5c2WOM
16 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 0 iEYEABECAAYFAkpopLIACgkQywK+sNU5EO8QSgCfZ0ztsd071rOa2lhmp9Fyue/WoI0AoLTei80/xrhRlB8L/rZEf2KBl8dA
16 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 0 iEYEABECAAYFAkpopLIACgkQywK+sNU5EO8QSgCfZ0ztsd071rOa2lhmp9Fyue/WoI0AoLTei80/xrhRlB8L/rZEf2KBl8dA
17 31ec469f9b556f11819937cf68ee53f2be927ebf 0 iEYEABECAAYFAksBuxAACgkQywK+sNU5EO+mBwCfagB+A0txzWZ6dRpug3LEoK7Z1QsAoKpbk8vsLjv6/oRDicSk/qBu33+m
17 31ec469f9b556f11819937cf68ee53f2be927ebf 0 iEYEABECAAYFAksBuxAACgkQywK+sNU5EO+mBwCfagB+A0txzWZ6dRpug3LEoK7Z1QsAoKpbk8vsLjv6/oRDicSk/qBu33+m
18 439d7ea6fe3aa4ab9ec274a68846779153789de9 0 iEYEABECAAYFAksVw0kACgkQywK+sNU5EO/oZwCfdfBEkgp38xq6wN2F4nj+SzofrJIAnjmxt04vaJSeOOeHylHvk6lzuQsw
18 439d7ea6fe3aa4ab9ec274a68846779153789de9 0 iEYEABECAAYFAksVw0kACgkQywK+sNU5EO/oZwCfdfBEkgp38xq6wN2F4nj+SzofrJIAnjmxt04vaJSeOOeHylHvk6lzuQsw
19 296a0b14a68621f6990c54fdba0083f6f20935bf 0 iEYEABECAAYFAks+jCoACgkQywK+sNU5EO9J8wCeMUGF9E/gS2UBsqIz56WS4HMPRPUAoI5J95mwEIK8Clrl7qFRidNI6APq
19 296a0b14a68621f6990c54fdba0083f6f20935bf 0 iEYEABECAAYFAks+jCoACgkQywK+sNU5EO9J8wCeMUGF9E/gS2UBsqIz56WS4HMPRPUAoI5J95mwEIK8Clrl7qFRidNI6APq
20 4aa619c4c2c09907034d9824ebb1dd0e878206eb 0 iEYEABECAAYFAktm9IsACgkQywK+sNU5EO9XGgCgk4HclRQhexEtooPE5GcUCdB6M8EAn2ptOhMVbIoO+JncA+tNACPFXh0O
20 4aa619c4c2c09907034d9824ebb1dd0e878206eb 0 iEYEABECAAYFAktm9IsACgkQywK+sNU5EO9XGgCgk4HclRQhexEtooPE5GcUCdB6M8EAn2ptOhMVbIoO+JncA+tNACPFXh0O
21 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 0 iEYEABECAAYFAkuRoSQACgkQywK+sNU5EO//3QCeJDc5r2uFyFCtAlpSA27DEE5rrxAAn2FSwTy9fhrB3QAdDQlwkEZcQzDh
21 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 0 iEYEABECAAYFAkuRoSQACgkQywK+sNU5EO//3QCeJDc5r2uFyFCtAlpSA27DEE5rrxAAn2FSwTy9fhrB3QAdDQlwkEZcQzDh
22 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 0 iEYEABECAAYFAku1IwIACgkQywK+sNU5EO9MjgCdHLVwkTZlNHxhcznZKBL1rjN+J7cAoLLWi9LTL6f/TgBaPSKOy1ublbaW
22 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 0 iEYEABECAAYFAku1IwIACgkQywK+sNU5EO9MjgCdHLVwkTZlNHxhcznZKBL1rjN+J7cAoLLWi9LTL6f/TgBaPSKOy1ublbaW
23 39f725929f0c48c5fb3b90c071fc3066012456ca 0 iEYEABECAAYFAkvclvsACgkQywK+sNU5EO9FSwCeL9i5x8ALW/LE5+lCX6MFEAe4MhwAn1ev5o6SX6GrNdDfKweiemfO2VBk
23 39f725929f0c48c5fb3b90c071fc3066012456ca 0 iEYEABECAAYFAkvclvsACgkQywK+sNU5EO9FSwCeL9i5x8ALW/LE5+lCX6MFEAe4MhwAn1ev5o6SX6GrNdDfKweiemfO2VBk
24 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 0 iEYEABECAAYFAkvsKTkACgkQywK+sNU5EO9qEACgiSiRGvTG2vXGJ65tUSOIYihTuFAAnRzRIqEVSw8M8/RGeUXRps0IzaCO
24 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 0 iEYEABECAAYFAkvsKTkACgkQywK+sNU5EO9qEACgiSiRGvTG2vXGJ65tUSOIYihTuFAAnRzRIqEVSw8M8/RGeUXRps0IzaCO
25 24fe2629c6fd0c74c90bd066e77387c2b02e8437 0 iEYEABECAAYFAkwFLRsACgkQywK+sNU5EO+pJACgp13tPI+pbwKZV+LeMjcQ4H6tCZYAoJebzhd6a8yYx6qiwpJxA9BXZNXy
25 24fe2629c6fd0c74c90bd066e77387c2b02e8437 0 iEYEABECAAYFAkwFLRsACgkQywK+sNU5EO+pJACgp13tPI+pbwKZV+LeMjcQ4H6tCZYAoJebzhd6a8yYx6qiwpJxA9BXZNXy
26 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 0 iEYEABECAAYFAkwsyxcACgkQywK+sNU5EO+crACfUpNAF57PmClkSri9nJcBjb2goN4AniPCNaKvnki7TnUsi1u2oxltpKKL
26 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 0 iEYEABECAAYFAkwsyxcACgkQywK+sNU5EO+crACfUpNAF57PmClkSri9nJcBjb2goN4AniPCNaKvnki7TnUsi1u2oxltpKKL
27 bf1774d95bde614af3956d92b20e2a0c68c5fec7 0 iEYEABECAAYFAkxVwccACgkQywK+sNU5EO+oFQCeJzwZ+we1fIIyBGCddHceOUAN++cAnjvT6A8ZWW0zV21NXIFF1qQmjxJd
27 bf1774d95bde614af3956d92b20e2a0c68c5fec7 0 iEYEABECAAYFAkxVwccACgkQywK+sNU5EO+oFQCeJzwZ+we1fIIyBGCddHceOUAN++cAnjvT6A8ZWW0zV21NXIFF1qQmjxJd
28 c00f03a4982e467fb6b6bd45908767db6df4771d 0 iEYEABECAAYFAkxXDqsACgkQywK+sNU5EO/GJACfT9Rz4hZOxPQEs91JwtmfjevO84gAmwSmtfo5mmWSm8gtTUebCcdTv0Kf
28 c00f03a4982e467fb6b6bd45908767db6df4771d 0 iEYEABECAAYFAkxXDqsACgkQywK+sNU5EO/GJACfT9Rz4hZOxPQEs91JwtmfjevO84gAmwSmtfo5mmWSm8gtTUebCcdTv0Kf
29 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 0 iD8DBQBMdo+qywK+sNU5EO8RAqQpAJ975BL2CCAiWMz9SXthNQ9xG181IwCgp4O+KViHPkufZVFn2aTKMNvcr1A=
29 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 0 iD8DBQBMdo+qywK+sNU5EO8RAqQpAJ975BL2CCAiWMz9SXthNQ9xG181IwCgp4O+KViHPkufZVFn2aTKMNvcr1A=
30 93d8bff78c96fe7e33237b257558ee97290048a4 0 iD8DBQBMpfvdywK+sNU5EO8RAsxVAJ0UaL1XB51C76JUBhafc9GBefuMxwCdEWkTOzwvE0SarJBe9i008jhbqW4=
30 93d8bff78c96fe7e33237b257558ee97290048a4 0 iD8DBQBMpfvdywK+sNU5EO8RAsxVAJ0UaL1XB51C76JUBhafc9GBefuMxwCdEWkTOzwvE0SarJBe9i008jhbqW4=
31 333421b9e0f96c7bc788e5667c146a58a9440a55 0 iD8DBQBMz0HOywK+sNU5EO8RAlsEAJ0USh6yOG7OrWkADGunVt9QimBQnwCbBqeMnKgSbwEw8jZwE3Iz1mdrYlo=
31 333421b9e0f96c7bc788e5667c146a58a9440a55 0 iD8DBQBMz0HOywK+sNU5EO8RAlsEAJ0USh6yOG7OrWkADGunVt9QimBQnwCbBqeMnKgSbwEw8jZwE3Iz1mdrYlo=
32 4438875ec01bd0fc32be92b0872eb6daeed4d44f 0 iD8DBQBM4WYUywK+sNU5EO8RAhCVAJ0dJswachwFAHALmk1x0RJehxzqPQCbBNskP9n/X689jB+btNTZTyKU/fw=
32 4438875ec01bd0fc32be92b0872eb6daeed4d44f 0 iD8DBQBM4WYUywK+sNU5EO8RAhCVAJ0dJswachwFAHALmk1x0RJehxzqPQCbBNskP9n/X689jB+btNTZTyKU/fw=
33 6aff4f144ad356311318b0011df0bb21f2c97429 0 iD8DBQBM9uxXywK+sNU5EO8RAv+4AKCDj4qKP16GdPaq1tP6BUwpM/M1OACfRyzLPp/qiiN8xJTWoWYSe/XjJug=
33 6aff4f144ad356311318b0011df0bb21f2c97429 0 iD8DBQBM9uxXywK+sNU5EO8RAv+4AKCDj4qKP16GdPaq1tP6BUwpM/M1OACfRyzLPp/qiiN8xJTWoWYSe/XjJug=
34 e3bf16703e2601de99e563cdb3a5d50b64e6d320 0 iD8DBQBNH8WqywK+sNU5EO8RAiQTAJ9sBO+TeiGro4si77VVaQaA6jcRUgCfSA28dBbjj0oFoQwvPoZjANiZBH8=
34 e3bf16703e2601de99e563cdb3a5d50b64e6d320 0 iD8DBQBNH8WqywK+sNU5EO8RAiQTAJ9sBO+TeiGro4si77VVaQaA6jcRUgCfSA28dBbjj0oFoQwvPoZjANiZBH8=
35 a6c855c32ea081da3c3b8ff628f1847ff271482f 0 iD8DBQBNSJJ+ywK+sNU5EO8RAoJaAKCweDEF70fu+r1Zn7pYDXdlk5RuSgCeO9gK/eit8Lin/1n3pO7aYguFLok=
35 a6c855c32ea081da3c3b8ff628f1847ff271482f 0 iD8DBQBNSJJ+ywK+sNU5EO8RAoJaAKCweDEF70fu+r1Zn7pYDXdlk5RuSgCeO9gK/eit8Lin/1n3pO7aYguFLok=
36 2b2155623ee2559caf288fd333f30475966c4525 0 iD8DBQBNSJeBywK+sNU5EO8RAm1KAJ4hW9Cm9nHaaGJguchBaPLlAr+O3wCgqgmMok8bdAS06N6PL60PSTM//Gg=
36 2b2155623ee2559caf288fd333f30475966c4525 0 iD8DBQBNSJeBywK+sNU5EO8RAm1KAJ4hW9Cm9nHaaGJguchBaPLlAr+O3wCgqgmMok8bdAS06N6PL60PSTM//Gg=
37 2616325766e3504c8ae7c84bd15ee610901fe91d 0 iD8DBQBNbWy9ywK+sNU5EO8RAlWCAJ4mW8HbzjJj9GpK98muX7k+7EvEHwCfaTLbC/DH3QEsZBhEP+M8tzL6RU4=
37 2616325766e3504c8ae7c84bd15ee610901fe91d 0 iD8DBQBNbWy9ywK+sNU5EO8RAlWCAJ4mW8HbzjJj9GpK98muX7k+7EvEHwCfaTLbC/DH3QEsZBhEP+M8tzL6RU4=
38 aa1f3be38ab127280761889d2dca906ca465b5f4 0 iD8DBQBNeQq7ywK+sNU5EO8RAlEOAJ4tlEDdetE9lKfjGgjbkcR8PrC3egCfXCfF3qNVvU/2YYjpgvRwevjvDy0=
38 aa1f3be38ab127280761889d2dca906ca465b5f4 0 iD8DBQBNeQq7ywK+sNU5EO8RAlEOAJ4tlEDdetE9lKfjGgjbkcR8PrC3egCfXCfF3qNVvU/2YYjpgvRwevjvDy0=
39 b032bec2c0a651ca0ddecb65714bfe6770f67d70 0 iD8DBQBNlg5kywK+sNU5EO8RAnGEAJ9gmEx6MfaR4XcG2m/93vwtfyzs3gCgltzx8/YdHPwqDwRX/WbpYgi33is=
39 b032bec2c0a651ca0ddecb65714bfe6770f67d70 0 iD8DBQBNlg5kywK+sNU5EO8RAnGEAJ9gmEx6MfaR4XcG2m/93vwtfyzs3gCgltzx8/YdHPwqDwRX/WbpYgi33is=
40 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 0 iD8DBQBNvTy4ywK+sNU5EO8RAmp8AJ9QnxK4jTJ7G722MyeBxf0UXEdGwACgtlM7BKtNQfbEH/fOW5y+45W88VI=
40 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 0 iD8DBQBNvTy4ywK+sNU5EO8RAmp8AJ9QnxK4jTJ7G722MyeBxf0UXEdGwACgtlM7BKtNQfbEH/fOW5y+45W88VI=
41 733af5d9f6b22387913e1d11350fb8cb7c1487dd 0 iD8DBQBN5q/8ywK+sNU5EO8RArRGAKCNGT94GKIYtSuwZ57z1sQbcw6uLACfffpbMV4NAPMl8womAwg+7ZPKnIU=
41 733af5d9f6b22387913e1d11350fb8cb7c1487dd 0 iD8DBQBN5q/8ywK+sNU5EO8RArRGAKCNGT94GKIYtSuwZ57z1sQbcw6uLACfffpbMV4NAPMl8womAwg+7ZPKnIU=
42 de9eb6b1da4fc522b1cab16d86ca166204c24f25 0 iD8DBQBODhfhywK+sNU5EO8RAr2+AJ4ugbAj8ae8/K0bYZzx3sascIAg1QCeK3b+zbbVVqd3b7CDpwFnaX8kTd4=
42 de9eb6b1da4fc522b1cab16d86ca166204c24f25 0 iD8DBQBODhfhywK+sNU5EO8RAr2+AJ4ugbAj8ae8/K0bYZzx3sascIAg1QCeK3b+zbbVVqd3b7CDpwFnaX8kTd4=
43 4a43e23b8c55b4566b8200bf69fe2158485a2634 0 iD8DBQBONzIMywK+sNU5EO8RAj5SAJ0aPS3+JHnyI6bHB2Fl0LImbDmagwCdGbDLp1S7TFobxXudOH49bX45Iik=
43 4a43e23b8c55b4566b8200bf69fe2158485a2634 0 iD8DBQBONzIMywK+sNU5EO8RAj5SAJ0aPS3+JHnyI6bHB2Fl0LImbDmagwCdGbDLp1S7TFobxXudOH49bX45Iik=
44 d629f1e89021103f1753addcef6b310e4435b184 0 iD8DBQBOWAsBywK+sNU5EO8RAht4AJwJl9oNFopuGkj5m8aKuf7bqPkoAQCeNrEm7UhFsZKYT5iUOjnMV7s2LaM=
44 d629f1e89021103f1753addcef6b310e4435b184 0 iD8DBQBOWAsBywK+sNU5EO8RAht4AJwJl9oNFopuGkj5m8aKuf7bqPkoAQCeNrEm7UhFsZKYT5iUOjnMV7s2LaM=
45 351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg=
45 351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg=
46 384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI=
46 384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI=
47 41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4=
47 41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4=
48 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo=
48 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo=
49 6344043924497cd06d781d9014c66802285072e4 0 iD8DBQBPALgmywK+sNU5EO8RAlfhAJ9nYOdWnhfVDHYtDTJAyJtXBAQS9wCgnefoSQt7QABkbGxM+Q85UYEBuD0=
49 6344043924497cd06d781d9014c66802285072e4 0 iD8DBQBPALgmywK+sNU5EO8RAlfhAJ9nYOdWnhfVDHYtDTJAyJtXBAQS9wCgnefoSQt7QABkbGxM+Q85UYEBuD0=
50 db33555eafeaf9df1e18950e29439eaa706d399b 0 iD8DBQBPGdzxywK+sNU5EO8RAppkAJ9jOXhUVE/97CPgiMA0pMGiIYnesQCfengAszcBiSiKGugiI8Okc9ghU+Y=
50 db33555eafeaf9df1e18950e29439eaa706d399b 0 iD8DBQBPGdzxywK+sNU5EO8RAppkAJ9jOXhUVE/97CPgiMA0pMGiIYnesQCfengAszcBiSiKGugiI8Okc9ghU+Y=
51 2aa5b51f310fb3befd26bed99c02267f5c12c734 0 iD8DBQBPKZ9bywK+sNU5EO8RAt1TAJ45r1eJ0YqSkInzrrayg4TVCh0SnQCgm0GA/Ua74jnnDwVQ60lAwROuz1Q=
51 2aa5b51f310fb3befd26bed99c02267f5c12c734 0 iD8DBQBPKZ9bywK+sNU5EO8RAt1TAJ45r1eJ0YqSkInzrrayg4TVCh0SnQCgm0GA/Ua74jnnDwVQ60lAwROuz1Q=
52 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 0 iD8DBQBPT/fvywK+sNU5EO8RAnfYAKCn7d0vwqIb100YfWm1F7nFD5B+FACeM02YHpQLSNsztrBCObtqcnfod7Q=
52 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 0 iD8DBQBPT/fvywK+sNU5EO8RAnfYAKCn7d0vwqIb100YfWm1F7nFD5B+FACeM02YHpQLSNsztrBCObtqcnfod7Q=
53 b9bd95e61b49c221c4cca24e6da7c946fc02f992 0 iD8DBQBPeLsIywK+sNU5EO8RAvpNAKCtKe2gitz8dYn52IRF0hFOPCR7AQCfRJL/RWCFweu2T1vH/mUOCf8SXXc=
53 b9bd95e61b49c221c4cca24e6da7c946fc02f992 0 iD8DBQBPeLsIywK+sNU5EO8RAvpNAKCtKe2gitz8dYn52IRF0hFOPCR7AQCfRJL/RWCFweu2T1vH/mUOCf8SXXc=
54 d9e2f09d5488c395ae9ddbb320ceacd24757e055 0 iD8DBQBPju/dywK+sNU5EO8RArBYAJ9xtifdbk+hCOJO8OZa4JfHX8OYZQCeKPMBaBWiT8N/WHoOm1XU0q+iono=
54 d9e2f09d5488c395ae9ddbb320ceacd24757e055 0 iD8DBQBPju/dywK+sNU5EO8RArBYAJ9xtifdbk+hCOJO8OZa4JfHX8OYZQCeKPMBaBWiT8N/WHoOm1XU0q+iono=
55 00182b3d087909e3c3ae44761efecdde8f319ef3 0 iD8DBQBPoFhIywK+sNU5EO8RAhzhAKCBj1n2jxPTkZNJJ5pSp3soa+XHIgCgsZZpAQxOpXwCp0eCdNGe0+pmxmg=
55 00182b3d087909e3c3ae44761efecdde8f319ef3 0 iD8DBQBPoFhIywK+sNU5EO8RAhzhAKCBj1n2jxPTkZNJJ5pSp3soa+XHIgCgsZZpAQxOpXwCp0eCdNGe0+pmxmg=
56 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 0 iD8DBQBPovNWywK+sNU5EO8RAhgiAJ980T91FdPTRMmVONDhpkMsZwVIMACgg3bKvoWSeuCW28llUhAJtUjrMv0=
56 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 0 iD8DBQBPovNWywK+sNU5EO8RAhgiAJ980T91FdPTRMmVONDhpkMsZwVIMACgg3bKvoWSeuCW28llUhAJtUjrMv0=
57 85a358df5bbbe404ca25730c9c459b34263441dc 0 iD8DBQBPyZsWywK+sNU5EO8RAnpLAJ48qrGDJRT+pteS0mSQ11haqHstPwCdG4ccGbk+0JHb7aNy8/NRGAOqn9w=
57 85a358df5bbbe404ca25730c9c459b34263441dc 0 iD8DBQBPyZsWywK+sNU5EO8RAnpLAJ48qrGDJRT+pteS0mSQ11haqHstPwCdG4ccGbk+0JHb7aNy8/NRGAOqn9w=
58 b013baa3898e117959984fc64c29d8c784d2f28b 0 iD8DBQBP8QOPywK+sNU5EO8RAqimAKCFRSx0lvG6y8vne2IhNG062Hn0dACeMLI5/zhpWpHBIVeAAquYfx2XFeA=
58 b013baa3898e117959984fc64c29d8c784d2f28b 0 iD8DBQBP8QOPywK+sNU5EO8RAqimAKCFRSx0lvG6y8vne2IhNG062Hn0dACeMLI5/zhpWpHBIVeAAquYfx2XFeA=
59 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 0 iD8DBQBQGiL8ywK+sNU5EO8RAq5oAJ4rMMCPx6O+OuzNXVOexogedWz/QgCeIiIxLd76I4pXO48tdXhr0hQcBuM=
59 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 0 iD8DBQBQGiL8ywK+sNU5EO8RAq5oAJ4rMMCPx6O+OuzNXVOexogedWz/QgCeIiIxLd76I4pXO48tdXhr0hQcBuM=
60 072209ae4ddb654eb2d5fd35bff358c738414432 0 iD8DBQBQQkq0ywK+sNU5EO8RArDTAJ9nk5CySnNAjAXYvqvx4uWCw9ThZwCgqmFRehH/l+oTwj3f8nw8u8qTCdc=
60 072209ae4ddb654eb2d5fd35bff358c738414432 0 iD8DBQBQQkq0ywK+sNU5EO8RArDTAJ9nk5CySnNAjAXYvqvx4uWCw9ThZwCgqmFRehH/l+oTwj3f8nw8u8qTCdc=
61 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 0 iD8DBQBQamltywK+sNU5EO8RAlsqAJ4qF/m6aFu4mJCOKTiAP5RvZFK02ACfawYShUZO6OXEFfveU0aAxDR0M1k=
61 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 0 iD8DBQBQamltywK+sNU5EO8RAlsqAJ4qF/m6aFu4mJCOKTiAP5RvZFK02ACfawYShUZO6OXEFfveU0aAxDR0M1k=
62 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 0 iD8DBQBQgPV5ywK+sNU5EO8RArylAJ0abcx5NlDjyv3ZDWpAfRIHyRsJtQCgn4TMuEayqgxzrvadQZHdTEU2g38=
62 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 0 iD8DBQBQgPV5ywK+sNU5EO8RArylAJ0abcx5NlDjyv3ZDWpAfRIHyRsJtQCgn4TMuEayqgxzrvadQZHdTEU2g38=
63 195ad823b5d58c68903a6153a25e3fb4ed25239d 0 iD8DBQBQkuT9ywK+sNU5EO8RAhB4AKCeerItoK2Jipm2cVf4euGofAa/WACeJj3TVd4pFILpb+ogj7ebweFLJi0=
63 195ad823b5d58c68903a6153a25e3fb4ed25239d 0 iD8DBQBQkuT9ywK+sNU5EO8RAhB4AKCeerItoK2Jipm2cVf4euGofAa/WACeJj3TVd4pFILpb+ogj7ebweFLJi0=
64 0c10cf8191469e7c3c8844922e17e71a176cb7cb 0 iD8DBQBQvQWoywK+sNU5EO8RAnq3AJoCn98u4geFx5YaQaeh99gFhCd7bQCgjoBwBSUyOvGd0yBy60E3Vv3VZhM=
64 0c10cf8191469e7c3c8844922e17e71a176cb7cb 0 iD8DBQBQvQWoywK+sNU5EO8RAnq3AJoCn98u4geFx5YaQaeh99gFhCd7bQCgjoBwBSUyOvGd0yBy60E3Vv3VZhM=
65 a4765077b65e6ae29ba42bab7834717b5072d5ba 0 iD8DBQBQ486sywK+sNU5EO8RAhmJAJ90aLfLKZhmcZN7kqphigQJxiFOQACeJ5IUZxjGKH4xzi3MrgIcx9n+dB0=
65 a4765077b65e6ae29ba42bab7834717b5072d5ba 0 iD8DBQBQ486sywK+sNU5EO8RAhmJAJ90aLfLKZhmcZN7kqphigQJxiFOQACeJ5IUZxjGKH4xzi3MrgIcx9n+dB0=
66 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 0 iD8DBQBQ+yuYywK+sNU5EO8RAm9JAJoD/UciWvpGeKBcpGtZJBFJVcL/HACghDXSgQ+xQDjB+6uGrdgAQsRR1Lg=
66 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 0 iD8DBQBQ+yuYywK+sNU5EO8RAm9JAJoD/UciWvpGeKBcpGtZJBFJVcL/HACghDXSgQ+xQDjB+6uGrdgAQsRR1Lg=
67 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 0 iD8DBQBRDDROywK+sNU5EO8RAh75AJ9uJCGoCWnP0Lv/+XuYs4hvUl+sAgCcD36QgAnuw8IQXrvv684BAXAnHcA=
67 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 0 iD8DBQBRDDROywK+sNU5EO8RAh75AJ9uJCGoCWnP0Lv/+XuYs4hvUl+sAgCcD36QgAnuw8IQXrvv684BAXAnHcA=
68 7511d4df752e61fe7ae4f3682e0a0008573b0402 0 iD8DBQBRFYaoywK+sNU5EO8RAuErAJoDyhXn+lptU3+AevVdwAIeNFyR2gCdHzPHyWd+JDeWCUR+pSOBi8O2ppM=
68 7511d4df752e61fe7ae4f3682e0a0008573b0402 0 iD8DBQBRFYaoywK+sNU5EO8RAuErAJoDyhXn+lptU3+AevVdwAIeNFyR2gCdHzPHyWd+JDeWCUR+pSOBi8O2ppM=
69 5b7175377babacce80a6c1e12366d8032a6d4340 0 iD8DBQBRMCYgywK+sNU5EO8RAq1/AKCWKlt9ysibyQgYwoxxIOZv5J8rpwCcDSHQaaf1fFZUTnQsOePwcM2Y/Sg=
69 5b7175377babacce80a6c1e12366d8032a6d4340 0 iD8DBQBRMCYgywK+sNU5EO8RAq1/AKCWKlt9ysibyQgYwoxxIOZv5J8rpwCcDSHQaaf1fFZUTnQsOePwcM2Y/Sg=
70 50c922c1b5145dab8baefefb0437d363b6a6c21c 0 iD8DBQBRWnUnywK+sNU5EO8RAuQRAJwM42cJqJPeqJ0jVNdMqKMDqr4dSACeP0cRVGz1gitMuV0x8f3mrZrqc7I=
70 50c922c1b5145dab8baefefb0437d363b6a6c21c 0 iD8DBQBRWnUnywK+sNU5EO8RAuQRAJwM42cJqJPeqJ0jVNdMqKMDqr4dSACeP0cRVGz1gitMuV0x8f3mrZrqc7I=
71 8a7bd2dccd44ed571afe7424cd7f95594f27c092 0 iD8DBQBRXfBvywK+sNU5EO8RAn+LAKCsMmflbuXjYRxlzFwId5ptm8TZcwCdGkyLbZcASBOkzQUm/WW1qfknJHU=
71 8a7bd2dccd44ed571afe7424cd7f95594f27c092 0 iD8DBQBRXfBvywK+sNU5EO8RAn+LAKCsMmflbuXjYRxlzFwId5ptm8TZcwCdGkyLbZcASBOkzQUm/WW1qfknJHU=
72 292cd385856d98bacb2c3086f8897bc660c2beea 0 iD8DBQBRcM0BywK+sNU5EO8RAjp4AKCJBykQbvXhKuvLSMxKx3a2TBiXcACfbr/kLg5GlZTF/XDPmY+PyHgI/GM=
72 292cd385856d98bacb2c3086f8897bc660c2beea 0 iD8DBQBRcM0BywK+sNU5EO8RAjp4AKCJBykQbvXhKuvLSMxKx3a2TBiXcACfbr/kLg5GlZTF/XDPmY+PyHgI/GM=
73 23f785b38af38d2fca6b8f3db56b8007a84cd73a 0 iD8DBQBRgZwNywK+sNU5EO8RAmO4AJ4u2ILGuimRP6MJgE2t65LZ5dAdkACgiENEstIdrlFC80p+sWKD81kKIYI=
73 23f785b38af38d2fca6b8f3db56b8007a84cd73a 0 iD8DBQBRgZwNywK+sNU5EO8RAmO4AJ4u2ILGuimRP6MJgE2t65LZ5dAdkACgiENEstIdrlFC80p+sWKD81kKIYI=
74 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 0 iD8DBQBRkswvywK+sNU5EO8RAiYYAJsHTHyHbJeAgmGvBTmDrfcKu4doUgCeLm7eGBjx7yAPUvEtxef8rAkQmXI=
74 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 0 iD8DBQBRkswvywK+sNU5EO8RAiYYAJsHTHyHbJeAgmGvBTmDrfcKu4doUgCeLm7eGBjx7yAPUvEtxef8rAkQmXI=
75 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 0 iD8DBQBRqnFLywK+sNU5EO8RAsWNAJ9RR6t+y1DLFc2HeH0eN9VfZAKF9gCeJ8ezvhtKq/LMs0/nvcgKQc/d5jk=
75 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 0 iD8DBQBRqnFLywK+sNU5EO8RAsWNAJ9RR6t+y1DLFc2HeH0eN9VfZAKF9gCeJ8ezvhtKq/LMs0/nvcgKQc/d5jk=
76 009794acc6e37a650f0fae37872e733382ac1c0c 0 iD8DBQBR0guxywK+sNU5EO8RArNkAKCq9pMihVzP8Os5kCmgbWpe5C37wgCgqzuPZTHvAsXF5wTyaSTMVa9Ccq4=
76 009794acc6e37a650f0fae37872e733382ac1c0c 0 iD8DBQBR0guxywK+sNU5EO8RArNkAKCq9pMihVzP8Os5kCmgbWpe5C37wgCgqzuPZTHvAsXF5wTyaSTMVa9Ccq4=
77 f0d7721d7322dcfb5af33599c2543f27335334bb 0 iD8DBQBR8taaywK+sNU5EO8RAqeEAJ4idDhhDuEsgsUjeQgWNj498matHACfT67gSF5w0ylsrBx1Hb52HkGXDm0=
77 f0d7721d7322dcfb5af33599c2543f27335334bb 0 iD8DBQBR8taaywK+sNU5EO8RAqeEAJ4idDhhDuEsgsUjeQgWNj498matHACfT67gSF5w0ylsrBx1Hb52HkGXDm0=
78 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 0 iD8DBQBR+ymFywK+sNU5EO8RAuSdAJkBMcd9DAZ3rWE9WGKPm2YZ8LBoXACfXn/wbEsVy7ZgJoUwiWmHSnQaWCI=
78 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 0 iD8DBQBR+ymFywK+sNU5EO8RAuSdAJkBMcd9DAZ3rWE9WGKPm2YZ8LBoXACfXn/wbEsVy7ZgJoUwiWmHSnQaWCI=
79 335a558f81dc73afeab4d7be63617392b130117f 0 iQIVAwUAUiZrIyBXgaxoKi1yAQK2iw//cquNqqSkc8Re5/TZT9I6NH+lh6DbOKjJP0Xl1Wqq0K+KSIUgZG4G32ovaEb2l5X0uY+3unRPiZ0ebl0YSw4Fb2ZiPIADXLBTOYRrY2Wwd3tpJeGI6wEgZt3SfcITV/g7NJrCjT3FlYoSOIayrExM80InSdcEM0Q3Rx6HKzY2acyxzgZeAtAW5ohFvHilSvY6p5Gcm4+QptMxvw45GPdreUmjeXZxNXNXZ8P+MjMz/QJbai/N7PjmK8lqnhkBsT48Ng/KhhmOkGntNJ2/ImBWLFGcWngSvJ7sfWwnyhndvGhe0Hq1NcCf7I8TjNDxU5TR+m+uW7xjXdLoDbUjBdX4sKXnh8ZjbYiODKBOrrDq25cf8nA/tnpKyE/qsVy60kOk6loY4XKiYmn1V49Ta0emmDx0hqo3HgxHHsHX0NDnGdWGol7cPRET0RzVobKq1A0jnrhPooWidvLh9bPzLonrWDo+ib+DuySoRkuYUK4pgZJ2mbg6daFOBEZygkSyRB8bo1UQUP7EgQDrWe4khb/5GHEfDkrQz3qu/sXvc0Ir1mOUWBFPHC2DjjCn/oMJuUkG1SwM8l2Bfv7h67ssES6YQ2+RjOix4yid7EXS/Ogl45PzCIPSI5+BbNs10JhE0w5uErBHlF53EDTe/TSLc+GU6DB6PP6dH912Njdr3jpNSUQ=
79 335a558f81dc73afeab4d7be63617392b130117f 0 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
@@ -1,104 +1,105 b''
1 d40cc5aacc31ed673d9b5b24f98bee78c283062c 0.4f
1 d40cc5aacc31ed673d9b5b24f98bee78c283062c 0.4f
2 1c590d34bf61e2ea12c71738e5a746cd74586157 0.4e
2 1c590d34bf61e2ea12c71738e5a746cd74586157 0.4e
3 7eca4cfa8aad5fce9a04f7d8acadcd0452e2f34e 0.4d
3 7eca4cfa8aad5fce9a04f7d8acadcd0452e2f34e 0.4d
4 b4d0c3786ad3e47beacf8412157326a32b6d25a4 0.4c
4 b4d0c3786ad3e47beacf8412157326a32b6d25a4 0.4c
5 f40273b0ad7b3a6d3012fd37736d0611f41ecf54 0.5
5 f40273b0ad7b3a6d3012fd37736d0611f41ecf54 0.5
6 0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 0.5b
6 0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 0.5b
7 12e0fdbc57a0be78f0e817fd1d170a3615cd35da 0.6
7 12e0fdbc57a0be78f0e817fd1d170a3615cd35da 0.6
8 4ccf3de52989b14c3d84e1097f59e39a992e00bd 0.6b
8 4ccf3de52989b14c3d84e1097f59e39a992e00bd 0.6b
9 eac9c8efcd9bd8244e72fb6821f769f450457a32 0.6c
9 eac9c8efcd9bd8244e72fb6821f769f450457a32 0.6c
10 979c049974485125e1f9357f6bbe9c1b548a64c3 0.7
10 979c049974485125e1f9357f6bbe9c1b548a64c3 0.7
11 3a56574f329a368d645853e0f9e09472aee62349 0.8
11 3a56574f329a368d645853e0f9e09472aee62349 0.8
12 6a03cff2b0f5d30281e6addefe96b993582f2eac 0.8.1
12 6a03cff2b0f5d30281e6addefe96b993582f2eac 0.8.1
13 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0.9
13 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0.9
14 2be3001847cb18a23c403439d9e7d0ace30804e9 0.9.1
14 2be3001847cb18a23c403439d9e7d0ace30804e9 0.9.1
15 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0.9.2
15 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0.9.2
16 27230c29bfec36d5540fbe1c976810aefecfd1d2 0.9.3
16 27230c29bfec36d5540fbe1c976810aefecfd1d2 0.9.3
17 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0.9.4
17 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0.9.4
18 23889160905a1b09fffe1c07378e9fc1827606eb 0.9.5
18 23889160905a1b09fffe1c07378e9fc1827606eb 0.9.5
19 bae2e9c838e90a393bae3973a7850280413e091a 1.0
19 bae2e9c838e90a393bae3973a7850280413e091a 1.0
20 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 1.0.1
20 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 1.0.1
21 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 1.0.2
21 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 1.0.2
22 2a67430f92f15ea5159c26b09ec4839a0c549a26 1.1
22 2a67430f92f15ea5159c26b09ec4839a0c549a26 1.1
23 3773e510d433969e277b1863c317b674cbee2065 1.1.1
23 3773e510d433969e277b1863c317b674cbee2065 1.1.1
24 11a4eb81fb4f4742451591489e2797dc47903277 1.1.2
24 11a4eb81fb4f4742451591489e2797dc47903277 1.1.2
25 11efa41037e280d08cfb07c09ad485df30fb0ea8 1.2
25 11efa41037e280d08cfb07c09ad485df30fb0ea8 1.2
26 02981000012e3adf40c4849bd7b3d5618f9ce82d 1.2.1
26 02981000012e3adf40c4849bd7b3d5618f9ce82d 1.2.1
27 196d40e7c885fa6e95f89134809b3ec7bdbca34b 1.3
27 196d40e7c885fa6e95f89134809b3ec7bdbca34b 1.3
28 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 1.3.1
28 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 1.3.1
29 31ec469f9b556f11819937cf68ee53f2be927ebf 1.4
29 31ec469f9b556f11819937cf68ee53f2be927ebf 1.4
30 439d7ea6fe3aa4ab9ec274a68846779153789de9 1.4.1
30 439d7ea6fe3aa4ab9ec274a68846779153789de9 1.4.1
31 296a0b14a68621f6990c54fdba0083f6f20935bf 1.4.2
31 296a0b14a68621f6990c54fdba0083f6f20935bf 1.4.2
32 4aa619c4c2c09907034d9824ebb1dd0e878206eb 1.4.3
32 4aa619c4c2c09907034d9824ebb1dd0e878206eb 1.4.3
33 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 1.5
33 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 1.5
34 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 1.5.1
34 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 1.5.1
35 39f725929f0c48c5fb3b90c071fc3066012456ca 1.5.2
35 39f725929f0c48c5fb3b90c071fc3066012456ca 1.5.2
36 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 1.5.3
36 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 1.5.3
37 24fe2629c6fd0c74c90bd066e77387c2b02e8437 1.5.4
37 24fe2629c6fd0c74c90bd066e77387c2b02e8437 1.5.4
38 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 1.6
38 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 1.6
39 bf1774d95bde614af3956d92b20e2a0c68c5fec7 1.6.1
39 bf1774d95bde614af3956d92b20e2a0c68c5fec7 1.6.1
40 c00f03a4982e467fb6b6bd45908767db6df4771d 1.6.2
40 c00f03a4982e467fb6b6bd45908767db6df4771d 1.6.2
41 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 1.6.3
41 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 1.6.3
42 93d8bff78c96fe7e33237b257558ee97290048a4 1.6.4
42 93d8bff78c96fe7e33237b257558ee97290048a4 1.6.4
43 333421b9e0f96c7bc788e5667c146a58a9440a55 1.7
43 333421b9e0f96c7bc788e5667c146a58a9440a55 1.7
44 4438875ec01bd0fc32be92b0872eb6daeed4d44f 1.7.1
44 4438875ec01bd0fc32be92b0872eb6daeed4d44f 1.7.1
45 6aff4f144ad356311318b0011df0bb21f2c97429 1.7.2
45 6aff4f144ad356311318b0011df0bb21f2c97429 1.7.2
46 e3bf16703e2601de99e563cdb3a5d50b64e6d320 1.7.3
46 e3bf16703e2601de99e563cdb3a5d50b64e6d320 1.7.3
47 a6c855c32ea081da3c3b8ff628f1847ff271482f 1.7.4
47 a6c855c32ea081da3c3b8ff628f1847ff271482f 1.7.4
48 2b2155623ee2559caf288fd333f30475966c4525 1.7.5
48 2b2155623ee2559caf288fd333f30475966c4525 1.7.5
49 2616325766e3504c8ae7c84bd15ee610901fe91d 1.8
49 2616325766e3504c8ae7c84bd15ee610901fe91d 1.8
50 aa1f3be38ab127280761889d2dca906ca465b5f4 1.8.1
50 aa1f3be38ab127280761889d2dca906ca465b5f4 1.8.1
51 b032bec2c0a651ca0ddecb65714bfe6770f67d70 1.8.2
51 b032bec2c0a651ca0ddecb65714bfe6770f67d70 1.8.2
52 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 1.8.3
52 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 1.8.3
53 733af5d9f6b22387913e1d11350fb8cb7c1487dd 1.8.4
53 733af5d9f6b22387913e1d11350fb8cb7c1487dd 1.8.4
54 de9eb6b1da4fc522b1cab16d86ca166204c24f25 1.9
54 de9eb6b1da4fc522b1cab16d86ca166204c24f25 1.9
55 4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1
55 4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1
56 d629f1e89021103f1753addcef6b310e4435b184 1.9.2
56 d629f1e89021103f1753addcef6b310e4435b184 1.9.2
57 351a9292e430e35766c552066ed3e87c557b803b 1.9.3
57 351a9292e430e35766c552066ed3e87c557b803b 1.9.3
58 384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
58 384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
59 41453d55b481ddfcc1dacb445179649e24ca861d 2.0
59 41453d55b481ddfcc1dacb445179649e24ca861d 2.0
60 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1
60 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1
61 6344043924497cd06d781d9014c66802285072e4 2.0.2
61 6344043924497cd06d781d9014c66802285072e4 2.0.2
62 db33555eafeaf9df1e18950e29439eaa706d399b 2.1-rc
62 db33555eafeaf9df1e18950e29439eaa706d399b 2.1-rc
63 2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1
63 2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1
64 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1
64 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1
65 b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2
65 b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2
66 d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc
66 d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc
67 00182b3d087909e3c3ae44761efecdde8f319ef3 2.2
67 00182b3d087909e3c3ae44761efecdde8f319ef3 2.2
68 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 2.2.1
68 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 2.2.1
69 85a358df5bbbe404ca25730c9c459b34263441dc 2.2.2
69 85a358df5bbbe404ca25730c9c459b34263441dc 2.2.2
70 b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3
70 b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3
71 a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc
71 a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc
72 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 2.3
72 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 2.3
73 072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1
73 072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1
74 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 2.3.2
74 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 2.3.2
75 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 2.4-rc
75 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 2.4-rc
76 195ad823b5d58c68903a6153a25e3fb4ed25239d 2.4
76 195ad823b5d58c68903a6153a25e3fb4ed25239d 2.4
77 0c10cf8191469e7c3c8844922e17e71a176cb7cb 2.4.1
77 0c10cf8191469e7c3c8844922e17e71a176cb7cb 2.4.1
78 a4765077b65e6ae29ba42bab7834717b5072d5ba 2.4.2
78 a4765077b65e6ae29ba42bab7834717b5072d5ba 2.4.2
79 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 2.5-rc
79 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 2.5-rc
80 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 2.5
80 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 2.5
81 7511d4df752e61fe7ae4f3682e0a0008573b0402 2.5.1
81 7511d4df752e61fe7ae4f3682e0a0008573b0402 2.5.1
82 5b7175377babacce80a6c1e12366d8032a6d4340 2.5.2
82 5b7175377babacce80a6c1e12366d8032a6d4340 2.5.2
83 50c922c1b5145dab8baefefb0437d363b6a6c21c 2.5.3
83 50c922c1b5145dab8baefefb0437d363b6a6c21c 2.5.3
84 8a7bd2dccd44ed571afe7424cd7f95594f27c092 2.5.4
84 8a7bd2dccd44ed571afe7424cd7f95594f27c092 2.5.4
85 292cd385856d98bacb2c3086f8897bc660c2beea 2.6-rc
85 292cd385856d98bacb2c3086f8897bc660c2beea 2.6-rc
86 23f785b38af38d2fca6b8f3db56b8007a84cd73a 2.6
86 23f785b38af38d2fca6b8f3db56b8007a84cd73a 2.6
87 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 2.6.1
87 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 2.6.1
88 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 2.6.2
88 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 2.6.2
89 009794acc6e37a650f0fae37872e733382ac1c0c 2.6.3
89 009794acc6e37a650f0fae37872e733382ac1c0c 2.6.3
90 f0d7721d7322dcfb5af33599c2543f27335334bb 2.7-rc
90 f0d7721d7322dcfb5af33599c2543f27335334bb 2.7-rc
91 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 2.7
91 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 2.7
92 335a558f81dc73afeab4d7be63617392b130117f 2.7.1
92 335a558f81dc73afeab4d7be63617392b130117f 2.7.1
93 e7fa36d2ad3a7944a52dca126458d6f482db3524 2.7.2
93 e7fa36d2ad3a7944a52dca126458d6f482db3524 2.7.2
94 1596f2d8f2421314b1ddead8f7d0c91009358994 2.8-rc
94 1596f2d8f2421314b1ddead8f7d0c91009358994 2.8-rc
95 d825e4025e39d1c39db943cdc89818abd0a87c27 2.8
95 d825e4025e39d1c39db943cdc89818abd0a87c27 2.8
96 209e04a06467e2969c0cc6501335be0406d46ef0 2.8.1
96 209e04a06467e2969c0cc6501335be0406d46ef0 2.8.1
97 ca387377df7a3a67dbb90b6336b781cdadc3ef41 2.8.2
97 ca387377df7a3a67dbb90b6336b781cdadc3ef41 2.8.2
98 8862469e16f9236208581b20de5f96bd13cc039d 2.9-rc
98 8862469e16f9236208581b20de5f96bd13cc039d 2.9-rc
99 3cec5134e9c4bceab6a00c60f52a4f80677a78f2 2.9
99 3cec5134e9c4bceab6a00c60f52a4f80677a78f2 2.9
100 b96cb15ec9e04d8ac5ee08b34fcbbe4200588965 2.9.1
100 b96cb15ec9e04d8ac5ee08b34fcbbe4200588965 2.9.1
101 3f83fc5cfe715d292069ee8417c83804f6c6c1e4 2.9.2
101 3f83fc5cfe715d292069ee8417c83804f6c6c1e4 2.9.2
102 564f55b251224f16508dd1311452db7780dafe2b 3.0-rc
102 564f55b251224f16508dd1311452db7780dafe2b 3.0-rc
103 2195ac506c6ababe86985b932f4948837c0891b5 3.0
103 2195ac506c6ababe86985b932f4948837c0891b5 3.0
104 269c80ee5b3cb3684fa8edc61501b3506d02eb10 3.0.1
104 269c80ee5b3cb3684fa8edc61501b3506d02eb10 3.0.1
105 2d8cd3d0e83c7336c0cb45a9f88638363f993848 3.0.2
@@ -1,961 +1,970 b''
1 # rebase.py - rebasing feature for mercurial
1 # rebase.py - rebasing feature for mercurial
2 #
2 #
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com>
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 '''command to move sets of revisions to a different ancestor
8 '''command to move sets of revisions to a different ancestor
9
9
10 This extension lets you rebase changesets in an existing Mercurial
10 This extension lets you rebase changesets in an existing Mercurial
11 repository.
11 repository.
12
12
13 For more information:
13 For more information:
14 http://mercurial.selenic.com/wiki/RebaseExtension
14 http://mercurial.selenic.com/wiki/RebaseExtension
15 '''
15 '''
16
16
17 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
17 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
18 from mercurial import extensions, patch, scmutil, phases, obsolete, error
18 from mercurial import extensions, patch, scmutil, phases, obsolete, error
19 from mercurial.commands import templateopts
19 from mercurial.commands import templateopts
20 from mercurial.node import nullrev
20 from mercurial.node import nullrev
21 from mercurial.lock import release
21 from mercurial.lock import release
22 from mercurial.i18n import _
22 from mercurial.i18n import _
23 import os, errno
23 import os, errno
24
24
25 nullmerge = -2
25 nullmerge = -2
26 revignored = -3
26 revignored = -3
27
27
28 cmdtable = {}
28 cmdtable = {}
29 command = cmdutil.command(cmdtable)
29 command = cmdutil.command(cmdtable)
30 testedwith = 'internal'
30 testedwith = 'internal'
31
31
32 def _savegraft(ctx, extra):
32 def _savegraft(ctx, extra):
33 s = ctx.extra().get('source', None)
33 s = ctx.extra().get('source', None)
34 if s is not None:
34 if s is not None:
35 extra['source'] = s
35 extra['source'] = s
36
36
37 def _savebranch(ctx, extra):
37 def _savebranch(ctx, extra):
38 extra['branch'] = ctx.branch()
38 extra['branch'] = ctx.branch()
39
39
40 def _makeextrafn(copiers):
40 def _makeextrafn(copiers):
41 """make an extrafn out of the given copy-functions.
41 """make an extrafn out of the given copy-functions.
42
42
43 A copy function takes a context and an extra dict, and mutates the
43 A copy function takes a context and an extra dict, and mutates the
44 extra dict as needed based on the given context.
44 extra dict as needed based on the given context.
45 """
45 """
46 def extrafn(ctx, extra):
46 def extrafn(ctx, extra):
47 for c in copiers:
47 for c in copiers:
48 c(ctx, extra)
48 c(ctx, extra)
49 return extrafn
49 return extrafn
50
50
51 @command('rebase',
51 @command('rebase',
52 [('s', 'source', '',
52 [('s', 'source', '',
53 _('rebase from the specified changeset'), _('REV')),
53 _('rebase from the specified changeset'), _('REV')),
54 ('b', 'base', '',
54 ('b', 'base', '',
55 _('rebase from the base of the specified changeset '
55 _('rebase from the base of the specified changeset '
56 '(up to greatest common ancestor of base and dest)'),
56 '(up to greatest common ancestor of base and dest)'),
57 _('REV')),
57 _('REV')),
58 ('r', 'rev', [],
58 ('r', 'rev', [],
59 _('rebase these revisions'),
59 _('rebase these revisions'),
60 _('REV')),
60 _('REV')),
61 ('d', 'dest', '',
61 ('d', 'dest', '',
62 _('rebase onto the specified changeset'), _('REV')),
62 _('rebase onto the specified changeset'), _('REV')),
63 ('', 'collapse', False, _('collapse the rebased changesets')),
63 ('', 'collapse', False, _('collapse the rebased changesets')),
64 ('m', 'message', '',
64 ('m', 'message', '',
65 _('use text as collapse commit message'), _('TEXT')),
65 _('use text as collapse commit message'), _('TEXT')),
66 ('e', 'edit', False, _('invoke editor on commit messages')),
66 ('e', 'edit', False, _('invoke editor on commit messages')),
67 ('l', 'logfile', '',
67 ('l', 'logfile', '',
68 _('read collapse commit message from file'), _('FILE')),
68 _('read collapse commit message from file'), _('FILE')),
69 ('', 'keep', False, _('keep original changesets')),
69 ('', 'keep', False, _('keep original changesets')),
70 ('', 'keepbranches', False, _('keep original branch names')),
70 ('', 'keepbranches', False, _('keep original branch names')),
71 ('D', 'detach', False, _('(DEPRECATED)')),
71 ('D', 'detach', False, _('(DEPRECATED)')),
72 ('t', 'tool', '', _('specify merge tool')),
72 ('t', 'tool', '', _('specify merge tool')),
73 ('c', 'continue', False, _('continue an interrupted rebase')),
73 ('c', 'continue', False, _('continue an interrupted rebase')),
74 ('a', 'abort', False, _('abort an interrupted rebase'))] +
74 ('a', 'abort', False, _('abort an interrupted rebase'))] +
75 templateopts,
75 templateopts,
76 _('[-s REV | -b REV] [-d REV] [OPTION]'))
76 _('[-s REV | -b REV] [-d REV] [OPTION]'))
77 def rebase(ui, repo, **opts):
77 def rebase(ui, repo, **opts):
78 """move changeset (and descendants) to a different branch
78 """move changeset (and descendants) to a different branch
79
79
80 Rebase uses repeated merging to graft changesets from one part of
80 Rebase uses repeated merging to graft changesets from one part of
81 history (the source) onto another (the destination). This can be
81 history (the source) onto another (the destination). This can be
82 useful for linearizing *local* changes relative to a master
82 useful for linearizing *local* changes relative to a master
83 development tree.
83 development tree.
84
84
85 You should not rebase changesets that have already been shared
85 You should not rebase changesets that have already been shared
86 with others. Doing so will force everybody else to perform the
86 with others. Doing so will force everybody else to perform the
87 same rebase or they will end up with duplicated changesets after
87 same rebase or they will end up with duplicated changesets after
88 pulling in your rebased changesets.
88 pulling in your rebased changesets.
89
89
90 In its default configuration, Mercurial will prevent you from
90 In its default configuration, Mercurial will prevent you from
91 rebasing published changes. See :hg:`help phases` for details.
91 rebasing published changes. See :hg:`help phases` for details.
92
92
93 If you don't specify a destination changeset (``-d/--dest``),
93 If you don't specify a destination changeset (``-d/--dest``),
94 rebase uses the current branch tip as the destination. (The
94 rebase uses the current branch tip as the destination. (The
95 destination changeset is not modified by rebasing, but new
95 destination changeset is not modified by rebasing, but new
96 changesets are added as its descendants.)
96 changesets are added as its descendants.)
97
97
98 You can specify which changesets to rebase in two ways: as a
98 You can specify which changesets to rebase in two ways: as a
99 "source" changeset or as a "base" changeset. Both are shorthand
99 "source" changeset or as a "base" changeset. Both are shorthand
100 for a topologically related set of changesets (the "source
100 for a topologically related set of changesets (the "source
101 branch"). If you specify source (``-s/--source``), rebase will
101 branch"). If you specify source (``-s/--source``), rebase will
102 rebase that changeset and all of its descendants onto dest. If you
102 rebase that changeset and all of its descendants onto dest. If you
103 specify base (``-b/--base``), rebase will select ancestors of base
103 specify base (``-b/--base``), rebase will select ancestors of base
104 back to but not including the common ancestor with dest. Thus,
104 back to but not including the common ancestor with dest. Thus,
105 ``-b`` is less precise but more convenient than ``-s``: you can
105 ``-b`` is less precise but more convenient than ``-s``: you can
106 specify any changeset in the source branch, and rebase will select
106 specify any changeset in the source branch, and rebase will select
107 the whole branch. If you specify neither ``-s`` nor ``-b``, rebase
107 the whole branch. If you specify neither ``-s`` nor ``-b``, rebase
108 uses the parent of the working directory as the base.
108 uses the parent of the working directory as the base.
109
109
110 For advanced usage, a third way is available through the ``--rev``
110 For advanced usage, a third way is available through the ``--rev``
111 option. It allows you to specify an arbitrary set of changesets to
111 option. It allows you to specify an arbitrary set of changesets to
112 rebase. Descendants of revs you specify with this option are not
112 rebase. Descendants of revs you specify with this option are not
113 automatically included in the rebase.
113 automatically included in the rebase.
114
114
115 By default, rebase recreates the changesets in the source branch
115 By default, rebase recreates the changesets in the source branch
116 as descendants of dest and then destroys the originals. Use
116 as descendants of dest and then destroys the originals. Use
117 ``--keep`` to preserve the original source changesets. Some
117 ``--keep`` to preserve the original source changesets. Some
118 changesets in the source branch (e.g. merges from the destination
118 changesets in the source branch (e.g. merges from the destination
119 branch) may be dropped if they no longer contribute any change.
119 branch) may be dropped if they no longer contribute any change.
120
120
121 One result of the rules for selecting the destination changeset
121 One result of the rules for selecting the destination changeset
122 and source branch is that, unlike ``merge``, rebase will do
122 and source branch is that, unlike ``merge``, rebase will do
123 nothing if you are at the branch tip of a named branch
123 nothing if you are at the branch tip of a named branch
124 with two heads. You need to explicitly specify source and/or
124 with two heads. You need to explicitly specify source and/or
125 destination (or ``update`` to the other head, if it's the head of
125 destination (or ``update`` to the other head, if it's the head of
126 the intended source branch).
126 the intended source branch).
127
127
128 If a rebase is interrupted to manually resolve a merge, it can be
128 If a rebase is interrupted to manually resolve a merge, it can be
129 continued with --continue/-c or aborted with --abort/-a.
129 continued with --continue/-c or aborted with --abort/-a.
130
130
131 Returns 0 on success, 1 if nothing to rebase or there are
131 Returns 0 on success, 1 if nothing to rebase or there are
132 unresolved conflicts.
132 unresolved conflicts.
133 """
133 """
134 originalwd = target = None
134 originalwd = target = None
135 activebookmark = None
135 activebookmark = None
136 external = nullrev
136 external = nullrev
137 state = {}
137 state = {}
138 skipped = set()
138 skipped = set()
139 targetancestors = set()
139 targetancestors = set()
140
140
141 editor = cmdutil.getcommiteditor(**opts)
141 editor = cmdutil.getcommiteditor(**opts)
142
142
143 lock = wlock = None
143 lock = wlock = None
144 try:
144 try:
145 wlock = repo.wlock()
145 wlock = repo.wlock()
146 lock = repo.lock()
146 lock = repo.lock()
147
147
148 # Validate input and define rebasing points
148 # Validate input and define rebasing points
149 destf = opts.get('dest', None)
149 destf = opts.get('dest', None)
150 srcf = opts.get('source', None)
150 srcf = opts.get('source', None)
151 basef = opts.get('base', None)
151 basef = opts.get('base', None)
152 revf = opts.get('rev', [])
152 revf = opts.get('rev', [])
153 contf = opts.get('continue')
153 contf = opts.get('continue')
154 abortf = opts.get('abort')
154 abortf = opts.get('abort')
155 collapsef = opts.get('collapse', False)
155 collapsef = opts.get('collapse', False)
156 collapsemsg = cmdutil.logmessage(ui, opts)
156 collapsemsg = cmdutil.logmessage(ui, opts)
157 e = opts.get('extrafn') # internal, used by e.g. hgsubversion
157 e = opts.get('extrafn') # internal, used by e.g. hgsubversion
158 extrafns = [_savegraft]
158 extrafns = [_savegraft]
159 if e:
159 if e:
160 extrafns = [e]
160 extrafns = [e]
161 keepf = opts.get('keep', False)
161 keepf = opts.get('keep', False)
162 keepbranchesf = opts.get('keepbranches', False)
162 keepbranchesf = opts.get('keepbranches', False)
163 # keepopen is not meant for use on the command line, but by
163 # keepopen is not meant for use on the command line, but by
164 # other extensions
164 # other extensions
165 keepopen = opts.get('keepopen', False)
165 keepopen = opts.get('keepopen', False)
166
166
167 if collapsemsg and not collapsef:
167 if collapsemsg and not collapsef:
168 raise util.Abort(
168 raise util.Abort(
169 _('message can only be specified with collapse'))
169 _('message can only be specified with collapse'))
170
170
171 if contf or abortf:
171 if contf or abortf:
172 if contf and abortf:
172 if contf and abortf:
173 raise util.Abort(_('cannot use both abort and continue'))
173 raise util.Abort(_('cannot use both abort and continue'))
174 if collapsef:
174 if collapsef:
175 raise util.Abort(
175 raise util.Abort(
176 _('cannot use collapse with continue or abort'))
176 _('cannot use collapse with continue or abort'))
177 if srcf or basef or destf:
177 if srcf or basef or destf:
178 raise util.Abort(
178 raise util.Abort(
179 _('abort and continue do not allow specifying revisions'))
179 _('abort and continue do not allow specifying revisions'))
180 if opts.get('tool', False):
180 if opts.get('tool', False):
181 ui.warn(_('tool option will be ignored\n'))
181 ui.warn(_('tool option will be ignored\n'))
182
182
183 try:
183 try:
184 (originalwd, target, state, skipped, collapsef, keepf,
184 (originalwd, target, state, skipped, collapsef, keepf,
185 keepbranchesf, external, activebookmark) = restorestatus(repo)
185 keepbranchesf, external, activebookmark) = restorestatus(repo)
186 except error.RepoLookupError:
186 except error.RepoLookupError:
187 if abortf:
187 if abortf:
188 clearstatus(repo)
188 clearstatus(repo)
189 repo.ui.warn(_('rebase aborted (no revision is removed,'
189 repo.ui.warn(_('rebase aborted (no revision is removed,'
190 ' only broken state is cleared)\n'))
190 ' only broken state is cleared)\n'))
191 return 0
191 return 0
192 else:
192 else:
193 msg = _('cannot continue inconsistent rebase')
193 msg = _('cannot continue inconsistent rebase')
194 hint = _('use "hg rebase --abort" to clear broken state')
194 hint = _('use "hg rebase --abort" to clear broken state')
195 raise util.Abort(msg, hint=hint)
195 raise util.Abort(msg, hint=hint)
196 if abortf:
196 if abortf:
197 return abort(repo, originalwd, target, state)
197 return abort(repo, originalwd, target, state)
198 else:
198 else:
199 if srcf and basef:
199 if srcf and basef:
200 raise util.Abort(_('cannot specify both a '
200 raise util.Abort(_('cannot specify both a '
201 'source and a base'))
201 'source and a base'))
202 if revf and basef:
202 if revf and basef:
203 raise util.Abort(_('cannot specify both a '
203 raise util.Abort(_('cannot specify both a '
204 'revision and a base'))
204 'revision and a base'))
205 if revf and srcf:
205 if revf and srcf:
206 raise util.Abort(_('cannot specify both a '
206 raise util.Abort(_('cannot specify both a '
207 'revision and a source'))
207 'revision and a source'))
208
208
209 cmdutil.checkunfinished(repo)
209 cmdutil.checkunfinished(repo)
210 cmdutil.bailifchanged(repo)
210 cmdutil.bailifchanged(repo)
211
211
212 if not destf:
212 if not destf:
213 # Destination defaults to the latest revision in the
213 # Destination defaults to the latest revision in the
214 # current branch
214 # current branch
215 branch = repo[None].branch()
215 branch = repo[None].branch()
216 dest = repo[branch]
216 dest = repo[branch]
217 else:
217 else:
218 dest = scmutil.revsingle(repo, destf)
218 dest = scmutil.revsingle(repo, destf)
219
219
220 if revf:
220 if revf:
221 rebaseset = scmutil.revrange(repo, revf)
221 rebaseset = scmutil.revrange(repo, revf)
222 if not rebaseset:
222 if not rebaseset:
223 ui.status(_('empty "rev" revision set - '
223 ui.status(_('empty "rev" revision set - '
224 'nothing to rebase\n'))
224 'nothing to rebase\n'))
225 return 1
225 return 1
226 elif srcf:
226 elif srcf:
227 src = scmutil.revrange(repo, [srcf])
227 src = scmutil.revrange(repo, [srcf])
228 if not src:
228 if not src:
229 ui.status(_('empty "source" revision set - '
229 ui.status(_('empty "source" revision set - '
230 'nothing to rebase\n'))
230 'nothing to rebase\n'))
231 return 1
231 return 1
232 rebaseset = repo.revs('(%ld)::', src)
232 rebaseset = repo.revs('(%ld)::', src)
233 assert rebaseset
233 assert rebaseset
234 else:
234 else:
235 base = scmutil.revrange(repo, [basef or '.'])
235 base = scmutil.revrange(repo, [basef or '.'])
236 if not base:
236 if not base:
237 ui.status(_('empty "base" revision set - '
237 ui.status(_('empty "base" revision set - '
238 "can't compute rebase set\n"))
238 "can't compute rebase set\n"))
239 return 1
239 return 1
240 rebaseset = repo.revs(
240 rebaseset = repo.revs(
241 '(children(ancestor(%ld, %d)) and ::(%ld))::',
241 '(children(ancestor(%ld, %d)) and ::(%ld))::',
242 base, dest, base)
242 base, dest, base)
243 if not rebaseset:
243 if not rebaseset:
244 if base == [dest.rev()]:
244 if base == [dest.rev()]:
245 if basef:
245 if basef:
246 ui.status(_('nothing to rebase - %s is both "base"'
246 ui.status(_('nothing to rebase - %s is both "base"'
247 ' and destination\n') % dest)
247 ' and destination\n') % dest)
248 else:
248 else:
249 ui.status(_('nothing to rebase - working directory '
249 ui.status(_('nothing to rebase - working directory '
250 'parent is also destination\n'))
250 'parent is also destination\n'))
251 elif not repo.revs('%ld - ::%d', base, dest):
251 elif not repo.revs('%ld - ::%d', base, dest):
252 if basef:
252 if basef:
253 ui.status(_('nothing to rebase - "base" %s is '
253 ui.status(_('nothing to rebase - "base" %s is '
254 'already an ancestor of destination '
254 'already an ancestor of destination '
255 '%s\n') %
255 '%s\n') %
256 ('+'.join(str(repo[r]) for r in base),
256 ('+'.join(str(repo[r]) for r in base),
257 dest))
257 dest))
258 else:
258 else:
259 ui.status(_('nothing to rebase - working '
259 ui.status(_('nothing to rebase - working '
260 'directory parent is already an '
260 'directory parent is already an '
261 'ancestor of destination %s\n') % dest)
261 'ancestor of destination %s\n') % dest)
262 else: # can it happen?
262 else: # can it happen?
263 ui.status(_('nothing to rebase from %s to %s\n') %
263 ui.status(_('nothing to rebase from %s to %s\n') %
264 ('+'.join(str(repo[r]) for r in base), dest))
264 ('+'.join(str(repo[r]) for r in base), dest))
265 return 1
265 return 1
266
266
267 if (not (keepf or obsolete._enabled)
267 if (not (keepf or obsolete._enabled)
268 and repo.revs('first(children(%ld) - %ld)',
268 and repo.revs('first(children(%ld) - %ld)',
269 rebaseset, rebaseset)):
269 rebaseset, rebaseset)):
270 raise util.Abort(
270 raise util.Abort(
271 _("can't remove original changesets with"
271 _("can't remove original changesets with"
272 " unrebased descendants"),
272 " unrebased descendants"),
273 hint=_('use --keep to keep original changesets'))
273 hint=_('use --keep to keep original changesets'))
274
274
275 result = buildstate(repo, dest, rebaseset, collapsef)
275 result = buildstate(repo, dest, rebaseset, collapsef)
276 if not result:
276 if not result:
277 # Empty state built, nothing to rebase
277 # Empty state built, nothing to rebase
278 ui.status(_('nothing to rebase\n'))
278 ui.status(_('nothing to rebase\n'))
279 return 1
279 return 1
280
280
281 root = min(rebaseset)
281 root = min(rebaseset)
282 if not keepf and not repo[root].mutable():
282 if not keepf and not repo[root].mutable():
283 raise util.Abort(_("can't rebase immutable changeset %s")
283 raise util.Abort(_("can't rebase immutable changeset %s")
284 % repo[root],
284 % repo[root],
285 hint=_('see hg help phases for details'))
285 hint=_('see hg help phases for details'))
286
286
287 originalwd, target, state = result
287 originalwd, target, state = result
288 if collapsef:
288 if collapsef:
289 targetancestors = repo.changelog.ancestors([target],
289 targetancestors = repo.changelog.ancestors([target],
290 inclusive=True)
290 inclusive=True)
291 external = externalparent(repo, state, targetancestors)
291 external = externalparent(repo, state, targetancestors)
292
292
293 if dest.closesbranch() and not keepbranchesf:
293 if dest.closesbranch() and not keepbranchesf:
294 ui.status(_('reopening closed branch head %s\n') % dest)
294 ui.status(_('reopening closed branch head %s\n') % dest)
295
295
296 if keepbranchesf:
296 if keepbranchesf:
297 # insert _savebranch at the start of extrafns so if
297 # insert _savebranch at the start of extrafns so if
298 # there's a user-provided extrafn it can clobber branch if
298 # there's a user-provided extrafn it can clobber branch if
299 # desired
299 # desired
300 extrafns.insert(0, _savebranch)
300 extrafns.insert(0, _savebranch)
301 if collapsef:
301 if collapsef:
302 branches = set()
302 branches = set()
303 for rev in state:
303 for rev in state:
304 branches.add(repo[rev].branch())
304 branches.add(repo[rev].branch())
305 if len(branches) > 1:
305 if len(branches) > 1:
306 raise util.Abort(_('cannot collapse multiple named '
306 raise util.Abort(_('cannot collapse multiple named '
307 'branches'))
307 'branches'))
308
308
309 # Rebase
309 # Rebase
310 if not targetancestors:
310 if not targetancestors:
311 targetancestors = repo.changelog.ancestors([target], inclusive=True)
311 targetancestors = repo.changelog.ancestors([target], inclusive=True)
312
312
313 # Keep track of the current bookmarks in order to reset them later
313 # Keep track of the current bookmarks in order to reset them later
314 currentbookmarks = repo._bookmarks.copy()
314 currentbookmarks = repo._bookmarks.copy()
315 activebookmark = activebookmark or repo._bookmarkcurrent
315 activebookmark = activebookmark or repo._bookmarkcurrent
316 if activebookmark:
316 if activebookmark:
317 bookmarks.unsetcurrent(repo)
317 bookmarks.unsetcurrent(repo)
318
318
319 extrafn = _makeextrafn(extrafns)
319 extrafn = _makeextrafn(extrafns)
320
320
321 sortedstate = sorted(state)
321 sortedstate = sorted(state)
322 total = len(sortedstate)
322 total = len(sortedstate)
323 pos = 0
323 pos = 0
324 for rev in sortedstate:
324 for rev in sortedstate:
325 pos += 1
325 pos += 1
326 if state[rev] == -1:
326 if state[rev] == -1:
327 ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, repo[rev])),
327 ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, repo[rev])),
328 _('changesets'), total)
328 _('changesets'), total)
329 p1, p2 = defineparents(repo, rev, target, state,
329 p1, p2 = defineparents(repo, rev, target, state,
330 targetancestors)
330 targetancestors)
331 storestatus(repo, originalwd, target, state, collapsef, keepf,
331 storestatus(repo, originalwd, target, state, collapsef, keepf,
332 keepbranchesf, external, activebookmark)
332 keepbranchesf, external, activebookmark)
333 if len(repo.parents()) == 2:
333 if len(repo.parents()) == 2:
334 repo.ui.debug('resuming interrupted rebase\n')
334 repo.ui.debug('resuming interrupted rebase\n')
335 else:
335 else:
336 try:
336 try:
337 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
337 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
338 'rebase')
338 'rebase')
339 stats = rebasenode(repo, rev, p1, state, collapsef)
339 stats = rebasenode(repo, rev, p1, state, collapsef)
340 if stats and stats[3] > 0:
340 if stats and stats[3] > 0:
341 raise error.InterventionRequired(
341 raise error.InterventionRequired(
342 _('unresolved conflicts (see hg '
342 _('unresolved conflicts (see hg '
343 'resolve, then hg rebase --continue)'))
343 'resolve, then hg rebase --continue)'))
344 finally:
344 finally:
345 ui.setconfig('ui', 'forcemerge', '', 'rebase')
345 ui.setconfig('ui', 'forcemerge', '', 'rebase')
346 cmdutil.duplicatecopies(repo, rev, target)
346 if collapsef:
347 cmdutil.duplicatecopies(repo, rev, target)
348 else:
349 # If we're not using --collapse, we need to
350 # duplicate copies between the revision we're
351 # rebasing and its first parent, but *not*
352 # duplicate any copies that have already been
353 # performed in the destination.
354 p1rev = repo[rev].p1().rev()
355 cmdutil.duplicatecopies(repo, rev, p1rev, skiprev=target)
347 if not collapsef:
356 if not collapsef:
348 newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn,
357 newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn,
349 editor=editor)
358 editor=editor)
350 else:
359 else:
351 # Skip commit if we are collapsing
360 # Skip commit if we are collapsing
352 repo.setparents(repo[p1].node())
361 repo.setparents(repo[p1].node())
353 newrev = None
362 newrev = None
354 # Update the state
363 # Update the state
355 if newrev is not None:
364 if newrev is not None:
356 state[rev] = repo[newrev].rev()
365 state[rev] = repo[newrev].rev()
357 else:
366 else:
358 if not collapsef:
367 if not collapsef:
359 ui.note(_('no changes, revision %d skipped\n') % rev)
368 ui.note(_('no changes, revision %d skipped\n') % rev)
360 ui.debug('next revision set to %s\n' % p1)
369 ui.debug('next revision set to %s\n' % p1)
361 skipped.add(rev)
370 skipped.add(rev)
362 state[rev] = p1
371 state[rev] = p1
363
372
364 ui.progress(_('rebasing'), None)
373 ui.progress(_('rebasing'), None)
365 ui.note(_('rebase merging completed\n'))
374 ui.note(_('rebase merging completed\n'))
366
375
367 if collapsef and not keepopen:
376 if collapsef and not keepopen:
368 p1, p2 = defineparents(repo, min(state), target,
377 p1, p2 = defineparents(repo, min(state), target,
369 state, targetancestors)
378 state, targetancestors)
370 if collapsemsg:
379 if collapsemsg:
371 commitmsg = collapsemsg
380 commitmsg = collapsemsg
372 else:
381 else:
373 commitmsg = 'Collapsed revision'
382 commitmsg = 'Collapsed revision'
374 for rebased in state:
383 for rebased in state:
375 if rebased not in skipped and state[rebased] > nullmerge:
384 if rebased not in skipped and state[rebased] > nullmerge:
376 commitmsg += '\n* %s' % repo[rebased].description()
385 commitmsg += '\n* %s' % repo[rebased].description()
377 editor = cmdutil.getcommiteditor(edit=True)
386 editor = cmdutil.getcommiteditor(edit=True)
378 newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg,
387 newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg,
379 extrafn=extrafn, editor=editor)
388 extrafn=extrafn, editor=editor)
380 for oldrev in state.iterkeys():
389 for oldrev in state.iterkeys():
381 if state[oldrev] > nullmerge:
390 if state[oldrev] > nullmerge:
382 state[oldrev] = newrev
391 state[oldrev] = newrev
383
392
384 if 'qtip' in repo.tags():
393 if 'qtip' in repo.tags():
385 updatemq(repo, state, skipped, **opts)
394 updatemq(repo, state, skipped, **opts)
386
395
387 if currentbookmarks:
396 if currentbookmarks:
388 # Nodeids are needed to reset bookmarks
397 # Nodeids are needed to reset bookmarks
389 nstate = {}
398 nstate = {}
390 for k, v in state.iteritems():
399 for k, v in state.iteritems():
391 if v > nullmerge:
400 if v > nullmerge:
392 nstate[repo[k].node()] = repo[v].node()
401 nstate[repo[k].node()] = repo[v].node()
393 # XXX this is the same as dest.node() for the non-continue path --
402 # XXX this is the same as dest.node() for the non-continue path --
394 # this should probably be cleaned up
403 # this should probably be cleaned up
395 targetnode = repo[target].node()
404 targetnode = repo[target].node()
396
405
397 # restore original working directory
406 # restore original working directory
398 # (we do this before stripping)
407 # (we do this before stripping)
399 newwd = state.get(originalwd, originalwd)
408 newwd = state.get(originalwd, originalwd)
400 if newwd not in [c.rev() for c in repo[None].parents()]:
409 if newwd not in [c.rev() for c in repo[None].parents()]:
401 ui.note(_("update back to initial working directory parent\n"))
410 ui.note(_("update back to initial working directory parent\n"))
402 hg.updaterepo(repo, newwd, False)
411 hg.updaterepo(repo, newwd, False)
403
412
404 if not keepf:
413 if not keepf:
405 collapsedas = None
414 collapsedas = None
406 if collapsef:
415 if collapsef:
407 collapsedas = newrev
416 collapsedas = newrev
408 clearrebased(ui, repo, state, skipped, collapsedas)
417 clearrebased(ui, repo, state, skipped, collapsedas)
409
418
410 if currentbookmarks:
419 if currentbookmarks:
411 updatebookmarks(repo, targetnode, nstate, currentbookmarks)
420 updatebookmarks(repo, targetnode, nstate, currentbookmarks)
412 if activebookmark not in repo._bookmarks:
421 if activebookmark not in repo._bookmarks:
413 # active bookmark was divergent one and has been deleted
422 # active bookmark was divergent one and has been deleted
414 activebookmark = None
423 activebookmark = None
415
424
416 clearstatus(repo)
425 clearstatus(repo)
417 ui.note(_("rebase completed\n"))
426 ui.note(_("rebase completed\n"))
418 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
427 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
419 if skipped:
428 if skipped:
420 ui.note(_("%d revisions have been skipped\n") % len(skipped))
429 ui.note(_("%d revisions have been skipped\n") % len(skipped))
421
430
422 if (activebookmark and
431 if (activebookmark and
423 repo['.'].node() == repo._bookmarks[activebookmark]):
432 repo['.'].node() == repo._bookmarks[activebookmark]):
424 bookmarks.setcurrent(repo, activebookmark)
433 bookmarks.setcurrent(repo, activebookmark)
425
434
426 finally:
435 finally:
427 release(lock, wlock)
436 release(lock, wlock)
428
437
429 def externalparent(repo, state, targetancestors):
438 def externalparent(repo, state, targetancestors):
430 """Return the revision that should be used as the second parent
439 """Return the revision that should be used as the second parent
431 when the revisions in state is collapsed on top of targetancestors.
440 when the revisions in state is collapsed on top of targetancestors.
432 Abort if there is more than one parent.
441 Abort if there is more than one parent.
433 """
442 """
434 parents = set()
443 parents = set()
435 source = min(state)
444 source = min(state)
436 for rev in state:
445 for rev in state:
437 if rev == source:
446 if rev == source:
438 continue
447 continue
439 for p in repo[rev].parents():
448 for p in repo[rev].parents():
440 if (p.rev() not in state
449 if (p.rev() not in state
441 and p.rev() not in targetancestors):
450 and p.rev() not in targetancestors):
442 parents.add(p.rev())
451 parents.add(p.rev())
443 if not parents:
452 if not parents:
444 return nullrev
453 return nullrev
445 if len(parents) == 1:
454 if len(parents) == 1:
446 return parents.pop()
455 return parents.pop()
447 raise util.Abort(_('unable to collapse on top of %s, there is more '
456 raise util.Abort(_('unable to collapse on top of %s, there is more '
448 'than one external parent: %s') %
457 'than one external parent: %s') %
449 (max(targetancestors),
458 (max(targetancestors),
450 ', '.join(str(p) for p in sorted(parents))))
459 ', '.join(str(p) for p in sorted(parents))))
451
460
452 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None):
461 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None):
453 'Commit the changes and store useful information in extra'
462 'Commit the changes and store useful information in extra'
454 try:
463 try:
455 repo.setparents(repo[p1].node(), repo[p2].node())
464 repo.setparents(repo[p1].node(), repo[p2].node())
456 ctx = repo[rev]
465 ctx = repo[rev]
457 if commitmsg is None:
466 if commitmsg is None:
458 commitmsg = ctx.description()
467 commitmsg = ctx.description()
459 extra = {'rebase_source': ctx.hex()}
468 extra = {'rebase_source': ctx.hex()}
460 if extrafn:
469 if extrafn:
461 extrafn(ctx, extra)
470 extrafn(ctx, extra)
462 # Commit might fail if unresolved files exist
471 # Commit might fail if unresolved files exist
463 newrev = repo.commit(text=commitmsg, user=ctx.user(),
472 newrev = repo.commit(text=commitmsg, user=ctx.user(),
464 date=ctx.date(), extra=extra, editor=editor)
473 date=ctx.date(), extra=extra, editor=editor)
465 repo.dirstate.setbranch(repo[newrev].branch())
474 repo.dirstate.setbranch(repo[newrev].branch())
466 targetphase = max(ctx.phase(), phases.draft)
475 targetphase = max(ctx.phase(), phases.draft)
467 # retractboundary doesn't overwrite upper phase inherited from parent
476 # retractboundary doesn't overwrite upper phase inherited from parent
468 newnode = repo[newrev].node()
477 newnode = repo[newrev].node()
469 if newnode:
478 if newnode:
470 phases.retractboundary(repo, targetphase, [newnode])
479 phases.retractboundary(repo, targetphase, [newnode])
471 return newrev
480 return newrev
472 except util.Abort:
481 except util.Abort:
473 # Invalidate the previous setparents
482 # Invalidate the previous setparents
474 repo.dirstate.invalidate()
483 repo.dirstate.invalidate()
475 raise
484 raise
476
485
477 def rebasenode(repo, rev, p1, state, collapse):
486 def rebasenode(repo, rev, p1, state, collapse):
478 'Rebase a single revision'
487 'Rebase a single revision'
479 # Merge phase
488 # Merge phase
480 # Update to target and merge it with local
489 # Update to target and merge it with local
481 if repo['.'].rev() != repo[p1].rev():
490 if repo['.'].rev() != repo[p1].rev():
482 repo.ui.debug(" update to %d:%s\n" % (repo[p1].rev(), repo[p1]))
491 repo.ui.debug(" update to %d:%s\n" % (repo[p1].rev(), repo[p1]))
483 merge.update(repo, p1, False, True, False)
492 merge.update(repo, p1, False, True, False)
484 else:
493 else:
485 repo.ui.debug(" already in target\n")
494 repo.ui.debug(" already in target\n")
486 repo.dirstate.write()
495 repo.dirstate.write()
487 repo.ui.debug(" merge against %d:%s\n" % (repo[rev].rev(), repo[rev]))
496 repo.ui.debug(" merge against %d:%s\n" % (repo[rev].rev(), repo[rev]))
488 if repo[rev].rev() == repo[min(state)].rev():
497 if repo[rev].rev() == repo[min(state)].rev():
489 # Case (1) initial changeset of a non-detaching rebase.
498 # Case (1) initial changeset of a non-detaching rebase.
490 # Let the merge mechanism find the base itself.
499 # Let the merge mechanism find the base itself.
491 base = None
500 base = None
492 elif not repo[rev].p2():
501 elif not repo[rev].p2():
493 # Case (2) detaching the node with a single parent, use this parent
502 # Case (2) detaching the node with a single parent, use this parent
494 base = repo[rev].p1().node()
503 base = repo[rev].p1().node()
495 else:
504 else:
496 # In case of merge, we need to pick the right parent as merge base.
505 # In case of merge, we need to pick the right parent as merge base.
497 #
506 #
498 # Imagine we have:
507 # Imagine we have:
499 # - M: currently rebase revision in this step
508 # - M: currently rebase revision in this step
500 # - A: one parent of M
509 # - A: one parent of M
501 # - B: second parent of M
510 # - B: second parent of M
502 # - D: destination of this merge step (p1 var)
511 # - D: destination of this merge step (p1 var)
503 #
512 #
504 # If we are rebasing on D, D is the successors of A or B. The right
513 # If we are rebasing on D, D is the successors of A or B. The right
505 # merge base is the one D succeed to. We pretend it is B for the rest
514 # merge base is the one D succeed to. We pretend it is B for the rest
506 # of this comment
515 # of this comment
507 #
516 #
508 # If we pick B as the base, the merge involves:
517 # If we pick B as the base, the merge involves:
509 # - changes from B to M (actual changeset payload)
518 # - changes from B to M (actual changeset payload)
510 # - changes from B to D (induced by rebase) as D is a rebased
519 # - changes from B to D (induced by rebase) as D is a rebased
511 # version of B)
520 # version of B)
512 # Which exactly represent the rebase operation.
521 # Which exactly represent the rebase operation.
513 #
522 #
514 # If we pick the A as the base, the merge involves
523 # If we pick the A as the base, the merge involves
515 # - changes from A to M (actual changeset payload)
524 # - changes from A to M (actual changeset payload)
516 # - changes from A to D (with include changes between unrelated A and B
525 # - changes from A to D (with include changes between unrelated A and B
517 # plus changes induced by rebase)
526 # plus changes induced by rebase)
518 # Which does not represent anything sensible and creates a lot of
527 # Which does not represent anything sensible and creates a lot of
519 # conflicts.
528 # conflicts.
520 for p in repo[rev].parents():
529 for p in repo[rev].parents():
521 if state.get(p.rev()) == repo[p1].rev():
530 if state.get(p.rev()) == repo[p1].rev():
522 base = p.node()
531 base = p.node()
523 break
532 break
524 else: # fallback when base not found
533 else: # fallback when base not found
525 base = None
534 base = None
526
535
527 # Raise because this function is called wrong (see issue 4106)
536 # Raise because this function is called wrong (see issue 4106)
528 raise AssertionError('no base found to rebase on '
537 raise AssertionError('no base found to rebase on '
529 '(rebasenode called wrong)')
538 '(rebasenode called wrong)')
530 if base is not None:
539 if base is not None:
531 repo.ui.debug(" detach base %d:%s\n" % (repo[base].rev(), repo[base]))
540 repo.ui.debug(" detach base %d:%s\n" % (repo[base].rev(), repo[base]))
532 # When collapsing in-place, the parent is the common ancestor, we
541 # When collapsing in-place, the parent is the common ancestor, we
533 # have to allow merging with it.
542 # have to allow merging with it.
534 return merge.update(repo, rev, True, True, False, base, collapse,
543 return merge.update(repo, rev, True, True, False, base, collapse,
535 labels=['dest', 'source'])
544 labels=['dest', 'source'])
536
545
537 def nearestrebased(repo, rev, state):
546 def nearestrebased(repo, rev, state):
538 """return the nearest ancestors of rev in the rebase result"""
547 """return the nearest ancestors of rev in the rebase result"""
539 rebased = [r for r in state if state[r] > nullmerge]
548 rebased = [r for r in state if state[r] > nullmerge]
540 candidates = repo.revs('max(%ld and (::%d))', rebased, rev)
549 candidates = repo.revs('max(%ld and (::%d))', rebased, rev)
541 if candidates:
550 if candidates:
542 return state[candidates[0]]
551 return state[candidates[0]]
543 else:
552 else:
544 return None
553 return None
545
554
546 def defineparents(repo, rev, target, state, targetancestors):
555 def defineparents(repo, rev, target, state, targetancestors):
547 'Return the new parent relationship of the revision that will be rebased'
556 'Return the new parent relationship of the revision that will be rebased'
548 parents = repo[rev].parents()
557 parents = repo[rev].parents()
549 p1 = p2 = nullrev
558 p1 = p2 = nullrev
550
559
551 P1n = parents[0].rev()
560 P1n = parents[0].rev()
552 if P1n in targetancestors:
561 if P1n in targetancestors:
553 p1 = target
562 p1 = target
554 elif P1n in state:
563 elif P1n in state:
555 if state[P1n] == nullmerge:
564 if state[P1n] == nullmerge:
556 p1 = target
565 p1 = target
557 elif state[P1n] == revignored:
566 elif state[P1n] == revignored:
558 p1 = nearestrebased(repo, P1n, state)
567 p1 = nearestrebased(repo, P1n, state)
559 if p1 is None:
568 if p1 is None:
560 p1 = target
569 p1 = target
561 else:
570 else:
562 p1 = state[P1n]
571 p1 = state[P1n]
563 else: # P1n external
572 else: # P1n external
564 p1 = target
573 p1 = target
565 p2 = P1n
574 p2 = P1n
566
575
567 if len(parents) == 2 and parents[1].rev() not in targetancestors:
576 if len(parents) == 2 and parents[1].rev() not in targetancestors:
568 P2n = parents[1].rev()
577 P2n = parents[1].rev()
569 # interesting second parent
578 # interesting second parent
570 if P2n in state:
579 if P2n in state:
571 if p1 == target: # P1n in targetancestors or external
580 if p1 == target: # P1n in targetancestors or external
572 p1 = state[P2n]
581 p1 = state[P2n]
573 elif state[P2n] == revignored:
582 elif state[P2n] == revignored:
574 p2 = nearestrebased(repo, P2n, state)
583 p2 = nearestrebased(repo, P2n, state)
575 if p2 is None:
584 if p2 is None:
576 # no ancestors rebased yet, detach
585 # no ancestors rebased yet, detach
577 p2 = target
586 p2 = target
578 else:
587 else:
579 p2 = state[P2n]
588 p2 = state[P2n]
580 else: # P2n external
589 else: # P2n external
581 if p2 != nullrev: # P1n external too => rev is a merged revision
590 if p2 != nullrev: # P1n external too => rev is a merged revision
582 raise util.Abort(_('cannot use revision %d as base, result '
591 raise util.Abort(_('cannot use revision %d as base, result '
583 'would have 3 parents') % rev)
592 'would have 3 parents') % rev)
584 p2 = P2n
593 p2 = P2n
585 repo.ui.debug(" future parents are %d and %d\n" %
594 repo.ui.debug(" future parents are %d and %d\n" %
586 (repo[p1].rev(), repo[p2].rev()))
595 (repo[p1].rev(), repo[p2].rev()))
587 return p1, p2
596 return p1, p2
588
597
589 def isagitpatch(repo, patchname):
598 def isagitpatch(repo, patchname):
590 'Return true if the given patch is in git format'
599 'Return true if the given patch is in git format'
591 mqpatch = os.path.join(repo.mq.path, patchname)
600 mqpatch = os.path.join(repo.mq.path, patchname)
592 for line in patch.linereader(file(mqpatch, 'rb')):
601 for line in patch.linereader(file(mqpatch, 'rb')):
593 if line.startswith('diff --git'):
602 if line.startswith('diff --git'):
594 return True
603 return True
595 return False
604 return False
596
605
597 def updatemq(repo, state, skipped, **opts):
606 def updatemq(repo, state, skipped, **opts):
598 'Update rebased mq patches - finalize and then import them'
607 'Update rebased mq patches - finalize and then import them'
599 mqrebase = {}
608 mqrebase = {}
600 mq = repo.mq
609 mq = repo.mq
601 original_series = mq.fullseries[:]
610 original_series = mq.fullseries[:]
602 skippedpatches = set()
611 skippedpatches = set()
603
612
604 for p in mq.applied:
613 for p in mq.applied:
605 rev = repo[p.node].rev()
614 rev = repo[p.node].rev()
606 if rev in state:
615 if rev in state:
607 repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
616 repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
608 (rev, p.name))
617 (rev, p.name))
609 mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
618 mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
610 else:
619 else:
611 # Applied but not rebased, not sure this should happen
620 # Applied but not rebased, not sure this should happen
612 skippedpatches.add(p.name)
621 skippedpatches.add(p.name)
613
622
614 if mqrebase:
623 if mqrebase:
615 mq.finish(repo, mqrebase.keys())
624 mq.finish(repo, mqrebase.keys())
616
625
617 # We must start import from the newest revision
626 # We must start import from the newest revision
618 for rev in sorted(mqrebase, reverse=True):
627 for rev in sorted(mqrebase, reverse=True):
619 if rev not in skipped:
628 if rev not in skipped:
620 name, isgit = mqrebase[rev]
629 name, isgit = mqrebase[rev]
621 repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name))
630 repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name))
622 mq.qimport(repo, (), patchname=name, git=isgit,
631 mq.qimport(repo, (), patchname=name, git=isgit,
623 rev=[str(state[rev])])
632 rev=[str(state[rev])])
624 else:
633 else:
625 # Rebased and skipped
634 # Rebased and skipped
626 skippedpatches.add(mqrebase[rev][0])
635 skippedpatches.add(mqrebase[rev][0])
627
636
628 # Patches were either applied and rebased and imported in
637 # Patches were either applied and rebased and imported in
629 # order, applied and removed or unapplied. Discard the removed
638 # order, applied and removed or unapplied. Discard the removed
630 # ones while preserving the original series order and guards.
639 # ones while preserving the original series order and guards.
631 newseries = [s for s in original_series
640 newseries = [s for s in original_series
632 if mq.guard_re.split(s, 1)[0] not in skippedpatches]
641 if mq.guard_re.split(s, 1)[0] not in skippedpatches]
633 mq.fullseries[:] = newseries
642 mq.fullseries[:] = newseries
634 mq.seriesdirty = True
643 mq.seriesdirty = True
635 mq.savedirty()
644 mq.savedirty()
636
645
637 def updatebookmarks(repo, targetnode, nstate, originalbookmarks):
646 def updatebookmarks(repo, targetnode, nstate, originalbookmarks):
638 'Move bookmarks to their correct changesets, and delete divergent ones'
647 'Move bookmarks to their correct changesets, and delete divergent ones'
639 marks = repo._bookmarks
648 marks = repo._bookmarks
640 for k, v in originalbookmarks.iteritems():
649 for k, v in originalbookmarks.iteritems():
641 if v in nstate:
650 if v in nstate:
642 # update the bookmarks for revs that have moved
651 # update the bookmarks for revs that have moved
643 marks[k] = nstate[v]
652 marks[k] = nstate[v]
644 bookmarks.deletedivergent(repo, [targetnode], k)
653 bookmarks.deletedivergent(repo, [targetnode], k)
645
654
646 marks.write()
655 marks.write()
647
656
648 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches,
657 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches,
649 external, activebookmark):
658 external, activebookmark):
650 'Store the current status to allow recovery'
659 'Store the current status to allow recovery'
651 f = repo.opener("rebasestate", "w")
660 f = repo.opener("rebasestate", "w")
652 f.write(repo[originalwd].hex() + '\n')
661 f.write(repo[originalwd].hex() + '\n')
653 f.write(repo[target].hex() + '\n')
662 f.write(repo[target].hex() + '\n')
654 f.write(repo[external].hex() + '\n')
663 f.write(repo[external].hex() + '\n')
655 f.write('%d\n' % int(collapse))
664 f.write('%d\n' % int(collapse))
656 f.write('%d\n' % int(keep))
665 f.write('%d\n' % int(keep))
657 f.write('%d\n' % int(keepbranches))
666 f.write('%d\n' % int(keepbranches))
658 f.write('%s\n' % (activebookmark or ''))
667 f.write('%s\n' % (activebookmark or ''))
659 for d, v in state.iteritems():
668 for d, v in state.iteritems():
660 oldrev = repo[d].hex()
669 oldrev = repo[d].hex()
661 if v > nullmerge:
670 if v > nullmerge:
662 newrev = repo[v].hex()
671 newrev = repo[v].hex()
663 else:
672 else:
664 newrev = v
673 newrev = v
665 f.write("%s:%s\n" % (oldrev, newrev))
674 f.write("%s:%s\n" % (oldrev, newrev))
666 f.close()
675 f.close()
667 repo.ui.debug('rebase status stored\n')
676 repo.ui.debug('rebase status stored\n')
668
677
669 def clearstatus(repo):
678 def clearstatus(repo):
670 'Remove the status files'
679 'Remove the status files'
671 util.unlinkpath(repo.join("rebasestate"), ignoremissing=True)
680 util.unlinkpath(repo.join("rebasestate"), ignoremissing=True)
672
681
673 def restorestatus(repo):
682 def restorestatus(repo):
674 'Restore a previously stored status'
683 'Restore a previously stored status'
675 try:
684 try:
676 keepbranches = None
685 keepbranches = None
677 target = None
686 target = None
678 collapse = False
687 collapse = False
679 external = nullrev
688 external = nullrev
680 activebookmark = None
689 activebookmark = None
681 state = {}
690 state = {}
682 f = repo.opener("rebasestate")
691 f = repo.opener("rebasestate")
683 for i, l in enumerate(f.read().splitlines()):
692 for i, l in enumerate(f.read().splitlines()):
684 if i == 0:
693 if i == 0:
685 originalwd = repo[l].rev()
694 originalwd = repo[l].rev()
686 elif i == 1:
695 elif i == 1:
687 target = repo[l].rev()
696 target = repo[l].rev()
688 elif i == 2:
697 elif i == 2:
689 external = repo[l].rev()
698 external = repo[l].rev()
690 elif i == 3:
699 elif i == 3:
691 collapse = bool(int(l))
700 collapse = bool(int(l))
692 elif i == 4:
701 elif i == 4:
693 keep = bool(int(l))
702 keep = bool(int(l))
694 elif i == 5:
703 elif i == 5:
695 keepbranches = bool(int(l))
704 keepbranches = bool(int(l))
696 elif i == 6 and not (len(l) == 81 and ':' in l):
705 elif i == 6 and not (len(l) == 81 and ':' in l):
697 # line 6 is a recent addition, so for backwards compatibility
706 # line 6 is a recent addition, so for backwards compatibility
698 # check that the line doesn't look like the oldrev:newrev lines
707 # check that the line doesn't look like the oldrev:newrev lines
699 activebookmark = l
708 activebookmark = l
700 else:
709 else:
701 oldrev, newrev = l.split(':')
710 oldrev, newrev = l.split(':')
702 if newrev in (str(nullmerge), str(revignored)):
711 if newrev in (str(nullmerge), str(revignored)):
703 state[repo[oldrev].rev()] = int(newrev)
712 state[repo[oldrev].rev()] = int(newrev)
704 else:
713 else:
705 state[repo[oldrev].rev()] = repo[newrev].rev()
714 state[repo[oldrev].rev()] = repo[newrev].rev()
706
715
707 if keepbranches is None:
716 if keepbranches is None:
708 raise util.Abort(_('.hg/rebasestate is incomplete'))
717 raise util.Abort(_('.hg/rebasestate is incomplete'))
709
718
710 skipped = set()
719 skipped = set()
711 # recompute the set of skipped revs
720 # recompute the set of skipped revs
712 if not collapse:
721 if not collapse:
713 seen = set([target])
722 seen = set([target])
714 for old, new in sorted(state.items()):
723 for old, new in sorted(state.items()):
715 if new != nullrev and new in seen:
724 if new != nullrev and new in seen:
716 skipped.add(old)
725 skipped.add(old)
717 seen.add(new)
726 seen.add(new)
718 repo.ui.debug('computed skipped revs: %s\n' %
727 repo.ui.debug('computed skipped revs: %s\n' %
719 (' '.join(str(r) for r in sorted(skipped)) or None))
728 (' '.join(str(r) for r in sorted(skipped)) or None))
720 repo.ui.debug('rebase status resumed\n')
729 repo.ui.debug('rebase status resumed\n')
721 return (originalwd, target, state, skipped,
730 return (originalwd, target, state, skipped,
722 collapse, keep, keepbranches, external, activebookmark)
731 collapse, keep, keepbranches, external, activebookmark)
723 except IOError, err:
732 except IOError, err:
724 if err.errno != errno.ENOENT:
733 if err.errno != errno.ENOENT:
725 raise
734 raise
726 raise util.Abort(_('no rebase in progress'))
735 raise util.Abort(_('no rebase in progress'))
727
736
728 def inrebase(repo, originalwd, state):
737 def inrebase(repo, originalwd, state):
729 '''check whether the working dir is in an interrupted rebase'''
738 '''check whether the working dir is in an interrupted rebase'''
730 parents = [p.rev() for p in repo.parents()]
739 parents = [p.rev() for p in repo.parents()]
731 if originalwd in parents:
740 if originalwd in parents:
732 return True
741 return True
733
742
734 for newrev in state.itervalues():
743 for newrev in state.itervalues():
735 if newrev in parents:
744 if newrev in parents:
736 return True
745 return True
737
746
738 return False
747 return False
739
748
740 def abort(repo, originalwd, target, state):
749 def abort(repo, originalwd, target, state):
741 'Restore the repository to its original state'
750 'Restore the repository to its original state'
742 dstates = [s for s in state.values() if s > nullrev]
751 dstates = [s for s in state.values() if s > nullrev]
743 immutable = [d for d in dstates if not repo[d].mutable()]
752 immutable = [d for d in dstates if not repo[d].mutable()]
744 cleanup = True
753 cleanup = True
745 if immutable:
754 if immutable:
746 repo.ui.warn(_("warning: can't clean up immutable changesets %s\n")
755 repo.ui.warn(_("warning: can't clean up immutable changesets %s\n")
747 % ', '.join(str(repo[r]) for r in immutable),
756 % ', '.join(str(repo[r]) for r in immutable),
748 hint=_('see hg help phases for details'))
757 hint=_('see hg help phases for details'))
749 cleanup = False
758 cleanup = False
750
759
751 descendants = set()
760 descendants = set()
752 if dstates:
761 if dstates:
753 descendants = set(repo.changelog.descendants(dstates))
762 descendants = set(repo.changelog.descendants(dstates))
754 if descendants - set(dstates):
763 if descendants - set(dstates):
755 repo.ui.warn(_("warning: new changesets detected on target branch, "
764 repo.ui.warn(_("warning: new changesets detected on target branch, "
756 "can't strip\n"))
765 "can't strip\n"))
757 cleanup = False
766 cleanup = False
758
767
759 if cleanup:
768 if cleanup:
760 # Update away from the rebase if necessary
769 # Update away from the rebase if necessary
761 if inrebase(repo, originalwd, state):
770 if inrebase(repo, originalwd, state):
762 merge.update(repo, repo[originalwd].rev(), False, True, False)
771 merge.update(repo, repo[originalwd].rev(), False, True, False)
763
772
764 # Strip from the first rebased revision
773 # Strip from the first rebased revision
765 rebased = filter(lambda x: x > -1 and x != target, state.values())
774 rebased = filter(lambda x: x > -1 and x != target, state.values())
766 if rebased:
775 if rebased:
767 strippoints = [c.node() for c in repo.set('roots(%ld)', rebased)]
776 strippoints = [c.node() for c in repo.set('roots(%ld)', rebased)]
768 # no backup of rebased cset versions needed
777 # no backup of rebased cset versions needed
769 repair.strip(repo.ui, repo, strippoints)
778 repair.strip(repo.ui, repo, strippoints)
770
779
771 clearstatus(repo)
780 clearstatus(repo)
772 repo.ui.warn(_('rebase aborted\n'))
781 repo.ui.warn(_('rebase aborted\n'))
773 return 0
782 return 0
774
783
775 def buildstate(repo, dest, rebaseset, collapse):
784 def buildstate(repo, dest, rebaseset, collapse):
776 '''Define which revisions are going to be rebased and where
785 '''Define which revisions are going to be rebased and where
777
786
778 repo: repo
787 repo: repo
779 dest: context
788 dest: context
780 rebaseset: set of rev
789 rebaseset: set of rev
781 '''
790 '''
782
791
783 # This check isn't strictly necessary, since mq detects commits over an
792 # This check isn't strictly necessary, since mq detects commits over an
784 # applied patch. But it prevents messing up the working directory when
793 # applied patch. But it prevents messing up the working directory when
785 # a partially completed rebase is blocked by mq.
794 # a partially completed rebase is blocked by mq.
786 if 'qtip' in repo.tags() and (dest.node() in
795 if 'qtip' in repo.tags() and (dest.node() in
787 [s.node for s in repo.mq.applied]):
796 [s.node for s in repo.mq.applied]):
788 raise util.Abort(_('cannot rebase onto an applied mq patch'))
797 raise util.Abort(_('cannot rebase onto an applied mq patch'))
789
798
790 roots = list(repo.set('roots(%ld)', rebaseset))
799 roots = list(repo.set('roots(%ld)', rebaseset))
791 if not roots:
800 if not roots:
792 raise util.Abort(_('no matching revisions'))
801 raise util.Abort(_('no matching revisions'))
793 roots.sort()
802 roots.sort()
794 state = {}
803 state = {}
795 detachset = set()
804 detachset = set()
796 for root in roots:
805 for root in roots:
797 commonbase = root.ancestor(dest)
806 commonbase = root.ancestor(dest)
798 if commonbase == root:
807 if commonbase == root:
799 raise util.Abort(_('source is ancestor of destination'))
808 raise util.Abort(_('source is ancestor of destination'))
800 if commonbase == dest:
809 if commonbase == dest:
801 samebranch = root.branch() == dest.branch()
810 samebranch = root.branch() == dest.branch()
802 if not collapse and samebranch and root in dest.children():
811 if not collapse and samebranch and root in dest.children():
803 repo.ui.debug('source is a child of destination\n')
812 repo.ui.debug('source is a child of destination\n')
804 return None
813 return None
805
814
806 repo.ui.debug('rebase onto %d starting from %s\n' % (dest, root))
815 repo.ui.debug('rebase onto %d starting from %s\n' % (dest, root))
807 state.update(dict.fromkeys(rebaseset, nullrev))
816 state.update(dict.fromkeys(rebaseset, nullrev))
808 # Rebase tries to turn <dest> into a parent of <root> while
817 # Rebase tries to turn <dest> into a parent of <root> while
809 # preserving the number of parents of rebased changesets:
818 # preserving the number of parents of rebased changesets:
810 #
819 #
811 # - A changeset with a single parent will always be rebased as a
820 # - A changeset with a single parent will always be rebased as a
812 # changeset with a single parent.
821 # changeset with a single parent.
813 #
822 #
814 # - A merge will be rebased as merge unless its parents are both
823 # - A merge will be rebased as merge unless its parents are both
815 # ancestors of <dest> or are themselves in the rebased set and
824 # ancestors of <dest> or are themselves in the rebased set and
816 # pruned while rebased.
825 # pruned while rebased.
817 #
826 #
818 # If one parent of <root> is an ancestor of <dest>, the rebased
827 # If one parent of <root> is an ancestor of <dest>, the rebased
819 # version of this parent will be <dest>. This is always true with
828 # version of this parent will be <dest>. This is always true with
820 # --base option.
829 # --base option.
821 #
830 #
822 # Otherwise, we need to *replace* the original parents with
831 # Otherwise, we need to *replace* the original parents with
823 # <dest>. This "detaches" the rebased set from its former location
832 # <dest>. This "detaches" the rebased set from its former location
824 # and rebases it onto <dest>. Changes introduced by ancestors of
833 # and rebases it onto <dest>. Changes introduced by ancestors of
825 # <root> not common with <dest> (the detachset, marked as
834 # <root> not common with <dest> (the detachset, marked as
826 # nullmerge) are "removed" from the rebased changesets.
835 # nullmerge) are "removed" from the rebased changesets.
827 #
836 #
828 # - If <root> has a single parent, set it to <dest>.
837 # - If <root> has a single parent, set it to <dest>.
829 #
838 #
830 # - If <root> is a merge, we cannot decide which parent to
839 # - If <root> is a merge, we cannot decide which parent to
831 # replace, the rebase operation is not clearly defined.
840 # replace, the rebase operation is not clearly defined.
832 #
841 #
833 # The table below sums up this behavior:
842 # The table below sums up this behavior:
834 #
843 #
835 # +------------------+----------------------+-------------------------+
844 # +------------------+----------------------+-------------------------+
836 # | | one parent | merge |
845 # | | one parent | merge |
837 # +------------------+----------------------+-------------------------+
846 # +------------------+----------------------+-------------------------+
838 # | parent in | new parent is <dest> | parents in ::<dest> are |
847 # | parent in | new parent is <dest> | parents in ::<dest> are |
839 # | ::<dest> | | remapped to <dest> |
848 # | ::<dest> | | remapped to <dest> |
840 # +------------------+----------------------+-------------------------+
849 # +------------------+----------------------+-------------------------+
841 # | unrelated source | new parent is <dest> | ambiguous, abort |
850 # | unrelated source | new parent is <dest> | ambiguous, abort |
842 # +------------------+----------------------+-------------------------+
851 # +------------------+----------------------+-------------------------+
843 #
852 #
844 # The actual abort is handled by `defineparents`
853 # The actual abort is handled by `defineparents`
845 if len(root.parents()) <= 1:
854 if len(root.parents()) <= 1:
846 # ancestors of <root> not ancestors of <dest>
855 # ancestors of <root> not ancestors of <dest>
847 detachset.update(repo.changelog.findmissingrevs([commonbase.rev()],
856 detachset.update(repo.changelog.findmissingrevs([commonbase.rev()],
848 [root.rev()]))
857 [root.rev()]))
849 for r in detachset:
858 for r in detachset:
850 if r not in state:
859 if r not in state:
851 state[r] = nullmerge
860 state[r] = nullmerge
852 if len(roots) > 1:
861 if len(roots) > 1:
853 # If we have multiple roots, we may have "hole" in the rebase set.
862 # If we have multiple roots, we may have "hole" in the rebase set.
854 # Rebase roots that descend from those "hole" should not be detached as
863 # Rebase roots that descend from those "hole" should not be detached as
855 # other root are. We use the special `revignored` to inform rebase that
864 # other root are. We use the special `revignored` to inform rebase that
856 # the revision should be ignored but that `defineparents` should search
865 # the revision should be ignored but that `defineparents` should search
857 # a rebase destination that make sense regarding rebased topology.
866 # a rebase destination that make sense regarding rebased topology.
858 rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset))
867 rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset))
859 for ignored in set(rebasedomain) - set(rebaseset):
868 for ignored in set(rebasedomain) - set(rebaseset):
860 state[ignored] = revignored
869 state[ignored] = revignored
861 return repo['.'].rev(), dest.rev(), state
870 return repo['.'].rev(), dest.rev(), state
862
871
863 def clearrebased(ui, repo, state, skipped, collapsedas=None):
872 def clearrebased(ui, repo, state, skipped, collapsedas=None):
864 """dispose of rebased revision at the end of the rebase
873 """dispose of rebased revision at the end of the rebase
865
874
866 If `collapsedas` is not None, the rebase was a collapse whose result if the
875 If `collapsedas` is not None, the rebase was a collapse whose result if the
867 `collapsedas` node."""
876 `collapsedas` node."""
868 if obsolete._enabled:
877 if obsolete._enabled:
869 markers = []
878 markers = []
870 for rev, newrev in sorted(state.items()):
879 for rev, newrev in sorted(state.items()):
871 if newrev >= 0:
880 if newrev >= 0:
872 if rev in skipped:
881 if rev in skipped:
873 succs = ()
882 succs = ()
874 elif collapsedas is not None:
883 elif collapsedas is not None:
875 succs = (repo[collapsedas],)
884 succs = (repo[collapsedas],)
876 else:
885 else:
877 succs = (repo[newrev],)
886 succs = (repo[newrev],)
878 markers.append((repo[rev], succs))
887 markers.append((repo[rev], succs))
879 if markers:
888 if markers:
880 obsolete.createmarkers(repo, markers)
889 obsolete.createmarkers(repo, markers)
881 else:
890 else:
882 rebased = [rev for rev in state if state[rev] > nullmerge]
891 rebased = [rev for rev in state if state[rev] > nullmerge]
883 if rebased:
892 if rebased:
884 stripped = []
893 stripped = []
885 for root in repo.set('roots(%ld)', rebased):
894 for root in repo.set('roots(%ld)', rebased):
886 if set(repo.changelog.descendants([root.rev()])) - set(state):
895 if set(repo.changelog.descendants([root.rev()])) - set(state):
887 ui.warn(_("warning: new changesets detected "
896 ui.warn(_("warning: new changesets detected "
888 "on source branch, not stripping\n"))
897 "on source branch, not stripping\n"))
889 else:
898 else:
890 stripped.append(root.node())
899 stripped.append(root.node())
891 if stripped:
900 if stripped:
892 # backup the old csets by default
901 # backup the old csets by default
893 repair.strip(ui, repo, stripped, "all")
902 repair.strip(ui, repo, stripped, "all")
894
903
895
904
896 def pullrebase(orig, ui, repo, *args, **opts):
905 def pullrebase(orig, ui, repo, *args, **opts):
897 'Call rebase after pull if the latter has been invoked with --rebase'
906 'Call rebase after pull if the latter has been invoked with --rebase'
898 if opts.get('rebase'):
907 if opts.get('rebase'):
899 if opts.get('update'):
908 if opts.get('update'):
900 del opts['update']
909 del opts['update']
901 ui.debug('--update and --rebase are not compatible, ignoring '
910 ui.debug('--update and --rebase are not compatible, ignoring '
902 'the update flag\n')
911 'the update flag\n')
903
912
904 movemarkfrom = repo['.'].node()
913 movemarkfrom = repo['.'].node()
905 revsprepull = len(repo)
914 revsprepull = len(repo)
906 origpostincoming = commands.postincoming
915 origpostincoming = commands.postincoming
907 def _dummy(*args, **kwargs):
916 def _dummy(*args, **kwargs):
908 pass
917 pass
909 commands.postincoming = _dummy
918 commands.postincoming = _dummy
910 try:
919 try:
911 orig(ui, repo, *args, **opts)
920 orig(ui, repo, *args, **opts)
912 finally:
921 finally:
913 commands.postincoming = origpostincoming
922 commands.postincoming = origpostincoming
914 revspostpull = len(repo)
923 revspostpull = len(repo)
915 if revspostpull > revsprepull:
924 if revspostpull > revsprepull:
916 # --rev option from pull conflict with rebase own --rev
925 # --rev option from pull conflict with rebase own --rev
917 # dropping it
926 # dropping it
918 if 'rev' in opts:
927 if 'rev' in opts:
919 del opts['rev']
928 del opts['rev']
920 rebase(ui, repo, **opts)
929 rebase(ui, repo, **opts)
921 branch = repo[None].branch()
930 branch = repo[None].branch()
922 dest = repo[branch].rev()
931 dest = repo[branch].rev()
923 if dest != repo['.'].rev():
932 if dest != repo['.'].rev():
924 # there was nothing to rebase we force an update
933 # there was nothing to rebase we force an update
925 hg.update(repo, dest)
934 hg.update(repo, dest)
926 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
935 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
927 ui.status(_("updating bookmark %s\n")
936 ui.status(_("updating bookmark %s\n")
928 % repo._bookmarkcurrent)
937 % repo._bookmarkcurrent)
929 else:
938 else:
930 if opts.get('tool'):
939 if opts.get('tool'):
931 raise util.Abort(_('--tool can only be used with --rebase'))
940 raise util.Abort(_('--tool can only be used with --rebase'))
932 orig(ui, repo, *args, **opts)
941 orig(ui, repo, *args, **opts)
933
942
934 def summaryhook(ui, repo):
943 def summaryhook(ui, repo):
935 if not os.path.exists(repo.join('rebasestate')):
944 if not os.path.exists(repo.join('rebasestate')):
936 return
945 return
937 try:
946 try:
938 state = restorestatus(repo)[2]
947 state = restorestatus(repo)[2]
939 except error.RepoLookupError:
948 except error.RepoLookupError:
940 # i18n: column positioning for "hg summary"
949 # i18n: column positioning for "hg summary"
941 msg = _('rebase: (use "hg rebase --abort" to clear broken state)\n')
950 msg = _('rebase: (use "hg rebase --abort" to clear broken state)\n')
942 ui.write(msg)
951 ui.write(msg)
943 return
952 return
944 numrebased = len([i for i in state.itervalues() if i != -1])
953 numrebased = len([i for i in state.itervalues() if i != -1])
945 # i18n: column positioning for "hg summary"
954 # i18n: column positioning for "hg summary"
946 ui.write(_('rebase: %s, %s (rebase --continue)\n') %
955 ui.write(_('rebase: %s, %s (rebase --continue)\n') %
947 (ui.label(_('%d rebased'), 'rebase.rebased') % numrebased,
956 (ui.label(_('%d rebased'), 'rebase.rebased') % numrebased,
948 ui.label(_('%d remaining'), 'rebase.remaining') %
957 ui.label(_('%d remaining'), 'rebase.remaining') %
949 (len(state) - numrebased)))
958 (len(state) - numrebased)))
950
959
951 def uisetup(ui):
960 def uisetup(ui):
952 'Replace pull with a decorator to provide --rebase option'
961 'Replace pull with a decorator to provide --rebase option'
953 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
962 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
954 entry[1].append(('', 'rebase', None,
963 entry[1].append(('', 'rebase', None,
955 _("rebase working directory to branch head")))
964 _("rebase working directory to branch head")))
956 entry[1].append(('t', 'tool', '',
965 entry[1].append(('t', 'tool', '',
957 _("specify merge tool for rebase")))
966 _("specify merge tool for rebase")))
958 cmdutil.summaryhooks.add('rebase', summaryhook)
967 cmdutil.summaryhooks.add('rebase', summaryhook)
959 cmdutil.unfinishedstates.append(
968 cmdutil.unfinishedstates.append(
960 ['rebasestate', False, False, _('rebase in progress'),
969 ['rebasestate', False, False, _('rebase in progress'),
961 _("use 'hg rebase --continue' or 'hg rebase --abort'")])
970 _("use 'hg rebase --continue' or 'hg rebase --abort'")])
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now