##// END OF EJS Templates
branching: merge stable into default
Raphaël Gomès -
r52207:7e6aae03 merge default
parent child Browse files
Show More
@@ -1,256 +1,257 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,272 +1,273 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
105 2d8cd3d0e83c7336c0cb45a9f88638363f993848 3.0.2
106 6c36dc6cd61a0e1b563f1d51e55bdf4dacf12162 3.1-rc
106 6c36dc6cd61a0e1b563f1d51e55bdf4dacf12162 3.1-rc
107 3178e49892020336491cdc6945885c4de26ffa8b 3.1
107 3178e49892020336491cdc6945885c4de26ffa8b 3.1
108 5dc91146f35369949ea56b40172308158b59063a 3.1.1
108 5dc91146f35369949ea56b40172308158b59063a 3.1.1
109 f768c888aaa68d12dd7f509dcc7f01c9584357d0 3.1.2
109 f768c888aaa68d12dd7f509dcc7f01c9584357d0 3.1.2
110 7f8d16af8cae246fa5a48e723d48d58b015aed94 3.2-rc
110 7f8d16af8cae246fa5a48e723d48d58b015aed94 3.2-rc
111 ced632394371a36953ce4d394f86278ae51a2aae 3.2
111 ced632394371a36953ce4d394f86278ae51a2aae 3.2
112 643c58303fb0ec020907af28b9e486be299ba043 3.2.1
112 643c58303fb0ec020907af28b9e486be299ba043 3.2.1
113 902554884335e5ca3661d63be9978eb4aec3f68a 3.2.2
113 902554884335e5ca3661d63be9978eb4aec3f68a 3.2.2
114 6dad422ecc5adb63d9fa649eeb8e05a5f9bc4900 3.2.3
114 6dad422ecc5adb63d9fa649eeb8e05a5f9bc4900 3.2.3
115 1265a3a71d75396f5d4cf6935ae7d9ba5407a547 3.2.4
115 1265a3a71d75396f5d4cf6935ae7d9ba5407a547 3.2.4
116 db8e3f7948b1fdeb9ad12d448fc3525759908b9f 3.3-rc
116 db8e3f7948b1fdeb9ad12d448fc3525759908b9f 3.3-rc
117 fbdd5195528fae4f41feebc1838215c110b25d6a 3.3
117 fbdd5195528fae4f41feebc1838215c110b25d6a 3.3
118 5b4ed033390bf6e2879c8f5c28c84e1ee3b87231 3.3.1
118 5b4ed033390bf6e2879c8f5c28c84e1ee3b87231 3.3.1
119 07a92bbd02e5e3a625e0820389b47786b02b2cea 3.3.2
119 07a92bbd02e5e3a625e0820389b47786b02b2cea 3.3.2
120 2e2e9a0750f91a6fe0ad88e4de34f8efefdcab08 3.3.3
120 2e2e9a0750f91a6fe0ad88e4de34f8efefdcab08 3.3.3
121 e89f909edffad558b56f4affa8239e4832f88de0 3.4-rc
121 e89f909edffad558b56f4affa8239e4832f88de0 3.4-rc
122 8cc6036bca532e06681c5a8fa37efaa812de67b5 3.4
122 8cc6036bca532e06681c5a8fa37efaa812de67b5 3.4
123 ed18f4acf435a2824c6f49fba40f42b9df5da7ad 3.4.1
123 ed18f4acf435a2824c6f49fba40f42b9df5da7ad 3.4.1
124 540cd0ddac49c1125b2e013aa2ff18ecbd4dd954 3.4.2
124 540cd0ddac49c1125b2e013aa2ff18ecbd4dd954 3.4.2
125 96a38d44ba093bd1d1ecfd34119e94056030278b 3.5-rc
125 96a38d44ba093bd1d1ecfd34119e94056030278b 3.5-rc
126 21aa1c313b05b1a85f8ffa1120d51579ddf6bf24 3.5
126 21aa1c313b05b1a85f8ffa1120d51579ddf6bf24 3.5
127 1a45e49a6bed023deb229102a8903234d18054d3 3.5.1
127 1a45e49a6bed023deb229102a8903234d18054d3 3.5.1
128 9a466b9f9792e3ad7ae3fc6c43c3ff2e136b718d 3.5.2
128 9a466b9f9792e3ad7ae3fc6c43c3ff2e136b718d 3.5.2
129 b66e3ca0b90c3095ea28dfd39aa24247bebf5c20 3.6-rc
129 b66e3ca0b90c3095ea28dfd39aa24247bebf5c20 3.6-rc
130 47dd34f2e7272be9e3b2a5a83cd0d20be44293f4 3.6
130 47dd34f2e7272be9e3b2a5a83cd0d20be44293f4 3.6
131 1aa5083cbebbe7575c88f3402ab377539b484897 3.6.1
131 1aa5083cbebbe7575c88f3402ab377539b484897 3.6.1
132 2d437a0f3355834a9485bbbeb30a52a052c98f19 3.6.2
132 2d437a0f3355834a9485bbbeb30a52a052c98f19 3.6.2
133 ea389970c08449440587712117f178d33bab3f1e 3.6.3
133 ea389970c08449440587712117f178d33bab3f1e 3.6.3
134 158bdc8965720ca4061f8f8d806563cfc7cdb62e 3.7-rc
134 158bdc8965720ca4061f8f8d806563cfc7cdb62e 3.7-rc
135 2408645de650d8a29a6ce9e7dce601d8dd0d1474 3.7
135 2408645de650d8a29a6ce9e7dce601d8dd0d1474 3.7
136 b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1
136 b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1
137 d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2
137 d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2
138 ae279d4a19e9683214cbd1fe8298cf0b50571432 3.7.3
138 ae279d4a19e9683214cbd1fe8298cf0b50571432 3.7.3
139 740156eedf2c450aee58b1a90b0e826f47c5da64 3.8-rc
139 740156eedf2c450aee58b1a90b0e826f47c5da64 3.8-rc
140 f85de28eae32e7d3064b1a1321309071bbaaa069 3.8
140 f85de28eae32e7d3064b1a1321309071bbaaa069 3.8
141 a56296f55a5e1038ea5016dace2076b693c28a56 3.8.1
141 a56296f55a5e1038ea5016dace2076b693c28a56 3.8.1
142 aaabed77791a75968a12b8c43ad263631a23ee81 3.8.2
142 aaabed77791a75968a12b8c43ad263631a23ee81 3.8.2
143 a9764ab80e11bcf6a37255db7dd079011f767c6c 3.8.3
143 a9764ab80e11bcf6a37255db7dd079011f767c6c 3.8.3
144 26a5d605b8683a292bb89aea11f37a81b06ac016 3.8.4
144 26a5d605b8683a292bb89aea11f37a81b06ac016 3.8.4
145 519bb4f9d3a47a6e83c2b414d58811ed38f503c2 3.9-rc
145 519bb4f9d3a47a6e83c2b414d58811ed38f503c2 3.9-rc
146 299546f84e68dbb9bd026f0f3a974ce4bdb93686 3.9
146 299546f84e68dbb9bd026f0f3a974ce4bdb93686 3.9
147 ccd436f7db6d5d7b9af89715179b911d031d44f1 3.9.1
147 ccd436f7db6d5d7b9af89715179b911d031d44f1 3.9.1
148 149433e68974eb5c63ccb03f794d8b57339a80c4 3.9.2
148 149433e68974eb5c63ccb03f794d8b57339a80c4 3.9.2
149 438173c415874f6ac653efc1099dec9c9150e90f 4.0-rc
149 438173c415874f6ac653efc1099dec9c9150e90f 4.0-rc
150 eab27446995210c334c3d06f1a659e3b9b5da769 4.0
150 eab27446995210c334c3d06f1a659e3b9b5da769 4.0
151 b3b1ae98f6a0e14c1e1ba806a6c18e193b6dae5c 4.0.1
151 b3b1ae98f6a0e14c1e1ba806a6c18e193b6dae5c 4.0.1
152 e69874dc1f4e142746ff3df91e678a09c6fc208c 4.0.2
152 e69874dc1f4e142746ff3df91e678a09c6fc208c 4.0.2
153 a1dd2c0c479e0550040542e392e87bc91262517e 4.1-rc
153 a1dd2c0c479e0550040542e392e87bc91262517e 4.1-rc
154 e1526da1e6d84e03146151c9b6e6950fe9a83d7d 4.1
154 e1526da1e6d84e03146151c9b6e6950fe9a83d7d 4.1
155 25703b624d27e3917d978af56d6ad59331e0464a 4.1.1
155 25703b624d27e3917d978af56d6ad59331e0464a 4.1.1
156 ed5b25874d998ababb181a939dd37a16ea644435 4.1.2
156 ed5b25874d998ababb181a939dd37a16ea644435 4.1.2
157 77eaf9539499a1b8be259ffe7ada787d07857f80 4.1.3
157 77eaf9539499a1b8be259ffe7ada787d07857f80 4.1.3
158 616e788321cc4ae9975b7f0c54c849f36d82182b 4.2-rc
158 616e788321cc4ae9975b7f0c54c849f36d82182b 4.2-rc
159 bb96d4a497432722623ae60d9bc734a1e360179e 4.2
159 bb96d4a497432722623ae60d9bc734a1e360179e 4.2
160 c850f0ed54c1d42f9aa079ad528f8127e5775217 4.2.1
160 c850f0ed54c1d42f9aa079ad528f8127e5775217 4.2.1
161 26c49ed51a698ec016d2b4c6b44ca3c3f73cc788 4.2.2
161 26c49ed51a698ec016d2b4c6b44ca3c3f73cc788 4.2.2
162 857876ebaed4e315f63157bd157d6ce553c7ab73 4.3-rc
162 857876ebaed4e315f63157bd157d6ce553c7ab73 4.3-rc
163 5544af8622863796a0027566f6b646e10d522c4c 4.3
163 5544af8622863796a0027566f6b646e10d522c4c 4.3
164 943c91326b23954e6e1c6960d0239511f9530258 4.2.3
164 943c91326b23954e6e1c6960d0239511f9530258 4.2.3
165 3fee7f7d2da04226914c2258cc2884dc27384fd7 4.3.1
165 3fee7f7d2da04226914c2258cc2884dc27384fd7 4.3.1
166 920977f72c7b70acfdaf56ab35360584d7845827 4.3.2
166 920977f72c7b70acfdaf56ab35360584d7845827 4.3.2
167 2f427b57bf9019c6dc3750baa539dc22c1be50f6 4.3.3
167 2f427b57bf9019c6dc3750baa539dc22c1be50f6 4.3.3
168 1e2454b60e5936f5e77498cab2648db469504487 4.4-rc
168 1e2454b60e5936f5e77498cab2648db469504487 4.4-rc
169 0ccb43d4cf01d013ae05917ec4f305509f851b2d 4.4
169 0ccb43d4cf01d013ae05917ec4f305509f851b2d 4.4
170 cabc840ffdee8a72f3689fb77dd74d04fdc2bc04 4.4.1
170 cabc840ffdee8a72f3689fb77dd74d04fdc2bc04 4.4.1
171 a92b9f8e11ba330614cdfd6af0e03b15c1ff3797 4.4.2
171 a92b9f8e11ba330614cdfd6af0e03b15c1ff3797 4.4.2
172 27b6df1b5adbdf647cf5c6675b40575e1b197c60 4.5-rc
172 27b6df1b5adbdf647cf5c6675b40575e1b197c60 4.5-rc
173 d334afc585e29577f271c5eda03378736a16ca6b 4.5
173 d334afc585e29577f271c5eda03378736a16ca6b 4.5
174 369aadf7a3264b03c8b09efce715bc41e6ab4a9b 4.5.1
174 369aadf7a3264b03c8b09efce715bc41e6ab4a9b 4.5.1
175 8bba684efde7f45add05f737952093bb2aa07155 4.5.2
175 8bba684efde7f45add05f737952093bb2aa07155 4.5.2
176 7de7bd407251af2bc98e5b809c8598ee95830daf 4.5.3
176 7de7bd407251af2bc98e5b809c8598ee95830daf 4.5.3
177 ed5448edcbfa747b9154099e18630e49024fd47b 4.6rc0
177 ed5448edcbfa747b9154099e18630e49024fd47b 4.6rc0
178 1ec874717d8a93b19e0d50628443e0ee5efab3a9 4.6rc1
178 1ec874717d8a93b19e0d50628443e0ee5efab3a9 4.6rc1
179 6614cac550aea66d19c601e45efd1b7bd08d7c40 4.6
179 6614cac550aea66d19c601e45efd1b7bd08d7c40 4.6
180 9c5ced5276d6e7d54f7c3dadf5247b7ee98ec79c 4.6.1
180 9c5ced5276d6e7d54f7c3dadf5247b7ee98ec79c 4.6.1
181 0b63a6743010dfdbf8a8154186e119949bdaa1cc 4.6.2
181 0b63a6743010dfdbf8a8154186e119949bdaa1cc 4.6.2
182 e90130af47ce8dd53a3109aed9d15876b3e7dee8 4.7rc0
182 e90130af47ce8dd53a3109aed9d15876b3e7dee8 4.7rc0
183 33ac6a72308a215e6086fbced347ec10aa963b0a 4.7
183 33ac6a72308a215e6086fbced347ec10aa963b0a 4.7
184 ede3bf31fe63677fdf5bd8db687977d4e3d792ed 4.7.1
184 ede3bf31fe63677fdf5bd8db687977d4e3d792ed 4.7.1
185 5405cb1a79010ac50c58cd84e6f50c4556bf2a4c 4.7.2
185 5405cb1a79010ac50c58cd84e6f50c4556bf2a4c 4.7.2
186 956ec6f1320df26f3133ec40f3de866ea0695fd7 4.8rc0
186 956ec6f1320df26f3133ec40f3de866ea0695fd7 4.8rc0
187 a91a2837150bdcb27ae76b3646e6c93cd6a15904 4.8
187 a91a2837150bdcb27ae76b3646e6c93cd6a15904 4.8
188 1c8c54cf97256f4468da2eb4dbee24f7f3888e71 4.8.1
188 1c8c54cf97256f4468da2eb4dbee24f7f3888e71 4.8.1
189 197f092b2cd9691e2a55d198f717b231af9be6f9 4.8.2
189 197f092b2cd9691e2a55d198f717b231af9be6f9 4.8.2
190 593718ff5844cad7a27ee3eb5adad89ac8550949 4.9rc0
190 593718ff5844cad7a27ee3eb5adad89ac8550949 4.9rc0
191 83377b4b4ae0e9a6b8e579f7b0a693b8cf5c3b10 4.9
191 83377b4b4ae0e9a6b8e579f7b0a693b8cf5c3b10 4.9
192 4ea21df312ec7159c5b3633096b6ecf68750b0dd 4.9.1
192 4ea21df312ec7159c5b3633096b6ecf68750b0dd 4.9.1
193 4a8d9ed864754837a185a642170cde24392f9abf 5.0rc0
193 4a8d9ed864754837a185a642170cde24392f9abf 5.0rc0
194 07e479ef7c9639be0029f00e6a722b96dcc05fee 5.0
194 07e479ef7c9639be0029f00e6a722b96dcc05fee 5.0
195 c3484ddbdb9621256d597ed86b90d229c59c2af9 5.0.1
195 c3484ddbdb9621256d597ed86b90d229c59c2af9 5.0.1
196 97ada9b8d51bef24c5cb4cdca4243f0db694ab6e 5.0.2
196 97ada9b8d51bef24c5cb4cdca4243f0db694ab6e 5.0.2
197 e386b5f4f8360dbb43a576dd9b1368e386fefa5b 5.1rc0
197 e386b5f4f8360dbb43a576dd9b1368e386fefa5b 5.1rc0
198 e91930d712e8507d1bc1b2dffd96c83edc4cbed3 5.1
198 e91930d712e8507d1bc1b2dffd96c83edc4cbed3 5.1
199 a4e32fd539ab41489a51b2aa88bda9a73b839562 5.1.1
199 a4e32fd539ab41489a51b2aa88bda9a73b839562 5.1.1
200 181e52f2b62f4768aa0d988936c929dc7c4a41a0 5.1.2
200 181e52f2b62f4768aa0d988936c929dc7c4a41a0 5.1.2
201 59338f9561099de77c684c00f76507f11e46ebe8 5.2rc0
201 59338f9561099de77c684c00f76507f11e46ebe8 5.2rc0
202 ca3dca416f8d5863ca6f5a4a6a6bb835dcd5feeb 5.2
202 ca3dca416f8d5863ca6f5a4a6a6bb835dcd5feeb 5.2
203 a50fecefa691c9b72a99e49aa6fe9dd13943c2bf 5.2.1
203 a50fecefa691c9b72a99e49aa6fe9dd13943c2bf 5.2.1
204 b4c82b70418022e67cc0e69b1aa3c3aa43aa1d29 5.2.2
204 b4c82b70418022e67cc0e69b1aa3c3aa43aa1d29 5.2.2
205 84a0102c05c7852c8215ef6cf21d809927586b69 5.3rc0
205 84a0102c05c7852c8215ef6cf21d809927586b69 5.3rc0
206 e4344e463c0c888a2f437b78b5982ecdf3f6650a 5.3rc1
206 e4344e463c0c888a2f437b78b5982ecdf3f6650a 5.3rc1
207 7f5410dfc8a64bb587d19637deb95d378fd1eb5c 5.3
207 7f5410dfc8a64bb587d19637deb95d378fd1eb5c 5.3
208 6d121acbb82e65fe4dd3c2318a1b61981b958492 5.3.1
208 6d121acbb82e65fe4dd3c2318a1b61981b958492 5.3.1
209 8fca7e8449a847e3cf1054f2c07b51237699fad3 5.3.2
209 8fca7e8449a847e3cf1054f2c07b51237699fad3 5.3.2
210 26ce8e7515036d3431a03aaeb7bc72dd96cb1112 5.4rc0
210 26ce8e7515036d3431a03aaeb7bc72dd96cb1112 5.4rc0
211 cf3e07d7648a4371ce584d15dd692e7a6845792f 5.4
211 cf3e07d7648a4371ce584d15dd692e7a6845792f 5.4
212 065704cbdbdbb05dcd6bb814eb9bbdd982211b28 5.4.1
212 065704cbdbdbb05dcd6bb814eb9bbdd982211b28 5.4.1
213 0ea9c86fac8974cd74dc12ea681c8986eb6da6c4 5.4.2
213 0ea9c86fac8974cd74dc12ea681c8986eb6da6c4 5.4.2
214 28163c5de797e5416f9b588940f4608269b4d50a 5.5rc0
214 28163c5de797e5416f9b588940f4608269b4d50a 5.5rc0
215 7fc3c5fbc65f6fe85d70ea63923b8767dda4f2e0 5.5
215 7fc3c5fbc65f6fe85d70ea63923b8767dda4f2e0 5.5
216 f62bb5d07848ca598aa860a517394130b61bf2ee 5.5.1
216 f62bb5d07848ca598aa860a517394130b61bf2ee 5.5.1
217 07731064ac41dacdf0ec869ebd05c2e848c14fbf 5.5.2
217 07731064ac41dacdf0ec869ebd05c2e848c14fbf 5.5.2
218 0e06a7ab9e0d5c65af4e511aee1e0342998799df 5.6rc0
218 0e06a7ab9e0d5c65af4e511aee1e0342998799df 5.6rc0
219 18c17d63fdabd009e70bf994e5efb7db422f4f7f 5.6
219 18c17d63fdabd009e70bf994e5efb7db422f4f7f 5.6
220 1d5189a57405ceca5aa244052c9f948977f4699b 5.6.1
220 1d5189a57405ceca5aa244052c9f948977f4699b 5.6.1
221 9da65e3cf3706ff41e08b311381c588440c27baf 5.7rc0
221 9da65e3cf3706ff41e08b311381c588440c27baf 5.7rc0
222 0e2e7300f4302b02412b0b734717697049494c4c 5.7
222 0e2e7300f4302b02412b0b734717697049494c4c 5.7
223 d5d9177c0045d206db575bae6daa98e2cb2fe5bc 5.7.1
223 d5d9177c0045d206db575bae6daa98e2cb2fe5bc 5.7.1
224 f67b8946bb1b6cfa8328dbf8d6a9128b69ccdcb4 5.8rc0
224 f67b8946bb1b6cfa8328dbf8d6a9128b69ccdcb4 5.8rc0
225 8d2b62d716b095507effaa8d56f87cd27ba659ab 5.8rc1
225 8d2b62d716b095507effaa8d56f87cd27ba659ab 5.8rc1
226 067f2c53fb24506c9e9fb4639871b13b19a85f8a 5.8
226 067f2c53fb24506c9e9fb4639871b13b19a85f8a 5.8
227 411dc27fd9fd076d6a031a08fcaace659afe2fe3 5.8.1
227 411dc27fd9fd076d6a031a08fcaace659afe2fe3 5.8.1
228 d7515d29761d5ada7d9c765f517db67db75dea9a 5.9rc0
228 d7515d29761d5ada7d9c765f517db67db75dea9a 5.9rc0
229 2813d406b03607cdb8c06cb04c44efcc9a79d9a2 5.9rc1
229 2813d406b03607cdb8c06cb04c44efcc9a79d9a2 5.9rc1
230 53221078e0de65d1a821ce5311dec45a7a978301 5.9
230 53221078e0de65d1a821ce5311dec45a7a978301 5.9
231 86a60679cf619e14cee9442f865fcf31b142cb9f 5.9.1
231 86a60679cf619e14cee9442f865fcf31b142cb9f 5.9.1
232 750920b18aaaddd654756be40dec59d90f2643be 5.9.2
232 750920b18aaaddd654756be40dec59d90f2643be 5.9.2
233 6ee0244fc1cf889ae543d2ce0ec45201ae0be6e1 5.9.3
233 6ee0244fc1cf889ae543d2ce0ec45201ae0be6e1 5.9.3
234 a44bb185f6bdbecc754996d8386722e2f0123b0a 6.0rc0
234 a44bb185f6bdbecc754996d8386722e2f0123b0a 6.0rc0
235 5d08b289e2e526259d7d5ea32b70fe76d5b327d7 6.0
235 5d08b289e2e526259d7d5ea32b70fe76d5b327d7 6.0
236 799fdf4cca80cb9ae40537a90995e6bd163ebc0b 6.0.1
236 799fdf4cca80cb9ae40537a90995e6bd163ebc0b 6.0.1
237 75676122c2bf7594ac732b7388db4c74c648b365 6.0.2
237 75676122c2bf7594ac732b7388db4c74c648b365 6.0.2
238 dcec16e799ddb6d33fcd11b04af530250a417a58 6.0.3
238 dcec16e799ddb6d33fcd11b04af530250a417a58 6.0.3
239 c00d3ce4e94bb0ee8d809e25e1dcb2a5fab84e2c 6.1rc0
239 c00d3ce4e94bb0ee8d809e25e1dcb2a5fab84e2c 6.1rc0
240 d4486810a1795fba9521449b8885ced034f3a6dd 6.1
240 d4486810a1795fba9521449b8885ced034f3a6dd 6.1
241 5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
241 5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
242 0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
242 0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
243 6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
243 6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
244 0cc5f74ff7f0f4ac2427096bddbe102dbc2453ae 6.1.4
244 0cc5f74ff7f0f4ac2427096bddbe102dbc2453ae 6.1.4
245 288de6f5d724bba7bf1669e2838f196962bb7528 6.2rc0
245 288de6f5d724bba7bf1669e2838f196962bb7528 6.2rc0
246 094a5fa3cf52f936e0de3f1e507c818bee5ece6b 6.2
246 094a5fa3cf52f936e0de3f1e507c818bee5ece6b 6.2
247 f69bffd00abe3a1b94d1032eb2c92e611d16a192 6.2.1
247 f69bffd00abe3a1b94d1032eb2c92e611d16a192 6.2.1
248 b5c8524827d20fe2e0ca8fb1234a0fe35a1a36c7 6.2.2
248 b5c8524827d20fe2e0ca8fb1234a0fe35a1a36c7 6.2.2
249 dbdee8ac3e3fcdda1fa55b90c0a235125b7f8e6f 6.2.3
249 dbdee8ac3e3fcdda1fa55b90c0a235125b7f8e6f 6.2.3
250 a3356ab610fc50000cf0ba55c424a4d96da11db7 6.3rc0
250 a3356ab610fc50000cf0ba55c424a4d96da11db7 6.3rc0
251 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
251 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
252 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3
252 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3
253 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
253 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
254 0000000000000000000000000000000000000000 6.3.0
254 0000000000000000000000000000000000000000 6.3.0
255 c890d8b8bc59b18e5febf60caada629df5356ee2 6.3.1
255 c890d8b8bc59b18e5febf60caada629df5356ee2 6.3.1
256 59466b13a3ae0e29a5d4f485393e516cfbb057d0 6.3.2
256 59466b13a3ae0e29a5d4f485393e516cfbb057d0 6.3.2
257 8830004967ad865ead89c28a410405a6e71e0796 6.3.3
257 8830004967ad865ead89c28a410405a6e71e0796 6.3.3
258 05de4896508e8ec387b33eb30d8aab78d1c8e9e4 6.4rc0
258 05de4896508e8ec387b33eb30d8aab78d1c8e9e4 6.4rc0
259 f14864fffdcab725d9eac6d4f4c07be05a35f59a 6.4
259 f14864fffdcab725d9eac6d4f4c07be05a35f59a 6.4
260 83ea6ce48b4fd09fb79c4e34cc5750c805699a53 6.4.1
260 83ea6ce48b4fd09fb79c4e34cc5750c805699a53 6.4.1
261 f952be90b0514a576dcc8bbe758ce3847faba9bb 6.4.2
261 f952be90b0514a576dcc8bbe758ce3847faba9bb 6.4.2
262 fc445f8abcf90b33db7c463816a1b3560681767f 6.4.3
262 fc445f8abcf90b33db7c463816a1b3560681767f 6.4.3
263 da372c745e0f053bb7a64e74cccd15810d96341d 6.4.4
263 da372c745e0f053bb7a64e74cccd15810d96341d 6.4.4
264 271a4ab29605ffa0bae5d3208eaa21a95427ff92 6.4.5
264 271a4ab29605ffa0bae5d3208eaa21a95427ff92 6.4.5
265 bb42988c7e156931b0ff1e93732b98173ebbcb7f 6.5rc0
265 bb42988c7e156931b0ff1e93732b98173ebbcb7f 6.5rc0
266 3ffc7209bbae5804a53084c9dc2d41139e88c867 6.5
266 3ffc7209bbae5804a53084c9dc2d41139e88c867 6.5
267 787af4e0e8b787e1b77a8059926b123730a4cd01 6.5.1
267 787af4e0e8b787e1b77a8059926b123730a4cd01 6.5.1
268 5a8b5420103937fca97c584c5162178eed828ada 6.5.2
268 5a8b5420103937fca97c584c5162178eed828ada 6.5.2
269 c083d9776cb2fb6056715b2988d1ea48055f3162 6.5.3
269 c083d9776cb2fb6056715b2988d1ea48055f3162 6.5.3
270 27055614b68538576fb0439007009acf93fe0a49 6.6rc0
270 27055614b68538576fb0439007009acf93fe0a49 6.6rc0
271 26c57e7a0890b96e2c473b394de380d6753c9230 6.6
271 26c57e7a0890b96e2c473b394de380d6753c9230 6.6
272 71bd09bebbe36a09569cbfb388f371433360056b 6.6.1
272 71bd09bebbe36a09569cbfb388f371433360056b 6.6.1
273 136902b3a95db38854ebaf5198a627641065c2ea 6.6.2
@@ -1,160 +1,182 b''
1 # narrowwirepeer.py - passes narrow spec with unbundle command
1 # narrowwirepeer.py - passes narrow spec with unbundle command
2 #
2 #
3 # Copyright 2017 Google, Inc.
3 # Copyright 2017 Google, Inc.
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
8
9 from mercurial.i18n import _
10
11 from mercurial.utils import stringutil
12
9 from mercurial import (
13 from mercurial import (
10 bundle2,
14 bundle2,
11 error,
15 error,
12 exchange,
16 exchange,
13 extensions,
17 extensions,
14 hg,
18 hg,
15 narrowspec,
19 narrowspec,
16 wireprototypes,
20 wireprototypes,
17 wireprotov1peer,
21 wireprotov1peer,
18 wireprotov1server,
22 wireprotov1server,
19 )
23 )
20
24
21 from . import narrowbundle2
25 from . import narrowbundle2
22
26
23
27
24 def uisetup():
28 def uisetup():
25 wireprotov1peer.wirepeer.narrow_widen = peernarrowwiden
29 wireprotov1peer.wirepeer.narrow_widen = peernarrowwiden
26
30
27
31
28 def reposetup(repo):
32 def reposetup(repo):
29 def wirereposetup(ui, peer):
33 def wirereposetup(ui, peer):
30 def wrapped(orig, cmd, *args, **kwargs):
34 def wrapped(orig, cmd, *args, **kwargs):
31 if cmd == b'unbundle':
35 if cmd == b'unbundle':
32 # TODO: don't blindly add include/exclude wireproto
36 # TODO: don't blindly add include/exclude wireproto
33 # arguments to unbundle.
37 # arguments to unbundle.
34 include, exclude = repo.narrowpats
38 include, exclude = repo.narrowpats
35 kwargs["includepats"] = b','.join(include)
39 kwargs["includepats"] = b','.join(include)
36 kwargs["excludepats"] = b','.join(exclude)
40 kwargs["excludepats"] = b','.join(exclude)
37 return orig(cmd, *args, **kwargs)
41 return orig(cmd, *args, **kwargs)
38
42
39 extensions.wrapfunction(peer, '_calltwowaystream', wrapped)
43 extensions.wrapfunction(peer, '_calltwowaystream', wrapped)
40
44
41 hg.wirepeersetupfuncs.append(wirereposetup)
45 hg.wirepeersetupfuncs.append(wirereposetup)
42
46
43
47
44 @wireprotov1server.wireprotocommand(
48 @wireprotov1server.wireprotocommand(
45 b'narrow_widen',
49 b'narrow_widen',
46 b'oldincludes oldexcludes'
50 b'oldincludes oldexcludes'
47 b' newincludes newexcludes'
51 b' newincludes newexcludes'
48 b' commonheads cgversion'
52 b' commonheads cgversion'
49 b' known ellipses',
53 b' known ellipses',
50 permission=b'pull',
54 permission=b'pull',
51 )
55 )
52 def narrow_widen(
56 def narrow_widen(
53 repo,
57 repo,
54 proto,
58 proto,
55 oldincludes,
59 oldincludes,
56 oldexcludes,
60 oldexcludes,
57 newincludes,
61 newincludes,
58 newexcludes,
62 newexcludes,
59 commonheads,
63 commonheads,
60 cgversion,
64 cgversion,
61 known,
65 known,
62 ellipses,
66 ellipses,
63 ):
67 ):
64 """wireprotocol command to send data when a narrow clone is widen. We will
68 """wireprotocol command to send data when a narrow clone is widen. We will
65 be sending a changegroup here.
69 be sending a changegroup here.
66
70
67 The current set of arguments which are required:
71 The current set of arguments which are required:
68 oldincludes: the old includes of the narrow copy
72 oldincludes: the old includes of the narrow copy
69 oldexcludes: the old excludes of the narrow copy
73 oldexcludes: the old excludes of the narrow copy
70 newincludes: the new includes of the narrow copy
74 newincludes: the new includes of the narrow copy
71 newexcludes: the new excludes of the narrow copy
75 newexcludes: the new excludes of the narrow copy
72 commonheads: list of heads which are common between the server and client
76 commonheads: list of heads which are common between the server and client
73 cgversion(maybe): the changegroup version to produce
77 cgversion(maybe): the changegroup version to produce
74 known: list of nodes which are known on the client (used in ellipses cases)
78 known: list of nodes which are known on the client (used in ellipses cases)
75 ellipses: whether to send ellipses data or not
79 ellipses: whether to send ellipses data or not
76 """
80 """
77
81
78 preferuncompressed = False
82 preferuncompressed = False
79 try:
83 try:
80
84
81 def splitpaths(data):
85 def splitpaths(data):
82 # work around ''.split(',') => ['']
86 # work around ''.split(',') => ['']
83 return data.split(b',') if data else []
87 return data.split(b',') if data else []
84
88
85 oldincludes = splitpaths(oldincludes)
89 oldincludes = set(splitpaths(oldincludes))
86 newincludes = splitpaths(newincludes)
90 newincludes = set(splitpaths(newincludes))
87 oldexcludes = splitpaths(oldexcludes)
91 oldexcludes = set(splitpaths(oldexcludes))
88 newexcludes = splitpaths(newexcludes)
92 newexcludes = set(splitpaths(newexcludes))
89
93
90 # enforce narrow acl if set
94 # enforce narrow acl if set
91 if repo.ui.has_section(exchange._NARROWACL_SECTION):
95 if repo.ui.has_section(exchange._NARROWACL_SECTION):
92 exchange.applynarrowacl(repo, {'includepats': newincludes})
96 kwargs = exchange.applynarrowacl(
97 repo, {'includepats': newincludes, 'excludepats': newexcludes}
98 )
99 newincludes = kwargs['includepats']
100 requiredexcludes = kwargs['excludepats'] - newexcludes
101 if requiredexcludes:
102 # XXX: The below code to get the username was copied from exchange.py,
103 # where it is noted that this is technically a layering violation for
104 # assuming the existence of HTTP. Using it anyway to make the error
105 # message consistent with the error message for invalid includes.
106 ui = repo.ui
107 username = ui.shortuser(
108 ui.environ.get(b'REMOTE_USER') or ui.username()
109 )
110 raise error.Abort(
111 _(b"The following excludes cannot be removed for %s: %s")
112 % (username, stringutil.pprint(list(requiredexcludes)))
113 )
114 newexcludes = kwargs['excludepats']
93
115
94 # validate the patterns
116 # validate the patterns
95 narrowspec.validatepatterns(set(oldincludes))
117 narrowspec.validatepatterns(oldincludes)
96 narrowspec.validatepatterns(set(newincludes))
118 narrowspec.validatepatterns(newincludes)
97 narrowspec.validatepatterns(set(oldexcludes))
119 narrowspec.validatepatterns(oldexcludes)
98 narrowspec.validatepatterns(set(newexcludes))
120 narrowspec.validatepatterns(newexcludes)
99
121
100 common = wireprototypes.decodelist(commonheads)
122 common = wireprototypes.decodelist(commonheads)
101 known = wireprototypes.decodelist(known)
123 known = wireprototypes.decodelist(known)
102 if ellipses == b'0':
124 if ellipses == b'0':
103 ellipses = False
125 ellipses = False
104 else:
126 else:
105 ellipses = bool(ellipses)
127 ellipses = bool(ellipses)
106 cgversion = cgversion
128 cgversion = cgversion
107
129
108 bundler = bundle2.bundle20(repo.ui)
130 bundler = bundle2.bundle20(repo.ui)
109 newmatch = narrowspec.match(
131 newmatch = narrowspec.match(
110 repo.root, include=newincludes, exclude=newexcludes
132 repo.root, include=newincludes, exclude=newexcludes
111 )
133 )
112 oldmatch = narrowspec.match(
134 oldmatch = narrowspec.match(
113 repo.root, include=oldincludes, exclude=oldexcludes
135 repo.root, include=oldincludes, exclude=oldexcludes
114 )
136 )
115 if not ellipses:
137 if not ellipses:
116 bundle2.widen_bundle(
138 bundle2.widen_bundle(
117 bundler,
139 bundler,
118 repo,
140 repo,
119 oldmatch,
141 oldmatch,
120 newmatch,
142 newmatch,
121 common,
143 common,
122 known,
144 known,
123 cgversion,
145 cgversion,
124 ellipses,
146 ellipses,
125 )
147 )
126 else:
148 else:
127 narrowbundle2.generate_ellipses_bundle2_for_widening(
149 narrowbundle2.generate_ellipses_bundle2_for_widening(
128 bundler,
150 bundler,
129 repo,
151 repo,
130 oldmatch,
152 oldmatch,
131 newmatch,
153 newmatch,
132 cgversion,
154 cgversion,
133 common,
155 common,
134 known,
156 known,
135 )
157 )
136 except error.Abort as exc:
158 except error.Abort as exc:
137 bundler = bundle2.bundle20(repo.ui)
159 bundler = bundle2.bundle20(repo.ui)
138 manargs = [(b'message', exc.message)]
160 manargs = [(b'message', exc.message)]
139 advargs = []
161 advargs = []
140 if exc.hint is not None:
162 if exc.hint is not None:
141 advargs.append((b'hint', exc.hint))
163 advargs.append((b'hint', exc.hint))
142 bundler.addpart(bundle2.bundlepart(b'error:abort', manargs, advargs))
164 bundler.addpart(bundle2.bundlepart(b'error:abort', manargs, advargs))
143 preferuncompressed = True
165 preferuncompressed = True
144
166
145 chunks = bundler.getchunks()
167 chunks = bundler.getchunks()
146 return wireprototypes.streamres(
168 return wireprototypes.streamres(
147 gen=chunks, prefer_uncompressed=preferuncompressed
169 gen=chunks, prefer_uncompressed=preferuncompressed
148 )
170 )
149
171
150
172
151 def peernarrowwiden(remote, **kwargs):
173 def peernarrowwiden(remote, **kwargs):
152 for ch in ('commonheads', 'known'):
174 for ch in ('commonheads', 'known'):
153 kwargs[ch] = wireprototypes.encodelist(kwargs[ch])
175 kwargs[ch] = wireprototypes.encodelist(kwargs[ch])
154
176
155 for ch in ('oldincludes', 'newincludes', 'oldexcludes', 'newexcludes'):
177 for ch in ('oldincludes', 'newincludes', 'oldexcludes', 'newexcludes'):
156 kwargs[ch] = b','.join(kwargs[ch])
178 kwargs[ch] = b','.join(kwargs[ch])
157
179
158 kwargs['ellipses'] = b'%i' % bool(kwargs['ellipses'])
180 kwargs['ellipses'] = b'%i' % bool(kwargs['ellipses'])
159 f = remote._callcompressable(b'narrow_widen', **kwargs)
181 f = remote._callcompressable(b'narrow_widen', **kwargs)
160 return bundle2.getunbundler(remote.ui, f)
182 return bundle2.getunbundler(remote.ui, f)
@@ -1,8053 +1,8058 b''
1 # commands.py - command processing for mercurial
1 # commands.py - command processing for mercurial
2 #
2 #
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.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
8
9 import os
9 import os
10 import re
10 import re
11 import sys
11 import sys
12
12
13 from .i18n import _
13 from .i18n import _
14 from .node import (
14 from .node import (
15 hex,
15 hex,
16 nullid,
16 nullid,
17 nullrev,
17 nullrev,
18 short,
18 short,
19 wdirrev,
19 wdirrev,
20 )
20 )
21 from . import (
21 from . import (
22 admin_commands as admin_commands_mod,
22 admin_commands as admin_commands_mod,
23 archival,
23 archival,
24 bookmarks,
24 bookmarks,
25 bundle2,
25 bundle2,
26 bundlecaches,
26 bundlecaches,
27 changegroup,
27 changegroup,
28 cmdutil,
28 cmdutil,
29 copies,
29 copies,
30 debugcommands as debugcommandsmod,
30 debugcommands as debugcommandsmod,
31 destutil,
31 destutil,
32 diffutil,
32 diffutil,
33 discovery,
33 discovery,
34 encoding,
34 encoding,
35 error,
35 error,
36 exchange,
36 exchange,
37 extensions,
37 extensions,
38 filemerge,
38 filemerge,
39 formatter,
39 formatter,
40 graphmod,
40 graphmod,
41 grep as grepmod,
41 grep as grepmod,
42 hbisect,
42 hbisect,
43 help,
43 help,
44 hg,
44 hg,
45 logcmdutil,
45 logcmdutil,
46 merge as mergemod,
46 merge as mergemod,
47 mergestate as mergestatemod,
47 mergestate as mergestatemod,
48 narrowspec,
48 narrowspec,
49 obsolete,
49 obsolete,
50 obsutil,
50 obsutil,
51 patch,
51 patch,
52 phases,
52 phases,
53 pycompat,
53 pycompat,
54 rcutil,
54 rcutil,
55 registrar,
55 registrar,
56 requirements,
56 requirements,
57 revsetlang,
57 revsetlang,
58 rewriteutil,
58 rewriteutil,
59 scmutil,
59 scmutil,
60 server,
60 server,
61 shelve as shelvemod,
61 shelve as shelvemod,
62 state as statemod,
62 state as statemod,
63 streamclone,
63 streamclone,
64 tags as tagsmod,
64 tags as tagsmod,
65 ui as uimod,
65 ui as uimod,
66 util,
66 util,
67 verify as verifymod,
67 verify as verifymod,
68 vfs as vfsmod,
68 vfs as vfsmod,
69 wireprotoserver,
69 wireprotoserver,
70 )
70 )
71 from .utils import (
71 from .utils import (
72 dateutil,
72 dateutil,
73 procutil,
73 procutil,
74 stringutil,
74 stringutil,
75 urlutil,
75 urlutil,
76 )
76 )
77
77
78 table = {}
78 table = {}
79 table.update(debugcommandsmod.command._table)
79 table.update(debugcommandsmod.command._table)
80 table.update(admin_commands_mod.command._table)
80 table.update(admin_commands_mod.command._table)
81
81
82 command = registrar.command(table)
82 command = registrar.command(table)
83 INTENT_READONLY = registrar.INTENT_READONLY
83 INTENT_READONLY = registrar.INTENT_READONLY
84
84
85 # common command options
85 # common command options
86
86
87 globalopts = [
87 globalopts = [
88 (
88 (
89 b'R',
89 b'R',
90 b'repository',
90 b'repository',
91 b'',
91 b'',
92 _(b'repository root directory or name of overlay bundle file'),
92 _(b'repository root directory or name of overlay bundle file'),
93 _(b'REPO'),
93 _(b'REPO'),
94 ),
94 ),
95 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
95 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
96 (
96 (
97 b'y',
97 b'y',
98 b'noninteractive',
98 b'noninteractive',
99 None,
99 None,
100 _(
100 _(
101 b'do not prompt, automatically pick the first choice for all prompts'
101 b'do not prompt, automatically pick the first choice for all prompts'
102 ),
102 ),
103 ),
103 ),
104 (b'q', b'quiet', None, _(b'suppress output')),
104 (b'q', b'quiet', None, _(b'suppress output')),
105 (b'v', b'verbose', None, _(b'enable additional output')),
105 (b'v', b'verbose', None, _(b'enable additional output')),
106 (
106 (
107 b'',
107 b'',
108 b'color',
108 b'color',
109 b'',
109 b'',
110 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
110 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
111 # and should not be translated
111 # and should not be translated
112 _(b"when to colorize (boolean, always, auto, never, or debug)"),
112 _(b"when to colorize (boolean, always, auto, never, or debug)"),
113 _(b'TYPE'),
113 _(b'TYPE'),
114 ),
114 ),
115 (
115 (
116 b'',
116 b'',
117 b'config',
117 b'config',
118 [],
118 [],
119 _(b'set/override config option (use \'section.name=value\')'),
119 _(b'set/override config option (use \'section.name=value\')'),
120 _(b'CONFIG'),
120 _(b'CONFIG'),
121 ),
121 ),
122 (b'', b'debug', None, _(b'enable debugging output')),
122 (b'', b'debug', None, _(b'enable debugging output')),
123 (b'', b'debugger', None, _(b'start debugger')),
123 (b'', b'debugger', None, _(b'start debugger')),
124 (
124 (
125 b'',
125 b'',
126 b'encoding',
126 b'encoding',
127 encoding.encoding,
127 encoding.encoding,
128 _(b'set the charset encoding'),
128 _(b'set the charset encoding'),
129 _(b'ENCODE'),
129 _(b'ENCODE'),
130 ),
130 ),
131 (
131 (
132 b'',
132 b'',
133 b'encodingmode',
133 b'encodingmode',
134 encoding.encodingmode,
134 encoding.encodingmode,
135 _(b'set the charset encoding mode'),
135 _(b'set the charset encoding mode'),
136 _(b'MODE'),
136 _(b'MODE'),
137 ),
137 ),
138 (b'', b'traceback', None, _(b'always print a traceback on exception')),
138 (b'', b'traceback', None, _(b'always print a traceback on exception')),
139 (b'', b'time', None, _(b'time how long the command takes')),
139 (b'', b'time', None, _(b'time how long the command takes')),
140 (b'', b'profile', None, _(b'print command execution profile')),
140 (b'', b'profile', None, _(b'print command execution profile')),
141 (b'', b'version', None, _(b'output version information and exit')),
141 (b'', b'version', None, _(b'output version information and exit')),
142 (b'h', b'help', None, _(b'display help and exit')),
142 (b'h', b'help', None, _(b'display help and exit')),
143 (b'', b'hidden', False, _(b'consider hidden changesets')),
143 (b'', b'hidden', False, _(b'consider hidden changesets')),
144 (
144 (
145 b'',
145 b'',
146 b'pager',
146 b'pager',
147 b'auto',
147 b'auto',
148 _(b"when to paginate (boolean, always, auto, or never)"),
148 _(b"when to paginate (boolean, always, auto, or never)"),
149 _(b'TYPE'),
149 _(b'TYPE'),
150 ),
150 ),
151 ]
151 ]
152
152
153 dryrunopts = cmdutil.dryrunopts
153 dryrunopts = cmdutil.dryrunopts
154 remoteopts = cmdutil.remoteopts
154 remoteopts = cmdutil.remoteopts
155 walkopts = cmdutil.walkopts
155 walkopts = cmdutil.walkopts
156 commitopts = cmdutil.commitopts
156 commitopts = cmdutil.commitopts
157 commitopts2 = cmdutil.commitopts2
157 commitopts2 = cmdutil.commitopts2
158 commitopts3 = cmdutil.commitopts3
158 commitopts3 = cmdutil.commitopts3
159 formatteropts = cmdutil.formatteropts
159 formatteropts = cmdutil.formatteropts
160 templateopts = cmdutil.templateopts
160 templateopts = cmdutil.templateopts
161 logopts = cmdutil.logopts
161 logopts = cmdutil.logopts
162 diffopts = cmdutil.diffopts
162 diffopts = cmdutil.diffopts
163 diffwsopts = cmdutil.diffwsopts
163 diffwsopts = cmdutil.diffwsopts
164 diffopts2 = cmdutil.diffopts2
164 diffopts2 = cmdutil.diffopts2
165 mergetoolopts = cmdutil.mergetoolopts
165 mergetoolopts = cmdutil.mergetoolopts
166 similarityopts = cmdutil.similarityopts
166 similarityopts = cmdutil.similarityopts
167 subrepoopts = cmdutil.subrepoopts
167 subrepoopts = cmdutil.subrepoopts
168 debugrevlogopts = cmdutil.debugrevlogopts
168 debugrevlogopts = cmdutil.debugrevlogopts
169
169
170 # Commands start here, listed alphabetically
170 # Commands start here, listed alphabetically
171
171
172
172
173 @command(
173 @command(
174 b'abort',
174 b'abort',
175 dryrunopts,
175 dryrunopts,
176 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
176 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
177 helpbasic=True,
177 helpbasic=True,
178 )
178 )
179 def abort(ui, repo, **opts):
179 def abort(ui, repo, **opts):
180 """abort an unfinished operation (EXPERIMENTAL)
180 """abort an unfinished operation (EXPERIMENTAL)
181
181
182 Aborts a multistep operation like graft, histedit, rebase, merge,
182 Aborts a multistep operation like graft, histedit, rebase, merge,
183 and unshelve if they are in an unfinished state.
183 and unshelve if they are in an unfinished state.
184
184
185 use --dry-run/-n to dry run the command.
185 use --dry-run/-n to dry run the command.
186 """
186 """
187 dryrun = opts.get('dry_run')
187 dryrun = opts.get('dry_run')
188 abortstate = cmdutil.getunfinishedstate(repo)
188 abortstate = cmdutil.getunfinishedstate(repo)
189 if not abortstate:
189 if not abortstate:
190 raise error.StateError(_(b'no operation in progress'))
190 raise error.StateError(_(b'no operation in progress'))
191 if not abortstate.abortfunc:
191 if not abortstate.abortfunc:
192 raise error.InputError(
192 raise error.InputError(
193 (
193 (
194 _(b"%s in progress but does not support 'hg abort'")
194 _(b"%s in progress but does not support 'hg abort'")
195 % (abortstate._opname)
195 % (abortstate._opname)
196 ),
196 ),
197 hint=abortstate.hint(),
197 hint=abortstate.hint(),
198 )
198 )
199 if dryrun:
199 if dryrun:
200 ui.status(
200 ui.status(
201 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
201 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
202 )
202 )
203 return
203 return
204 return abortstate.abortfunc(ui, repo)
204 return abortstate.abortfunc(ui, repo)
205
205
206
206
207 @command(
207 @command(
208 b'add',
208 b'add',
209 walkopts + subrepoopts + dryrunopts,
209 walkopts + subrepoopts + dryrunopts,
210 _(b'[OPTION]... [FILE]...'),
210 _(b'[OPTION]... [FILE]...'),
211 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
211 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
212 helpbasic=True,
212 helpbasic=True,
213 inferrepo=True,
213 inferrepo=True,
214 )
214 )
215 def add(ui, repo, *pats, **opts):
215 def add(ui, repo, *pats, **opts):
216 """add the specified files on the next commit
216 """add the specified files on the next commit
217
217
218 Schedule files to be version controlled and added to the
218 Schedule files to be version controlled and added to the
219 repository.
219 repository.
220
220
221 The files will be added to the repository at the next commit. To
221 The files will be added to the repository at the next commit. To
222 undo an add before that, see :hg:`forget`.
222 undo an add before that, see :hg:`forget`.
223
223
224 If no names are given, add all files to the repository (except
224 If no names are given, add all files to the repository (except
225 files matching ``.hgignore``).
225 files matching ``.hgignore``).
226
226
227 .. container:: verbose
227 .. container:: verbose
228
228
229 Examples:
229 Examples:
230
230
231 - New (unknown) files are added
231 - New (unknown) files are added
232 automatically by :hg:`add`::
232 automatically by :hg:`add`::
233
233
234 $ ls
234 $ ls
235 foo.c
235 foo.c
236 $ hg status
236 $ hg status
237 ? foo.c
237 ? foo.c
238 $ hg add
238 $ hg add
239 adding foo.c
239 adding foo.c
240 $ hg status
240 $ hg status
241 A foo.c
241 A foo.c
242
242
243 - Specific files to be added can be specified::
243 - Specific files to be added can be specified::
244
244
245 $ ls
245 $ ls
246 bar.c foo.c
246 bar.c foo.c
247 $ hg status
247 $ hg status
248 ? bar.c
248 ? bar.c
249 ? foo.c
249 ? foo.c
250 $ hg add bar.c
250 $ hg add bar.c
251 $ hg status
251 $ hg status
252 A bar.c
252 A bar.c
253 ? foo.c
253 ? foo.c
254
254
255 Returns 0 if all files are successfully added.
255 Returns 0 if all files are successfully added.
256 """
256 """
257
257
258 with repo.wlock(), repo.dirstate.changing_files(repo):
258 with repo.wlock(), repo.dirstate.changing_files(repo):
259 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
259 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
260 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
260 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
261 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
261 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
262 return rejected and 1 or 0
262 return rejected and 1 or 0
263
263
264
264
265 @command(
265 @command(
266 b'addremove',
266 b'addremove',
267 similarityopts + subrepoopts + walkopts + dryrunopts,
267 similarityopts + subrepoopts + walkopts + dryrunopts,
268 _(b'[OPTION]... [FILE]...'),
268 _(b'[OPTION]... [FILE]...'),
269 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
269 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
270 inferrepo=True,
270 inferrepo=True,
271 )
271 )
272 def addremove(ui, repo, *pats, **opts):
272 def addremove(ui, repo, *pats, **opts):
273 """add all new files, delete all missing files
273 """add all new files, delete all missing files
274
274
275 Add all new files and remove all missing files from the
275 Add all new files and remove all missing files from the
276 repository.
276 repository.
277
277
278 Unless names are given, new files are ignored if they match any of
278 Unless names are given, new files are ignored if they match any of
279 the patterns in ``.hgignore``. As with add, these changes take
279 the patterns in ``.hgignore``. As with add, these changes take
280 effect at the next commit.
280 effect at the next commit.
281
281
282 Use the -s/--similarity option to detect renamed files. This
282 Use the -s/--similarity option to detect renamed files. This
283 option takes a percentage between 0 (disabled) and 100 (files must
283 option takes a percentage between 0 (disabled) and 100 (files must
284 be identical) as its parameter. With a parameter greater than 0,
284 be identical) as its parameter. With a parameter greater than 0,
285 this compares every removed file with every added file and records
285 this compares every removed file with every added file and records
286 those similar enough as renames. Detecting renamed files this way
286 those similar enough as renames. Detecting renamed files this way
287 can be expensive. After using this option, :hg:`status -C` can be
287 can be expensive. After using this option, :hg:`status -C` can be
288 used to check which files were identified as moved or renamed. If
288 used to check which files were identified as moved or renamed. If
289 not specified, -s/--similarity defaults to 100 and only renames of
289 not specified, -s/--similarity defaults to 100 and only renames of
290 identical files are detected.
290 identical files are detected.
291
291
292 .. container:: verbose
292 .. container:: verbose
293
293
294 Examples:
294 Examples:
295
295
296 - A number of files (bar.c and foo.c) are new,
296 - A number of files (bar.c and foo.c) are new,
297 while foobar.c has been removed (without using :hg:`remove`)
297 while foobar.c has been removed (without using :hg:`remove`)
298 from the repository::
298 from the repository::
299
299
300 $ ls
300 $ ls
301 bar.c foo.c
301 bar.c foo.c
302 $ hg status
302 $ hg status
303 ! foobar.c
303 ! foobar.c
304 ? bar.c
304 ? bar.c
305 ? foo.c
305 ? foo.c
306 $ hg addremove
306 $ hg addremove
307 adding bar.c
307 adding bar.c
308 adding foo.c
308 adding foo.c
309 removing foobar.c
309 removing foobar.c
310 $ hg status
310 $ hg status
311 A bar.c
311 A bar.c
312 A foo.c
312 A foo.c
313 R foobar.c
313 R foobar.c
314
314
315 - A file foobar.c was moved to foo.c without using :hg:`rename`.
315 - A file foobar.c was moved to foo.c without using :hg:`rename`.
316 Afterwards, it was edited slightly::
316 Afterwards, it was edited slightly::
317
317
318 $ ls
318 $ ls
319 foo.c
319 foo.c
320 $ hg status
320 $ hg status
321 ! foobar.c
321 ! foobar.c
322 ? foo.c
322 ? foo.c
323 $ hg addremove --similarity 90
323 $ hg addremove --similarity 90
324 removing foobar.c
324 removing foobar.c
325 adding foo.c
325 adding foo.c
326 recording removal of foobar.c as rename to foo.c (94% similar)
326 recording removal of foobar.c as rename to foo.c (94% similar)
327 $ hg status -C
327 $ hg status -C
328 A foo.c
328 A foo.c
329 foobar.c
329 foobar.c
330 R foobar.c
330 R foobar.c
331
331
332 Returns 0 if all files are successfully added.
332 Returns 0 if all files are successfully added.
333 """
333 """
334 opts = pycompat.byteskwargs(opts)
334 opts = pycompat.byteskwargs(opts)
335 if not opts.get(b'similarity'):
335 if not opts.get(b'similarity'):
336 opts[b'similarity'] = b'100'
336 opts[b'similarity'] = b'100'
337 with repo.wlock(), repo.dirstate.changing_files(repo):
337 with repo.wlock(), repo.dirstate.changing_files(repo):
338 matcher = scmutil.match(repo[None], pats, opts)
338 matcher = scmutil.match(repo[None], pats, opts)
339 relative = scmutil.anypats(pats, opts)
339 relative = scmutil.anypats(pats, opts)
340 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
340 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
341 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
341 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
342
342
343
343
344 @command(
344 @command(
345 b'annotate|blame',
345 b'annotate|blame',
346 [
346 [
347 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
347 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
348 (
348 (
349 b'',
349 b'',
350 b'follow',
350 b'follow',
351 None,
351 None,
352 _(b'follow copies/renames and list the filename (DEPRECATED)'),
352 _(b'follow copies/renames and list the filename (DEPRECATED)'),
353 ),
353 ),
354 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
354 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
355 (b'a', b'text', None, _(b'treat all files as text')),
355 (b'a', b'text', None, _(b'treat all files as text')),
356 (b'u', b'user', None, _(b'list the author (long with -v)')),
356 (b'u', b'user', None, _(b'list the author (long with -v)')),
357 (b'f', b'file', None, _(b'list the filename')),
357 (b'f', b'file', None, _(b'list the filename')),
358 (b'd', b'date', None, _(b'list the date (short with -q)')),
358 (b'd', b'date', None, _(b'list the date (short with -q)')),
359 (b'n', b'number', None, _(b'list the revision number (default)')),
359 (b'n', b'number', None, _(b'list the revision number (default)')),
360 (b'c', b'changeset', None, _(b'list the changeset')),
360 (b'c', b'changeset', None, _(b'list the changeset')),
361 (
361 (
362 b'l',
362 b'l',
363 b'line-number',
363 b'line-number',
364 None,
364 None,
365 _(b'show line number at the first appearance'),
365 _(b'show line number at the first appearance'),
366 ),
366 ),
367 (
367 (
368 b'',
368 b'',
369 b'skip',
369 b'skip',
370 [],
370 [],
371 _(b'revset to not display (EXPERIMENTAL)'),
371 _(b'revset to not display (EXPERIMENTAL)'),
372 _(b'REV'),
372 _(b'REV'),
373 ),
373 ),
374 ]
374 ]
375 + diffwsopts
375 + diffwsopts
376 + walkopts
376 + walkopts
377 + formatteropts,
377 + formatteropts,
378 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
378 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
379 helpcategory=command.CATEGORY_FILE_CONTENTS,
379 helpcategory=command.CATEGORY_FILE_CONTENTS,
380 helpbasic=True,
380 helpbasic=True,
381 inferrepo=True,
381 inferrepo=True,
382 )
382 )
383 def annotate(ui, repo, *pats, **opts):
383 def annotate(ui, repo, *pats, **opts):
384 """show changeset information by line for each file
384 """show changeset information by line for each file
385
385
386 List changes in files, showing the revision id responsible for
386 List changes in files, showing the revision id responsible for
387 each line.
387 each line.
388
388
389 This command is useful for discovering when a change was made and
389 This command is useful for discovering when a change was made and
390 by whom.
390 by whom.
391
391
392 If you include --file, --user, or --date, the revision number is
392 If you include --file, --user, or --date, the revision number is
393 suppressed unless you also include --number.
393 suppressed unless you also include --number.
394
394
395 Without the -a/--text option, annotate will avoid processing files
395 Without the -a/--text option, annotate will avoid processing files
396 it detects as binary. With -a, annotate will annotate the file
396 it detects as binary. With -a, annotate will annotate the file
397 anyway, although the results will probably be neither useful
397 anyway, although the results will probably be neither useful
398 nor desirable.
398 nor desirable.
399
399
400 .. container:: verbose
400 .. container:: verbose
401
401
402 Template:
402 Template:
403
403
404 The following keywords are supported in addition to the common template
404 The following keywords are supported in addition to the common template
405 keywords and functions. See also :hg:`help templates`.
405 keywords and functions. See also :hg:`help templates`.
406
406
407 :lines: List of lines with annotation data.
407 :lines: List of lines with annotation data.
408 :path: String. Repository-absolute path of the specified file.
408 :path: String. Repository-absolute path of the specified file.
409
409
410 And each entry of ``{lines}`` provides the following sub-keywords in
410 And each entry of ``{lines}`` provides the following sub-keywords in
411 addition to ``{date}``, ``{node}``, ``{rev}``, ``{user}``, etc.
411 addition to ``{date}``, ``{node}``, ``{rev}``, ``{user}``, etc.
412
412
413 :line: String. Line content.
413 :line: String. Line content.
414 :lineno: Integer. Line number at that revision.
414 :lineno: Integer. Line number at that revision.
415 :path: String. Repository-absolute path of the file at that revision.
415 :path: String. Repository-absolute path of the file at that revision.
416
416
417 See :hg:`help templates.operators` for the list expansion syntax.
417 See :hg:`help templates.operators` for the list expansion syntax.
418
418
419 Returns 0 on success.
419 Returns 0 on success.
420 """
420 """
421 opts = pycompat.byteskwargs(opts)
421 opts = pycompat.byteskwargs(opts)
422 if not pats:
422 if not pats:
423 raise error.InputError(
423 raise error.InputError(
424 _(b'at least one filename or pattern is required')
424 _(b'at least one filename or pattern is required')
425 )
425 )
426
426
427 if opts.get(b'follow'):
427 if opts.get(b'follow'):
428 # --follow is deprecated and now just an alias for -f/--file
428 # --follow is deprecated and now just an alias for -f/--file
429 # to mimic the behavior of Mercurial before version 1.5
429 # to mimic the behavior of Mercurial before version 1.5
430 opts[b'file'] = True
430 opts[b'file'] = True
431
431
432 if (
432 if (
433 not opts.get(b'user')
433 not opts.get(b'user')
434 and not opts.get(b'changeset')
434 and not opts.get(b'changeset')
435 and not opts.get(b'date')
435 and not opts.get(b'date')
436 and not opts.get(b'file')
436 and not opts.get(b'file')
437 ):
437 ):
438 opts[b'number'] = True
438 opts[b'number'] = True
439
439
440 linenumber = opts.get(b'line_number') is not None
440 linenumber = opts.get(b'line_number') is not None
441 if (
441 if (
442 linenumber
442 linenumber
443 and (not opts.get(b'changeset'))
443 and (not opts.get(b'changeset'))
444 and (not opts.get(b'number'))
444 and (not opts.get(b'number'))
445 ):
445 ):
446 raise error.InputError(_(b'at least one of -n/-c is required for -l'))
446 raise error.InputError(_(b'at least one of -n/-c is required for -l'))
447
447
448 rev = opts.get(b'rev')
448 rev = opts.get(b'rev')
449 if rev:
449 if rev:
450 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
450 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
451 ctx = logcmdutil.revsingle(repo, rev)
451 ctx = logcmdutil.revsingle(repo, rev)
452
452
453 ui.pager(b'annotate')
453 ui.pager(b'annotate')
454 rootfm = ui.formatter(b'annotate', opts)
454 rootfm = ui.formatter(b'annotate', opts)
455 if ui.debugflag:
455 if ui.debugflag:
456 shorthex = pycompat.identity
456 shorthex = pycompat.identity
457 else:
457 else:
458
458
459 def shorthex(h):
459 def shorthex(h):
460 return h[:12]
460 return h[:12]
461
461
462 if ui.quiet:
462 if ui.quiet:
463 datefunc = dateutil.shortdate
463 datefunc = dateutil.shortdate
464 else:
464 else:
465 datefunc = dateutil.datestr
465 datefunc = dateutil.datestr
466 if ctx.rev() is None:
466 if ctx.rev() is None:
467 if opts.get(b'changeset'):
467 if opts.get(b'changeset'):
468 # omit "+" suffix which is appended to node hex
468 # omit "+" suffix which is appended to node hex
469 def formatrev(rev):
469 def formatrev(rev):
470 if rev == wdirrev:
470 if rev == wdirrev:
471 return b'%d' % ctx.p1().rev()
471 return b'%d' % ctx.p1().rev()
472 else:
472 else:
473 return b'%d' % rev
473 return b'%d' % rev
474
474
475 else:
475 else:
476
476
477 def formatrev(rev):
477 def formatrev(rev):
478 if rev == wdirrev:
478 if rev == wdirrev:
479 return b'%d+' % ctx.p1().rev()
479 return b'%d+' % ctx.p1().rev()
480 else:
480 else:
481 return b'%d ' % rev
481 return b'%d ' % rev
482
482
483 def formathex(h):
483 def formathex(h):
484 if h == repo.nodeconstants.wdirhex:
484 if h == repo.nodeconstants.wdirhex:
485 return b'%s+' % shorthex(hex(ctx.p1().node()))
485 return b'%s+' % shorthex(hex(ctx.p1().node()))
486 else:
486 else:
487 return b'%s ' % shorthex(h)
487 return b'%s ' % shorthex(h)
488
488
489 else:
489 else:
490 formatrev = b'%d'.__mod__
490 formatrev = b'%d'.__mod__
491 formathex = shorthex
491 formathex = shorthex
492
492
493 opmap = [
493 opmap = [
494 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
494 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
495 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
495 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
496 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
496 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
497 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
497 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
498 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
498 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
499 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
499 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
500 ]
500 ]
501 opnamemap = {
501 opnamemap = {
502 b'rev': b'number',
502 b'rev': b'number',
503 b'node': b'changeset',
503 b'node': b'changeset',
504 b'path': b'file',
504 b'path': b'file',
505 b'lineno': b'line_number',
505 b'lineno': b'line_number',
506 }
506 }
507
507
508 if rootfm.isplain():
508 if rootfm.isplain():
509
509
510 def makefunc(get, fmt):
510 def makefunc(get, fmt):
511 return lambda x: fmt(get(x))
511 return lambda x: fmt(get(x))
512
512
513 else:
513 else:
514
514
515 def makefunc(get, fmt):
515 def makefunc(get, fmt):
516 return get
516 return get
517
517
518 datahint = rootfm.datahint()
518 datahint = rootfm.datahint()
519 funcmap = [
519 funcmap = [
520 (makefunc(get, fmt), sep)
520 (makefunc(get, fmt), sep)
521 for fn, sep, get, fmt in opmap
521 for fn, sep, get, fmt in opmap
522 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
522 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
523 ]
523 ]
524 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
524 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
525 fields = b' '.join(
525 fields = b' '.join(
526 fn
526 fn
527 for fn, sep, get, fmt in opmap
527 for fn, sep, get, fmt in opmap
528 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
528 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
529 )
529 )
530
530
531 def bad(x, y):
531 def bad(x, y):
532 raise error.InputError(b"%s: %s" % (x, y))
532 raise error.InputError(b"%s: %s" % (x, y))
533
533
534 m = scmutil.match(ctx, pats, opts, badfn=bad)
534 m = scmutil.match(ctx, pats, opts, badfn=bad)
535
535
536 follow = not opts.get(b'no_follow')
536 follow = not opts.get(b'no_follow')
537 diffopts = patch.difffeatureopts(
537 diffopts = patch.difffeatureopts(
538 ui, opts, section=b'annotate', whitespace=True
538 ui, opts, section=b'annotate', whitespace=True
539 )
539 )
540 skiprevs = opts.get(b'skip')
540 skiprevs = opts.get(b'skip')
541 if skiprevs:
541 if skiprevs:
542 skiprevs = logcmdutil.revrange(repo, skiprevs)
542 skiprevs = logcmdutil.revrange(repo, skiprevs)
543
543
544 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
544 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
545 for abs in ctx.walk(m):
545 for abs in ctx.walk(m):
546 fctx = ctx[abs]
546 fctx = ctx[abs]
547 rootfm.startitem()
547 rootfm.startitem()
548 rootfm.data(path=abs)
548 rootfm.data(path=abs)
549 if not opts.get(b'text') and fctx.isbinary():
549 if not opts.get(b'text') and fctx.isbinary():
550 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
550 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
551 continue
551 continue
552
552
553 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
553 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
554 lines = fctx.annotate(
554 lines = fctx.annotate(
555 follow=follow, skiprevs=skiprevs, diffopts=diffopts
555 follow=follow, skiprevs=skiprevs, diffopts=diffopts
556 )
556 )
557 if not lines:
557 if not lines:
558 fm.end()
558 fm.end()
559 continue
559 continue
560 formats = []
560 formats = []
561 pieces = []
561 pieces = []
562
562
563 for f, sep in funcmap:
563 for f, sep in funcmap:
564 l = [f(n) for n in lines]
564 l = [f(n) for n in lines]
565 if fm.isplain():
565 if fm.isplain():
566 sizes = [encoding.colwidth(x) for x in l]
566 sizes = [encoding.colwidth(x) for x in l]
567 ml = max(sizes)
567 ml = max(sizes)
568 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
568 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
569 else:
569 else:
570 formats.append([b'%s'] * len(l))
570 formats.append([b'%s'] * len(l))
571 pieces.append(l)
571 pieces.append(l)
572
572
573 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
573 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
574 fm.startitem()
574 fm.startitem()
575 fm.context(fctx=n.fctx)
575 fm.context(fctx=n.fctx)
576 fm.write(fields, b"".join(f), *p)
576 fm.write(fields, b"".join(f), *p)
577 if n.skip:
577 if n.skip:
578 fmt = b"* %s"
578 fmt = b"* %s"
579 else:
579 else:
580 fmt = b": %s"
580 fmt = b": %s"
581 fm.write(b'line', fmt, n.text)
581 fm.write(b'line', fmt, n.text)
582
582
583 if not lines[-1].text.endswith(b'\n'):
583 if not lines[-1].text.endswith(b'\n'):
584 fm.plain(b'\n')
584 fm.plain(b'\n')
585 fm.end()
585 fm.end()
586
586
587 rootfm.end()
587 rootfm.end()
588
588
589
589
590 @command(
590 @command(
591 b'archive',
591 b'archive',
592 [
592 [
593 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
593 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
594 (
594 (
595 b'p',
595 b'p',
596 b'prefix',
596 b'prefix',
597 b'',
597 b'',
598 _(b'directory prefix for files in archive'),
598 _(b'directory prefix for files in archive'),
599 _(b'PREFIX'),
599 _(b'PREFIX'),
600 ),
600 ),
601 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
601 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
602 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
602 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
603 ]
603 ]
604 + subrepoopts
604 + subrepoopts
605 + walkopts,
605 + walkopts,
606 _(b'[OPTION]... DEST'),
606 _(b'[OPTION]... DEST'),
607 helpcategory=command.CATEGORY_IMPORT_EXPORT,
607 helpcategory=command.CATEGORY_IMPORT_EXPORT,
608 )
608 )
609 def archive(ui, repo, dest, **opts):
609 def archive(ui, repo, dest, **opts):
610 """create an unversioned archive of a repository revision
610 """create an unversioned archive of a repository revision
611
611
612 By default, the revision used is the parent of the working
612 By default, the revision used is the parent of the working
613 directory; use -r/--rev to specify a different revision.
613 directory; use -r/--rev to specify a different revision.
614
614
615 The archive type is automatically detected based on file
615 The archive type is automatically detected based on file
616 extension (to override, use -t/--type).
616 extension (to override, use -t/--type).
617
617
618 .. container:: verbose
618 .. container:: verbose
619
619
620 Examples:
620 Examples:
621
621
622 - create a zip file containing the 1.0 release::
622 - create a zip file containing the 1.0 release::
623
623
624 hg archive -r 1.0 project-1.0.zip
624 hg archive -r 1.0 project-1.0.zip
625
625
626 - create a tarball excluding .hg files::
626 - create a tarball excluding .hg files::
627
627
628 hg archive project.tar.gz -X ".hg*"
628 hg archive project.tar.gz -X ".hg*"
629
629
630 Valid types are:
630 Valid types are:
631
631
632 :``files``: a directory full of files (default)
632 :``files``: a directory full of files (default)
633 :``tar``: tar archive, uncompressed
633 :``tar``: tar archive, uncompressed
634 :``tbz2``: tar archive, compressed using bzip2
634 :``tbz2``: tar archive, compressed using bzip2
635 :``tgz``: tar archive, compressed using gzip
635 :``tgz``: tar archive, compressed using gzip
636 :``txz``: tar archive, compressed using lzma (only in Python 3)
636 :``txz``: tar archive, compressed using lzma (only in Python 3)
637 :``uzip``: zip archive, uncompressed
637 :``uzip``: zip archive, uncompressed
638 :``zip``: zip archive, compressed using deflate
638 :``zip``: zip archive, compressed using deflate
639
639
640 The exact name of the destination archive or directory is given
640 The exact name of the destination archive or directory is given
641 using a format string; see :hg:`help export` for details.
641 using a format string; see :hg:`help export` for details.
642
642
643 Each member added to an archive file has a directory prefix
643 Each member added to an archive file has a directory prefix
644 prepended. Use -p/--prefix to specify a format string for the
644 prepended. Use -p/--prefix to specify a format string for the
645 prefix. The default is the basename of the archive, with suffixes
645 prefix. The default is the basename of the archive, with suffixes
646 removed.
646 removed.
647
647
648 Returns 0 on success.
648 Returns 0 on success.
649 """
649 """
650
650
651 rev = opts.get('rev')
651 rev = opts.get('rev')
652 if rev:
652 if rev:
653 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
653 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
654 ctx = logcmdutil.revsingle(repo, rev)
654 ctx = logcmdutil.revsingle(repo, rev)
655 if not ctx:
655 if not ctx:
656 raise error.InputError(
656 raise error.InputError(
657 _(b'no working directory: please specify a revision')
657 _(b'no working directory: please specify a revision')
658 )
658 )
659 node = ctx.node()
659 node = ctx.node()
660 dest = cmdutil.makefilename(ctx, dest)
660 dest = cmdutil.makefilename(ctx, dest)
661 if os.path.realpath(dest) == repo.root:
661 if os.path.realpath(dest) == repo.root:
662 raise error.InputError(_(b'repository root cannot be destination'))
662 raise error.InputError(_(b'repository root cannot be destination'))
663
663
664 kind = opts.get('type') or archival.guesskind(dest) or b'files'
664 kind = opts.get('type') or archival.guesskind(dest) or b'files'
665 prefix = opts.get('prefix')
665 prefix = opts.get('prefix')
666
666
667 if dest == b'-':
667 if dest == b'-':
668 if kind == b'files':
668 if kind == b'files':
669 raise error.InputError(_(b'cannot archive plain files to stdout'))
669 raise error.InputError(_(b'cannot archive plain files to stdout'))
670 dest = cmdutil.makefileobj(ctx, dest)
670 dest = cmdutil.makefileobj(ctx, dest)
671 if not prefix:
671 if not prefix:
672 prefix = os.path.basename(repo.root) + b'-%h'
672 prefix = os.path.basename(repo.root) + b'-%h'
673
673
674 prefix = cmdutil.makefilename(ctx, prefix)
674 prefix = cmdutil.makefilename(ctx, prefix)
675 match = scmutil.match(ctx, [], pycompat.byteskwargs(opts))
675 match = scmutil.match(ctx, [], pycompat.byteskwargs(opts))
676 archival.archive(
676 archival.archive(
677 repo,
677 repo,
678 dest,
678 dest,
679 node,
679 node,
680 kind,
680 kind,
681 not opts.get('no_decode'),
681 not opts.get('no_decode'),
682 match,
682 match,
683 prefix,
683 prefix,
684 subrepos=opts.get('subrepos'),
684 subrepos=opts.get('subrepos'),
685 )
685 )
686
686
687
687
688 @command(
688 @command(
689 b'backout',
689 b'backout',
690 [
690 [
691 (
691 (
692 b'',
692 b'',
693 b'merge',
693 b'merge',
694 None,
694 None,
695 _(b'merge with old dirstate parent after backout'),
695 _(b'merge with old dirstate parent after backout'),
696 ),
696 ),
697 (
697 (
698 b'',
698 b'',
699 b'commit',
699 b'commit',
700 None,
700 None,
701 _(b'commit if no conflicts were encountered (DEPRECATED)'),
701 _(b'commit if no conflicts were encountered (DEPRECATED)'),
702 ),
702 ),
703 (b'', b'no-commit', None, _(b'do not commit')),
703 (b'', b'no-commit', None, _(b'do not commit')),
704 (
704 (
705 b'',
705 b'',
706 b'parent',
706 b'parent',
707 b'',
707 b'',
708 _(b'parent to choose when backing out merge (DEPRECATED)'),
708 _(b'parent to choose when backing out merge (DEPRECATED)'),
709 _(b'REV'),
709 _(b'REV'),
710 ),
710 ),
711 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
711 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
712 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
712 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
713 ]
713 ]
714 + mergetoolopts
714 + mergetoolopts
715 + walkopts
715 + walkopts
716 + commitopts
716 + commitopts
717 + commitopts2,
717 + commitopts2,
718 _(b'[OPTION]... [-r] REV'),
718 _(b'[OPTION]... [-r] REV'),
719 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
719 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
720 )
720 )
721 def backout(ui, repo, node=None, rev=None, **opts):
721 def backout(ui, repo, node=None, rev=None, **opts):
722 """reverse effect of earlier changeset
722 """reverse effect of earlier changeset
723
723
724 Prepare a new changeset with the effect of REV undone in the
724 Prepare a new changeset with the effect of REV undone in the
725 current working directory. If no conflicts were encountered,
725 current working directory. If no conflicts were encountered,
726 it will be committed immediately.
726 it will be committed immediately.
727
727
728 If REV is the parent of the working directory, then this new changeset
728 If REV is the parent of the working directory, then this new changeset
729 is committed automatically (unless --no-commit is specified).
729 is committed automatically (unless --no-commit is specified).
730
730
731 .. note::
731 .. note::
732
732
733 :hg:`backout` cannot be used to fix either an unwanted or
733 :hg:`backout` cannot be used to fix either an unwanted or
734 incorrect merge.
734 incorrect merge.
735
735
736 .. container:: verbose
736 .. container:: verbose
737
737
738 Examples:
738 Examples:
739
739
740 - Reverse the effect of the parent of the working directory.
740 - Reverse the effect of the parent of the working directory.
741 This backout will be committed immediately::
741 This backout will be committed immediately::
742
742
743 hg backout -r .
743 hg backout -r .
744
744
745 - Reverse the effect of previous bad revision 23::
745 - Reverse the effect of previous bad revision 23::
746
746
747 hg backout -r 23
747 hg backout -r 23
748
748
749 - Reverse the effect of previous bad revision 23 and
749 - Reverse the effect of previous bad revision 23 and
750 leave changes uncommitted::
750 leave changes uncommitted::
751
751
752 hg backout -r 23 --no-commit
752 hg backout -r 23 --no-commit
753 hg commit -m "Backout revision 23"
753 hg commit -m "Backout revision 23"
754
754
755 By default, the pending changeset will have one parent,
755 By default, the pending changeset will have one parent,
756 maintaining a linear history. With --merge, the pending
756 maintaining a linear history. With --merge, the pending
757 changeset will instead have two parents: the old parent of the
757 changeset will instead have two parents: the old parent of the
758 working directory and a new child of REV that simply undoes REV.
758 working directory and a new child of REV that simply undoes REV.
759
759
760 Before version 1.7, the behavior without --merge was equivalent
760 Before version 1.7, the behavior without --merge was equivalent
761 to specifying --merge followed by :hg:`update --clean .` to
761 to specifying --merge followed by :hg:`update --clean .` to
762 cancel the merge and leave the child of REV as a head to be
762 cancel the merge and leave the child of REV as a head to be
763 merged separately.
763 merged separately.
764
764
765 See :hg:`help dates` for a list of formats valid for -d/--date.
765 See :hg:`help dates` for a list of formats valid for -d/--date.
766
766
767 See :hg:`help revert` for a way to restore files to the state
767 See :hg:`help revert` for a way to restore files to the state
768 of another revision.
768 of another revision.
769
769
770 Returns 0 on success, 1 if nothing to backout or there are unresolved
770 Returns 0 on success, 1 if nothing to backout or there are unresolved
771 files.
771 files.
772 """
772 """
773 with repo.wlock(), repo.lock():
773 with repo.wlock(), repo.lock():
774 return _dobackout(ui, repo, node, rev, **opts)
774 return _dobackout(ui, repo, node, rev, **opts)
775
775
776
776
777 def _dobackout(ui, repo, node=None, rev=None, **opts):
777 def _dobackout(ui, repo, node=None, rev=None, **opts):
778 cmdutil.check_incompatible_arguments(opts, 'no_commit', ['commit', 'merge'])
778 cmdutil.check_incompatible_arguments(opts, 'no_commit', ['commit', 'merge'])
779
779
780 if rev and node:
780 if rev and node:
781 raise error.InputError(_(b"please specify just one revision"))
781 raise error.InputError(_(b"please specify just one revision"))
782
782
783 if not rev:
783 if not rev:
784 rev = node
784 rev = node
785
785
786 if not rev:
786 if not rev:
787 raise error.InputError(_(b"please specify a revision to backout"))
787 raise error.InputError(_(b"please specify a revision to backout"))
788
788
789 date = opts.get('date')
789 date = opts.get('date')
790 if date:
790 if date:
791 opts['date'] = dateutil.parsedate(date)
791 opts['date'] = dateutil.parsedate(date)
792
792
793 cmdutil.checkunfinished(repo)
793 cmdutil.checkunfinished(repo)
794 cmdutil.bailifchanged(repo)
794 cmdutil.bailifchanged(repo)
795 ctx = logcmdutil.revsingle(repo, rev)
795 ctx = logcmdutil.revsingle(repo, rev)
796 node = ctx.node()
796 node = ctx.node()
797
797
798 op1, op2 = repo.dirstate.parents()
798 op1, op2 = repo.dirstate.parents()
799 if not repo.changelog.isancestor(node, op1):
799 if not repo.changelog.isancestor(node, op1):
800 raise error.InputError(
800 raise error.InputError(
801 _(b'cannot backout change that is not an ancestor')
801 _(b'cannot backout change that is not an ancestor')
802 )
802 )
803
803
804 p1, p2 = repo.changelog.parents(node)
804 p1, p2 = repo.changelog.parents(node)
805 if p1 == repo.nullid:
805 if p1 == repo.nullid:
806 raise error.InputError(_(b'cannot backout a change with no parents'))
806 raise error.InputError(_(b'cannot backout a change with no parents'))
807 if p2 != repo.nullid:
807 if p2 != repo.nullid:
808 if not opts.get('parent'):
808 if not opts.get('parent'):
809 raise error.InputError(_(b'cannot backout a merge changeset'))
809 raise error.InputError(_(b'cannot backout a merge changeset'))
810 p = repo.lookup(opts['parent'])
810 p = repo.lookup(opts['parent'])
811 if p not in (p1, p2):
811 if p not in (p1, p2):
812 raise error.InputError(
812 raise error.InputError(
813 _(b'%s is not a parent of %s') % (short(p), short(node))
813 _(b'%s is not a parent of %s') % (short(p), short(node))
814 )
814 )
815 parent = p
815 parent = p
816 else:
816 else:
817 if opts.get('parent'):
817 if opts.get('parent'):
818 raise error.InputError(
818 raise error.InputError(
819 _(b'cannot use --parent on non-merge changeset')
819 _(b'cannot use --parent on non-merge changeset')
820 )
820 )
821 parent = p1
821 parent = p1
822
822
823 # the backout should appear on the same branch
823 # the backout should appear on the same branch
824 branch = repo.dirstate.branch()
824 branch = repo.dirstate.branch()
825 bheads = repo.branchheads(branch)
825 bheads = repo.branchheads(branch)
826 rctx = scmutil.revsingle(repo, hex(parent))
826 rctx = scmutil.revsingle(repo, hex(parent))
827 if not opts.get('merge') and op1 != node:
827 if not opts.get('merge') and op1 != node:
828 with repo.transaction(b"backout"):
828 with repo.transaction(b"backout"):
829 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
829 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
830 with ui.configoverride(overrides, b'backout'):
830 with ui.configoverride(overrides, b'backout'):
831 stats = mergemod.back_out(ctx, parent=repo[parent])
831 stats = mergemod.back_out(ctx, parent=repo[parent])
832 repo.setparents(op1, op2)
832 repo.setparents(op1, op2)
833 hg._showstats(repo, stats)
833 hg._showstats(repo, stats)
834 if stats.unresolvedcount:
834 if stats.unresolvedcount:
835 repo.ui.status(
835 repo.ui.status(
836 _(b"use 'hg resolve' to retry unresolved file merges\n")
836 _(b"use 'hg resolve' to retry unresolved file merges\n")
837 )
837 )
838 return 1
838 return 1
839 else:
839 else:
840 hg.clean(repo, node, show_stats=False)
840 hg.clean(repo, node, show_stats=False)
841 repo.dirstate.setbranch(branch, repo.currenttransaction())
841 repo.dirstate.setbranch(branch, repo.currenttransaction())
842 cmdutil.revert(ui, repo, rctx)
842 cmdutil.revert(ui, repo, rctx)
843
843
844 if opts.get('no_commit'):
844 if opts.get('no_commit'):
845 msg = _(b"changeset %s backed out, don't forget to commit.\n")
845 msg = _(b"changeset %s backed out, don't forget to commit.\n")
846 ui.status(msg % short(node))
846 ui.status(msg % short(node))
847 return 0
847 return 0
848
848
849 def commitfunc(ui, repo, message, match, opts):
849 def commitfunc(ui, repo, message, match, opts):
850 editform = b'backout'
850 editform = b'backout'
851 e = cmdutil.getcommiteditor(
851 e = cmdutil.getcommiteditor(
852 editform=editform, **pycompat.strkwargs(opts)
852 editform=editform, **pycompat.strkwargs(opts)
853 )
853 )
854 if not message:
854 if not message:
855 # we don't translate commit messages
855 # we don't translate commit messages
856 message = b"Backed out changeset %s" % short(node)
856 message = b"Backed out changeset %s" % short(node)
857 e = cmdutil.getcommiteditor(edit=True, editform=editform)
857 e = cmdutil.getcommiteditor(edit=True, editform=editform)
858 return repo.commit(
858 return repo.commit(
859 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
859 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
860 )
860 )
861
861
862 # save to detect changes
862 # save to detect changes
863 tip = repo.changelog.tip()
863 tip = repo.changelog.tip()
864
864
865 newnode = cmdutil.commit(
865 newnode = cmdutil.commit(
866 ui, repo, commitfunc, [], pycompat.byteskwargs(opts)
866 ui, repo, commitfunc, [], pycompat.byteskwargs(opts)
867 )
867 )
868 if not newnode:
868 if not newnode:
869 ui.status(_(b"nothing changed\n"))
869 ui.status(_(b"nothing changed\n"))
870 return 1
870 return 1
871 cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
871 cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
872
872
873 def nice(node):
873 def nice(node):
874 return b'%d:%s' % (repo.changelog.rev(node), short(node))
874 return b'%d:%s' % (repo.changelog.rev(node), short(node))
875
875
876 ui.status(
876 ui.status(
877 _(b'changeset %s backs out changeset %s\n')
877 _(b'changeset %s backs out changeset %s\n')
878 % (nice(newnode), nice(node))
878 % (nice(newnode), nice(node))
879 )
879 )
880 if opts.get('merge') and op1 != node:
880 if opts.get('merge') and op1 != node:
881 hg.clean(repo, op1, show_stats=False)
881 hg.clean(repo, op1, show_stats=False)
882 ui.status(_(b'merging with changeset %s\n') % nice(newnode))
882 ui.status(_(b'merging with changeset %s\n') % nice(newnode))
883 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
883 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
884 with ui.configoverride(overrides, b'backout'):
884 with ui.configoverride(overrides, b'backout'):
885 return hg.merge(repo[b'tip'])
885 return hg.merge(repo[b'tip'])
886 return 0
886 return 0
887
887
888
888
889 @command(
889 @command(
890 b'bisect',
890 b'bisect',
891 [
891 [
892 (b'r', b'reset', False, _(b'reset bisect state')),
892 (b'r', b'reset', False, _(b'reset bisect state')),
893 (b'g', b'good', False, _(b'mark changeset good')),
893 (b'g', b'good', False, _(b'mark changeset good')),
894 (b'b', b'bad', False, _(b'mark changeset bad')),
894 (b'b', b'bad', False, _(b'mark changeset bad')),
895 (b's', b'skip', False, _(b'skip testing changeset')),
895 (b's', b'skip', False, _(b'skip testing changeset')),
896 (b'e', b'extend', False, _(b'extend the bisect range')),
896 (b'e', b'extend', False, _(b'extend the bisect range')),
897 (
897 (
898 b'c',
898 b'c',
899 b'command',
899 b'command',
900 b'',
900 b'',
901 _(b'use command to check changeset state'),
901 _(b'use command to check changeset state'),
902 _(b'CMD'),
902 _(b'CMD'),
903 ),
903 ),
904 (b'U', b'noupdate', False, _(b'do not update to target')),
904 (b'U', b'noupdate', False, _(b'do not update to target')),
905 ],
905 ],
906 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
906 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
907 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
907 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
908 )
908 )
909 def bisect(
909 def bisect(
910 ui,
910 ui,
911 repo,
911 repo,
912 positional_1=None,
912 positional_1=None,
913 positional_2=None,
913 positional_2=None,
914 command=None,
914 command=None,
915 reset=None,
915 reset=None,
916 good=None,
916 good=None,
917 bad=None,
917 bad=None,
918 skip=None,
918 skip=None,
919 extend=None,
919 extend=None,
920 noupdate=None,
920 noupdate=None,
921 ):
921 ):
922 """subdivision search of changesets
922 """subdivision search of changesets
923
923
924 This command helps to find changesets which introduce problems. To
924 This command helps to find changesets which introduce problems. To
925 use, mark the earliest changeset you know exhibits the problem as
925 use, mark the earliest changeset you know exhibits the problem as
926 bad, then mark the latest changeset which is free from the problem
926 bad, then mark the latest changeset which is free from the problem
927 as good. Bisect will update your working directory to a revision
927 as good. Bisect will update your working directory to a revision
928 for testing (unless the -U/--noupdate option is specified). Once
928 for testing (unless the -U/--noupdate option is specified). Once
929 you have performed tests, mark the working directory as good or
929 you have performed tests, mark the working directory as good or
930 bad, and bisect will either update to another candidate changeset
930 bad, and bisect will either update to another candidate changeset
931 or announce that it has found the bad revision.
931 or announce that it has found the bad revision.
932
932
933 As a shortcut, you can also use the revision argument to mark a
933 As a shortcut, you can also use the revision argument to mark a
934 revision as good or bad without checking it out first.
934 revision as good or bad without checking it out first.
935
935
936 If you supply a command, it will be used for automatic bisection.
936 If you supply a command, it will be used for automatic bisection.
937 The environment variable HG_NODE will contain the ID of the
937 The environment variable HG_NODE will contain the ID of the
938 changeset being tested. The exit status of the command will be
938 changeset being tested. The exit status of the command will be
939 used to mark revisions as good or bad: status 0 means good, 125
939 used to mark revisions as good or bad: status 0 means good, 125
940 means to skip the revision, 127 (command not found) will abort the
940 means to skip the revision, 127 (command not found) will abort the
941 bisection, and any other non-zero exit status means the revision
941 bisection, and any other non-zero exit status means the revision
942 is bad.
942 is bad.
943
943
944 .. container:: verbose
944 .. container:: verbose
945
945
946 Some examples:
946 Some examples:
947
947
948 - start a bisection with known bad revision 34, and good revision 12::
948 - start a bisection with known bad revision 34, and good revision 12::
949
949
950 hg bisect --bad 34
950 hg bisect --bad 34
951 hg bisect --good 12
951 hg bisect --good 12
952
952
953 - advance the current bisection by marking current revision as good or
953 - advance the current bisection by marking current revision as good or
954 bad::
954 bad::
955
955
956 hg bisect --good
956 hg bisect --good
957 hg bisect --bad
957 hg bisect --bad
958
958
959 - mark the current revision, or a known revision, to be skipped (e.g. if
959 - mark the current revision, or a known revision, to be skipped (e.g. if
960 that revision is not usable because of another issue)::
960 that revision is not usable because of another issue)::
961
961
962 hg bisect --skip
962 hg bisect --skip
963 hg bisect --skip 23
963 hg bisect --skip 23
964
964
965 - skip all revisions that do not touch directories ``foo`` or ``bar``::
965 - skip all revisions that do not touch directories ``foo`` or ``bar``::
966
966
967 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
967 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
968
968
969 - forget the current bisection::
969 - forget the current bisection::
970
970
971 hg bisect --reset
971 hg bisect --reset
972
972
973 - use 'make && make tests' to automatically find the first broken
973 - use 'make && make tests' to automatically find the first broken
974 revision::
974 revision::
975
975
976 hg bisect --reset
976 hg bisect --reset
977 hg bisect --bad 34
977 hg bisect --bad 34
978 hg bisect --good 12
978 hg bisect --good 12
979 hg bisect --command "make && make tests"
979 hg bisect --command "make && make tests"
980
980
981 - see all changesets whose states are already known in the current
981 - see all changesets whose states are already known in the current
982 bisection::
982 bisection::
983
983
984 hg log -r "bisect(pruned)"
984 hg log -r "bisect(pruned)"
985
985
986 - see the changeset currently being bisected (especially useful
986 - see the changeset currently being bisected (especially useful
987 if running with -U/--noupdate)::
987 if running with -U/--noupdate)::
988
988
989 hg log -r "bisect(current)"
989 hg log -r "bisect(current)"
990
990
991 - see all changesets that took part in the current bisection::
991 - see all changesets that took part in the current bisection::
992
992
993 hg log -r "bisect(range)"
993 hg log -r "bisect(range)"
994
994
995 - you can even get a nice graph::
995 - you can even get a nice graph::
996
996
997 hg log --graph -r "bisect(range)"
997 hg log --graph -r "bisect(range)"
998
998
999 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
999 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
1000
1000
1001 Returns 0 on success.
1001 Returns 0 on success.
1002 """
1002 """
1003 rev = []
1003 rev = []
1004 # backward compatibility
1004 # backward compatibility
1005 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1005 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1006 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1006 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1007 cmd = positional_1
1007 cmd = positional_1
1008 rev.append(positional_2)
1008 rev.append(positional_2)
1009 if cmd == b"good":
1009 if cmd == b"good":
1010 good = True
1010 good = True
1011 elif cmd == b"bad":
1011 elif cmd == b"bad":
1012 bad = True
1012 bad = True
1013 else:
1013 else:
1014 reset = True
1014 reset = True
1015 elif positional_2:
1015 elif positional_2:
1016 raise error.InputError(_(b'incompatible arguments'))
1016 raise error.InputError(_(b'incompatible arguments'))
1017 elif positional_1 is not None:
1017 elif positional_1 is not None:
1018 rev.append(positional_1)
1018 rev.append(positional_1)
1019
1019
1020 incompatibles = {
1020 incompatibles = {
1021 b'--bad': bad,
1021 b'--bad': bad,
1022 b'--command': bool(command),
1022 b'--command': bool(command),
1023 b'--extend': extend,
1023 b'--extend': extend,
1024 b'--good': good,
1024 b'--good': good,
1025 b'--reset': reset,
1025 b'--reset': reset,
1026 b'--skip': skip,
1026 b'--skip': skip,
1027 }
1027 }
1028
1028
1029 enabled = [x for x in incompatibles if incompatibles[x]]
1029 enabled = [x for x in incompatibles if incompatibles[x]]
1030
1030
1031 if len(enabled) > 1:
1031 if len(enabled) > 1:
1032 raise error.InputError(
1032 raise error.InputError(
1033 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1033 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1034 )
1034 )
1035
1035
1036 if reset:
1036 if reset:
1037 hbisect.resetstate(repo)
1037 hbisect.resetstate(repo)
1038 return
1038 return
1039
1039
1040 state = hbisect.load_state(repo)
1040 state = hbisect.load_state(repo)
1041
1041
1042 if rev:
1042 if rev:
1043 revs = logcmdutil.revrange(repo, rev)
1043 revs = logcmdutil.revrange(repo, rev)
1044 goodnodes = state[b'good']
1044 goodnodes = state[b'good']
1045 badnodes = state[b'bad']
1045 badnodes = state[b'bad']
1046 if goodnodes and badnodes:
1046 if goodnodes and badnodes:
1047 candidates = repo.revs(b'(%ln)::(%ln)', goodnodes, badnodes)
1047 candidates = repo.revs(b'(%ln)::(%ln)', goodnodes, badnodes)
1048 candidates += repo.revs(b'(%ln)::(%ln)', badnodes, goodnodes)
1048 candidates += repo.revs(b'(%ln)::(%ln)', badnodes, goodnodes)
1049 revs = candidates & revs
1049 revs = candidates & revs
1050 nodes = [repo.changelog.node(i) for i in revs]
1050 nodes = [repo.changelog.node(i) for i in revs]
1051 else:
1051 else:
1052 nodes = [repo.lookup(b'.')]
1052 nodes = [repo.lookup(b'.')]
1053
1053
1054 # update state
1054 # update state
1055 if good or bad or skip:
1055 if good or bad or skip:
1056 if good:
1056 if good:
1057 state[b'good'] += nodes
1057 state[b'good'] += nodes
1058 elif bad:
1058 elif bad:
1059 state[b'bad'] += nodes
1059 state[b'bad'] += nodes
1060 elif skip:
1060 elif skip:
1061 state[b'skip'] += nodes
1061 state[b'skip'] += nodes
1062 hbisect.save_state(repo, state)
1062 hbisect.save_state(repo, state)
1063 if not (state[b'good'] and state[b'bad']):
1063 if not (state[b'good'] and state[b'bad']):
1064 return
1064 return
1065
1065
1066 def mayupdate(repo, node, show_stats=True):
1066 def mayupdate(repo, node, show_stats=True):
1067 """common used update sequence"""
1067 """common used update sequence"""
1068 if noupdate:
1068 if noupdate:
1069 return
1069 return
1070 cmdutil.checkunfinished(repo)
1070 cmdutil.checkunfinished(repo)
1071 cmdutil.bailifchanged(repo)
1071 cmdutil.bailifchanged(repo)
1072 return hg.clean(repo, node, show_stats=show_stats)
1072 return hg.clean(repo, node, show_stats=show_stats)
1073
1073
1074 displayer = logcmdutil.changesetdisplayer(ui, repo, {})
1074 displayer = logcmdutil.changesetdisplayer(ui, repo, {})
1075
1075
1076 if command:
1076 if command:
1077 changesets = 1
1077 changesets = 1
1078 if noupdate:
1078 if noupdate:
1079 try:
1079 try:
1080 node = state[b'current'][0]
1080 node = state[b'current'][0]
1081 except LookupError:
1081 except LookupError:
1082 raise error.StateError(
1082 raise error.StateError(
1083 _(
1083 _(
1084 b'current bisect revision is unknown - '
1084 b'current bisect revision is unknown - '
1085 b'start a new bisect to fix'
1085 b'start a new bisect to fix'
1086 )
1086 )
1087 )
1087 )
1088 else:
1088 else:
1089 node, p2 = repo.dirstate.parents()
1089 node, p2 = repo.dirstate.parents()
1090 if p2 != repo.nullid:
1090 if p2 != repo.nullid:
1091 raise error.StateError(_(b'current bisect revision is a merge'))
1091 raise error.StateError(_(b'current bisect revision is a merge'))
1092 if rev:
1092 if rev:
1093 if not nodes:
1093 if not nodes:
1094 raise error.InputError(_(b'empty revision set'))
1094 raise error.InputError(_(b'empty revision set'))
1095 node = repo[nodes[-1]].node()
1095 node = repo[nodes[-1]].node()
1096 with hbisect.restore_state(repo, state, node):
1096 with hbisect.restore_state(repo, state, node):
1097 while changesets:
1097 while changesets:
1098 # update state
1098 # update state
1099 state[b'current'] = [node]
1099 state[b'current'] = [node]
1100 hbisect.save_state(repo, state)
1100 hbisect.save_state(repo, state)
1101 status = ui.system(
1101 status = ui.system(
1102 command,
1102 command,
1103 environ={b'HG_NODE': hex(node)},
1103 environ={b'HG_NODE': hex(node)},
1104 blockedtag=b'bisect_check',
1104 blockedtag=b'bisect_check',
1105 )
1105 )
1106 if status == 125:
1106 if status == 125:
1107 transition = b"skip"
1107 transition = b"skip"
1108 elif status == 0:
1108 elif status == 0:
1109 transition = b"good"
1109 transition = b"good"
1110 # status < 0 means process was killed
1110 # status < 0 means process was killed
1111 elif status == 127:
1111 elif status == 127:
1112 raise error.Abort(_(b"failed to execute %s") % command)
1112 raise error.Abort(_(b"failed to execute %s") % command)
1113 elif status < 0:
1113 elif status < 0:
1114 raise error.Abort(_(b"%s killed") % command)
1114 raise error.Abort(_(b"%s killed") % command)
1115 else:
1115 else:
1116 transition = b"bad"
1116 transition = b"bad"
1117 state[transition].append(node)
1117 state[transition].append(node)
1118 ctx = repo[node]
1118 ctx = repo[node]
1119 summary = cmdutil.format_changeset_summary(ui, ctx, b'bisect')
1119 summary = cmdutil.format_changeset_summary(ui, ctx, b'bisect')
1120 ui.status(_(b'changeset %s: %s\n') % (summary, transition))
1120 ui.status(_(b'changeset %s: %s\n') % (summary, transition))
1121 hbisect.checkstate(state)
1121 hbisect.checkstate(state)
1122 # bisect
1122 # bisect
1123 nodes, changesets, bgood = hbisect.bisect(repo, state)
1123 nodes, changesets, bgood = hbisect.bisect(repo, state)
1124 # update to next check
1124 # update to next check
1125 node = nodes[0]
1125 node = nodes[0]
1126 mayupdate(repo, node, show_stats=False)
1126 mayupdate(repo, node, show_stats=False)
1127 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1127 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1128 return
1128 return
1129
1129
1130 hbisect.checkstate(state)
1130 hbisect.checkstate(state)
1131
1131
1132 # actually bisect
1132 # actually bisect
1133 nodes, changesets, good = hbisect.bisect(repo, state)
1133 nodes, changesets, good = hbisect.bisect(repo, state)
1134 if extend:
1134 if extend:
1135 if not changesets:
1135 if not changesets:
1136 extendctx = hbisect.extendrange(repo, state, nodes, good)
1136 extendctx = hbisect.extendrange(repo, state, nodes, good)
1137 if extendctx is not None:
1137 if extendctx is not None:
1138 ui.write(
1138 ui.write(
1139 _(b"Extending search to changeset %s\n")
1139 _(b"Extending search to changeset %s\n")
1140 % cmdutil.format_changeset_summary(ui, extendctx, b'bisect')
1140 % cmdutil.format_changeset_summary(ui, extendctx, b'bisect')
1141 )
1141 )
1142 state[b'current'] = [extendctx.node()]
1142 state[b'current'] = [extendctx.node()]
1143 hbisect.save_state(repo, state)
1143 hbisect.save_state(repo, state)
1144 return mayupdate(repo, extendctx.node())
1144 return mayupdate(repo, extendctx.node())
1145 raise error.StateError(_(b"nothing to extend"))
1145 raise error.StateError(_(b"nothing to extend"))
1146
1146
1147 if changesets == 0:
1147 if changesets == 0:
1148 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1148 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1149 else:
1149 else:
1150 assert len(nodes) == 1 # only a single node can be tested next
1150 assert len(nodes) == 1 # only a single node can be tested next
1151 node = nodes[0]
1151 node = nodes[0]
1152 # compute the approximate number of remaining tests
1152 # compute the approximate number of remaining tests
1153 tests, size = 0, 2
1153 tests, size = 0, 2
1154 while size <= changesets:
1154 while size <= changesets:
1155 tests, size = tests + 1, size * 2
1155 tests, size = tests + 1, size * 2
1156 rev = repo.changelog.rev(node)
1156 rev = repo.changelog.rev(node)
1157 summary = cmdutil.format_changeset_summary(ui, repo[rev], b'bisect')
1157 summary = cmdutil.format_changeset_summary(ui, repo[rev], b'bisect')
1158 ui.write(
1158 ui.write(
1159 _(
1159 _(
1160 b"Testing changeset %s "
1160 b"Testing changeset %s "
1161 b"(%d changesets remaining, ~%d tests)\n"
1161 b"(%d changesets remaining, ~%d tests)\n"
1162 )
1162 )
1163 % (summary, changesets, tests)
1163 % (summary, changesets, tests)
1164 )
1164 )
1165 state[b'current'] = [node]
1165 state[b'current'] = [node]
1166 hbisect.save_state(repo, state)
1166 hbisect.save_state(repo, state)
1167 return mayupdate(repo, node)
1167 return mayupdate(repo, node)
1168
1168
1169
1169
1170 @command(
1170 @command(
1171 b'bookmarks|bookmark',
1171 b'bookmarks|bookmark',
1172 [
1172 [
1173 (b'f', b'force', False, _(b'force')),
1173 (b'f', b'force', False, _(b'force')),
1174 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1174 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1175 (b'd', b'delete', False, _(b'delete a given bookmark')),
1175 (b'd', b'delete', False, _(b'delete a given bookmark')),
1176 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1176 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1177 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1177 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1178 (b'l', b'list', False, _(b'list existing bookmarks')),
1178 (b'l', b'list', False, _(b'list existing bookmarks')),
1179 ]
1179 ]
1180 + formatteropts,
1180 + formatteropts,
1181 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1181 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1182 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1182 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1183 )
1183 )
1184 def bookmark(ui, repo, *names, **opts):
1184 def bookmark(ui, repo, *names, **opts):
1185 """create a new bookmark or list existing bookmarks
1185 """create a new bookmark or list existing bookmarks
1186
1186
1187 Bookmarks are labels on changesets to help track lines of development.
1187 Bookmarks are labels on changesets to help track lines of development.
1188 Bookmarks are unversioned and can be moved, renamed and deleted.
1188 Bookmarks are unversioned and can be moved, renamed and deleted.
1189 Deleting or moving a bookmark has no effect on the associated changesets.
1189 Deleting or moving a bookmark has no effect on the associated changesets.
1190
1190
1191 Creating or updating to a bookmark causes it to be marked as 'active'.
1191 Creating or updating to a bookmark causes it to be marked as 'active'.
1192 The active bookmark is indicated with a '*'.
1192 The active bookmark is indicated with a '*'.
1193 When a commit is made, the active bookmark will advance to the new commit.
1193 When a commit is made, the active bookmark will advance to the new commit.
1194 A plain :hg:`update` will also advance an active bookmark, if possible.
1194 A plain :hg:`update` will also advance an active bookmark, if possible.
1195 Updating away from a bookmark will cause it to be deactivated.
1195 Updating away from a bookmark will cause it to be deactivated.
1196
1196
1197 Bookmarks can be pushed and pulled between repositories (see
1197 Bookmarks can be pushed and pulled between repositories (see
1198 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
1198 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
1199 diverged, a new 'divergent bookmark' of the form 'name@path' will
1199 diverged, a new 'divergent bookmark' of the form 'name@path' will
1200 be created. Using :hg:`merge` will resolve the divergence.
1200 be created. Using :hg:`merge` will resolve the divergence.
1201
1201
1202 Specifying bookmark as '.' to -m/-d/-l options is equivalent to specifying
1202 Specifying bookmark as '.' to -m/-d/-l options is equivalent to specifying
1203 the active bookmark's name.
1203 the active bookmark's name.
1204
1204
1205 A bookmark named '@' has the special property that :hg:`clone` will
1205 A bookmark named '@' has the special property that :hg:`clone` will
1206 check it out by default if it exists.
1206 check it out by default if it exists.
1207
1207
1208 .. container:: verbose
1208 .. container:: verbose
1209
1209
1210 Template:
1210 Template:
1211
1211
1212 The following keywords are supported in addition to the common template
1212 The following keywords are supported in addition to the common template
1213 keywords and functions such as ``{bookmark}``. See also
1213 keywords and functions such as ``{bookmark}``. See also
1214 :hg:`help templates`.
1214 :hg:`help templates`.
1215
1215
1216 :active: Boolean. True if the bookmark is active.
1216 :active: Boolean. True if the bookmark is active.
1217
1217
1218 Examples:
1218 Examples:
1219
1219
1220 - create an active bookmark for a new line of development::
1220 - create an active bookmark for a new line of development::
1221
1221
1222 hg book new-feature
1222 hg book new-feature
1223
1223
1224 - create an inactive bookmark as a place marker::
1224 - create an inactive bookmark as a place marker::
1225
1225
1226 hg book -i reviewed
1226 hg book -i reviewed
1227
1227
1228 - create an inactive bookmark on another changeset::
1228 - create an inactive bookmark on another changeset::
1229
1229
1230 hg book -r .^ tested
1230 hg book -r .^ tested
1231
1231
1232 - rename bookmark turkey to dinner::
1232 - rename bookmark turkey to dinner::
1233
1233
1234 hg book -m turkey dinner
1234 hg book -m turkey dinner
1235
1235
1236 - move the '@' bookmark from another branch::
1236 - move the '@' bookmark from another branch::
1237
1237
1238 hg book -f @
1238 hg book -f @
1239
1239
1240 - print only the active bookmark name::
1240 - print only the active bookmark name::
1241
1241
1242 hg book -ql .
1242 hg book -ql .
1243 """
1243 """
1244 force = opts.get('force')
1244 force = opts.get('force')
1245 rev = opts.get('rev')
1245 rev = opts.get('rev')
1246 inactive = opts.get('inactive') # meaning add/rename to inactive bookmark
1246 inactive = opts.get('inactive') # meaning add/rename to inactive bookmark
1247
1247
1248 action = cmdutil.check_at_most_one_arg(opts, 'delete', 'rename', 'list')
1248 action = cmdutil.check_at_most_one_arg(opts, 'delete', 'rename', 'list')
1249 if action:
1249 if action:
1250 cmdutil.check_incompatible_arguments(opts, action, ['rev'])
1250 cmdutil.check_incompatible_arguments(opts, action, ['rev'])
1251 elif names or rev:
1251 elif names or rev:
1252 action = 'add'
1252 action = 'add'
1253 elif inactive:
1253 elif inactive:
1254 action = 'inactive' # meaning deactivate
1254 action = 'inactive' # meaning deactivate
1255 else:
1255 else:
1256 action = 'list'
1256 action = 'list'
1257
1257
1258 cmdutil.check_incompatible_arguments(opts, 'inactive', ['delete', 'list'])
1258 cmdutil.check_incompatible_arguments(opts, 'inactive', ['delete', 'list'])
1259 if not names and action in {'add', 'delete'}:
1259 if not names and action in {'add', 'delete'}:
1260 raise error.InputError(_(b"bookmark name required"))
1260 raise error.InputError(_(b"bookmark name required"))
1261
1261
1262 if action in {'add', 'delete', 'rename', 'inactive'}:
1262 if action in {'add', 'delete', 'rename', 'inactive'}:
1263 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1263 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1264 if action == 'delete':
1264 if action == 'delete':
1265 names = pycompat.maplist(repo._bookmarks.expandname, names)
1265 names = pycompat.maplist(repo._bookmarks.expandname, names)
1266 bookmarks.delete(repo, tr, names)
1266 bookmarks.delete(repo, tr, names)
1267 elif action == 'rename':
1267 elif action == 'rename':
1268 if not names:
1268 if not names:
1269 raise error.InputError(_(b"new bookmark name required"))
1269 raise error.InputError(_(b"new bookmark name required"))
1270 elif len(names) > 1:
1270 elif len(names) > 1:
1271 raise error.InputError(
1271 raise error.InputError(
1272 _(b"only one new bookmark name allowed")
1272 _(b"only one new bookmark name allowed")
1273 )
1273 )
1274 oldname = repo._bookmarks.expandname(opts['rename'])
1274 oldname = repo._bookmarks.expandname(opts['rename'])
1275 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1275 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1276 elif action == 'add':
1276 elif action == 'add':
1277 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1277 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1278 elif action == 'inactive':
1278 elif action == 'inactive':
1279 if len(repo._bookmarks) == 0:
1279 if len(repo._bookmarks) == 0:
1280 ui.status(_(b"no bookmarks set\n"))
1280 ui.status(_(b"no bookmarks set\n"))
1281 elif not repo._activebookmark:
1281 elif not repo._activebookmark:
1282 ui.status(_(b"no active bookmark\n"))
1282 ui.status(_(b"no active bookmark\n"))
1283 else:
1283 else:
1284 bookmarks.deactivate(repo)
1284 bookmarks.deactivate(repo)
1285 elif action == 'list':
1285 elif action == 'list':
1286 names = pycompat.maplist(repo._bookmarks.expandname, names)
1286 names = pycompat.maplist(repo._bookmarks.expandname, names)
1287 with ui.formatter(b'bookmarks', pycompat.byteskwargs(opts)) as fm:
1287 with ui.formatter(b'bookmarks', pycompat.byteskwargs(opts)) as fm:
1288 bookmarks.printbookmarks(ui, repo, fm, names)
1288 bookmarks.printbookmarks(ui, repo, fm, names)
1289 else:
1289 else:
1290 raise error.ProgrammingError(
1290 raise error.ProgrammingError(
1291 b'invalid action: %s' % pycompat.sysbytes(action)
1291 b'invalid action: %s' % pycompat.sysbytes(action)
1292 )
1292 )
1293
1293
1294
1294
1295 @command(
1295 @command(
1296 b'branch',
1296 b'branch',
1297 [
1297 [
1298 (
1298 (
1299 b'f',
1299 b'f',
1300 b'force',
1300 b'force',
1301 None,
1301 None,
1302 _(b'set branch name even if it shadows an existing branch'),
1302 _(b'set branch name even if it shadows an existing branch'),
1303 ),
1303 ),
1304 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1304 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1305 (
1305 (
1306 b'r',
1306 b'r',
1307 b'rev',
1307 b'rev',
1308 [],
1308 [],
1309 _(b'change branches of the given revs (EXPERIMENTAL)'),
1309 _(b'change branches of the given revs (EXPERIMENTAL)'),
1310 ),
1310 ),
1311 ],
1311 ],
1312 _(b'[-fC] [NAME]'),
1312 _(b'[-fC] [NAME]'),
1313 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1313 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1314 )
1314 )
1315 def branch(ui, repo, label=None, **opts):
1315 def branch(ui, repo, label=None, **opts):
1316 """set or show the current branch name
1316 """set or show the current branch name
1317
1317
1318 .. note::
1318 .. note::
1319
1319
1320 Branch names are permanent and global. Use :hg:`bookmark` to create a
1320 Branch names are permanent and global. Use :hg:`bookmark` to create a
1321 light-weight bookmark instead. See :hg:`help glossary` for more
1321 light-weight bookmark instead. See :hg:`help glossary` for more
1322 information about named branches and bookmarks.
1322 information about named branches and bookmarks.
1323
1323
1324 With no argument, show the current branch name. With one argument,
1324 With no argument, show the current branch name. With one argument,
1325 set the working directory branch name (the branch will not exist
1325 set the working directory branch name (the branch will not exist
1326 in the repository until the next commit). Standard practice
1326 in the repository until the next commit). Standard practice
1327 recommends that primary development take place on the 'default'
1327 recommends that primary development take place on the 'default'
1328 branch.
1328 branch.
1329
1329
1330 Unless -f/--force is specified, branch will not let you set a
1330 Unless -f/--force is specified, branch will not let you set a
1331 branch name that already exists.
1331 branch name that already exists.
1332
1332
1333 Use -C/--clean to reset the working directory branch to that of
1333 Use -C/--clean to reset the working directory branch to that of
1334 the parent of the working directory, negating a previous branch
1334 the parent of the working directory, negating a previous branch
1335 change.
1335 change.
1336
1336
1337 Use the command :hg:`update` to switch to an existing branch. Use
1337 Use the command :hg:`update` to switch to an existing branch. Use
1338 :hg:`commit --close-branch` to mark this branch head as closed.
1338 :hg:`commit --close-branch` to mark this branch head as closed.
1339 When all heads of a branch are closed, the branch will be
1339 When all heads of a branch are closed, the branch will be
1340 considered closed.
1340 considered closed.
1341
1341
1342 Returns 0 on success.
1342 Returns 0 on success.
1343 """
1343 """
1344 revs = opts.get('rev')
1344 revs = opts.get('rev')
1345 if label:
1345 if label:
1346 label = label.strip()
1346 label = label.strip()
1347
1347
1348 if not opts.get('clean') and not label:
1348 if not opts.get('clean') and not label:
1349 if revs:
1349 if revs:
1350 raise error.InputError(
1350 raise error.InputError(
1351 _(b"no branch name specified for the revisions")
1351 _(b"no branch name specified for the revisions")
1352 )
1352 )
1353 ui.write(b"%s\n" % repo.dirstate.branch())
1353 ui.write(b"%s\n" % repo.dirstate.branch())
1354 return
1354 return
1355
1355
1356 with repo.wlock():
1356 with repo.wlock():
1357 if opts.get('clean'):
1357 if opts.get('clean'):
1358 label = repo[b'.'].branch()
1358 label = repo[b'.'].branch()
1359 repo.dirstate.setbranch(label, repo.currenttransaction())
1359 repo.dirstate.setbranch(label, repo.currenttransaction())
1360 ui.status(_(b'reset working directory to branch %s\n') % label)
1360 ui.status(_(b'reset working directory to branch %s\n') % label)
1361 elif label:
1361 elif label:
1362
1362
1363 scmutil.checknewlabel(repo, label, b'branch')
1363 scmutil.checknewlabel(repo, label, b'branch')
1364 if revs:
1364 if revs:
1365 return cmdutil.changebranch(ui, repo, revs, label, **opts)
1365 return cmdutil.changebranch(ui, repo, revs, label, **opts)
1366
1366
1367 if not opts.get('force') and label in repo.branchmap():
1367 if not opts.get('force') and label in repo.branchmap():
1368 if label not in [p.branch() for p in repo[None].parents()]:
1368 if label not in [p.branch() for p in repo[None].parents()]:
1369 raise error.InputError(
1369 raise error.InputError(
1370 _(b'a branch of the same name already exists'),
1370 _(b'a branch of the same name already exists'),
1371 # i18n: "it" refers to an existing branch
1371 # i18n: "it" refers to an existing branch
1372 hint=_(b"use 'hg update' to switch to it"),
1372 hint=_(b"use 'hg update' to switch to it"),
1373 )
1373 )
1374
1374
1375 repo.dirstate.setbranch(label, repo.currenttransaction())
1375 repo.dirstate.setbranch(label, repo.currenttransaction())
1376 ui.status(_(b'marked working directory as branch %s\n') % label)
1376 ui.status(_(b'marked working directory as branch %s\n') % label)
1377
1377
1378 # find any open named branches aside from default
1378 # find any open named branches aside from default
1379 for n, h, t, c in repo.branchmap().iterbranches():
1379 for n, h, t, c in repo.branchmap().iterbranches():
1380 if n != b"default" and not c:
1380 if n != b"default" and not c:
1381 return 0
1381 return 0
1382 ui.status(
1382 ui.status(
1383 _(
1383 _(
1384 b'(branches are permanent and global, '
1384 b'(branches are permanent and global, '
1385 b'did you want a bookmark?)\n'
1385 b'did you want a bookmark?)\n'
1386 )
1386 )
1387 )
1387 )
1388
1388
1389
1389
1390 @command(
1390 @command(
1391 b'branches',
1391 b'branches',
1392 [
1392 [
1393 (
1393 (
1394 b'a',
1394 b'a',
1395 b'active',
1395 b'active',
1396 False,
1396 False,
1397 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1397 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1398 ),
1398 ),
1399 (b'c', b'closed', False, _(b'show normal and closed branches')),
1399 (b'c', b'closed', False, _(b'show normal and closed branches')),
1400 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1400 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1401 ]
1401 ]
1402 + formatteropts,
1402 + formatteropts,
1403 _(b'[-c]'),
1403 _(b'[-c]'),
1404 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1404 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1405 intents={INTENT_READONLY},
1405 intents={INTENT_READONLY},
1406 )
1406 )
1407 def branches(ui, repo, active=False, closed=False, **opts):
1407 def branches(ui, repo, active=False, closed=False, **opts):
1408 """list repository named branches
1408 """list repository named branches
1409
1409
1410 List the repository's named branches, indicating which ones are
1410 List the repository's named branches, indicating which ones are
1411 inactive. If -c/--closed is specified, also list branches which have
1411 inactive. If -c/--closed is specified, also list branches which have
1412 been marked closed (see :hg:`commit --close-branch`).
1412 been marked closed (see :hg:`commit --close-branch`).
1413
1413
1414 Use the command :hg:`update` to switch to an existing branch.
1414 Use the command :hg:`update` to switch to an existing branch.
1415
1415
1416 .. container:: verbose
1416 .. container:: verbose
1417
1417
1418 Template:
1418 Template:
1419
1419
1420 The following keywords are supported in addition to the common template
1420 The following keywords are supported in addition to the common template
1421 keywords and functions such as ``{branch}``. See also
1421 keywords and functions such as ``{branch}``. See also
1422 :hg:`help templates`.
1422 :hg:`help templates`.
1423
1423
1424 :active: Boolean. True if the branch is active.
1424 :active: Boolean. True if the branch is active.
1425 :closed: Boolean. True if the branch is closed.
1425 :closed: Boolean. True if the branch is closed.
1426 :current: Boolean. True if it is the current branch.
1426 :current: Boolean. True if it is the current branch.
1427
1427
1428 Returns 0.
1428 Returns 0.
1429 """
1429 """
1430
1430
1431 revs = opts.get('rev')
1431 revs = opts.get('rev')
1432 selectedbranches = None
1432 selectedbranches = None
1433 if revs:
1433 if revs:
1434 revs = logcmdutil.revrange(repo, revs)
1434 revs = logcmdutil.revrange(repo, revs)
1435 getbi = repo.revbranchcache().branchinfo
1435 getbi = repo.revbranchcache().branchinfo
1436 selectedbranches = {getbi(r)[0] for r in revs}
1436 selectedbranches = {getbi(r)[0] for r in revs}
1437
1437
1438 ui.pager(b'branches')
1438 ui.pager(b'branches')
1439 fm = ui.formatter(b'branches', pycompat.byteskwargs(opts))
1439 fm = ui.formatter(b'branches', pycompat.byteskwargs(opts))
1440 hexfunc = fm.hexfunc
1440 hexfunc = fm.hexfunc
1441
1441
1442 allheads = set(repo.heads())
1442 allheads = set(repo.heads())
1443 branches = []
1443 branches = []
1444 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1444 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1445 if selectedbranches is not None and tag not in selectedbranches:
1445 if selectedbranches is not None and tag not in selectedbranches:
1446 continue
1446 continue
1447 isactive = False
1447 isactive = False
1448 if not isclosed:
1448 if not isclosed:
1449 openheads = set(repo.branchmap().iteropen(heads))
1449 openheads = set(repo.branchmap().iteropen(heads))
1450 isactive = bool(openheads & allheads)
1450 isactive = bool(openheads & allheads)
1451 branches.append((tag, repo[tip], isactive, not isclosed))
1451 branches.append((tag, repo[tip], isactive, not isclosed))
1452 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]), reverse=True)
1452 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]), reverse=True)
1453
1453
1454 for tag, ctx, isactive, isopen in branches:
1454 for tag, ctx, isactive, isopen in branches:
1455 if active and not isactive:
1455 if active and not isactive:
1456 continue
1456 continue
1457 if isactive:
1457 if isactive:
1458 label = b'branches.active'
1458 label = b'branches.active'
1459 notice = b''
1459 notice = b''
1460 elif not isopen:
1460 elif not isopen:
1461 if not closed:
1461 if not closed:
1462 continue
1462 continue
1463 label = b'branches.closed'
1463 label = b'branches.closed'
1464 notice = _(b' (closed)')
1464 notice = _(b' (closed)')
1465 else:
1465 else:
1466 label = b'branches.inactive'
1466 label = b'branches.inactive'
1467 notice = _(b' (inactive)')
1467 notice = _(b' (inactive)')
1468 current = tag == repo.dirstate.branch()
1468 current = tag == repo.dirstate.branch()
1469 if current:
1469 if current:
1470 label = b'branches.current'
1470 label = b'branches.current'
1471
1471
1472 fm.startitem()
1472 fm.startitem()
1473 fm.write(b'branch', b'%s', tag, label=label)
1473 fm.write(b'branch', b'%s', tag, label=label)
1474 rev = ctx.rev()
1474 rev = ctx.rev()
1475 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1475 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1476 fmt = b' ' * padsize + b' %d:%s'
1476 fmt = b' ' * padsize + b' %d:%s'
1477 fm.condwrite(
1477 fm.condwrite(
1478 not ui.quiet,
1478 not ui.quiet,
1479 b'rev node',
1479 b'rev node',
1480 fmt,
1480 fmt,
1481 rev,
1481 rev,
1482 hexfunc(ctx.node()),
1482 hexfunc(ctx.node()),
1483 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1483 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1484 )
1484 )
1485 fm.context(ctx=ctx)
1485 fm.context(ctx=ctx)
1486 fm.data(active=isactive, closed=not isopen, current=current)
1486 fm.data(active=isactive, closed=not isopen, current=current)
1487 if not ui.quiet:
1487 if not ui.quiet:
1488 fm.plain(notice)
1488 fm.plain(notice)
1489 fm.plain(b'\n')
1489 fm.plain(b'\n')
1490 fm.end()
1490 fm.end()
1491
1491
1492
1492
1493 @command(
1493 @command(
1494 b'bundle',
1494 b'bundle',
1495 [
1495 [
1496 (
1496 (
1497 b'',
1497 b'',
1498 b'exact',
1498 b'exact',
1499 None,
1499 None,
1500 _(b'compute the base from the revision specified'),
1500 _(b'compute the base from the revision specified'),
1501 ),
1501 ),
1502 (
1502 (
1503 b'f',
1503 b'f',
1504 b'force',
1504 b'force',
1505 None,
1505 None,
1506 _(b'run even when the destination is unrelated'),
1506 _(b'run even when the destination is unrelated'),
1507 ),
1507 ),
1508 (
1508 (
1509 b'r',
1509 b'r',
1510 b'rev',
1510 b'rev',
1511 [],
1511 [],
1512 _(b'a changeset intended to be added to the destination'),
1512 _(b'a changeset intended to be added to the destination'),
1513 _(b'REV'),
1513 _(b'REV'),
1514 ),
1514 ),
1515 (
1515 (
1516 b'b',
1516 b'b',
1517 b'branch',
1517 b'branch',
1518 [],
1518 [],
1519 _(b'a specific branch you would like to bundle'),
1519 _(b'a specific branch you would like to bundle'),
1520 _(b'BRANCH'),
1520 _(b'BRANCH'),
1521 ),
1521 ),
1522 (
1522 (
1523 b'',
1523 b'',
1524 b'base',
1524 b'base',
1525 [],
1525 [],
1526 _(b'a base changeset assumed to be available at the destination'),
1526 _(b'a base changeset assumed to be available at the destination'),
1527 _(b'REV'),
1527 _(b'REV'),
1528 ),
1528 ),
1529 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1529 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1530 (
1530 (
1531 b't',
1531 b't',
1532 b'type',
1532 b'type',
1533 b'bzip2',
1533 b'bzip2',
1534 _(b'bundle compression type to use'),
1534 _(b'bundle compression type to use'),
1535 _(b'TYPE'),
1535 _(b'TYPE'),
1536 ),
1536 ),
1537 ]
1537 ]
1538 + remoteopts,
1538 + remoteopts,
1539 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]...'),
1539 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]...'),
1540 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1540 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1541 )
1541 )
1542 def bundle(ui, repo, fname, *dests, **opts):
1542 def bundle(ui, repo, fname, *dests, **opts):
1543 """create a bundle file
1543 """create a bundle file
1544
1544
1545 Generate a bundle file containing data to be transferred to another
1545 Generate a bundle file containing data to be transferred to another
1546 repository.
1546 repository.
1547
1547
1548 To create a bundle containing all changesets, use -a/--all
1548 To create a bundle containing all changesets, use -a/--all
1549 (or --base null). Otherwise, hg assumes the destination will have
1549 (or --base null). Otherwise, hg assumes the destination will have
1550 all the nodes you specify with --base parameters. Otherwise, hg
1550 all the nodes you specify with --base parameters. Otherwise, hg
1551 will assume the repository has all the nodes in destination, or
1551 will assume the repository has all the nodes in destination, or
1552 default-push/default if no destination is specified, where destination
1552 default-push/default if no destination is specified, where destination
1553 is the repositories you provide through DEST option.
1553 is the repositories you provide through DEST option.
1554
1554
1555 You can change bundle format with the -t/--type option. See
1555 You can change bundle format with the -t/--type option. See
1556 :hg:`help bundlespec` for documentation on this format. By default,
1556 :hg:`help bundlespec` for documentation on this format. By default,
1557 the most appropriate format is used and compression defaults to
1557 the most appropriate format is used and compression defaults to
1558 bzip2.
1558 bzip2.
1559
1559
1560 The bundle file can then be transferred using conventional means
1560 The bundle file can then be transferred using conventional means
1561 and applied to another repository with the unbundle or pull
1561 and applied to another repository with the unbundle or pull
1562 command. This is useful when direct push and pull are not
1562 command. This is useful when direct push and pull are not
1563 available or when exporting an entire repository is undesirable.
1563 available or when exporting an entire repository is undesirable.
1564
1564
1565 Applying bundles preserves all changeset contents including
1565 Applying bundles preserves all changeset contents including
1566 permissions, copy/rename information, and revision history.
1566 permissions, copy/rename information, and revision history.
1567
1567
1568 Returns 0 on success, 1 if no changes found.
1568 Returns 0 on success, 1 if no changes found.
1569 """
1569 """
1570
1570
1571 revs = None
1571 revs = None
1572 if 'rev' in opts:
1572 if 'rev' in opts:
1573 revstrings = opts['rev']
1573 revstrings = opts['rev']
1574 revs = logcmdutil.revrange(repo, revstrings)
1574 revs = logcmdutil.revrange(repo, revstrings)
1575 if revstrings and not revs:
1575 if revstrings and not revs:
1576 raise error.InputError(_(b'no commits to bundle'))
1576 raise error.InputError(_(b'no commits to bundle'))
1577
1577
1578 bundletype = opts.get('type', b'bzip2').lower()
1578 bundletype = opts.get('type', b'bzip2').lower()
1579 try:
1579 try:
1580 bundlespec = bundlecaches.parsebundlespec(
1580 bundlespec = bundlecaches.parsebundlespec(
1581 repo, bundletype, strict=False
1581 repo, bundletype, strict=False
1582 )
1582 )
1583 except error.UnsupportedBundleSpecification as e:
1583 except error.UnsupportedBundleSpecification as e:
1584 raise error.InputError(
1584 raise error.InputError(
1585 pycompat.bytestr(e),
1585 pycompat.bytestr(e),
1586 hint=_(b"see 'hg help bundlespec' for supported values for --type"),
1586 hint=_(b"see 'hg help bundlespec' for supported values for --type"),
1587 )
1587 )
1588 cgversion = bundlespec.params[b"cg.version"]
1588 cgversion = bundlespec.params[b"cg.version"]
1589
1589
1590 # Packed bundles are a pseudo bundle format for now.
1590 # Packed bundles are a pseudo bundle format for now.
1591 if cgversion == b's1':
1591 if cgversion == b's1':
1592 raise error.InputError(
1592 raise error.InputError(
1593 _(b'packed bundles cannot be produced by "hg bundle"'),
1593 _(b'packed bundles cannot be produced by "hg bundle"'),
1594 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1594 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1595 )
1595 )
1596
1596 base_opt = opts.get('base')
1597 if opts.get('all'):
1597 if opts.get('all'):
1598 if dests:
1598 if dests:
1599 raise error.InputError(
1599 raise error.InputError(
1600 _(b"--all is incompatible with specifying destinations")
1600 _(b"--all is incompatible with specifying destinations")
1601 )
1601 )
1602 if opts.get('base'):
1602 if base_opt:
1603 ui.warn(_(b"ignoring --base because --all was specified\n"))
1603 ui.warn(_(b"ignoring --base because --all was specified\n"))
1604 if opts.get('exact'):
1604 if opts.get('exact'):
1605 ui.warn(_(b"ignoring --exact because --all was specified\n"))
1605 ui.warn(_(b"ignoring --exact because --all was specified\n"))
1606 base = [nullrev]
1606 base = [nullrev]
1607 elif opts.get('exact'):
1607 elif opts.get('exact'):
1608 if dests:
1608 if dests:
1609 raise error.InputError(
1609 raise error.InputError(
1610 _(b"--exact is incompatible with specifying destinations")
1610 _(b"--exact is incompatible with specifying destinations")
1611 )
1611 )
1612 if opts.get('base'):
1612 if base_opt:
1613 ui.warn(_(b"ignoring --base because --exact was specified\n"))
1613 ui.warn(_(b"ignoring --base because --exact was specified\n"))
1614 base = repo.revs(b'parents(%ld) - %ld', revs, revs)
1614 base = repo.revs(b'parents(%ld) - %ld', revs, revs)
1615 if not base:
1615 if not base:
1616 base = [nullrev]
1616 base = [nullrev]
1617 elif base_opt:
1618 base = logcmdutil.revrange(repo, base_opt)
1619 if not base:
1620 # base specified, but nothing was selected
1621 base = [nullrev]
1617 else:
1622 else:
1618 base = logcmdutil.revrange(repo, opts.get('base'))
1623 base = None
1619 if cgversion not in changegroup.supportedoutgoingversions(repo):
1624 if cgversion not in changegroup.supportedoutgoingversions(repo):
1620 raise error.Abort(
1625 raise error.Abort(
1621 _(b"repository does not support bundle version %s") % cgversion
1626 _(b"repository does not support bundle version %s") % cgversion
1622 )
1627 )
1623
1628
1624 if base:
1629 if base is not None:
1625 if dests:
1630 if dests:
1626 raise error.InputError(
1631 raise error.InputError(
1627 _(b"--base is incompatible with specifying destinations")
1632 _(b"--base is incompatible with specifying destinations")
1628 )
1633 )
1629 cl = repo.changelog
1634 cl = repo.changelog
1630 common = [cl.node(rev) for rev in base]
1635 common = [cl.node(rev) for rev in base]
1631 heads = [cl.node(r) for r in revs] if revs else None
1636 heads = [cl.node(r) for r in revs] if revs else None
1632 outgoing = discovery.outgoing(repo, common, heads)
1637 outgoing = discovery.outgoing(repo, common, heads)
1633 missing = outgoing.missing
1638 missing = outgoing.missing
1634 excluded = outgoing.excluded
1639 excluded = outgoing.excluded
1635 else:
1640 else:
1636 missing = set()
1641 missing = set()
1637 excluded = set()
1642 excluded = set()
1638 for path in urlutil.get_push_paths(repo, ui, dests):
1643 for path in urlutil.get_push_paths(repo, ui, dests):
1639 other = hg.peer(repo, pycompat.byteskwargs(opts), path)
1644 other = hg.peer(repo, pycompat.byteskwargs(opts), path)
1640 if revs is not None:
1645 if revs is not None:
1641 hex_revs = [repo[r].hex() for r in revs]
1646 hex_revs = [repo[r].hex() for r in revs]
1642 else:
1647 else:
1643 hex_revs = None
1648 hex_revs = None
1644 branches = (path.branch, [])
1649 branches = (path.branch, [])
1645 head_revs, checkout = hg.addbranchrevs(
1650 head_revs, checkout = hg.addbranchrevs(
1646 repo, repo, branches, hex_revs
1651 repo, repo, branches, hex_revs
1647 )
1652 )
1648 heads = (
1653 heads = (
1649 head_revs
1654 head_revs
1650 and pycompat.maplist(repo.lookup, head_revs)
1655 and pycompat.maplist(repo.lookup, head_revs)
1651 or head_revs
1656 or head_revs
1652 )
1657 )
1653 outgoing = discovery.findcommonoutgoing(
1658 outgoing = discovery.findcommonoutgoing(
1654 repo,
1659 repo,
1655 other,
1660 other,
1656 onlyheads=heads,
1661 onlyheads=heads,
1657 force=opts.get('force'),
1662 force=opts.get('force'),
1658 portable=True,
1663 portable=True,
1659 )
1664 )
1660 missing.update(outgoing.missing)
1665 missing.update(outgoing.missing)
1661 excluded.update(outgoing.excluded)
1666 excluded.update(outgoing.excluded)
1662
1667
1663 if not missing:
1668 if not missing:
1664 scmutil.nochangesfound(ui, repo, not base and excluded)
1669 scmutil.nochangesfound(ui, repo, not base and excluded)
1665 return 1
1670 return 1
1666
1671
1667 # internal changeset are internal implementation details that should not
1672 # internal changeset are internal implementation details that should not
1668 # leave the repository. Bundling with `hg bundle` create such risk.
1673 # leave the repository. Bundling with `hg bundle` create such risk.
1669 bundled_internal = repo.revs(b"%ln and _internal()", missing)
1674 bundled_internal = repo.revs(b"%ln and _internal()", missing)
1670 if bundled_internal:
1675 if bundled_internal:
1671 msg = _(b"cannot bundle internal changesets")
1676 msg = _(b"cannot bundle internal changesets")
1672 hint = _(b"%d internal changesets selected") % len(bundled_internal)
1677 hint = _(b"%d internal changesets selected") % len(bundled_internal)
1673 raise error.Abort(msg, hint=hint)
1678 raise error.Abort(msg, hint=hint)
1674
1679
1675 if heads:
1680 if heads:
1676 outgoing = discovery.outgoing(
1681 outgoing = discovery.outgoing(
1677 repo, missingroots=missing, ancestorsof=heads
1682 repo, missingroots=missing, ancestorsof=heads
1678 )
1683 )
1679 else:
1684 else:
1680 outgoing = discovery.outgoing(repo, missingroots=missing)
1685 outgoing = discovery.outgoing(repo, missingroots=missing)
1681 outgoing.excluded = sorted(excluded)
1686 outgoing.excluded = sorted(excluded)
1682
1687
1683 if cgversion == b'01': # bundle1
1688 if cgversion == b'01': # bundle1
1684 bversion = b'HG10' + bundlespec.wirecompression
1689 bversion = b'HG10' + bundlespec.wirecompression
1685 bcompression = None
1690 bcompression = None
1686 elif cgversion in (b'02', b'03'):
1691 elif cgversion in (b'02', b'03'):
1687 bversion = b'HG20'
1692 bversion = b'HG20'
1688 bcompression = bundlespec.wirecompression
1693 bcompression = bundlespec.wirecompression
1689 else:
1694 else:
1690 raise error.ProgrammingError(
1695 raise error.ProgrammingError(
1691 b'bundle: unexpected changegroup version %s' % cgversion
1696 b'bundle: unexpected changegroup version %s' % cgversion
1692 )
1697 )
1693
1698
1694 # TODO compression options should be derived from bundlespec parsing.
1699 # TODO compression options should be derived from bundlespec parsing.
1695 # This is a temporary hack to allow adjusting bundle compression
1700 # This is a temporary hack to allow adjusting bundle compression
1696 # level without a) formalizing the bundlespec changes to declare it
1701 # level without a) formalizing the bundlespec changes to declare it
1697 # b) introducing a command flag.
1702 # b) introducing a command flag.
1698 compopts = {}
1703 compopts = {}
1699 complevel = ui.configint(
1704 complevel = ui.configint(
1700 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1705 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1701 )
1706 )
1702 if complevel is None:
1707 if complevel is None:
1703 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1708 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1704 if complevel is not None:
1709 if complevel is not None:
1705 compopts[b'level'] = complevel
1710 compopts[b'level'] = complevel
1706
1711
1707 compthreads = ui.configint(
1712 compthreads = ui.configint(
1708 b'experimental', b'bundlecompthreads.' + bundlespec.compression
1713 b'experimental', b'bundlecompthreads.' + bundlespec.compression
1709 )
1714 )
1710 if compthreads is None:
1715 if compthreads is None:
1711 compthreads = ui.configint(b'experimental', b'bundlecompthreads')
1716 compthreads = ui.configint(b'experimental', b'bundlecompthreads')
1712 if compthreads is not None:
1717 if compthreads is not None:
1713 compopts[b'threads'] = compthreads
1718 compopts[b'threads'] = compthreads
1714
1719
1715 # Bundling of obsmarker and phases is optional as not all clients
1720 # Bundling of obsmarker and phases is optional as not all clients
1716 # support the necessary features.
1721 # support the necessary features.
1717 cfg = ui.configbool
1722 cfg = ui.configbool
1718 obsolescence_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker')
1723 obsolescence_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker')
1719 bundlespec.set_param(b'obsolescence', obsolescence_cfg, overwrite=False)
1724 bundlespec.set_param(b'obsolescence', obsolescence_cfg, overwrite=False)
1720 obs_mand_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker:mandatory')
1725 obs_mand_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker:mandatory')
1721 bundlespec.set_param(
1726 bundlespec.set_param(
1722 b'obsolescence-mandatory', obs_mand_cfg, overwrite=False
1727 b'obsolescence-mandatory', obs_mand_cfg, overwrite=False
1723 )
1728 )
1724 if not bundlespec.params.get(b'phases', False):
1729 if not bundlespec.params.get(b'phases', False):
1725 phases_cfg = cfg(b'experimental', b'bundle-phases')
1730 phases_cfg = cfg(b'experimental', b'bundle-phases')
1726 bundlespec.set_param(b'phases', phases_cfg, overwrite=False)
1731 bundlespec.set_param(b'phases', phases_cfg, overwrite=False)
1727
1732
1728 bundle2.writenewbundle(
1733 bundle2.writenewbundle(
1729 ui,
1734 ui,
1730 repo,
1735 repo,
1731 b'bundle',
1736 b'bundle',
1732 fname,
1737 fname,
1733 bversion,
1738 bversion,
1734 outgoing,
1739 outgoing,
1735 bundlespec.params,
1740 bundlespec.params,
1736 compression=bcompression,
1741 compression=bcompression,
1737 compopts=compopts,
1742 compopts=compopts,
1738 )
1743 )
1739
1744
1740
1745
1741 @command(
1746 @command(
1742 b'cat',
1747 b'cat',
1743 [
1748 [
1744 (
1749 (
1745 b'o',
1750 b'o',
1746 b'output',
1751 b'output',
1747 b'',
1752 b'',
1748 _(b'print output to file with formatted name'),
1753 _(b'print output to file with formatted name'),
1749 _(b'FORMAT'),
1754 _(b'FORMAT'),
1750 ),
1755 ),
1751 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1756 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1752 (b'', b'decode', None, _(b'apply any matching decode filter')),
1757 (b'', b'decode', None, _(b'apply any matching decode filter')),
1753 ]
1758 ]
1754 + walkopts
1759 + walkopts
1755 + formatteropts,
1760 + formatteropts,
1756 _(b'[OPTION]... FILE...'),
1761 _(b'[OPTION]... FILE...'),
1757 helpcategory=command.CATEGORY_FILE_CONTENTS,
1762 helpcategory=command.CATEGORY_FILE_CONTENTS,
1758 inferrepo=True,
1763 inferrepo=True,
1759 intents={INTENT_READONLY},
1764 intents={INTENT_READONLY},
1760 )
1765 )
1761 def cat(ui, repo, file1, *pats, **opts):
1766 def cat(ui, repo, file1, *pats, **opts):
1762 """output the current or given revision of files
1767 """output the current or given revision of files
1763
1768
1764 Print the specified files as they were at the given revision. If
1769 Print the specified files as they were at the given revision. If
1765 no revision is given, the parent of the working directory is used.
1770 no revision is given, the parent of the working directory is used.
1766
1771
1767 Output may be to a file, in which case the name of the file is
1772 Output may be to a file, in which case the name of the file is
1768 given using a template string. See :hg:`help templates`. In addition
1773 given using a template string. See :hg:`help templates`. In addition
1769 to the common template keywords, the following formatting rules are
1774 to the common template keywords, the following formatting rules are
1770 supported:
1775 supported:
1771
1776
1772 :``%%``: literal "%" character
1777 :``%%``: literal "%" character
1773 :``%s``: basename of file being printed
1778 :``%s``: basename of file being printed
1774 :``%d``: dirname of file being printed, or '.' if in repository root
1779 :``%d``: dirname of file being printed, or '.' if in repository root
1775 :``%p``: root-relative path name of file being printed
1780 :``%p``: root-relative path name of file being printed
1776 :``%H``: changeset hash (40 hexadecimal digits)
1781 :``%H``: changeset hash (40 hexadecimal digits)
1777 :``%R``: changeset revision number
1782 :``%R``: changeset revision number
1778 :``%h``: short-form changeset hash (12 hexadecimal digits)
1783 :``%h``: short-form changeset hash (12 hexadecimal digits)
1779 :``%r``: zero-padded changeset revision number
1784 :``%r``: zero-padded changeset revision number
1780 :``%b``: basename of the exporting repository
1785 :``%b``: basename of the exporting repository
1781 :``\\``: literal "\\" character
1786 :``\\``: literal "\\" character
1782
1787
1783 .. container:: verbose
1788 .. container:: verbose
1784
1789
1785 Template:
1790 Template:
1786
1791
1787 The following keywords are supported in addition to the common template
1792 The following keywords are supported in addition to the common template
1788 keywords and functions. See also :hg:`help templates`.
1793 keywords and functions. See also :hg:`help templates`.
1789
1794
1790 :data: String. File content.
1795 :data: String. File content.
1791 :path: String. Repository-absolute path of the file.
1796 :path: String. Repository-absolute path of the file.
1792
1797
1793 Returns 0 on success.
1798 Returns 0 on success.
1794 """
1799 """
1795 rev = opts.get('rev')
1800 rev = opts.get('rev')
1796 if rev:
1801 if rev:
1797 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1802 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1798 ctx = logcmdutil.revsingle(repo, rev)
1803 ctx = logcmdutil.revsingle(repo, rev)
1799 m = scmutil.match(ctx, (file1,) + pats, pycompat.byteskwargs(opts))
1804 m = scmutil.match(ctx, (file1,) + pats, pycompat.byteskwargs(opts))
1800 fntemplate = opts.pop('output', b'')
1805 fntemplate = opts.pop('output', b'')
1801 if cmdutil.isstdiofilename(fntemplate):
1806 if cmdutil.isstdiofilename(fntemplate):
1802 fntemplate = b''
1807 fntemplate = b''
1803
1808
1804 if fntemplate:
1809 if fntemplate:
1805 fm = formatter.nullformatter(ui, b'cat', pycompat.byteskwargs(opts))
1810 fm = formatter.nullformatter(ui, b'cat', pycompat.byteskwargs(opts))
1806 else:
1811 else:
1807 ui.pager(b'cat')
1812 ui.pager(b'cat')
1808 fm = ui.formatter(b'cat', pycompat.byteskwargs(opts))
1813 fm = ui.formatter(b'cat', pycompat.byteskwargs(opts))
1809 with fm:
1814 with fm:
1810 return cmdutil.cat(ui, repo, ctx, m, fm, fntemplate, b'', **opts)
1815 return cmdutil.cat(ui, repo, ctx, m, fm, fntemplate, b'', **opts)
1811
1816
1812
1817
1813 @command(
1818 @command(
1814 b'clone',
1819 b'clone',
1815 [
1820 [
1816 (
1821 (
1817 b'U',
1822 b'U',
1818 b'noupdate',
1823 b'noupdate',
1819 None,
1824 None,
1820 _(
1825 _(
1821 b'the clone will include an empty working '
1826 b'the clone will include an empty working '
1822 b'directory (only a repository)'
1827 b'directory (only a repository)'
1823 ),
1828 ),
1824 ),
1829 ),
1825 (
1830 (
1826 b'u',
1831 b'u',
1827 b'updaterev',
1832 b'updaterev',
1828 b'',
1833 b'',
1829 _(b'revision, tag, or branch to check out'),
1834 _(b'revision, tag, or branch to check out'),
1830 _(b'REV'),
1835 _(b'REV'),
1831 ),
1836 ),
1832 (
1837 (
1833 b'r',
1838 b'r',
1834 b'rev',
1839 b'rev',
1835 [],
1840 [],
1836 _(
1841 _(
1837 b'do not clone everything, but include this changeset'
1842 b'do not clone everything, but include this changeset'
1838 b' and its ancestors'
1843 b' and its ancestors'
1839 ),
1844 ),
1840 _(b'REV'),
1845 _(b'REV'),
1841 ),
1846 ),
1842 (
1847 (
1843 b'b',
1848 b'b',
1844 b'branch',
1849 b'branch',
1845 [],
1850 [],
1846 _(
1851 _(
1847 b'do not clone everything, but include this branch\'s'
1852 b'do not clone everything, but include this branch\'s'
1848 b' changesets and their ancestors'
1853 b' changesets and their ancestors'
1849 ),
1854 ),
1850 _(b'BRANCH'),
1855 _(b'BRANCH'),
1851 ),
1856 ),
1852 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1857 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1853 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1858 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1854 (b'', b'stream', None, _(b'clone with minimal data processing')),
1859 (b'', b'stream', None, _(b'clone with minimal data processing')),
1855 ]
1860 ]
1856 + remoteopts,
1861 + remoteopts,
1857 _(b'[OPTION]... SOURCE [DEST]'),
1862 _(b'[OPTION]... SOURCE [DEST]'),
1858 helpcategory=command.CATEGORY_REPO_CREATION,
1863 helpcategory=command.CATEGORY_REPO_CREATION,
1859 helpbasic=True,
1864 helpbasic=True,
1860 norepo=True,
1865 norepo=True,
1861 )
1866 )
1862 def clone(ui, source, dest=None, **opts):
1867 def clone(ui, source, dest=None, **opts):
1863 """make a copy of an existing repository
1868 """make a copy of an existing repository
1864
1869
1865 Create a copy of an existing repository in a new directory.
1870 Create a copy of an existing repository in a new directory.
1866
1871
1867 If no destination directory name is specified, it defaults to the
1872 If no destination directory name is specified, it defaults to the
1868 basename of the source.
1873 basename of the source.
1869
1874
1870 The location of the source is added to the new repository's
1875 The location of the source is added to the new repository's
1871 ``.hg/hgrc`` file, as the default to be used for future pulls.
1876 ``.hg/hgrc`` file, as the default to be used for future pulls.
1872
1877
1873 Only local paths and ``ssh://`` URLs are supported as
1878 Only local paths and ``ssh://`` URLs are supported as
1874 destinations. For ``ssh://`` destinations, no working directory or
1879 destinations. For ``ssh://`` destinations, no working directory or
1875 ``.hg/hgrc`` will be created on the remote side.
1880 ``.hg/hgrc`` will be created on the remote side.
1876
1881
1877 If the source repository has a bookmark called '@' set, that
1882 If the source repository has a bookmark called '@' set, that
1878 revision will be checked out in the new repository by default.
1883 revision will be checked out in the new repository by default.
1879
1884
1880 To check out a particular version, use -u/--update, or
1885 To check out a particular version, use -u/--update, or
1881 -U/--noupdate to create a clone with no working directory.
1886 -U/--noupdate to create a clone with no working directory.
1882
1887
1883 To pull only a subset of changesets, specify one or more revisions
1888 To pull only a subset of changesets, specify one or more revisions
1884 identifiers with -r/--rev or branches with -b/--branch. The
1889 identifiers with -r/--rev or branches with -b/--branch. The
1885 resulting clone will contain only the specified changesets and
1890 resulting clone will contain only the specified changesets and
1886 their ancestors. These options (or 'clone src#rev dest') imply
1891 their ancestors. These options (or 'clone src#rev dest') imply
1887 --pull, even for local source repositories.
1892 --pull, even for local source repositories.
1888
1893
1889 In normal clone mode, the remote normalizes repository data into a common
1894 In normal clone mode, the remote normalizes repository data into a common
1890 exchange format and the receiving end translates this data into its local
1895 exchange format and the receiving end translates this data into its local
1891 storage format. --stream activates a different clone mode that essentially
1896 storage format. --stream activates a different clone mode that essentially
1892 copies repository files from the remote with minimal data processing. This
1897 copies repository files from the remote with minimal data processing. This
1893 significantly reduces the CPU cost of a clone both remotely and locally.
1898 significantly reduces the CPU cost of a clone both remotely and locally.
1894 However, it often increases the transferred data size by 30-40%. This can
1899 However, it often increases the transferred data size by 30-40%. This can
1895 result in substantially faster clones where I/O throughput is plentiful,
1900 result in substantially faster clones where I/O throughput is plentiful,
1896 especially for larger repositories. A side-effect of --stream clones is
1901 especially for larger repositories. A side-effect of --stream clones is
1897 that storage settings and requirements on the remote are applied locally:
1902 that storage settings and requirements on the remote are applied locally:
1898 a modern client may inherit legacy or inefficient storage used by the
1903 a modern client may inherit legacy or inefficient storage used by the
1899 remote or a legacy Mercurial client may not be able to clone from a
1904 remote or a legacy Mercurial client may not be able to clone from a
1900 modern Mercurial remote.
1905 modern Mercurial remote.
1901
1906
1902 .. note::
1907 .. note::
1903
1908
1904 Specifying a tag will include the tagged changeset but not the
1909 Specifying a tag will include the tagged changeset but not the
1905 changeset containing the tag.
1910 changeset containing the tag.
1906
1911
1907 .. container:: verbose
1912 .. container:: verbose
1908
1913
1909 For efficiency, hardlinks are used for cloning whenever the
1914 For efficiency, hardlinks are used for cloning whenever the
1910 source and destination are on the same filesystem (note this
1915 source and destination are on the same filesystem (note this
1911 applies only to the repository data, not to the working
1916 applies only to the repository data, not to the working
1912 directory). Some filesystems, such as AFS, implement hardlinking
1917 directory). Some filesystems, such as AFS, implement hardlinking
1913 incorrectly, but do not report errors. In these cases, use the
1918 incorrectly, but do not report errors. In these cases, use the
1914 --pull option to avoid hardlinking.
1919 --pull option to avoid hardlinking.
1915
1920
1916 Mercurial will update the working directory to the first applicable
1921 Mercurial will update the working directory to the first applicable
1917 revision from this list:
1922 revision from this list:
1918
1923
1919 a) null if -U or the source repository has no changesets
1924 a) null if -U or the source repository has no changesets
1920 b) if -u . and the source repository is local, the first parent of
1925 b) if -u . and the source repository is local, the first parent of
1921 the source repository's working directory
1926 the source repository's working directory
1922 c) the changeset specified with -u (if a branch name, this means the
1927 c) the changeset specified with -u (if a branch name, this means the
1923 latest head of that branch)
1928 latest head of that branch)
1924 d) the changeset specified with -r
1929 d) the changeset specified with -r
1925 e) the tipmost head specified with -b
1930 e) the tipmost head specified with -b
1926 f) the tipmost head specified with the url#branch source syntax
1931 f) the tipmost head specified with the url#branch source syntax
1927 g) the revision marked with the '@' bookmark, if present
1932 g) the revision marked with the '@' bookmark, if present
1928 h) the tipmost head of the default branch
1933 h) the tipmost head of the default branch
1929 i) tip
1934 i) tip
1930
1935
1931 When cloning from servers that support it, Mercurial may fetch
1936 When cloning from servers that support it, Mercurial may fetch
1932 pre-generated data from a server-advertised URL or inline from the
1937 pre-generated data from a server-advertised URL or inline from the
1933 same stream. When this is done, hooks operating on incoming changesets
1938 same stream. When this is done, hooks operating on incoming changesets
1934 and changegroups may fire more than once, once for each pre-generated
1939 and changegroups may fire more than once, once for each pre-generated
1935 bundle and as well as for any additional remaining data. In addition,
1940 bundle and as well as for any additional remaining data. In addition,
1936 if an error occurs, the repository may be rolled back to a partial
1941 if an error occurs, the repository may be rolled back to a partial
1937 clone. This behavior may change in future releases.
1942 clone. This behavior may change in future releases.
1938 See :hg:`help -e clonebundles` for more.
1943 See :hg:`help -e clonebundles` for more.
1939
1944
1940 Examples:
1945 Examples:
1941
1946
1942 - clone a remote repository to a new directory named hg/::
1947 - clone a remote repository to a new directory named hg/::
1943
1948
1944 hg clone https://www.mercurial-scm.org/repo/hg/
1949 hg clone https://www.mercurial-scm.org/repo/hg/
1945
1950
1946 - create a lightweight local clone::
1951 - create a lightweight local clone::
1947
1952
1948 hg clone project/ project-feature/
1953 hg clone project/ project-feature/
1949
1954
1950 - clone from an absolute path on an ssh server (note double-slash)::
1955 - clone from an absolute path on an ssh server (note double-slash)::
1951
1956
1952 hg clone ssh://user@server//home/projects/alpha/
1957 hg clone ssh://user@server//home/projects/alpha/
1953
1958
1954 - do a streaming clone while checking out a specified version::
1959 - do a streaming clone while checking out a specified version::
1955
1960
1956 hg clone --stream http://server/repo -u 1.5
1961 hg clone --stream http://server/repo -u 1.5
1957
1962
1958 - create a repository without changesets after a particular revision::
1963 - create a repository without changesets after a particular revision::
1959
1964
1960 hg clone -r 04e544 experimental/ good/
1965 hg clone -r 04e544 experimental/ good/
1961
1966
1962 - clone (and track) a particular named branch::
1967 - clone (and track) a particular named branch::
1963
1968
1964 hg clone https://www.mercurial-scm.org/repo/hg/#stable
1969 hg clone https://www.mercurial-scm.org/repo/hg/#stable
1965
1970
1966 See :hg:`help urls` for details on specifying URLs.
1971 See :hg:`help urls` for details on specifying URLs.
1967
1972
1968 Returns 0 on success.
1973 Returns 0 on success.
1969 """
1974 """
1970 cmdutil.check_at_most_one_arg(opts, 'noupdate', 'updaterev')
1975 cmdutil.check_at_most_one_arg(opts, 'noupdate', 'updaterev')
1971
1976
1972 # --include/--exclude can come from narrow or sparse.
1977 # --include/--exclude can come from narrow or sparse.
1973 includepats, excludepats = None, None
1978 includepats, excludepats = None, None
1974
1979
1975 # hg.clone() differentiates between None and an empty set. So make sure
1980 # hg.clone() differentiates between None and an empty set. So make sure
1976 # patterns are sets if narrow is requested without patterns.
1981 # patterns are sets if narrow is requested without patterns.
1977 if opts.get('narrow'):
1982 if opts.get('narrow'):
1978 includepats = set()
1983 includepats = set()
1979 excludepats = set()
1984 excludepats = set()
1980
1985
1981 if opts.get('include'):
1986 if opts.get('include'):
1982 includepats = narrowspec.parsepatterns(opts.get('include'))
1987 includepats = narrowspec.parsepatterns(opts.get('include'))
1983 if opts.get('exclude'):
1988 if opts.get('exclude'):
1984 excludepats = narrowspec.parsepatterns(opts.get('exclude'))
1989 excludepats = narrowspec.parsepatterns(opts.get('exclude'))
1985
1990
1986 r = hg.clone(
1991 r = hg.clone(
1987 ui,
1992 ui,
1988 pycompat.byteskwargs(opts),
1993 pycompat.byteskwargs(opts),
1989 source,
1994 source,
1990 dest,
1995 dest,
1991 pull=opts.get('pull'),
1996 pull=opts.get('pull'),
1992 stream=opts.get('stream') or opts.get('uncompressed'),
1997 stream=opts.get('stream') or opts.get('uncompressed'),
1993 revs=opts.get('rev'),
1998 revs=opts.get('rev'),
1994 update=opts.get('updaterev') or not opts.get('noupdate'),
1999 update=opts.get('updaterev') or not opts.get('noupdate'),
1995 branch=opts.get('branch'),
2000 branch=opts.get('branch'),
1996 shareopts=opts.get('shareopts'),
2001 shareopts=opts.get('shareopts'),
1997 storeincludepats=includepats,
2002 storeincludepats=includepats,
1998 storeexcludepats=excludepats,
2003 storeexcludepats=excludepats,
1999 depth=opts.get('depth') or None,
2004 depth=opts.get('depth') or None,
2000 )
2005 )
2001
2006
2002 return r is None
2007 return r is None
2003
2008
2004
2009
2005 @command(
2010 @command(
2006 b'commit|ci',
2011 b'commit|ci',
2007 [
2012 [
2008 (
2013 (
2009 b'A',
2014 b'A',
2010 b'addremove',
2015 b'addremove',
2011 None,
2016 None,
2012 _(b'mark new/missing files as added/removed before committing'),
2017 _(b'mark new/missing files as added/removed before committing'),
2013 ),
2018 ),
2014 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
2019 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
2015 (b'', b'amend', None, _(b'amend the parent of the working directory')),
2020 (b'', b'amend', None, _(b'amend the parent of the working directory')),
2016 (b's', b'secret', None, _(b'use the secret phase for committing')),
2021 (b's', b'secret', None, _(b'use the secret phase for committing')),
2017 (b'', b'draft', None, _(b'use the draft phase for committing')),
2022 (b'', b'draft', None, _(b'use the draft phase for committing')),
2018 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
2023 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
2019 (
2024 (
2020 b'',
2025 b'',
2021 b'force-close-branch',
2026 b'force-close-branch',
2022 None,
2027 None,
2023 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
2028 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
2024 ),
2029 ),
2025 (b'i', b'interactive', None, _(b'use interactive mode')),
2030 (b'i', b'interactive', None, _(b'use interactive mode')),
2026 ]
2031 ]
2027 + walkopts
2032 + walkopts
2028 + commitopts
2033 + commitopts
2029 + commitopts2
2034 + commitopts2
2030 + subrepoopts,
2035 + subrepoopts,
2031 _(b'[OPTION]... [FILE]...'),
2036 _(b'[OPTION]... [FILE]...'),
2032 helpcategory=command.CATEGORY_COMMITTING,
2037 helpcategory=command.CATEGORY_COMMITTING,
2033 helpbasic=True,
2038 helpbasic=True,
2034 inferrepo=True,
2039 inferrepo=True,
2035 )
2040 )
2036 def commit(ui, repo, *pats, **opts):
2041 def commit(ui, repo, *pats, **opts):
2037 """commit the specified files or all outstanding changes
2042 """commit the specified files or all outstanding changes
2038
2043
2039 Commit changes to the given files into the repository. Unlike a
2044 Commit changes to the given files into the repository. Unlike a
2040 centralized SCM, this operation is a local operation. See
2045 centralized SCM, this operation is a local operation. See
2041 :hg:`push` for a way to actively distribute your changes.
2046 :hg:`push` for a way to actively distribute your changes.
2042
2047
2043 If a list of files is omitted, all changes reported by :hg:`status`
2048 If a list of files is omitted, all changes reported by :hg:`status`
2044 will be committed.
2049 will be committed.
2045
2050
2046 If you are committing the result of a merge, do not provide any
2051 If you are committing the result of a merge, do not provide any
2047 filenames or -I/-X filters.
2052 filenames or -I/-X filters.
2048
2053
2049 If no commit message is specified, Mercurial starts your
2054 If no commit message is specified, Mercurial starts your
2050 configured editor where you can enter a message. In case your
2055 configured editor where you can enter a message. In case your
2051 commit fails, you will find a backup of your message in
2056 commit fails, you will find a backup of your message in
2052 ``.hg/last-message.txt``.
2057 ``.hg/last-message.txt``.
2053
2058
2054 The --close-branch flag can be used to mark the current branch
2059 The --close-branch flag can be used to mark the current branch
2055 head closed. When all heads of a branch are closed, the branch
2060 head closed. When all heads of a branch are closed, the branch
2056 will be considered closed and no longer listed.
2061 will be considered closed and no longer listed.
2057
2062
2058 The --amend flag can be used to amend the parent of the
2063 The --amend flag can be used to amend the parent of the
2059 working directory with a new commit that contains the changes
2064 working directory with a new commit that contains the changes
2060 in the parent in addition to those currently reported by :hg:`status`,
2065 in the parent in addition to those currently reported by :hg:`status`,
2061 if there are any. The old commit is stored in a backup bundle in
2066 if there are any. The old commit is stored in a backup bundle in
2062 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
2067 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
2063 on how to restore it).
2068 on how to restore it).
2064
2069
2065 Message, user and date are taken from the amended commit unless
2070 Message, user and date are taken from the amended commit unless
2066 specified. When a message isn't specified on the command line,
2071 specified. When a message isn't specified on the command line,
2067 the editor will open with the message of the amended commit.
2072 the editor will open with the message of the amended commit.
2068
2073
2069 It is not possible to amend public changesets (see :hg:`help phases`)
2074 It is not possible to amend public changesets (see :hg:`help phases`)
2070 or changesets that have children.
2075 or changesets that have children.
2071
2076
2072 See :hg:`help dates` for a list of formats valid for -d/--date.
2077 See :hg:`help dates` for a list of formats valid for -d/--date.
2073
2078
2074 Returns 0 on success, 1 if nothing changed.
2079 Returns 0 on success, 1 if nothing changed.
2075
2080
2076 .. container:: verbose
2081 .. container:: verbose
2077
2082
2078 Examples:
2083 Examples:
2079
2084
2080 - commit all files ending in .py::
2085 - commit all files ending in .py::
2081
2086
2082 hg commit --include "set:**.py"
2087 hg commit --include "set:**.py"
2083
2088
2084 - commit all non-binary files::
2089 - commit all non-binary files::
2085
2090
2086 hg commit --exclude "set:binary()"
2091 hg commit --exclude "set:binary()"
2087
2092
2088 - amend the current commit and set the date to now::
2093 - amend the current commit and set the date to now::
2089
2094
2090 hg commit --amend --date now
2095 hg commit --amend --date now
2091 """
2096 """
2092 cmdutil.check_at_most_one_arg(opts, 'draft', 'secret')
2097 cmdutil.check_at_most_one_arg(opts, 'draft', 'secret')
2093 cmdutil.check_incompatible_arguments(opts, 'subrepos', ['amend'])
2098 cmdutil.check_incompatible_arguments(opts, 'subrepos', ['amend'])
2094 with repo.wlock(), repo.lock():
2099 with repo.wlock(), repo.lock():
2095 return _docommit(ui, repo, *pats, **opts)
2100 return _docommit(ui, repo, *pats, **opts)
2096
2101
2097
2102
2098 def _docommit(ui, repo, *pats, **opts):
2103 def _docommit(ui, repo, *pats, **opts):
2099 if opts.get('interactive'):
2104 if opts.get('interactive'):
2100 opts.pop('interactive')
2105 opts.pop('interactive')
2101 ret = cmdutil.dorecord(
2106 ret = cmdutil.dorecord(
2102 ui, repo, commit, None, False, cmdutil.recordfilter, *pats, **opts
2107 ui, repo, commit, None, False, cmdutil.recordfilter, *pats, **opts
2103 )
2108 )
2104 # ret can be 0 (no changes to record) or the value returned by
2109 # ret can be 0 (no changes to record) or the value returned by
2105 # commit(), 1 if nothing changed or None on success.
2110 # commit(), 1 if nothing changed or None on success.
2106 return 1 if ret == 0 else ret
2111 return 1 if ret == 0 else ret
2107
2112
2108 if opts.get('subrepos'):
2113 if opts.get('subrepos'):
2109 # Let --subrepos on the command line override config setting.
2114 # Let --subrepos on the command line override config setting.
2110 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
2115 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
2111
2116
2112 cmdutil.checkunfinished(repo, commit=True)
2117 cmdutil.checkunfinished(repo, commit=True)
2113
2118
2114 branch = repo[None].branch()
2119 branch = repo[None].branch()
2115 bheads = repo.branchheads(branch)
2120 bheads = repo.branchheads(branch)
2116 tip = repo.changelog.tip()
2121 tip = repo.changelog.tip()
2117
2122
2118 extra = {}
2123 extra = {}
2119 if opts.get('close_branch') or opts.get('force_close_branch'):
2124 if opts.get('close_branch') or opts.get('force_close_branch'):
2120 extra[b'close'] = b'1'
2125 extra[b'close'] = b'1'
2121
2126
2122 if repo[b'.'].closesbranch():
2127 if repo[b'.'].closesbranch():
2123 # Not ideal, but let us do an extra status early to prevent early
2128 # Not ideal, but let us do an extra status early to prevent early
2124 # bail out.
2129 # bail out.
2125 matcher = scmutil.match(
2130 matcher = scmutil.match(
2126 repo[None], pats, pycompat.byteskwargs(opts)
2131 repo[None], pats, pycompat.byteskwargs(opts)
2127 )
2132 )
2128 s = repo.status(match=matcher)
2133 s = repo.status(match=matcher)
2129 if s.modified or s.added or s.removed:
2134 if s.modified or s.added or s.removed:
2130 bheads = repo.branchheads(branch, closed=True)
2135 bheads = repo.branchheads(branch, closed=True)
2131 else:
2136 else:
2132 msg = _(b'current revision is already a branch closing head')
2137 msg = _(b'current revision is already a branch closing head')
2133 raise error.InputError(msg)
2138 raise error.InputError(msg)
2134
2139
2135 if not bheads:
2140 if not bheads:
2136 raise error.InputError(
2141 raise error.InputError(
2137 _(b'branch "%s" has no heads to close') % branch
2142 _(b'branch "%s" has no heads to close') % branch
2138 )
2143 )
2139 elif (
2144 elif (
2140 branch == repo[b'.'].branch()
2145 branch == repo[b'.'].branch()
2141 and repo[b'.'].node() not in bheads
2146 and repo[b'.'].node() not in bheads
2142 and not opts.get('force_close_branch')
2147 and not opts.get('force_close_branch')
2143 ):
2148 ):
2144 hint = _(
2149 hint = _(
2145 b'use --force-close-branch to close branch from a non-head'
2150 b'use --force-close-branch to close branch from a non-head'
2146 b' changeset'
2151 b' changeset'
2147 )
2152 )
2148 raise error.InputError(_(b'can only close branch heads'), hint=hint)
2153 raise error.InputError(_(b'can only close branch heads'), hint=hint)
2149 elif opts.get('amend'):
2154 elif opts.get('amend'):
2150 if (
2155 if (
2151 repo[b'.'].p1().branch() != branch
2156 repo[b'.'].p1().branch() != branch
2152 and repo[b'.'].p2().branch() != branch
2157 and repo[b'.'].p2().branch() != branch
2153 ):
2158 ):
2154 raise error.InputError(_(b'can only close branch heads'))
2159 raise error.InputError(_(b'can only close branch heads'))
2155
2160
2156 if opts.get('amend'):
2161 if opts.get('amend'):
2157 if ui.configbool(b'ui', b'commitsubrepos'):
2162 if ui.configbool(b'ui', b'commitsubrepos'):
2158 raise error.InputError(
2163 raise error.InputError(
2159 _(b'cannot amend with ui.commitsubrepos enabled')
2164 _(b'cannot amend with ui.commitsubrepos enabled')
2160 )
2165 )
2161
2166
2162 old = repo[b'.']
2167 old = repo[b'.']
2163 rewriteutil.precheck(repo, [old.rev()], b'amend')
2168 rewriteutil.precheck(repo, [old.rev()], b'amend')
2164
2169
2165 # Currently histedit gets confused if an amend happens while histedit
2170 # Currently histedit gets confused if an amend happens while histedit
2166 # is in progress. Since we have a checkunfinished command, we are
2171 # is in progress. Since we have a checkunfinished command, we are
2167 # temporarily honoring it.
2172 # temporarily honoring it.
2168 #
2173 #
2169 # Note: eventually this guard will be removed. Please do not expect
2174 # Note: eventually this guard will be removed. Please do not expect
2170 # this behavior to remain.
2175 # this behavior to remain.
2171 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2176 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2172 cmdutil.checkunfinished(repo)
2177 cmdutil.checkunfinished(repo)
2173
2178
2174 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2179 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2175 if node == old.node():
2180 if node == old.node():
2176 ui.status(_(b"nothing changed\n"))
2181 ui.status(_(b"nothing changed\n"))
2177 return 1
2182 return 1
2178 else:
2183 else:
2179
2184
2180 def commitfunc(ui, repo, message, match, opts):
2185 def commitfunc(ui, repo, message, match, opts):
2181 overrides = {}
2186 overrides = {}
2182 if opts.get(b'secret'):
2187 if opts.get(b'secret'):
2183 overrides[(b'phases', b'new-commit')] = b'secret'
2188 overrides[(b'phases', b'new-commit')] = b'secret'
2184 elif opts.get(b'draft'):
2189 elif opts.get(b'draft'):
2185 overrides[(b'phases', b'new-commit')] = b'draft'
2190 overrides[(b'phases', b'new-commit')] = b'draft'
2186
2191
2187 baseui = repo.baseui
2192 baseui = repo.baseui
2188 with baseui.configoverride(overrides, b'commit'):
2193 with baseui.configoverride(overrides, b'commit'):
2189 with ui.configoverride(overrides, b'commit'):
2194 with ui.configoverride(overrides, b'commit'):
2190 editform = cmdutil.mergeeditform(
2195 editform = cmdutil.mergeeditform(
2191 repo[None], b'commit.normal'
2196 repo[None], b'commit.normal'
2192 )
2197 )
2193 editor = cmdutil.getcommiteditor(
2198 editor = cmdutil.getcommiteditor(
2194 editform=editform, **pycompat.strkwargs(opts)
2199 editform=editform, **pycompat.strkwargs(opts)
2195 )
2200 )
2196 return repo.commit(
2201 return repo.commit(
2197 message,
2202 message,
2198 opts.get(b'user'),
2203 opts.get(b'user'),
2199 opts.get(b'date'),
2204 opts.get(b'date'),
2200 match,
2205 match,
2201 editor=editor,
2206 editor=editor,
2202 extra=extra,
2207 extra=extra,
2203 )
2208 )
2204
2209
2205 node = cmdutil.commit(
2210 node = cmdutil.commit(
2206 ui, repo, commitfunc, pats, pycompat.byteskwargs(opts)
2211 ui, repo, commitfunc, pats, pycompat.byteskwargs(opts)
2207 )
2212 )
2208
2213
2209 if not node:
2214 if not node:
2210 stat = cmdutil.postcommitstatus(
2215 stat = cmdutil.postcommitstatus(
2211 repo, pats, pycompat.byteskwargs(opts)
2216 repo, pats, pycompat.byteskwargs(opts)
2212 )
2217 )
2213 if stat.deleted:
2218 if stat.deleted:
2214 ui.status(
2219 ui.status(
2215 _(
2220 _(
2216 b"nothing changed (%d missing files, see "
2221 b"nothing changed (%d missing files, see "
2217 b"'hg status')\n"
2222 b"'hg status')\n"
2218 )
2223 )
2219 % len(stat.deleted)
2224 % len(stat.deleted)
2220 )
2225 )
2221 else:
2226 else:
2222 ui.status(_(b"nothing changed\n"))
2227 ui.status(_(b"nothing changed\n"))
2223 return 1
2228 return 1
2224
2229
2225 cmdutil.commitstatus(repo, node, branch, bheads, tip, **opts)
2230 cmdutil.commitstatus(repo, node, branch, bheads, tip, **opts)
2226
2231
2227 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2232 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2228 status(
2233 status(
2229 ui,
2234 ui,
2230 repo,
2235 repo,
2231 modified=True,
2236 modified=True,
2232 added=True,
2237 added=True,
2233 removed=True,
2238 removed=True,
2234 deleted=True,
2239 deleted=True,
2235 unknown=True,
2240 unknown=True,
2236 subrepos=opts.get('subrepos'),
2241 subrepos=opts.get('subrepos'),
2237 )
2242 )
2238
2243
2239
2244
2240 @command(
2245 @command(
2241 b'config|showconfig|debugconfig',
2246 b'config|showconfig|debugconfig',
2242 [
2247 [
2243 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2248 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2244 # This is experimental because we need
2249 # This is experimental because we need
2245 # * reasonable behavior around aliases,
2250 # * reasonable behavior around aliases,
2246 # * decide if we display [debug] [experimental] and [devel] section par
2251 # * decide if we display [debug] [experimental] and [devel] section par
2247 # default
2252 # default
2248 # * some way to display "generic" config entry (the one matching
2253 # * some way to display "generic" config entry (the one matching
2249 # regexp,
2254 # regexp,
2250 # * proper display of the different value type
2255 # * proper display of the different value type
2251 # * a better way to handle <DYNAMIC> values (and variable types),
2256 # * a better way to handle <DYNAMIC> values (and variable types),
2252 # * maybe some type information ?
2257 # * maybe some type information ?
2253 (
2258 (
2254 b'',
2259 b'',
2255 b'exp-all-known',
2260 b'exp-all-known',
2256 None,
2261 None,
2257 _(b'show all known config option (EXPERIMENTAL)'),
2262 _(b'show all known config option (EXPERIMENTAL)'),
2258 ),
2263 ),
2259 (b'e', b'edit', None, _(b'edit user config')),
2264 (b'e', b'edit', None, _(b'edit user config')),
2260 (b'l', b'local', None, _(b'edit repository config')),
2265 (b'l', b'local', None, _(b'edit repository config')),
2261 (b'', b'source', None, _(b'show source of configuration value')),
2266 (b'', b'source', None, _(b'show source of configuration value')),
2262 (
2267 (
2263 b'',
2268 b'',
2264 b'shared',
2269 b'shared',
2265 None,
2270 None,
2266 _(b'edit shared source repository config (EXPERIMENTAL)'),
2271 _(b'edit shared source repository config (EXPERIMENTAL)'),
2267 ),
2272 ),
2268 (b'', b'non-shared', None, _(b'edit non shared config (EXPERIMENTAL)')),
2273 (b'', b'non-shared', None, _(b'edit non shared config (EXPERIMENTAL)')),
2269 (b'g', b'global', None, _(b'edit global config')),
2274 (b'g', b'global', None, _(b'edit global config')),
2270 ]
2275 ]
2271 + formatteropts,
2276 + formatteropts,
2272 _(b'[-u] [NAME]...'),
2277 _(b'[-u] [NAME]...'),
2273 helpcategory=command.CATEGORY_HELP,
2278 helpcategory=command.CATEGORY_HELP,
2274 optionalrepo=True,
2279 optionalrepo=True,
2275 intents={INTENT_READONLY},
2280 intents={INTENT_READONLY},
2276 )
2281 )
2277 def config(ui, repo, *values, **opts):
2282 def config(ui, repo, *values, **opts):
2278 """show combined config settings from all hgrc files
2283 """show combined config settings from all hgrc files
2279
2284
2280 With no arguments, print names and values of all config items.
2285 With no arguments, print names and values of all config items.
2281
2286
2282 With one argument of the form section.name, print just the value
2287 With one argument of the form section.name, print just the value
2283 of that config item.
2288 of that config item.
2284
2289
2285 With multiple arguments, print names and values of all config
2290 With multiple arguments, print names and values of all config
2286 items with matching section names or section.names.
2291 items with matching section names or section.names.
2287
2292
2288 With --edit, start an editor on the user-level config file. With
2293 With --edit, start an editor on the user-level config file. With
2289 --global, edit the system-wide config file. With --local, edit the
2294 --global, edit the system-wide config file. With --local, edit the
2290 repository-level config file.
2295 repository-level config file.
2291
2296
2292 With --source, the source (filename and line number) is printed
2297 With --source, the source (filename and line number) is printed
2293 for each config item.
2298 for each config item.
2294
2299
2295 See :hg:`help config` for more information about config files.
2300 See :hg:`help config` for more information about config files.
2296
2301
2297 .. container:: verbose
2302 .. container:: verbose
2298
2303
2299 --non-shared flag is used to edit `.hg/hgrc-not-shared` config file.
2304 --non-shared flag is used to edit `.hg/hgrc-not-shared` config file.
2300 This file is not shared across shares when in share-safe mode.
2305 This file is not shared across shares when in share-safe mode.
2301
2306
2302 Template:
2307 Template:
2303
2308
2304 The following keywords are supported. See also :hg:`help templates`.
2309 The following keywords are supported. See also :hg:`help templates`.
2305
2310
2306 :name: String. Config name.
2311 :name: String. Config name.
2307 :source: String. Filename and line number where the item is defined.
2312 :source: String. Filename and line number where the item is defined.
2308 :value: String. Config value.
2313 :value: String. Config value.
2309
2314
2310 The --shared flag can be used to edit the config file of shared source
2315 The --shared flag can be used to edit the config file of shared source
2311 repository. It only works when you have shared using the experimental
2316 repository. It only works when you have shared using the experimental
2312 share safe feature.
2317 share safe feature.
2313
2318
2314 Returns 0 on success, 1 if NAME does not exist.
2319 Returns 0 on success, 1 if NAME does not exist.
2315
2320
2316 """
2321 """
2317
2322
2318 editopts = ('edit', 'local', 'global', 'shared', 'non_shared')
2323 editopts = ('edit', 'local', 'global', 'shared', 'non_shared')
2319 if any(opts.get(o) for o in editopts):
2324 if any(opts.get(o) for o in editopts):
2320 cmdutil.check_at_most_one_arg(opts, *editopts[1:])
2325 cmdutil.check_at_most_one_arg(opts, *editopts[1:])
2321 if opts.get('local'):
2326 if opts.get('local'):
2322 if not repo:
2327 if not repo:
2323 raise error.InputError(
2328 raise error.InputError(
2324 _(b"can't use --local outside a repository")
2329 _(b"can't use --local outside a repository")
2325 )
2330 )
2326 paths = [repo.vfs.join(b'hgrc')]
2331 paths = [repo.vfs.join(b'hgrc')]
2327 elif opts.get('global'):
2332 elif opts.get('global'):
2328 paths = rcutil.systemrcpath()
2333 paths = rcutil.systemrcpath()
2329 elif opts.get('shared'):
2334 elif opts.get('shared'):
2330 if not repo.shared():
2335 if not repo.shared():
2331 raise error.InputError(
2336 raise error.InputError(
2332 _(b"repository is not shared; can't use --shared")
2337 _(b"repository is not shared; can't use --shared")
2333 )
2338 )
2334 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements:
2339 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements:
2335 raise error.InputError(
2340 raise error.InputError(
2336 _(
2341 _(
2337 b"share safe feature not enabled; "
2342 b"share safe feature not enabled; "
2338 b"unable to edit shared source repository config"
2343 b"unable to edit shared source repository config"
2339 )
2344 )
2340 )
2345 )
2341 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')]
2346 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')]
2342 elif opts.get('non_shared'):
2347 elif opts.get('non_shared'):
2343 paths = [repo.vfs.join(b'hgrc-not-shared')]
2348 paths = [repo.vfs.join(b'hgrc-not-shared')]
2344 else:
2349 else:
2345 paths = rcutil.userrcpath()
2350 paths = rcutil.userrcpath()
2346
2351
2347 for f in paths:
2352 for f in paths:
2348 if os.path.exists(f):
2353 if os.path.exists(f):
2349 break
2354 break
2350 else:
2355 else:
2351 if opts.get('global'):
2356 if opts.get('global'):
2352 samplehgrc = uimod.samplehgrcs[b'global']
2357 samplehgrc = uimod.samplehgrcs[b'global']
2353 elif opts.get('local'):
2358 elif opts.get('local'):
2354 samplehgrc = uimod.samplehgrcs[b'local']
2359 samplehgrc = uimod.samplehgrcs[b'local']
2355 else:
2360 else:
2356 samplehgrc = uimod.samplehgrcs[b'user']
2361 samplehgrc = uimod.samplehgrcs[b'user']
2357
2362
2358 f = paths[0]
2363 f = paths[0]
2359 util.writefile(f, util.tonativeeol(samplehgrc))
2364 util.writefile(f, util.tonativeeol(samplehgrc))
2360
2365
2361 editor = ui.geteditor()
2366 editor = ui.geteditor()
2362 ui.system(
2367 ui.system(
2363 b"%s \"%s\"" % (editor, f),
2368 b"%s \"%s\"" % (editor, f),
2364 onerr=error.InputError,
2369 onerr=error.InputError,
2365 errprefix=_(b"edit failed"),
2370 errprefix=_(b"edit failed"),
2366 blockedtag=b'config_edit',
2371 blockedtag=b'config_edit',
2367 )
2372 )
2368 return
2373 return
2369 ui.pager(b'config')
2374 ui.pager(b'config')
2370 fm = ui.formatter(b'config', pycompat.byteskwargs(opts))
2375 fm = ui.formatter(b'config', pycompat.byteskwargs(opts))
2371 for t, f in rcutil.rccomponents():
2376 for t, f in rcutil.rccomponents():
2372 if t == b'path':
2377 if t == b'path':
2373 ui.debug(b'read config from: %s\n' % f)
2378 ui.debug(b'read config from: %s\n' % f)
2374 elif t == b'resource':
2379 elif t == b'resource':
2375 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
2380 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
2376 elif t == b'items':
2381 elif t == b'items':
2377 # Don't print anything for 'items'.
2382 # Don't print anything for 'items'.
2378 pass
2383 pass
2379 else:
2384 else:
2380 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2385 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2381 untrusted = bool(opts.get('untrusted'))
2386 untrusted = bool(opts.get('untrusted'))
2382
2387
2383 selsections = selentries = []
2388 selsections = selentries = []
2384 if values:
2389 if values:
2385 selsections = [v for v in values if b'.' not in v]
2390 selsections = [v for v in values if b'.' not in v]
2386 selentries = [v for v in values if b'.' in v]
2391 selentries = [v for v in values if b'.' in v]
2387 uniquesel = len(selentries) == 1 and not selsections
2392 uniquesel = len(selentries) == 1 and not selsections
2388 selsections = set(selsections)
2393 selsections = set(selsections)
2389 selentries = set(selentries)
2394 selentries = set(selentries)
2390
2395
2391 matched = False
2396 matched = False
2392 all_known = opts['exp_all_known']
2397 all_known = opts['exp_all_known']
2393 show_source = ui.debugflag or opts.get('source')
2398 show_source = ui.debugflag or opts.get('source')
2394 entries = ui.walkconfig(untrusted=untrusted, all_known=all_known)
2399 entries = ui.walkconfig(untrusted=untrusted, all_known=all_known)
2395 for section, name, value in entries:
2400 for section, name, value in entries:
2396 source = ui.configsource(section, name, untrusted)
2401 source = ui.configsource(section, name, untrusted)
2397 value = pycompat.bytestr(value)
2402 value = pycompat.bytestr(value)
2398 defaultvalue = ui.configdefault(section, name)
2403 defaultvalue = ui.configdefault(section, name)
2399 if fm.isplain():
2404 if fm.isplain():
2400 source = source or b'none'
2405 source = source or b'none'
2401 value = value.replace(b'\n', b'\\n')
2406 value = value.replace(b'\n', b'\\n')
2402 entryname = section + b'.' + name
2407 entryname = section + b'.' + name
2403 if values and not (section in selsections or entryname in selentries):
2408 if values and not (section in selsections or entryname in selentries):
2404 continue
2409 continue
2405 fm.startitem()
2410 fm.startitem()
2406 fm.condwrite(show_source, b'source', b'%s: ', source)
2411 fm.condwrite(show_source, b'source', b'%s: ', source)
2407 if uniquesel:
2412 if uniquesel:
2408 fm.data(name=entryname)
2413 fm.data(name=entryname)
2409 fm.write(b'value', b'%s\n', value)
2414 fm.write(b'value', b'%s\n', value)
2410 else:
2415 else:
2411 fm.write(b'name value', b'%s=%s\n', entryname, value)
2416 fm.write(b'name value', b'%s=%s\n', entryname, value)
2412 if formatter.isprintable(defaultvalue):
2417 if formatter.isprintable(defaultvalue):
2413 fm.data(defaultvalue=defaultvalue)
2418 fm.data(defaultvalue=defaultvalue)
2414 elif isinstance(defaultvalue, list) and all(
2419 elif isinstance(defaultvalue, list) and all(
2415 formatter.isprintable(e) for e in defaultvalue
2420 formatter.isprintable(e) for e in defaultvalue
2416 ):
2421 ):
2417 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value'))
2422 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value'))
2418 # TODO: no idea how to process unsupported defaultvalue types
2423 # TODO: no idea how to process unsupported defaultvalue types
2419 matched = True
2424 matched = True
2420 fm.end()
2425 fm.end()
2421 if matched:
2426 if matched:
2422 return 0
2427 return 0
2423 return 1
2428 return 1
2424
2429
2425
2430
2426 @command(
2431 @command(
2427 b'continue',
2432 b'continue',
2428 dryrunopts,
2433 dryrunopts,
2429 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2434 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2430 helpbasic=True,
2435 helpbasic=True,
2431 )
2436 )
2432 def continuecmd(ui, repo, **opts):
2437 def continuecmd(ui, repo, **opts):
2433 """resumes an interrupted operation (EXPERIMENTAL)
2438 """resumes an interrupted operation (EXPERIMENTAL)
2434
2439
2435 Finishes a multistep operation like graft, histedit, rebase, merge,
2440 Finishes a multistep operation like graft, histedit, rebase, merge,
2436 and unshelve if they are in an interrupted state.
2441 and unshelve if they are in an interrupted state.
2437
2442
2438 use --dry-run/-n to dry run the command.
2443 use --dry-run/-n to dry run the command.
2439 """
2444 """
2440 dryrun = opts.get('dry_run')
2445 dryrun = opts.get('dry_run')
2441 contstate = cmdutil.getunfinishedstate(repo)
2446 contstate = cmdutil.getunfinishedstate(repo)
2442 if not contstate:
2447 if not contstate:
2443 raise error.StateError(_(b'no operation in progress'))
2448 raise error.StateError(_(b'no operation in progress'))
2444 if not contstate.continuefunc:
2449 if not contstate.continuefunc:
2445 raise error.StateError(
2450 raise error.StateError(
2446 (
2451 (
2447 _(b"%s in progress but does not support 'hg continue'")
2452 _(b"%s in progress but does not support 'hg continue'")
2448 % (contstate._opname)
2453 % (contstate._opname)
2449 ),
2454 ),
2450 hint=contstate.continuemsg(),
2455 hint=contstate.continuemsg(),
2451 )
2456 )
2452 if dryrun:
2457 if dryrun:
2453 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2458 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2454 return
2459 return
2455 return contstate.continuefunc(ui, repo)
2460 return contstate.continuefunc(ui, repo)
2456
2461
2457
2462
2458 @command(
2463 @command(
2459 b'copy|cp',
2464 b'copy|cp',
2460 [
2465 [
2461 (b'', b'forget', None, _(b'unmark a destination file as copied')),
2466 (b'', b'forget', None, _(b'unmark a destination file as copied')),
2462 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2467 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2463 (
2468 (
2464 b'',
2469 b'',
2465 b'at-rev',
2470 b'at-rev',
2466 b'',
2471 b'',
2467 _(b'(un)mark copies in the given revision (EXPERIMENTAL)'),
2472 _(b'(un)mark copies in the given revision (EXPERIMENTAL)'),
2468 _(b'REV'),
2473 _(b'REV'),
2469 ),
2474 ),
2470 (
2475 (
2471 b'f',
2476 b'f',
2472 b'force',
2477 b'force',
2473 None,
2478 None,
2474 _(b'forcibly copy over an existing managed file'),
2479 _(b'forcibly copy over an existing managed file'),
2475 ),
2480 ),
2476 ]
2481 ]
2477 + walkopts
2482 + walkopts
2478 + dryrunopts,
2483 + dryrunopts,
2479 _(b'[OPTION]... (SOURCE... DEST | --forget DEST...)'),
2484 _(b'[OPTION]... (SOURCE... DEST | --forget DEST...)'),
2480 helpcategory=command.CATEGORY_FILE_CONTENTS,
2485 helpcategory=command.CATEGORY_FILE_CONTENTS,
2481 )
2486 )
2482 def copy(ui, repo, *pats, **opts):
2487 def copy(ui, repo, *pats, **opts):
2483 """mark files as copied for the next commit
2488 """mark files as copied for the next commit
2484
2489
2485 Mark dest as having copies of source files. If dest is a
2490 Mark dest as having copies of source files. If dest is a
2486 directory, copies are put in that directory. If dest is a file,
2491 directory, copies are put in that directory. If dest is a file,
2487 the source must be a single file.
2492 the source must be a single file.
2488
2493
2489 By default, this command copies the contents of files as they
2494 By default, this command copies the contents of files as they
2490 exist in the working directory. If invoked with -A/--after, the
2495 exist in the working directory. If invoked with -A/--after, the
2491 operation is recorded, but no copying is performed.
2496 operation is recorded, but no copying is performed.
2492
2497
2493 To undo marking a destination file as copied, use --forget. With that
2498 To undo marking a destination file as copied, use --forget. With that
2494 option, all given (positional) arguments are unmarked as copies. The
2499 option, all given (positional) arguments are unmarked as copies. The
2495 destination file(s) will be left in place (still tracked). Note that
2500 destination file(s) will be left in place (still tracked). Note that
2496 :hg:`copy --forget` behaves the same way as :hg:`rename --forget`.
2501 :hg:`copy --forget` behaves the same way as :hg:`rename --forget`.
2497
2502
2498 This command takes effect with the next commit by default.
2503 This command takes effect with the next commit by default.
2499
2504
2500 Returns 0 on success, 1 if errors are encountered.
2505 Returns 0 on success, 1 if errors are encountered.
2501 """
2506 """
2502
2507
2503 context = lambda repo: repo.dirstate.changing_files(repo)
2508 context = lambda repo: repo.dirstate.changing_files(repo)
2504 rev = opts.get('at_rev')
2509 rev = opts.get('at_rev')
2505
2510
2506 if rev:
2511 if rev:
2507 ctx = logcmdutil.revsingle(repo, rev)
2512 ctx = logcmdutil.revsingle(repo, rev)
2508 if ctx.rev() is not None:
2513 if ctx.rev() is not None:
2509
2514
2510 def context(repo):
2515 def context(repo):
2511 return util.nullcontextmanager()
2516 return util.nullcontextmanager()
2512
2517
2513 opts['at_rev'] = ctx.rev()
2518 opts['at_rev'] = ctx.rev()
2514 with repo.wlock(), context(repo):
2519 with repo.wlock(), context(repo):
2515 return cmdutil.copy(ui, repo, pats, pycompat.byteskwargs(opts))
2520 return cmdutil.copy(ui, repo, pats, pycompat.byteskwargs(opts))
2516
2521
2517
2522
2518 @command(
2523 @command(
2519 b'debugcommands',
2524 b'debugcommands',
2520 [],
2525 [],
2521 _(b'[COMMAND]'),
2526 _(b'[COMMAND]'),
2522 helpcategory=command.CATEGORY_HELP,
2527 helpcategory=command.CATEGORY_HELP,
2523 norepo=True,
2528 norepo=True,
2524 )
2529 )
2525 def debugcommands(ui, cmd=b'', *args):
2530 def debugcommands(ui, cmd=b'', *args):
2526 """list all available commands and options"""
2531 """list all available commands and options"""
2527 for cmd, vals in sorted(table.items()):
2532 for cmd, vals in sorted(table.items()):
2528 cmd = cmd.split(b'|')[0]
2533 cmd = cmd.split(b'|')[0]
2529 opts = b', '.join([i[1] for i in vals[1]])
2534 opts = b', '.join([i[1] for i in vals[1]])
2530 ui.write(b'%s: %s\n' % (cmd, opts))
2535 ui.write(b'%s: %s\n' % (cmd, opts))
2531
2536
2532
2537
2533 @command(
2538 @command(
2534 b'debugcomplete',
2539 b'debugcomplete',
2535 [(b'o', b'options', None, _(b'show the command options'))],
2540 [(b'o', b'options', None, _(b'show the command options'))],
2536 _(b'[-o] CMD'),
2541 _(b'[-o] CMD'),
2537 helpcategory=command.CATEGORY_HELP,
2542 helpcategory=command.CATEGORY_HELP,
2538 norepo=True,
2543 norepo=True,
2539 )
2544 )
2540 def debugcomplete(ui, cmd=b'', **opts):
2545 def debugcomplete(ui, cmd=b'', **opts):
2541 """returns the completion list associated with the given command"""
2546 """returns the completion list associated with the given command"""
2542
2547
2543 if opts.get('options'):
2548 if opts.get('options'):
2544 options = []
2549 options = []
2545 otables = [globalopts]
2550 otables = [globalopts]
2546 if cmd:
2551 if cmd:
2547 aliases, entry = cmdutil.findcmd(cmd, table, False)
2552 aliases, entry = cmdutil.findcmd(cmd, table, False)
2548 otables.append(entry[1])
2553 otables.append(entry[1])
2549 for t in otables:
2554 for t in otables:
2550 for o in t:
2555 for o in t:
2551 if b"(DEPRECATED)" in o[3]:
2556 if b"(DEPRECATED)" in o[3]:
2552 continue
2557 continue
2553 if o[0]:
2558 if o[0]:
2554 options.append(b'-%s' % o[0])
2559 options.append(b'-%s' % o[0])
2555 options.append(b'--%s' % o[1])
2560 options.append(b'--%s' % o[1])
2556 ui.write(b"%s\n" % b"\n".join(options))
2561 ui.write(b"%s\n" % b"\n".join(options))
2557 return
2562 return
2558
2563
2559 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2564 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2560 if ui.verbose:
2565 if ui.verbose:
2561 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2566 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2562 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2567 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2563
2568
2564
2569
2565 @command(
2570 @command(
2566 b'diff',
2571 b'diff',
2567 [
2572 [
2568 (b'r', b'rev', [], _(b'revision (DEPRECATED)'), _(b'REV')),
2573 (b'r', b'rev', [], _(b'revision (DEPRECATED)'), _(b'REV')),
2569 (b'', b'from', b'', _(b'revision to diff from'), _(b'REV1')),
2574 (b'', b'from', b'', _(b'revision to diff from'), _(b'REV1')),
2570 (b'', b'to', b'', _(b'revision to diff to'), _(b'REV2')),
2575 (b'', b'to', b'', _(b'revision to diff to'), _(b'REV2')),
2571 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2576 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2572 ]
2577 ]
2573 + diffopts
2578 + diffopts
2574 + diffopts2
2579 + diffopts2
2575 + walkopts
2580 + walkopts
2576 + subrepoopts,
2581 + subrepoopts,
2577 _(b'[OPTION]... ([-c REV] | [--from REV1] [--to REV2]) [FILE]...'),
2582 _(b'[OPTION]... ([-c REV] | [--from REV1] [--to REV2]) [FILE]...'),
2578 helpcategory=command.CATEGORY_FILE_CONTENTS,
2583 helpcategory=command.CATEGORY_FILE_CONTENTS,
2579 helpbasic=True,
2584 helpbasic=True,
2580 inferrepo=True,
2585 inferrepo=True,
2581 intents={INTENT_READONLY},
2586 intents={INTENT_READONLY},
2582 )
2587 )
2583 def diff(ui, repo, *pats, **opts):
2588 def diff(ui, repo, *pats, **opts):
2584 """diff repository (or selected files)
2589 """diff repository (or selected files)
2585
2590
2586 Show differences between revisions for the specified files.
2591 Show differences between revisions for the specified files.
2587
2592
2588 Differences between files are shown using the unified diff format.
2593 Differences between files are shown using the unified diff format.
2589
2594
2590 .. note::
2595 .. note::
2591
2596
2592 :hg:`diff` may generate unexpected results for merges, as it will
2597 :hg:`diff` may generate unexpected results for merges, as it will
2593 default to comparing against the working directory's first
2598 default to comparing against the working directory's first
2594 parent changeset if no revisions are specified. To diff against the
2599 parent changeset if no revisions are specified. To diff against the
2595 conflict regions, you can use `--config diff.merge=yes`.
2600 conflict regions, you can use `--config diff.merge=yes`.
2596
2601
2597 By default, the working directory files are compared to its first parent. To
2602 By default, the working directory files are compared to its first parent. To
2598 see the differences from another revision, use --from. To see the difference
2603 see the differences from another revision, use --from. To see the difference
2599 to another revision, use --to. For example, :hg:`diff --from .^` will show
2604 to another revision, use --to. For example, :hg:`diff --from .^` will show
2600 the differences from the working copy's grandparent to the working copy,
2605 the differences from the working copy's grandparent to the working copy,
2601 :hg:`diff --to .` will show the diff from the working copy to its parent
2606 :hg:`diff --to .` will show the diff from the working copy to its parent
2602 (i.e. the reverse of the default), and :hg:`diff --from 1.0 --to 1.2` will
2607 (i.e. the reverse of the default), and :hg:`diff --from 1.0 --to 1.2` will
2603 show the diff between those two revisions.
2608 show the diff between those two revisions.
2604
2609
2605 Alternatively you can specify -c/--change with a revision to see the changes
2610 Alternatively you can specify -c/--change with a revision to see the changes
2606 in that changeset relative to its first parent (i.e. :hg:`diff -c 42` is
2611 in that changeset relative to its first parent (i.e. :hg:`diff -c 42` is
2607 equivalent to :hg:`diff --from 42^ --to 42`)
2612 equivalent to :hg:`diff --from 42^ --to 42`)
2608
2613
2609 Without the -a/--text option, diff will avoid generating diffs of
2614 Without the -a/--text option, diff will avoid generating diffs of
2610 files it detects as binary. With -a, diff will generate a diff
2615 files it detects as binary. With -a, diff will generate a diff
2611 anyway, probably with undesirable results.
2616 anyway, probably with undesirable results.
2612
2617
2613 Use the -g/--git option to generate diffs in the git extended diff
2618 Use the -g/--git option to generate diffs in the git extended diff
2614 format. For more information, read :hg:`help diffs`.
2619 format. For more information, read :hg:`help diffs`.
2615
2620
2616 .. container:: verbose
2621 .. container:: verbose
2617
2622
2618 Examples:
2623 Examples:
2619
2624
2620 - compare a file in the current working directory to its parent::
2625 - compare a file in the current working directory to its parent::
2621
2626
2622 hg diff foo.c
2627 hg diff foo.c
2623
2628
2624 - compare two historical versions of a directory, with rename info::
2629 - compare two historical versions of a directory, with rename info::
2625
2630
2626 hg diff --git --from 1.0 --to 1.2 lib/
2631 hg diff --git --from 1.0 --to 1.2 lib/
2627
2632
2628 - get change stats relative to the last change on some date::
2633 - get change stats relative to the last change on some date::
2629
2634
2630 hg diff --stat --from "date('may 2')"
2635 hg diff --stat --from "date('may 2')"
2631
2636
2632 - diff all newly-added files that contain a keyword::
2637 - diff all newly-added files that contain a keyword::
2633
2638
2634 hg diff "set:added() and grep(GNU)"
2639 hg diff "set:added() and grep(GNU)"
2635
2640
2636 - compare a revision and its parents::
2641 - compare a revision and its parents::
2637
2642
2638 hg diff -c 9353 # compare against first parent
2643 hg diff -c 9353 # compare against first parent
2639 hg diff --from 9353^ --to 9353 # same using revset syntax
2644 hg diff --from 9353^ --to 9353 # same using revset syntax
2640 hg diff --from 9353^2 --to 9353 # compare against the second parent
2645 hg diff --from 9353^2 --to 9353 # compare against the second parent
2641
2646
2642 Returns 0 on success.
2647 Returns 0 on success.
2643 """
2648 """
2644
2649
2645 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
2650 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
2646 opts = pycompat.byteskwargs(opts)
2651 opts = pycompat.byteskwargs(opts)
2647 revs = opts.get(b'rev')
2652 revs = opts.get(b'rev')
2648 change = opts.get(b'change')
2653 change = opts.get(b'change')
2649 from_rev = opts.get(b'from')
2654 from_rev = opts.get(b'from')
2650 to_rev = opts.get(b'to')
2655 to_rev = opts.get(b'to')
2651 stat = opts.get(b'stat')
2656 stat = opts.get(b'stat')
2652 reverse = opts.get(b'reverse')
2657 reverse = opts.get(b'reverse')
2653
2658
2654 cmdutil.check_incompatible_arguments(opts, b'from', [b'rev', b'change'])
2659 cmdutil.check_incompatible_arguments(opts, b'from', [b'rev', b'change'])
2655 cmdutil.check_incompatible_arguments(opts, b'to', [b'rev', b'change'])
2660 cmdutil.check_incompatible_arguments(opts, b'to', [b'rev', b'change'])
2656 if change:
2661 if change:
2657 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2662 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2658 ctx2 = logcmdutil.revsingle(repo, change, None)
2663 ctx2 = logcmdutil.revsingle(repo, change, None)
2659 ctx1 = diffutil.diff_parent(ctx2)
2664 ctx1 = diffutil.diff_parent(ctx2)
2660 elif from_rev or to_rev:
2665 elif from_rev or to_rev:
2661 repo = scmutil.unhidehashlikerevs(
2666 repo = scmutil.unhidehashlikerevs(
2662 repo, [from_rev] + [to_rev], b'nowarn'
2667 repo, [from_rev] + [to_rev], b'nowarn'
2663 )
2668 )
2664 ctx1 = logcmdutil.revsingle(repo, from_rev, None)
2669 ctx1 = logcmdutil.revsingle(repo, from_rev, None)
2665 ctx2 = logcmdutil.revsingle(repo, to_rev, None)
2670 ctx2 = logcmdutil.revsingle(repo, to_rev, None)
2666 else:
2671 else:
2667 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2672 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2668 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
2673 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
2669
2674
2670 if reverse:
2675 if reverse:
2671 ctxleft = ctx2
2676 ctxleft = ctx2
2672 ctxright = ctx1
2677 ctxright = ctx1
2673 else:
2678 else:
2674 ctxleft = ctx1
2679 ctxleft = ctx1
2675 ctxright = ctx2
2680 ctxright = ctx2
2676
2681
2677 diffopts = patch.diffallopts(ui, opts)
2682 diffopts = patch.diffallopts(ui, opts)
2678 m = scmutil.match(ctx2, pats, opts)
2683 m = scmutil.match(ctx2, pats, opts)
2679 m = repo.narrowmatch(m)
2684 m = repo.narrowmatch(m)
2680 ui.pager(b'diff')
2685 ui.pager(b'diff')
2681 logcmdutil.diffordiffstat(
2686 logcmdutil.diffordiffstat(
2682 ui,
2687 ui,
2683 repo,
2688 repo,
2684 diffopts,
2689 diffopts,
2685 ctxleft,
2690 ctxleft,
2686 ctxright,
2691 ctxright,
2687 m,
2692 m,
2688 stat=stat,
2693 stat=stat,
2689 listsubrepos=opts.get(b'subrepos'),
2694 listsubrepos=opts.get(b'subrepos'),
2690 root=opts.get(b'root'),
2695 root=opts.get(b'root'),
2691 )
2696 )
2692
2697
2693
2698
2694 @command(
2699 @command(
2695 b'export',
2700 b'export',
2696 [
2701 [
2697 (
2702 (
2698 b'B',
2703 b'B',
2699 b'bookmark',
2704 b'bookmark',
2700 b'',
2705 b'',
2701 _(b'export changes only reachable by given bookmark'),
2706 _(b'export changes only reachable by given bookmark'),
2702 _(b'BOOKMARK'),
2707 _(b'BOOKMARK'),
2703 ),
2708 ),
2704 (
2709 (
2705 b'o',
2710 b'o',
2706 b'output',
2711 b'output',
2707 b'',
2712 b'',
2708 _(b'print output to file with formatted name'),
2713 _(b'print output to file with formatted name'),
2709 _(b'FORMAT'),
2714 _(b'FORMAT'),
2710 ),
2715 ),
2711 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2716 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2712 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2717 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2713 ]
2718 ]
2714 + diffopts
2719 + diffopts
2715 + formatteropts,
2720 + formatteropts,
2716 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2721 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2717 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2722 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2718 helpbasic=True,
2723 helpbasic=True,
2719 intents={INTENT_READONLY},
2724 intents={INTENT_READONLY},
2720 )
2725 )
2721 def export(ui, repo, *changesets, **opts):
2726 def export(ui, repo, *changesets, **opts):
2722 """dump the header and diffs for one or more changesets
2727 """dump the header and diffs for one or more changesets
2723
2728
2724 Print the changeset header and diffs for one or more revisions.
2729 Print the changeset header and diffs for one or more revisions.
2725 If no revision is given, the parent of the working directory is used.
2730 If no revision is given, the parent of the working directory is used.
2726
2731
2727 The information shown in the changeset header is: author, date,
2732 The information shown in the changeset header is: author, date,
2728 branch name (if non-default), changeset hash, parent(s) and commit
2733 branch name (if non-default), changeset hash, parent(s) and commit
2729 comment.
2734 comment.
2730
2735
2731 .. note::
2736 .. note::
2732
2737
2733 :hg:`export` may generate unexpected diff output for merge
2738 :hg:`export` may generate unexpected diff output for merge
2734 changesets, as it will compare the merge changeset against its
2739 changesets, as it will compare the merge changeset against its
2735 first parent only.
2740 first parent only.
2736
2741
2737 Output may be to a file, in which case the name of the file is
2742 Output may be to a file, in which case the name of the file is
2738 given using a template string. See :hg:`help templates`. In addition
2743 given using a template string. See :hg:`help templates`. In addition
2739 to the common template keywords, the following formatting rules are
2744 to the common template keywords, the following formatting rules are
2740 supported:
2745 supported:
2741
2746
2742 :``%%``: literal "%" character
2747 :``%%``: literal "%" character
2743 :``%H``: changeset hash (40 hexadecimal digits)
2748 :``%H``: changeset hash (40 hexadecimal digits)
2744 :``%N``: number of patches being generated
2749 :``%N``: number of patches being generated
2745 :``%R``: changeset revision number
2750 :``%R``: changeset revision number
2746 :``%b``: basename of the exporting repository
2751 :``%b``: basename of the exporting repository
2747 :``%h``: short-form changeset hash (12 hexadecimal digits)
2752 :``%h``: short-form changeset hash (12 hexadecimal digits)
2748 :``%m``: first line of the commit message (only alphanumeric characters)
2753 :``%m``: first line of the commit message (only alphanumeric characters)
2749 :``%n``: zero-padded sequence number, starting at 1
2754 :``%n``: zero-padded sequence number, starting at 1
2750 :``%r``: zero-padded changeset revision number
2755 :``%r``: zero-padded changeset revision number
2751 :``\\``: literal "\\" character
2756 :``\\``: literal "\\" character
2752
2757
2753 Without the -a/--text option, export will avoid generating diffs
2758 Without the -a/--text option, export will avoid generating diffs
2754 of files it detects as binary. With -a, export will generate a
2759 of files it detects as binary. With -a, export will generate a
2755 diff anyway, probably with undesirable results.
2760 diff anyway, probably with undesirable results.
2756
2761
2757 With -B/--bookmark changesets reachable by the given bookmark are
2762 With -B/--bookmark changesets reachable by the given bookmark are
2758 selected.
2763 selected.
2759
2764
2760 Use the -g/--git option to generate diffs in the git extended diff
2765 Use the -g/--git option to generate diffs in the git extended diff
2761 format. See :hg:`help diffs` for more information.
2766 format. See :hg:`help diffs` for more information.
2762
2767
2763 With the --switch-parent option, the diff will be against the
2768 With the --switch-parent option, the diff will be against the
2764 second parent. It can be useful to review a merge.
2769 second parent. It can be useful to review a merge.
2765
2770
2766 .. container:: verbose
2771 .. container:: verbose
2767
2772
2768 Template:
2773 Template:
2769
2774
2770 The following keywords are supported in addition to the common template
2775 The following keywords are supported in addition to the common template
2771 keywords and functions. See also :hg:`help templates`.
2776 keywords and functions. See also :hg:`help templates`.
2772
2777
2773 :diff: String. Diff content.
2778 :diff: String. Diff content.
2774 :parents: List of strings. Parent nodes of the changeset.
2779 :parents: List of strings. Parent nodes of the changeset.
2775
2780
2776 Examples:
2781 Examples:
2777
2782
2778 - use export and import to transplant a bugfix to the current
2783 - use export and import to transplant a bugfix to the current
2779 branch::
2784 branch::
2780
2785
2781 hg export -r 9353 | hg import -
2786 hg export -r 9353 | hg import -
2782
2787
2783 - export all the changesets between two revisions to a file with
2788 - export all the changesets between two revisions to a file with
2784 rename information::
2789 rename information::
2785
2790
2786 hg export --git -r 123:150 > changes.txt
2791 hg export --git -r 123:150 > changes.txt
2787
2792
2788 - split outgoing changes into a series of patches with
2793 - split outgoing changes into a series of patches with
2789 descriptive names::
2794 descriptive names::
2790
2795
2791 hg export -r "outgoing()" -o "%n-%m.patch"
2796 hg export -r "outgoing()" -o "%n-%m.patch"
2792
2797
2793 Returns 0 on success.
2798 Returns 0 on success.
2794 """
2799 """
2795 opts = pycompat.byteskwargs(opts)
2800 opts = pycompat.byteskwargs(opts)
2796 bookmark = opts.get(b'bookmark')
2801 bookmark = opts.get(b'bookmark')
2797 changesets += tuple(opts.get(b'rev', []))
2802 changesets += tuple(opts.get(b'rev', []))
2798
2803
2799 cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
2804 cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
2800
2805
2801 if bookmark:
2806 if bookmark:
2802 if bookmark not in repo._bookmarks:
2807 if bookmark not in repo._bookmarks:
2803 raise error.InputError(_(b"bookmark '%s' not found") % bookmark)
2808 raise error.InputError(_(b"bookmark '%s' not found") % bookmark)
2804
2809
2805 revs = scmutil.bookmarkrevs(repo, bookmark)
2810 revs = scmutil.bookmarkrevs(repo, bookmark)
2806 else:
2811 else:
2807 if not changesets:
2812 if not changesets:
2808 changesets = [b'.']
2813 changesets = [b'.']
2809
2814
2810 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2815 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2811 revs = logcmdutil.revrange(repo, changesets)
2816 revs = logcmdutil.revrange(repo, changesets)
2812
2817
2813 if not revs:
2818 if not revs:
2814 raise error.InputError(_(b"export requires at least one changeset"))
2819 raise error.InputError(_(b"export requires at least one changeset"))
2815 if len(revs) > 1:
2820 if len(revs) > 1:
2816 ui.note(_(b'exporting patches:\n'))
2821 ui.note(_(b'exporting patches:\n'))
2817 else:
2822 else:
2818 ui.note(_(b'exporting patch:\n'))
2823 ui.note(_(b'exporting patch:\n'))
2819
2824
2820 fntemplate = opts.get(b'output')
2825 fntemplate = opts.get(b'output')
2821 if cmdutil.isstdiofilename(fntemplate):
2826 if cmdutil.isstdiofilename(fntemplate):
2822 fntemplate = b''
2827 fntemplate = b''
2823
2828
2824 if fntemplate:
2829 if fntemplate:
2825 fm = formatter.nullformatter(ui, b'export', opts)
2830 fm = formatter.nullformatter(ui, b'export', opts)
2826 else:
2831 else:
2827 ui.pager(b'export')
2832 ui.pager(b'export')
2828 fm = ui.formatter(b'export', opts)
2833 fm = ui.formatter(b'export', opts)
2829 with fm:
2834 with fm:
2830 cmdutil.export(
2835 cmdutil.export(
2831 repo,
2836 repo,
2832 revs,
2837 revs,
2833 fm,
2838 fm,
2834 fntemplate=fntemplate,
2839 fntemplate=fntemplate,
2835 switch_parent=opts.get(b'switch_parent'),
2840 switch_parent=opts.get(b'switch_parent'),
2836 opts=patch.diffallopts(ui, opts),
2841 opts=patch.diffallopts(ui, opts),
2837 )
2842 )
2838
2843
2839
2844
2840 @command(
2845 @command(
2841 b'files',
2846 b'files',
2842 [
2847 [
2843 (
2848 (
2844 b'r',
2849 b'r',
2845 b'rev',
2850 b'rev',
2846 b'',
2851 b'',
2847 _(b'search the repository as it is in REV'),
2852 _(b'search the repository as it is in REV'),
2848 _(b'REV'),
2853 _(b'REV'),
2849 ),
2854 ),
2850 (
2855 (
2851 b'0',
2856 b'0',
2852 b'print0',
2857 b'print0',
2853 None,
2858 None,
2854 _(b'end filenames with NUL, for use with xargs'),
2859 _(b'end filenames with NUL, for use with xargs'),
2855 ),
2860 ),
2856 ]
2861 ]
2857 + walkopts
2862 + walkopts
2858 + formatteropts
2863 + formatteropts
2859 + subrepoopts,
2864 + subrepoopts,
2860 _(b'[OPTION]... [FILE]...'),
2865 _(b'[OPTION]... [FILE]...'),
2861 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2866 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2862 intents={INTENT_READONLY},
2867 intents={INTENT_READONLY},
2863 )
2868 )
2864 def files(ui, repo, *pats, **opts):
2869 def files(ui, repo, *pats, **opts):
2865 """list tracked files
2870 """list tracked files
2866
2871
2867 Print files under Mercurial control in the working directory or
2872 Print files under Mercurial control in the working directory or
2868 specified revision for given files (excluding removed files).
2873 specified revision for given files (excluding removed files).
2869 Files can be specified as filenames or filesets.
2874 Files can be specified as filenames or filesets.
2870
2875
2871 If no files are given to match, this command prints the names
2876 If no files are given to match, this command prints the names
2872 of all files under Mercurial control.
2877 of all files under Mercurial control.
2873
2878
2874 .. container:: verbose
2879 .. container:: verbose
2875
2880
2876 Template:
2881 Template:
2877
2882
2878 The following keywords are supported in addition to the common template
2883 The following keywords are supported in addition to the common template
2879 keywords and functions. See also :hg:`help templates`.
2884 keywords and functions. See also :hg:`help templates`.
2880
2885
2881 :flags: String. Character denoting file's symlink and executable bits.
2886 :flags: String. Character denoting file's symlink and executable bits.
2882 :path: String. Repository-absolute path of the file.
2887 :path: String. Repository-absolute path of the file.
2883 :size: Integer. Size of the file in bytes.
2888 :size: Integer. Size of the file in bytes.
2884
2889
2885 Examples:
2890 Examples:
2886
2891
2887 - list all files under the current directory::
2892 - list all files under the current directory::
2888
2893
2889 hg files .
2894 hg files .
2890
2895
2891 - shows sizes and flags for current revision::
2896 - shows sizes and flags for current revision::
2892
2897
2893 hg files -vr .
2898 hg files -vr .
2894
2899
2895 - list all files named README::
2900 - list all files named README::
2896
2901
2897 hg files -I "**/README"
2902 hg files -I "**/README"
2898
2903
2899 - list all binary files::
2904 - list all binary files::
2900
2905
2901 hg files "set:binary()"
2906 hg files "set:binary()"
2902
2907
2903 - find files containing a regular expression::
2908 - find files containing a regular expression::
2904
2909
2905 hg files "set:grep('bob')"
2910 hg files "set:grep('bob')"
2906
2911
2907 - search tracked file contents with xargs and grep::
2912 - search tracked file contents with xargs and grep::
2908
2913
2909 hg files -0 | xargs -0 grep foo
2914 hg files -0 | xargs -0 grep foo
2910
2915
2911 See :hg:`help patterns` and :hg:`help filesets` for more information
2916 See :hg:`help patterns` and :hg:`help filesets` for more information
2912 on specifying file patterns.
2917 on specifying file patterns.
2913
2918
2914 Returns 0 if a match is found, 1 otherwise.
2919 Returns 0 if a match is found, 1 otherwise.
2915
2920
2916 """
2921 """
2917
2922
2918 opts = pycompat.byteskwargs(opts)
2923 opts = pycompat.byteskwargs(opts)
2919 rev = opts.get(b'rev')
2924 rev = opts.get(b'rev')
2920 if rev:
2925 if rev:
2921 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2926 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2922 ctx = logcmdutil.revsingle(repo, rev, None)
2927 ctx = logcmdutil.revsingle(repo, rev, None)
2923
2928
2924 end = b'\n'
2929 end = b'\n'
2925 if opts.get(b'print0'):
2930 if opts.get(b'print0'):
2926 end = b'\0'
2931 end = b'\0'
2927 fmt = b'%s' + end
2932 fmt = b'%s' + end
2928
2933
2929 m = scmutil.match(ctx, pats, opts)
2934 m = scmutil.match(ctx, pats, opts)
2930 ui.pager(b'files')
2935 ui.pager(b'files')
2931 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2936 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2932 with ui.formatter(b'files', opts) as fm:
2937 with ui.formatter(b'files', opts) as fm:
2933 return cmdutil.files(
2938 return cmdutil.files(
2934 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2939 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2935 )
2940 )
2936
2941
2937
2942
2938 @command(
2943 @command(
2939 b'forget',
2944 b'forget',
2940 [
2945 [
2941 (b'i', b'interactive', None, _(b'use interactive mode')),
2946 (b'i', b'interactive', None, _(b'use interactive mode')),
2942 ]
2947 ]
2943 + walkopts
2948 + walkopts
2944 + dryrunopts,
2949 + dryrunopts,
2945 _(b'[OPTION]... FILE...'),
2950 _(b'[OPTION]... FILE...'),
2946 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2951 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2947 helpbasic=True,
2952 helpbasic=True,
2948 inferrepo=True,
2953 inferrepo=True,
2949 )
2954 )
2950 def forget(ui, repo, *pats, **opts):
2955 def forget(ui, repo, *pats, **opts):
2951 """forget the specified files on the next commit
2956 """forget the specified files on the next commit
2952
2957
2953 Mark the specified files so they will no longer be tracked
2958 Mark the specified files so they will no longer be tracked
2954 after the next commit.
2959 after the next commit.
2955
2960
2956 This only removes files from the current branch, not from the
2961 This only removes files from the current branch, not from the
2957 entire project history, and it does not delete them from the
2962 entire project history, and it does not delete them from the
2958 working directory.
2963 working directory.
2959
2964
2960 To delete the file from the working directory, see :hg:`remove`.
2965 To delete the file from the working directory, see :hg:`remove`.
2961
2966
2962 To undo a forget before the next commit, see :hg:`add`.
2967 To undo a forget before the next commit, see :hg:`add`.
2963
2968
2964 .. container:: verbose
2969 .. container:: verbose
2965
2970
2966 Examples:
2971 Examples:
2967
2972
2968 - forget newly-added binary files::
2973 - forget newly-added binary files::
2969
2974
2970 hg forget "set:added() and binary()"
2975 hg forget "set:added() and binary()"
2971
2976
2972 - forget files that would be excluded by .hgignore::
2977 - forget files that would be excluded by .hgignore::
2973
2978
2974 hg forget "set:hgignore()"
2979 hg forget "set:hgignore()"
2975
2980
2976 Returns 0 on success.
2981 Returns 0 on success.
2977 """
2982 """
2978
2983
2979 if not pats:
2984 if not pats:
2980 raise error.InputError(_(b'no files specified'))
2985 raise error.InputError(_(b'no files specified'))
2981
2986
2982 with repo.wlock(), repo.dirstate.changing_files(repo):
2987 with repo.wlock(), repo.dirstate.changing_files(repo):
2983 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
2988 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
2984 dryrun, interactive = opts.get('dry_run'), opts.get('interactive')
2989 dryrun, interactive = opts.get('dry_run'), opts.get('interactive')
2985 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2990 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2986 rejected = cmdutil.forget(
2991 rejected = cmdutil.forget(
2987 ui,
2992 ui,
2988 repo,
2993 repo,
2989 m,
2994 m,
2990 prefix=b"",
2995 prefix=b"",
2991 uipathfn=uipathfn,
2996 uipathfn=uipathfn,
2992 explicitonly=False,
2997 explicitonly=False,
2993 dryrun=dryrun,
2998 dryrun=dryrun,
2994 interactive=interactive,
2999 interactive=interactive,
2995 )[0]
3000 )[0]
2996 return rejected and 1 or 0
3001 return rejected and 1 or 0
2997
3002
2998
3003
2999 @command(
3004 @command(
3000 b'graft',
3005 b'graft',
3001 [
3006 [
3002 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
3007 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
3003 (
3008 (
3004 b'',
3009 b'',
3005 b'base',
3010 b'base',
3006 b'',
3011 b'',
3007 _(b'base revision when doing the graft merge (ADVANCED)'),
3012 _(b'base revision when doing the graft merge (ADVANCED)'),
3008 _(b'REV'),
3013 _(b'REV'),
3009 ),
3014 ),
3010 (b'c', b'continue', False, _(b'resume interrupted graft')),
3015 (b'c', b'continue', False, _(b'resume interrupted graft')),
3011 (b'', b'stop', False, _(b'stop interrupted graft')),
3016 (b'', b'stop', False, _(b'stop interrupted graft')),
3012 (b'', b'abort', False, _(b'abort interrupted graft')),
3017 (b'', b'abort', False, _(b'abort interrupted graft')),
3013 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
3018 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
3014 (b'', b'log', None, _(b'append graft info to log message')),
3019 (b'', b'log', None, _(b'append graft info to log message')),
3015 (
3020 (
3016 b'',
3021 b'',
3017 b'no-commit',
3022 b'no-commit',
3018 None,
3023 None,
3019 _(b"don't commit, just apply the changes in working directory"),
3024 _(b"don't commit, just apply the changes in working directory"),
3020 ),
3025 ),
3021 (b'f', b'force', False, _(b'force graft')),
3026 (b'f', b'force', False, _(b'force graft')),
3022 (
3027 (
3023 b'D',
3028 b'D',
3024 b'currentdate',
3029 b'currentdate',
3025 False,
3030 False,
3026 _(b'record the current date as commit date'),
3031 _(b'record the current date as commit date'),
3027 ),
3032 ),
3028 (
3033 (
3029 b'U',
3034 b'U',
3030 b'currentuser',
3035 b'currentuser',
3031 False,
3036 False,
3032 _(b'record the current user as committer'),
3037 _(b'record the current user as committer'),
3033 ),
3038 ),
3034 ]
3039 ]
3035 + commitopts2
3040 + commitopts2
3036 + mergetoolopts
3041 + mergetoolopts
3037 + dryrunopts,
3042 + dryrunopts,
3038 _(b'[OPTION]... [-r REV]... REV...'),
3043 _(b'[OPTION]... [-r REV]... REV...'),
3039 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
3044 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
3040 )
3045 )
3041 def graft(ui, repo, *revs, **opts):
3046 def graft(ui, repo, *revs, **opts):
3042 """copy changes from other branches onto the current branch
3047 """copy changes from other branches onto the current branch
3043
3048
3044 This command uses Mercurial's merge logic to copy individual
3049 This command uses Mercurial's merge logic to copy individual
3045 changes from other branches without merging branches in the
3050 changes from other branches without merging branches in the
3046 history graph. This is sometimes known as 'backporting' or
3051 history graph. This is sometimes known as 'backporting' or
3047 'cherry-picking'. By default, graft will copy user, date, and
3052 'cherry-picking'. By default, graft will copy user, date, and
3048 description from the source changesets.
3053 description from the source changesets.
3049
3054
3050 Changesets that are ancestors of the current revision, that have
3055 Changesets that are ancestors of the current revision, that have
3051 already been grafted, or that are merges will be skipped.
3056 already been grafted, or that are merges will be skipped.
3052
3057
3053 If --log is specified, log messages will have a comment appended
3058 If --log is specified, log messages will have a comment appended
3054 of the form::
3059 of the form::
3055
3060
3056 (grafted from CHANGESETHASH)
3061 (grafted from CHANGESETHASH)
3057
3062
3058 If --force is specified, revisions will be grafted even if they
3063 If --force is specified, revisions will be grafted even if they
3059 are already ancestors of, or have been grafted to, the destination.
3064 are already ancestors of, or have been grafted to, the destination.
3060 This is useful when the revisions have since been backed out.
3065 This is useful when the revisions have since been backed out.
3061
3066
3062 If a graft merge results in conflicts, the graft process is
3067 If a graft merge results in conflicts, the graft process is
3063 interrupted so that the current merge can be manually resolved.
3068 interrupted so that the current merge can be manually resolved.
3064 Once all conflicts are addressed, the graft process can be
3069 Once all conflicts are addressed, the graft process can be
3065 continued with the -c/--continue option.
3070 continued with the -c/--continue option.
3066
3071
3067 The -c/--continue option reapplies all the earlier options.
3072 The -c/--continue option reapplies all the earlier options.
3068
3073
3069 .. container:: verbose
3074 .. container:: verbose
3070
3075
3071 The --base option exposes more of how graft internally uses merge with a
3076 The --base option exposes more of how graft internally uses merge with a
3072 custom base revision. --base can be used to specify another ancestor than
3077 custom base revision. --base can be used to specify another ancestor than
3073 the first and only parent.
3078 the first and only parent.
3074
3079
3075 The command::
3080 The command::
3076
3081
3077 hg graft -r 345 --base 234
3082 hg graft -r 345 --base 234
3078
3083
3079 is thus pretty much the same as::
3084 is thus pretty much the same as::
3080
3085
3081 hg diff --from 234 --to 345 | hg import
3086 hg diff --from 234 --to 345 | hg import
3082
3087
3083 but using merge to resolve conflicts and track moved files.
3088 but using merge to resolve conflicts and track moved files.
3084
3089
3085 The result of a merge can thus be backported as a single commit by
3090 The result of a merge can thus be backported as a single commit by
3086 specifying one of the merge parents as base, and thus effectively
3091 specifying one of the merge parents as base, and thus effectively
3087 grafting the changes from the other side.
3092 grafting the changes from the other side.
3088
3093
3089 It is also possible to collapse multiple changesets and clean up history
3094 It is also possible to collapse multiple changesets and clean up history
3090 by specifying another ancestor as base, much like rebase --collapse
3095 by specifying another ancestor as base, much like rebase --collapse
3091 --keep.
3096 --keep.
3092
3097
3093 The commit message can be tweaked after the fact using commit --amend .
3098 The commit message can be tweaked after the fact using commit --amend .
3094
3099
3095 For using non-ancestors as the base to backout changes, see the backout
3100 For using non-ancestors as the base to backout changes, see the backout
3096 command and the hidden --parent option.
3101 command and the hidden --parent option.
3097
3102
3098 .. container:: verbose
3103 .. container:: verbose
3099
3104
3100 Examples:
3105 Examples:
3101
3106
3102 - copy a single change to the stable branch and edit its description::
3107 - copy a single change to the stable branch and edit its description::
3103
3108
3104 hg update stable
3109 hg update stable
3105 hg graft --edit 9393
3110 hg graft --edit 9393
3106
3111
3107 - graft a range of changesets with one exception, updating dates::
3112 - graft a range of changesets with one exception, updating dates::
3108
3113
3109 hg graft -D "2085::2093 and not 2091"
3114 hg graft -D "2085::2093 and not 2091"
3110
3115
3111 - continue a graft after resolving conflicts::
3116 - continue a graft after resolving conflicts::
3112
3117
3113 hg graft -c
3118 hg graft -c
3114
3119
3115 - show the source of a grafted changeset::
3120 - show the source of a grafted changeset::
3116
3121
3117 hg log --debug -r .
3122 hg log --debug -r .
3118
3123
3119 - show revisions sorted by date::
3124 - show revisions sorted by date::
3120
3125
3121 hg log -r "sort(all(), date)"
3126 hg log -r "sort(all(), date)"
3122
3127
3123 - backport the result of a merge as a single commit::
3128 - backport the result of a merge as a single commit::
3124
3129
3125 hg graft -r 123 --base 123^
3130 hg graft -r 123 --base 123^
3126
3131
3127 - land a feature branch as one changeset::
3132 - land a feature branch as one changeset::
3128
3133
3129 hg up -cr default
3134 hg up -cr default
3130 hg graft -r featureX --base "ancestor('featureX', 'default')"
3135 hg graft -r featureX --base "ancestor('featureX', 'default')"
3131
3136
3132 See :hg:`help revisions` for more about specifying revisions.
3137 See :hg:`help revisions` for more about specifying revisions.
3133
3138
3134 Returns 0 on successful completion, 1 if there are unresolved files.
3139 Returns 0 on successful completion, 1 if there are unresolved files.
3135 """
3140 """
3136 with repo.wlock():
3141 with repo.wlock():
3137 return _dograft(ui, repo, *revs, **opts)
3142 return _dograft(ui, repo, *revs, **opts)
3138
3143
3139
3144
3140 def _dograft(ui, repo, *revs, **opts):
3145 def _dograft(ui, repo, *revs, **opts):
3141 if revs and opts.get('rev'):
3146 if revs and opts.get('rev'):
3142 ui.warn(
3147 ui.warn(
3143 _(
3148 _(
3144 b'warning: inconsistent use of --rev might give unexpected '
3149 b'warning: inconsistent use of --rev might give unexpected '
3145 b'revision ordering!\n'
3150 b'revision ordering!\n'
3146 )
3151 )
3147 )
3152 )
3148
3153
3149 revs = list(revs)
3154 revs = list(revs)
3150 revs.extend(opts.get('rev'))
3155 revs.extend(opts.get('rev'))
3151 # a dict of data to be stored in state file
3156 # a dict of data to be stored in state file
3152 statedata = {}
3157 statedata = {}
3153 # list of new nodes created by ongoing graft
3158 # list of new nodes created by ongoing graft
3154 statedata[b'newnodes'] = []
3159 statedata[b'newnodes'] = []
3155
3160
3156 cmdutil.resolve_commit_options(ui, opts)
3161 cmdutil.resolve_commit_options(ui, opts)
3157
3162
3158 editor = cmdutil.getcommiteditor(editform=b'graft', **opts)
3163 editor = cmdutil.getcommiteditor(editform=b'graft', **opts)
3159
3164
3160 cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
3165 cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
3161
3166
3162 cont = False
3167 cont = False
3163 if opts.get('no_commit'):
3168 if opts.get('no_commit'):
3164 cmdutil.check_incompatible_arguments(
3169 cmdutil.check_incompatible_arguments(
3165 opts,
3170 opts,
3166 'no_commit',
3171 'no_commit',
3167 ['edit', 'currentuser', 'currentdate', 'log'],
3172 ['edit', 'currentuser', 'currentdate', 'log'],
3168 )
3173 )
3169
3174
3170 graftstate = statemod.cmdstate(repo, b'graftstate')
3175 graftstate = statemod.cmdstate(repo, b'graftstate')
3171
3176
3172 if opts.get('stop'):
3177 if opts.get('stop'):
3173 cmdutil.check_incompatible_arguments(
3178 cmdutil.check_incompatible_arguments(
3174 opts,
3179 opts,
3175 'stop',
3180 'stop',
3176 [
3181 [
3177 'edit',
3182 'edit',
3178 'log',
3183 'log',
3179 'user',
3184 'user',
3180 'date',
3185 'date',
3181 'currentdate',
3186 'currentdate',
3182 'currentuser',
3187 'currentuser',
3183 'rev',
3188 'rev',
3184 ],
3189 ],
3185 )
3190 )
3186 return _stopgraft(ui, repo, graftstate)
3191 return _stopgraft(ui, repo, graftstate)
3187 elif opts.get('abort'):
3192 elif opts.get('abort'):
3188 cmdutil.check_incompatible_arguments(
3193 cmdutil.check_incompatible_arguments(
3189 opts,
3194 opts,
3190 'abort',
3195 'abort',
3191 [
3196 [
3192 'edit',
3197 'edit',
3193 'log',
3198 'log',
3194 'user',
3199 'user',
3195 'date',
3200 'date',
3196 'currentdate',
3201 'currentdate',
3197 'currentuser',
3202 'currentuser',
3198 'rev',
3203 'rev',
3199 ],
3204 ],
3200 )
3205 )
3201 return cmdutil.abortgraft(ui, repo, graftstate)
3206 return cmdutil.abortgraft(ui, repo, graftstate)
3202 elif opts.get('continue'):
3207 elif opts.get('continue'):
3203 cont = True
3208 cont = True
3204 if revs:
3209 if revs:
3205 raise error.InputError(_(b"can't specify --continue and revisions"))
3210 raise error.InputError(_(b"can't specify --continue and revisions"))
3206 # read in unfinished revisions
3211 # read in unfinished revisions
3207 if graftstate.exists():
3212 if graftstate.exists():
3208 statedata = cmdutil.readgraftstate(repo, graftstate)
3213 statedata = cmdutil.readgraftstate(repo, graftstate)
3209 if statedata.get(b'date'):
3214 if statedata.get(b'date'):
3210 opts['date'] = statedata[b'date']
3215 opts['date'] = statedata[b'date']
3211 if statedata.get(b'user'):
3216 if statedata.get(b'user'):
3212 opts['user'] = statedata[b'user']
3217 opts['user'] = statedata[b'user']
3213 if statedata.get(b'log'):
3218 if statedata.get(b'log'):
3214 opts['log'] = True
3219 opts['log'] = True
3215 if statedata.get(b'no_commit'):
3220 if statedata.get(b'no_commit'):
3216 opts['no_commit'] = statedata.get(b'no_commit')
3221 opts['no_commit'] = statedata.get(b'no_commit')
3217 if statedata.get(b'base'):
3222 if statedata.get(b'base'):
3218 opts['base'] = statedata.get(b'base')
3223 opts['base'] = statedata.get(b'base')
3219 nodes = statedata[b'nodes']
3224 nodes = statedata[b'nodes']
3220 revs = [repo[node].rev() for node in nodes]
3225 revs = [repo[node].rev() for node in nodes]
3221 else:
3226 else:
3222 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3227 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3223 else:
3228 else:
3224 if not revs:
3229 if not revs:
3225 raise error.InputError(_(b'no revisions specified'))
3230 raise error.InputError(_(b'no revisions specified'))
3226 cmdutil.checkunfinished(repo)
3231 cmdutil.checkunfinished(repo)
3227 cmdutil.bailifchanged(repo)
3232 cmdutil.bailifchanged(repo)
3228 revs = logcmdutil.revrange(repo, revs)
3233 revs = logcmdutil.revrange(repo, revs)
3229
3234
3230 skipped = set()
3235 skipped = set()
3231 basectx = None
3236 basectx = None
3232 if opts.get('base'):
3237 if opts.get('base'):
3233 basectx = logcmdutil.revsingle(repo, opts['base'], None)
3238 basectx = logcmdutil.revsingle(repo, opts['base'], None)
3234 if basectx is None:
3239 if basectx is None:
3235 # check for merges
3240 # check for merges
3236 for rev in repo.revs(b'%ld and merge()', revs):
3241 for rev in repo.revs(b'%ld and merge()', revs):
3237 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3242 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3238 skipped.add(rev)
3243 skipped.add(rev)
3239 revs = [r for r in revs if r not in skipped]
3244 revs = [r for r in revs if r not in skipped]
3240 if not revs:
3245 if not revs:
3241 return -1
3246 return -1
3242 if basectx is not None and len(revs) != 1:
3247 if basectx is not None and len(revs) != 1:
3243 raise error.InputError(_(b'only one revision allowed with --base '))
3248 raise error.InputError(_(b'only one revision allowed with --base '))
3244
3249
3245 # Don't check in the --continue case, in effect retaining --force across
3250 # Don't check in the --continue case, in effect retaining --force across
3246 # --continues. That's because without --force, any revisions we decided to
3251 # --continues. That's because without --force, any revisions we decided to
3247 # skip would have been filtered out here, so they wouldn't have made their
3252 # skip would have been filtered out here, so they wouldn't have made their
3248 # way to the graftstate. With --force, any revisions we would have otherwise
3253 # way to the graftstate. With --force, any revisions we would have otherwise
3249 # skipped would not have been filtered out, and if they hadn't been applied
3254 # skipped would not have been filtered out, and if they hadn't been applied
3250 # already, they'd have been in the graftstate.
3255 # already, they'd have been in the graftstate.
3251 if not (cont or opts.get('force')) and basectx is None:
3256 if not (cont or opts.get('force')) and basectx is None:
3252 # check for ancestors of dest branch
3257 # check for ancestors of dest branch
3253 ancestors = repo.revs(b'%ld & (::.)', revs)
3258 ancestors = repo.revs(b'%ld & (::.)', revs)
3254 for rev in ancestors:
3259 for rev in ancestors:
3255 ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
3260 ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
3256
3261
3257 revs = [r for r in revs if r not in ancestors]
3262 revs = [r for r in revs if r not in ancestors]
3258
3263
3259 if not revs:
3264 if not revs:
3260 return -1
3265 return -1
3261
3266
3262 # analyze revs for earlier grafts
3267 # analyze revs for earlier grafts
3263 ids = {}
3268 ids = {}
3264 for ctx in repo.set(b"%ld", revs):
3269 for ctx in repo.set(b"%ld", revs):
3265 ids[ctx.hex()] = ctx.rev()
3270 ids[ctx.hex()] = ctx.rev()
3266 n = ctx.extra().get(b'source')
3271 n = ctx.extra().get(b'source')
3267 if n:
3272 if n:
3268 ids[n] = ctx.rev()
3273 ids[n] = ctx.rev()
3269
3274
3270 # check ancestors for earlier grafts
3275 # check ancestors for earlier grafts
3271 ui.debug(b'scanning for duplicate grafts\n')
3276 ui.debug(b'scanning for duplicate grafts\n')
3272
3277
3273 # The only changesets we can be sure doesn't contain grafts of any
3278 # The only changesets we can be sure doesn't contain grafts of any
3274 # revs, are the ones that are common ancestors of *all* revs:
3279 # revs, are the ones that are common ancestors of *all* revs:
3275 for rev in repo.revs(b'only(%d,ancestor(%ld))', repo[b'.'].rev(), revs):
3280 for rev in repo.revs(b'only(%d,ancestor(%ld))', repo[b'.'].rev(), revs):
3276 ctx = repo[rev]
3281 ctx = repo[rev]
3277 n = ctx.extra().get(b'source')
3282 n = ctx.extra().get(b'source')
3278 if n in ids:
3283 if n in ids:
3279 try:
3284 try:
3280 r = repo[n].rev()
3285 r = repo[n].rev()
3281 except error.RepoLookupError:
3286 except error.RepoLookupError:
3282 r = None
3287 r = None
3283 if r in revs:
3288 if r in revs:
3284 ui.warn(
3289 ui.warn(
3285 _(
3290 _(
3286 b'skipping revision %d:%s '
3291 b'skipping revision %d:%s '
3287 b'(already grafted to %d:%s)\n'
3292 b'(already grafted to %d:%s)\n'
3288 )
3293 )
3289 % (r, repo[r], rev, ctx)
3294 % (r, repo[r], rev, ctx)
3290 )
3295 )
3291 revs.remove(r)
3296 revs.remove(r)
3292 elif ids[n] in revs:
3297 elif ids[n] in revs:
3293 if r is None:
3298 if r is None:
3294 ui.warn(
3299 ui.warn(
3295 _(
3300 _(
3296 b'skipping already grafted revision %d:%s '
3301 b'skipping already grafted revision %d:%s '
3297 b'(%d:%s also has unknown origin %s)\n'
3302 b'(%d:%s also has unknown origin %s)\n'
3298 )
3303 )
3299 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3304 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3300 )
3305 )
3301 else:
3306 else:
3302 ui.warn(
3307 ui.warn(
3303 _(
3308 _(
3304 b'skipping already grafted revision %d:%s '
3309 b'skipping already grafted revision %d:%s '
3305 b'(%d:%s also has origin %d:%s)\n'
3310 b'(%d:%s also has origin %d:%s)\n'
3306 )
3311 )
3307 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3312 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3308 )
3313 )
3309 revs.remove(ids[n])
3314 revs.remove(ids[n])
3310 elif ctx.hex() in ids:
3315 elif ctx.hex() in ids:
3311 r = ids[ctx.hex()]
3316 r = ids[ctx.hex()]
3312 if r in revs:
3317 if r in revs:
3313 ui.warn(
3318 ui.warn(
3314 _(
3319 _(
3315 b'skipping already grafted revision %d:%s '
3320 b'skipping already grafted revision %d:%s '
3316 b'(was grafted from %d:%s)\n'
3321 b'(was grafted from %d:%s)\n'
3317 )
3322 )
3318 % (r, repo[r], rev, ctx)
3323 % (r, repo[r], rev, ctx)
3319 )
3324 )
3320 revs.remove(r)
3325 revs.remove(r)
3321 if not revs:
3326 if not revs:
3322 return -1
3327 return -1
3323
3328
3324 if opts.get('no_commit'):
3329 if opts.get('no_commit'):
3325 statedata[b'no_commit'] = True
3330 statedata[b'no_commit'] = True
3326 if opts.get('base'):
3331 if opts.get('base'):
3327 statedata[b'base'] = opts['base']
3332 statedata[b'base'] = opts['base']
3328 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3333 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3329 desc = b'%d:%s "%s"' % (
3334 desc = b'%d:%s "%s"' % (
3330 ctx.rev(),
3335 ctx.rev(),
3331 ctx,
3336 ctx,
3332 ctx.description().split(b'\n', 1)[0],
3337 ctx.description().split(b'\n', 1)[0],
3333 )
3338 )
3334 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3339 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3335 if names:
3340 if names:
3336 desc += b' (%s)' % b' '.join(names)
3341 desc += b' (%s)' % b' '.join(names)
3337 ui.status(_(b'grafting %s\n') % desc)
3342 ui.status(_(b'grafting %s\n') % desc)
3338 if opts.get('dry_run'):
3343 if opts.get('dry_run'):
3339 continue
3344 continue
3340
3345
3341 source = ctx.extra().get(b'source')
3346 source = ctx.extra().get(b'source')
3342 extra = {}
3347 extra = {}
3343 if source:
3348 if source:
3344 extra[b'source'] = source
3349 extra[b'source'] = source
3345 extra[b'intermediate-source'] = ctx.hex()
3350 extra[b'intermediate-source'] = ctx.hex()
3346 else:
3351 else:
3347 extra[b'source'] = ctx.hex()
3352 extra[b'source'] = ctx.hex()
3348 user = ctx.user()
3353 user = ctx.user()
3349 if opts.get('user'):
3354 if opts.get('user'):
3350 user = opts['user']
3355 user = opts['user']
3351 statedata[b'user'] = user
3356 statedata[b'user'] = user
3352 date = ctx.date()
3357 date = ctx.date()
3353 if opts.get('date'):
3358 if opts.get('date'):
3354 date = opts['date']
3359 date = opts['date']
3355 statedata[b'date'] = date
3360 statedata[b'date'] = date
3356 message = ctx.description()
3361 message = ctx.description()
3357 if opts.get('log'):
3362 if opts.get('log'):
3358 message += b'\n(grafted from %s)' % ctx.hex()
3363 message += b'\n(grafted from %s)' % ctx.hex()
3359 statedata[b'log'] = True
3364 statedata[b'log'] = True
3360
3365
3361 # we don't merge the first commit when continuing
3366 # we don't merge the first commit when continuing
3362 if not cont:
3367 if not cont:
3363 # perform the graft merge with p1(rev) as 'ancestor'
3368 # perform the graft merge with p1(rev) as 'ancestor'
3364 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
3369 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
3365 base = ctx.p1() if basectx is None else basectx
3370 base = ctx.p1() if basectx is None else basectx
3366 with ui.configoverride(overrides, b'graft'):
3371 with ui.configoverride(overrides, b'graft'):
3367 stats = mergemod.graft(
3372 stats = mergemod.graft(
3368 repo, ctx, base, [b'local', b'graft', b'parent of graft']
3373 repo, ctx, base, [b'local', b'graft', b'parent of graft']
3369 )
3374 )
3370 # report any conflicts
3375 # report any conflicts
3371 if stats.unresolvedcount > 0:
3376 if stats.unresolvedcount > 0:
3372 # write out state for --continue
3377 # write out state for --continue
3373 nodes = [repo[rev].hex() for rev in revs[pos:]]
3378 nodes = [repo[rev].hex() for rev in revs[pos:]]
3374 statedata[b'nodes'] = nodes
3379 statedata[b'nodes'] = nodes
3375 stateversion = 1
3380 stateversion = 1
3376 graftstate.save(stateversion, statedata)
3381 graftstate.save(stateversion, statedata)
3377 ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
3382 ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
3378 ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
3383 ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
3379 return 1
3384 return 1
3380 else:
3385 else:
3381 cont = False
3386 cont = False
3382
3387
3383 # commit if --no-commit is false
3388 # commit if --no-commit is false
3384 if not opts.get('no_commit'):
3389 if not opts.get('no_commit'):
3385 node = repo.commit(
3390 node = repo.commit(
3386 text=message, user=user, date=date, extra=extra, editor=editor
3391 text=message, user=user, date=date, extra=extra, editor=editor
3387 )
3392 )
3388 if node is None:
3393 if node is None:
3389 ui.warn(
3394 ui.warn(
3390 _(b'note: graft of %d:%s created no changes to commit\n')
3395 _(b'note: graft of %d:%s created no changes to commit\n')
3391 % (ctx.rev(), ctx)
3396 % (ctx.rev(), ctx)
3392 )
3397 )
3393 # checking that newnodes exist because old state files won't have it
3398 # checking that newnodes exist because old state files won't have it
3394 elif statedata.get(b'newnodes') is not None:
3399 elif statedata.get(b'newnodes') is not None:
3395 nn = statedata[b'newnodes']
3400 nn = statedata[b'newnodes']
3396 assert isinstance(nn, list) # list of bytes
3401 assert isinstance(nn, list) # list of bytes
3397 nn.append(node)
3402 nn.append(node)
3398
3403
3399 # remove state when we complete successfully
3404 # remove state when we complete successfully
3400 if not opts.get('dry_run'):
3405 if not opts.get('dry_run'):
3401 graftstate.delete()
3406 graftstate.delete()
3402
3407
3403 return 0
3408 return 0
3404
3409
3405
3410
3406 def _stopgraft(ui, repo, graftstate):
3411 def _stopgraft(ui, repo, graftstate):
3407 """stop the interrupted graft"""
3412 """stop the interrupted graft"""
3408 if not graftstate.exists():
3413 if not graftstate.exists():
3409 raise error.StateError(_(b"no interrupted graft found"))
3414 raise error.StateError(_(b"no interrupted graft found"))
3410 pctx = repo[b'.']
3415 pctx = repo[b'.']
3411 mergemod.clean_update(pctx)
3416 mergemod.clean_update(pctx)
3412 graftstate.delete()
3417 graftstate.delete()
3413 ui.status(_(b"stopped the interrupted graft\n"))
3418 ui.status(_(b"stopped the interrupted graft\n"))
3414 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3419 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3415 return 0
3420 return 0
3416
3421
3417
3422
3418 statemod.addunfinished(
3423 statemod.addunfinished(
3419 b'graft',
3424 b'graft',
3420 fname=b'graftstate',
3425 fname=b'graftstate',
3421 clearable=True,
3426 clearable=True,
3422 stopflag=True,
3427 stopflag=True,
3423 continueflag=True,
3428 continueflag=True,
3424 abortfunc=cmdutil.hgabortgraft,
3429 abortfunc=cmdutil.hgabortgraft,
3425 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3430 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3426 )
3431 )
3427
3432
3428
3433
3429 @command(
3434 @command(
3430 b'grep',
3435 b'grep',
3431 [
3436 [
3432 (b'0', b'print0', None, _(b'end fields with NUL')),
3437 (b'0', b'print0', None, _(b'end fields with NUL')),
3433 (b'', b'all', None, _(b'an alias to --diff (DEPRECATED)')),
3438 (b'', b'all', None, _(b'an alias to --diff (DEPRECATED)')),
3434 (
3439 (
3435 b'',
3440 b'',
3436 b'diff',
3441 b'diff',
3437 None,
3442 None,
3438 _(
3443 _(
3439 b'search revision differences for when the pattern was added '
3444 b'search revision differences for when the pattern was added '
3440 b'or removed'
3445 b'or removed'
3441 ),
3446 ),
3442 ),
3447 ),
3443 (b'a', b'text', None, _(b'treat all files as text')),
3448 (b'a', b'text', None, _(b'treat all files as text')),
3444 (
3449 (
3445 b'f',
3450 b'f',
3446 b'follow',
3451 b'follow',
3447 None,
3452 None,
3448 _(
3453 _(
3449 b'follow changeset history,'
3454 b'follow changeset history,'
3450 b' or file history across copies and renames'
3455 b' or file history across copies and renames'
3451 ),
3456 ),
3452 ),
3457 ),
3453 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3458 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3454 (
3459 (
3455 b'l',
3460 b'l',
3456 b'files-with-matches',
3461 b'files-with-matches',
3457 None,
3462 None,
3458 _(b'print only filenames and revisions that match'),
3463 _(b'print only filenames and revisions that match'),
3459 ),
3464 ),
3460 (b'n', b'line-number', None, _(b'print matching line numbers')),
3465 (b'n', b'line-number', None, _(b'print matching line numbers')),
3461 (
3466 (
3462 b'r',
3467 b'r',
3463 b'rev',
3468 b'rev',
3464 [],
3469 [],
3465 _(b'search files changed within revision range'),
3470 _(b'search files changed within revision range'),
3466 _(b'REV'),
3471 _(b'REV'),
3467 ),
3472 ),
3468 (
3473 (
3469 b'',
3474 b'',
3470 b'all-files',
3475 b'all-files',
3471 None,
3476 None,
3472 _(
3477 _(
3473 b'include all files in the changeset while grepping (DEPRECATED)'
3478 b'include all files in the changeset while grepping (DEPRECATED)'
3474 ),
3479 ),
3475 ),
3480 ),
3476 (b'u', b'user', None, _(b'list the author (long with -v)')),
3481 (b'u', b'user', None, _(b'list the author (long with -v)')),
3477 (b'd', b'date', None, _(b'list the date (short with -q)')),
3482 (b'd', b'date', None, _(b'list the date (short with -q)')),
3478 ]
3483 ]
3479 + formatteropts
3484 + formatteropts
3480 + walkopts,
3485 + walkopts,
3481 _(b'[--diff] [OPTION]... PATTERN [FILE]...'),
3486 _(b'[--diff] [OPTION]... PATTERN [FILE]...'),
3482 helpcategory=command.CATEGORY_FILE_CONTENTS,
3487 helpcategory=command.CATEGORY_FILE_CONTENTS,
3483 inferrepo=True,
3488 inferrepo=True,
3484 intents={INTENT_READONLY},
3489 intents={INTENT_READONLY},
3485 )
3490 )
3486 def grep(ui, repo, pattern, *pats, **opts):
3491 def grep(ui, repo, pattern, *pats, **opts):
3487 """search for a pattern in specified files
3492 """search for a pattern in specified files
3488
3493
3489 Search the working directory or revision history for a regular
3494 Search the working directory or revision history for a regular
3490 expression in the specified files for the entire repository.
3495 expression in the specified files for the entire repository.
3491
3496
3492 By default, grep searches the repository files in the working
3497 By default, grep searches the repository files in the working
3493 directory and prints the files where it finds a match. To specify
3498 directory and prints the files where it finds a match. To specify
3494 historical revisions instead of the working directory, use the
3499 historical revisions instead of the working directory, use the
3495 --rev flag.
3500 --rev flag.
3496
3501
3497 To search instead historical revision differences that contains a
3502 To search instead historical revision differences that contains a
3498 change in match status ("-" for a match that becomes a non-match,
3503 change in match status ("-" for a match that becomes a non-match,
3499 or "+" for a non-match that becomes a match), use the --diff flag.
3504 or "+" for a non-match that becomes a match), use the --diff flag.
3500
3505
3501 PATTERN can be any Python (roughly Perl-compatible) regular
3506 PATTERN can be any Python (roughly Perl-compatible) regular
3502 expression.
3507 expression.
3503
3508
3504 If no FILEs are specified and the --rev flag isn't supplied, all
3509 If no FILEs are specified and the --rev flag isn't supplied, all
3505 files in the working directory are searched. When using the --rev
3510 files in the working directory are searched. When using the --rev
3506 flag and specifying FILEs, use the --follow argument to also
3511 flag and specifying FILEs, use the --follow argument to also
3507 follow the specified FILEs across renames and copies.
3512 follow the specified FILEs across renames and copies.
3508
3513
3509 .. container:: verbose
3514 .. container:: verbose
3510
3515
3511 Template:
3516 Template:
3512
3517
3513 The following keywords are supported in addition to the common template
3518 The following keywords are supported in addition to the common template
3514 keywords and functions. See also :hg:`help templates`.
3519 keywords and functions. See also :hg:`help templates`.
3515
3520
3516 :change: String. Character denoting insertion ``+`` or removal ``-``.
3521 :change: String. Character denoting insertion ``+`` or removal ``-``.
3517 Available if ``--diff`` is specified.
3522 Available if ``--diff`` is specified.
3518 :lineno: Integer. Line number of the match.
3523 :lineno: Integer. Line number of the match.
3519 :path: String. Repository-absolute path of the file.
3524 :path: String. Repository-absolute path of the file.
3520 :texts: List of text chunks.
3525 :texts: List of text chunks.
3521
3526
3522 And each entry of ``{texts}`` provides the following sub-keywords.
3527 And each entry of ``{texts}`` provides the following sub-keywords.
3523
3528
3524 :matched: Boolean. True if the chunk matches the specified pattern.
3529 :matched: Boolean. True if the chunk matches the specified pattern.
3525 :text: String. Chunk content.
3530 :text: String. Chunk content.
3526
3531
3527 See :hg:`help templates.operators` for the list expansion syntax.
3532 See :hg:`help templates.operators` for the list expansion syntax.
3528
3533
3529 Returns 0 if a match is found, 1 otherwise.
3534 Returns 0 if a match is found, 1 otherwise.
3530
3535
3531 """
3536 """
3532 cmdutil.check_incompatible_arguments(opts, 'all_files', ['all', 'diff'])
3537 cmdutil.check_incompatible_arguments(opts, 'all_files', ['all', 'diff'])
3533
3538
3534 diff = opts.get('all') or opts.get('diff')
3539 diff = opts.get('all') or opts.get('diff')
3535 follow = opts.get('follow')
3540 follow = opts.get('follow')
3536 if opts.get('all_files') is None and not diff:
3541 if opts.get('all_files') is None and not diff:
3537 opts['all_files'] = True
3542 opts['all_files'] = True
3538 plaingrep = (
3543 plaingrep = (
3539 opts.get('all_files') and not opts.get('rev') and not opts.get('follow')
3544 opts.get('all_files') and not opts.get('rev') and not opts.get('follow')
3540 )
3545 )
3541 all_files = opts.get('all_files')
3546 all_files = opts.get('all_files')
3542 if plaingrep:
3547 if plaingrep:
3543 opts['rev'] = [b'wdir()']
3548 opts['rev'] = [b'wdir()']
3544
3549
3545 reflags = re.M
3550 reflags = re.M
3546 if opts.get('ignore_case'):
3551 if opts.get('ignore_case'):
3547 reflags |= re.I
3552 reflags |= re.I
3548 try:
3553 try:
3549 regexp = util.re.compile(pattern, reflags)
3554 regexp = util.re.compile(pattern, reflags)
3550 except re.error as inst:
3555 except re.error as inst:
3551 ui.warn(
3556 ui.warn(
3552 _(b"grep: invalid match pattern: %s\n")
3557 _(b"grep: invalid match pattern: %s\n")
3553 % stringutil.forcebytestr(inst)
3558 % stringutil.forcebytestr(inst)
3554 )
3559 )
3555 return 1
3560 return 1
3556 sep, eol = b':', b'\n'
3561 sep, eol = b':', b'\n'
3557 if opts.get('print0'):
3562 if opts.get('print0'):
3558 sep = eol = b'\0'
3563 sep = eol = b'\0'
3559
3564
3560 searcher = grepmod.grepsearcher(
3565 searcher = grepmod.grepsearcher(
3561 ui, repo, regexp, all_files=all_files, diff=diff, follow=follow
3566 ui, repo, regexp, all_files=all_files, diff=diff, follow=follow
3562 )
3567 )
3563
3568
3564 getfile = searcher._getfile
3569 getfile = searcher._getfile
3565
3570
3566 uipathfn = scmutil.getuipathfn(repo)
3571 uipathfn = scmutil.getuipathfn(repo)
3567
3572
3568 def display(fm, fn, ctx, pstates, states):
3573 def display(fm, fn, ctx, pstates, states):
3569 rev = scmutil.intrev(ctx)
3574 rev = scmutil.intrev(ctx)
3570 if fm.isplain():
3575 if fm.isplain():
3571 formatuser = ui.shortuser
3576 formatuser = ui.shortuser
3572 else:
3577 else:
3573 formatuser = pycompat.bytestr
3578 formatuser = pycompat.bytestr
3574 if ui.quiet:
3579 if ui.quiet:
3575 datefmt = b'%Y-%m-%d'
3580 datefmt = b'%Y-%m-%d'
3576 else:
3581 else:
3577 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3582 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3578 found = False
3583 found = False
3579
3584
3580 @util.cachefunc
3585 @util.cachefunc
3581 def binary():
3586 def binary():
3582 flog = getfile(fn)
3587 flog = getfile(fn)
3583 try:
3588 try:
3584 return stringutil.binary(flog.read(ctx.filenode(fn)))
3589 return stringutil.binary(flog.read(ctx.filenode(fn)))
3585 except error.WdirUnsupported:
3590 except error.WdirUnsupported:
3586 return ctx[fn].isbinary()
3591 return ctx[fn].isbinary()
3587
3592
3588 fieldnamemap = {b'linenumber': b'lineno'}
3593 fieldnamemap = {b'linenumber': b'lineno'}
3589 if diff:
3594 if diff:
3590 iter = grepmod.difflinestates(pstates, states)
3595 iter = grepmod.difflinestates(pstates, states)
3591 else:
3596 else:
3592 iter = [(b'', l) for l in states]
3597 iter = [(b'', l) for l in states]
3593 for change, l in iter:
3598 for change, l in iter:
3594 fm.startitem()
3599 fm.startitem()
3595 fm.context(ctx=ctx)
3600 fm.context(ctx=ctx)
3596 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3601 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3597 fm.plain(uipathfn(fn), label=b'grep.filename')
3602 fm.plain(uipathfn(fn), label=b'grep.filename')
3598
3603
3599 cols = [
3604 cols = [
3600 (b'rev', b'%d', rev, not plaingrep, b''),
3605 (b'rev', b'%d', rev, not plaingrep, b''),
3601 (
3606 (
3602 b'linenumber',
3607 b'linenumber',
3603 b'%d',
3608 b'%d',
3604 l.linenum,
3609 l.linenum,
3605 opts.get('line_number'),
3610 opts.get('line_number'),
3606 b'',
3611 b'',
3607 ),
3612 ),
3608 ]
3613 ]
3609 if diff:
3614 if diff:
3610 cols.append(
3615 cols.append(
3611 (
3616 (
3612 b'change',
3617 b'change',
3613 b'%s',
3618 b'%s',
3614 change,
3619 change,
3615 True,
3620 True,
3616 b'grep.inserted '
3621 b'grep.inserted '
3617 if change == b'+'
3622 if change == b'+'
3618 else b'grep.deleted ',
3623 else b'grep.deleted ',
3619 )
3624 )
3620 )
3625 )
3621 cols.extend(
3626 cols.extend(
3622 [
3627 [
3623 (
3628 (
3624 b'user',
3629 b'user',
3625 b'%s',
3630 b'%s',
3626 formatuser(ctx.user()),
3631 formatuser(ctx.user()),
3627 opts.get('user'),
3632 opts.get('user'),
3628 b'',
3633 b'',
3629 ),
3634 ),
3630 (
3635 (
3631 b'date',
3636 b'date',
3632 b'%s',
3637 b'%s',
3633 fm.formatdate(ctx.date(), datefmt),
3638 fm.formatdate(ctx.date(), datefmt),
3634 opts.get('date'),
3639 opts.get('date'),
3635 b'',
3640 b'',
3636 ),
3641 ),
3637 ]
3642 ]
3638 )
3643 )
3639 for name, fmt, data, cond, extra_label in cols:
3644 for name, fmt, data, cond, extra_label in cols:
3640 if cond:
3645 if cond:
3641 fm.plain(sep, label=b'grep.sep')
3646 fm.plain(sep, label=b'grep.sep')
3642 field = fieldnamemap.get(name, name)
3647 field = fieldnamemap.get(name, name)
3643 label = extra_label + (b'grep.%s' % name)
3648 label = extra_label + (b'grep.%s' % name)
3644 fm.condwrite(cond, field, fmt, data, label=label)
3649 fm.condwrite(cond, field, fmt, data, label=label)
3645 if not opts.get('files_with_matches'):
3650 if not opts.get('files_with_matches'):
3646 fm.plain(sep, label=b'grep.sep')
3651 fm.plain(sep, label=b'grep.sep')
3647 if not opts.get('text') and binary():
3652 if not opts.get('text') and binary():
3648 fm.plain(_(b" Binary file matches"))
3653 fm.plain(_(b" Binary file matches"))
3649 else:
3654 else:
3650 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3655 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3651 fm.plain(eol)
3656 fm.plain(eol)
3652 found = True
3657 found = True
3653 if opts.get('files_with_matches'):
3658 if opts.get('files_with_matches'):
3654 break
3659 break
3655 return found
3660 return found
3656
3661
3657 def displaymatches(fm, l):
3662 def displaymatches(fm, l):
3658 p = 0
3663 p = 0
3659 for s, e in l.findpos(regexp):
3664 for s, e in l.findpos(regexp):
3660 if p < s:
3665 if p < s:
3661 fm.startitem()
3666 fm.startitem()
3662 fm.write(b'text', b'%s', l.line[p:s])
3667 fm.write(b'text', b'%s', l.line[p:s])
3663 fm.data(matched=False)
3668 fm.data(matched=False)
3664 fm.startitem()
3669 fm.startitem()
3665 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3670 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3666 fm.data(matched=True)
3671 fm.data(matched=True)
3667 p = e
3672 p = e
3668 if p < len(l.line):
3673 if p < len(l.line):
3669 fm.startitem()
3674 fm.startitem()
3670 fm.write(b'text', b'%s', l.line[p:])
3675 fm.write(b'text', b'%s', l.line[p:])
3671 fm.data(matched=False)
3676 fm.data(matched=False)
3672 fm.end()
3677 fm.end()
3673
3678
3674 found = False
3679 found = False
3675
3680
3676 wopts = logcmdutil.walkopts(
3681 wopts = logcmdutil.walkopts(
3677 pats=pats,
3682 pats=pats,
3678 opts=opts,
3683 opts=opts,
3679 revspec=opts['rev'],
3684 revspec=opts['rev'],
3680 include_pats=opts['include'],
3685 include_pats=opts['include'],
3681 exclude_pats=opts['exclude'],
3686 exclude_pats=opts['exclude'],
3682 follow=follow,
3687 follow=follow,
3683 force_changelog_traversal=all_files,
3688 force_changelog_traversal=all_files,
3684 filter_revisions_by_pats=not all_files,
3689 filter_revisions_by_pats=not all_files,
3685 )
3690 )
3686 revs, makefilematcher = logcmdutil.makewalker(repo, wopts)
3691 revs, makefilematcher = logcmdutil.makewalker(repo, wopts)
3687
3692
3688 ui.pager(b'grep')
3693 ui.pager(b'grep')
3689 fm = ui.formatter(b'grep', pycompat.byteskwargs(opts))
3694 fm = ui.formatter(b'grep', pycompat.byteskwargs(opts))
3690 for fn, ctx, pstates, states in searcher.searchfiles(revs, makefilematcher):
3695 for fn, ctx, pstates, states in searcher.searchfiles(revs, makefilematcher):
3691 r = display(fm, fn, ctx, pstates, states)
3696 r = display(fm, fn, ctx, pstates, states)
3692 found = found or r
3697 found = found or r
3693 if r and not diff and not all_files:
3698 if r and not diff and not all_files:
3694 searcher.skipfile(fn, ctx.rev())
3699 searcher.skipfile(fn, ctx.rev())
3695 fm.end()
3700 fm.end()
3696
3701
3697 return not found
3702 return not found
3698
3703
3699
3704
3700 @command(
3705 @command(
3701 b'heads',
3706 b'heads',
3702 [
3707 [
3703 (
3708 (
3704 b'r',
3709 b'r',
3705 b'rev',
3710 b'rev',
3706 b'',
3711 b'',
3707 _(b'show only heads which are descendants of STARTREV'),
3712 _(b'show only heads which are descendants of STARTREV'),
3708 _(b'STARTREV'),
3713 _(b'STARTREV'),
3709 ),
3714 ),
3710 (b't', b'topo', False, _(b'show topological heads only')),
3715 (b't', b'topo', False, _(b'show topological heads only')),
3711 (
3716 (
3712 b'a',
3717 b'a',
3713 b'active',
3718 b'active',
3714 False,
3719 False,
3715 _(b'show active branchheads only (DEPRECATED)'),
3720 _(b'show active branchheads only (DEPRECATED)'),
3716 ),
3721 ),
3717 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3722 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3718 ]
3723 ]
3719 + templateopts,
3724 + templateopts,
3720 _(b'[-ct] [-r STARTREV] [REV]...'),
3725 _(b'[-ct] [-r STARTREV] [REV]...'),
3721 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3726 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3722 intents={INTENT_READONLY},
3727 intents={INTENT_READONLY},
3723 )
3728 )
3724 def heads(ui, repo, *branchrevs, **opts):
3729 def heads(ui, repo, *branchrevs, **opts):
3725 """show branch heads
3730 """show branch heads
3726
3731
3727 With no arguments, show all open branch heads in the repository.
3732 With no arguments, show all open branch heads in the repository.
3728 Branch heads are changesets that have no descendants on the
3733 Branch heads are changesets that have no descendants on the
3729 same branch. They are where development generally takes place and
3734 same branch. They are where development generally takes place and
3730 are the usual targets for update and merge operations.
3735 are the usual targets for update and merge operations.
3731
3736
3732 If one or more REVs are given, only open branch heads on the
3737 If one or more REVs are given, only open branch heads on the
3733 branches associated with the specified changesets are shown. This
3738 branches associated with the specified changesets are shown. This
3734 means that you can use :hg:`heads .` to see the heads on the
3739 means that you can use :hg:`heads .` to see the heads on the
3735 currently checked-out branch.
3740 currently checked-out branch.
3736
3741
3737 If -c/--closed is specified, also show branch heads marked closed
3742 If -c/--closed is specified, also show branch heads marked closed
3738 (see :hg:`commit --close-branch`).
3743 (see :hg:`commit --close-branch`).
3739
3744
3740 If STARTREV is specified, only those heads that are descendants of
3745 If STARTREV is specified, only those heads that are descendants of
3741 STARTREV will be displayed.
3746 STARTREV will be displayed.
3742
3747
3743 If -t/--topo is specified, named branch mechanics will be ignored and only
3748 If -t/--topo is specified, named branch mechanics will be ignored and only
3744 topological heads (changesets with no children) will be shown.
3749 topological heads (changesets with no children) will be shown.
3745
3750
3746 Returns 0 if matching heads are found, 1 if not.
3751 Returns 0 if matching heads are found, 1 if not.
3747 """
3752 """
3748
3753
3749 start = None
3754 start = None
3750 rev = opts.get('rev')
3755 rev = opts.get('rev')
3751 if rev:
3756 if rev:
3752 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3757 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3753 start = logcmdutil.revsingle(repo, rev, None).node()
3758 start = logcmdutil.revsingle(repo, rev, None).node()
3754
3759
3755 if opts.get('topo'):
3760 if opts.get('topo'):
3756 heads = [repo[h] for h in repo.heads(start)]
3761 heads = [repo[h] for h in repo.heads(start)]
3757 else:
3762 else:
3758 heads = []
3763 heads = []
3759 for branch in repo.branchmap():
3764 for branch in repo.branchmap():
3760 heads += repo.branchheads(branch, start, opts.get('closed'))
3765 heads += repo.branchheads(branch, start, opts.get('closed'))
3761 heads = [repo[h] for h in heads]
3766 heads = [repo[h] for h in heads]
3762
3767
3763 if branchrevs:
3768 if branchrevs:
3764 branches = {
3769 branches = {
3765 repo[r].branch() for r in logcmdutil.revrange(repo, branchrevs)
3770 repo[r].branch() for r in logcmdutil.revrange(repo, branchrevs)
3766 }
3771 }
3767 heads = [h for h in heads if h.branch() in branches]
3772 heads = [h for h in heads if h.branch() in branches]
3768
3773
3769 if opts.get('active') and branchrevs:
3774 if opts.get('active') and branchrevs:
3770 dagheads = repo.heads(start)
3775 dagheads = repo.heads(start)
3771 heads = [h for h in heads if h.node() in dagheads]
3776 heads = [h for h in heads if h.node() in dagheads]
3772
3777
3773 if branchrevs:
3778 if branchrevs:
3774 haveheads = {h.branch() for h in heads}
3779 haveheads = {h.branch() for h in heads}
3775 if branches - haveheads:
3780 if branches - haveheads:
3776 headless = b', '.join(b for b in branches - haveheads)
3781 headless = b', '.join(b for b in branches - haveheads)
3777 msg = _(b'no open branch heads found on branches %s')
3782 msg = _(b'no open branch heads found on branches %s')
3778 if opts.get('rev'):
3783 if opts.get('rev'):
3779 msg += _(b' (started at %s)') % opts['rev']
3784 msg += _(b' (started at %s)') % opts['rev']
3780 ui.warn((msg + b'\n') % headless)
3785 ui.warn((msg + b'\n') % headless)
3781
3786
3782 if not heads:
3787 if not heads:
3783 return 1
3788 return 1
3784
3789
3785 ui.pager(b'heads')
3790 ui.pager(b'heads')
3786 heads = sorted(heads, key=lambda x: -(x.rev()))
3791 heads = sorted(heads, key=lambda x: -(x.rev()))
3787 displayer = logcmdutil.changesetdisplayer(
3792 displayer = logcmdutil.changesetdisplayer(
3788 ui, repo, pycompat.byteskwargs(opts)
3793 ui, repo, pycompat.byteskwargs(opts)
3789 )
3794 )
3790 for ctx in heads:
3795 for ctx in heads:
3791 displayer.show(ctx)
3796 displayer.show(ctx)
3792 displayer.close()
3797 displayer.close()
3793
3798
3794
3799
3795 @command(
3800 @command(
3796 b'help',
3801 b'help',
3797 [
3802 [
3798 (b'e', b'extension', None, _(b'show only help for extensions')),
3803 (b'e', b'extension', None, _(b'show only help for extensions')),
3799 (b'c', b'command', None, _(b'show only help for commands')),
3804 (b'c', b'command', None, _(b'show only help for commands')),
3800 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3805 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3801 (
3806 (
3802 b's',
3807 b's',
3803 b'system',
3808 b'system',
3804 [],
3809 [],
3805 _(b'show help for specific platform(s)'),
3810 _(b'show help for specific platform(s)'),
3806 _(b'PLATFORM'),
3811 _(b'PLATFORM'),
3807 ),
3812 ),
3808 ],
3813 ],
3809 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3814 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3810 helpcategory=command.CATEGORY_HELP,
3815 helpcategory=command.CATEGORY_HELP,
3811 norepo=True,
3816 norepo=True,
3812 intents={INTENT_READONLY},
3817 intents={INTENT_READONLY},
3813 )
3818 )
3814 def help_(ui, name=None, **opts):
3819 def help_(ui, name=None, **opts):
3815 """show help for a given topic or a help overview
3820 """show help for a given topic or a help overview
3816
3821
3817 With no arguments, print a list of commands with short help messages.
3822 With no arguments, print a list of commands with short help messages.
3818
3823
3819 Given a topic, extension, or command name, print help for that
3824 Given a topic, extension, or command name, print help for that
3820 topic.
3825 topic.
3821
3826
3822 Returns 0 if successful.
3827 Returns 0 if successful.
3823 """
3828 """
3824
3829
3825 keep = opts.get('system') or []
3830 keep = opts.get('system') or []
3826 if len(keep) == 0:
3831 if len(keep) == 0:
3827 if pycompat.sysplatform.startswith(b'win'):
3832 if pycompat.sysplatform.startswith(b'win'):
3828 keep.append(b'windows')
3833 keep.append(b'windows')
3829 elif pycompat.sysplatform == b'OpenVMS':
3834 elif pycompat.sysplatform == b'OpenVMS':
3830 keep.append(b'vms')
3835 keep.append(b'vms')
3831 elif pycompat.sysplatform == b'plan9':
3836 elif pycompat.sysplatform == b'plan9':
3832 keep.append(b'plan9')
3837 keep.append(b'plan9')
3833 else:
3838 else:
3834 keep.append(b'unix')
3839 keep.append(b'unix')
3835 keep.append(pycompat.sysplatform.lower())
3840 keep.append(pycompat.sysplatform.lower())
3836 if ui.verbose:
3841 if ui.verbose:
3837 keep.append(b'verbose')
3842 keep.append(b'verbose')
3838
3843
3839 commands = sys.modules[__name__]
3844 commands = sys.modules[__name__]
3840 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3845 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3841 ui.pager(b'help')
3846 ui.pager(b'help')
3842 ui.write(formatted)
3847 ui.write(formatted)
3843
3848
3844
3849
3845 @command(
3850 @command(
3846 b'identify|id',
3851 b'identify|id',
3847 [
3852 [
3848 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3853 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3849 (b'n', b'num', None, _(b'show local revision number')),
3854 (b'n', b'num', None, _(b'show local revision number')),
3850 (b'i', b'id', None, _(b'show global revision id')),
3855 (b'i', b'id', None, _(b'show global revision id')),
3851 (b'b', b'branch', None, _(b'show branch')),
3856 (b'b', b'branch', None, _(b'show branch')),
3852 (b't', b'tags', None, _(b'show tags')),
3857 (b't', b'tags', None, _(b'show tags')),
3853 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3858 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3854 ]
3859 ]
3855 + remoteopts
3860 + remoteopts
3856 + formatteropts,
3861 + formatteropts,
3857 _(b'[-nibtB] [-r REV] [SOURCE]'),
3862 _(b'[-nibtB] [-r REV] [SOURCE]'),
3858 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3863 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3859 optionalrepo=True,
3864 optionalrepo=True,
3860 intents={INTENT_READONLY},
3865 intents={INTENT_READONLY},
3861 )
3866 )
3862 def identify(
3867 def identify(
3863 ui,
3868 ui,
3864 repo,
3869 repo,
3865 source=None,
3870 source=None,
3866 rev=None,
3871 rev=None,
3867 num=None,
3872 num=None,
3868 id=None,
3873 id=None,
3869 branch=None,
3874 branch=None,
3870 tags=None,
3875 tags=None,
3871 bookmarks=None,
3876 bookmarks=None,
3872 **opts
3877 **opts
3873 ):
3878 ):
3874 """identify the working directory or specified revision
3879 """identify the working directory or specified revision
3875
3880
3876 Print a summary identifying the repository state at REV using one or
3881 Print a summary identifying the repository state at REV using one or
3877 two parent hash identifiers, followed by a "+" if the working
3882 two parent hash identifiers, followed by a "+" if the working
3878 directory has uncommitted changes, the branch name (if not default),
3883 directory has uncommitted changes, the branch name (if not default),
3879 a list of tags, and a list of bookmarks.
3884 a list of tags, and a list of bookmarks.
3880
3885
3881 When REV is not given, print a summary of the current state of the
3886 When REV is not given, print a summary of the current state of the
3882 repository including the working directory. Specify -r. to get information
3887 repository including the working directory. Specify -r. to get information
3883 of the working directory parent without scanning uncommitted changes.
3888 of the working directory parent without scanning uncommitted changes.
3884
3889
3885 Specifying a path to a repository root or Mercurial bundle will
3890 Specifying a path to a repository root or Mercurial bundle will
3886 cause lookup to operate on that repository/bundle.
3891 cause lookup to operate on that repository/bundle.
3887
3892
3888 .. container:: verbose
3893 .. container:: verbose
3889
3894
3890 Template:
3895 Template:
3891
3896
3892 The following keywords are supported in addition to the common template
3897 The following keywords are supported in addition to the common template
3893 keywords and functions. See also :hg:`help templates`.
3898 keywords and functions. See also :hg:`help templates`.
3894
3899
3895 :dirty: String. Character ``+`` denoting if the working directory has
3900 :dirty: String. Character ``+`` denoting if the working directory has
3896 uncommitted changes.
3901 uncommitted changes.
3897 :id: String. One or two nodes, optionally followed by ``+``.
3902 :id: String. One or two nodes, optionally followed by ``+``.
3898 :parents: List of strings. Parent nodes of the changeset.
3903 :parents: List of strings. Parent nodes of the changeset.
3899
3904
3900 Examples:
3905 Examples:
3901
3906
3902 - generate a build identifier for the working directory::
3907 - generate a build identifier for the working directory::
3903
3908
3904 hg id --id > build-id.dat
3909 hg id --id > build-id.dat
3905
3910
3906 - find the revision corresponding to a tag::
3911 - find the revision corresponding to a tag::
3907
3912
3908 hg id -n -r 1.3
3913 hg id -n -r 1.3
3909
3914
3910 - check the most recent revision of a remote repository::
3915 - check the most recent revision of a remote repository::
3911
3916
3912 hg id -r tip https://www.mercurial-scm.org/repo/hg/
3917 hg id -r tip https://www.mercurial-scm.org/repo/hg/
3913
3918
3914 See :hg:`log` for generating more information about specific revisions,
3919 See :hg:`log` for generating more information about specific revisions,
3915 including full hash identifiers.
3920 including full hash identifiers.
3916
3921
3917 Returns 0 if successful.
3922 Returns 0 if successful.
3918 """
3923 """
3919
3924
3920 opts = pycompat.byteskwargs(opts)
3925 opts = pycompat.byteskwargs(opts)
3921 if not repo and not source:
3926 if not repo and not source:
3922 raise error.InputError(
3927 raise error.InputError(
3923 _(b"there is no Mercurial repository here (.hg not found)")
3928 _(b"there is no Mercurial repository here (.hg not found)")
3924 )
3929 )
3925
3930
3926 default = not (num or id or branch or tags or bookmarks)
3931 default = not (num or id or branch or tags or bookmarks)
3927 output = []
3932 output = []
3928 revs = []
3933 revs = []
3929
3934
3930 peer = None
3935 peer = None
3931 try:
3936 try:
3932 if source:
3937 if source:
3933 path = urlutil.get_unique_pull_path_obj(b'identify', ui, source)
3938 path = urlutil.get_unique_pull_path_obj(b'identify', ui, source)
3934 # only pass ui when no repo
3939 # only pass ui when no repo
3935 peer = hg.peer(repo or ui, opts, path)
3940 peer = hg.peer(repo or ui, opts, path)
3936 repo = peer.local()
3941 repo = peer.local()
3937 branches = (path.branch, [])
3942 branches = (path.branch, [])
3938 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3943 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3939
3944
3940 fm = ui.formatter(b'identify', opts)
3945 fm = ui.formatter(b'identify', opts)
3941 fm.startitem()
3946 fm.startitem()
3942
3947
3943 if not repo:
3948 if not repo:
3944 if num or branch or tags:
3949 if num or branch or tags:
3945 raise error.InputError(
3950 raise error.InputError(
3946 _(b"can't query remote revision number, branch, or tags")
3951 _(b"can't query remote revision number, branch, or tags")
3947 )
3952 )
3948 if not rev and revs:
3953 if not rev and revs:
3949 rev = revs[0]
3954 rev = revs[0]
3950 if not rev:
3955 if not rev:
3951 rev = b"tip"
3956 rev = b"tip"
3952
3957
3953 remoterev = peer.lookup(rev)
3958 remoterev = peer.lookup(rev)
3954 hexrev = fm.hexfunc(remoterev)
3959 hexrev = fm.hexfunc(remoterev)
3955 if default or id:
3960 if default or id:
3956 output = [hexrev]
3961 output = [hexrev]
3957 fm.data(id=hexrev)
3962 fm.data(id=hexrev)
3958
3963
3959 @util.cachefunc
3964 @util.cachefunc
3960 def getbms():
3965 def getbms():
3961 bms = []
3966 bms = []
3962
3967
3963 if b'bookmarks' in peer.listkeys(b'namespaces'):
3968 if b'bookmarks' in peer.listkeys(b'namespaces'):
3964 hexremoterev = hex(remoterev)
3969 hexremoterev = hex(remoterev)
3965 bms = [
3970 bms = [
3966 bm
3971 bm
3967 for bm, bmr in peer.listkeys(b'bookmarks').items()
3972 for bm, bmr in peer.listkeys(b'bookmarks').items()
3968 if bmr == hexremoterev
3973 if bmr == hexremoterev
3969 ]
3974 ]
3970
3975
3971 return sorted(bms)
3976 return sorted(bms)
3972
3977
3973 if fm.isplain():
3978 if fm.isplain():
3974 if bookmarks:
3979 if bookmarks:
3975 output.extend(getbms())
3980 output.extend(getbms())
3976 elif default and not ui.quiet:
3981 elif default and not ui.quiet:
3977 # multiple bookmarks for a single parent separated by '/'
3982 # multiple bookmarks for a single parent separated by '/'
3978 bm = b'/'.join(getbms())
3983 bm = b'/'.join(getbms())
3979 if bm:
3984 if bm:
3980 output.append(bm)
3985 output.append(bm)
3981 else:
3986 else:
3982 fm.data(node=hex(remoterev))
3987 fm.data(node=hex(remoterev))
3983 if bookmarks or b'bookmarks' in fm.datahint():
3988 if bookmarks or b'bookmarks' in fm.datahint():
3984 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3989 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3985 else:
3990 else:
3986 if rev:
3991 if rev:
3987 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3992 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3988 ctx = logcmdutil.revsingle(repo, rev, None)
3993 ctx = logcmdutil.revsingle(repo, rev, None)
3989
3994
3990 if ctx.rev() is None:
3995 if ctx.rev() is None:
3991 ctx = repo[None]
3996 ctx = repo[None]
3992 parents = ctx.parents()
3997 parents = ctx.parents()
3993 taglist = []
3998 taglist = []
3994 for p in parents:
3999 for p in parents:
3995 taglist.extend(p.tags())
4000 taglist.extend(p.tags())
3996
4001
3997 dirty = b""
4002 dirty = b""
3998 if ctx.dirty(missing=True, merge=False, branch=False):
4003 if ctx.dirty(missing=True, merge=False, branch=False):
3999 dirty = b'+'
4004 dirty = b'+'
4000 fm.data(dirty=dirty)
4005 fm.data(dirty=dirty)
4001
4006
4002 hexoutput = [fm.hexfunc(p.node()) for p in parents]
4007 hexoutput = [fm.hexfunc(p.node()) for p in parents]
4003 if default or id:
4008 if default or id:
4004 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
4009 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
4005 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
4010 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
4006
4011
4007 if num:
4012 if num:
4008 numoutput = [b"%d" % p.rev() for p in parents]
4013 numoutput = [b"%d" % p.rev() for p in parents]
4009 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
4014 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
4010
4015
4011 fm.data(
4016 fm.data(
4012 parents=fm.formatlist(
4017 parents=fm.formatlist(
4013 [fm.hexfunc(p.node()) for p in parents], name=b'node'
4018 [fm.hexfunc(p.node()) for p in parents], name=b'node'
4014 )
4019 )
4015 )
4020 )
4016 else:
4021 else:
4017 hexoutput = fm.hexfunc(ctx.node())
4022 hexoutput = fm.hexfunc(ctx.node())
4018 if default or id:
4023 if default or id:
4019 output = [hexoutput]
4024 output = [hexoutput]
4020 fm.data(id=hexoutput)
4025 fm.data(id=hexoutput)
4021
4026
4022 if num:
4027 if num:
4023 output.append(pycompat.bytestr(ctx.rev()))
4028 output.append(pycompat.bytestr(ctx.rev()))
4024 taglist = ctx.tags()
4029 taglist = ctx.tags()
4025
4030
4026 if default and not ui.quiet:
4031 if default and not ui.quiet:
4027 b = ctx.branch()
4032 b = ctx.branch()
4028 if b != b'default':
4033 if b != b'default':
4029 output.append(b"(%s)" % b)
4034 output.append(b"(%s)" % b)
4030
4035
4031 # multiple tags for a single parent separated by '/'
4036 # multiple tags for a single parent separated by '/'
4032 t = b'/'.join(taglist)
4037 t = b'/'.join(taglist)
4033 if t:
4038 if t:
4034 output.append(t)
4039 output.append(t)
4035
4040
4036 # multiple bookmarks for a single parent separated by '/'
4041 # multiple bookmarks for a single parent separated by '/'
4037 bm = b'/'.join(ctx.bookmarks())
4042 bm = b'/'.join(ctx.bookmarks())
4038 if bm:
4043 if bm:
4039 output.append(bm)
4044 output.append(bm)
4040 else:
4045 else:
4041 if branch:
4046 if branch:
4042 output.append(ctx.branch())
4047 output.append(ctx.branch())
4043
4048
4044 if tags:
4049 if tags:
4045 output.extend(taglist)
4050 output.extend(taglist)
4046
4051
4047 if bookmarks:
4052 if bookmarks:
4048 output.extend(ctx.bookmarks())
4053 output.extend(ctx.bookmarks())
4049
4054
4050 fm.data(node=ctx.hex())
4055 fm.data(node=ctx.hex())
4051 fm.data(branch=ctx.branch())
4056 fm.data(branch=ctx.branch())
4052 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
4057 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
4053 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
4058 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
4054 fm.context(ctx=ctx)
4059 fm.context(ctx=ctx)
4055
4060
4056 fm.plain(b"%s\n" % b' '.join(output))
4061 fm.plain(b"%s\n" % b' '.join(output))
4057 fm.end()
4062 fm.end()
4058 finally:
4063 finally:
4059 if peer:
4064 if peer:
4060 peer.close()
4065 peer.close()
4061
4066
4062
4067
4063 @command(
4068 @command(
4064 b'import|patch',
4069 b'import|patch',
4065 [
4070 [
4066 (
4071 (
4067 b'p',
4072 b'p',
4068 b'strip',
4073 b'strip',
4069 1,
4074 1,
4070 _(
4075 _(
4071 b'directory strip option for patch. This has the same '
4076 b'directory strip option for patch. This has the same '
4072 b'meaning as the corresponding patch option'
4077 b'meaning as the corresponding patch option'
4073 ),
4078 ),
4074 _(b'NUM'),
4079 _(b'NUM'),
4075 ),
4080 ),
4076 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
4081 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
4077 (b'', b'secret', None, _(b'use the secret phase for committing')),
4082 (b'', b'secret', None, _(b'use the secret phase for committing')),
4078 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
4083 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
4079 (
4084 (
4080 b'f',
4085 b'f',
4081 b'force',
4086 b'force',
4082 None,
4087 None,
4083 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
4088 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
4084 ),
4089 ),
4085 (
4090 (
4086 b'',
4091 b'',
4087 b'no-commit',
4092 b'no-commit',
4088 None,
4093 None,
4089 _(b"don't commit, just update the working directory"),
4094 _(b"don't commit, just update the working directory"),
4090 ),
4095 ),
4091 (
4096 (
4092 b'',
4097 b'',
4093 b'bypass',
4098 b'bypass',
4094 None,
4099 None,
4095 _(b"apply patch without touching the working directory"),
4100 _(b"apply patch without touching the working directory"),
4096 ),
4101 ),
4097 (b'', b'partial', None, _(b'commit even if some hunks fail')),
4102 (b'', b'partial', None, _(b'commit even if some hunks fail')),
4098 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
4103 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
4099 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
4104 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
4100 (
4105 (
4101 b'',
4106 b'',
4102 b'import-branch',
4107 b'import-branch',
4103 None,
4108 None,
4104 _(b'use any branch information in patch (implied by --exact)'),
4109 _(b'use any branch information in patch (implied by --exact)'),
4105 ),
4110 ),
4106 ]
4111 ]
4107 + commitopts
4112 + commitopts
4108 + commitopts2
4113 + commitopts2
4109 + similarityopts,
4114 + similarityopts,
4110 _(b'[OPTION]... PATCH...'),
4115 _(b'[OPTION]... PATCH...'),
4111 helpcategory=command.CATEGORY_IMPORT_EXPORT,
4116 helpcategory=command.CATEGORY_IMPORT_EXPORT,
4112 )
4117 )
4113 def import_(ui, repo, patch1=None, *patches, **opts):
4118 def import_(ui, repo, patch1=None, *patches, **opts):
4114 """import an ordered set of patches
4119 """import an ordered set of patches
4115
4120
4116 Import a list of patches and commit them individually (unless
4121 Import a list of patches and commit them individually (unless
4117 --no-commit is specified).
4122 --no-commit is specified).
4118
4123
4119 To read a patch from standard input (stdin), use "-" as the patch
4124 To read a patch from standard input (stdin), use "-" as the patch
4120 name. If a URL is specified, the patch will be downloaded from
4125 name. If a URL is specified, the patch will be downloaded from
4121 there.
4126 there.
4122
4127
4123 Import first applies changes to the working directory (unless
4128 Import first applies changes to the working directory (unless
4124 --bypass is specified), import will abort if there are outstanding
4129 --bypass is specified), import will abort if there are outstanding
4125 changes.
4130 changes.
4126
4131
4127 Use --bypass to apply and commit patches directly to the
4132 Use --bypass to apply and commit patches directly to the
4128 repository, without affecting the working directory. Without
4133 repository, without affecting the working directory. Without
4129 --exact, patches will be applied on top of the working directory
4134 --exact, patches will be applied on top of the working directory
4130 parent revision.
4135 parent revision.
4131
4136
4132 You can import a patch straight from a mail message. Even patches
4137 You can import a patch straight from a mail message. Even patches
4133 as attachments work (to use the body part, it must have type
4138 as attachments work (to use the body part, it must have type
4134 text/plain or text/x-patch). From and Subject headers of email
4139 text/plain or text/x-patch). From and Subject headers of email
4135 message are used as default committer and commit message. All
4140 message are used as default committer and commit message. All
4136 text/plain body parts before first diff are added to the commit
4141 text/plain body parts before first diff are added to the commit
4137 message.
4142 message.
4138
4143
4139 If the imported patch was generated by :hg:`export`, user and
4144 If the imported patch was generated by :hg:`export`, user and
4140 description from patch override values from message headers and
4145 description from patch override values from message headers and
4141 body. Values given on command line with -m/--message and -u/--user
4146 body. Values given on command line with -m/--message and -u/--user
4142 override these.
4147 override these.
4143
4148
4144 If --exact is specified, import will set the working directory to
4149 If --exact is specified, import will set the working directory to
4145 the parent of each patch before applying it, and will abort if the
4150 the parent of each patch before applying it, and will abort if the
4146 resulting changeset has a different ID than the one recorded in
4151 resulting changeset has a different ID than the one recorded in
4147 the patch. This will guard against various ways that portable
4152 the patch. This will guard against various ways that portable
4148 patch formats and mail systems might fail to transfer Mercurial
4153 patch formats and mail systems might fail to transfer Mercurial
4149 data or metadata. See :hg:`bundle` for lossless transmission.
4154 data or metadata. See :hg:`bundle` for lossless transmission.
4150
4155
4151 Use --partial to ensure a changeset will be created from the patch
4156 Use --partial to ensure a changeset will be created from the patch
4152 even if some hunks fail to apply. Hunks that fail to apply will be
4157 even if some hunks fail to apply. Hunks that fail to apply will be
4153 written to a <target-file>.rej file. Conflicts can then be resolved
4158 written to a <target-file>.rej file. Conflicts can then be resolved
4154 by hand before :hg:`commit --amend` is run to update the created
4159 by hand before :hg:`commit --amend` is run to update the created
4155 changeset. This flag exists to let people import patches that
4160 changeset. This flag exists to let people import patches that
4156 partially apply without losing the associated metadata (author,
4161 partially apply without losing the associated metadata (author,
4157 date, description, ...).
4162 date, description, ...).
4158
4163
4159 .. note::
4164 .. note::
4160
4165
4161 When no hunks apply cleanly, :hg:`import --partial` will create
4166 When no hunks apply cleanly, :hg:`import --partial` will create
4162 an empty changeset, importing only the patch metadata.
4167 an empty changeset, importing only the patch metadata.
4163
4168
4164 With -s/--similarity, hg will attempt to discover renames and
4169 With -s/--similarity, hg will attempt to discover renames and
4165 copies in the patch in the same way as :hg:`addremove`.
4170 copies in the patch in the same way as :hg:`addremove`.
4166
4171
4167 It is possible to use external patch programs to perform the patch
4172 It is possible to use external patch programs to perform the patch
4168 by setting the ``ui.patch`` configuration option. For the default
4173 by setting the ``ui.patch`` configuration option. For the default
4169 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4174 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4170 See :hg:`help config` for more information about configuration
4175 See :hg:`help config` for more information about configuration
4171 files and how to use these options.
4176 files and how to use these options.
4172
4177
4173 See :hg:`help dates` for a list of formats valid for -d/--date.
4178 See :hg:`help dates` for a list of formats valid for -d/--date.
4174
4179
4175 .. container:: verbose
4180 .. container:: verbose
4176
4181
4177 Examples:
4182 Examples:
4178
4183
4179 - import a traditional patch from a website and detect renames::
4184 - import a traditional patch from a website and detect renames::
4180
4185
4181 hg import -s 80 http://example.com/bugfix.patch
4186 hg import -s 80 http://example.com/bugfix.patch
4182
4187
4183 - import a changeset from an hgweb server::
4188 - import a changeset from an hgweb server::
4184
4189
4185 hg import https://www.mercurial-scm.org/repo/hg/rev/5ca8c111e9aa
4190 hg import https://www.mercurial-scm.org/repo/hg/rev/5ca8c111e9aa
4186
4191
4187 - import all the patches in an Unix-style mbox::
4192 - import all the patches in an Unix-style mbox::
4188
4193
4189 hg import incoming-patches.mbox
4194 hg import incoming-patches.mbox
4190
4195
4191 - import patches from stdin::
4196 - import patches from stdin::
4192
4197
4193 hg import -
4198 hg import -
4194
4199
4195 - attempt to exactly restore an exported changeset (not always
4200 - attempt to exactly restore an exported changeset (not always
4196 possible)::
4201 possible)::
4197
4202
4198 hg import --exact proposed-fix.patch
4203 hg import --exact proposed-fix.patch
4199
4204
4200 - use an external tool to apply a patch which is too fuzzy for
4205 - use an external tool to apply a patch which is too fuzzy for
4201 the default internal tool.
4206 the default internal tool.
4202
4207
4203 hg import --config ui.patch="patch --merge" fuzzy.patch
4208 hg import --config ui.patch="patch --merge" fuzzy.patch
4204
4209
4205 - change the default fuzzing from 2 to a less strict 7
4210 - change the default fuzzing from 2 to a less strict 7
4206
4211
4207 hg import --config ui.fuzz=7 fuzz.patch
4212 hg import --config ui.fuzz=7 fuzz.patch
4208
4213
4209 Returns 0 on success, 1 on partial success (see --partial).
4214 Returns 0 on success, 1 on partial success (see --partial).
4210 """
4215 """
4211
4216
4212 cmdutil.check_incompatible_arguments(
4217 cmdutil.check_incompatible_arguments(
4213 opts, 'no_commit', ['bypass', 'secret']
4218 opts, 'no_commit', ['bypass', 'secret']
4214 )
4219 )
4215 cmdutil.check_incompatible_arguments(opts, 'exact', ['edit', 'prefix'])
4220 cmdutil.check_incompatible_arguments(opts, 'exact', ['edit', 'prefix'])
4216
4221
4217 if not patch1:
4222 if not patch1:
4218 raise error.InputError(_(b'need at least one patch to import'))
4223 raise error.InputError(_(b'need at least one patch to import'))
4219
4224
4220 patches = (patch1,) + patches
4225 patches = (patch1,) + patches
4221
4226
4222 date = opts.get('date')
4227 date = opts.get('date')
4223 if date:
4228 if date:
4224 opts['date'] = dateutil.parsedate(date)
4229 opts['date'] = dateutil.parsedate(date)
4225
4230
4226 exact = opts.get('exact')
4231 exact = opts.get('exact')
4227 update = not opts.get('bypass')
4232 update = not opts.get('bypass')
4228 try:
4233 try:
4229 sim = float(opts.get('similarity') or 0)
4234 sim = float(opts.get('similarity') or 0)
4230 except ValueError:
4235 except ValueError:
4231 raise error.InputError(_(b'similarity must be a number'))
4236 raise error.InputError(_(b'similarity must be a number'))
4232 if sim < 0 or sim > 100:
4237 if sim < 0 or sim > 100:
4233 raise error.InputError(_(b'similarity must be between 0 and 100'))
4238 raise error.InputError(_(b'similarity must be between 0 and 100'))
4234 if sim and not update:
4239 if sim and not update:
4235 raise error.InputError(_(b'cannot use --similarity with --bypass'))
4240 raise error.InputError(_(b'cannot use --similarity with --bypass'))
4236
4241
4237 base = opts["base"]
4242 base = opts["base"]
4238 msgs = []
4243 msgs = []
4239 ret = 0
4244 ret = 0
4240
4245
4241 with repo.wlock():
4246 with repo.wlock():
4242 if update:
4247 if update:
4243 cmdutil.checkunfinished(repo)
4248 cmdutil.checkunfinished(repo)
4244 if exact or not opts.get('force'):
4249 if exact or not opts.get('force'):
4245 cmdutil.bailifchanged(repo)
4250 cmdutil.bailifchanged(repo)
4246
4251
4247 if not opts.get('no_commit'):
4252 if not opts.get('no_commit'):
4248 lock = repo.lock
4253 lock = repo.lock
4249 tr = lambda: repo.transaction(b'import')
4254 tr = lambda: repo.transaction(b'import')
4250 else:
4255 else:
4251 lock = util.nullcontextmanager
4256 lock = util.nullcontextmanager
4252 tr = util.nullcontextmanager
4257 tr = util.nullcontextmanager
4253 with lock(), tr():
4258 with lock(), tr():
4254 parents = repo[None].parents()
4259 parents = repo[None].parents()
4255 for patchurl in patches:
4260 for patchurl in patches:
4256 if patchurl == b'-':
4261 if patchurl == b'-':
4257 ui.status(_(b'applying patch from stdin\n'))
4262 ui.status(_(b'applying patch from stdin\n'))
4258 patchfile = ui.fin
4263 patchfile = ui.fin
4259 patchurl = b'stdin' # for error message
4264 patchurl = b'stdin' # for error message
4260 else:
4265 else:
4261 patchurl = os.path.join(base, patchurl)
4266 patchurl = os.path.join(base, patchurl)
4262 ui.status(_(b'applying %s\n') % patchurl)
4267 ui.status(_(b'applying %s\n') % patchurl)
4263 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4268 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4264
4269
4265 haspatch = False
4270 haspatch = False
4266 for hunk in patch.split(patchfile):
4271 for hunk in patch.split(patchfile):
4267 with patch.extract(ui, hunk) as patchdata:
4272 with patch.extract(ui, hunk) as patchdata:
4268 msg, node, rej = cmdutil.tryimportone(
4273 msg, node, rej = cmdutil.tryimportone(
4269 ui,
4274 ui,
4270 repo,
4275 repo,
4271 patchdata,
4276 patchdata,
4272 parents,
4277 parents,
4273 pycompat.byteskwargs(opts),
4278 pycompat.byteskwargs(opts),
4274 msgs,
4279 msgs,
4275 hg.clean,
4280 hg.clean,
4276 )
4281 )
4277 if msg:
4282 if msg:
4278 haspatch = True
4283 haspatch = True
4279 ui.note(msg + b'\n')
4284 ui.note(msg + b'\n')
4280 if update or exact:
4285 if update or exact:
4281 parents = repo[None].parents()
4286 parents = repo[None].parents()
4282 else:
4287 else:
4283 parents = [repo[node]]
4288 parents = [repo[node]]
4284 if rej:
4289 if rej:
4285 ui.write_err(_(b"patch applied partially\n"))
4290 ui.write_err(_(b"patch applied partially\n"))
4286 ui.write_err(
4291 ui.write_err(
4287 _(
4292 _(
4288 b"(fix the .rej files and run "
4293 b"(fix the .rej files and run "
4289 b"`hg commit --amend`)\n"
4294 b"`hg commit --amend`)\n"
4290 )
4295 )
4291 )
4296 )
4292 ret = 1
4297 ret = 1
4293 break
4298 break
4294
4299
4295 if not haspatch:
4300 if not haspatch:
4296 raise error.InputError(_(b'%s: no diffs found') % patchurl)
4301 raise error.InputError(_(b'%s: no diffs found') % patchurl)
4297
4302
4298 if msgs:
4303 if msgs:
4299 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4304 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4300 return ret
4305 return ret
4301
4306
4302
4307
4303 @command(
4308 @command(
4304 b'incoming|in',
4309 b'incoming|in',
4305 [
4310 [
4306 (
4311 (
4307 b'f',
4312 b'f',
4308 b'force',
4313 b'force',
4309 None,
4314 None,
4310 _(b'run even if remote repository is unrelated'),
4315 _(b'run even if remote repository is unrelated'),
4311 ),
4316 ),
4312 (b'n', b'newest-first', None, _(b'show newest record first')),
4317 (b'n', b'newest-first', None, _(b'show newest record first')),
4313 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4318 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4314 (
4319 (
4315 b'r',
4320 b'r',
4316 b'rev',
4321 b'rev',
4317 [],
4322 [],
4318 _(b'a remote changeset intended to be added'),
4323 _(b'a remote changeset intended to be added'),
4319 _(b'REV'),
4324 _(b'REV'),
4320 ),
4325 ),
4321 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4326 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4322 (
4327 (
4323 b'b',
4328 b'b',
4324 b'branch',
4329 b'branch',
4325 [],
4330 [],
4326 _(b'a specific branch you would like to pull'),
4331 _(b'a specific branch you would like to pull'),
4327 _(b'BRANCH'),
4332 _(b'BRANCH'),
4328 ),
4333 ),
4329 ]
4334 ]
4330 + logopts
4335 + logopts
4331 + remoteopts
4336 + remoteopts
4332 + subrepoopts,
4337 + subrepoopts,
4333 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4338 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4334 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4339 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4335 )
4340 )
4336 def incoming(ui, repo, source=b"default", **opts):
4341 def incoming(ui, repo, source=b"default", **opts):
4337 """show new changesets found in source
4342 """show new changesets found in source
4338
4343
4339 Show new changesets found in the specified path/URL or the default
4344 Show new changesets found in the specified path/URL or the default
4340 pull location. These are the changesets that would have been pulled
4345 pull location. These are the changesets that would have been pulled
4341 by :hg:`pull` at the time you issued this command.
4346 by :hg:`pull` at the time you issued this command.
4342
4347
4343 See pull for valid source format details.
4348 See pull for valid source format details.
4344
4349
4345 .. container:: verbose
4350 .. container:: verbose
4346
4351
4347 With -B/--bookmarks, the result of bookmark comparison between
4352 With -B/--bookmarks, the result of bookmark comparison between
4348 local and remote repositories is displayed. With -v/--verbose,
4353 local and remote repositories is displayed. With -v/--verbose,
4349 status is also displayed for each bookmark like below::
4354 status is also displayed for each bookmark like below::
4350
4355
4351 BM1 01234567890a added
4356 BM1 01234567890a added
4352 BM2 1234567890ab advanced
4357 BM2 1234567890ab advanced
4353 BM3 234567890abc diverged
4358 BM3 234567890abc diverged
4354 BM4 34567890abcd changed
4359 BM4 34567890abcd changed
4355
4360
4356 The action taken locally when pulling depends on the
4361 The action taken locally when pulling depends on the
4357 status of each bookmark:
4362 status of each bookmark:
4358
4363
4359 :``added``: pull will create it
4364 :``added``: pull will create it
4360 :``advanced``: pull will update it
4365 :``advanced``: pull will update it
4361 :``diverged``: pull will create a divergent bookmark
4366 :``diverged``: pull will create a divergent bookmark
4362 :``changed``: result depends on remote changesets
4367 :``changed``: result depends on remote changesets
4363
4368
4364 From the point of view of pulling behavior, bookmark
4369 From the point of view of pulling behavior, bookmark
4365 existing only in the remote repository are treated as ``added``,
4370 existing only in the remote repository are treated as ``added``,
4366 even if it is in fact locally deleted.
4371 even if it is in fact locally deleted.
4367
4372
4368 .. container:: verbose
4373 .. container:: verbose
4369
4374
4370 For remote repository, using --bundle avoids downloading the
4375 For remote repository, using --bundle avoids downloading the
4371 changesets twice if the incoming is followed by a pull.
4376 changesets twice if the incoming is followed by a pull.
4372
4377
4373 Examples:
4378 Examples:
4374
4379
4375 - show incoming changes with patches and full description::
4380 - show incoming changes with patches and full description::
4376
4381
4377 hg incoming -vp
4382 hg incoming -vp
4378
4383
4379 - show incoming changes excluding merges, store a bundle::
4384 - show incoming changes excluding merges, store a bundle::
4380
4385
4381 hg in -vpM --bundle incoming.hg
4386 hg in -vpM --bundle incoming.hg
4382 hg pull incoming.hg
4387 hg pull incoming.hg
4383
4388
4384 - briefly list changes inside a bundle::
4389 - briefly list changes inside a bundle::
4385
4390
4386 hg in changes.hg -T "{desc|firstline}\\n"
4391 hg in changes.hg -T "{desc|firstline}\\n"
4387
4392
4388 Returns 0 if there are incoming changes, 1 otherwise.
4393 Returns 0 if there are incoming changes, 1 otherwise.
4389 """
4394 """
4390 opts = pycompat.byteskwargs(opts)
4395 opts = pycompat.byteskwargs(opts)
4391 if opts.get(b'graph'):
4396 if opts.get(b'graph'):
4392 logcmdutil.checkunsupportedgraphflags([], opts)
4397 logcmdutil.checkunsupportedgraphflags([], opts)
4393
4398
4394 def display(other, chlist, displayer):
4399 def display(other, chlist, displayer):
4395 revdag = logcmdutil.graphrevs(other, chlist, opts)
4400 revdag = logcmdutil.graphrevs(other, chlist, opts)
4396 logcmdutil.displaygraph(
4401 logcmdutil.displaygraph(
4397 ui, repo, revdag, displayer, graphmod.asciiedges
4402 ui, repo, revdag, displayer, graphmod.asciiedges
4398 )
4403 )
4399
4404
4400 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4405 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4401 return 0
4406 return 0
4402
4407
4403 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'bundle'])
4408 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'bundle'])
4404
4409
4405 if opts.get(b'bookmarks'):
4410 if opts.get(b'bookmarks'):
4406 srcs = urlutil.get_pull_paths(repo, ui, [source])
4411 srcs = urlutil.get_pull_paths(repo, ui, [source])
4407 for path in srcs:
4412 for path in srcs:
4408 # XXX the "branches" options are not used. Should it be used?
4413 # XXX the "branches" options are not used. Should it be used?
4409 other = hg.peer(repo, opts, path)
4414 other = hg.peer(repo, opts, path)
4410 try:
4415 try:
4411 if b'bookmarks' not in other.listkeys(b'namespaces'):
4416 if b'bookmarks' not in other.listkeys(b'namespaces'):
4412 ui.warn(_(b"remote doesn't support bookmarks\n"))
4417 ui.warn(_(b"remote doesn't support bookmarks\n"))
4413 return 0
4418 return 0
4414 ui.pager(b'incoming')
4419 ui.pager(b'incoming')
4415 ui.status(
4420 ui.status(
4416 _(b'comparing with %s\n') % urlutil.hidepassword(path.loc)
4421 _(b'comparing with %s\n') % urlutil.hidepassword(path.loc)
4417 )
4422 )
4418 return bookmarks.incoming(
4423 return bookmarks.incoming(
4419 ui, repo, other, mode=path.bookmarks_mode
4424 ui, repo, other, mode=path.bookmarks_mode
4420 )
4425 )
4421 finally:
4426 finally:
4422 other.close()
4427 other.close()
4423
4428
4424 return hg.incoming(ui, repo, source, opts)
4429 return hg.incoming(ui, repo, source, opts)
4425
4430
4426
4431
4427 @command(
4432 @command(
4428 b'init',
4433 b'init',
4429 remoteopts,
4434 remoteopts,
4430 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4435 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4431 helpcategory=command.CATEGORY_REPO_CREATION,
4436 helpcategory=command.CATEGORY_REPO_CREATION,
4432 helpbasic=True,
4437 helpbasic=True,
4433 norepo=True,
4438 norepo=True,
4434 )
4439 )
4435 def init(ui, dest=b".", **opts):
4440 def init(ui, dest=b".", **opts):
4436 """create a new repository in the given directory
4441 """create a new repository in the given directory
4437
4442
4438 Initialize a new repository in the given directory. If the given
4443 Initialize a new repository in the given directory. If the given
4439 directory does not exist, it will be created.
4444 directory does not exist, it will be created.
4440
4445
4441 If no directory is given, the current directory is used.
4446 If no directory is given, the current directory is used.
4442
4447
4443 It is possible to specify an ``ssh://`` URL as the destination.
4448 It is possible to specify an ``ssh://`` URL as the destination.
4444 See :hg:`help urls` for more information.
4449 See :hg:`help urls` for more information.
4445
4450
4446 Returns 0 on success.
4451 Returns 0 on success.
4447 """
4452 """
4448 opts = pycompat.byteskwargs(opts)
4453 opts = pycompat.byteskwargs(opts)
4449 path = urlutil.get_clone_path_obj(ui, dest)
4454 path = urlutil.get_clone_path_obj(ui, dest)
4450 peer = hg.peer(ui, opts, path, create=True)
4455 peer = hg.peer(ui, opts, path, create=True)
4451 peer.close()
4456 peer.close()
4452
4457
4453
4458
4454 @command(
4459 @command(
4455 b'locate',
4460 b'locate',
4456 [
4461 [
4457 (
4462 (
4458 b'r',
4463 b'r',
4459 b'rev',
4464 b'rev',
4460 b'',
4465 b'',
4461 _(b'search the repository as it is in REV'),
4466 _(b'search the repository as it is in REV'),
4462 _(b'REV'),
4467 _(b'REV'),
4463 ),
4468 ),
4464 (
4469 (
4465 b'0',
4470 b'0',
4466 b'print0',
4471 b'print0',
4467 None,
4472 None,
4468 _(b'end filenames with NUL, for use with xargs'),
4473 _(b'end filenames with NUL, for use with xargs'),
4469 ),
4474 ),
4470 (
4475 (
4471 b'f',
4476 b'f',
4472 b'fullpath',
4477 b'fullpath',
4473 None,
4478 None,
4474 _(b'print complete paths from the filesystem root'),
4479 _(b'print complete paths from the filesystem root'),
4475 ),
4480 ),
4476 ]
4481 ]
4477 + walkopts,
4482 + walkopts,
4478 _(b'[OPTION]... [PATTERN]...'),
4483 _(b'[OPTION]... [PATTERN]...'),
4479 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4484 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4480 )
4485 )
4481 def locate(ui, repo, *pats, **opts):
4486 def locate(ui, repo, *pats, **opts):
4482 """locate files matching specific patterns (DEPRECATED)
4487 """locate files matching specific patterns (DEPRECATED)
4483
4488
4484 Print files under Mercurial control in the working directory whose
4489 Print files under Mercurial control in the working directory whose
4485 names match the given patterns.
4490 names match the given patterns.
4486
4491
4487 By default, this command searches all directories in the working
4492 By default, this command searches all directories in the working
4488 directory. To search just the current directory and its
4493 directory. To search just the current directory and its
4489 subdirectories, use "--include .".
4494 subdirectories, use "--include .".
4490
4495
4491 If no patterns are given to match, this command prints the names
4496 If no patterns are given to match, this command prints the names
4492 of all files under Mercurial control in the working directory.
4497 of all files under Mercurial control in the working directory.
4493
4498
4494 If you want to feed the output of this command into the "xargs"
4499 If you want to feed the output of this command into the "xargs"
4495 command, use the -0 option to both this command and "xargs". This
4500 command, use the -0 option to both this command and "xargs". This
4496 will avoid the problem of "xargs" treating single filenames that
4501 will avoid the problem of "xargs" treating single filenames that
4497 contain whitespace as multiple filenames.
4502 contain whitespace as multiple filenames.
4498
4503
4499 See :hg:`help files` for a more versatile command.
4504 See :hg:`help files` for a more versatile command.
4500
4505
4501 Returns 0 if a match is found, 1 otherwise.
4506 Returns 0 if a match is found, 1 otherwise.
4502 """
4507 """
4503 if opts.get('print0'):
4508 if opts.get('print0'):
4504 end = b'\0'
4509 end = b'\0'
4505 else:
4510 else:
4506 end = b'\n'
4511 end = b'\n'
4507 ctx = logcmdutil.revsingle(repo, opts.get('rev'), None)
4512 ctx = logcmdutil.revsingle(repo, opts.get('rev'), None)
4508
4513
4509 ret = 1
4514 ret = 1
4510 m = scmutil.match(
4515 m = scmutil.match(
4511 ctx,
4516 ctx,
4512 pats,
4517 pats,
4513 pycompat.byteskwargs(opts),
4518 pycompat.byteskwargs(opts),
4514 default=b'relglob',
4519 default=b'relglob',
4515 badfn=lambda x, y: False,
4520 badfn=lambda x, y: False,
4516 )
4521 )
4517
4522
4518 ui.pager(b'locate')
4523 ui.pager(b'locate')
4519 if ctx.rev() is None:
4524 if ctx.rev() is None:
4520 # When run on the working copy, "locate" includes removed files, so
4525 # When run on the working copy, "locate" includes removed files, so
4521 # we get the list of files from the dirstate.
4526 # we get the list of files from the dirstate.
4522 filesgen = sorted(repo.dirstate.matches(m))
4527 filesgen = sorted(repo.dirstate.matches(m))
4523 else:
4528 else:
4524 filesgen = ctx.matches(m)
4529 filesgen = ctx.matches(m)
4525 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4530 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4526 for abs in filesgen:
4531 for abs in filesgen:
4527 if opts.get('fullpath'):
4532 if opts.get('fullpath'):
4528 ui.write(repo.wjoin(abs), end)
4533 ui.write(repo.wjoin(abs), end)
4529 else:
4534 else:
4530 ui.write(uipathfn(abs), end)
4535 ui.write(uipathfn(abs), end)
4531 ret = 0
4536 ret = 0
4532
4537
4533 return ret
4538 return ret
4534
4539
4535
4540
4536 @command(
4541 @command(
4537 b'log|history',
4542 b'log|history',
4538 [
4543 [
4539 (
4544 (
4540 b'f',
4545 b'f',
4541 b'follow',
4546 b'follow',
4542 None,
4547 None,
4543 _(
4548 _(
4544 b'follow changeset history, or file history across copies and renames'
4549 b'follow changeset history, or file history across copies and renames'
4545 ),
4550 ),
4546 ),
4551 ),
4547 (
4552 (
4548 b'',
4553 b'',
4549 b'follow-first',
4554 b'follow-first',
4550 None,
4555 None,
4551 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4556 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4552 ),
4557 ),
4553 (
4558 (
4554 b'd',
4559 b'd',
4555 b'date',
4560 b'date',
4556 b'',
4561 b'',
4557 _(b'show revisions matching date spec'),
4562 _(b'show revisions matching date spec'),
4558 _(b'DATE'),
4563 _(b'DATE'),
4559 ),
4564 ),
4560 (b'C', b'copies', None, _(b'show copied files')),
4565 (b'C', b'copies', None, _(b'show copied files')),
4561 (
4566 (
4562 b'k',
4567 b'k',
4563 b'keyword',
4568 b'keyword',
4564 [],
4569 [],
4565 _(b'do case-insensitive search for a given text'),
4570 _(b'do case-insensitive search for a given text'),
4566 _(b'TEXT'),
4571 _(b'TEXT'),
4567 ),
4572 ),
4568 (
4573 (
4569 b'r',
4574 b'r',
4570 b'rev',
4575 b'rev',
4571 [],
4576 [],
4572 _(b'revisions to select or follow from'),
4577 _(b'revisions to select or follow from'),
4573 _(b'REV'),
4578 _(b'REV'),
4574 ),
4579 ),
4575 (
4580 (
4576 b'L',
4581 b'L',
4577 b'line-range',
4582 b'line-range',
4578 [],
4583 [],
4579 _(b'follow line range of specified file (EXPERIMENTAL)'),
4584 _(b'follow line range of specified file (EXPERIMENTAL)'),
4580 _(b'FILE,RANGE'),
4585 _(b'FILE,RANGE'),
4581 ),
4586 ),
4582 (
4587 (
4583 b'',
4588 b'',
4584 b'removed',
4589 b'removed',
4585 None,
4590 None,
4586 _(b'include revisions where files were removed'),
4591 _(b'include revisions where files were removed'),
4587 ),
4592 ),
4588 (
4593 (
4589 b'm',
4594 b'm',
4590 b'only-merges',
4595 b'only-merges',
4591 None,
4596 None,
4592 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4597 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4593 ),
4598 ),
4594 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4599 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4595 (
4600 (
4596 b'',
4601 b'',
4597 b'only-branch',
4602 b'only-branch',
4598 [],
4603 [],
4599 _(
4604 _(
4600 b'show only changesets within the given named branch (DEPRECATED)'
4605 b'show only changesets within the given named branch (DEPRECATED)'
4601 ),
4606 ),
4602 _(b'BRANCH'),
4607 _(b'BRANCH'),
4603 ),
4608 ),
4604 (
4609 (
4605 b'b',
4610 b'b',
4606 b'branch',
4611 b'branch',
4607 [],
4612 [],
4608 _(b'show changesets within the given named branch'),
4613 _(b'show changesets within the given named branch'),
4609 _(b'BRANCH'),
4614 _(b'BRANCH'),
4610 ),
4615 ),
4611 (
4616 (
4612 b'B',
4617 b'B',
4613 b'bookmark',
4618 b'bookmark',
4614 [],
4619 [],
4615 _(b"show changesets within the given bookmark"),
4620 _(b"show changesets within the given bookmark"),
4616 _(b'BOOKMARK'),
4621 _(b'BOOKMARK'),
4617 ),
4622 ),
4618 (
4623 (
4619 b'P',
4624 b'P',
4620 b'prune',
4625 b'prune',
4621 [],
4626 [],
4622 _(b'do not display revision or any of its ancestors'),
4627 _(b'do not display revision or any of its ancestors'),
4623 _(b'REV'),
4628 _(b'REV'),
4624 ),
4629 ),
4625 ]
4630 ]
4626 + logopts
4631 + logopts
4627 + walkopts,
4632 + walkopts,
4628 _(b'[OPTION]... [FILE]'),
4633 _(b'[OPTION]... [FILE]'),
4629 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4634 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4630 helpbasic=True,
4635 helpbasic=True,
4631 inferrepo=True,
4636 inferrepo=True,
4632 intents={INTENT_READONLY},
4637 intents={INTENT_READONLY},
4633 )
4638 )
4634 def log(ui, repo, *pats, **opts):
4639 def log(ui, repo, *pats, **opts):
4635 """show revision history of entire repository or files
4640 """show revision history of entire repository or files
4636
4641
4637 Print the revision history of the specified files or the entire
4642 Print the revision history of the specified files or the entire
4638 project.
4643 project.
4639
4644
4640 If no revision range is specified, the default is ``tip:0`` unless
4645 If no revision range is specified, the default is ``tip:0`` unless
4641 --follow is set.
4646 --follow is set.
4642
4647
4643 File history is shown without following rename or copy history of
4648 File history is shown without following rename or copy history of
4644 files. Use -f/--follow with a filename to follow history across
4649 files. Use -f/--follow with a filename to follow history across
4645 renames and copies. --follow without a filename will only show
4650 renames and copies. --follow without a filename will only show
4646 ancestors of the starting revisions. The starting revisions can be
4651 ancestors of the starting revisions. The starting revisions can be
4647 specified by -r/--rev, which default to the working directory parent.
4652 specified by -r/--rev, which default to the working directory parent.
4648
4653
4649 By default this command prints revision number and changeset id,
4654 By default this command prints revision number and changeset id,
4650 tags, non-trivial parents, user, date and time, and a summary for
4655 tags, non-trivial parents, user, date and time, and a summary for
4651 each commit. When the -v/--verbose switch is used, the list of
4656 each commit. When the -v/--verbose switch is used, the list of
4652 changed files and full commit message are shown.
4657 changed files and full commit message are shown.
4653
4658
4654 With --graph the revisions are shown as an ASCII art DAG with the most
4659 With --graph the revisions are shown as an ASCII art DAG with the most
4655 recent changeset at the top.
4660 recent changeset at the top.
4656 'o' is a changeset, '@' is a working directory parent, '%' is a changeset
4661 'o' is a changeset, '@' is a working directory parent, '%' is a changeset
4657 involved in an unresolved merge conflict, '_' closes a branch,
4662 involved in an unresolved merge conflict, '_' closes a branch,
4658 'x' is obsolete, '*' is unstable, and '+' represents a fork where the
4663 'x' is obsolete, '*' is unstable, and '+' represents a fork where the
4659 changeset from the lines below is a parent of the 'o' merge on the same
4664 changeset from the lines below is a parent of the 'o' merge on the same
4660 line.
4665 line.
4661 Paths in the DAG are represented with '|', '/' and so forth. ':' in place
4666 Paths in the DAG are represented with '|', '/' and so forth. ':' in place
4662 of a '|' indicates one or more revisions in a path are omitted.
4667 of a '|' indicates one or more revisions in a path are omitted.
4663
4668
4664 .. container:: verbose
4669 .. container:: verbose
4665
4670
4666 Use -L/--line-range FILE,M:N options to follow the history of lines
4671 Use -L/--line-range FILE,M:N options to follow the history of lines
4667 from M to N in FILE. With -p/--patch only diff hunks affecting
4672 from M to N in FILE. With -p/--patch only diff hunks affecting
4668 specified line range will be shown. This option requires --follow;
4673 specified line range will be shown. This option requires --follow;
4669 it can be specified multiple times. Currently, this option is not
4674 it can be specified multiple times. Currently, this option is not
4670 compatible with --graph. This option is experimental.
4675 compatible with --graph. This option is experimental.
4671
4676
4672 .. note::
4677 .. note::
4673
4678
4674 :hg:`log --patch` may generate unexpected diff output for merge
4679 :hg:`log --patch` may generate unexpected diff output for merge
4675 changesets, as it will only compare the merge changeset against
4680 changesets, as it will only compare the merge changeset against
4676 its first parent. Also, only files different from BOTH parents
4681 its first parent. Also, only files different from BOTH parents
4677 will appear in files:.
4682 will appear in files:.
4678
4683
4679 .. note::
4684 .. note::
4680
4685
4681 For performance reasons, :hg:`log FILE` may omit duplicate changes
4686 For performance reasons, :hg:`log FILE` may omit duplicate changes
4682 made on branches and will not show removals or mode changes. To
4687 made on branches and will not show removals or mode changes. To
4683 see all such changes, use the --removed switch.
4688 see all such changes, use the --removed switch.
4684
4689
4685 .. container:: verbose
4690 .. container:: verbose
4686
4691
4687 .. note::
4692 .. note::
4688
4693
4689 The history resulting from -L/--line-range options depends on diff
4694 The history resulting from -L/--line-range options depends on diff
4690 options; for instance if white-spaces are ignored, respective changes
4695 options; for instance if white-spaces are ignored, respective changes
4691 with only white-spaces in specified line range will not be listed.
4696 with only white-spaces in specified line range will not be listed.
4692
4697
4693 .. container:: verbose
4698 .. container:: verbose
4694
4699
4695 Some examples:
4700 Some examples:
4696
4701
4697 - changesets with full descriptions and file lists::
4702 - changesets with full descriptions and file lists::
4698
4703
4699 hg log -v
4704 hg log -v
4700
4705
4701 - changesets ancestral to the working directory::
4706 - changesets ancestral to the working directory::
4702
4707
4703 hg log -f
4708 hg log -f
4704
4709
4705 - last 10 commits on the current branch::
4710 - last 10 commits on the current branch::
4706
4711
4707 hg log -l 10 -b .
4712 hg log -l 10 -b .
4708
4713
4709 - changesets showing all modifications of a file, including removals::
4714 - changesets showing all modifications of a file, including removals::
4710
4715
4711 hg log --removed file.c
4716 hg log --removed file.c
4712
4717
4713 - all changesets that touch a directory, with diffs, excluding merges::
4718 - all changesets that touch a directory, with diffs, excluding merges::
4714
4719
4715 hg log -Mp lib/
4720 hg log -Mp lib/
4716
4721
4717 - all revision numbers that match a keyword::
4722 - all revision numbers that match a keyword::
4718
4723
4719 hg log -k bug --template "{rev}\\n"
4724 hg log -k bug --template "{rev}\\n"
4720
4725
4721 - the full hash identifier of the working directory parent::
4726 - the full hash identifier of the working directory parent::
4722
4727
4723 hg log -r . --template "{node}\\n"
4728 hg log -r . --template "{node}\\n"
4724
4729
4725 - list available log templates::
4730 - list available log templates::
4726
4731
4727 hg log -T list
4732 hg log -T list
4728
4733
4729 - check if a given changeset is included in a tagged release::
4734 - check if a given changeset is included in a tagged release::
4730
4735
4731 hg log -r "a21ccf and ancestor(1.9)"
4736 hg log -r "a21ccf and ancestor(1.9)"
4732
4737
4733 - find all changesets by some user in a date range::
4738 - find all changesets by some user in a date range::
4734
4739
4735 hg log -k alice -d "may 2008 to jul 2008"
4740 hg log -k alice -d "may 2008 to jul 2008"
4736
4741
4737 - summary of all changesets after the last tag::
4742 - summary of all changesets after the last tag::
4738
4743
4739 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4744 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4740
4745
4741 - changesets touching lines 13 to 23 for file.c::
4746 - changesets touching lines 13 to 23 for file.c::
4742
4747
4743 hg log -L file.c,13:23
4748 hg log -L file.c,13:23
4744
4749
4745 - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of
4750 - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of
4746 main.c with patch::
4751 main.c with patch::
4747
4752
4748 hg log -L file.c,13:23 -L main.c,2:6 -p
4753 hg log -L file.c,13:23 -L main.c,2:6 -p
4749
4754
4750 See :hg:`help dates` for a list of formats valid for -d/--date.
4755 See :hg:`help dates` for a list of formats valid for -d/--date.
4751
4756
4752 See :hg:`help revisions` for more about specifying and ordering
4757 See :hg:`help revisions` for more about specifying and ordering
4753 revisions.
4758 revisions.
4754
4759
4755 See :hg:`help templates` for more about pre-packaged styles and
4760 See :hg:`help templates` for more about pre-packaged styles and
4756 specifying custom templates. The default template used by the log
4761 specifying custom templates. The default template used by the log
4757 command can be customized via the ``command-templates.log`` configuration
4762 command can be customized via the ``command-templates.log`` configuration
4758 setting.
4763 setting.
4759
4764
4760 Returns 0 on success.
4765 Returns 0 on success.
4761
4766
4762 """
4767 """
4763 opts = pycompat.byteskwargs(opts)
4768 opts = pycompat.byteskwargs(opts)
4764 linerange = opts.get(b'line_range')
4769 linerange = opts.get(b'line_range')
4765
4770
4766 if linerange and not opts.get(b'follow'):
4771 if linerange and not opts.get(b'follow'):
4767 raise error.InputError(_(b'--line-range requires --follow'))
4772 raise error.InputError(_(b'--line-range requires --follow'))
4768
4773
4769 if linerange and pats:
4774 if linerange and pats:
4770 # TODO: take pats as patterns with no line-range filter
4775 # TODO: take pats as patterns with no line-range filter
4771 raise error.InputError(
4776 raise error.InputError(
4772 _(b'FILE arguments are not compatible with --line-range option')
4777 _(b'FILE arguments are not compatible with --line-range option')
4773 )
4778 )
4774
4779
4775 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4780 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4776 walk_opts = logcmdutil.parseopts(ui, pats, opts)
4781 walk_opts = logcmdutil.parseopts(ui, pats, opts)
4777 revs, differ = logcmdutil.getrevs(repo, walk_opts)
4782 revs, differ = logcmdutil.getrevs(repo, walk_opts)
4778 if linerange:
4783 if linerange:
4779 # TODO: should follow file history from logcmdutil._initialrevs(),
4784 # TODO: should follow file history from logcmdutil._initialrevs(),
4780 # then filter the result by logcmdutil._makerevset() and --limit
4785 # then filter the result by logcmdutil._makerevset() and --limit
4781 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4786 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4782
4787
4783 getcopies = None
4788 getcopies = None
4784 if opts.get(b'copies'):
4789 if opts.get(b'copies'):
4785 endrev = None
4790 endrev = None
4786 if revs:
4791 if revs:
4787 endrev = revs.max() + 1
4792 endrev = revs.max() + 1
4788 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4793 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4789
4794
4790 ui.pager(b'log')
4795 ui.pager(b'log')
4791 displayer = logcmdutil.changesetdisplayer(
4796 displayer = logcmdutil.changesetdisplayer(
4792 ui, repo, opts, differ, buffered=True
4797 ui, repo, opts, differ, buffered=True
4793 )
4798 )
4794 if opts.get(b'graph'):
4799 if opts.get(b'graph'):
4795 displayfn = logcmdutil.displaygraphrevs
4800 displayfn = logcmdutil.displaygraphrevs
4796 else:
4801 else:
4797 displayfn = logcmdutil.displayrevs
4802 displayfn = logcmdutil.displayrevs
4798 displayfn(ui, repo, revs, displayer, getcopies)
4803 displayfn(ui, repo, revs, displayer, getcopies)
4799
4804
4800
4805
4801 @command(
4806 @command(
4802 b'manifest',
4807 b'manifest',
4803 [
4808 [
4804 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4809 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4805 (b'', b'all', False, _(b"list files from all revisions")),
4810 (b'', b'all', False, _(b"list files from all revisions")),
4806 ]
4811 ]
4807 + formatteropts,
4812 + formatteropts,
4808 _(b'[-r REV]'),
4813 _(b'[-r REV]'),
4809 helpcategory=command.CATEGORY_MAINTENANCE,
4814 helpcategory=command.CATEGORY_MAINTENANCE,
4810 intents={INTENT_READONLY},
4815 intents={INTENT_READONLY},
4811 )
4816 )
4812 def manifest(ui, repo, node=None, rev=None, **opts):
4817 def manifest(ui, repo, node=None, rev=None, **opts):
4813 """output the current or given revision of the project manifest
4818 """output the current or given revision of the project manifest
4814
4819
4815 Print a list of version controlled files for the given revision.
4820 Print a list of version controlled files for the given revision.
4816 If no revision is given, the first parent of the working directory
4821 If no revision is given, the first parent of the working directory
4817 is used, or the null revision if no revision is checked out.
4822 is used, or the null revision if no revision is checked out.
4818
4823
4819 With -v, print file permissions, symlink and executable bits.
4824 With -v, print file permissions, symlink and executable bits.
4820 With --debug, print file revision hashes.
4825 With --debug, print file revision hashes.
4821
4826
4822 If option --all is specified, the list of all files from all revisions
4827 If option --all is specified, the list of all files from all revisions
4823 is printed. This includes deleted and renamed files.
4828 is printed. This includes deleted and renamed files.
4824
4829
4825 Returns 0 on success.
4830 Returns 0 on success.
4826 """
4831 """
4827 fm = ui.formatter(b'manifest', pycompat.byteskwargs(opts))
4832 fm = ui.formatter(b'manifest', pycompat.byteskwargs(opts))
4828
4833
4829 if opts.get('all'):
4834 if opts.get('all'):
4830 if rev or node:
4835 if rev or node:
4831 raise error.InputError(_(b"can't specify a revision with --all"))
4836 raise error.InputError(_(b"can't specify a revision with --all"))
4832
4837
4833 res = set()
4838 res = set()
4834 for rev in repo:
4839 for rev in repo:
4835 ctx = repo[rev]
4840 ctx = repo[rev]
4836 res |= set(ctx.files())
4841 res |= set(ctx.files())
4837
4842
4838 ui.pager(b'manifest')
4843 ui.pager(b'manifest')
4839 for f in sorted(res):
4844 for f in sorted(res):
4840 fm.startitem()
4845 fm.startitem()
4841 fm.write(b"path", b'%s\n', f)
4846 fm.write(b"path", b'%s\n', f)
4842 fm.end()
4847 fm.end()
4843 return
4848 return
4844
4849
4845 if rev and node:
4850 if rev and node:
4846 raise error.InputError(_(b"please specify just one revision"))
4851 raise error.InputError(_(b"please specify just one revision"))
4847
4852
4848 if not node:
4853 if not node:
4849 node = rev
4854 node = rev
4850
4855
4851 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4856 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4852 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4857 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4853 if node:
4858 if node:
4854 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4859 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4855 ctx = logcmdutil.revsingle(repo, node)
4860 ctx = logcmdutil.revsingle(repo, node)
4856 mf = ctx.manifest()
4861 mf = ctx.manifest()
4857 ui.pager(b'manifest')
4862 ui.pager(b'manifest')
4858 for f in ctx:
4863 for f in ctx:
4859 fm.startitem()
4864 fm.startitem()
4860 fm.context(ctx=ctx)
4865 fm.context(ctx=ctx)
4861 fl = ctx[f].flags()
4866 fl = ctx[f].flags()
4862 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4867 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4863 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4868 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4864 fm.write(b'path', b'%s\n', f)
4869 fm.write(b'path', b'%s\n', f)
4865 fm.end()
4870 fm.end()
4866
4871
4867
4872
4868 @command(
4873 @command(
4869 b'merge',
4874 b'merge',
4870 [
4875 [
4871 (
4876 (
4872 b'f',
4877 b'f',
4873 b'force',
4878 b'force',
4874 None,
4879 None,
4875 _(b'force a merge including outstanding changes (DEPRECATED)'),
4880 _(b'force a merge including outstanding changes (DEPRECATED)'),
4876 ),
4881 ),
4877 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4882 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4878 (
4883 (
4879 b'P',
4884 b'P',
4880 b'preview',
4885 b'preview',
4881 None,
4886 None,
4882 _(b'review revisions to merge (no merge is performed)'),
4887 _(b'review revisions to merge (no merge is performed)'),
4883 ),
4888 ),
4884 (b'', b'abort', None, _(b'abort the ongoing merge')),
4889 (b'', b'abort', None, _(b'abort the ongoing merge')),
4885 ]
4890 ]
4886 + mergetoolopts,
4891 + mergetoolopts,
4887 _(b'[-P] [[-r] REV]'),
4892 _(b'[-P] [[-r] REV]'),
4888 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4893 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4889 helpbasic=True,
4894 helpbasic=True,
4890 )
4895 )
4891 def merge(ui, repo, node=None, **opts):
4896 def merge(ui, repo, node=None, **opts):
4892 """merge another revision into working directory
4897 """merge another revision into working directory
4893
4898
4894 The current working directory is updated with all changes made in
4899 The current working directory is updated with all changes made in
4895 the requested revision since the last common predecessor revision.
4900 the requested revision since the last common predecessor revision.
4896
4901
4897 Files that changed between either parent are marked as changed for
4902 Files that changed between either parent are marked as changed for
4898 the next commit and a commit must be performed before any further
4903 the next commit and a commit must be performed before any further
4899 updates to the repository are allowed. The next commit will have
4904 updates to the repository are allowed. The next commit will have
4900 two parents.
4905 two parents.
4901
4906
4902 ``--tool`` can be used to specify the merge tool used for file
4907 ``--tool`` can be used to specify the merge tool used for file
4903 merges. It overrides the HGMERGE environment variable and your
4908 merges. It overrides the HGMERGE environment variable and your
4904 configuration files. See :hg:`help merge-tools` for options.
4909 configuration files. See :hg:`help merge-tools` for options.
4905
4910
4906 If no revision is specified, the working directory's parent is a
4911 If no revision is specified, the working directory's parent is a
4907 head revision, and the current branch contains exactly one other
4912 head revision, and the current branch contains exactly one other
4908 head, the other head is merged with by default. Otherwise, an
4913 head, the other head is merged with by default. Otherwise, an
4909 explicit revision with which to merge must be provided.
4914 explicit revision with which to merge must be provided.
4910
4915
4911 See :hg:`help resolve` for information on handling file conflicts.
4916 See :hg:`help resolve` for information on handling file conflicts.
4912
4917
4913 To undo an uncommitted merge, use :hg:`merge --abort` which
4918 To undo an uncommitted merge, use :hg:`merge --abort` which
4914 will check out a clean copy of the original merge parent, losing
4919 will check out a clean copy of the original merge parent, losing
4915 all changes.
4920 all changes.
4916
4921
4917 Returns 0 on success, 1 if there are unresolved files.
4922 Returns 0 on success, 1 if there are unresolved files.
4918 """
4923 """
4919
4924
4920 abort = opts.get('abort')
4925 abort = opts.get('abort')
4921 if abort and repo.dirstate.p2() == repo.nullid:
4926 if abort and repo.dirstate.p2() == repo.nullid:
4922 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4927 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4923 cmdutil.check_incompatible_arguments(opts, 'abort', ['rev', 'preview'])
4928 cmdutil.check_incompatible_arguments(opts, 'abort', ['rev', 'preview'])
4924 if abort:
4929 if abort:
4925 state = cmdutil.getunfinishedstate(repo)
4930 state = cmdutil.getunfinishedstate(repo)
4926 if state and state._opname != b'merge':
4931 if state and state._opname != b'merge':
4927 raise error.StateError(
4932 raise error.StateError(
4928 _(b'cannot abort merge with %s in progress') % (state._opname),
4933 _(b'cannot abort merge with %s in progress') % (state._opname),
4929 hint=state.hint(),
4934 hint=state.hint(),
4930 )
4935 )
4931 if node:
4936 if node:
4932 raise error.InputError(_(b"cannot specify a node with --abort"))
4937 raise error.InputError(_(b"cannot specify a node with --abort"))
4933 return hg.abortmerge(repo.ui, repo)
4938 return hg.abortmerge(repo.ui, repo)
4934
4939
4935 if opts.get('rev') and node:
4940 if opts.get('rev') and node:
4936 raise error.InputError(_(b"please specify just one revision"))
4941 raise error.InputError(_(b"please specify just one revision"))
4937 if not node:
4942 if not node:
4938 node = opts.get('rev')
4943 node = opts.get('rev')
4939
4944
4940 if node:
4945 if node:
4941 ctx = logcmdutil.revsingle(repo, node)
4946 ctx = logcmdutil.revsingle(repo, node)
4942 else:
4947 else:
4943 if ui.configbool(b'commands', b'merge.require-rev'):
4948 if ui.configbool(b'commands', b'merge.require-rev'):
4944 raise error.InputError(
4949 raise error.InputError(
4945 _(
4950 _(
4946 b'configuration requires specifying revision to merge '
4951 b'configuration requires specifying revision to merge '
4947 b'with'
4952 b'with'
4948 )
4953 )
4949 )
4954 )
4950 ctx = repo[destutil.destmerge(repo)]
4955 ctx = repo[destutil.destmerge(repo)]
4951
4956
4952 if ctx.node() is None:
4957 if ctx.node() is None:
4953 raise error.InputError(
4958 raise error.InputError(
4954 _(b'merging with the working copy has no effect')
4959 _(b'merging with the working copy has no effect')
4955 )
4960 )
4956
4961
4957 if opts.get('preview'):
4962 if opts.get('preview'):
4958 # find nodes that are ancestors of p2 but not of p1
4963 # find nodes that are ancestors of p2 but not of p1
4959 p1 = repo[b'.'].node()
4964 p1 = repo[b'.'].node()
4960 p2 = ctx.node()
4965 p2 = ctx.node()
4961 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4966 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4962
4967
4963 displayer = logcmdutil.changesetdisplayer(
4968 displayer = logcmdutil.changesetdisplayer(
4964 ui, repo, pycompat.byteskwargs(opts)
4969 ui, repo, pycompat.byteskwargs(opts)
4965 )
4970 )
4966 for node in nodes:
4971 for node in nodes:
4967 displayer.show(repo[node])
4972 displayer.show(repo[node])
4968 displayer.close()
4973 displayer.close()
4969 return 0
4974 return 0
4970
4975
4971 # ui.forcemerge is an internal variable, do not document
4976 # ui.forcemerge is an internal variable, do not document
4972 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
4977 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
4973 with ui.configoverride(overrides, b'merge'):
4978 with ui.configoverride(overrides, b'merge'):
4974 force = opts.get('force')
4979 force = opts.get('force')
4975 labels = [b'working copy', b'merge rev', b'common ancestor']
4980 labels = [b'working copy', b'merge rev', b'common ancestor']
4976 return hg.merge(ctx, force=force, labels=labels)
4981 return hg.merge(ctx, force=force, labels=labels)
4977
4982
4978
4983
4979 statemod.addunfinished(
4984 statemod.addunfinished(
4980 b'merge',
4985 b'merge',
4981 fname=None,
4986 fname=None,
4982 clearable=True,
4987 clearable=True,
4983 allowcommit=True,
4988 allowcommit=True,
4984 cmdmsg=_(b'outstanding uncommitted merge'),
4989 cmdmsg=_(b'outstanding uncommitted merge'),
4985 abortfunc=hg.abortmerge,
4990 abortfunc=hg.abortmerge,
4986 statushint=_(
4991 statushint=_(
4987 b'To continue: hg commit\nTo abort: hg merge --abort'
4992 b'To continue: hg commit\nTo abort: hg merge --abort'
4988 ),
4993 ),
4989 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4994 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4990 )
4995 )
4991
4996
4992
4997
4993 @command(
4998 @command(
4994 b'outgoing|out',
4999 b'outgoing|out',
4995 [
5000 [
4996 (
5001 (
4997 b'f',
5002 b'f',
4998 b'force',
5003 b'force',
4999 None,
5004 None,
5000 _(b'run even when the destination is unrelated'),
5005 _(b'run even when the destination is unrelated'),
5001 ),
5006 ),
5002 (
5007 (
5003 b'r',
5008 b'r',
5004 b'rev',
5009 b'rev',
5005 [],
5010 [],
5006 _(b'a changeset intended to be included in the destination'),
5011 _(b'a changeset intended to be included in the destination'),
5007 _(b'REV'),
5012 _(b'REV'),
5008 ),
5013 ),
5009 (b'n', b'newest-first', None, _(b'show newest record first')),
5014 (b'n', b'newest-first', None, _(b'show newest record first')),
5010 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
5015 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
5011 (
5016 (
5012 b'b',
5017 b'b',
5013 b'branch',
5018 b'branch',
5014 [],
5019 [],
5015 _(b'a specific branch you would like to push'),
5020 _(b'a specific branch you would like to push'),
5016 _(b'BRANCH'),
5021 _(b'BRANCH'),
5017 ),
5022 ),
5018 ]
5023 ]
5019 + logopts
5024 + logopts
5020 + remoteopts
5025 + remoteopts
5021 + subrepoopts,
5026 + subrepoopts,
5022 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]...'),
5027 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]...'),
5023 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5028 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5024 )
5029 )
5025 def outgoing(ui, repo, *dests, **opts):
5030 def outgoing(ui, repo, *dests, **opts):
5026 """show changesets not found in the destination
5031 """show changesets not found in the destination
5027
5032
5028 Show changesets not found in the specified destination repository
5033 Show changesets not found in the specified destination repository
5029 or the default push location. These are the changesets that would
5034 or the default push location. These are the changesets that would
5030 be pushed if a push was requested.
5035 be pushed if a push was requested.
5031
5036
5032 See pull for details of valid destination formats.
5037 See pull for details of valid destination formats.
5033
5038
5034 .. container:: verbose
5039 .. container:: verbose
5035
5040
5036 With -B/--bookmarks, the result of bookmark comparison between
5041 With -B/--bookmarks, the result of bookmark comparison between
5037 local and remote repositories is displayed. With -v/--verbose,
5042 local and remote repositories is displayed. With -v/--verbose,
5038 status is also displayed for each bookmark like below::
5043 status is also displayed for each bookmark like below::
5039
5044
5040 BM1 01234567890a added
5045 BM1 01234567890a added
5041 BM2 deleted
5046 BM2 deleted
5042 BM3 234567890abc advanced
5047 BM3 234567890abc advanced
5043 BM4 34567890abcd diverged
5048 BM4 34567890abcd diverged
5044 BM5 4567890abcde changed
5049 BM5 4567890abcde changed
5045
5050
5046 The action taken when pushing depends on the
5051 The action taken when pushing depends on the
5047 status of each bookmark:
5052 status of each bookmark:
5048
5053
5049 :``added``: push with ``-B`` will create it
5054 :``added``: push with ``-B`` will create it
5050 :``deleted``: push with ``-B`` will delete it
5055 :``deleted``: push with ``-B`` will delete it
5051 :``advanced``: push will update it
5056 :``advanced``: push will update it
5052 :``diverged``: push with ``-B`` will update it
5057 :``diverged``: push with ``-B`` will update it
5053 :``changed``: push with ``-B`` will update it
5058 :``changed``: push with ``-B`` will update it
5054
5059
5055 From the point of view of pushing behavior, bookmarks
5060 From the point of view of pushing behavior, bookmarks
5056 existing only in the remote repository are treated as
5061 existing only in the remote repository are treated as
5057 ``deleted``, even if it is in fact added remotely.
5062 ``deleted``, even if it is in fact added remotely.
5058
5063
5059 Returns 0 if there are outgoing changes, 1 otherwise.
5064 Returns 0 if there are outgoing changes, 1 otherwise.
5060 """
5065 """
5061 opts = pycompat.byteskwargs(opts)
5066 opts = pycompat.byteskwargs(opts)
5062 if opts.get(b'bookmarks'):
5067 if opts.get(b'bookmarks'):
5063 for path in urlutil.get_push_paths(repo, ui, dests):
5068 for path in urlutil.get_push_paths(repo, ui, dests):
5064 other = hg.peer(repo, opts, path)
5069 other = hg.peer(repo, opts, path)
5065 try:
5070 try:
5066 if b'bookmarks' not in other.listkeys(b'namespaces'):
5071 if b'bookmarks' not in other.listkeys(b'namespaces'):
5067 ui.warn(_(b"remote doesn't support bookmarks\n"))
5072 ui.warn(_(b"remote doesn't support bookmarks\n"))
5068 return 0
5073 return 0
5069 ui.status(
5074 ui.status(
5070 _(b'comparing with %s\n') % urlutil.hidepassword(path.loc)
5075 _(b'comparing with %s\n') % urlutil.hidepassword(path.loc)
5071 )
5076 )
5072 ui.pager(b'outgoing')
5077 ui.pager(b'outgoing')
5073 return bookmarks.outgoing(ui, repo, other)
5078 return bookmarks.outgoing(ui, repo, other)
5074 finally:
5079 finally:
5075 other.close()
5080 other.close()
5076
5081
5077 return hg.outgoing(ui, repo, dests, opts)
5082 return hg.outgoing(ui, repo, dests, opts)
5078
5083
5079
5084
5080 @command(
5085 @command(
5081 b'parents',
5086 b'parents',
5082 [
5087 [
5083 (
5088 (
5084 b'r',
5089 b'r',
5085 b'rev',
5090 b'rev',
5086 b'',
5091 b'',
5087 _(b'show parents of the specified revision'),
5092 _(b'show parents of the specified revision'),
5088 _(b'REV'),
5093 _(b'REV'),
5089 ),
5094 ),
5090 ]
5095 ]
5091 + templateopts,
5096 + templateopts,
5092 _(b'[-r REV] [FILE]'),
5097 _(b'[-r REV] [FILE]'),
5093 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
5098 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
5094 inferrepo=True,
5099 inferrepo=True,
5095 )
5100 )
5096 def parents(ui, repo, file_=None, **opts):
5101 def parents(ui, repo, file_=None, **opts):
5097 """show the parents of the working directory or revision (DEPRECATED)
5102 """show the parents of the working directory or revision (DEPRECATED)
5098
5103
5099 Print the working directory's parent revisions. If a revision is
5104 Print the working directory's parent revisions. If a revision is
5100 given via -r/--rev, the parent of that revision will be printed.
5105 given via -r/--rev, the parent of that revision will be printed.
5101 If a file argument is given, the revision in which the file was
5106 If a file argument is given, the revision in which the file was
5102 last changed (before the working directory revision or the
5107 last changed (before the working directory revision or the
5103 argument to --rev if given) is printed.
5108 argument to --rev if given) is printed.
5104
5109
5105 This command is equivalent to::
5110 This command is equivalent to::
5106
5111
5107 hg log -r "p1()+p2()" or
5112 hg log -r "p1()+p2()" or
5108 hg log -r "p1(REV)+p2(REV)" or
5113 hg log -r "p1(REV)+p2(REV)" or
5109 hg log -r "max(::p1() and file(FILE))+max(::p2() and file(FILE))" or
5114 hg log -r "max(::p1() and file(FILE))+max(::p2() and file(FILE))" or
5110 hg log -r "max(::p1(REV) and file(FILE))+max(::p2(REV) and file(FILE))"
5115 hg log -r "max(::p1(REV) and file(FILE))+max(::p2(REV) and file(FILE))"
5111
5116
5112 See :hg:`summary` and :hg:`help revsets` for related information.
5117 See :hg:`summary` and :hg:`help revsets` for related information.
5113
5118
5114 Returns 0 on success.
5119 Returns 0 on success.
5115 """
5120 """
5116
5121
5117 opts = pycompat.byteskwargs(opts)
5122 opts = pycompat.byteskwargs(opts)
5118 rev = opts.get(b'rev')
5123 rev = opts.get(b'rev')
5119 if rev:
5124 if rev:
5120 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
5125 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
5121 ctx = logcmdutil.revsingle(repo, rev, None)
5126 ctx = logcmdutil.revsingle(repo, rev, None)
5122
5127
5123 if file_:
5128 if file_:
5124 m = scmutil.match(ctx, (file_,), opts)
5129 m = scmutil.match(ctx, (file_,), opts)
5125 if m.anypats() or len(m.files()) != 1:
5130 if m.anypats() or len(m.files()) != 1:
5126 raise error.InputError(_(b'can only specify an explicit filename'))
5131 raise error.InputError(_(b'can only specify an explicit filename'))
5127 file_ = m.files()[0]
5132 file_ = m.files()[0]
5128 filenodes = []
5133 filenodes = []
5129 for cp in ctx.parents():
5134 for cp in ctx.parents():
5130 if not cp:
5135 if not cp:
5131 continue
5136 continue
5132 try:
5137 try:
5133 filenodes.append(cp.filenode(file_))
5138 filenodes.append(cp.filenode(file_))
5134 except error.LookupError:
5139 except error.LookupError:
5135 pass
5140 pass
5136 if not filenodes:
5141 if not filenodes:
5137 raise error.InputError(_(b"'%s' not found in manifest") % file_)
5142 raise error.InputError(_(b"'%s' not found in manifest") % file_)
5138 p = []
5143 p = []
5139 for fn in filenodes:
5144 for fn in filenodes:
5140 fctx = repo.filectx(file_, fileid=fn)
5145 fctx = repo.filectx(file_, fileid=fn)
5141 p.append(fctx.node())
5146 p.append(fctx.node())
5142 else:
5147 else:
5143 p = [cp.node() for cp in ctx.parents()]
5148 p = [cp.node() for cp in ctx.parents()]
5144
5149
5145 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
5150 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
5146 for n in p:
5151 for n in p:
5147 if n != repo.nullid:
5152 if n != repo.nullid:
5148 displayer.show(repo[n])
5153 displayer.show(repo[n])
5149 displayer.close()
5154 displayer.close()
5150
5155
5151
5156
5152 @command(
5157 @command(
5153 b'paths',
5158 b'paths',
5154 formatteropts,
5159 formatteropts,
5155 _(b'[NAME]'),
5160 _(b'[NAME]'),
5156 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5161 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5157 optionalrepo=True,
5162 optionalrepo=True,
5158 intents={INTENT_READONLY},
5163 intents={INTENT_READONLY},
5159 )
5164 )
5160 def paths(ui, repo, search=None, **opts):
5165 def paths(ui, repo, search=None, **opts):
5161 """show aliases for remote repositories
5166 """show aliases for remote repositories
5162
5167
5163 Show definition of symbolic path name NAME. If no name is given,
5168 Show definition of symbolic path name NAME. If no name is given,
5164 show definition of all available names.
5169 show definition of all available names.
5165
5170
5166 Option -q/--quiet suppresses all output when searching for NAME
5171 Option -q/--quiet suppresses all output when searching for NAME
5167 and shows only the path names when listing all definitions.
5172 and shows only the path names when listing all definitions.
5168
5173
5169 Path names are defined in the [paths] section of your
5174 Path names are defined in the [paths] section of your
5170 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5175 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5171 repository, ``.hg/hgrc`` is used, too.
5176 repository, ``.hg/hgrc`` is used, too.
5172
5177
5173 The path names ``default`` and ``default-push`` have a special
5178 The path names ``default`` and ``default-push`` have a special
5174 meaning. When performing a push or pull operation, they are used
5179 meaning. When performing a push or pull operation, they are used
5175 as fallbacks if no location is specified on the command-line.
5180 as fallbacks if no location is specified on the command-line.
5176 When ``default-push`` is set, it will be used for push and
5181 When ``default-push`` is set, it will be used for push and
5177 ``default`` will be used for pull; otherwise ``default`` is used
5182 ``default`` will be used for pull; otherwise ``default`` is used
5178 as the fallback for both. When cloning a repository, the clone
5183 as the fallback for both. When cloning a repository, the clone
5179 source is written as ``default`` in ``.hg/hgrc``.
5184 source is written as ``default`` in ``.hg/hgrc``.
5180
5185
5181 .. note::
5186 .. note::
5182
5187
5183 ``default`` and ``default-push`` apply to all inbound (e.g.
5188 ``default`` and ``default-push`` apply to all inbound (e.g.
5184 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email`
5189 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email`
5185 and :hg:`bundle`) operations.
5190 and :hg:`bundle`) operations.
5186
5191
5187 See :hg:`help urls` for more information.
5192 See :hg:`help urls` for more information.
5188
5193
5189 .. container:: verbose
5194 .. container:: verbose
5190
5195
5191 Template:
5196 Template:
5192
5197
5193 The following keywords are supported. See also :hg:`help templates`.
5198 The following keywords are supported. See also :hg:`help templates`.
5194
5199
5195 :name: String. Symbolic name of the path alias.
5200 :name: String. Symbolic name of the path alias.
5196 :pushurl: String. URL for push operations.
5201 :pushurl: String. URL for push operations.
5197 :url: String. URL or directory path for the other operations.
5202 :url: String. URL or directory path for the other operations.
5198
5203
5199 Returns 0 on success.
5204 Returns 0 on success.
5200 """
5205 """
5201
5206
5202 pathitems = urlutil.list_paths(ui, search)
5207 pathitems = urlutil.list_paths(ui, search)
5203 ui.pager(b'paths')
5208 ui.pager(b'paths')
5204
5209
5205 fm = ui.formatter(b'paths', pycompat.byteskwargs(opts))
5210 fm = ui.formatter(b'paths', pycompat.byteskwargs(opts))
5206 if fm.isplain():
5211 if fm.isplain():
5207 hidepassword = urlutil.hidepassword
5212 hidepassword = urlutil.hidepassword
5208 else:
5213 else:
5209 hidepassword = bytes
5214 hidepassword = bytes
5210 if ui.quiet:
5215 if ui.quiet:
5211 namefmt = b'%s\n'
5216 namefmt = b'%s\n'
5212 else:
5217 else:
5213 namefmt = b'%s = '
5218 namefmt = b'%s = '
5214 showsubopts = not search and not ui.quiet
5219 showsubopts = not search and not ui.quiet
5215
5220
5216 for name, path in pathitems:
5221 for name, path in pathitems:
5217 fm.startitem()
5222 fm.startitem()
5218 fm.condwrite(not search, b'name', namefmt, name)
5223 fm.condwrite(not search, b'name', namefmt, name)
5219 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5224 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5220 for subopt, value in sorted(path.suboptions.items()):
5225 for subopt, value in sorted(path.suboptions.items()):
5221 assert subopt not in (b'name', b'url')
5226 assert subopt not in (b'name', b'url')
5222 if showsubopts:
5227 if showsubopts:
5223 fm.plain(b'%s:%s = ' % (name, subopt))
5228 fm.plain(b'%s:%s = ' % (name, subopt))
5224 display = urlutil.path_suboptions_display[subopt]
5229 display = urlutil.path_suboptions_display[subopt]
5225 value = display(value)
5230 value = display(value)
5226 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5231 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5227
5232
5228 fm.end()
5233 fm.end()
5229
5234
5230 if search and not pathitems:
5235 if search and not pathitems:
5231 if not ui.quiet:
5236 if not ui.quiet:
5232 ui.warn(_(b"not found!\n"))
5237 ui.warn(_(b"not found!\n"))
5233 return 1
5238 return 1
5234 else:
5239 else:
5235 return 0
5240 return 0
5236
5241
5237
5242
5238 @command(
5243 @command(
5239 b'phase',
5244 b'phase',
5240 [
5245 [
5241 (b'p', b'public', False, _(b'set changeset phase to public')),
5246 (b'p', b'public', False, _(b'set changeset phase to public')),
5242 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5247 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5243 (b's', b'secret', False, _(b'set changeset phase to secret')),
5248 (b's', b'secret', False, _(b'set changeset phase to secret')),
5244 (b'f', b'force', False, _(b'allow to move boundary backward')),
5249 (b'f', b'force', False, _(b'allow to move boundary backward')),
5245 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5250 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5246 ],
5251 ],
5247 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5252 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5248 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5253 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5249 )
5254 )
5250 def phase(ui, repo, *revs, **opts):
5255 def phase(ui, repo, *revs, **opts):
5251 """set or show the current phase name
5256 """set or show the current phase name
5252
5257
5253 With no argument, show the phase name of the current revision(s).
5258 With no argument, show the phase name of the current revision(s).
5254
5259
5255 With one of -p/--public, -d/--draft or -s/--secret, change the
5260 With one of -p/--public, -d/--draft or -s/--secret, change the
5256 phase value of the specified revisions.
5261 phase value of the specified revisions.
5257
5262
5258 Unless -f/--force is specified, :hg:`phase` won't move changesets from a
5263 Unless -f/--force is specified, :hg:`phase` won't move changesets from a
5259 lower phase to a higher phase. Phases are ordered as follows::
5264 lower phase to a higher phase. Phases are ordered as follows::
5260
5265
5261 public < draft < secret
5266 public < draft < secret
5262
5267
5263 Returns 0 on success, 1 if some phases could not be changed.
5268 Returns 0 on success, 1 if some phases could not be changed.
5264
5269
5265 (For more information about the phases concept, see :hg:`help phases`.)
5270 (For more information about the phases concept, see :hg:`help phases`.)
5266 """
5271 """
5267 opts = pycompat.byteskwargs(opts)
5272 opts = pycompat.byteskwargs(opts)
5268 # search for a unique phase argument
5273 # search for a unique phase argument
5269 targetphase = None
5274 targetphase = None
5270 for idx, name in enumerate(phases.cmdphasenames):
5275 for idx, name in enumerate(phases.cmdphasenames):
5271 if opts[name]:
5276 if opts[name]:
5272 if targetphase is not None:
5277 if targetphase is not None:
5273 raise error.InputError(_(b'only one phase can be specified'))
5278 raise error.InputError(_(b'only one phase can be specified'))
5274 targetphase = idx
5279 targetphase = idx
5275
5280
5276 # look for specified revision
5281 # look for specified revision
5277 revs = list(revs)
5282 revs = list(revs)
5278 revs.extend(opts[b'rev'])
5283 revs.extend(opts[b'rev'])
5279 if revs:
5284 if revs:
5280 revs = logcmdutil.revrange(repo, revs)
5285 revs = logcmdutil.revrange(repo, revs)
5281 else:
5286 else:
5282 # display both parents as the second parent phase can influence
5287 # display both parents as the second parent phase can influence
5283 # the phase of a merge commit
5288 # the phase of a merge commit
5284 revs = [c.rev() for c in repo[None].parents()]
5289 revs = [c.rev() for c in repo[None].parents()]
5285
5290
5286 ret = 0
5291 ret = 0
5287 if targetphase is None:
5292 if targetphase is None:
5288 # display
5293 # display
5289 for r in revs:
5294 for r in revs:
5290 ctx = repo[r]
5295 ctx = repo[r]
5291 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5296 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5292 else:
5297 else:
5293 with repo.lock(), repo.transaction(b"phase") as tr:
5298 with repo.lock(), repo.transaction(b"phase") as tr:
5294 # set phase
5299 # set phase
5295 if not revs:
5300 if not revs:
5296 raise error.InputError(_(b'empty revision set'))
5301 raise error.InputError(_(b'empty revision set'))
5297 nodes = [repo[r].node() for r in revs]
5302 nodes = [repo[r].node() for r in revs]
5298 # moving revision from public to draft may hide them
5303 # moving revision from public to draft may hide them
5299 # We have to check result on an unfiltered repository
5304 # We have to check result on an unfiltered repository
5300 unfi = repo.unfiltered()
5305 unfi = repo.unfiltered()
5301 getphase = unfi._phasecache.phase
5306 getphase = unfi._phasecache.phase
5302 olddata = [getphase(unfi, r) for r in unfi]
5307 olddata = [getphase(unfi, r) for r in unfi]
5303 phases.advanceboundary(repo, tr, targetphase, nodes)
5308 phases.advanceboundary(repo, tr, targetphase, nodes)
5304 if opts[b'force']:
5309 if opts[b'force']:
5305 phases.retractboundary(repo, tr, targetphase, nodes)
5310 phases.retractboundary(repo, tr, targetphase, nodes)
5306 getphase = unfi._phasecache.phase
5311 getphase = unfi._phasecache.phase
5307 newdata = [getphase(unfi, r) for r in unfi]
5312 newdata = [getphase(unfi, r) for r in unfi]
5308 changes = sum(newdata[r] != olddata[r] for r in unfi)
5313 changes = sum(newdata[r] != olddata[r] for r in unfi)
5309 cl = unfi.changelog
5314 cl = unfi.changelog
5310 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5315 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5311 if rejected:
5316 if rejected:
5312 ui.warn(
5317 ui.warn(
5313 _(
5318 _(
5314 b'cannot move %i changesets to a higher '
5319 b'cannot move %i changesets to a higher '
5315 b'phase, use --force\n'
5320 b'phase, use --force\n'
5316 )
5321 )
5317 % len(rejected)
5322 % len(rejected)
5318 )
5323 )
5319 ret = 1
5324 ret = 1
5320 if changes:
5325 if changes:
5321 msg = _(b'phase changed for %i changesets\n') % changes
5326 msg = _(b'phase changed for %i changesets\n') % changes
5322 if ret:
5327 if ret:
5323 ui.status(msg)
5328 ui.status(msg)
5324 else:
5329 else:
5325 ui.note(msg)
5330 ui.note(msg)
5326 else:
5331 else:
5327 ui.warn(_(b'no phases changed\n'))
5332 ui.warn(_(b'no phases changed\n'))
5328 return ret
5333 return ret
5329
5334
5330
5335
5331 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5336 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5332 """Run after a changegroup has been added via pull/unbundle
5337 """Run after a changegroup has been added via pull/unbundle
5333
5338
5334 This takes arguments below:
5339 This takes arguments below:
5335
5340
5336 :modheads: change of heads by pull/unbundle
5341 :modheads: change of heads by pull/unbundle
5337 :optupdate: updating working directory is needed or not
5342 :optupdate: updating working directory is needed or not
5338 :checkout: update destination revision (or None to default destination)
5343 :checkout: update destination revision (or None to default destination)
5339 :brev: a name, which might be a bookmark to be activated after updating
5344 :brev: a name, which might be a bookmark to be activated after updating
5340
5345
5341 return True if update raise any conflict, False otherwise.
5346 return True if update raise any conflict, False otherwise.
5342 """
5347 """
5343 if modheads == 0:
5348 if modheads == 0:
5344 return False
5349 return False
5345 if optupdate:
5350 if optupdate:
5346 try:
5351 try:
5347 return hg.updatetotally(ui, repo, checkout, brev)
5352 return hg.updatetotally(ui, repo, checkout, brev)
5348 except error.UpdateAbort as inst:
5353 except error.UpdateAbort as inst:
5349 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5354 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5350 hint = inst.hint
5355 hint = inst.hint
5351 raise error.UpdateAbort(msg, hint=hint)
5356 raise error.UpdateAbort(msg, hint=hint)
5352 if modheads is not None and modheads > 1:
5357 if modheads is not None and modheads > 1:
5353 currentbranchheads = len(repo.branchheads())
5358 currentbranchheads = len(repo.branchheads())
5354 if currentbranchheads == modheads:
5359 if currentbranchheads == modheads:
5355 ui.status(
5360 ui.status(
5356 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5361 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5357 )
5362 )
5358 elif currentbranchheads > 1:
5363 elif currentbranchheads > 1:
5359 ui.status(
5364 ui.status(
5360 _(b"(run 'hg heads .' to see heads, 'hg merge' to merge)\n")
5365 _(b"(run 'hg heads .' to see heads, 'hg merge' to merge)\n")
5361 )
5366 )
5362 else:
5367 else:
5363 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5368 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5364 elif not ui.configbool(b'commands', b'update.requiredest'):
5369 elif not ui.configbool(b'commands', b'update.requiredest'):
5365 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5370 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5366 return False
5371 return False
5367
5372
5368
5373
5369 @command(
5374 @command(
5370 b'pull',
5375 b'pull',
5371 [
5376 [
5372 (
5377 (
5373 b'u',
5378 b'u',
5374 b'update',
5379 b'update',
5375 None,
5380 None,
5376 _(b'update to new branch head if new descendants were pulled'),
5381 _(b'update to new branch head if new descendants were pulled'),
5377 ),
5382 ),
5378 (
5383 (
5379 b'f',
5384 b'f',
5380 b'force',
5385 b'force',
5381 None,
5386 None,
5382 _(b'run even when remote repository is unrelated'),
5387 _(b'run even when remote repository is unrelated'),
5383 ),
5388 ),
5384 (
5389 (
5385 b'',
5390 b'',
5386 b'confirm',
5391 b'confirm',
5387 None,
5392 None,
5388 _(b'confirm pull before applying changes'),
5393 _(b'confirm pull before applying changes'),
5389 ),
5394 ),
5390 (
5395 (
5391 b'r',
5396 b'r',
5392 b'rev',
5397 b'rev',
5393 [],
5398 [],
5394 _(b'a remote changeset intended to be added'),
5399 _(b'a remote changeset intended to be added'),
5395 _(b'REV'),
5400 _(b'REV'),
5396 ),
5401 ),
5397 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5402 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5398 (
5403 (
5399 b'b',
5404 b'b',
5400 b'branch',
5405 b'branch',
5401 [],
5406 [],
5402 _(b'a specific branch you would like to pull'),
5407 _(b'a specific branch you would like to pull'),
5403 _(b'BRANCH'),
5408 _(b'BRANCH'),
5404 ),
5409 ),
5405 (
5410 (
5406 b'',
5411 b'',
5407 b'remote-hidden',
5412 b'remote-hidden',
5408 False,
5413 False,
5409 _(b"include changesets hidden on the remote (EXPERIMENTAL)"),
5414 _(b"include changesets hidden on the remote (EXPERIMENTAL)"),
5410 ),
5415 ),
5411 ]
5416 ]
5412 + remoteopts,
5417 + remoteopts,
5413 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]...'),
5418 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]...'),
5414 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5419 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5415 helpbasic=True,
5420 helpbasic=True,
5416 )
5421 )
5417 def pull(ui, repo, *sources, **opts):
5422 def pull(ui, repo, *sources, **opts):
5418 """pull changes from the specified source
5423 """pull changes from the specified source
5419
5424
5420 Pull changes from a remote repository to a local one.
5425 Pull changes from a remote repository to a local one.
5421
5426
5422 This finds all changes from the repository at the specified path
5427 This finds all changes from the repository at the specified path
5423 or URL and adds them to a local repository (the current one unless
5428 or URL and adds them to a local repository (the current one unless
5424 -R is specified). By default, this does not update the copy of the
5429 -R is specified). By default, this does not update the copy of the
5425 project in the working directory.
5430 project in the working directory.
5426
5431
5427 When cloning from servers that support it, Mercurial may fetch
5432 When cloning from servers that support it, Mercurial may fetch
5428 pre-generated data. When this is done, hooks operating on incoming
5433 pre-generated data. When this is done, hooks operating on incoming
5429 changesets and changegroups may fire more than once, once for each
5434 changesets and changegroups may fire more than once, once for each
5430 pre-generated bundle and as well as for any additional remaining
5435 pre-generated bundle and as well as for any additional remaining
5431 data. See :hg:`help -e clonebundles` for more.
5436 data. See :hg:`help -e clonebundles` for more.
5432
5437
5433 Use :hg:`incoming` if you want to see what would have been added
5438 Use :hg:`incoming` if you want to see what would have been added
5434 by a pull at the time you issued this command. If you then decide
5439 by a pull at the time you issued this command. If you then decide
5435 to add those changes to the repository, you should use :hg:`pull
5440 to add those changes to the repository, you should use :hg:`pull
5436 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5441 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5437
5442
5438 If SOURCE is omitted, the 'default' path will be used.
5443 If SOURCE is omitted, the 'default' path will be used.
5439 See :hg:`help urls` for more information.
5444 See :hg:`help urls` for more information.
5440
5445
5441 If multiple sources are specified, they will be pulled sequentially as if
5446 If multiple sources are specified, they will be pulled sequentially as if
5442 the command was run multiple time. If --update is specify and the command
5447 the command was run multiple time. If --update is specify and the command
5443 will stop at the first failed --update.
5448 will stop at the first failed --update.
5444
5449
5445 Specifying bookmark as ``.`` is equivalent to specifying the active
5450 Specifying bookmark as ``.`` is equivalent to specifying the active
5446 bookmark's name.
5451 bookmark's name.
5447
5452
5448 .. container:: verbose
5453 .. container:: verbose
5449
5454
5450 One can use the `--remote-hidden` flag to pull changesets
5455 One can use the `--remote-hidden` flag to pull changesets
5451 hidden on the remote. This flag is "best effort", and will only
5456 hidden on the remote. This flag is "best effort", and will only
5452 work if the server supports the feature and is configured to
5457 work if the server supports the feature and is configured to
5453 allow the user to access hidden changesets. This option is
5458 allow the user to access hidden changesets. This option is
5454 experimental and backwards compatibility is not garanteed.
5459 experimental and backwards compatibility is not garanteed.
5455
5460
5456 Returns 0 on success, 1 if an update had unresolved files.
5461 Returns 0 on success, 1 if an update had unresolved files.
5457 """
5462 """
5458
5463
5459 if ui.configbool(b'commands', b'update.requiredest') and opts.get('update'):
5464 if ui.configbool(b'commands', b'update.requiredest') and opts.get('update'):
5460 msg = _(b'update destination required by configuration')
5465 msg = _(b'update destination required by configuration')
5461 hint = _(b'use hg pull followed by hg update DEST')
5466 hint = _(b'use hg pull followed by hg update DEST')
5462 raise error.InputError(msg, hint=hint)
5467 raise error.InputError(msg, hint=hint)
5463
5468
5464 update_conflict = None
5469 update_conflict = None
5465
5470
5466 for path in urlutil.get_pull_paths(repo, ui, sources):
5471 for path in urlutil.get_pull_paths(repo, ui, sources):
5467 ui.status(_(b'pulling from %s\n') % urlutil.hidepassword(path.loc))
5472 ui.status(_(b'pulling from %s\n') % urlutil.hidepassword(path.loc))
5468 ui.flush()
5473 ui.flush()
5469 other = hg.peer(
5474 other = hg.peer(
5470 repo,
5475 repo,
5471 pycompat.byteskwargs(opts),
5476 pycompat.byteskwargs(opts),
5472 path,
5477 path,
5473 remotehidden=opts['remote_hidden'],
5478 remotehidden=opts['remote_hidden'],
5474 )
5479 )
5475 update_conflict = None
5480 update_conflict = None
5476 try:
5481 try:
5477 branches = (path.branch, opts.get('branch', []))
5482 branches = (path.branch, opts.get('branch', []))
5478 revs, checkout = hg.addbranchrevs(
5483 revs, checkout = hg.addbranchrevs(
5479 repo,
5484 repo,
5480 other,
5485 other,
5481 branches,
5486 branches,
5482 opts.get('rev'),
5487 opts.get('rev'),
5483 remotehidden=opts['remote_hidden'],
5488 remotehidden=opts['remote_hidden'],
5484 )
5489 )
5485
5490
5486 pullopargs = {}
5491 pullopargs = {}
5487
5492
5488 nodes = None
5493 nodes = None
5489 if opts.get('bookmark') or revs:
5494 if opts.get('bookmark') or revs:
5490 # The list of bookmark used here is the same used to actually update
5495 # The list of bookmark used here is the same used to actually update
5491 # the bookmark names, to avoid the race from issue 4689 and we do
5496 # the bookmark names, to avoid the race from issue 4689 and we do
5492 # all lookup and bookmark queries in one go so they see the same
5497 # all lookup and bookmark queries in one go so they see the same
5493 # version of the server state (issue 4700).
5498 # version of the server state (issue 4700).
5494 nodes = []
5499 nodes = []
5495 fnodes = []
5500 fnodes = []
5496 revs = revs or []
5501 revs = revs or []
5497 if revs and not other.capable(b'lookup'):
5502 if revs and not other.capable(b'lookup'):
5498 err = _(
5503 err = _(
5499 b"other repository doesn't support revision lookup, "
5504 b"other repository doesn't support revision lookup, "
5500 b"so a rev cannot be specified."
5505 b"so a rev cannot be specified."
5501 )
5506 )
5502 raise error.Abort(err)
5507 raise error.Abort(err)
5503 with other.commandexecutor() as e:
5508 with other.commandexecutor() as e:
5504 fremotebookmarks = e.callcommand(
5509 fremotebookmarks = e.callcommand(
5505 b'listkeys', {b'namespace': b'bookmarks'}
5510 b'listkeys', {b'namespace': b'bookmarks'}
5506 )
5511 )
5507 for r in revs:
5512 for r in revs:
5508 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5513 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5509 remotebookmarks = fremotebookmarks.result()
5514 remotebookmarks = fremotebookmarks.result()
5510 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5515 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5511 pullopargs[b'remotebookmarks'] = remotebookmarks
5516 pullopargs[b'remotebookmarks'] = remotebookmarks
5512 for b in opts.get('bookmark', []):
5517 for b in opts.get('bookmark', []):
5513 b = repo._bookmarks.expandname(b)
5518 b = repo._bookmarks.expandname(b)
5514 if b not in remotebookmarks:
5519 if b not in remotebookmarks:
5515 raise error.InputError(
5520 raise error.InputError(
5516 _(b'remote bookmark %s not found!') % b
5521 _(b'remote bookmark %s not found!') % b
5517 )
5522 )
5518 nodes.append(remotebookmarks[b])
5523 nodes.append(remotebookmarks[b])
5519 for i, rev in enumerate(revs):
5524 for i, rev in enumerate(revs):
5520 node = fnodes[i].result()
5525 node = fnodes[i].result()
5521 nodes.append(node)
5526 nodes.append(node)
5522 if rev == checkout:
5527 if rev == checkout:
5523 checkout = node
5528 checkout = node
5524
5529
5525 wlock = util.nullcontextmanager()
5530 wlock = util.nullcontextmanager()
5526 if opts.get('update'):
5531 if opts.get('update'):
5527 wlock = repo.wlock()
5532 wlock = repo.wlock()
5528 with wlock:
5533 with wlock:
5529 pullopargs.update(opts.get('opargs', {}))
5534 pullopargs.update(opts.get('opargs', {}))
5530 modheads = exchange.pull(
5535 modheads = exchange.pull(
5531 repo,
5536 repo,
5532 other,
5537 other,
5533 path=path,
5538 path=path,
5534 heads=nodes,
5539 heads=nodes,
5535 force=opts.get('force'),
5540 force=opts.get('force'),
5536 bookmarks=opts.get('bookmark', ()),
5541 bookmarks=opts.get('bookmark', ()),
5537 opargs=pullopargs,
5542 opargs=pullopargs,
5538 confirm=opts.get('confirm'),
5543 confirm=opts.get('confirm'),
5539 ).cgresult
5544 ).cgresult
5540
5545
5541 # brev is a name, which might be a bookmark to be activated at
5546 # brev is a name, which might be a bookmark to be activated at
5542 # the end of the update. In other words, it is an explicit
5547 # the end of the update. In other words, it is an explicit
5543 # destination of the update
5548 # destination of the update
5544 brev = None
5549 brev = None
5545
5550
5546 if checkout:
5551 if checkout:
5547 checkout = repo.unfiltered().changelog.rev(checkout)
5552 checkout = repo.unfiltered().changelog.rev(checkout)
5548
5553
5549 # order below depends on implementation of
5554 # order below depends on implementation of
5550 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5555 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5551 # because 'checkout' is determined without it.
5556 # because 'checkout' is determined without it.
5552 if opts.get('rev'):
5557 if opts.get('rev'):
5553 brev = opts['rev'][0]
5558 brev = opts['rev'][0]
5554 elif opts.get('branch'):
5559 elif opts.get('branch'):
5555 brev = opts['branch'][0]
5560 brev = opts['branch'][0]
5556 else:
5561 else:
5557 brev = path.branch
5562 brev = path.branch
5558
5563
5559 # XXX path: we are losing the `path` object here. Keeping it
5564 # XXX path: we are losing the `path` object here. Keeping it
5560 # would be valuable. For example as a "variant" as we do
5565 # would be valuable. For example as a "variant" as we do
5561 # for pushes.
5566 # for pushes.
5562 repo._subtoppath = path.loc
5567 repo._subtoppath = path.loc
5563 try:
5568 try:
5564 update_conflict = postincoming(
5569 update_conflict = postincoming(
5565 ui, repo, modheads, opts.get('update'), checkout, brev
5570 ui, repo, modheads, opts.get('update'), checkout, brev
5566 )
5571 )
5567 except error.FilteredRepoLookupError as exc:
5572 except error.FilteredRepoLookupError as exc:
5568 msg = _(b'cannot update to target: %s') % exc.args[0]
5573 msg = _(b'cannot update to target: %s') % exc.args[0]
5569 exc.args = (msg,) + exc.args[1:]
5574 exc.args = (msg,) + exc.args[1:]
5570 raise
5575 raise
5571 finally:
5576 finally:
5572 del repo._subtoppath
5577 del repo._subtoppath
5573
5578
5574 finally:
5579 finally:
5575 other.close()
5580 other.close()
5576 # skip the remaining pull source if they are some conflict.
5581 # skip the remaining pull source if they are some conflict.
5577 if update_conflict:
5582 if update_conflict:
5578 break
5583 break
5579 if update_conflict:
5584 if update_conflict:
5580 return 1
5585 return 1
5581 else:
5586 else:
5582 return 0
5587 return 0
5583
5588
5584
5589
5585 @command(
5590 @command(
5586 b'purge|clean',
5591 b'purge|clean',
5587 [
5592 [
5588 (b'a', b'abort-on-err', None, _(b'abort if an error occurs')),
5593 (b'a', b'abort-on-err', None, _(b'abort if an error occurs')),
5589 (b'', b'all', None, _(b'purge ignored files too')),
5594 (b'', b'all', None, _(b'purge ignored files too')),
5590 (b'i', b'ignored', None, _(b'purge only ignored files')),
5595 (b'i', b'ignored', None, _(b'purge only ignored files')),
5591 (b'', b'dirs', None, _(b'purge empty directories')),
5596 (b'', b'dirs', None, _(b'purge empty directories')),
5592 (b'', b'files', None, _(b'purge files')),
5597 (b'', b'files', None, _(b'purge files')),
5593 (b'p', b'print', None, _(b'print filenames instead of deleting them')),
5598 (b'p', b'print', None, _(b'print filenames instead of deleting them')),
5594 (
5599 (
5595 b'0',
5600 b'0',
5596 b'print0',
5601 b'print0',
5597 None,
5602 None,
5598 _(
5603 _(
5599 b'end filenames with NUL, for use with xargs'
5604 b'end filenames with NUL, for use with xargs'
5600 b' (implies -p/--print)'
5605 b' (implies -p/--print)'
5601 ),
5606 ),
5602 ),
5607 ),
5603 (b'', b'confirm', None, _(b'ask before permanently deleting files')),
5608 (b'', b'confirm', None, _(b'ask before permanently deleting files')),
5604 ]
5609 ]
5605 + cmdutil.walkopts,
5610 + cmdutil.walkopts,
5606 _(b'hg purge [OPTION]... [DIR]...'),
5611 _(b'hg purge [OPTION]... [DIR]...'),
5607 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5612 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5608 )
5613 )
5609 def purge(ui, repo, *dirs, **opts):
5614 def purge(ui, repo, *dirs, **opts):
5610 """removes files not tracked by Mercurial
5615 """removes files not tracked by Mercurial
5611
5616
5612 Delete files not known to Mercurial. This is useful to test local
5617 Delete files not known to Mercurial. This is useful to test local
5613 and uncommitted changes in an otherwise-clean source tree.
5618 and uncommitted changes in an otherwise-clean source tree.
5614
5619
5615 This means that purge will delete the following by default:
5620 This means that purge will delete the following by default:
5616
5621
5617 - Unknown files: files marked with "?" by :hg:`status`
5622 - Unknown files: files marked with "?" by :hg:`status`
5618 - Empty directories: in fact Mercurial ignores directories unless
5623 - Empty directories: in fact Mercurial ignores directories unless
5619 they contain files under source control management
5624 they contain files under source control management
5620
5625
5621 But it will leave untouched:
5626 But it will leave untouched:
5622
5627
5623 - Modified and unmodified tracked files
5628 - Modified and unmodified tracked files
5624 - Ignored files (unless -i or --all is specified)
5629 - Ignored files (unless -i or --all is specified)
5625 - New files added to the repository (with :hg:`add`)
5630 - New files added to the repository (with :hg:`add`)
5626
5631
5627 The --files and --dirs options can be used to direct purge to delete
5632 The --files and --dirs options can be used to direct purge to delete
5628 only files, only directories, or both. If neither option is given,
5633 only files, only directories, or both. If neither option is given,
5629 both will be deleted.
5634 both will be deleted.
5630
5635
5631 If directories are given on the command line, only files in these
5636 If directories are given on the command line, only files in these
5632 directories are considered.
5637 directories are considered.
5633
5638
5634 Be careful with purge, as you could irreversibly delete some files
5639 Be careful with purge, as you could irreversibly delete some files
5635 you forgot to add to the repository. If you only want to print the
5640 you forgot to add to the repository. If you only want to print the
5636 list of files that this program would delete, use the --print
5641 list of files that this program would delete, use the --print
5637 option.
5642 option.
5638 """
5643 """
5639 cmdutil.check_at_most_one_arg(opts, 'all', 'ignored')
5644 cmdutil.check_at_most_one_arg(opts, 'all', 'ignored')
5640
5645
5641 act = not opts.get('print')
5646 act = not opts.get('print')
5642 eol = b'\n'
5647 eol = b'\n'
5643 if opts.get('print0'):
5648 if opts.get('print0'):
5644 eol = b'\0'
5649 eol = b'\0'
5645 act = False # --print0 implies --print
5650 act = False # --print0 implies --print
5646 if opts.get('all', False):
5651 if opts.get('all', False):
5647 ignored = True
5652 ignored = True
5648 unknown = True
5653 unknown = True
5649 else:
5654 else:
5650 ignored = opts.get('ignored', False)
5655 ignored = opts.get('ignored', False)
5651 unknown = not ignored
5656 unknown = not ignored
5652
5657
5653 removefiles = opts.get('files')
5658 removefiles = opts.get('files')
5654 removedirs = opts.get('dirs')
5659 removedirs = opts.get('dirs')
5655 confirm = opts.get('confirm')
5660 confirm = opts.get('confirm')
5656 if confirm is None:
5661 if confirm is None:
5657 try:
5662 try:
5658 extensions.find(b'purge')
5663 extensions.find(b'purge')
5659 confirm = False
5664 confirm = False
5660 except KeyError:
5665 except KeyError:
5661 confirm = True
5666 confirm = True
5662
5667
5663 if not removefiles and not removedirs:
5668 if not removefiles and not removedirs:
5664 removefiles = True
5669 removefiles = True
5665 removedirs = True
5670 removedirs = True
5666
5671
5667 match = scmutil.match(repo[None], dirs, pycompat.byteskwargs(opts))
5672 match = scmutil.match(repo[None], dirs, pycompat.byteskwargs(opts))
5668
5673
5669 paths = mergemod.purge(
5674 paths = mergemod.purge(
5670 repo,
5675 repo,
5671 match,
5676 match,
5672 unknown=unknown,
5677 unknown=unknown,
5673 ignored=ignored,
5678 ignored=ignored,
5674 removeemptydirs=removedirs,
5679 removeemptydirs=removedirs,
5675 removefiles=removefiles,
5680 removefiles=removefiles,
5676 abortonerror=opts.get('abort_on_err'),
5681 abortonerror=opts.get('abort_on_err'),
5677 noop=not act,
5682 noop=not act,
5678 confirm=confirm,
5683 confirm=confirm,
5679 )
5684 )
5680
5685
5681 for path in paths:
5686 for path in paths:
5682 if not act:
5687 if not act:
5683 ui.write(b'%s%s' % (path, eol))
5688 ui.write(b'%s%s' % (path, eol))
5684
5689
5685
5690
5686 @command(
5691 @command(
5687 b'push',
5692 b'push',
5688 [
5693 [
5689 (b'f', b'force', None, _(b'force push')),
5694 (b'f', b'force', None, _(b'force push')),
5690 (
5695 (
5691 b'r',
5696 b'r',
5692 b'rev',
5697 b'rev',
5693 [],
5698 [],
5694 _(b'a changeset intended to be included in the destination'),
5699 _(b'a changeset intended to be included in the destination'),
5695 _(b'REV'),
5700 _(b'REV'),
5696 ),
5701 ),
5697 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5702 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5698 (b'', b'all-bookmarks', None, _(b"push all bookmarks (EXPERIMENTAL)")),
5703 (b'', b'all-bookmarks', None, _(b"push all bookmarks (EXPERIMENTAL)")),
5699 (
5704 (
5700 b'b',
5705 b'b',
5701 b'branch',
5706 b'branch',
5702 [],
5707 [],
5703 _(b'a specific branch you would like to push'),
5708 _(b'a specific branch you would like to push'),
5704 _(b'BRANCH'),
5709 _(b'BRANCH'),
5705 ),
5710 ),
5706 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5711 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5707 (
5712 (
5708 b'',
5713 b'',
5709 b'pushvars',
5714 b'pushvars',
5710 [],
5715 [],
5711 _(b'variables that can be sent to server (ADVANCED)'),
5716 _(b'variables that can be sent to server (ADVANCED)'),
5712 ),
5717 ),
5713 (
5718 (
5714 b'',
5719 b'',
5715 b'publish',
5720 b'publish',
5716 False,
5721 False,
5717 _(b'push the changeset as public (EXPERIMENTAL)'),
5722 _(b'push the changeset as public (EXPERIMENTAL)'),
5718 ),
5723 ),
5719 ]
5724 ]
5720 + remoteopts,
5725 + remoteopts,
5721 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]...'),
5726 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]...'),
5722 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5727 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5723 helpbasic=True,
5728 helpbasic=True,
5724 )
5729 )
5725 def push(ui, repo, *dests, **opts):
5730 def push(ui, repo, *dests, **opts):
5726 """push changes to the specified destination
5731 """push changes to the specified destination
5727
5732
5728 Push changesets from the local repository to the specified
5733 Push changesets from the local repository to the specified
5729 destination.
5734 destination.
5730
5735
5731 This operation is symmetrical to pull: it is identical to a pull
5736 This operation is symmetrical to pull: it is identical to a pull
5732 in the destination repository from the current one.
5737 in the destination repository from the current one.
5733
5738
5734 By default, push will not allow creation of new heads at the
5739 By default, push will not allow creation of new heads at the
5735 destination, since multiple heads would make it unclear which head
5740 destination, since multiple heads would make it unclear which head
5736 to use. In this situation, it is recommended to pull and merge
5741 to use. In this situation, it is recommended to pull and merge
5737 before pushing.
5742 before pushing.
5738
5743
5739 Use --new-branch if you want to allow push to create a new named
5744 Use --new-branch if you want to allow push to create a new named
5740 branch that is not present at the destination. This allows you to
5745 branch that is not present at the destination. This allows you to
5741 only create a new branch without forcing other changes.
5746 only create a new branch without forcing other changes.
5742
5747
5743 .. note::
5748 .. note::
5744
5749
5745 Extra care should be taken with the -f/--force option,
5750 Extra care should be taken with the -f/--force option,
5746 which will push all new heads on all branches, an action which will
5751 which will push all new heads on all branches, an action which will
5747 almost always cause confusion for collaborators.
5752 almost always cause confusion for collaborators.
5748
5753
5749 If -r/--rev is used, the specified revision and all its ancestors
5754 If -r/--rev is used, the specified revision and all its ancestors
5750 will be pushed to the remote repository.
5755 will be pushed to the remote repository.
5751
5756
5752 If -B/--bookmark is used, the specified bookmarked revision, its
5757 If -B/--bookmark is used, the specified bookmarked revision, its
5753 ancestors, and the bookmark will be pushed to the remote
5758 ancestors, and the bookmark will be pushed to the remote
5754 repository. Specifying ``.`` is equivalent to specifying the active
5759 repository. Specifying ``.`` is equivalent to specifying the active
5755 bookmark's name. Use the --all-bookmarks option for pushing all
5760 bookmark's name. Use the --all-bookmarks option for pushing all
5756 current bookmarks.
5761 current bookmarks.
5757
5762
5758 Please see :hg:`help urls` for important details about ``ssh://``
5763 Please see :hg:`help urls` for important details about ``ssh://``
5759 URLs. If DESTINATION is omitted, a default path will be used.
5764 URLs. If DESTINATION is omitted, a default path will be used.
5760
5765
5761 When passed multiple destinations, push will process them one after the
5766 When passed multiple destinations, push will process them one after the
5762 other, but stop should an error occur.
5767 other, but stop should an error occur.
5763
5768
5764 .. container:: verbose
5769 .. container:: verbose
5765
5770
5766 The --pushvars option sends strings to the server that become
5771 The --pushvars option sends strings to the server that become
5767 environment variables prepended with ``HG_USERVAR_``. For example,
5772 environment variables prepended with ``HG_USERVAR_``. For example,
5768 ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with
5773 ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with
5769 ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment.
5774 ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment.
5770
5775
5771 pushvars can provide for user-overridable hooks as well as set debug
5776 pushvars can provide for user-overridable hooks as well as set debug
5772 levels. One example is having a hook that blocks commits containing
5777 levels. One example is having a hook that blocks commits containing
5773 conflict markers, but enables the user to override the hook if the file
5778 conflict markers, but enables the user to override the hook if the file
5774 is using conflict markers for testing purposes or the file format has
5779 is using conflict markers for testing purposes or the file format has
5775 strings that look like conflict markers.
5780 strings that look like conflict markers.
5776
5781
5777 By default, servers will ignore `--pushvars`. To enable it add the
5782 By default, servers will ignore `--pushvars`. To enable it add the
5778 following to your configuration file::
5783 following to your configuration file::
5779
5784
5780 [push]
5785 [push]
5781 pushvars.server = true
5786 pushvars.server = true
5782
5787
5783 Returns 0 if push was successful, 1 if nothing to push.
5788 Returns 0 if push was successful, 1 if nothing to push.
5784 """
5789 """
5785
5790
5786 opts = pycompat.byteskwargs(opts)
5791 opts = pycompat.byteskwargs(opts)
5787
5792
5788 if opts.get(b'all_bookmarks'):
5793 if opts.get(b'all_bookmarks'):
5789 cmdutil.check_incompatible_arguments(
5794 cmdutil.check_incompatible_arguments(
5790 opts,
5795 opts,
5791 b'all_bookmarks',
5796 b'all_bookmarks',
5792 [b'bookmark', b'rev'],
5797 [b'bookmark', b'rev'],
5793 )
5798 )
5794 opts[b'bookmark'] = list(repo._bookmarks)
5799 opts[b'bookmark'] = list(repo._bookmarks)
5795
5800
5796 if opts.get(b'bookmark'):
5801 if opts.get(b'bookmark'):
5797 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5802 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5798 for b in opts[b'bookmark']:
5803 for b in opts[b'bookmark']:
5799 # translate -B options to -r so changesets get pushed
5804 # translate -B options to -r so changesets get pushed
5800 b = repo._bookmarks.expandname(b)
5805 b = repo._bookmarks.expandname(b)
5801 if b in repo._bookmarks:
5806 if b in repo._bookmarks:
5802 opts.setdefault(b'rev', []).append(b)
5807 opts.setdefault(b'rev', []).append(b)
5803 else:
5808 else:
5804 # if we try to push a deleted bookmark, translate it to null
5809 # if we try to push a deleted bookmark, translate it to null
5805 # this lets simultaneous -r, -b options continue working
5810 # this lets simultaneous -r, -b options continue working
5806 opts.setdefault(b'rev', []).append(b"null")
5811 opts.setdefault(b'rev', []).append(b"null")
5807
5812
5808 some_pushed = False
5813 some_pushed = False
5809 result = 0
5814 result = 0
5810 for path in urlutil.get_push_paths(repo, ui, dests):
5815 for path in urlutil.get_push_paths(repo, ui, dests):
5811 dest = path.loc
5816 dest = path.loc
5812 branches = (path.branch, opts.get(b'branch') or [])
5817 branches = (path.branch, opts.get(b'branch') or [])
5813 ui.status(_(b'pushing to %s\n') % urlutil.hidepassword(dest))
5818 ui.status(_(b'pushing to %s\n') % urlutil.hidepassword(dest))
5814 revs, checkout = hg.addbranchrevs(
5819 revs, checkout = hg.addbranchrevs(
5815 repo, repo, branches, opts.get(b'rev')
5820 repo, repo, branches, opts.get(b'rev')
5816 )
5821 )
5817 other = hg.peer(repo, opts, dest)
5822 other = hg.peer(repo, opts, dest)
5818
5823
5819 try:
5824 try:
5820 if revs:
5825 if revs:
5821 revs = [repo[r].node() for r in logcmdutil.revrange(repo, revs)]
5826 revs = [repo[r].node() for r in logcmdutil.revrange(repo, revs)]
5822 if not revs:
5827 if not revs:
5823 raise error.InputError(
5828 raise error.InputError(
5824 _(b"specified revisions evaluate to an empty set"),
5829 _(b"specified revisions evaluate to an empty set"),
5825 hint=_(b"use different revision arguments"),
5830 hint=_(b"use different revision arguments"),
5826 )
5831 )
5827 elif path.pushrev:
5832 elif path.pushrev:
5828 # It doesn't make any sense to specify ancestor revisions. So limit
5833 # It doesn't make any sense to specify ancestor revisions. So limit
5829 # to DAG heads to make discovery simpler.
5834 # to DAG heads to make discovery simpler.
5830 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5835 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5831 revs = scmutil.revrange(repo, [expr])
5836 revs = scmutil.revrange(repo, [expr])
5832 revs = [repo[rev].node() for rev in revs]
5837 revs = [repo[rev].node() for rev in revs]
5833 if not revs:
5838 if not revs:
5834 raise error.InputError(
5839 raise error.InputError(
5835 _(
5840 _(
5836 b'default push revset for path evaluates to an empty set'
5841 b'default push revset for path evaluates to an empty set'
5837 )
5842 )
5838 )
5843 )
5839 elif ui.configbool(b'commands', b'push.require-revs'):
5844 elif ui.configbool(b'commands', b'push.require-revs'):
5840 raise error.InputError(
5845 raise error.InputError(
5841 _(b'no revisions specified to push'),
5846 _(b'no revisions specified to push'),
5842 hint=_(b'did you mean "hg push -r ."?'),
5847 hint=_(b'did you mean "hg push -r ."?'),
5843 )
5848 )
5844
5849
5845 repo._subtoppath = dest
5850 repo._subtoppath = dest
5846 try:
5851 try:
5847 # push subrepos depth-first for coherent ordering
5852 # push subrepos depth-first for coherent ordering
5848 c = repo[b'.']
5853 c = repo[b'.']
5849 subs = c.substate # only repos that are committed
5854 subs = c.substate # only repos that are committed
5850 for s in sorted(subs):
5855 for s in sorted(subs):
5851 sub_result = c.sub(s).push(opts)
5856 sub_result = c.sub(s).push(opts)
5852 if sub_result == 0:
5857 if sub_result == 0:
5853 return 1
5858 return 1
5854 finally:
5859 finally:
5855 del repo._subtoppath
5860 del repo._subtoppath
5856
5861
5857 opargs = dict(
5862 opargs = dict(
5858 opts.get(b'opargs', {})
5863 opts.get(b'opargs', {})
5859 ) # copy opargs since we may mutate it
5864 ) # copy opargs since we may mutate it
5860 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5865 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5861
5866
5862 pushop = exchange.push(
5867 pushop = exchange.push(
5863 repo,
5868 repo,
5864 other,
5869 other,
5865 opts.get(b'force'),
5870 opts.get(b'force'),
5866 revs=revs,
5871 revs=revs,
5867 newbranch=opts.get(b'new_branch'),
5872 newbranch=opts.get(b'new_branch'),
5868 bookmarks=opts.get(b'bookmark', ()),
5873 bookmarks=opts.get(b'bookmark', ()),
5869 publish=opts.get(b'publish'),
5874 publish=opts.get(b'publish'),
5870 opargs=opargs,
5875 opargs=opargs,
5871 )
5876 )
5872
5877
5873 if pushop.cgresult == 0:
5878 if pushop.cgresult == 0:
5874 result = 1
5879 result = 1
5875 elif pushop.cgresult is not None:
5880 elif pushop.cgresult is not None:
5876 some_pushed = True
5881 some_pushed = True
5877
5882
5878 if pushop.bkresult is not None:
5883 if pushop.bkresult is not None:
5879 if pushop.bkresult == 2:
5884 if pushop.bkresult == 2:
5880 result = 2
5885 result = 2
5881 elif not result and pushop.bkresult:
5886 elif not result and pushop.bkresult:
5882 result = 2
5887 result = 2
5883
5888
5884 if result:
5889 if result:
5885 break
5890 break
5886
5891
5887 finally:
5892 finally:
5888 other.close()
5893 other.close()
5889 if result == 0 and not some_pushed:
5894 if result == 0 and not some_pushed:
5890 result = 1
5895 result = 1
5891 return result
5896 return result
5892
5897
5893
5898
5894 @command(
5899 @command(
5895 b'recover',
5900 b'recover',
5896 [
5901 [
5897 (b'', b'verify', False, b"run `hg verify` after successful recover"),
5902 (b'', b'verify', False, b"run `hg verify` after successful recover"),
5898 ],
5903 ],
5899 helpcategory=command.CATEGORY_MAINTENANCE,
5904 helpcategory=command.CATEGORY_MAINTENANCE,
5900 )
5905 )
5901 def recover(ui, repo, **opts):
5906 def recover(ui, repo, **opts):
5902 """roll back an interrupted transaction
5907 """roll back an interrupted transaction
5903
5908
5904 Recover from an interrupted commit or pull.
5909 Recover from an interrupted commit or pull.
5905
5910
5906 This command tries to fix the repository status after an
5911 This command tries to fix the repository status after an
5907 interrupted operation. It should only be necessary when Mercurial
5912 interrupted operation. It should only be necessary when Mercurial
5908 suggests it.
5913 suggests it.
5909
5914
5910 Returns 0 if successful, 1 if nothing to recover or verify fails.
5915 Returns 0 if successful, 1 if nothing to recover or verify fails.
5911 """
5916 """
5912 ret = repo.recover()
5917 ret = repo.recover()
5913 if ret:
5918 if ret:
5914 if opts['verify']:
5919 if opts['verify']:
5915 return hg.verify(repo)
5920 return hg.verify(repo)
5916 else:
5921 else:
5917 msg = _(
5922 msg = _(
5918 b"(verify step skipped, run `hg verify` to check your "
5923 b"(verify step skipped, run `hg verify` to check your "
5919 b"repository content)\n"
5924 b"repository content)\n"
5920 )
5925 )
5921 ui.warn(msg)
5926 ui.warn(msg)
5922 return 0
5927 return 0
5923 return 1
5928 return 1
5924
5929
5925
5930
5926 @command(
5931 @command(
5927 b'remove|rm',
5932 b'remove|rm',
5928 [
5933 [
5929 (b'A', b'after', None, _(b'record delete for missing files')),
5934 (b'A', b'after', None, _(b'record delete for missing files')),
5930 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5935 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5931 ]
5936 ]
5932 + subrepoopts
5937 + subrepoopts
5933 + walkopts
5938 + walkopts
5934 + dryrunopts,
5939 + dryrunopts,
5935 _(b'[OPTION]... FILE...'),
5940 _(b'[OPTION]... FILE...'),
5936 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5941 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5937 helpbasic=True,
5942 helpbasic=True,
5938 inferrepo=True,
5943 inferrepo=True,
5939 )
5944 )
5940 def remove(ui, repo, *pats, **opts):
5945 def remove(ui, repo, *pats, **opts):
5941 """remove the specified files on the next commit
5946 """remove the specified files on the next commit
5942
5947
5943 Schedule the indicated files for removal from the current branch.
5948 Schedule the indicated files for removal from the current branch.
5944
5949
5945 This command schedules the files to be removed at the next commit.
5950 This command schedules the files to be removed at the next commit.
5946 To undo a remove before that, see :hg:`revert`. To undo added
5951 To undo a remove before that, see :hg:`revert`. To undo added
5947 files, see :hg:`forget`.
5952 files, see :hg:`forget`.
5948
5953
5949 .. container:: verbose
5954 .. container:: verbose
5950
5955
5951 -A/--after can be used to remove only files that have already
5956 -A/--after can be used to remove only files that have already
5952 been deleted, -f/--force can be used to force deletion, and -Af
5957 been deleted, -f/--force can be used to force deletion, and -Af
5953 can be used to remove files from the next revision without
5958 can be used to remove files from the next revision without
5954 deleting them from the working directory.
5959 deleting them from the working directory.
5955
5960
5956 The following table details the behavior of remove for different
5961 The following table details the behavior of remove for different
5957 file states (columns) and option combinations (rows). The file
5962 file states (columns) and option combinations (rows). The file
5958 states are Added [A], Clean [C], Modified [M] and Missing [!]
5963 states are Added [A], Clean [C], Modified [M] and Missing [!]
5959 (as reported by :hg:`status`). The actions are Warn, Remove
5964 (as reported by :hg:`status`). The actions are Warn, Remove
5960 (from branch) and Delete (from disk):
5965 (from branch) and Delete (from disk):
5961
5966
5962 ========= == == == ==
5967 ========= == == == ==
5963 opt/state A C M !
5968 opt/state A C M !
5964 ========= == == == ==
5969 ========= == == == ==
5965 none W RD W R
5970 none W RD W R
5966 -f R RD RD R
5971 -f R RD RD R
5967 -A W W W R
5972 -A W W W R
5968 -Af R R R R
5973 -Af R R R R
5969 ========= == == == ==
5974 ========= == == == ==
5970
5975
5971 .. note::
5976 .. note::
5972
5977
5973 :hg:`remove` never deletes files in Added [A] state from the
5978 :hg:`remove` never deletes files in Added [A] state from the
5974 working directory, not even if ``--force`` is specified.
5979 working directory, not even if ``--force`` is specified.
5975
5980
5976 Returns 0 on success, 1 if any warnings encountered.
5981 Returns 0 on success, 1 if any warnings encountered.
5977 """
5982 """
5978
5983
5979 after, force = opts.get('after'), opts.get('force')
5984 after, force = opts.get('after'), opts.get('force')
5980 dryrun = opts.get('dry_run')
5985 dryrun = opts.get('dry_run')
5981 if not pats and not after:
5986 if not pats and not after:
5982 raise error.InputError(_(b'no files specified'))
5987 raise error.InputError(_(b'no files specified'))
5983
5988
5984 with repo.wlock(), repo.dirstate.changing_files(repo):
5989 with repo.wlock(), repo.dirstate.changing_files(repo):
5985 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
5990 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
5986 subrepos = opts.get('subrepos')
5991 subrepos = opts.get('subrepos')
5987 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5992 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5988 return cmdutil.remove(
5993 return cmdutil.remove(
5989 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5994 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5990 )
5995 )
5991
5996
5992
5997
5993 @command(
5998 @command(
5994 b'rename|move|mv',
5999 b'rename|move|mv',
5995 [
6000 [
5996 (b'', b'forget', None, _(b'unmark a destination file as renamed')),
6001 (b'', b'forget', None, _(b'unmark a destination file as renamed')),
5997 (b'A', b'after', None, _(b'record a rename that has already occurred')),
6002 (b'A', b'after', None, _(b'record a rename that has already occurred')),
5998 (
6003 (
5999 b'',
6004 b'',
6000 b'at-rev',
6005 b'at-rev',
6001 b'',
6006 b'',
6002 _(b'(un)mark renames in the given revision (EXPERIMENTAL)'),
6007 _(b'(un)mark renames in the given revision (EXPERIMENTAL)'),
6003 _(b'REV'),
6008 _(b'REV'),
6004 ),
6009 ),
6005 (
6010 (
6006 b'f',
6011 b'f',
6007 b'force',
6012 b'force',
6008 None,
6013 None,
6009 _(b'forcibly move over an existing managed file'),
6014 _(b'forcibly move over an existing managed file'),
6010 ),
6015 ),
6011 ]
6016 ]
6012 + walkopts
6017 + walkopts
6013 + dryrunopts,
6018 + dryrunopts,
6014 _(b'[OPTION]... SOURCE... DEST'),
6019 _(b'[OPTION]... SOURCE... DEST'),
6015 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6020 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6016 )
6021 )
6017 def rename(ui, repo, *pats, **opts):
6022 def rename(ui, repo, *pats, **opts):
6018 """rename files; equivalent of copy + remove
6023 """rename files; equivalent of copy + remove
6019
6024
6020 Mark dest as copies of sources; mark sources for deletion. If dest
6025 Mark dest as copies of sources; mark sources for deletion. If dest
6021 is a directory, copies are put in that directory. If dest is a
6026 is a directory, copies are put in that directory. If dest is a
6022 file, there can only be one source.
6027 file, there can only be one source.
6023
6028
6024 By default, this command copies the contents of files as they
6029 By default, this command copies the contents of files as they
6025 exist in the working directory. If invoked with -A/--after, the
6030 exist in the working directory. If invoked with -A/--after, the
6026 operation is recorded, but no copying is performed.
6031 operation is recorded, but no copying is performed.
6027
6032
6028 To undo marking a destination file as renamed, use --forget. With that
6033 To undo marking a destination file as renamed, use --forget. With that
6029 option, all given (positional) arguments are unmarked as renames. The
6034 option, all given (positional) arguments are unmarked as renames. The
6030 destination file(s) will be left in place (still tracked). The source
6035 destination file(s) will be left in place (still tracked). The source
6031 file(s) will not be restored. Note that :hg:`rename --forget` behaves
6036 file(s) will not be restored. Note that :hg:`rename --forget` behaves
6032 the same way as :hg:`copy --forget`.
6037 the same way as :hg:`copy --forget`.
6033
6038
6034 This command takes effect with the next commit by default.
6039 This command takes effect with the next commit by default.
6035
6040
6036 Returns 0 on success, 1 if errors are encountered.
6041 Returns 0 on success, 1 if errors are encountered.
6037 """
6042 """
6038 context = lambda repo: repo.dirstate.changing_files(repo)
6043 context = lambda repo: repo.dirstate.changing_files(repo)
6039 rev = opts.get('at_rev')
6044 rev = opts.get('at_rev')
6040
6045
6041 if rev:
6046 if rev:
6042 ctx = logcmdutil.revsingle(repo, rev)
6047 ctx = logcmdutil.revsingle(repo, rev)
6043 if ctx.rev() is not None:
6048 if ctx.rev() is not None:
6044
6049
6045 def context(repo):
6050 def context(repo):
6046 return util.nullcontextmanager()
6051 return util.nullcontextmanager()
6047
6052
6048 opts['at_rev'] = ctx.rev()
6053 opts['at_rev'] = ctx.rev()
6049 with repo.wlock(), context(repo):
6054 with repo.wlock(), context(repo):
6050 return cmdutil.copy(
6055 return cmdutil.copy(
6051 ui, repo, pats, pycompat.byteskwargs(opts), rename=True
6056 ui, repo, pats, pycompat.byteskwargs(opts), rename=True
6052 )
6057 )
6053
6058
6054
6059
6055 @command(
6060 @command(
6056 b'resolve',
6061 b'resolve',
6057 [
6062 [
6058 (b'a', b'all', None, _(b'select all unresolved files')),
6063 (b'a', b'all', None, _(b'select all unresolved files')),
6059 (b'l', b'list', None, _(b'list state of files needing merge')),
6064 (b'l', b'list', None, _(b'list state of files needing merge')),
6060 (b'm', b'mark', None, _(b'mark files as resolved')),
6065 (b'm', b'mark', None, _(b'mark files as resolved')),
6061 (b'u', b'unmark', None, _(b'mark files as unresolved')),
6066 (b'u', b'unmark', None, _(b'mark files as unresolved')),
6062 (b'n', b'no-status', None, _(b'hide status prefix')),
6067 (b'n', b'no-status', None, _(b'hide status prefix')),
6063 (b'', b're-merge', None, _(b're-merge files')),
6068 (b'', b're-merge', None, _(b're-merge files')),
6064 ]
6069 ]
6065 + mergetoolopts
6070 + mergetoolopts
6066 + walkopts
6071 + walkopts
6067 + formatteropts,
6072 + formatteropts,
6068 _(b'[OPTION]... [FILE]...'),
6073 _(b'[OPTION]... [FILE]...'),
6069 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6074 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6070 inferrepo=True,
6075 inferrepo=True,
6071 )
6076 )
6072 def resolve(ui, repo, *pats, **opts):
6077 def resolve(ui, repo, *pats, **opts):
6073 """redo merges or set/view the merge status of files
6078 """redo merges or set/view the merge status of files
6074
6079
6075 Merges with unresolved conflicts are often the result of
6080 Merges with unresolved conflicts are often the result of
6076 non-interactive merging using the ``internal:merge`` configuration
6081 non-interactive merging using the ``internal:merge`` configuration
6077 setting, or a command-line merge tool like ``diff3``. The resolve
6082 setting, or a command-line merge tool like ``diff3``. The resolve
6078 command is used to manage the files involved in a merge, after
6083 command is used to manage the files involved in a merge, after
6079 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
6084 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
6080 working directory must have two parents). See :hg:`help
6085 working directory must have two parents). See :hg:`help
6081 merge-tools` for information on configuring merge tools.
6086 merge-tools` for information on configuring merge tools.
6082
6087
6083 The resolve command can be used in the following ways:
6088 The resolve command can be used in the following ways:
6084
6089
6085 - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge
6090 - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge
6086 the specified files, discarding any previous merge attempts. Re-merging
6091 the specified files, discarding any previous merge attempts. Re-merging
6087 is not performed for files already marked as resolved. Use ``--all/-a``
6092 is not performed for files already marked as resolved. Use ``--all/-a``
6088 to select all unresolved files. ``--tool`` can be used to specify
6093 to select all unresolved files. ``--tool`` can be used to specify
6089 the merge tool used for the given files. It overrides the HGMERGE
6094 the merge tool used for the given files. It overrides the HGMERGE
6090 environment variable and your configuration files. Previous file
6095 environment variable and your configuration files. Previous file
6091 contents are saved with a ``.orig`` suffix.
6096 contents are saved with a ``.orig`` suffix.
6092
6097
6093 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
6098 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
6094 (e.g. after having manually fixed-up the files). The default is
6099 (e.g. after having manually fixed-up the files). The default is
6095 to mark all unresolved files.
6100 to mark all unresolved files.
6096
6101
6097 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
6102 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
6098 default is to mark all resolved files.
6103 default is to mark all resolved files.
6099
6104
6100 - :hg:`resolve -l`: list files which had or still have conflicts.
6105 - :hg:`resolve -l`: list files which had or still have conflicts.
6101 In the printed list, ``U`` = unresolved and ``R`` = resolved.
6106 In the printed list, ``U`` = unresolved and ``R`` = resolved.
6102 You can use ``set:unresolved()`` or ``set:resolved()`` to filter
6107 You can use ``set:unresolved()`` or ``set:resolved()`` to filter
6103 the list. See :hg:`help filesets` for details.
6108 the list. See :hg:`help filesets` for details.
6104
6109
6105 .. note::
6110 .. note::
6106
6111
6107 Mercurial will not let you commit files with unresolved merge
6112 Mercurial will not let you commit files with unresolved merge
6108 conflicts. You must use :hg:`resolve -m ...` before you can
6113 conflicts. You must use :hg:`resolve -m ...` before you can
6109 commit after a conflicting merge.
6114 commit after a conflicting merge.
6110
6115
6111 .. container:: verbose
6116 .. container:: verbose
6112
6117
6113 Template:
6118 Template:
6114
6119
6115 The following keywords are supported in addition to the common template
6120 The following keywords are supported in addition to the common template
6116 keywords and functions. See also :hg:`help templates`.
6121 keywords and functions. See also :hg:`help templates`.
6117
6122
6118 :mergestatus: String. Character denoting merge conflicts, ``U`` or ``R``.
6123 :mergestatus: String. Character denoting merge conflicts, ``U`` or ``R``.
6119 :path: String. Repository-absolute path of the file.
6124 :path: String. Repository-absolute path of the file.
6120
6125
6121 Returns 0 on success, 1 if any files fail a resolve attempt.
6126 Returns 0 on success, 1 if any files fail a resolve attempt.
6122 """
6127 """
6123
6128
6124 opts = pycompat.byteskwargs(opts)
6129 opts = pycompat.byteskwargs(opts)
6125 confirm = ui.configbool(b'commands', b'resolve.confirm')
6130 confirm = ui.configbool(b'commands', b'resolve.confirm')
6126 flaglist = b'all mark unmark list no_status re_merge'.split()
6131 flaglist = b'all mark unmark list no_status re_merge'.split()
6127 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
6132 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
6128
6133
6129 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
6134 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
6130 if actioncount > 1:
6135 if actioncount > 1:
6131 raise error.InputError(_(b"too many actions specified"))
6136 raise error.InputError(_(b"too many actions specified"))
6132 elif actioncount == 0 and ui.configbool(
6137 elif actioncount == 0 and ui.configbool(
6133 b'commands', b'resolve.explicit-re-merge'
6138 b'commands', b'resolve.explicit-re-merge'
6134 ):
6139 ):
6135 hint = _(b'use --mark, --unmark, --list or --re-merge')
6140 hint = _(b'use --mark, --unmark, --list or --re-merge')
6136 raise error.InputError(_(b'no action specified'), hint=hint)
6141 raise error.InputError(_(b'no action specified'), hint=hint)
6137 if pats and all:
6142 if pats and all:
6138 raise error.InputError(_(b"can't specify --all and patterns"))
6143 raise error.InputError(_(b"can't specify --all and patterns"))
6139 if not (all or pats or show or mark or unmark):
6144 if not (all or pats or show or mark or unmark):
6140 raise error.InputError(
6145 raise error.InputError(
6141 _(b'no files or directories specified'),
6146 _(b'no files or directories specified'),
6142 hint=b'use --all to re-merge all unresolved files',
6147 hint=b'use --all to re-merge all unresolved files',
6143 )
6148 )
6144
6149
6145 if confirm:
6150 if confirm:
6146 if all:
6151 if all:
6147 if ui.promptchoice(
6152 if ui.promptchoice(
6148 _(b're-merge all unresolved files (yn)?$$ &Yes $$ &No')
6153 _(b're-merge all unresolved files (yn)?$$ &Yes $$ &No')
6149 ):
6154 ):
6150 raise error.CanceledError(_(b'user quit'))
6155 raise error.CanceledError(_(b'user quit'))
6151 if mark and not pats:
6156 if mark and not pats:
6152 if ui.promptchoice(
6157 if ui.promptchoice(
6153 _(
6158 _(
6154 b'mark all unresolved files as resolved (yn)?'
6159 b'mark all unresolved files as resolved (yn)?'
6155 b'$$ &Yes $$ &No'
6160 b'$$ &Yes $$ &No'
6156 )
6161 )
6157 ):
6162 ):
6158 raise error.CanceledError(_(b'user quit'))
6163 raise error.CanceledError(_(b'user quit'))
6159 if unmark and not pats:
6164 if unmark and not pats:
6160 if ui.promptchoice(
6165 if ui.promptchoice(
6161 _(
6166 _(
6162 b'mark all resolved files as unresolved (yn)?'
6167 b'mark all resolved files as unresolved (yn)?'
6163 b'$$ &Yes $$ &No'
6168 b'$$ &Yes $$ &No'
6164 )
6169 )
6165 ):
6170 ):
6166 raise error.CanceledError(_(b'user quit'))
6171 raise error.CanceledError(_(b'user quit'))
6167
6172
6168 uipathfn = scmutil.getuipathfn(repo)
6173 uipathfn = scmutil.getuipathfn(repo)
6169
6174
6170 if show:
6175 if show:
6171 ui.pager(b'resolve')
6176 ui.pager(b'resolve')
6172 fm = ui.formatter(b'resolve', opts)
6177 fm = ui.formatter(b'resolve', opts)
6173 ms = mergestatemod.mergestate.read(repo)
6178 ms = mergestatemod.mergestate.read(repo)
6174 wctx = repo[None]
6179 wctx = repo[None]
6175 m = scmutil.match(wctx, pats, opts)
6180 m = scmutil.match(wctx, pats, opts)
6176
6181
6177 # Labels and keys based on merge state. Unresolved path conflicts show
6182 # Labels and keys based on merge state. Unresolved path conflicts show
6178 # as 'P'. Resolved path conflicts show as 'R', the same as normal
6183 # as 'P'. Resolved path conflicts show as 'R', the same as normal
6179 # resolved conflicts.
6184 # resolved conflicts.
6180 mergestateinfo = {
6185 mergestateinfo = {
6181 mergestatemod.MERGE_RECORD_UNRESOLVED: (
6186 mergestatemod.MERGE_RECORD_UNRESOLVED: (
6182 b'resolve.unresolved',
6187 b'resolve.unresolved',
6183 b'U',
6188 b'U',
6184 ),
6189 ),
6185 mergestatemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
6190 mergestatemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
6186 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH: (
6191 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH: (
6187 b'resolve.unresolved',
6192 b'resolve.unresolved',
6188 b'P',
6193 b'P',
6189 ),
6194 ),
6190 mergestatemod.MERGE_RECORD_RESOLVED_PATH: (
6195 mergestatemod.MERGE_RECORD_RESOLVED_PATH: (
6191 b'resolve.resolved',
6196 b'resolve.resolved',
6192 b'R',
6197 b'R',
6193 ),
6198 ),
6194 }
6199 }
6195
6200
6196 for f in ms:
6201 for f in ms:
6197 if not m(f):
6202 if not m(f):
6198 continue
6203 continue
6199
6204
6200 label, key = mergestateinfo[ms[f]]
6205 label, key = mergestateinfo[ms[f]]
6201 fm.startitem()
6206 fm.startitem()
6202 fm.context(ctx=wctx)
6207 fm.context(ctx=wctx)
6203 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
6208 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
6204 fm.data(path=f)
6209 fm.data(path=f)
6205 fm.plain(b'%s\n' % uipathfn(f), label=label)
6210 fm.plain(b'%s\n' % uipathfn(f), label=label)
6206 fm.end()
6211 fm.end()
6207 return 0
6212 return 0
6208
6213
6209 with repo.wlock():
6214 with repo.wlock():
6210 ms = mergestatemod.mergestate.read(repo)
6215 ms = mergestatemod.mergestate.read(repo)
6211
6216
6212 if not (ms.active() or repo.dirstate.p2() != repo.nullid):
6217 if not (ms.active() or repo.dirstate.p2() != repo.nullid):
6213 raise error.StateError(
6218 raise error.StateError(
6214 _(b'resolve command not applicable when not merging')
6219 _(b'resolve command not applicable when not merging')
6215 )
6220 )
6216
6221
6217 wctx = repo[None]
6222 wctx = repo[None]
6218 m = scmutil.match(wctx, pats, opts)
6223 m = scmutil.match(wctx, pats, opts)
6219 ret = 0
6224 ret = 0
6220 didwork = False
6225 didwork = False
6221
6226
6222 hasconflictmarkers = []
6227 hasconflictmarkers = []
6223 if mark:
6228 if mark:
6224 markcheck = ui.config(b'commands', b'resolve.mark-check')
6229 markcheck = ui.config(b'commands', b'resolve.mark-check')
6225 if markcheck not in [b'warn', b'abort']:
6230 if markcheck not in [b'warn', b'abort']:
6226 # Treat all invalid / unrecognized values as 'none'.
6231 # Treat all invalid / unrecognized values as 'none'.
6227 markcheck = False
6232 markcheck = False
6228 for f in ms:
6233 for f in ms:
6229 if not m(f):
6234 if not m(f):
6230 continue
6235 continue
6231
6236
6232 didwork = True
6237 didwork = True
6233
6238
6234 # path conflicts must be resolved manually
6239 # path conflicts must be resolved manually
6235 if ms[f] in (
6240 if ms[f] in (
6236 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH,
6241 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH,
6237 mergestatemod.MERGE_RECORD_RESOLVED_PATH,
6242 mergestatemod.MERGE_RECORD_RESOLVED_PATH,
6238 ):
6243 ):
6239 if mark:
6244 if mark:
6240 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED_PATH)
6245 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED_PATH)
6241 elif unmark:
6246 elif unmark:
6242 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED_PATH)
6247 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED_PATH)
6243 elif ms[f] == mergestatemod.MERGE_RECORD_UNRESOLVED_PATH:
6248 elif ms[f] == mergestatemod.MERGE_RECORD_UNRESOLVED_PATH:
6244 ui.warn(
6249 ui.warn(
6245 _(b'%s: path conflict must be resolved manually\n')
6250 _(b'%s: path conflict must be resolved manually\n')
6246 % uipathfn(f)
6251 % uipathfn(f)
6247 )
6252 )
6248 continue
6253 continue
6249
6254
6250 if mark:
6255 if mark:
6251 if markcheck:
6256 if markcheck:
6252 fdata = repo.wvfs.tryread(f)
6257 fdata = repo.wvfs.tryread(f)
6253 if (
6258 if (
6254 filemerge.hasconflictmarkers(fdata)
6259 filemerge.hasconflictmarkers(fdata)
6255 and ms[f] != mergestatemod.MERGE_RECORD_RESOLVED
6260 and ms[f] != mergestatemod.MERGE_RECORD_RESOLVED
6256 ):
6261 ):
6257 hasconflictmarkers.append(f)
6262 hasconflictmarkers.append(f)
6258 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED)
6263 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED)
6259 elif unmark:
6264 elif unmark:
6260 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED)
6265 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED)
6261 else:
6266 else:
6262 # backup pre-resolve (merge uses .orig for its own purposes)
6267 # backup pre-resolve (merge uses .orig for its own purposes)
6263 a = repo.wjoin(f)
6268 a = repo.wjoin(f)
6264 try:
6269 try:
6265 util.copyfile(a, a + b".resolve")
6270 util.copyfile(a, a + b".resolve")
6266 except FileNotFoundError:
6271 except FileNotFoundError:
6267 pass
6272 pass
6268
6273
6269 try:
6274 try:
6270 # preresolve file
6275 # preresolve file
6271 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
6276 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
6272 with ui.configoverride(overrides, b'resolve'):
6277 with ui.configoverride(overrides, b'resolve'):
6273 r = ms.resolve(f, wctx)
6278 r = ms.resolve(f, wctx)
6274 if r:
6279 if r:
6275 ret = 1
6280 ret = 1
6276 finally:
6281 finally:
6277 ms.commit()
6282 ms.commit()
6278
6283
6279 # replace filemerge's .orig file with our resolve file
6284 # replace filemerge's .orig file with our resolve file
6280 try:
6285 try:
6281 util.rename(
6286 util.rename(
6282 a + b".resolve", scmutil.backuppath(ui, repo, f)
6287 a + b".resolve", scmutil.backuppath(ui, repo, f)
6283 )
6288 )
6284 except FileNotFoundError:
6289 except FileNotFoundError:
6285 pass
6290 pass
6286
6291
6287 if hasconflictmarkers:
6292 if hasconflictmarkers:
6288 ui.warn(
6293 ui.warn(
6289 _(
6294 _(
6290 b'warning: the following files still have conflict '
6295 b'warning: the following files still have conflict '
6291 b'markers:\n'
6296 b'markers:\n'
6292 )
6297 )
6293 + b''.join(
6298 + b''.join(
6294 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6299 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6295 )
6300 )
6296 )
6301 )
6297 if markcheck == b'abort' and not all and not pats:
6302 if markcheck == b'abort' and not all and not pats:
6298 raise error.StateError(
6303 raise error.StateError(
6299 _(b'conflict markers detected'),
6304 _(b'conflict markers detected'),
6300 hint=_(b'use --all to mark anyway'),
6305 hint=_(b'use --all to mark anyway'),
6301 )
6306 )
6302
6307
6303 ms.commit()
6308 ms.commit()
6304 branchmerge = repo.dirstate.p2() != repo.nullid
6309 branchmerge = repo.dirstate.p2() != repo.nullid
6305 # resolve is not doing a parent change here, however, `record updates`
6310 # resolve is not doing a parent change here, however, `record updates`
6306 # will call some dirstate API that at intended for parent changes call.
6311 # will call some dirstate API that at intended for parent changes call.
6307 # Ideally we would not need this and could implement a lighter version
6312 # Ideally we would not need this and could implement a lighter version
6308 # of the recordupdateslogic that will not have to deal with the part
6313 # of the recordupdateslogic that will not have to deal with the part
6309 # related to parent changes. However this would requires that:
6314 # related to parent changes. However this would requires that:
6310 # - we are sure we passed around enough information at update/merge
6315 # - we are sure we passed around enough information at update/merge
6311 # time to no longer needs it at `hg resolve time`
6316 # time to no longer needs it at `hg resolve time`
6312 # - we are sure we store that information well enough to be able to reuse it
6317 # - we are sure we store that information well enough to be able to reuse it
6313 # - we are the necessary logic to reuse it right.
6318 # - we are the necessary logic to reuse it right.
6314 #
6319 #
6315 # All this should eventually happens, but in the mean time, we use this
6320 # All this should eventually happens, but in the mean time, we use this
6316 # context manager slightly out of the context it should be.
6321 # context manager slightly out of the context it should be.
6317 with repo.dirstate.changing_parents(repo):
6322 with repo.dirstate.changing_parents(repo):
6318 mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None)
6323 mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None)
6319
6324
6320 if not didwork and pats:
6325 if not didwork and pats:
6321 hint = None
6326 hint = None
6322 if not any([p for p in pats if p.find(b':') >= 0]):
6327 if not any([p for p in pats if p.find(b':') >= 0]):
6323 pats = [b'path:%s' % p for p in pats]
6328 pats = [b'path:%s' % p for p in pats]
6324 m = scmutil.match(wctx, pats, opts)
6329 m = scmutil.match(wctx, pats, opts)
6325 for f in ms:
6330 for f in ms:
6326 if not m(f):
6331 if not m(f):
6327 continue
6332 continue
6328
6333
6329 def flag(o):
6334 def flag(o):
6330 if o == b're_merge':
6335 if o == b're_merge':
6331 return b'--re-merge '
6336 return b'--re-merge '
6332 return b'-%s ' % o[0:1]
6337 return b'-%s ' % o[0:1]
6333
6338
6334 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
6339 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
6335 hint = _(b"(try: hg resolve %s%s)\n") % (
6340 hint = _(b"(try: hg resolve %s%s)\n") % (
6336 flags,
6341 flags,
6337 b' '.join(pats),
6342 b' '.join(pats),
6338 )
6343 )
6339 break
6344 break
6340 ui.warn(_(b"arguments do not match paths that need resolving\n"))
6345 ui.warn(_(b"arguments do not match paths that need resolving\n"))
6341 if hint:
6346 if hint:
6342 ui.warn(hint)
6347 ui.warn(hint)
6343
6348
6344 unresolvedf = ms.unresolvedcount()
6349 unresolvedf = ms.unresolvedcount()
6345 if not unresolvedf:
6350 if not unresolvedf:
6346 ui.status(_(b'(no more unresolved files)\n'))
6351 ui.status(_(b'(no more unresolved files)\n'))
6347 cmdutil.checkafterresolved(repo)
6352 cmdutil.checkafterresolved(repo)
6348
6353
6349 return ret
6354 return ret
6350
6355
6351
6356
6352 @command(
6357 @command(
6353 b'revert',
6358 b'revert',
6354 [
6359 [
6355 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6360 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6356 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6361 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6357 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6362 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6358 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6363 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6359 (b'i', b'interactive', None, _(b'interactively select the changes')),
6364 (b'i', b'interactive', None, _(b'interactively select the changes')),
6360 ]
6365 ]
6361 + walkopts
6366 + walkopts
6362 + dryrunopts,
6367 + dryrunopts,
6363 _(b'[OPTION]... [-r REV] [NAME]...'),
6368 _(b'[OPTION]... [-r REV] [NAME]...'),
6364 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6369 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6365 )
6370 )
6366 def revert(ui, repo, *pats, **opts):
6371 def revert(ui, repo, *pats, **opts):
6367 """restore files to their checkout state
6372 """restore files to their checkout state
6368
6373
6369 .. note::
6374 .. note::
6370
6375
6371 To check out earlier revisions, you should use :hg:`update REV`.
6376 To check out earlier revisions, you should use :hg:`update REV`.
6372 To cancel an uncommitted merge (and lose your changes),
6377 To cancel an uncommitted merge (and lose your changes),
6373 use :hg:`merge --abort`.
6378 use :hg:`merge --abort`.
6374
6379
6375 With no revision specified, revert the specified files or directories
6380 With no revision specified, revert the specified files or directories
6376 to the contents they had in the parent of the working directory.
6381 to the contents they had in the parent of the working directory.
6377 This restores the contents of files to an unmodified
6382 This restores the contents of files to an unmodified
6378 state and unschedules adds, removes, copies, and renames. If the
6383 state and unschedules adds, removes, copies, and renames. If the
6379 working directory has two parents, you must explicitly specify a
6384 working directory has two parents, you must explicitly specify a
6380 revision.
6385 revision.
6381
6386
6382 Using the -r/--rev or -d/--date options, revert the given files or
6387 Using the -r/--rev or -d/--date options, revert the given files or
6383 directories to their states as of a specific revision. Because
6388 directories to their states as of a specific revision. Because
6384 revert does not change the working directory parents, this will
6389 revert does not change the working directory parents, this will
6385 cause these files to appear modified. This can be helpful to "back
6390 cause these files to appear modified. This can be helpful to "back
6386 out" some or all of an earlier change. See :hg:`backout` for a
6391 out" some or all of an earlier change. See :hg:`backout` for a
6387 related method.
6392 related method.
6388
6393
6389 Modified files are saved with a .orig suffix before reverting.
6394 Modified files are saved with a .orig suffix before reverting.
6390 To disable these backups, use --no-backup. It is possible to store
6395 To disable these backups, use --no-backup. It is possible to store
6391 the backup files in a custom directory relative to the root of the
6396 the backup files in a custom directory relative to the root of the
6392 repository by setting the ``ui.origbackuppath`` configuration
6397 repository by setting the ``ui.origbackuppath`` configuration
6393 option.
6398 option.
6394
6399
6395 See :hg:`help dates` for a list of formats valid for -d/--date.
6400 See :hg:`help dates` for a list of formats valid for -d/--date.
6396
6401
6397 See :hg:`help backout` for a way to reverse the effect of an
6402 See :hg:`help backout` for a way to reverse the effect of an
6398 earlier changeset.
6403 earlier changeset.
6399
6404
6400 Returns 0 on success.
6405 Returns 0 on success.
6401 """
6406 """
6402
6407
6403 if opts.get("date"):
6408 if opts.get("date"):
6404 cmdutil.check_incompatible_arguments(opts, 'date', ['rev'])
6409 cmdutil.check_incompatible_arguments(opts, 'date', ['rev'])
6405 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
6410 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
6406
6411
6407 parent, p2 = repo.dirstate.parents()
6412 parent, p2 = repo.dirstate.parents()
6408 if not opts.get('rev') and p2 != repo.nullid:
6413 if not opts.get('rev') and p2 != repo.nullid:
6409 # revert after merge is a trap for new users (issue2915)
6414 # revert after merge is a trap for new users (issue2915)
6410 raise error.InputError(
6415 raise error.InputError(
6411 _(b'uncommitted merge with no revision specified'),
6416 _(b'uncommitted merge with no revision specified'),
6412 hint=_(b"use 'hg update' or see 'hg help revert'"),
6417 hint=_(b"use 'hg update' or see 'hg help revert'"),
6413 )
6418 )
6414
6419
6415 rev = opts.get('rev')
6420 rev = opts.get('rev')
6416 if rev:
6421 if rev:
6417 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6422 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6418 ctx = logcmdutil.revsingle(repo, rev)
6423 ctx = logcmdutil.revsingle(repo, rev)
6419
6424
6420 if not (
6425 if not (
6421 pats
6426 pats
6422 or opts.get('include')
6427 or opts.get('include')
6423 or opts.get('exclude')
6428 or opts.get('exclude')
6424 or opts.get('all')
6429 or opts.get('all')
6425 or opts.get('interactive')
6430 or opts.get('interactive')
6426 ):
6431 ):
6427 msg = _(b"no files or directories specified")
6432 msg = _(b"no files or directories specified")
6428 if p2 != repo.nullid:
6433 if p2 != repo.nullid:
6429 hint = _(
6434 hint = _(
6430 b"uncommitted merge, use --all to discard all changes,"
6435 b"uncommitted merge, use --all to discard all changes,"
6431 b" or 'hg update -C .' to abort the merge"
6436 b" or 'hg update -C .' to abort the merge"
6432 )
6437 )
6433 raise error.InputError(msg, hint=hint)
6438 raise error.InputError(msg, hint=hint)
6434 dirty = any(repo.status())
6439 dirty = any(repo.status())
6435 node = ctx.node()
6440 node = ctx.node()
6436 if node != parent:
6441 if node != parent:
6437 if dirty:
6442 if dirty:
6438 hint = (
6443 hint = (
6439 _(
6444 _(
6440 b"uncommitted changes, use --all to discard all"
6445 b"uncommitted changes, use --all to discard all"
6441 b" changes, or 'hg update %d' to update"
6446 b" changes, or 'hg update %d' to update"
6442 )
6447 )
6443 % ctx.rev()
6448 % ctx.rev()
6444 )
6449 )
6445 else:
6450 else:
6446 hint = (
6451 hint = (
6447 _(
6452 _(
6448 b"use --all to revert all files,"
6453 b"use --all to revert all files,"
6449 b" or 'hg update %d' to update"
6454 b" or 'hg update %d' to update"
6450 )
6455 )
6451 % ctx.rev()
6456 % ctx.rev()
6452 )
6457 )
6453 elif dirty:
6458 elif dirty:
6454 hint = _(b"uncommitted changes, use --all to discard all changes")
6459 hint = _(b"uncommitted changes, use --all to discard all changes")
6455 else:
6460 else:
6456 hint = _(b"use --all to revert all files")
6461 hint = _(b"use --all to revert all files")
6457 raise error.InputError(msg, hint=hint)
6462 raise error.InputError(msg, hint=hint)
6458
6463
6459 return cmdutil.revert(ui, repo, ctx, *pats, **opts)
6464 return cmdutil.revert(ui, repo, ctx, *pats, **opts)
6460
6465
6461
6466
6462 @command(
6467 @command(
6463 b'rollback',
6468 b'rollback',
6464 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6469 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6465 helpcategory=command.CATEGORY_MAINTENANCE,
6470 helpcategory=command.CATEGORY_MAINTENANCE,
6466 )
6471 )
6467 def rollback(ui, repo, **opts):
6472 def rollback(ui, repo, **opts):
6468 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6473 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6469
6474
6470 Please use :hg:`commit --amend` instead of rollback to correct
6475 Please use :hg:`commit --amend` instead of rollback to correct
6471 mistakes in the last commit.
6476 mistakes in the last commit.
6472
6477
6473 This command should be used with care. There is only one level of
6478 This command should be used with care. There is only one level of
6474 rollback, and there is no way to undo a rollback. It will also
6479 rollback, and there is no way to undo a rollback. It will also
6475 restore the dirstate at the time of the last transaction, losing
6480 restore the dirstate at the time of the last transaction, losing
6476 any dirstate changes since that time. This command does not alter
6481 any dirstate changes since that time. This command does not alter
6477 the working directory.
6482 the working directory.
6478
6483
6479 Transactions are used to encapsulate the effects of all commands
6484 Transactions are used to encapsulate the effects of all commands
6480 that create new changesets or propagate existing changesets into a
6485 that create new changesets or propagate existing changesets into a
6481 repository.
6486 repository.
6482
6487
6483 .. container:: verbose
6488 .. container:: verbose
6484
6489
6485 For example, the following commands are transactional, and their
6490 For example, the following commands are transactional, and their
6486 effects can be rolled back:
6491 effects can be rolled back:
6487
6492
6488 - commit
6493 - commit
6489 - import
6494 - import
6490 - pull
6495 - pull
6491 - push (with this repository as the destination)
6496 - push (with this repository as the destination)
6492 - unbundle
6497 - unbundle
6493
6498
6494 To avoid permanent data loss, rollback will refuse to rollback a
6499 To avoid permanent data loss, rollback will refuse to rollback a
6495 commit transaction if it isn't checked out. Use --force to
6500 commit transaction if it isn't checked out. Use --force to
6496 override this protection.
6501 override this protection.
6497
6502
6498 The rollback command can be entirely disabled by setting the
6503 The rollback command can be entirely disabled by setting the
6499 ``ui.rollback`` configuration setting to false. If you're here
6504 ``ui.rollback`` configuration setting to false. If you're here
6500 because you want to use rollback and it's disabled, you can
6505 because you want to use rollback and it's disabled, you can
6501 re-enable the command by setting ``ui.rollback`` to true.
6506 re-enable the command by setting ``ui.rollback`` to true.
6502
6507
6503 This command is not intended for use on public repositories. Once
6508 This command is not intended for use on public repositories. Once
6504 changes are visible for pull by other users, rolling a transaction
6509 changes are visible for pull by other users, rolling a transaction
6505 back locally is ineffective (someone else may already have pulled
6510 back locally is ineffective (someone else may already have pulled
6506 the changes). Furthermore, a race is possible with readers of the
6511 the changes). Furthermore, a race is possible with readers of the
6507 repository; for example an in-progress pull from the repository
6512 repository; for example an in-progress pull from the repository
6508 may fail if a rollback is performed.
6513 may fail if a rollback is performed.
6509
6514
6510 Returns 0 on success, 1 if no rollback data is available.
6515 Returns 0 on success, 1 if no rollback data is available.
6511 """
6516 """
6512 if not ui.configbool(b'ui', b'rollback'):
6517 if not ui.configbool(b'ui', b'rollback'):
6513 raise error.Abort(
6518 raise error.Abort(
6514 _(b'rollback is disabled because it is unsafe'),
6519 _(b'rollback is disabled because it is unsafe'),
6515 hint=b'see `hg help -v rollback` for information',
6520 hint=b'see `hg help -v rollback` for information',
6516 )
6521 )
6517 return repo.rollback(dryrun=opts.get('dry_run'), force=opts.get('force'))
6522 return repo.rollback(dryrun=opts.get('dry_run'), force=opts.get('force'))
6518
6523
6519
6524
6520 @command(
6525 @command(
6521 b'root',
6526 b'root',
6522 [] + formatteropts,
6527 [] + formatteropts,
6523 intents={INTENT_READONLY},
6528 intents={INTENT_READONLY},
6524 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6529 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6525 )
6530 )
6526 def root(ui, repo, **opts):
6531 def root(ui, repo, **opts):
6527 """print the root (top) of the current working directory
6532 """print the root (top) of the current working directory
6528
6533
6529 Print the root directory of the current repository.
6534 Print the root directory of the current repository.
6530
6535
6531 .. container:: verbose
6536 .. container:: verbose
6532
6537
6533 Template:
6538 Template:
6534
6539
6535 The following keywords are supported in addition to the common template
6540 The following keywords are supported in addition to the common template
6536 keywords and functions. See also :hg:`help templates`.
6541 keywords and functions. See also :hg:`help templates`.
6537
6542
6538 :hgpath: String. Path to the .hg directory.
6543 :hgpath: String. Path to the .hg directory.
6539 :storepath: String. Path to the directory holding versioned data.
6544 :storepath: String. Path to the directory holding versioned data.
6540
6545
6541 Returns 0 on success.
6546 Returns 0 on success.
6542 """
6547 """
6543 opts = pycompat.byteskwargs(opts)
6548 opts = pycompat.byteskwargs(opts)
6544 with ui.formatter(b'root', opts) as fm:
6549 with ui.formatter(b'root', opts) as fm:
6545 fm.startitem()
6550 fm.startitem()
6546 fm.write(b'reporoot', b'%s\n', repo.root)
6551 fm.write(b'reporoot', b'%s\n', repo.root)
6547 fm.data(hgpath=repo.path, storepath=repo.spath)
6552 fm.data(hgpath=repo.path, storepath=repo.spath)
6548
6553
6549
6554
6550 @command(
6555 @command(
6551 b'serve',
6556 b'serve',
6552 [
6557 [
6553 (
6558 (
6554 b'A',
6559 b'A',
6555 b'accesslog',
6560 b'accesslog',
6556 b'',
6561 b'',
6557 _(b'name of access log file to write to'),
6562 _(b'name of access log file to write to'),
6558 _(b'FILE'),
6563 _(b'FILE'),
6559 ),
6564 ),
6560 (b'd', b'daemon', None, _(b'run server in background')),
6565 (b'd', b'daemon', None, _(b'run server in background')),
6561 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6566 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6562 (
6567 (
6563 b'E',
6568 b'E',
6564 b'errorlog',
6569 b'errorlog',
6565 b'',
6570 b'',
6566 _(b'name of error log file to write to'),
6571 _(b'name of error log file to write to'),
6567 _(b'FILE'),
6572 _(b'FILE'),
6568 ),
6573 ),
6569 # use string type, then we can check if something was passed
6574 # use string type, then we can check if something was passed
6570 (
6575 (
6571 b'p',
6576 b'p',
6572 b'port',
6577 b'port',
6573 b'',
6578 b'',
6574 _(b'port to listen on (default: 8000)'),
6579 _(b'port to listen on (default: 8000)'),
6575 _(b'PORT'),
6580 _(b'PORT'),
6576 ),
6581 ),
6577 (
6582 (
6578 b'a',
6583 b'a',
6579 b'address',
6584 b'address',
6580 b'',
6585 b'',
6581 _(b'address to listen on (default: all interfaces)'),
6586 _(b'address to listen on (default: all interfaces)'),
6582 _(b'ADDR'),
6587 _(b'ADDR'),
6583 ),
6588 ),
6584 (
6589 (
6585 b'',
6590 b'',
6586 b'prefix',
6591 b'prefix',
6587 b'',
6592 b'',
6588 _(b'prefix path to serve from (default: server root)'),
6593 _(b'prefix path to serve from (default: server root)'),
6589 _(b'PREFIX'),
6594 _(b'PREFIX'),
6590 ),
6595 ),
6591 (
6596 (
6592 b'n',
6597 b'n',
6593 b'name',
6598 b'name',
6594 b'',
6599 b'',
6595 _(b'name to show in web pages (default: working directory)'),
6600 _(b'name to show in web pages (default: working directory)'),
6596 _(b'NAME'),
6601 _(b'NAME'),
6597 ),
6602 ),
6598 (
6603 (
6599 b'',
6604 b'',
6600 b'web-conf',
6605 b'web-conf',
6601 b'',
6606 b'',
6602 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6607 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6603 _(b'FILE'),
6608 _(b'FILE'),
6604 ),
6609 ),
6605 (
6610 (
6606 b'',
6611 b'',
6607 b'webdir-conf',
6612 b'webdir-conf',
6608 b'',
6613 b'',
6609 _(b'name of the hgweb config file (DEPRECATED)'),
6614 _(b'name of the hgweb config file (DEPRECATED)'),
6610 _(b'FILE'),
6615 _(b'FILE'),
6611 ),
6616 ),
6612 (
6617 (
6613 b'',
6618 b'',
6614 b'pid-file',
6619 b'pid-file',
6615 b'',
6620 b'',
6616 _(b'name of file to write process ID to'),
6621 _(b'name of file to write process ID to'),
6617 _(b'FILE'),
6622 _(b'FILE'),
6618 ),
6623 ),
6619 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6624 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6620 (
6625 (
6621 b'',
6626 b'',
6622 b'cmdserver',
6627 b'cmdserver',
6623 b'',
6628 b'',
6624 _(b'for remote clients (ADVANCED)'),
6629 _(b'for remote clients (ADVANCED)'),
6625 _(b'MODE'),
6630 _(b'MODE'),
6626 ),
6631 ),
6627 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6632 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6628 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6633 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6629 (b'6', b'ipv6', None, _(b'use IPv6 instead of IPv4')),
6634 (b'6', b'ipv6', None, _(b'use IPv6 instead of IPv4')),
6630 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6635 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6631 (b'', b'print-url', None, _(b'start and print only the URL')),
6636 (b'', b'print-url', None, _(b'start and print only the URL')),
6632 ]
6637 ]
6633 + subrepoopts,
6638 + subrepoopts,
6634 _(b'[OPTION]...'),
6639 _(b'[OPTION]...'),
6635 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6640 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6636 helpbasic=True,
6641 helpbasic=True,
6637 optionalrepo=True,
6642 optionalrepo=True,
6638 )
6643 )
6639 def serve(ui, repo, **opts):
6644 def serve(ui, repo, **opts):
6640 """start stand-alone webserver
6645 """start stand-alone webserver
6641
6646
6642 Start a local HTTP repository browser and pull server. You can use
6647 Start a local HTTP repository browser and pull server. You can use
6643 this for ad-hoc sharing and browsing of repositories. It is
6648 this for ad-hoc sharing and browsing of repositories. It is
6644 recommended to use a real web server to serve a repository for
6649 recommended to use a real web server to serve a repository for
6645 longer periods of time.
6650 longer periods of time.
6646
6651
6647 Please note that the server does not implement access control.
6652 Please note that the server does not implement access control.
6648 This means that, by default, anybody can read from the server and
6653 This means that, by default, anybody can read from the server and
6649 nobody can write to it by default. Set the ``web.allow-push``
6654 nobody can write to it by default. Set the ``web.allow-push``
6650 option to ``*`` to allow everybody to push to the server. You
6655 option to ``*`` to allow everybody to push to the server. You
6651 should use a real web server if you need to authenticate users.
6656 should use a real web server if you need to authenticate users.
6652
6657
6653 By default, the server logs accesses to stdout and errors to
6658 By default, the server logs accesses to stdout and errors to
6654 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
6659 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
6655 files.
6660 files.
6656
6661
6657 To have the server choose a free port number to listen on, specify
6662 To have the server choose a free port number to listen on, specify
6658 a port number of 0; in this case, the server will print the port
6663 a port number of 0; in this case, the server will print the port
6659 number it uses.
6664 number it uses.
6660
6665
6661 Returns 0 on success.
6666 Returns 0 on success.
6662 """
6667 """
6663
6668
6664 cmdutil.check_incompatible_arguments(opts, 'stdio', ['cmdserver'])
6669 cmdutil.check_incompatible_arguments(opts, 'stdio', ['cmdserver'])
6665 opts = pycompat.byteskwargs(opts)
6670 opts = pycompat.byteskwargs(opts)
6666 if opts[b"print_url"] and ui.verbose:
6671 if opts[b"print_url"] and ui.verbose:
6667 raise error.InputError(_(b"cannot use --print-url with --verbose"))
6672 raise error.InputError(_(b"cannot use --print-url with --verbose"))
6668
6673
6669 if opts[b"stdio"]:
6674 if opts[b"stdio"]:
6670 if repo is None:
6675 if repo is None:
6671 raise error.RepoError(
6676 raise error.RepoError(
6672 _(b"there is no Mercurial repository here (.hg not found)")
6677 _(b"there is no Mercurial repository here (.hg not found)")
6673 )
6678 )
6674 accesshidden = False
6679 accesshidden = False
6675 if repo.filtername is None:
6680 if repo.filtername is None:
6676 allow = ui.configlist(
6681 allow = ui.configlist(
6677 b'experimental', b'server.allow-hidden-access'
6682 b'experimental', b'server.allow-hidden-access'
6678 )
6683 )
6679 user = procutil.getuser()
6684 user = procutil.getuser()
6680 if allow and scmutil.ismember(ui, user, allow):
6685 if allow and scmutil.ismember(ui, user, allow):
6681 accesshidden = True
6686 accesshidden = True
6682 else:
6687 else:
6683 msg = (
6688 msg = (
6684 _(
6689 _(
6685 b'ignoring request to access hidden changeset by '
6690 b'ignoring request to access hidden changeset by '
6686 b'unauthorized user: %s\n'
6691 b'unauthorized user: %s\n'
6687 )
6692 )
6688 % user
6693 % user
6689 )
6694 )
6690 ui.warn(msg)
6695 ui.warn(msg)
6691
6696
6692 s = wireprotoserver.sshserver(ui, repo, accesshidden=accesshidden)
6697 s = wireprotoserver.sshserver(ui, repo, accesshidden=accesshidden)
6693 s.serve_forever()
6698 s.serve_forever()
6694 return
6699 return
6695
6700
6696 service = server.createservice(ui, repo, opts)
6701 service = server.createservice(ui, repo, opts)
6697 return server.runservice(opts, initfn=service.init, runfn=service.run)
6702 return server.runservice(opts, initfn=service.init, runfn=service.run)
6698
6703
6699
6704
6700 @command(
6705 @command(
6701 b'shelve',
6706 b'shelve',
6702 [
6707 [
6703 (
6708 (
6704 b'A',
6709 b'A',
6705 b'addremove',
6710 b'addremove',
6706 None,
6711 None,
6707 _(b'mark new/missing files as added/removed before shelving'),
6712 _(b'mark new/missing files as added/removed before shelving'),
6708 ),
6713 ),
6709 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6714 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6710 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6715 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6711 (
6716 (
6712 b'',
6717 b'',
6713 b'date',
6718 b'date',
6714 b'',
6719 b'',
6715 _(b'shelve with the specified commit date'),
6720 _(b'shelve with the specified commit date'),
6716 _(b'DATE'),
6721 _(b'DATE'),
6717 ),
6722 ),
6718 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6723 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6719 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6724 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6720 (
6725 (
6721 b'k',
6726 b'k',
6722 b'keep',
6727 b'keep',
6723 False,
6728 False,
6724 _(b'shelve, but keep changes in the working directory'),
6729 _(b'shelve, but keep changes in the working directory'),
6725 ),
6730 ),
6726 (b'l', b'list', None, _(b'list current shelves')),
6731 (b'l', b'list', None, _(b'list current shelves')),
6727 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6732 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6728 (
6733 (
6729 b'n',
6734 b'n',
6730 b'name',
6735 b'name',
6731 b'',
6736 b'',
6732 _(b'use the given name for the shelved commit'),
6737 _(b'use the given name for the shelved commit'),
6733 _(b'NAME'),
6738 _(b'NAME'),
6734 ),
6739 ),
6735 (
6740 (
6736 b'p',
6741 b'p',
6737 b'patch',
6742 b'patch',
6738 None,
6743 None,
6739 _(
6744 _(
6740 b'output patches for changes (provide the names of the shelved '
6745 b'output patches for changes (provide the names of the shelved '
6741 b'changes as positional arguments)'
6746 b'changes as positional arguments)'
6742 ),
6747 ),
6743 ),
6748 ),
6744 (b'i', b'interactive', None, _(b'interactive mode')),
6749 (b'i', b'interactive', None, _(b'interactive mode')),
6745 (
6750 (
6746 b'',
6751 b'',
6747 b'stat',
6752 b'stat',
6748 None,
6753 None,
6749 _(
6754 _(
6750 b'output diffstat-style summary of changes (provide the names of '
6755 b'output diffstat-style summary of changes (provide the names of '
6751 b'the shelved changes as positional arguments)'
6756 b'the shelved changes as positional arguments)'
6752 ),
6757 ),
6753 ),
6758 ),
6754 ]
6759 ]
6755 + cmdutil.walkopts,
6760 + cmdutil.walkopts,
6756 _(b'hg shelve [OPTION]... [FILE]...'),
6761 _(b'hg shelve [OPTION]... [FILE]...'),
6757 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6762 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6758 )
6763 )
6759 def shelve(ui, repo, *pats, **opts):
6764 def shelve(ui, repo, *pats, **opts):
6760 """save and set aside changes from the working directory
6765 """save and set aside changes from the working directory
6761
6766
6762 Shelving takes files that "hg status" reports as not clean, saves
6767 Shelving takes files that "hg status" reports as not clean, saves
6763 the modifications to a bundle (a shelved change), and reverts the
6768 the modifications to a bundle (a shelved change), and reverts the
6764 files so that their state in the working directory becomes clean.
6769 files so that their state in the working directory becomes clean.
6765
6770
6766 To restore these changes to the working directory, using "hg
6771 To restore these changes to the working directory, using "hg
6767 unshelve"; this will work even if you switch to a different
6772 unshelve"; this will work even if you switch to a different
6768 commit.
6773 commit.
6769
6774
6770 When no files are specified, "hg shelve" saves all not-clean
6775 When no files are specified, "hg shelve" saves all not-clean
6771 files. If specific files or directories are named, only changes to
6776 files. If specific files or directories are named, only changes to
6772 those files are shelved.
6777 those files are shelved.
6773
6778
6774 In bare shelve (when no files are specified, without interactive,
6779 In bare shelve (when no files are specified, without interactive,
6775 include and exclude option), shelving remembers information if the
6780 include and exclude option), shelving remembers information if the
6776 working directory was on newly created branch, in other words working
6781 working directory was on newly created branch, in other words working
6777 directory was on different branch than its first parent. In this
6782 directory was on different branch than its first parent. In this
6778 situation unshelving restores branch information to the working directory.
6783 situation unshelving restores branch information to the working directory.
6779
6784
6780 Each shelved change has a name that makes it easier to find later.
6785 Each shelved change has a name that makes it easier to find later.
6781 The name of a shelved change defaults to being based on the active
6786 The name of a shelved change defaults to being based on the active
6782 bookmark, or if there is no active bookmark, the current named
6787 bookmark, or if there is no active bookmark, the current named
6783 branch. To specify a different name, use ``--name``.
6788 branch. To specify a different name, use ``--name``.
6784
6789
6785 To see a list of existing shelved changes, use the ``--list``
6790 To see a list of existing shelved changes, use the ``--list``
6786 option. For each shelved change, this will print its name, age,
6791 option. For each shelved change, this will print its name, age,
6787 and description; use ``--patch`` or ``--stat`` for more details.
6792 and description; use ``--patch`` or ``--stat`` for more details.
6788
6793
6789 To delete specific shelved changes, use ``--delete``. To delete
6794 To delete specific shelved changes, use ``--delete``. To delete
6790 all shelved changes, use ``--cleanup``.
6795 all shelved changes, use ``--cleanup``.
6791 """
6796 """
6792 opts = pycompat.byteskwargs(opts)
6797 opts = pycompat.byteskwargs(opts)
6793 allowables = [
6798 allowables = [
6794 (b'addremove', {b'create'}), # 'create' is pseudo action
6799 (b'addremove', {b'create'}), # 'create' is pseudo action
6795 (b'unknown', {b'create'}),
6800 (b'unknown', {b'create'}),
6796 (b'cleanup', {b'cleanup'}),
6801 (b'cleanup', {b'cleanup'}),
6797 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6802 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6798 (b'delete', {b'delete'}),
6803 (b'delete', {b'delete'}),
6799 (b'edit', {b'create'}),
6804 (b'edit', {b'create'}),
6800 (b'keep', {b'create'}),
6805 (b'keep', {b'create'}),
6801 (b'list', {b'list'}),
6806 (b'list', {b'list'}),
6802 (b'message', {b'create'}),
6807 (b'message', {b'create'}),
6803 (b'name', {b'create'}),
6808 (b'name', {b'create'}),
6804 (b'patch', {b'patch', b'list'}),
6809 (b'patch', {b'patch', b'list'}),
6805 (b'stat', {b'stat', b'list'}),
6810 (b'stat', {b'stat', b'list'}),
6806 ]
6811 ]
6807
6812
6808 def checkopt(opt):
6813 def checkopt(opt):
6809 if opts.get(opt):
6814 if opts.get(opt):
6810 for i, allowable in allowables:
6815 for i, allowable in allowables:
6811 if opts[i] and opt not in allowable:
6816 if opts[i] and opt not in allowable:
6812 raise error.InputError(
6817 raise error.InputError(
6813 _(
6818 _(
6814 b"options '--%s' and '--%s' may not be "
6819 b"options '--%s' and '--%s' may not be "
6815 b"used together"
6820 b"used together"
6816 )
6821 )
6817 % (opt, i)
6822 % (opt, i)
6818 )
6823 )
6819 return True
6824 return True
6820
6825
6821 if checkopt(b'cleanup'):
6826 if checkopt(b'cleanup'):
6822 if pats:
6827 if pats:
6823 raise error.InputError(
6828 raise error.InputError(
6824 _(b"cannot specify names when using '--cleanup'")
6829 _(b"cannot specify names when using '--cleanup'")
6825 )
6830 )
6826 return shelvemod.cleanupcmd(ui, repo)
6831 return shelvemod.cleanupcmd(ui, repo)
6827 elif checkopt(b'delete'):
6832 elif checkopt(b'delete'):
6828 return shelvemod.deletecmd(ui, repo, pats)
6833 return shelvemod.deletecmd(ui, repo, pats)
6829 elif checkopt(b'list'):
6834 elif checkopt(b'list'):
6830 return shelvemod.listcmd(ui, repo, pats, opts)
6835 return shelvemod.listcmd(ui, repo, pats, opts)
6831 elif checkopt(b'patch') or checkopt(b'stat'):
6836 elif checkopt(b'patch') or checkopt(b'stat'):
6832 return shelvemod.patchcmds(ui, repo, pats, opts)
6837 return shelvemod.patchcmds(ui, repo, pats, opts)
6833 else:
6838 else:
6834 return shelvemod.createcmd(ui, repo, pats, opts)
6839 return shelvemod.createcmd(ui, repo, pats, opts)
6835
6840
6836
6841
6837 _NOTTERSE = b'nothing'
6842 _NOTTERSE = b'nothing'
6838
6843
6839
6844
6840 @command(
6845 @command(
6841 b'status|st',
6846 b'status|st',
6842 [
6847 [
6843 (b'A', b'all', None, _(b'show status of all files')),
6848 (b'A', b'all', None, _(b'show status of all files')),
6844 (b'm', b'modified', None, _(b'show only modified files')),
6849 (b'm', b'modified', None, _(b'show only modified files')),
6845 (b'a', b'added', None, _(b'show only added files')),
6850 (b'a', b'added', None, _(b'show only added files')),
6846 (b'r', b'removed', None, _(b'show only removed files')),
6851 (b'r', b'removed', None, _(b'show only removed files')),
6847 (b'd', b'deleted', None, _(b'show only missing files')),
6852 (b'd', b'deleted', None, _(b'show only missing files')),
6848 (b'c', b'clean', None, _(b'show only files without changes')),
6853 (b'c', b'clean', None, _(b'show only files without changes')),
6849 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6854 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6850 (b'i', b'ignored', None, _(b'show only ignored files')),
6855 (b'i', b'ignored', None, _(b'show only ignored files')),
6851 (b'n', b'no-status', None, _(b'hide status prefix')),
6856 (b'n', b'no-status', None, _(b'hide status prefix')),
6852 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6857 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6853 (
6858 (
6854 b'C',
6859 b'C',
6855 b'copies',
6860 b'copies',
6856 None,
6861 None,
6857 _(b'show source of copied files (DEFAULT: ui.statuscopies)'),
6862 _(b'show source of copied files (DEFAULT: ui.statuscopies)'),
6858 ),
6863 ),
6859 (
6864 (
6860 b'0',
6865 b'0',
6861 b'print0',
6866 b'print0',
6862 None,
6867 None,
6863 _(b'end filenames with NUL, for use with xargs'),
6868 _(b'end filenames with NUL, for use with xargs'),
6864 ),
6869 ),
6865 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6870 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6866 (
6871 (
6867 b'',
6872 b'',
6868 b'change',
6873 b'change',
6869 b'',
6874 b'',
6870 _(b'list the changed files of a revision'),
6875 _(b'list the changed files of a revision'),
6871 _(b'REV'),
6876 _(b'REV'),
6872 ),
6877 ),
6873 ]
6878 ]
6874 + walkopts
6879 + walkopts
6875 + subrepoopts
6880 + subrepoopts
6876 + formatteropts,
6881 + formatteropts,
6877 _(b'[OPTION]... [FILE]...'),
6882 _(b'[OPTION]... [FILE]...'),
6878 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6883 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6879 helpbasic=True,
6884 helpbasic=True,
6880 inferrepo=True,
6885 inferrepo=True,
6881 intents={INTENT_READONLY},
6886 intents={INTENT_READONLY},
6882 )
6887 )
6883 def status(ui, repo, *pats, **opts):
6888 def status(ui, repo, *pats, **opts):
6884 """show changed files in the working directory
6889 """show changed files in the working directory
6885
6890
6886 Show status of files in the repository. If names are given, only
6891 Show status of files in the repository. If names are given, only
6887 files that match are shown. Files that are clean or ignored or
6892 files that match are shown. Files that are clean or ignored or
6888 the source of a copy/move operation, are not listed unless
6893 the source of a copy/move operation, are not listed unless
6889 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
6894 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
6890 Unless options described with "show only ..." are given, the
6895 Unless options described with "show only ..." are given, the
6891 options -mardu are used.
6896 options -mardu are used.
6892
6897
6893 Option -q/--quiet hides untracked (unknown and ignored) files
6898 Option -q/--quiet hides untracked (unknown and ignored) files
6894 unless explicitly requested with -u/--unknown or -i/--ignored.
6899 unless explicitly requested with -u/--unknown or -i/--ignored.
6895
6900
6896 .. note::
6901 .. note::
6897
6902
6898 :hg:`status` may appear to disagree with diff if permissions have
6903 :hg:`status` may appear to disagree with diff if permissions have
6899 changed or a merge has occurred. The standard diff format does
6904 changed or a merge has occurred. The standard diff format does
6900 not report permission changes and diff only reports changes
6905 not report permission changes and diff only reports changes
6901 relative to one merge parent.
6906 relative to one merge parent.
6902
6907
6903 If one revision is given, it is used as the base revision.
6908 If one revision is given, it is used as the base revision.
6904 If two revisions are given, the differences between them are
6909 If two revisions are given, the differences between them are
6905 shown. The --change option can also be used as a shortcut to list
6910 shown. The --change option can also be used as a shortcut to list
6906 the changed files of a revision from its first parent.
6911 the changed files of a revision from its first parent.
6907
6912
6908 The codes used to show the status of files are::
6913 The codes used to show the status of files are::
6909
6914
6910 M = modified
6915 M = modified
6911 A = added
6916 A = added
6912 R = removed
6917 R = removed
6913 C = clean
6918 C = clean
6914 ! = missing (deleted by non-hg command, but still tracked)
6919 ! = missing (deleted by non-hg command, but still tracked)
6915 ? = not tracked
6920 ? = not tracked
6916 I = ignored
6921 I = ignored
6917 = origin of the previous file (with --copies)
6922 = origin of the previous file (with --copies)
6918
6923
6919 .. container:: verbose
6924 .. container:: verbose
6920
6925
6921 The -t/--terse option abbreviates the output by showing only the directory
6926 The -t/--terse option abbreviates the output by showing only the directory
6922 name if all the files in it share the same status. The option takes an
6927 name if all the files in it share the same status. The option takes an
6923 argument indicating the statuses to abbreviate: 'm' for 'modified', 'a'
6928 argument indicating the statuses to abbreviate: 'm' for 'modified', 'a'
6924 for 'added', 'r' for 'removed', 'd' for 'deleted', 'u' for 'unknown', 'i'
6929 for 'added', 'r' for 'removed', 'd' for 'deleted', 'u' for 'unknown', 'i'
6925 for 'ignored' and 'c' for clean.
6930 for 'ignored' and 'c' for clean.
6926
6931
6927 It abbreviates only those statuses which are passed. Note that clean and
6932 It abbreviates only those statuses which are passed. Note that clean and
6928 ignored files are not displayed with '--terse ic' unless the -c/--clean
6933 ignored files are not displayed with '--terse ic' unless the -c/--clean
6929 and -i/--ignored options are also used.
6934 and -i/--ignored options are also used.
6930
6935
6931 The -v/--verbose option shows information when the repository is in an
6936 The -v/--verbose option shows information when the repository is in an
6932 unfinished merge, shelve, rebase state etc. You can have this behavior
6937 unfinished merge, shelve, rebase state etc. You can have this behavior
6933 turned on by default by enabling the ``commands.status.verbose`` option.
6938 turned on by default by enabling the ``commands.status.verbose`` option.
6934
6939
6935 You can skip displaying some of these states by setting
6940 You can skip displaying some of these states by setting
6936 ``commands.status.skipstates`` to one or more of: 'bisect', 'graft',
6941 ``commands.status.skipstates`` to one or more of: 'bisect', 'graft',
6937 'histedit', 'merge', 'rebase', or 'unshelve'.
6942 'histedit', 'merge', 'rebase', or 'unshelve'.
6938
6943
6939 Template:
6944 Template:
6940
6945
6941 The following keywords are supported in addition to the common template
6946 The following keywords are supported in addition to the common template
6942 keywords and functions. See also :hg:`help templates`.
6947 keywords and functions. See also :hg:`help templates`.
6943
6948
6944 :path: String. Repository-absolute path of the file.
6949 :path: String. Repository-absolute path of the file.
6945 :source: String. Repository-absolute path of the file originated from.
6950 :source: String. Repository-absolute path of the file originated from.
6946 Available if ``--copies`` is specified.
6951 Available if ``--copies`` is specified.
6947 :status: String. Character denoting file's status.
6952 :status: String. Character denoting file's status.
6948
6953
6949 Examples:
6954 Examples:
6950
6955
6951 - show changes in the working directory relative to a
6956 - show changes in the working directory relative to a
6952 changeset::
6957 changeset::
6953
6958
6954 hg status --rev 9353
6959 hg status --rev 9353
6955
6960
6956 - show changes in the working directory relative to the
6961 - show changes in the working directory relative to the
6957 current directory (see :hg:`help patterns` for more information)::
6962 current directory (see :hg:`help patterns` for more information)::
6958
6963
6959 hg status re:
6964 hg status re:
6960
6965
6961 - show all changes including copies in an existing changeset::
6966 - show all changes including copies in an existing changeset::
6962
6967
6963 hg status --copies --change 9353
6968 hg status --copies --change 9353
6964
6969
6965 - get a NUL separated list of added files, suitable for xargs::
6970 - get a NUL separated list of added files, suitable for xargs::
6966
6971
6967 hg status -an0
6972 hg status -an0
6968
6973
6969 - show more information about the repository status, abbreviating
6974 - show more information about the repository status, abbreviating
6970 added, removed, modified, deleted, and untracked paths::
6975 added, removed, modified, deleted, and untracked paths::
6971
6976
6972 hg status -v -t mardu
6977 hg status -v -t mardu
6973
6978
6974 Returns 0 on success.
6979 Returns 0 on success.
6975
6980
6976 """
6981 """
6977
6982
6978 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
6983 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
6979 opts = pycompat.byteskwargs(opts)
6984 opts = pycompat.byteskwargs(opts)
6980 revs = opts.get(b'rev', [])
6985 revs = opts.get(b'rev', [])
6981 change = opts.get(b'change', b'')
6986 change = opts.get(b'change', b'')
6982 terse = opts.get(b'terse', _NOTTERSE)
6987 terse = opts.get(b'terse', _NOTTERSE)
6983 if terse is _NOTTERSE:
6988 if terse is _NOTTERSE:
6984 if revs:
6989 if revs:
6985 terse = b''
6990 terse = b''
6986 else:
6991 else:
6987 terse = ui.config(b'commands', b'status.terse')
6992 terse = ui.config(b'commands', b'status.terse')
6988
6993
6989 if revs and terse:
6994 if revs and terse:
6990 msg = _(b'cannot use --terse with --rev')
6995 msg = _(b'cannot use --terse with --rev')
6991 raise error.InputError(msg)
6996 raise error.InputError(msg)
6992 elif change:
6997 elif change:
6993 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6998 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6994 ctx2 = logcmdutil.revsingle(repo, change, None)
6999 ctx2 = logcmdutil.revsingle(repo, change, None)
6995 ctx1 = ctx2.p1()
7000 ctx1 = ctx2.p1()
6996 else:
7001 else:
6997 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
7002 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
6998 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
7003 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
6999
7004
7000 forcerelativevalue = None
7005 forcerelativevalue = None
7001 if ui.hasconfig(b'commands', b'status.relative'):
7006 if ui.hasconfig(b'commands', b'status.relative'):
7002 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
7007 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
7003 uipathfn = scmutil.getuipathfn(
7008 uipathfn = scmutil.getuipathfn(
7004 repo,
7009 repo,
7005 legacyrelativevalue=bool(pats),
7010 legacyrelativevalue=bool(pats),
7006 forcerelativevalue=forcerelativevalue,
7011 forcerelativevalue=forcerelativevalue,
7007 )
7012 )
7008
7013
7009 if opts.get(b'print0'):
7014 if opts.get(b'print0'):
7010 end = b'\0'
7015 end = b'\0'
7011 else:
7016 else:
7012 end = b'\n'
7017 end = b'\n'
7013 states = b'modified added removed deleted unknown ignored clean'.split()
7018 states = b'modified added removed deleted unknown ignored clean'.split()
7014 show = [k for k in states if opts.get(k)]
7019 show = [k for k in states if opts.get(k)]
7015 if opts.get(b'all'):
7020 if opts.get(b'all'):
7016 show += ui.quiet and (states[:4] + [b'clean']) or states
7021 show += ui.quiet and (states[:4] + [b'clean']) or states
7017
7022
7018 if not show:
7023 if not show:
7019 if ui.quiet:
7024 if ui.quiet:
7020 show = states[:4]
7025 show = states[:4]
7021 else:
7026 else:
7022 show = states[:5]
7027 show = states[:5]
7023
7028
7024 m = scmutil.match(ctx2, pats, opts)
7029 m = scmutil.match(ctx2, pats, opts)
7025 if terse:
7030 if terse:
7026 # we need to compute clean and unknown to terse
7031 # we need to compute clean and unknown to terse
7027 stat = repo.status(
7032 stat = repo.status(
7028 ctx1.node(),
7033 ctx1.node(),
7029 ctx2.node(),
7034 ctx2.node(),
7030 m,
7035 m,
7031 b'ignored' in show or b'i' in terse,
7036 b'ignored' in show or b'i' in terse,
7032 clean=True,
7037 clean=True,
7033 unknown=True,
7038 unknown=True,
7034 listsubrepos=opts.get(b'subrepos'),
7039 listsubrepos=opts.get(b'subrepos'),
7035 )
7040 )
7036
7041
7037 stat = cmdutil.tersedir(stat, terse)
7042 stat = cmdutil.tersedir(stat, terse)
7038 else:
7043 else:
7039 stat = repo.status(
7044 stat = repo.status(
7040 ctx1.node(),
7045 ctx1.node(),
7041 ctx2.node(),
7046 ctx2.node(),
7042 m,
7047 m,
7043 b'ignored' in show,
7048 b'ignored' in show,
7044 b'clean' in show,
7049 b'clean' in show,
7045 b'unknown' in show,
7050 b'unknown' in show,
7046 opts.get(b'subrepos'),
7051 opts.get(b'subrepos'),
7047 )
7052 )
7048
7053
7049 changestates = zip(
7054 changestates = zip(
7050 states,
7055 states,
7051 pycompat.iterbytestr(b'MAR!?IC'),
7056 pycompat.iterbytestr(b'MAR!?IC'),
7052 [getattr(stat, s.decode('utf8')) for s in states],
7057 [getattr(stat, s.decode('utf8')) for s in states],
7053 )
7058 )
7054
7059
7055 copy = {}
7060 copy = {}
7056 show_copies = ui.configbool(b'ui', b'statuscopies')
7061 show_copies = ui.configbool(b'ui', b'statuscopies')
7057 if opts.get(b'copies') is not None:
7062 if opts.get(b'copies') is not None:
7058 show_copies = opts.get(b'copies')
7063 show_copies = opts.get(b'copies')
7059 show_copies = (show_copies or opts.get(b'all')) and not opts.get(
7064 show_copies = (show_copies or opts.get(b'all')) and not opts.get(
7060 b'no_status'
7065 b'no_status'
7061 )
7066 )
7062 if show_copies:
7067 if show_copies:
7063 copy = copies.pathcopies(ctx1, ctx2, m)
7068 copy = copies.pathcopies(ctx1, ctx2, m)
7064
7069
7065 morestatus = None
7070 morestatus = None
7066 if (
7071 if (
7067 (ui.verbose or ui.configbool(b'commands', b'status.verbose'))
7072 (ui.verbose or ui.configbool(b'commands', b'status.verbose'))
7068 and not ui.plain()
7073 and not ui.plain()
7069 and not opts.get(b'print0')
7074 and not opts.get(b'print0')
7070 ):
7075 ):
7071 morestatus = cmdutil.readmorestatus(repo)
7076 morestatus = cmdutil.readmorestatus(repo)
7072
7077
7073 ui.pager(b'status')
7078 ui.pager(b'status')
7074 fm = ui.formatter(b'status', opts)
7079 fm = ui.formatter(b'status', opts)
7075 fmt = b'%s' + end
7080 fmt = b'%s' + end
7076 showchar = not opts.get(b'no_status')
7081 showchar = not opts.get(b'no_status')
7077
7082
7078 for state, char, files in changestates:
7083 for state, char, files in changestates:
7079 if state in show:
7084 if state in show:
7080 label = b'status.' + state
7085 label = b'status.' + state
7081 for f in files:
7086 for f in files:
7082 fm.startitem()
7087 fm.startitem()
7083 fm.context(ctx=ctx2)
7088 fm.context(ctx=ctx2)
7084 fm.data(itemtype=b'file', path=f)
7089 fm.data(itemtype=b'file', path=f)
7085 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
7090 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
7086 fm.plain(fmt % uipathfn(f), label=label)
7091 fm.plain(fmt % uipathfn(f), label=label)
7087 if f in copy:
7092 if f in copy:
7088 fm.data(source=copy[f])
7093 fm.data(source=copy[f])
7089 fm.plain(
7094 fm.plain(
7090 (b' %s' + end) % uipathfn(copy[f]),
7095 (b' %s' + end) % uipathfn(copy[f]),
7091 label=b'status.copied',
7096 label=b'status.copied',
7092 )
7097 )
7093 if morestatus:
7098 if morestatus:
7094 morestatus.formatfile(f, fm)
7099 morestatus.formatfile(f, fm)
7095
7100
7096 if morestatus:
7101 if morestatus:
7097 morestatus.formatfooter(fm)
7102 morestatus.formatfooter(fm)
7098 fm.end()
7103 fm.end()
7099
7104
7100
7105
7101 @command(
7106 @command(
7102 b'summary|sum',
7107 b'summary|sum',
7103 [(b'', b'remote', None, _(b'check for push and pull'))],
7108 [(b'', b'remote', None, _(b'check for push and pull'))],
7104 b'[--remote]',
7109 b'[--remote]',
7105 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7110 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7106 helpbasic=True,
7111 helpbasic=True,
7107 intents={INTENT_READONLY},
7112 intents={INTENT_READONLY},
7108 )
7113 )
7109 def summary(ui, repo, **opts):
7114 def summary(ui, repo, **opts):
7110 """summarize working directory state
7115 """summarize working directory state
7111
7116
7112 This generates a brief summary of the working directory state,
7117 This generates a brief summary of the working directory state,
7113 including parents, branch, commit status, phase and available updates.
7118 including parents, branch, commit status, phase and available updates.
7114
7119
7115 With the --remote option, this will check the default paths for
7120 With the --remote option, this will check the default paths for
7116 incoming and outgoing changes. This can be time-consuming.
7121 incoming and outgoing changes. This can be time-consuming.
7117
7122
7118 Returns 0 on success.
7123 Returns 0 on success.
7119 """
7124 """
7120
7125
7121 ui.pager(b'summary')
7126 ui.pager(b'summary')
7122 ctx = repo[None]
7127 ctx = repo[None]
7123 parents = ctx.parents()
7128 parents = ctx.parents()
7124 pnode = parents[0].node()
7129 pnode = parents[0].node()
7125 marks = []
7130 marks = []
7126
7131
7127 try:
7132 try:
7128 ms = mergestatemod.mergestate.read(repo)
7133 ms = mergestatemod.mergestate.read(repo)
7129 except error.UnsupportedMergeRecords as e:
7134 except error.UnsupportedMergeRecords as e:
7130 s = b' '.join(e.recordtypes)
7135 s = b' '.join(e.recordtypes)
7131 ui.warn(
7136 ui.warn(
7132 _(b'warning: merge state has unsupported record types: %s\n') % s
7137 _(b'warning: merge state has unsupported record types: %s\n') % s
7133 )
7138 )
7134 unresolved = []
7139 unresolved = []
7135 else:
7140 else:
7136 unresolved = list(ms.unresolved())
7141 unresolved = list(ms.unresolved())
7137
7142
7138 for p in parents:
7143 for p in parents:
7139 # label with log.changeset (instead of log.parent) since this
7144 # label with log.changeset (instead of log.parent) since this
7140 # shows a working directory parent *changeset*:
7145 # shows a working directory parent *changeset*:
7141 # i18n: column positioning for "hg summary"
7146 # i18n: column positioning for "hg summary"
7142 ui.write(
7147 ui.write(
7143 _(b'parent: %d:%s ') % (p.rev(), p),
7148 _(b'parent: %d:%s ') % (p.rev(), p),
7144 label=logcmdutil.changesetlabels(p),
7149 label=logcmdutil.changesetlabels(p),
7145 )
7150 )
7146 ui.write(b' '.join(p.tags()), label=b'log.tag')
7151 ui.write(b' '.join(p.tags()), label=b'log.tag')
7147 if p.bookmarks():
7152 if p.bookmarks():
7148 marks.extend(p.bookmarks())
7153 marks.extend(p.bookmarks())
7149 if p.rev() == -1:
7154 if p.rev() == -1:
7150 if not len(repo):
7155 if not len(repo):
7151 ui.write(_(b' (empty repository)'))
7156 ui.write(_(b' (empty repository)'))
7152 else:
7157 else:
7153 ui.write(_(b' (no revision checked out)'))
7158 ui.write(_(b' (no revision checked out)'))
7154 if p.obsolete():
7159 if p.obsolete():
7155 ui.write(_(b' (obsolete)'))
7160 ui.write(_(b' (obsolete)'))
7156 if p.isunstable():
7161 if p.isunstable():
7157 instabilities = (
7162 instabilities = (
7158 ui.label(instability, b'trouble.%s' % instability)
7163 ui.label(instability, b'trouble.%s' % instability)
7159 for instability in p.instabilities()
7164 for instability in p.instabilities()
7160 )
7165 )
7161 ui.write(b' (' + b', '.join(instabilities) + b')')
7166 ui.write(b' (' + b', '.join(instabilities) + b')')
7162 ui.write(b'\n')
7167 ui.write(b'\n')
7163 if p.description():
7168 if p.description():
7164 ui.status(
7169 ui.status(
7165 b' ' + p.description().splitlines()[0].strip() + b'\n',
7170 b' ' + p.description().splitlines()[0].strip() + b'\n',
7166 label=b'log.summary',
7171 label=b'log.summary',
7167 )
7172 )
7168
7173
7169 branch = ctx.branch()
7174 branch = ctx.branch()
7170 bheads = repo.branchheads(branch)
7175 bheads = repo.branchheads(branch)
7171 # i18n: column positioning for "hg summary"
7176 # i18n: column positioning for "hg summary"
7172 m = _(b'branch: %s\n') % branch
7177 m = _(b'branch: %s\n') % branch
7173 if branch != b'default':
7178 if branch != b'default':
7174 ui.write(m, label=b'log.branch')
7179 ui.write(m, label=b'log.branch')
7175 else:
7180 else:
7176 ui.status(m, label=b'log.branch')
7181 ui.status(m, label=b'log.branch')
7177
7182
7178 if marks:
7183 if marks:
7179 active = repo._activebookmark
7184 active = repo._activebookmark
7180 # i18n: column positioning for "hg summary"
7185 # i18n: column positioning for "hg summary"
7181 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
7186 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
7182 if active is not None:
7187 if active is not None:
7183 if active in marks:
7188 if active in marks:
7184 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
7189 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
7185 marks.remove(active)
7190 marks.remove(active)
7186 else:
7191 else:
7187 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
7192 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
7188 for m in marks:
7193 for m in marks:
7189 ui.write(b' ' + m, label=b'log.bookmark')
7194 ui.write(b' ' + m, label=b'log.bookmark')
7190 ui.write(b'\n', label=b'log.bookmark')
7195 ui.write(b'\n', label=b'log.bookmark')
7191
7196
7192 status = repo.status(unknown=True)
7197 status = repo.status(unknown=True)
7193
7198
7194 c = repo.dirstate.copies()
7199 c = repo.dirstate.copies()
7195 copied, renamed = [], []
7200 copied, renamed = [], []
7196 for d, s in c.items():
7201 for d, s in c.items():
7197 if s in status.removed:
7202 if s in status.removed:
7198 status.removed.remove(s)
7203 status.removed.remove(s)
7199 renamed.append(d)
7204 renamed.append(d)
7200 else:
7205 else:
7201 copied.append(d)
7206 copied.append(d)
7202 if d in status.added:
7207 if d in status.added:
7203 status.added.remove(d)
7208 status.added.remove(d)
7204
7209
7205 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
7210 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
7206
7211
7207 labels = [
7212 labels = [
7208 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
7213 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
7209 (ui.label(_(b'%d added'), b'status.added'), status.added),
7214 (ui.label(_(b'%d added'), b'status.added'), status.added),
7210 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
7215 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
7211 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
7216 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
7212 (ui.label(_(b'%d copied'), b'status.copied'), copied),
7217 (ui.label(_(b'%d copied'), b'status.copied'), copied),
7213 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
7218 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
7214 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
7219 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
7215 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
7220 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
7216 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
7221 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
7217 ]
7222 ]
7218 t = []
7223 t = []
7219 for l, s in labels:
7224 for l, s in labels:
7220 if s:
7225 if s:
7221 t.append(l % len(s))
7226 t.append(l % len(s))
7222
7227
7223 t = b', '.join(t)
7228 t = b', '.join(t)
7224 cleanworkdir = False
7229 cleanworkdir = False
7225
7230
7226 if repo.vfs.exists(b'graftstate'):
7231 if repo.vfs.exists(b'graftstate'):
7227 t += _(b' (graft in progress)')
7232 t += _(b' (graft in progress)')
7228 if repo.vfs.exists(b'updatestate'):
7233 if repo.vfs.exists(b'updatestate'):
7229 t += _(b' (interrupted update)')
7234 t += _(b' (interrupted update)')
7230 elif len(parents) > 1:
7235 elif len(parents) > 1:
7231 t += _(b' (merge)')
7236 t += _(b' (merge)')
7232 elif branch != parents[0].branch():
7237 elif branch != parents[0].branch():
7233 t += _(b' (new branch)')
7238 t += _(b' (new branch)')
7234 elif parents[0].closesbranch() and pnode in repo.branchheads(
7239 elif parents[0].closesbranch() and pnode in repo.branchheads(
7235 branch, closed=True
7240 branch, closed=True
7236 ):
7241 ):
7237 t += _(b' (head closed)')
7242 t += _(b' (head closed)')
7238 elif not (
7243 elif not (
7239 status.modified
7244 status.modified
7240 or status.added
7245 or status.added
7241 or status.removed
7246 or status.removed
7242 or renamed
7247 or renamed
7243 or copied
7248 or copied
7244 or subs
7249 or subs
7245 ):
7250 ):
7246 t += _(b' (clean)')
7251 t += _(b' (clean)')
7247 cleanworkdir = True
7252 cleanworkdir = True
7248 elif pnode not in bheads:
7253 elif pnode not in bheads:
7249 t += _(b' (new branch head)')
7254 t += _(b' (new branch head)')
7250
7255
7251 if parents:
7256 if parents:
7252 pendingphase = max(p.phase() for p in parents)
7257 pendingphase = max(p.phase() for p in parents)
7253 else:
7258 else:
7254 pendingphase = phases.public
7259 pendingphase = phases.public
7255
7260
7256 if pendingphase > phases.newcommitphase(ui):
7261 if pendingphase > phases.newcommitphase(ui):
7257 t += b' (%s)' % phases.phasenames[pendingphase]
7262 t += b' (%s)' % phases.phasenames[pendingphase]
7258
7263
7259 if cleanworkdir:
7264 if cleanworkdir:
7260 # i18n: column positioning for "hg summary"
7265 # i18n: column positioning for "hg summary"
7261 ui.status(_(b'commit: %s\n') % t.strip())
7266 ui.status(_(b'commit: %s\n') % t.strip())
7262 else:
7267 else:
7263 # i18n: column positioning for "hg summary"
7268 # i18n: column positioning for "hg summary"
7264 ui.write(_(b'commit: %s\n') % t.strip())
7269 ui.write(_(b'commit: %s\n') % t.strip())
7265
7270
7266 # all ancestors of branch heads - all ancestors of parent = new csets
7271 # all ancestors of branch heads - all ancestors of parent = new csets
7267 new = len(
7272 new = len(
7268 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
7273 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
7269 )
7274 )
7270
7275
7271 if new == 0:
7276 if new == 0:
7272 # i18n: column positioning for "hg summary"
7277 # i18n: column positioning for "hg summary"
7273 ui.status(_(b'update: (current)\n'))
7278 ui.status(_(b'update: (current)\n'))
7274 elif pnode not in bheads:
7279 elif pnode not in bheads:
7275 # i18n: column positioning for "hg summary"
7280 # i18n: column positioning for "hg summary"
7276 ui.write(_(b'update: %d new changesets (update)\n') % new)
7281 ui.write(_(b'update: %d new changesets (update)\n') % new)
7277 else:
7282 else:
7278 # i18n: column positioning for "hg summary"
7283 # i18n: column positioning for "hg summary"
7279 ui.write(
7284 ui.write(
7280 _(b'update: %d new changesets, %d branch heads (merge)\n')
7285 _(b'update: %d new changesets, %d branch heads (merge)\n')
7281 % (new, len(bheads))
7286 % (new, len(bheads))
7282 )
7287 )
7283
7288
7284 t = []
7289 t = []
7285 draft = len(repo.revs(b'draft()'))
7290 draft = len(repo.revs(b'draft()'))
7286 if draft:
7291 if draft:
7287 t.append(_(b'%d draft') % draft)
7292 t.append(_(b'%d draft') % draft)
7288 secret = len(repo.revs(b'secret()'))
7293 secret = len(repo.revs(b'secret()'))
7289 if secret:
7294 if secret:
7290 t.append(_(b'%d secret') % secret)
7295 t.append(_(b'%d secret') % secret)
7291
7296
7292 if draft or secret:
7297 if draft or secret:
7293 ui.status(_(b'phases: %s\n') % b', '.join(t))
7298 ui.status(_(b'phases: %s\n') % b', '.join(t))
7294
7299
7295 if obsolete.isenabled(repo, obsolete.createmarkersopt):
7300 if obsolete.isenabled(repo, obsolete.createmarkersopt):
7296 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
7301 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
7297 numtrouble = len(repo.revs(trouble + b"()"))
7302 numtrouble = len(repo.revs(trouble + b"()"))
7298 # We write all the possibilities to ease translation
7303 # We write all the possibilities to ease translation
7299 troublemsg = {
7304 troublemsg = {
7300 b"orphan": _(b"orphan: %d changesets"),
7305 b"orphan": _(b"orphan: %d changesets"),
7301 b"contentdivergent": _(b"content-divergent: %d changesets"),
7306 b"contentdivergent": _(b"content-divergent: %d changesets"),
7302 b"phasedivergent": _(b"phase-divergent: %d changesets"),
7307 b"phasedivergent": _(b"phase-divergent: %d changesets"),
7303 }
7308 }
7304 if numtrouble > 0:
7309 if numtrouble > 0:
7305 ui.status(troublemsg[trouble] % numtrouble + b"\n")
7310 ui.status(troublemsg[trouble] % numtrouble + b"\n")
7306
7311
7307 cmdutil.summaryhooks(ui, repo)
7312 cmdutil.summaryhooks(ui, repo)
7308
7313
7309 if opts.get('remote'):
7314 if opts.get('remote'):
7310 needsincoming, needsoutgoing = True, True
7315 needsincoming, needsoutgoing = True, True
7311 else:
7316 else:
7312 needsincoming, needsoutgoing = False, False
7317 needsincoming, needsoutgoing = False, False
7313 for i, o in cmdutil.summaryremotehooks(
7318 for i, o in cmdutil.summaryremotehooks(
7314 ui, repo, pycompat.byteskwargs(opts), None
7319 ui, repo, pycompat.byteskwargs(opts), None
7315 ):
7320 ):
7316 if i:
7321 if i:
7317 needsincoming = True
7322 needsincoming = True
7318 if o:
7323 if o:
7319 needsoutgoing = True
7324 needsoutgoing = True
7320 if not needsincoming and not needsoutgoing:
7325 if not needsincoming and not needsoutgoing:
7321 return
7326 return
7322
7327
7323 def getincoming():
7328 def getincoming():
7324 # XXX We should actually skip this if no default is specified, instead
7329 # XXX We should actually skip this if no default is specified, instead
7325 # of passing "default" which will resolve as "./default/" if no default
7330 # of passing "default" which will resolve as "./default/" if no default
7326 # path is defined.
7331 # path is defined.
7327 path = urlutil.get_unique_pull_path_obj(b'summary', ui, b'default')
7332 path = urlutil.get_unique_pull_path_obj(b'summary', ui, b'default')
7328 sbranch = path.branch
7333 sbranch = path.branch
7329 try:
7334 try:
7330 other = hg.peer(repo, {}, path)
7335 other = hg.peer(repo, {}, path)
7331 except error.RepoError:
7336 except error.RepoError:
7332 if opts.get('remote'):
7337 if opts.get('remote'):
7333 raise
7338 raise
7334 return path.loc, sbranch, None, None, None
7339 return path.loc, sbranch, None, None, None
7335 branches = (path.branch, [])
7340 branches = (path.branch, [])
7336 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
7341 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
7337 if revs:
7342 if revs:
7338 revs = [other.lookup(rev) for rev in revs]
7343 revs = [other.lookup(rev) for rev in revs]
7339 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(path.loc))
7344 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(path.loc))
7340 with repo.ui.silent():
7345 with repo.ui.silent():
7341 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
7346 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
7342 return path.loc, sbranch, other, commoninc, commoninc[1]
7347 return path.loc, sbranch, other, commoninc, commoninc[1]
7343
7348
7344 if needsincoming:
7349 if needsincoming:
7345 source, sbranch, sother, commoninc, incoming = getincoming()
7350 source, sbranch, sother, commoninc, incoming = getincoming()
7346 else:
7351 else:
7347 source = sbranch = sother = commoninc = incoming = None
7352 source = sbranch = sother = commoninc = incoming = None
7348
7353
7349 def getoutgoing():
7354 def getoutgoing():
7350 # XXX We should actually skip this if no default is specified, instead
7355 # XXX We should actually skip this if no default is specified, instead
7351 # of passing "default" which will resolve as "./default/" if no default
7356 # of passing "default" which will resolve as "./default/" if no default
7352 # path is defined.
7357 # path is defined.
7353 d = None
7358 d = None
7354 if b'default-push' in ui.paths:
7359 if b'default-push' in ui.paths:
7355 d = b'default-push'
7360 d = b'default-push'
7356 elif b'default' in ui.paths:
7361 elif b'default' in ui.paths:
7357 d = b'default'
7362 d = b'default'
7358 path = None
7363 path = None
7359 if d is not None:
7364 if d is not None:
7360 path = urlutil.get_unique_push_path(b'summary', repo, ui, d)
7365 path = urlutil.get_unique_push_path(b'summary', repo, ui, d)
7361 dest = path.loc
7366 dest = path.loc
7362 dbranch = path.branch
7367 dbranch = path.branch
7363 else:
7368 else:
7364 dest = b'default'
7369 dest = b'default'
7365 dbranch = None
7370 dbranch = None
7366 revs, checkout = hg.addbranchrevs(repo, repo, (dbranch, []), None)
7371 revs, checkout = hg.addbranchrevs(repo, repo, (dbranch, []), None)
7367 if source != dest:
7372 if source != dest:
7368 try:
7373 try:
7369 dother = hg.peer(repo, {}, path if path is not None else dest)
7374 dother = hg.peer(repo, {}, path if path is not None else dest)
7370 except error.RepoError:
7375 except error.RepoError:
7371 if opts.get('remote'):
7376 if opts.get('remote'):
7372 raise
7377 raise
7373 return dest, dbranch, None, None
7378 return dest, dbranch, None, None
7374 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(dest))
7379 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(dest))
7375 elif sother is None:
7380 elif sother is None:
7376 # there is no explicit destination peer, but source one is invalid
7381 # there is no explicit destination peer, but source one is invalid
7377 return dest, dbranch, None, None
7382 return dest, dbranch, None, None
7378 else:
7383 else:
7379 dother = sother
7384 dother = sother
7380 if source != dest or (sbranch is not None and sbranch != dbranch):
7385 if source != dest or (sbranch is not None and sbranch != dbranch):
7381 common = None
7386 common = None
7382 else:
7387 else:
7383 common = commoninc
7388 common = commoninc
7384 if revs:
7389 if revs:
7385 revs = [repo.lookup(rev) for rev in revs]
7390 revs = [repo.lookup(rev) for rev in revs]
7386 with repo.ui.silent():
7391 with repo.ui.silent():
7387 outgoing = discovery.findcommonoutgoing(
7392 outgoing = discovery.findcommonoutgoing(
7388 repo, dother, onlyheads=revs, commoninc=common
7393 repo, dother, onlyheads=revs, commoninc=common
7389 )
7394 )
7390 return dest, dbranch, dother, outgoing
7395 return dest, dbranch, dother, outgoing
7391
7396
7392 if needsoutgoing:
7397 if needsoutgoing:
7393 dest, dbranch, dother, outgoing = getoutgoing()
7398 dest, dbranch, dother, outgoing = getoutgoing()
7394 else:
7399 else:
7395 dest = dbranch = dother = outgoing = None
7400 dest = dbranch = dother = outgoing = None
7396
7401
7397 if opts.get('remote'):
7402 if opts.get('remote'):
7398 # Help pytype. --remote sets both `needsincoming` and `needsoutgoing`.
7403 # Help pytype. --remote sets both `needsincoming` and `needsoutgoing`.
7399 # The former always sets `sother` (or raises an exception if it can't);
7404 # The former always sets `sother` (or raises an exception if it can't);
7400 # the latter always sets `outgoing`.
7405 # the latter always sets `outgoing`.
7401 assert sother is not None
7406 assert sother is not None
7402 assert outgoing is not None
7407 assert outgoing is not None
7403
7408
7404 t = []
7409 t = []
7405 if incoming:
7410 if incoming:
7406 t.append(_(b'1 or more incoming'))
7411 t.append(_(b'1 or more incoming'))
7407 o = outgoing.missing
7412 o = outgoing.missing
7408 if o:
7413 if o:
7409 t.append(_(b'%d outgoing') % len(o))
7414 t.append(_(b'%d outgoing') % len(o))
7410 other = dother or sother
7415 other = dother or sother
7411 if b'bookmarks' in other.listkeys(b'namespaces'):
7416 if b'bookmarks' in other.listkeys(b'namespaces'):
7412 counts = bookmarks.summary(repo, other)
7417 counts = bookmarks.summary(repo, other)
7413 if counts[0] > 0:
7418 if counts[0] > 0:
7414 t.append(_(b'%d incoming bookmarks') % counts[0])
7419 t.append(_(b'%d incoming bookmarks') % counts[0])
7415 if counts[1] > 0:
7420 if counts[1] > 0:
7416 t.append(_(b'%d outgoing bookmarks') % counts[1])
7421 t.append(_(b'%d outgoing bookmarks') % counts[1])
7417
7422
7418 if t:
7423 if t:
7419 # i18n: column positioning for "hg summary"
7424 # i18n: column positioning for "hg summary"
7420 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
7425 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
7421 else:
7426 else:
7422 # i18n: column positioning for "hg summary"
7427 # i18n: column positioning for "hg summary"
7423 ui.status(_(b'remote: (synced)\n'))
7428 ui.status(_(b'remote: (synced)\n'))
7424
7429
7425 cmdutil.summaryremotehooks(
7430 cmdutil.summaryremotehooks(
7426 ui,
7431 ui,
7427 repo,
7432 repo,
7428 pycompat.byteskwargs(opts),
7433 pycompat.byteskwargs(opts),
7429 (
7434 (
7430 (source, sbranch, sother, commoninc),
7435 (source, sbranch, sother, commoninc),
7431 (dest, dbranch, dother, outgoing),
7436 (dest, dbranch, dother, outgoing),
7432 ),
7437 ),
7433 )
7438 )
7434
7439
7435
7440
7436 @command(
7441 @command(
7437 b'tag',
7442 b'tag',
7438 [
7443 [
7439 (b'f', b'force', None, _(b'force tag')),
7444 (b'f', b'force', None, _(b'force tag')),
7440 (b'l', b'local', None, _(b'make the tag local')),
7445 (b'l', b'local', None, _(b'make the tag local')),
7441 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7446 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7442 (b'', b'remove', None, _(b'remove a tag')),
7447 (b'', b'remove', None, _(b'remove a tag')),
7443 # -l/--local is already there, commitopts cannot be used
7448 # -l/--local is already there, commitopts cannot be used
7444 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7449 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7445 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7450 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7446 ]
7451 ]
7447 + commitopts2,
7452 + commitopts2,
7448 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7453 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7449 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7454 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7450 )
7455 )
7451 def tag(ui, repo, name1, *names, **opts):
7456 def tag(ui, repo, name1, *names, **opts):
7452 """add one or more tags for the current or given revision
7457 """add one or more tags for the current or given revision
7453
7458
7454 Name a particular revision using <name>.
7459 Name a particular revision using <name>.
7455
7460
7456 Tags are used to name particular revisions of the repository and are
7461 Tags are used to name particular revisions of the repository and are
7457 very useful to compare different revisions, to go back to significant
7462 very useful to compare different revisions, to go back to significant
7458 earlier versions or to mark branch points as releases, etc. Changing
7463 earlier versions or to mark branch points as releases, etc. Changing
7459 an existing tag is normally disallowed; use -f/--force to override.
7464 an existing tag is normally disallowed; use -f/--force to override.
7460
7465
7461 If no revision is given, the parent of the working directory is
7466 If no revision is given, the parent of the working directory is
7462 used.
7467 used.
7463
7468
7464 To facilitate version control, distribution, and merging of tags,
7469 To facilitate version control, distribution, and merging of tags,
7465 they are stored as a file named ".hgtags" which is managed similarly
7470 they are stored as a file named ".hgtags" which is managed similarly
7466 to other project files and can be hand-edited if necessary. This
7471 to other project files and can be hand-edited if necessary. This
7467 also means that tagging creates a new commit. The file
7472 also means that tagging creates a new commit. The file
7468 ".hg/localtags" is used for local tags (not shared among
7473 ".hg/localtags" is used for local tags (not shared among
7469 repositories).
7474 repositories).
7470
7475
7471 Tag commits are usually made at the head of a branch. If the parent
7476 Tag commits are usually made at the head of a branch. If the parent
7472 of the working directory is not a branch head, :hg:`tag` aborts; use
7477 of the working directory is not a branch head, :hg:`tag` aborts; use
7473 -f/--force to force the tag commit to be based on a non-head
7478 -f/--force to force the tag commit to be based on a non-head
7474 changeset.
7479 changeset.
7475
7480
7476 See :hg:`help dates` for a list of formats valid for -d/--date.
7481 See :hg:`help dates` for a list of formats valid for -d/--date.
7477
7482
7478 Since tag names have priority over branch names during revision
7483 Since tag names have priority over branch names during revision
7479 lookup, using an existing branch name as a tag name is discouraged.
7484 lookup, using an existing branch name as a tag name is discouraged.
7480
7485
7481 Returns 0 on success.
7486 Returns 0 on success.
7482 """
7487 """
7483 cmdutil.check_incompatible_arguments(opts, 'remove', ['rev'])
7488 cmdutil.check_incompatible_arguments(opts, 'remove', ['rev'])
7484
7489
7485 with repo.wlock(), repo.lock():
7490 with repo.wlock(), repo.lock():
7486 rev_ = b"."
7491 rev_ = b"."
7487 names = [t.strip() for t in (name1,) + names]
7492 names = [t.strip() for t in (name1,) + names]
7488 if len(names) != len(set(names)):
7493 if len(names) != len(set(names)):
7489 raise error.InputError(_(b'tag names must be unique'))
7494 raise error.InputError(_(b'tag names must be unique'))
7490 for n in names:
7495 for n in names:
7491 scmutil.checknewlabel(repo, n, b'tag')
7496 scmutil.checknewlabel(repo, n, b'tag')
7492 if not n:
7497 if not n:
7493 raise error.InputError(
7498 raise error.InputError(
7494 _(b'tag names cannot consist entirely of whitespace')
7499 _(b'tag names cannot consist entirely of whitespace')
7495 )
7500 )
7496 if opts.get('rev'):
7501 if opts.get('rev'):
7497 rev_ = opts['rev']
7502 rev_ = opts['rev']
7498 message = opts.get('message')
7503 message = opts.get('message')
7499 if opts.get('remove'):
7504 if opts.get('remove'):
7500 if opts.get('local'):
7505 if opts.get('local'):
7501 expectedtype = b'local'
7506 expectedtype = b'local'
7502 else:
7507 else:
7503 expectedtype = b'global'
7508 expectedtype = b'global'
7504
7509
7505 for n in names:
7510 for n in names:
7506 if repo.tagtype(n) == b'global':
7511 if repo.tagtype(n) == b'global':
7507 alltags = tagsmod.findglobaltags(ui, repo)
7512 alltags = tagsmod.findglobaltags(ui, repo)
7508 if alltags[n][0] == repo.nullid:
7513 if alltags[n][0] == repo.nullid:
7509 raise error.InputError(
7514 raise error.InputError(
7510 _(b"tag '%s' is already removed") % n
7515 _(b"tag '%s' is already removed") % n
7511 )
7516 )
7512 if not repo.tagtype(n):
7517 if not repo.tagtype(n):
7513 raise error.InputError(_(b"tag '%s' does not exist") % n)
7518 raise error.InputError(_(b"tag '%s' does not exist") % n)
7514 if repo.tagtype(n) != expectedtype:
7519 if repo.tagtype(n) != expectedtype:
7515 if expectedtype == b'global':
7520 if expectedtype == b'global':
7516 raise error.InputError(
7521 raise error.InputError(
7517 _(b"tag '%s' is not a global tag") % n
7522 _(b"tag '%s' is not a global tag") % n
7518 )
7523 )
7519 else:
7524 else:
7520 raise error.InputError(
7525 raise error.InputError(
7521 _(b"tag '%s' is not a local tag") % n
7526 _(b"tag '%s' is not a local tag") % n
7522 )
7527 )
7523 rev_ = b'null'
7528 rev_ = b'null'
7524 if not message:
7529 if not message:
7525 # we don't translate commit messages
7530 # we don't translate commit messages
7526 message = b'Removed tag %s' % b', '.join(names)
7531 message = b'Removed tag %s' % b', '.join(names)
7527 elif not opts.get('force'):
7532 elif not opts.get('force'):
7528 for n in names:
7533 for n in names:
7529 if n in repo.tags():
7534 if n in repo.tags():
7530 raise error.InputError(
7535 raise error.InputError(
7531 _(b"tag '%s' already exists (use -f to force)") % n
7536 _(b"tag '%s' already exists (use -f to force)") % n
7532 )
7537 )
7533 if not opts.get('local'):
7538 if not opts.get('local'):
7534 p1, p2 = repo.dirstate.parents()
7539 p1, p2 = repo.dirstate.parents()
7535 if p2 != repo.nullid:
7540 if p2 != repo.nullid:
7536 raise error.StateError(_(b'uncommitted merge'))
7541 raise error.StateError(_(b'uncommitted merge'))
7537 bheads = repo.branchheads()
7542 bheads = repo.branchheads()
7538 if not opts.get('force') and bheads and p1 not in bheads:
7543 if not opts.get('force') and bheads and p1 not in bheads:
7539 raise error.InputError(
7544 raise error.InputError(
7540 _(
7545 _(
7541 b'working directory is not at a branch head '
7546 b'working directory is not at a branch head '
7542 b'(use -f to force)'
7547 b'(use -f to force)'
7543 )
7548 )
7544 )
7549 )
7545 node = logcmdutil.revsingle(repo, rev_).node()
7550 node = logcmdutil.revsingle(repo, rev_).node()
7546
7551
7547 # don't allow tagging the null rev or the working directory
7552 # don't allow tagging the null rev or the working directory
7548 if node is None:
7553 if node is None:
7549 raise error.InputError(_(b"cannot tag working directory"))
7554 raise error.InputError(_(b"cannot tag working directory"))
7550 elif not opts.get('remove') and node == nullid:
7555 elif not opts.get('remove') and node == nullid:
7551 raise error.InputError(_(b"cannot tag null revision"))
7556 raise error.InputError(_(b"cannot tag null revision"))
7552
7557
7553 if not message:
7558 if not message:
7554 # we don't translate commit messages
7559 # we don't translate commit messages
7555 message = b'Added tag %s for changeset %s' % (
7560 message = b'Added tag %s for changeset %s' % (
7556 b', '.join(names),
7561 b', '.join(names),
7557 short(node),
7562 short(node),
7558 )
7563 )
7559
7564
7560 date = opts.get('date')
7565 date = opts.get('date')
7561 if date:
7566 if date:
7562 date = dateutil.parsedate(date)
7567 date = dateutil.parsedate(date)
7563
7568
7564 if opts.get('remove'):
7569 if opts.get('remove'):
7565 editform = b'tag.remove'
7570 editform = b'tag.remove'
7566 else:
7571 else:
7567 editform = b'tag.add'
7572 editform = b'tag.add'
7568 editor = cmdutil.getcommiteditor(editform=editform, **opts)
7573 editor = cmdutil.getcommiteditor(editform=editform, **opts)
7569
7574
7570 tagsmod.tag(
7575 tagsmod.tag(
7571 repo,
7576 repo,
7572 names,
7577 names,
7573 node,
7578 node,
7574 message,
7579 message,
7575 opts.get('local'),
7580 opts.get('local'),
7576 opts.get('user'),
7581 opts.get('user'),
7577 date,
7582 date,
7578 editor=editor,
7583 editor=editor,
7579 )
7584 )
7580
7585
7581
7586
7582 @command(
7587 @command(
7583 b'tags',
7588 b'tags',
7584 formatteropts,
7589 formatteropts,
7585 b'',
7590 b'',
7586 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7591 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7587 intents={INTENT_READONLY},
7592 intents={INTENT_READONLY},
7588 )
7593 )
7589 def tags(ui, repo, **opts):
7594 def tags(ui, repo, **opts):
7590 """list repository tags
7595 """list repository tags
7591
7596
7592 This lists both regular and local tags. When the -v/--verbose
7597 This lists both regular and local tags. When the -v/--verbose
7593 switch is used, a third column "local" is printed for local tags.
7598 switch is used, a third column "local" is printed for local tags.
7594 When the -q/--quiet switch is used, only the tag name is printed.
7599 When the -q/--quiet switch is used, only the tag name is printed.
7595
7600
7596 .. container:: verbose
7601 .. container:: verbose
7597
7602
7598 Template:
7603 Template:
7599
7604
7600 The following keywords are supported in addition to the common template
7605 The following keywords are supported in addition to the common template
7601 keywords and functions such as ``{tag}``. See also
7606 keywords and functions such as ``{tag}``. See also
7602 :hg:`help templates`.
7607 :hg:`help templates`.
7603
7608
7604 :type: String. ``local`` for local tags.
7609 :type: String. ``local`` for local tags.
7605
7610
7606 Returns 0 on success.
7611 Returns 0 on success.
7607 """
7612 """
7608
7613
7609 ui.pager(b'tags')
7614 ui.pager(b'tags')
7610 fm = ui.formatter(b'tags', pycompat.byteskwargs(opts))
7615 fm = ui.formatter(b'tags', pycompat.byteskwargs(opts))
7611 hexfunc = fm.hexfunc
7616 hexfunc = fm.hexfunc
7612
7617
7613 for t, n in reversed(repo.tagslist()):
7618 for t, n in reversed(repo.tagslist()):
7614 hn = hexfunc(n)
7619 hn = hexfunc(n)
7615 label = b'tags.normal'
7620 label = b'tags.normal'
7616 tagtype = repo.tagtype(t)
7621 tagtype = repo.tagtype(t)
7617 if not tagtype or tagtype == b'global':
7622 if not tagtype or tagtype == b'global':
7618 tagtype = b''
7623 tagtype = b''
7619 else:
7624 else:
7620 label = b'tags.' + tagtype
7625 label = b'tags.' + tagtype
7621
7626
7622 fm.startitem()
7627 fm.startitem()
7623 fm.context(repo=repo)
7628 fm.context(repo=repo)
7624 fm.write(b'tag', b'%s', t, label=label)
7629 fm.write(b'tag', b'%s', t, label=label)
7625 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7630 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7626 fm.condwrite(
7631 fm.condwrite(
7627 not ui.quiet,
7632 not ui.quiet,
7628 b'rev node',
7633 b'rev node',
7629 fmt,
7634 fmt,
7630 repo.changelog.rev(n),
7635 repo.changelog.rev(n),
7631 hn,
7636 hn,
7632 label=label,
7637 label=label,
7633 )
7638 )
7634 fm.condwrite(
7639 fm.condwrite(
7635 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7640 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7636 )
7641 )
7637 fm.plain(b'\n')
7642 fm.plain(b'\n')
7638 fm.end()
7643 fm.end()
7639
7644
7640
7645
7641 @command(
7646 @command(
7642 b'tip',
7647 b'tip',
7643 [
7648 [
7644 (b'p', b'patch', None, _(b'show patch')),
7649 (b'p', b'patch', None, _(b'show patch')),
7645 (b'g', b'git', None, _(b'use git extended diff format')),
7650 (b'g', b'git', None, _(b'use git extended diff format')),
7646 ]
7651 ]
7647 + templateopts,
7652 + templateopts,
7648 _(b'[-p] [-g]'),
7653 _(b'[-p] [-g]'),
7649 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7654 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7650 )
7655 )
7651 def tip(ui, repo, **opts):
7656 def tip(ui, repo, **opts):
7652 """show the tip revision (DEPRECATED)
7657 """show the tip revision (DEPRECATED)
7653
7658
7654 The tip revision (usually just called the tip) is the changeset
7659 The tip revision (usually just called the tip) is the changeset
7655 most recently added to the repository (and therefore the most
7660 most recently added to the repository (and therefore the most
7656 recently changed head).
7661 recently changed head).
7657
7662
7658 If you have just made a commit, that commit will be the tip. If
7663 If you have just made a commit, that commit will be the tip. If
7659 you have just pulled changes from another repository, the tip of
7664 you have just pulled changes from another repository, the tip of
7660 that repository becomes the current tip. The "tip" tag is special
7665 that repository becomes the current tip. The "tip" tag is special
7661 and cannot be renamed or assigned to a different changeset.
7666 and cannot be renamed or assigned to a different changeset.
7662
7667
7663 This command is deprecated, please use :hg:`heads` instead.
7668 This command is deprecated, please use :hg:`heads` instead.
7664
7669
7665 Returns 0 on success.
7670 Returns 0 on success.
7666 """
7671 """
7667 opts = pycompat.byteskwargs(opts)
7672 opts = pycompat.byteskwargs(opts)
7668 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7673 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7669 displayer.show(repo[b'tip'])
7674 displayer.show(repo[b'tip'])
7670 displayer.close()
7675 displayer.close()
7671
7676
7672
7677
7673 @command(
7678 @command(
7674 b'unbundle',
7679 b'unbundle',
7675 [
7680 [
7676 (
7681 (
7677 b'u',
7682 b'u',
7678 b'update',
7683 b'update',
7679 None,
7684 None,
7680 _(b'update to new branch head if changesets were unbundled'),
7685 _(b'update to new branch head if changesets were unbundled'),
7681 )
7686 )
7682 ],
7687 ],
7683 _(b'[-u] FILE...'),
7688 _(b'[-u] FILE...'),
7684 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7689 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7685 )
7690 )
7686 def unbundle(ui, repo, fname1, *fnames, **opts):
7691 def unbundle(ui, repo, fname1, *fnames, **opts):
7687 """apply one or more bundle files
7692 """apply one or more bundle files
7688
7693
7689 Apply one or more bundle files generated by :hg:`bundle`.
7694 Apply one or more bundle files generated by :hg:`bundle`.
7690
7695
7691 Returns 0 on success, 1 if an update has unresolved files.
7696 Returns 0 on success, 1 if an update has unresolved files.
7692 """
7697 """
7693 fnames = (fname1,) + fnames
7698 fnames = (fname1,) + fnames
7694
7699
7695 with repo.lock():
7700 with repo.lock():
7696 for fname in fnames:
7701 for fname in fnames:
7697 f = hg.openpath(ui, fname)
7702 f = hg.openpath(ui, fname)
7698 gen = exchange.readbundle(ui, f, fname)
7703 gen = exchange.readbundle(ui, f, fname)
7699 if isinstance(gen, streamclone.streamcloneapplier):
7704 if isinstance(gen, streamclone.streamcloneapplier):
7700 raise error.InputError(
7705 raise error.InputError(
7701 _(
7706 _(
7702 b'packed bundles cannot be applied with '
7707 b'packed bundles cannot be applied with '
7703 b'"hg unbundle"'
7708 b'"hg unbundle"'
7704 ),
7709 ),
7705 hint=_(b'use "hg debugapplystreamclonebundle"'),
7710 hint=_(b'use "hg debugapplystreamclonebundle"'),
7706 )
7711 )
7707 url = b'bundle:' + fname
7712 url = b'bundle:' + fname
7708 try:
7713 try:
7709 txnname = b'unbundle'
7714 txnname = b'unbundle'
7710 if not isinstance(gen, bundle2.unbundle20):
7715 if not isinstance(gen, bundle2.unbundle20):
7711 txnname = b'unbundle\n%s' % urlutil.hidepassword(url)
7716 txnname = b'unbundle\n%s' % urlutil.hidepassword(url)
7712 with repo.transaction(txnname) as tr:
7717 with repo.transaction(txnname) as tr:
7713 op = bundle2.applybundle(
7718 op = bundle2.applybundle(
7714 repo, gen, tr, source=b'unbundle', url=url
7719 repo, gen, tr, source=b'unbundle', url=url
7715 )
7720 )
7716 except error.BundleUnknownFeatureError as exc:
7721 except error.BundleUnknownFeatureError as exc:
7717 raise error.Abort(
7722 raise error.Abort(
7718 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7723 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7719 hint=_(
7724 hint=_(
7720 b"see https://mercurial-scm.org/"
7725 b"see https://mercurial-scm.org/"
7721 b"wiki/BundleFeature for more "
7726 b"wiki/BundleFeature for more "
7722 b"information"
7727 b"information"
7723 ),
7728 ),
7724 )
7729 )
7725 modheads = bundle2.combinechangegroupresults(op)
7730 modheads = bundle2.combinechangegroupresults(op)
7726
7731
7727 if postincoming(ui, repo, modheads, opts.get('update'), None, None):
7732 if postincoming(ui, repo, modheads, opts.get('update'), None, None):
7728 return 1
7733 return 1
7729 else:
7734 else:
7730 return 0
7735 return 0
7731
7736
7732
7737
7733 @command(
7738 @command(
7734 b'unshelve',
7739 b'unshelve',
7735 [
7740 [
7736 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7741 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7737 (
7742 (
7738 b'c',
7743 b'c',
7739 b'continue',
7744 b'continue',
7740 None,
7745 None,
7741 _(b'continue an incomplete unshelve operation'),
7746 _(b'continue an incomplete unshelve operation'),
7742 ),
7747 ),
7743 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7748 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7744 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7749 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7745 (
7750 (
7746 b'n',
7751 b'n',
7747 b'name',
7752 b'name',
7748 b'',
7753 b'',
7749 _(b'restore shelved change with given name'),
7754 _(b'restore shelved change with given name'),
7750 _(b'NAME'),
7755 _(b'NAME'),
7751 ),
7756 ),
7752 (b't', b'tool', b'', _(b'specify merge tool')),
7757 (b't', b'tool', b'', _(b'specify merge tool')),
7753 (
7758 (
7754 b'',
7759 b'',
7755 b'date',
7760 b'date',
7756 b'',
7761 b'',
7757 _(b'set date for temporary commits (DEPRECATED)'),
7762 _(b'set date for temporary commits (DEPRECATED)'),
7758 _(b'DATE'),
7763 _(b'DATE'),
7759 ),
7764 ),
7760 ],
7765 ],
7761 _(b'hg unshelve [OPTION]... [[-n] SHELVED]'),
7766 _(b'hg unshelve [OPTION]... [[-n] SHELVED]'),
7762 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7767 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7763 )
7768 )
7764 def unshelve(ui, repo, *shelved, **opts):
7769 def unshelve(ui, repo, *shelved, **opts):
7765 """restore a shelved change to the working directory
7770 """restore a shelved change to the working directory
7766
7771
7767 This command accepts an optional name of a shelved change to
7772 This command accepts an optional name of a shelved change to
7768 restore. If none is given, the most recent shelved change is used.
7773 restore. If none is given, the most recent shelved change is used.
7769
7774
7770 If a shelved change is applied successfully, the bundle that
7775 If a shelved change is applied successfully, the bundle that
7771 contains the shelved changes is moved to a backup location
7776 contains the shelved changes is moved to a backup location
7772 (.hg/shelve-backup).
7777 (.hg/shelve-backup).
7773
7778
7774 Since you can restore a shelved change on top of an arbitrary
7779 Since you can restore a shelved change on top of an arbitrary
7775 commit, it is possible that unshelving will result in a conflict
7780 commit, it is possible that unshelving will result in a conflict
7776 between your changes and the commits you are unshelving onto. If
7781 between your changes and the commits you are unshelving onto. If
7777 this occurs, you must resolve the conflict, then use
7782 this occurs, you must resolve the conflict, then use
7778 ``--continue`` to complete the unshelve operation. (The bundle
7783 ``--continue`` to complete the unshelve operation. (The bundle
7779 will not be moved until you successfully complete the unshelve.)
7784 will not be moved until you successfully complete the unshelve.)
7780
7785
7781 (Alternatively, you can use ``--abort`` to abandon an unshelve
7786 (Alternatively, you can use ``--abort`` to abandon an unshelve
7782 that causes a conflict. This reverts the unshelved changes, and
7787 that causes a conflict. This reverts the unshelved changes, and
7783 leaves the bundle in place.)
7788 leaves the bundle in place.)
7784
7789
7785 If bare shelved change (without interactive, include and exclude
7790 If bare shelved change (without interactive, include and exclude
7786 option) was done on newly created branch it would restore branch
7791 option) was done on newly created branch it would restore branch
7787 information to the working directory.
7792 information to the working directory.
7788
7793
7789 After a successful unshelve, the shelved changes are stored in a
7794 After a successful unshelve, the shelved changes are stored in a
7790 backup directory. Only the N most recent backups are kept. N
7795 backup directory. Only the N most recent backups are kept. N
7791 defaults to 10 but can be overridden using the ``shelve.maxbackups``
7796 defaults to 10 but can be overridden using the ``shelve.maxbackups``
7792 configuration option.
7797 configuration option.
7793
7798
7794 .. container:: verbose
7799 .. container:: verbose
7795
7800
7796 Timestamp in seconds is used to decide order of backups. More
7801 Timestamp in seconds is used to decide order of backups. More
7797 than ``maxbackups`` backups are kept, if same timestamp
7802 than ``maxbackups`` backups are kept, if same timestamp
7798 prevents from deciding exact order of them, for safety.
7803 prevents from deciding exact order of them, for safety.
7799
7804
7800 Selected changes can be unshelved with ``--interactive`` flag.
7805 Selected changes can be unshelved with ``--interactive`` flag.
7801 The working directory is updated with the selected changes, and
7806 The working directory is updated with the selected changes, and
7802 only the unselected changes remain shelved.
7807 only the unselected changes remain shelved.
7803 Note: The whole shelve is applied to working directory first before
7808 Note: The whole shelve is applied to working directory first before
7804 running interactively. So, this will bring up all the conflicts between
7809 running interactively. So, this will bring up all the conflicts between
7805 working directory and the shelve, irrespective of which changes will be
7810 working directory and the shelve, irrespective of which changes will be
7806 unshelved.
7811 unshelved.
7807 """
7812 """
7808 with repo.wlock():
7813 with repo.wlock():
7809 return shelvemod.unshelvecmd(ui, repo, *shelved, **opts)
7814 return shelvemod.unshelvecmd(ui, repo, *shelved, **opts)
7810
7815
7811
7816
7812 statemod.addunfinished(
7817 statemod.addunfinished(
7813 b'unshelve',
7818 b'unshelve',
7814 fname=b'shelvedstate',
7819 fname=b'shelvedstate',
7815 continueflag=True,
7820 continueflag=True,
7816 abortfunc=shelvemod.hgabortunshelve,
7821 abortfunc=shelvemod.hgabortunshelve,
7817 continuefunc=shelvemod.hgcontinueunshelve,
7822 continuefunc=shelvemod.hgcontinueunshelve,
7818 cmdmsg=_(b'unshelve already in progress'),
7823 cmdmsg=_(b'unshelve already in progress'),
7819 )
7824 )
7820
7825
7821
7826
7822 @command(
7827 @command(
7823 b'update|up|checkout|co',
7828 b'update|up|checkout|co',
7824 [
7829 [
7825 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7830 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7826 (b'c', b'check', None, _(b'require clean working directory')),
7831 (b'c', b'check', None, _(b'require clean working directory')),
7827 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7832 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7828 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7833 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7829 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7834 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7830 ]
7835 ]
7831 + mergetoolopts,
7836 + mergetoolopts,
7832 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7837 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7833 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7838 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7834 helpbasic=True,
7839 helpbasic=True,
7835 )
7840 )
7836 def update(ui, repo, node=None, **opts):
7841 def update(ui, repo, node=None, **opts):
7837 """update working directory (or switch revisions)
7842 """update working directory (or switch revisions)
7838
7843
7839 Update the repository's working directory to the specified
7844 Update the repository's working directory to the specified
7840 changeset. If no changeset is specified, update to the tip of the
7845 changeset. If no changeset is specified, update to the tip of the
7841 current named branch and move the active bookmark (see :hg:`help
7846 current named branch and move the active bookmark (see :hg:`help
7842 bookmarks`).
7847 bookmarks`).
7843
7848
7844 Update sets the working directory's parent revision to the specified
7849 Update sets the working directory's parent revision to the specified
7845 changeset (see :hg:`help parents`).
7850 changeset (see :hg:`help parents`).
7846
7851
7847 If the changeset is not a descendant or ancestor of the working
7852 If the changeset is not a descendant or ancestor of the working
7848 directory's parent and there are uncommitted changes, the update is
7853 directory's parent and there are uncommitted changes, the update is
7849 aborted. With the -c/--check option, the working directory is checked
7854 aborted. With the -c/--check option, the working directory is checked
7850 for uncommitted changes; if none are found, the working directory is
7855 for uncommitted changes; if none are found, the working directory is
7851 updated to the specified changeset.
7856 updated to the specified changeset.
7852
7857
7853 .. container:: verbose
7858 .. container:: verbose
7854
7859
7855 The -C/--clean, -c/--check, and -m/--merge options control what
7860 The -C/--clean, -c/--check, and -m/--merge options control what
7856 happens if the working directory contains uncommitted changes.
7861 happens if the working directory contains uncommitted changes.
7857 At most of one of them can be specified.
7862 At most of one of them can be specified.
7858
7863
7859 1. If no option is specified, and if
7864 1. If no option is specified, and if
7860 the requested changeset is an ancestor or descendant of
7865 the requested changeset is an ancestor or descendant of
7861 the working directory's parent, the uncommitted changes
7866 the working directory's parent, the uncommitted changes
7862 are merged into the requested changeset and the merged
7867 are merged into the requested changeset and the merged
7863 result is left uncommitted. If the requested changeset is
7868 result is left uncommitted. If the requested changeset is
7864 not an ancestor or descendant (that is, it is on another
7869 not an ancestor or descendant (that is, it is on another
7865 branch), the update is aborted and the uncommitted changes
7870 branch), the update is aborted and the uncommitted changes
7866 are preserved.
7871 are preserved.
7867
7872
7868 2. With the -m/--merge option, the update is allowed even if the
7873 2. With the -m/--merge option, the update is allowed even if the
7869 requested changeset is not an ancestor or descendant of
7874 requested changeset is not an ancestor or descendant of
7870 the working directory's parent.
7875 the working directory's parent.
7871
7876
7872 3. With the -c/--check option, the update is aborted and the
7877 3. With the -c/--check option, the update is aborted and the
7873 uncommitted changes are preserved.
7878 uncommitted changes are preserved.
7874
7879
7875 4. With the -C/--clean option, uncommitted changes are discarded and
7880 4. With the -C/--clean option, uncommitted changes are discarded and
7876 the working directory is updated to the requested changeset.
7881 the working directory is updated to the requested changeset.
7877
7882
7878 To cancel an uncommitted merge (and lose your changes), use
7883 To cancel an uncommitted merge (and lose your changes), use
7879 :hg:`merge --abort`.
7884 :hg:`merge --abort`.
7880
7885
7881 Use null as the changeset to remove the working directory (like
7886 Use null as the changeset to remove the working directory (like
7882 :hg:`clone -U`).
7887 :hg:`clone -U`).
7883
7888
7884 If you want to revert just one file to an older revision, use
7889 If you want to revert just one file to an older revision, use
7885 :hg:`revert [-r REV] NAME`.
7890 :hg:`revert [-r REV] NAME`.
7886
7891
7887 See :hg:`help dates` for a list of formats valid for -d/--date.
7892 See :hg:`help dates` for a list of formats valid for -d/--date.
7888
7893
7889 Returns 0 on success, 1 if there are unresolved files.
7894 Returns 0 on success, 1 if there are unresolved files.
7890 """
7895 """
7891 cmdutil.check_at_most_one_arg(opts, 'clean', 'check', 'merge')
7896 cmdutil.check_at_most_one_arg(opts, 'clean', 'check', 'merge')
7892 rev = opts.get('rev')
7897 rev = opts.get('rev')
7893 date = opts.get('date')
7898 date = opts.get('date')
7894 clean = opts.get('clean')
7899 clean = opts.get('clean')
7895 check = opts.get('check')
7900 check = opts.get('check')
7896 merge = opts.get('merge')
7901 merge = opts.get('merge')
7897 if rev and node:
7902 if rev and node:
7898 raise error.InputError(_(b"please specify just one revision"))
7903 raise error.InputError(_(b"please specify just one revision"))
7899
7904
7900 if ui.configbool(b'commands', b'update.requiredest'):
7905 if ui.configbool(b'commands', b'update.requiredest'):
7901 if not node and not rev and not date:
7906 if not node and not rev and not date:
7902 raise error.InputError(
7907 raise error.InputError(
7903 _(b'you must specify a destination'),
7908 _(b'you must specify a destination'),
7904 hint=_(b'for example: hg update ".::"'),
7909 hint=_(b'for example: hg update ".::"'),
7905 )
7910 )
7906
7911
7907 if rev is None or rev == b'':
7912 if rev is None or rev == b'':
7908 rev = node
7913 rev = node
7909
7914
7910 if date and rev is not None:
7915 if date and rev is not None:
7911 raise error.InputError(_(b"you can't specify a revision and a date"))
7916 raise error.InputError(_(b"you can't specify a revision and a date"))
7912
7917
7913 updatecheck = None
7918 updatecheck = None
7914 if check or merge is not None and not merge:
7919 if check or merge is not None and not merge:
7915 updatecheck = b'abort'
7920 updatecheck = b'abort'
7916 elif merge or check is not None and not check:
7921 elif merge or check is not None and not check:
7917 updatecheck = b'none'
7922 updatecheck = b'none'
7918
7923
7919 with repo.wlock():
7924 with repo.wlock():
7920 cmdutil.clearunfinished(repo)
7925 cmdutil.clearunfinished(repo)
7921 if date:
7926 if date:
7922 rev = cmdutil.finddate(ui, repo, date)
7927 rev = cmdutil.finddate(ui, repo, date)
7923
7928
7924 # if we defined a bookmark, we have to remember the original name
7929 # if we defined a bookmark, we have to remember the original name
7925 brev = rev
7930 brev = rev
7926 if rev:
7931 if rev:
7927 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7932 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7928 ctx = logcmdutil.revsingle(repo, rev, default=None)
7933 ctx = logcmdutil.revsingle(repo, rev, default=None)
7929 rev = ctx.rev()
7934 rev = ctx.rev()
7930 hidden = ctx.hidden()
7935 hidden = ctx.hidden()
7931 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
7936 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
7932 with ui.configoverride(overrides, b'update'):
7937 with ui.configoverride(overrides, b'update'):
7933 ret = hg.updatetotally(
7938 ret = hg.updatetotally(
7934 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7939 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7935 )
7940 )
7936 if hidden:
7941 if hidden:
7937 ctxstr = ctx.hex()[:12]
7942 ctxstr = ctx.hex()[:12]
7938 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7943 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7939
7944
7940 if ctx.obsolete():
7945 if ctx.obsolete():
7941 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7946 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7942 ui.warn(b"(%s)\n" % obsfatemsg)
7947 ui.warn(b"(%s)\n" % obsfatemsg)
7943 return ret
7948 return ret
7944
7949
7945
7950
7946 @command(
7951 @command(
7947 b'verify',
7952 b'verify',
7948 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7953 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7949 helpcategory=command.CATEGORY_MAINTENANCE,
7954 helpcategory=command.CATEGORY_MAINTENANCE,
7950 )
7955 )
7951 def verify(ui, repo, **opts):
7956 def verify(ui, repo, **opts):
7952 """verify the integrity of the repository
7957 """verify the integrity of the repository
7953
7958
7954 Verify the integrity of the current repository.
7959 Verify the integrity of the current repository.
7955
7960
7956 This will perform an extensive check of the repository's
7961 This will perform an extensive check of the repository's
7957 integrity, validating the hashes and checksums of each entry in
7962 integrity, validating the hashes and checksums of each entry in
7958 the changelog, manifest, and tracked files, as well as the
7963 the changelog, manifest, and tracked files, as well as the
7959 integrity of their crosslinks and indices.
7964 integrity of their crosslinks and indices.
7960
7965
7961 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
7966 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
7962 for more information about recovery from corruption of the
7967 for more information about recovery from corruption of the
7963 repository.
7968 repository.
7964
7969
7965 For an alternative UI with a lot more control over the verification
7970 For an alternative UI with a lot more control over the verification
7966 process and better error reporting, try `hg help admin::verify`.
7971 process and better error reporting, try `hg help admin::verify`.
7967
7972
7968 Returns 0 on success, 1 if errors are encountered.
7973 Returns 0 on success, 1 if errors are encountered.
7969 """
7974 """
7970 level = None
7975 level = None
7971 if opts['full']:
7976 if opts['full']:
7972 level = verifymod.VERIFY_FULL
7977 level = verifymod.VERIFY_FULL
7973 return hg.verify(repo, level)
7978 return hg.verify(repo, level)
7974
7979
7975
7980
7976 @command(
7981 @command(
7977 b'version',
7982 b'version',
7978 [] + formatteropts,
7983 [] + formatteropts,
7979 helpcategory=command.CATEGORY_HELP,
7984 helpcategory=command.CATEGORY_HELP,
7980 norepo=True,
7985 norepo=True,
7981 intents={INTENT_READONLY},
7986 intents={INTENT_READONLY},
7982 )
7987 )
7983 def version_(ui, **opts):
7988 def version_(ui, **opts):
7984 """output version and copyright information
7989 """output version and copyright information
7985
7990
7986 .. container:: verbose
7991 .. container:: verbose
7987
7992
7988 Template:
7993 Template:
7989
7994
7990 The following keywords are supported. See also :hg:`help templates`.
7995 The following keywords are supported. See also :hg:`help templates`.
7991
7996
7992 :extensions: List of extensions.
7997 :extensions: List of extensions.
7993 :ver: String. Version number.
7998 :ver: String. Version number.
7994
7999
7995 And each entry of ``{extensions}`` provides the following sub-keywords
8000 And each entry of ``{extensions}`` provides the following sub-keywords
7996 in addition to ``{ver}``.
8001 in addition to ``{ver}``.
7997
8002
7998 :bundled: Boolean. True if included in the release.
8003 :bundled: Boolean. True if included in the release.
7999 :name: String. Extension name.
8004 :name: String. Extension name.
8000 """
8005 """
8001 if ui.verbose:
8006 if ui.verbose:
8002 ui.pager(b'version')
8007 ui.pager(b'version')
8003 fm = ui.formatter(b"version", pycompat.byteskwargs(opts))
8008 fm = ui.formatter(b"version", pycompat.byteskwargs(opts))
8004 fm.startitem()
8009 fm.startitem()
8005 fm.write(
8010 fm.write(
8006 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
8011 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
8007 )
8012 )
8008 license = _(
8013 license = _(
8009 b"(see https://mercurial-scm.org for more information)\n"
8014 b"(see https://mercurial-scm.org for more information)\n"
8010 b"\nCopyright (C) 2005-2023 Olivia Mackall and others\n"
8015 b"\nCopyright (C) 2005-2023 Olivia Mackall and others\n"
8011 b"This is free software; see the source for copying conditions. "
8016 b"This is free software; see the source for copying conditions. "
8012 b"There is NO\nwarranty; "
8017 b"There is NO\nwarranty; "
8013 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
8018 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
8014 )
8019 )
8015 if not ui.quiet:
8020 if not ui.quiet:
8016 fm.plain(license)
8021 fm.plain(license)
8017
8022
8018 if ui.verbose:
8023 if ui.verbose:
8019 fm.plain(_(b"\nEnabled extensions:\n\n"))
8024 fm.plain(_(b"\nEnabled extensions:\n\n"))
8020 # format names and versions into columns
8025 # format names and versions into columns
8021 names = []
8026 names = []
8022 vers = []
8027 vers = []
8023 isinternals = []
8028 isinternals = []
8024 for name, module in sorted(extensions.extensions()):
8029 for name, module in sorted(extensions.extensions()):
8025 names.append(name)
8030 names.append(name)
8026 vers.append(extensions.moduleversion(module) or None)
8031 vers.append(extensions.moduleversion(module) or None)
8027 isinternals.append(extensions.ismoduleinternal(module))
8032 isinternals.append(extensions.ismoduleinternal(module))
8028 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
8033 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
8029 if names:
8034 if names:
8030 namefmt = b" %%-%ds " % max(len(n) for n in names)
8035 namefmt = b" %%-%ds " % max(len(n) for n in names)
8031 places = [_(b"external"), _(b"internal")]
8036 places = [_(b"external"), _(b"internal")]
8032 for n, v, p in zip(names, vers, isinternals):
8037 for n, v, p in zip(names, vers, isinternals):
8033 fn.startitem()
8038 fn.startitem()
8034 fn.condwrite(ui.verbose, b"name", namefmt, n)
8039 fn.condwrite(ui.verbose, b"name", namefmt, n)
8035 if ui.verbose:
8040 if ui.verbose:
8036 fn.plain(b"%s " % places[p])
8041 fn.plain(b"%s " % places[p])
8037 fn.data(bundled=p)
8042 fn.data(bundled=p)
8038 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
8043 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
8039 if ui.verbose:
8044 if ui.verbose:
8040 fn.plain(b"\n")
8045 fn.plain(b"\n")
8041 fn.end()
8046 fn.end()
8042 fm.end()
8047 fm.end()
8043
8048
8044
8049
8045 def loadcmdtable(ui, name, cmdtable):
8050 def loadcmdtable(ui, name, cmdtable):
8046 """Load command functions from specified cmdtable"""
8051 """Load command functions from specified cmdtable"""
8047 overrides = [cmd for cmd in cmdtable if cmd in table]
8052 overrides = [cmd for cmd in cmdtable if cmd in table]
8048 if overrides:
8053 if overrides:
8049 ui.warn(
8054 ui.warn(
8050 _(b"extension '%s' overrides commands: %s\n")
8055 _(b"extension '%s' overrides commands: %s\n")
8051 % (name, b" ".join(overrides))
8056 % (name, b" ".join(overrides))
8052 )
8057 )
8053 table.update(cmdtable)
8058 table.update(cmdtable)
@@ -1,489 +1,495 b''
1 # pycompat.py - portability shim for python 3
1 # pycompat.py - portability shim for python 3
2 #
2 #
3 # This software may be used and distributed according to the terms of the
3 # This software may be used and distributed according to the terms of the
4 # GNU General Public License version 2 or any later version.
4 # GNU General Public License version 2 or any later version.
5
5
6 """Mercurial portability shim for python 3.
6 """Mercurial portability shim for python 3.
7
7
8 This contains aliases to hide python version-specific details from the core.
8 This contains aliases to hide python version-specific details from the core.
9 """
9 """
10
10
11
11
12 import builtins
12 import builtins
13 import codecs
13 import codecs
14 import concurrent.futures as futures
14 import concurrent.futures as futures
15 import getopt
15 import getopt
16 import http.client as httplib
16 import http.client as httplib
17 import http.cookiejar as cookielib
17 import http.cookiejar as cookielib
18 import inspect
18 import inspect
19 import io
19 import io
20 import json
20 import json
21 import os
21 import os
22 import queue
22 import queue
23 import shlex
23 import shlex
24 import socketserver
24 import socketserver
25 import struct
25 import struct
26 import sys
26 import sys
27 import tempfile
27 import tempfile
28 import xmlrpc.client as xmlrpclib
28 import xmlrpc.client as xmlrpclib
29
29
30 from typing import (
30 from typing import (
31 Any,
31 Any,
32 AnyStr,
32 AnyStr,
33 BinaryIO,
33 BinaryIO,
34 Callable,
34 Callable,
35 Dict,
35 Dict,
36 Iterable,
36 Iterable,
37 Iterator,
37 Iterator,
38 List,
38 List,
39 Mapping,
39 Mapping,
40 NoReturn,
40 NoReturn,
41 Optional,
41 Optional,
42 Sequence,
42 Sequence,
43 Tuple,
43 Tuple,
44 Type,
44 Type,
45 TypeVar,
45 TypeVar,
46 cast,
46 cast,
47 overload,
47 overload,
48 )
48 )
49
49
50 ispy3 = sys.version_info[0] >= 3
50 ispy3 = sys.version_info[0] >= 3
51 ispypy = '__pypy__' in sys.builtin_module_names
51 ispypy = '__pypy__' in sys.builtin_module_names
52 TYPE_CHECKING = False
52 TYPE_CHECKING = False
53
53
54 if not globals(): # hide this from non-pytype users
54 if not globals(): # hide this from non-pytype users
55 import typing
55 import typing
56
56
57 TYPE_CHECKING = typing.TYPE_CHECKING
57 TYPE_CHECKING = typing.TYPE_CHECKING
58
58
59 _GetOptResult = Tuple[List[Tuple[bytes, bytes]], List[bytes]]
59 _GetOptResult = Tuple[List[Tuple[bytes, bytes]], List[bytes]]
60 _T0 = TypeVar('_T0')
60 _T0 = TypeVar('_T0')
61 _T1 = TypeVar('_T1')
61 _T1 = TypeVar('_T1')
62 _S = TypeVar('_S')
62 _S = TypeVar('_S')
63 _Tbytestr = TypeVar('_Tbytestr', bound='bytestr')
63 _Tbytestr = TypeVar('_Tbytestr', bound='bytestr')
64
64
65
65
66 def future_set_exception_info(f, exc_info):
66 def future_set_exception_info(f, exc_info):
67 f.set_exception(exc_info[0])
67 f.set_exception(exc_info[0])
68
68
69
69
70 FileNotFoundError = builtins.FileNotFoundError
70 FileNotFoundError = builtins.FileNotFoundError
71
71
72
72
73 def identity(a: _T0) -> _T0:
73 def identity(a: _T0) -> _T0:
74 return a
74 return a
75
75
76
76
77 def _rapply(f, xs):
77 def _rapply(f, xs):
78 if xs is None:
78 if xs is None:
79 # assume None means non-value of optional data
79 # assume None means non-value of optional data
80 return xs
80 return xs
81 if isinstance(xs, (list, set, tuple)):
81 if isinstance(xs, (list, set, tuple)):
82 return type(xs)(_rapply(f, x) for x in xs)
82 return type(xs)(_rapply(f, x) for x in xs)
83 if isinstance(xs, dict):
83 if isinstance(xs, dict):
84 return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items())
84 return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items())
85 return f(xs)
85 return f(xs)
86
86
87
87
88 def rapply(f, xs):
88 def rapply(f, xs):
89 """Apply function recursively to every item preserving the data structure
89 """Apply function recursively to every item preserving the data structure
90
90
91 >>> def f(x):
91 >>> def f(x):
92 ... return 'f(%s)' % x
92 ... return 'f(%s)' % x
93 >>> rapply(f, None) is None
93 >>> rapply(f, None) is None
94 True
94 True
95 >>> rapply(f, 'a')
95 >>> rapply(f, 'a')
96 'f(a)'
96 'f(a)'
97 >>> rapply(f, {'a'}) == {'f(a)'}
97 >>> rapply(f, {'a'}) == {'f(a)'}
98 True
98 True
99 >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
99 >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
100 ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]
100 ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]
101
101
102 >>> xs = [object()]
102 >>> xs = [object()]
103 >>> rapply(identity, xs) is xs
103 >>> rapply(identity, xs) is xs
104 True
104 True
105 """
105 """
106 if f is identity:
106 if f is identity:
107 # fast path mainly for py2
107 # fast path mainly for py2
108 return xs
108 return xs
109 return _rapply(f, xs)
109 return _rapply(f, xs)
110
110
111
111
112 if os.name == r'nt':
112 if os.name == r'nt':
113 # MBCS (or ANSI) filesystem encoding must be used as before.
113 # MBCS (or ANSI) filesystem encoding must be used as before.
114 # Otherwise non-ASCII filenames in existing repositories would be
114 # Otherwise non-ASCII filenames in existing repositories would be
115 # corrupted.
115 # corrupted.
116 # This must be set once prior to any fsencode/fsdecode calls.
116 # This must be set once prior to any fsencode/fsdecode calls.
117 sys._enablelegacywindowsfsencoding() # pytype: disable=module-attr
117 sys._enablelegacywindowsfsencoding() # pytype: disable=module-attr
118
118
119 fsencode = os.fsencode
119 fsencode = os.fsencode
120 fsdecode = os.fsdecode
120 fsdecode = os.fsdecode
121 oscurdir: bytes = os.curdir.encode('ascii')
121 oscurdir: bytes = os.curdir.encode('ascii')
122 oslinesep: bytes = os.linesep.encode('ascii')
122 oslinesep: bytes = os.linesep.encode('ascii')
123 osname: bytes = os.name.encode('ascii')
123 osname: bytes = os.name.encode('ascii')
124 ospathsep: bytes = os.pathsep.encode('ascii')
124 ospathsep: bytes = os.pathsep.encode('ascii')
125 ospardir: bytes = os.pardir.encode('ascii')
125 ospardir: bytes = os.pardir.encode('ascii')
126 ossep: bytes = os.sep.encode('ascii')
126 ossep: bytes = os.sep.encode('ascii')
127 osaltsep: Optional[bytes] = os.altsep.encode('ascii') if os.altsep else None
127 osaltsep: Optional[bytes] = os.altsep.encode('ascii') if os.altsep else None
128 osdevnull: bytes = os.devnull.encode('ascii')
128 osdevnull: bytes = os.devnull.encode('ascii')
129
129
130 sysplatform: bytes = sys.platform.encode('ascii')
130 sysplatform: bytes = sys.platform.encode('ascii')
131 sysexecutable: bytes = os.fsencode(sys.executable) if sys.executable else b''
131 sysexecutable: bytes = os.fsencode(sys.executable) if sys.executable else b''
132
132
133
133
134 if TYPE_CHECKING:
134 if TYPE_CHECKING:
135
135
136 @overload
136 @overload
137 def maplist(f: Callable[[_T0], _S], arg: Iterable[_T0]) -> List[_S]:
137 def maplist(f: Callable[[_T0], _S], arg: Iterable[_T0]) -> List[_S]:
138 ...
138 ...
139
139
140 @overload
140 @overload
141 def maplist(
141 def maplist(
142 f: Callable[[_T0, _T1], _S], arg1: Iterable[_T0], arg2: Iterable[_T1]
142 f: Callable[[_T0, _T1], _S], arg1: Iterable[_T0], arg2: Iterable[_T1]
143 ) -> List[_S]:
143 ) -> List[_S]:
144 ...
144 ...
145
145
146
146
147 def maplist(f, *args):
147 def maplist(f, *args):
148 return list(map(f, *args))
148 return list(map(f, *args))
149
149
150
150
151 def rangelist(*args) -> List[int]:
151 def rangelist(*args) -> List[int]:
152 return list(range(*args))
152 return list(range(*args))
153
153
154
154
155 def ziplist(*args):
155 def ziplist(*args):
156 return list(zip(*args))
156 return list(zip(*args))
157
157
158
158
159 rawinput = input
159 rawinput = input
160 getargspec = inspect.getfullargspec
160 getargspec = inspect.getfullargspec
161
161
162 long = int
162 long = int
163
163
164 if builtins.getattr(sys, 'argv', None) is not None:
164 if builtins.getattr(sys, 'argv', None) is not None:
165 # On POSIX, the char** argv array is converted to Python str using
165 # On POSIX, the char** argv array is converted to Python str using
166 # Py_DecodeLocale(). The inverse of this is Py_EncodeLocale(), which
166 # Py_DecodeLocale(). The inverse of this is Py_EncodeLocale(), which
167 # isn't directly callable from Python code. In practice, os.fsencode()
167 # isn't directly callable from Python code. In practice, os.fsencode()
168 # can be used instead (this is recommended by Python's documentation
168 # can be used instead (this is recommended by Python's documentation
169 # for sys.argv).
169 # for sys.argv).
170 #
170 #
171 # On Windows, the wchar_t **argv is passed into the interpreter as-is.
171 # On Windows, the wchar_t **argv is passed into the interpreter as-is.
172 # Like POSIX, we need to emulate what Py_EncodeLocale() would do. But
172 # Like POSIX, we need to emulate what Py_EncodeLocale() would do. But
173 # there's an additional wrinkle. What we really want to access is the
173 # there's an additional wrinkle. What we really want to access is the
174 # ANSI codepage representation of the arguments, as this is what
174 # ANSI codepage representation of the arguments, as this is what
175 # `int main()` would receive if Python 3 didn't define `int wmain()`
175 # `int main()` would receive if Python 3 didn't define `int wmain()`
176 # (this is how Python 2 worked). To get that, we encode with the mbcs
176 # (this is how Python 2 worked). To get that, we encode with the mbcs
177 # encoding, which will pass CP_ACP to the underlying Windows API to
177 # encoding, which will pass CP_ACP to the underlying Windows API to
178 # produce bytes.
178 # produce bytes.
179 sysargv: List[bytes] = []
179 sysargv: List[bytes] = []
180 if os.name == r'nt':
180 if os.name == r'nt':
181 sysargv = [a.encode("mbcs", "ignore") for a in sys.argv]
181 sysargv = [a.encode("mbcs", "ignore") for a in sys.argv]
182 else:
182 else:
183 sysargv = [fsencode(a) for a in sys.argv]
183 sysargv = [fsencode(a) for a in sys.argv]
184
184
185 bytechr = struct.Struct('>B').pack
185 bytechr = struct.Struct('>B').pack
186 byterepr = b'%r'.__mod__
186 byterepr = b'%r'.__mod__
187
187
188
188
189 class bytestr(bytes):
189 class bytestr(bytes):
190 """A bytes which mostly acts as a Python 2 str
190 """A bytes which mostly acts as a Python 2 str
191
191
192 >>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1)
192 >>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1)
193 ('', 'foo', 'ascii', '1')
193 ('', 'foo', 'ascii', '1')
194 >>> s = bytestr(b'foo')
194 >>> s = bytestr(b'foo')
195 >>> assert s is bytestr(s)
195 >>> assert s is bytestr(s)
196
196
197 __bytes__() should be called if provided:
197 __bytes__() should be called if provided:
198
198
199 >>> class bytesable:
199 >>> class bytesable:
200 ... def __bytes__(self):
200 ... def __bytes__(self):
201 ... return b'bytes'
201 ... return b'bytes'
202 >>> bytestr(bytesable())
202 >>> bytestr(bytesable())
203 'bytes'
203 'bytes'
204
204
205 ...unless the argument is the bytes *type* itself: it gets a
206 __bytes__() method in Python 3.11, which cannot be used as in an instance
207 of bytes:
208
209 >>> bytestr(bytes)
210 "<class 'bytes'>"
211
205 There's no implicit conversion from non-ascii str as its encoding is
212 There's no implicit conversion from non-ascii str as its encoding is
206 unknown:
213 unknown:
207
214
208 >>> bytestr(chr(0x80)) # doctest: +ELLIPSIS
215 >>> bytestr(chr(0x80)) # doctest: +ELLIPSIS
209 Traceback (most recent call last):
216 Traceback (most recent call last):
210 ...
217 ...
211 UnicodeEncodeError: ...
218 UnicodeEncodeError: ...
212
219
213 Comparison between bytestr and bytes should work:
220 Comparison between bytestr and bytes should work:
214
221
215 >>> assert bytestr(b'foo') == b'foo'
222 >>> assert bytestr(b'foo') == b'foo'
216 >>> assert b'foo' == bytestr(b'foo')
223 >>> assert b'foo' == bytestr(b'foo')
217 >>> assert b'f' in bytestr(b'foo')
224 >>> assert b'f' in bytestr(b'foo')
218 >>> assert bytestr(b'f') in b'foo'
225 >>> assert bytestr(b'f') in b'foo'
219
226
220 Sliced elements should be bytes, not integer:
227 Sliced elements should be bytes, not integer:
221
228
222 >>> s[1], s[:2]
229 >>> s[1], s[:2]
223 (b'o', b'fo')
230 (b'o', b'fo')
224 >>> list(s), list(reversed(s))
231 >>> list(s), list(reversed(s))
225 ([b'f', b'o', b'o'], [b'o', b'o', b'f'])
232 ([b'f', b'o', b'o'], [b'o', b'o', b'f'])
226
233
227 As bytestr type isn't propagated across operations, you need to cast
234 As bytestr type isn't propagated across operations, you need to cast
228 bytes to bytestr explicitly:
235 bytes to bytestr explicitly:
229
236
230 >>> s = bytestr(b'foo').upper()
237 >>> s = bytestr(b'foo').upper()
231 >>> t = bytestr(s)
238 >>> t = bytestr(s)
232 >>> s[0], t[0]
239 >>> s[0], t[0]
233 (70, b'F')
240 (70, b'F')
234
241
235 Be careful to not pass a bytestr object to a function which expects
242 Be careful to not pass a bytestr object to a function which expects
236 bytearray-like behavior.
243 bytearray-like behavior.
237
244
238 >>> t = bytes(t) # cast to bytes
245 >>> t = bytes(t) # cast to bytes
239 >>> assert type(t) is bytes
246 >>> assert type(t) is bytes
240 """
247 """
241
248
242 # Trick pytype into not demanding Iterable[int] be passed to __new__(),
249 # Trick pytype into not demanding Iterable[int] be passed to __new__(),
243 # since the appropriate bytes format is done internally.
250 # since the appropriate bytes format is done internally.
244 #
251 #
245 # https://github.com/google/pytype/issues/500
252 # https://github.com/google/pytype/issues/500
246 if TYPE_CHECKING:
253 if TYPE_CHECKING:
247
254
248 def __init__(self, s: object = b'') -> None:
255 def __init__(self, s: object = b'') -> None:
249 pass
256 pass
250
257
251 def __new__(cls: Type[_Tbytestr], s: object = b'') -> _Tbytestr:
258 def __new__(cls: Type[_Tbytestr], s: object = b'') -> _Tbytestr:
252 if isinstance(s, bytestr):
259 if isinstance(s, bytestr):
253 return s
260 return s
254 if not isinstance(
261 if not isinstance(s, (bytes, bytearray)) and (
255 s, (bytes, bytearray)
262 isinstance(s, type)
256 ) and not builtins.hasattr( # hasattr-py3-only
263 or not builtins.hasattr(s, u'__bytes__') # hasattr-py3-only
257 s, u'__bytes__'
258 ):
264 ):
259 s = str(s).encode('ascii')
265 s = str(s).encode('ascii')
260 return bytes.__new__(cls, s)
266 return bytes.__new__(cls, s)
261
267
262 # The base class uses `int` return in py3, but the point of this class is to
268 # The base class uses `int` return in py3, but the point of this class is to
263 # behave like py2.
269 # behave like py2.
264 def __getitem__(self, key) -> bytes: # pytype: disable=signature-mismatch
270 def __getitem__(self, key) -> bytes: # pytype: disable=signature-mismatch
265 s = bytes.__getitem__(self, key)
271 s = bytes.__getitem__(self, key)
266 if not isinstance(s, bytes):
272 if not isinstance(s, bytes):
267 s = bytechr(s)
273 s = bytechr(s)
268 return s
274 return s
269
275
270 # The base class expects `Iterator[int]` return in py3, but the point of
276 # The base class expects `Iterator[int]` return in py3, but the point of
271 # this class is to behave like py2.
277 # this class is to behave like py2.
272 def __iter__(self) -> Iterator[bytes]: # pytype: disable=signature-mismatch
278 def __iter__(self) -> Iterator[bytes]: # pytype: disable=signature-mismatch
273 return iterbytestr(bytes.__iter__(self))
279 return iterbytestr(bytes.__iter__(self))
274
280
275 def __repr__(self) -> str:
281 def __repr__(self) -> str:
276 return bytes.__repr__(self)[1:] # drop b''
282 return bytes.__repr__(self)[1:] # drop b''
277
283
278
284
279 def iterbytestr(s: Iterable[int]) -> Iterator[bytes]:
285 def iterbytestr(s: Iterable[int]) -> Iterator[bytes]:
280 """Iterate bytes as if it were a str object of Python 2"""
286 """Iterate bytes as if it were a str object of Python 2"""
281 return map(bytechr, s)
287 return map(bytechr, s)
282
288
283
289
284 if TYPE_CHECKING:
290 if TYPE_CHECKING:
285
291
286 @overload
292 @overload
287 def maybebytestr(s: bytes) -> bytestr:
293 def maybebytestr(s: bytes) -> bytestr:
288 ...
294 ...
289
295
290 @overload
296 @overload
291 def maybebytestr(s: _T0) -> _T0:
297 def maybebytestr(s: _T0) -> _T0:
292 ...
298 ...
293
299
294
300
295 def maybebytestr(s):
301 def maybebytestr(s):
296 """Promote bytes to bytestr"""
302 """Promote bytes to bytestr"""
297 if isinstance(s, bytes):
303 if isinstance(s, bytes):
298 return bytestr(s)
304 return bytestr(s)
299 return s
305 return s
300
306
301
307
302 def sysbytes(s: AnyStr) -> bytes:
308 def sysbytes(s: AnyStr) -> bytes:
303 """Convert an internal str (e.g. keyword, __doc__) back to bytes
309 """Convert an internal str (e.g. keyword, __doc__) back to bytes
304
310
305 This never raises UnicodeEncodeError, but only ASCII characters
311 This never raises UnicodeEncodeError, but only ASCII characters
306 can be round-trip by sysstr(sysbytes(s)).
312 can be round-trip by sysstr(sysbytes(s)).
307 """
313 """
308 if isinstance(s, bytes):
314 if isinstance(s, bytes):
309 return s
315 return s
310 return s.encode('utf-8')
316 return s.encode('utf-8')
311
317
312
318
313 def sysstr(s: AnyStr) -> str:
319 def sysstr(s: AnyStr) -> str:
314 """Return a keyword str to be passed to Python functions such as
320 """Return a keyword str to be passed to Python functions such as
315 getattr() and str.encode()
321 getattr() and str.encode()
316
322
317 This never raises UnicodeDecodeError. Non-ascii characters are
323 This never raises UnicodeDecodeError. Non-ascii characters are
318 considered invalid and mapped to arbitrary but unique code points
324 considered invalid and mapped to arbitrary but unique code points
319 such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
325 such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
320 """
326 """
321 if isinstance(s, builtins.str):
327 if isinstance(s, builtins.str):
322 return s
328 return s
323 return s.decode('latin-1')
329 return s.decode('latin-1')
324
330
325
331
326 def strurl(url: AnyStr) -> str:
332 def strurl(url: AnyStr) -> str:
327 """Converts a bytes url back to str"""
333 """Converts a bytes url back to str"""
328 if isinstance(url, bytes):
334 if isinstance(url, bytes):
329 return url.decode('ascii')
335 return url.decode('ascii')
330 return url
336 return url
331
337
332
338
333 def bytesurl(url: AnyStr) -> bytes:
339 def bytesurl(url: AnyStr) -> bytes:
334 """Converts a str url to bytes by encoding in ascii"""
340 """Converts a str url to bytes by encoding in ascii"""
335 if isinstance(url, str):
341 if isinstance(url, str):
336 return url.encode('ascii')
342 return url.encode('ascii')
337 return url
343 return url
338
344
339
345
340 def raisewithtb(exc: BaseException, tb) -> NoReturn:
346 def raisewithtb(exc: BaseException, tb) -> NoReturn:
341 """Raise exception with the given traceback"""
347 """Raise exception with the given traceback"""
342 raise exc.with_traceback(tb)
348 raise exc.with_traceback(tb)
343
349
344
350
345 def getdoc(obj: object) -> Optional[bytes]:
351 def getdoc(obj: object) -> Optional[bytes]:
346 """Get docstring as bytes; may be None so gettext() won't confuse it
352 """Get docstring as bytes; may be None so gettext() won't confuse it
347 with _('')"""
353 with _('')"""
348 doc = builtins.getattr(obj, '__doc__', None)
354 doc = builtins.getattr(obj, '__doc__', None)
349 if doc is None:
355 if doc is None:
350 return doc
356 return doc
351 return sysbytes(doc)
357 return sysbytes(doc)
352
358
353
359
354 # these wrappers are automagically imported by hgloader
360 # these wrappers are automagically imported by hgloader
355 delattr = builtins.delattr
361 delattr = builtins.delattr
356 getattr = builtins.getattr
362 getattr = builtins.getattr
357 hasattr = builtins.hasattr
363 hasattr = builtins.hasattr
358 setattr = builtins.setattr
364 setattr = builtins.setattr
359 xrange = builtins.range
365 xrange = builtins.range
360 unicode = str
366 unicode = str
361
367
362
368
363 def open(
369 def open(
364 name,
370 name,
365 mode: AnyStr = b'r',
371 mode: AnyStr = b'r',
366 buffering: int = -1,
372 buffering: int = -1,
367 encoding: Optional[str] = None,
373 encoding: Optional[str] = None,
368 ) -> Any:
374 ) -> Any:
369 # TODO: assert binary mode, and cast result to BinaryIO?
375 # TODO: assert binary mode, and cast result to BinaryIO?
370 return builtins.open(name, sysstr(mode), buffering, encoding)
376 return builtins.open(name, sysstr(mode), buffering, encoding)
371
377
372
378
373 safehasattr = builtins.hasattr
379 safehasattr = builtins.hasattr
374
380
375
381
376 def _getoptbwrapper(
382 def _getoptbwrapper(
377 orig, args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
383 orig, args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
378 ) -> _GetOptResult:
384 ) -> _GetOptResult:
379 """
385 """
380 Takes bytes arguments, converts them to unicode, pass them to
386 Takes bytes arguments, converts them to unicode, pass them to
381 getopt.getopt(), convert the returned values back to bytes and then
387 getopt.getopt(), convert the returned values back to bytes and then
382 return them for Python 3 compatibility as getopt.getopt() don't accepts
388 return them for Python 3 compatibility as getopt.getopt() don't accepts
383 bytes on Python 3.
389 bytes on Python 3.
384 """
390 """
385 args = [a.decode('latin-1') for a in args]
391 args = [a.decode('latin-1') for a in args]
386 shortlist = shortlist.decode('latin-1')
392 shortlist = shortlist.decode('latin-1')
387 namelist = [a.decode('latin-1') for a in namelist]
393 namelist = [a.decode('latin-1') for a in namelist]
388 opts, args = orig(args, shortlist, namelist)
394 opts, args = orig(args, shortlist, namelist)
389 opts = [(a[0].encode('latin-1'), a[1].encode('latin-1')) for a in opts]
395 opts = [(a[0].encode('latin-1'), a[1].encode('latin-1')) for a in opts]
390 args = [a.encode('latin-1') for a in args]
396 args = [a.encode('latin-1') for a in args]
391 return opts, args
397 return opts, args
392
398
393
399
394 def strkwargs(dic: Mapping[bytes, _T0]) -> Dict[str, _T0]:
400 def strkwargs(dic: Mapping[bytes, _T0]) -> Dict[str, _T0]:
395 """
401 """
396 Converts the keys of a python dictonary to str i.e. unicodes so that
402 Converts the keys of a python dictonary to str i.e. unicodes so that
397 they can be passed as keyword arguments as dictionaries with bytes keys
403 they can be passed as keyword arguments as dictionaries with bytes keys
398 can't be passed as keyword arguments to functions on Python 3.
404 can't be passed as keyword arguments to functions on Python 3.
399 """
405 """
400 dic = {k.decode('latin-1'): v for k, v in dic.items()}
406 dic = {k.decode('latin-1'): v for k, v in dic.items()}
401 return dic
407 return dic
402
408
403
409
404 def byteskwargs(dic: Mapping[str, _T0]) -> Dict[bytes, _T0]:
410 def byteskwargs(dic: Mapping[str, _T0]) -> Dict[bytes, _T0]:
405 """
411 """
406 Converts keys of python dictionaries to bytes as they were converted to
412 Converts keys of python dictionaries to bytes as they were converted to
407 str to pass that dictonary as a keyword argument on Python 3.
413 str to pass that dictonary as a keyword argument on Python 3.
408 """
414 """
409 dic = {k.encode('latin-1'): v for k, v in dic.items()}
415 dic = {k.encode('latin-1'): v for k, v in dic.items()}
410 return dic
416 return dic
411
417
412
418
413 # TODO: handle shlex.shlex().
419 # TODO: handle shlex.shlex().
414 def shlexsplit(
420 def shlexsplit(
415 s: bytes, comments: bool = False, posix: bool = True
421 s: bytes, comments: bool = False, posix: bool = True
416 ) -> List[bytes]:
422 ) -> List[bytes]:
417 """
423 """
418 Takes bytes argument, convert it to str i.e. unicodes, pass that into
424 Takes bytes argument, convert it to str i.e. unicodes, pass that into
419 shlex.split(), convert the returned value to bytes and return that for
425 shlex.split(), convert the returned value to bytes and return that for
420 Python 3 compatibility as shelx.split() don't accept bytes on Python 3.
426 Python 3 compatibility as shelx.split() don't accept bytes on Python 3.
421 """
427 """
422 ret = shlex.split(s.decode('latin-1'), comments, posix)
428 ret = shlex.split(s.decode('latin-1'), comments, posix)
423 return [a.encode('latin-1') for a in ret]
429 return [a.encode('latin-1') for a in ret]
424
430
425
431
426 iteritems = lambda x: x.items()
432 iteritems = lambda x: x.items()
427 itervalues = lambda x: x.values()
433 itervalues = lambda x: x.values()
428
434
429 json_loads = json.loads
435 json_loads = json.loads
430
436
431 isjython: bool = sysplatform.startswith(b'java')
437 isjython: bool = sysplatform.startswith(b'java')
432
438
433 isdarwin: bool = sysplatform.startswith(b'darwin')
439 isdarwin: bool = sysplatform.startswith(b'darwin')
434 islinux: bool = sysplatform.startswith(b'linux')
440 islinux: bool = sysplatform.startswith(b'linux')
435 isposix: bool = osname == b'posix'
441 isposix: bool = osname == b'posix'
436 iswindows: bool = osname == b'nt'
442 iswindows: bool = osname == b'nt'
437
443
438
444
439 def getoptb(
445 def getoptb(
440 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
446 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
441 ) -> _GetOptResult:
447 ) -> _GetOptResult:
442 return _getoptbwrapper(getopt.getopt, args, shortlist, namelist)
448 return _getoptbwrapper(getopt.getopt, args, shortlist, namelist)
443
449
444
450
445 def gnugetoptb(
451 def gnugetoptb(
446 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
452 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
447 ) -> _GetOptResult:
453 ) -> _GetOptResult:
448 return _getoptbwrapper(getopt.gnu_getopt, args, shortlist, namelist)
454 return _getoptbwrapper(getopt.gnu_getopt, args, shortlist, namelist)
449
455
450
456
451 def mkdtemp(
457 def mkdtemp(
452 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
458 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
453 ) -> bytes:
459 ) -> bytes:
454 return tempfile.mkdtemp(suffix, prefix, dir)
460 return tempfile.mkdtemp(suffix, prefix, dir)
455
461
456
462
457 # text=True is not supported; use util.from/tonativeeol() instead
463 # text=True is not supported; use util.from/tonativeeol() instead
458 def mkstemp(
464 def mkstemp(
459 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
465 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
460 ) -> Tuple[int, bytes]:
466 ) -> Tuple[int, bytes]:
461 return tempfile.mkstemp(suffix, prefix, dir)
467 return tempfile.mkstemp(suffix, prefix, dir)
462
468
463
469
464 # TemporaryFile does not support an "encoding=" argument on python2.
470 # TemporaryFile does not support an "encoding=" argument on python2.
465 # This wrapper file are always open in byte mode.
471 # This wrapper file are always open in byte mode.
466 def unnamedtempfile(mode: Optional[bytes] = None, *args, **kwargs) -> BinaryIO:
472 def unnamedtempfile(mode: Optional[bytes] = None, *args, **kwargs) -> BinaryIO:
467 if mode is None:
473 if mode is None:
468 mode = 'w+b'
474 mode = 'w+b'
469 else:
475 else:
470 mode = sysstr(mode)
476 mode = sysstr(mode)
471 assert 'b' in mode
477 assert 'b' in mode
472 return cast(BinaryIO, tempfile.TemporaryFile(mode, *args, **kwargs))
478 return cast(BinaryIO, tempfile.TemporaryFile(mode, *args, **kwargs))
473
479
474
480
475 # NamedTemporaryFile does not support an "encoding=" argument on python2.
481 # NamedTemporaryFile does not support an "encoding=" argument on python2.
476 # This wrapper file are always open in byte mode.
482 # This wrapper file are always open in byte mode.
477 def namedtempfile(
483 def namedtempfile(
478 mode: bytes = b'w+b',
484 mode: bytes = b'w+b',
479 bufsize: int = -1,
485 bufsize: int = -1,
480 suffix: bytes = b'',
486 suffix: bytes = b'',
481 prefix: bytes = b'tmp',
487 prefix: bytes = b'tmp',
482 dir: Optional[bytes] = None,
488 dir: Optional[bytes] = None,
483 delete: bool = True,
489 delete: bool = True,
484 ):
490 ):
485 mode = sysstr(mode)
491 mode = sysstr(mode)
486 assert 'b' in mode
492 assert 'b' in mode
487 return tempfile.NamedTemporaryFile(
493 return tempfile.NamedTemporaryFile(
488 mode, bufsize, suffix=suffix, prefix=prefix, dir=dir, delete=delete
494 mode, bufsize, suffix=suffix, prefix=prefix, dir=dir, delete=delete
489 )
495 )
@@ -1,68 +1,77 b''
1 = Mercurial 6.6.2 =
2
3 * histedit: remove superfluous echo() and endwin() calls (issue6859)
4 * persistent-nodemap: avoid writing nodemap for empty revlog
5 * persistent-nodemap: respect the mmap setting when refreshing data
6 * bundle: do not detect --base argument that match nothing as lack of argument
7 * narrow: prevent removal of ACL-defined excludes
8 * pycompat: fix bytestr(bytes) in Python 3.11
9
1 = Mercurial 6.6.1 =
10 = Mercurial 6.6.1 =
2
11
3 The first two patches fix aborted transactions that could happen since 6.6.
12 The first two patches fix aborted transactions that could happen since 6.6.
4
13
5 * revlog: avoid exposing delayed index entry too widely in non-inline revlog
14 * revlog: avoid exposing delayed index entry too widely in non-inline revlog
6 * revlog: avoid wrongly updating the data file location on "divert"
15 * revlog: avoid wrongly updating the data file location on "divert"
7 * tests: do not fail tests in a state with uncommitted .py file removal
16 * tests: do not fail tests in a state with uncommitted .py file removal
8 * perf-tags: fix the --clear-fnode-cache-rev code
17 * perf-tags: fix the --clear-fnode-cache-rev code
9 * perf-tags: fix clear_cache_fnodes to actually clear that cache
18 * perf-tags: fix clear_cache_fnodes to actually clear that cache
10 * censor: fix things around inlining
19 * censor: fix things around inlining
11 * Various Python 3 cleanups
20 * Various Python 3 cleanups
12 * Various Windows test suite fixes
21 * Various Windows test suite fixes
13
22
14 = Mercurial 6.6 =
23 = Mercurial 6.6 =
15
24
16 As usual, a *lot* of patches don't make it to this list.
25 As usual, a *lot* of patches don't make it to this list.
17
26
18 == New Features ==
27 == New Features ==
19 * rust-config: add support for default config items
28 * rust-config: add support for default config items
20 * rhg: add config defaults to configitems.toml
29 * rhg: add config defaults to configitems.toml
21 * rhg: support "status FILE"
30 * rhg: support "status FILE"
22 * rhg: support rhg files [FILE]
31 * rhg: support rhg files [FILE]
23 * commands: add admin namespace
32 * commands: add admin namespace
24 * admin-command: add verify command
33 * admin-command: add verify command
25 * debug-delta-chain: add options to control what we compute
34 * debug-delta-chain: add options to control what we compute
26 * Added some caching for uncompressed revlog chunks that speed up some operations
35 * Added some caching for uncompressed revlog chunks that speed up some operations
27
36
28 == New Experimental Features ==
37 == New Experimental Features ==
29
38
30 == Bug Fixes ==
39 == Bug Fixes ==
31 * Improve OpenVMS support
40 * Improve OpenVMS support
32 * byteify-strings: passe sysstr to attr function and wrapper
41 * byteify-strings: passe sysstr to attr function and wrapper
33 * journal: track bookmark deletion
42 * journal: track bookmark deletion
34 * transaction: actually delete file created during the transaction on rollback
43 * transaction: actually delete file created during the transaction on rollback
35 * pull: avoid referencing a variable before it is initialized
44 * pull: avoid referencing a variable before it is initialized
36 * rust-filepatterns: also normalize RelPath
45 * rust-filepatterns: also normalize RelPath
37 * narrow: hoist a variable to a higher level to avoid use-before-init warning
46 * narrow: hoist a variable to a higher level to avoid use-before-init warning
38 * convert: stabilize subversion date sorter
47 * convert: stabilize subversion date sorter
39 * run-tests: detect HGWITHRUSTEXT value
48 * run-tests: detect HGWITHRUSTEXT value
40 * censor: accept censored revision during upgrade
49 * censor: accept censored revision during upgrade
41 * rust-matchers: fix quadratic complexity in `FileMatcher`
50 * rust-matchers: fix quadratic complexity in `FileMatcher`
42 * unstable: do not consider internal phases when computing unstable
51 * unstable: do not consider internal phases when computing unstable
43 * Still a whole bunch of Python 2 -> 3 migration leftovers
52 * Still a whole bunch of Python 2 -> 3 migration leftovers
44
53
45 == Backwards Compatibility Changes ==
54 == Backwards Compatibility Changes ==
46 * perf: display all timing by default
55 * perf: display all timing by default
47 * infinitepush: drop the extension
56 * infinitepush: drop the extension
48 * debug-delta-chain: print less data by default
57 * debug-delta-chain: print less data by default
49
58
50 == Internal API Changes ==
59 == Internal API Changes ==
51
60
52 * The revlog interface has been significantly cleaned up.
61 * The revlog interface has been significantly cleaned up.
53 * configitems: add `documentation` field
62 * configitems: add `documentation` field
54 * configitems: declare items in a TOML file
63 * configitems: declare items in a TOML file
55 * configitems: move blackbox's config items to the new configitems.toml
64 * configitems: move blackbox's config items to the new configitems.toml
56 * path-suboption: deprecated specifying the attributes as bytes
65 * path-suboption: deprecated specifying the attributes as bytes
57 * pycompat: deprecate using bytes
66 * pycompat: deprecate using bytes
58 * check-code: drop the `safehasattr` rule
67 * check-code: drop the `safehasattr` rule
59 * safehasattr: drop usage in favor of hasattr
68 * safehasattr: drop usage in favor of hasattr
60 * rust: add `UncheckedRevision` type
69 * rust: add `UncheckedRevision` type
61 * rust: implement the `Graph` trait for all revlogs
70 * rust: implement the `Graph` trait for all revlogs
62 * rust: make `Revision` a newtype
71 * rust: make `Revision` a newtype
63 * perf: change the way we approach revlog reading
72 * perf: change the way we approach revlog reading
64 * perf: ensure all readlog's reading is done within a `reading` context
73 * perf: ensure all readlog's reading is done within a `reading` context
65 * delta-chain: move the debugdeltachain command in revlogutils
74 * delta-chain: move the debugdeltachain command in revlogutils
66
75
67 == Miscellaneous ==
76 == Miscellaneous ==
68
77
@@ -1,277 +1,281 b''
1 $ hg init test
1 $ hg init test
2 $ cd test
2 $ cd test
3 $ hg unbundle "$TESTDIR/bundles/remote.hg"
3 $ hg unbundle "$TESTDIR/bundles/remote.hg"
4 adding changesets
4 adding changesets
5 adding manifests
5 adding manifests
6 adding file changes
6 adding file changes
7 added 9 changesets with 7 changes to 4 files (+1 heads)
7 added 9 changesets with 7 changes to 4 files (+1 heads)
8 new changesets bfaf4b5cbf01:916f1afdef90 (9 drafts)
8 new changesets bfaf4b5cbf01:916f1afdef90 (9 drafts)
9 (run 'hg heads' to see heads, 'hg merge' to merge)
9 (run 'hg heads' to see heads, 'hg merge' to merge)
10 $ hg up tip
10 $ hg up tip
11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12 $ cd ..
12 $ cd ..
13
13
14 $ for i in 0 1 2 3 4 5 6 7 8; do
14 $ for i in 0 1 2 3 4 5 6 7 8; do
15 > mkdir test-"$i"
15 > mkdir test-"$i"
16 > hg --cwd test-"$i" init
16 > hg --cwd test-"$i" init
17 > hg -R test bundle -r "$i" test-"$i".hg test-"$i"
17 > hg -R test bundle -r "$i" test-"$i".hg test-"$i"
18 > cd test-"$i"
18 > cd test-"$i"
19 > hg unbundle ../test-"$i".hg
19 > hg unbundle ../test-"$i".hg
20 > hg verify -q
20 > hg verify -q
21 > hg tip -q
21 > hg tip -q
22 > cd ..
22 > cd ..
23 > done
23 > done
24 searching for changes
24 searching for changes
25 1 changesets found
25 1 changesets found
26 adding changesets
26 adding changesets
27 adding manifests
27 adding manifests
28 adding file changes
28 adding file changes
29 added 1 changesets with 1 changes to 1 files
29 added 1 changesets with 1 changes to 1 files
30 new changesets bfaf4b5cbf01 (1 drafts)
30 new changesets bfaf4b5cbf01 (1 drafts)
31 (run 'hg update' to get a working copy)
31 (run 'hg update' to get a working copy)
32 0:bfaf4b5cbf01
32 0:bfaf4b5cbf01
33 searching for changes
33 searching for changes
34 2 changesets found
34 2 changesets found
35 adding changesets
35 adding changesets
36 adding manifests
36 adding manifests
37 adding file changes
37 adding file changes
38 added 2 changesets with 2 changes to 1 files
38 added 2 changesets with 2 changes to 1 files
39 new changesets bfaf4b5cbf01:21f32785131f (2 drafts)
39 new changesets bfaf4b5cbf01:21f32785131f (2 drafts)
40 (run 'hg update' to get a working copy)
40 (run 'hg update' to get a working copy)
41 1:21f32785131f
41 1:21f32785131f
42 searching for changes
42 searching for changes
43 3 changesets found
43 3 changesets found
44 adding changesets
44 adding changesets
45 adding manifests
45 adding manifests
46 adding file changes
46 adding file changes
47 added 3 changesets with 3 changes to 1 files
47 added 3 changesets with 3 changes to 1 files
48 new changesets bfaf4b5cbf01:4ce51a113780 (3 drafts)
48 new changesets bfaf4b5cbf01:4ce51a113780 (3 drafts)
49 (run 'hg update' to get a working copy)
49 (run 'hg update' to get a working copy)
50 2:4ce51a113780
50 2:4ce51a113780
51 searching for changes
51 searching for changes
52 4 changesets found
52 4 changesets found
53 adding changesets
53 adding changesets
54 adding manifests
54 adding manifests
55 adding file changes
55 adding file changes
56 added 4 changesets with 4 changes to 1 files
56 added 4 changesets with 4 changes to 1 files
57 new changesets bfaf4b5cbf01:93ee6ab32777 (4 drafts)
57 new changesets bfaf4b5cbf01:93ee6ab32777 (4 drafts)
58 (run 'hg update' to get a working copy)
58 (run 'hg update' to get a working copy)
59 3:93ee6ab32777
59 3:93ee6ab32777
60 searching for changes
60 searching for changes
61 2 changesets found
61 2 changesets found
62 adding changesets
62 adding changesets
63 adding manifests
63 adding manifests
64 adding file changes
64 adding file changes
65 added 2 changesets with 2 changes to 1 files
65 added 2 changesets with 2 changes to 1 files
66 new changesets bfaf4b5cbf01:c70afb1ee985 (2 drafts)
66 new changesets bfaf4b5cbf01:c70afb1ee985 (2 drafts)
67 (run 'hg update' to get a working copy)
67 (run 'hg update' to get a working copy)
68 1:c70afb1ee985
68 1:c70afb1ee985
69 searching for changes
69 searching for changes
70 3 changesets found
70 3 changesets found
71 adding changesets
71 adding changesets
72 adding manifests
72 adding manifests
73 adding file changes
73 adding file changes
74 added 3 changesets with 3 changes to 1 files
74 added 3 changesets with 3 changes to 1 files
75 new changesets bfaf4b5cbf01:f03ae5a9b979 (3 drafts)
75 new changesets bfaf4b5cbf01:f03ae5a9b979 (3 drafts)
76 (run 'hg update' to get a working copy)
76 (run 'hg update' to get a working copy)
77 2:f03ae5a9b979
77 2:f03ae5a9b979
78 searching for changes
78 searching for changes
79 4 changesets found
79 4 changesets found
80 adding changesets
80 adding changesets
81 adding manifests
81 adding manifests
82 adding file changes
82 adding file changes
83 added 4 changesets with 5 changes to 2 files
83 added 4 changesets with 5 changes to 2 files
84 new changesets bfaf4b5cbf01:095cb14b1b4d (4 drafts)
84 new changesets bfaf4b5cbf01:095cb14b1b4d (4 drafts)
85 (run 'hg update' to get a working copy)
85 (run 'hg update' to get a working copy)
86 3:095cb14b1b4d
86 3:095cb14b1b4d
87 searching for changes
87 searching for changes
88 5 changesets found
88 5 changesets found
89 adding changesets
89 adding changesets
90 adding manifests
90 adding manifests
91 adding file changes
91 adding file changes
92 added 5 changesets with 6 changes to 3 files
92 added 5 changesets with 6 changes to 3 files
93 new changesets bfaf4b5cbf01:faa2e4234c7a (5 drafts)
93 new changesets bfaf4b5cbf01:faa2e4234c7a (5 drafts)
94 (run 'hg update' to get a working copy)
94 (run 'hg update' to get a working copy)
95 4:faa2e4234c7a
95 4:faa2e4234c7a
96 searching for changes
96 searching for changes
97 5 changesets found
97 5 changesets found
98 adding changesets
98 adding changesets
99 adding manifests
99 adding manifests
100 adding file changes
100 adding file changes
101 added 5 changesets with 5 changes to 2 files
101 added 5 changesets with 5 changes to 2 files
102 new changesets bfaf4b5cbf01:916f1afdef90 (5 drafts)
102 new changesets bfaf4b5cbf01:916f1afdef90 (5 drafts)
103 (run 'hg update' to get a working copy)
103 (run 'hg update' to get a working copy)
104 4:916f1afdef90
104 4:916f1afdef90
105 $ cd test-8
105 $ cd test-8
106 $ hg pull ../test-7
106 $ hg pull ../test-7
107 pulling from ../test-7
107 pulling from ../test-7
108 searching for changes
108 searching for changes
109 adding changesets
109 adding changesets
110 adding manifests
110 adding manifests
111 adding file changes
111 adding file changes
112 added 4 changesets with 2 changes to 3 files (+1 heads)
112 added 4 changesets with 2 changes to 3 files (+1 heads)
113 new changesets c70afb1ee985:faa2e4234c7a
113 new changesets c70afb1ee985:faa2e4234c7a
114 1 local changesets published
114 1 local changesets published
115 (run 'hg heads' to see heads, 'hg merge' to merge)
115 (run 'hg heads' to see heads, 'hg merge' to merge)
116 $ hg verify -q
116 $ hg verify -q
117 $ hg rollback
117 $ hg rollback
118 repository tip rolled back to revision 4 (undo pull)
118 repository tip rolled back to revision 4 (undo pull)
119 $ cd ..
119 $ cd ..
120
120
121 should fail
121 should fail
122
122
123 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg test-3
123 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg test-3
124 abort: --base is incompatible with specifying destinations
124 abort: --base is incompatible with specifying destinations
125 [10]
125 [10]
126 $ hg -R test bundle -a -r tip test-bundle-branch1.hg test-3
126 $ hg -R test bundle -a -r tip test-bundle-branch1.hg test-3
127 abort: --all is incompatible with specifying destinations
127 abort: --all is incompatible with specifying destinations
128 [10]
128 [10]
129 $ hg -R test bundle -r tip test-bundle-branch1.hg
129 $ hg -R test bundle -r tip test-bundle-branch1.hg
130 config error: default repository not configured!
130 config error: default repository not configured!
131 (see 'hg help config.paths')
131 (see 'hg help config.paths')
132 [30]
132 [30]
133
133
134 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
134 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
135 2 changesets found
135 2 changesets found
136 $ hg -R test bundle --base 2 -r 7 test-bundle-branch2.hg
136 $ hg -R test bundle --base 2 -r 7 test-bundle-branch2.hg
137 4 changesets found
137 4 changesets found
138 $ hg -R test bundle --base 2 test-bundle-all.hg
138 $ hg -R test bundle --base 2 test-bundle-all.hg
139 6 changesets found
139 6 changesets found
140 $ hg -R test bundle --base 2 --all test-bundle-all-2.hg
140 $ hg -R test bundle --base 2 --all test-bundle-all-2.hg
141 ignoring --base because --all was specified
141 ignoring --base because --all was specified
142 9 changesets found
142 9 changesets found
143 $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-with-dest.hg --config paths.default=$TESTTMP/test-3
144 5 changesets found
145 $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-no-dest.hg
146 5 changesets found
143 $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
147 $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
144 1 changesets found
148 1 changesets found
145
149
146 empty bundle
150 empty bundle
147
151
148 $ hg -R test bundle --base 7 --base 8 test-bundle-empty.hg
152 $ hg -R test bundle --base 7 --base 8 test-bundle-empty.hg
149 no changes found
153 no changes found
150 [1]
154 [1]
151
155
152 issue76 msg2163
156 issue76 msg2163
153
157
154 $ hg -R test bundle --base 3 -r 3 -r 3 test-bundle-cset-3.hg
158 $ hg -R test bundle --base 3 -r 3 -r 3 test-bundle-cset-3.hg
155 no changes found
159 no changes found
156 [1]
160 [1]
157
161
158 Issue1910: 'hg bundle --base $head' does not exclude $head from
162 Issue1910: 'hg bundle --base $head' does not exclude $head from
159 result
163 result
160
164
161 $ hg -R test bundle --base 7 test-bundle-cset-7.hg
165 $ hg -R test bundle --base 7 test-bundle-cset-7.hg
162 4 changesets found
166 4 changesets found
163
167
164 $ hg clone test-2 test-9
168 $ hg clone test-2 test-9
165 updating to branch default
169 updating to branch default
166 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
170 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
167 $ cd test-9
171 $ cd test-9
168
172
169 revision 2
173 revision 2
170
174
171 $ hg tip -q
175 $ hg tip -q
172 2:4ce51a113780
176 2:4ce51a113780
173 $ hg unbundle ../test-bundle-should-fail.hg
177 $ hg unbundle ../test-bundle-should-fail.hg
174 adding changesets
178 adding changesets
175 transaction abort!
179 transaction abort!
176 rollback completed
180 rollback completed
177 abort: 00changelog@93ee6ab32777cd430e07da694794fb6a4f917712: unknown parent
181 abort: 00changelog@93ee6ab32777cd430e07da694794fb6a4f917712: unknown parent
178 [50]
182 [50]
179
183
180 revision 2
184 revision 2
181
185
182 $ hg tip -q
186 $ hg tip -q
183 2:4ce51a113780
187 2:4ce51a113780
184 $ hg unbundle ../test-bundle-all.hg
188 $ hg unbundle ../test-bundle-all.hg
185 adding changesets
189 adding changesets
186 adding manifests
190 adding manifests
187 adding file changes
191 adding file changes
188 added 6 changesets with 4 changes to 4 files (+1 heads)
192 added 6 changesets with 4 changes to 4 files (+1 heads)
189 new changesets 93ee6ab32777:916f1afdef90 (6 drafts)
193 new changesets 93ee6ab32777:916f1afdef90 (6 drafts)
190 (run 'hg heads' to see heads, 'hg merge' to merge)
194 (run 'hg heads' to see heads, 'hg merge' to merge)
191
195
192 revision 8
196 revision 8
193
197
194 $ hg tip -q
198 $ hg tip -q
195 8:916f1afdef90
199 8:916f1afdef90
196 $ hg verify -q
200 $ hg verify -q
197 $ hg rollback
201 $ hg rollback
198 repository tip rolled back to revision 2 (undo unbundle)
202 repository tip rolled back to revision 2 (undo unbundle)
199
203
200 revision 2
204 revision 2
201
205
202 $ hg tip -q
206 $ hg tip -q
203 2:4ce51a113780
207 2:4ce51a113780
204 $ hg unbundle ../test-bundle-branch1.hg
208 $ hg unbundle ../test-bundle-branch1.hg
205 adding changesets
209 adding changesets
206 adding manifests
210 adding manifests
207 adding file changes
211 adding file changes
208 added 2 changesets with 2 changes to 2 files
212 added 2 changesets with 2 changes to 2 files
209 new changesets 93ee6ab32777:916f1afdef90 (2 drafts)
213 new changesets 93ee6ab32777:916f1afdef90 (2 drafts)
210 (run 'hg update' to get a working copy)
214 (run 'hg update' to get a working copy)
211
215
212 revision 4
216 revision 4
213
217
214 $ hg tip -q
218 $ hg tip -q
215 4:916f1afdef90
219 4:916f1afdef90
216 $ hg verify -q
220 $ hg verify -q
217 $ hg rollback
221 $ hg rollback
218 repository tip rolled back to revision 2 (undo unbundle)
222 repository tip rolled back to revision 2 (undo unbundle)
219 $ hg unbundle ../test-bundle-branch2.hg
223 $ hg unbundle ../test-bundle-branch2.hg
220 adding changesets
224 adding changesets
221 adding manifests
225 adding manifests
222 adding file changes
226 adding file changes
223 added 4 changesets with 3 changes to 3 files (+1 heads)
227 added 4 changesets with 3 changes to 3 files (+1 heads)
224 new changesets c70afb1ee985:faa2e4234c7a (4 drafts)
228 new changesets c70afb1ee985:faa2e4234c7a (4 drafts)
225 (run 'hg heads' to see heads, 'hg merge' to merge)
229 (run 'hg heads' to see heads, 'hg merge' to merge)
226
230
227 revision 6
231 revision 6
228
232
229 $ hg tip -q
233 $ hg tip -q
230 6:faa2e4234c7a
234 6:faa2e4234c7a
231 $ hg verify -q
235 $ hg verify -q
232 $ hg rollback
236 $ hg rollback
233 repository tip rolled back to revision 2 (undo unbundle)
237 repository tip rolled back to revision 2 (undo unbundle)
234 $ hg unbundle ../test-bundle-cset-7.hg
238 $ hg unbundle ../test-bundle-cset-7.hg
235 adding changesets
239 adding changesets
236 adding manifests
240 adding manifests
237 adding file changes
241 adding file changes
238 added 2 changesets with 2 changes to 2 files
242 added 2 changesets with 2 changes to 2 files
239 new changesets 93ee6ab32777:916f1afdef90 (2 drafts)
243 new changesets 93ee6ab32777:916f1afdef90 (2 drafts)
240 (run 'hg update' to get a working copy)
244 (run 'hg update' to get a working copy)
241
245
242 revision 4
246 revision 4
243
247
244 $ hg tip -q
248 $ hg tip -q
245 4:916f1afdef90
249 4:916f1afdef90
246 $ hg verify -q
250 $ hg verify -q
247
251
248 $ cd ../test
252 $ cd ../test
249 $ hg merge 7
253 $ hg merge 7
250 note: possible conflict - afile was renamed multiple times to:
254 note: possible conflict - afile was renamed multiple times to:
251 adifferentfile
255 adifferentfile
252 anotherfile
256 anotherfile
253 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
257 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
254 (branch merge, don't forget to commit)
258 (branch merge, don't forget to commit)
255 $ hg ci -m merge
259 $ hg ci -m merge
256 $ cd ..
260 $ cd ..
257 $ hg -R test bundle --base 2 test-bundle-head.hg
261 $ hg -R test bundle --base 2 test-bundle-head.hg
258 7 changesets found
262 7 changesets found
259 $ hg clone test-2 test-10
263 $ hg clone test-2 test-10
260 updating to branch default
264 updating to branch default
261 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
262 $ cd test-10
266 $ cd test-10
263 $ hg unbundle ../test-bundle-head.hg
267 $ hg unbundle ../test-bundle-head.hg
264 adding changesets
268 adding changesets
265 adding manifests
269 adding manifests
266 adding file changes
270 adding file changes
267 added 7 changesets with 4 changes to 4 files
271 added 7 changesets with 4 changes to 4 files
268 new changesets 93ee6ab32777:03fc0b0e347c (7 drafts)
272 new changesets 93ee6ab32777:03fc0b0e347c (7 drafts)
269 (run 'hg update' to get a working copy)
273 (run 'hg update' to get a working copy)
270
274
271 revision 9
275 revision 9
272
276
273 $ hg tip -q
277 $ hg tip -q
274 9:03fc0b0e347c
278 9:03fc0b0e347c
275 $ hg verify -q
279 $ hg verify -q
276
280
277 $ cd ..
281 $ cd ..
@@ -1,79 +1,75 b''
1 Make a narrow clone then archive it
1 Test exclusion-based ACL enforcement
2 $ . "$TESTDIR/narrow-library.sh"
2 $ . "$TESTDIR/narrow-library.sh"
3
3
4 $ hg init master
4 $ hg init master
5 $ cd master
5 $ cd master
6
6
7 $ for x in `$TESTDIR/seq.py 3`; do
7 $ for x in `$TESTDIR/seq.py 3`; do
8 > echo $x > "f$x"
8 > echo $x > "f$x"
9 > hg add "f$x"
9 > hg add "f$x"
10 > hg commit -m "Add $x"
10 > hg commit -m "Add $x"
11 > done
11 > done
12 $ cat >> .hg/hgrc << EOF
12 $ cat >> .hg/hgrc << EOF
13 > [narrowacl]
13 > [narrowacl]
14 > default.includes=f1 f2
14 > default.includes=*
15 > default.excludes=f2 f3
16 > test.excludes=f3
15 > EOF
17 > EOF
16 $ hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid
18 $ hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid
17 $ cat hg.pid >> "$DAEMON_PIDS"
19 $ cat hg.pid >> "$DAEMON_PIDS"
18
20
19 $ cd ..
21 $ cd ..
20 $ hg clone http://localhost:$HGPORT1 narrowclone1
22 $ hg clone http://localhost:$HGPORT1 narrowclone1
21 requesting all changes
23 requesting all changes
22 adding changesets
24 adding changesets
23 adding manifests
25 adding manifests
24 adding file changes
26 adding file changes
25 added 3 changesets with 2 changes to 2 files
27 added 3 changesets with 2 changes to 2 files
26 new changesets * (glob)
28 new changesets * (glob)
27 updating to branch default
29 updating to branch default
28 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
30 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
29
31
30 The clone directory should only contain f1 and f2
32 The clone directory should only contain f1 and f2
31 $ ls -A -1 narrowclone1 | sort
33 $ ls -A -1 narrowclone1 | sort
32 .hg
34 .hg
33 f1
35 f1
34 f2
36 f2
35
37
36 Requirements should contain narrowhg
38 Requirements should contain narrowhg
37 $ hg debugrequires -R narrowclone1 | grep narrowhg
39 $ hg debugrequires -R narrowclone1 | grep narrowhg
38 narrowhg-experimental
40 narrowhg-experimental
39
41
40 NarrowHG should track f1 and f2
42 NarrowHG should exclude f3.
41 $ hg -R narrowclone1 tracked
43 $ hg -R narrowclone1 tracked
42 I path:f1
44 I path:.
43 I path:f2
45 X path:f3
44
46
45 Narrow should not be able to widen to include f3
47 Narrow should not be able to widen to include f3
46 $ hg -R narrowclone1 tracked --addinclude f3
48 $ hg -R narrowclone1 tracked --addinclude f3
47 comparing with http://localhost:$HGPORT1/
49 comparing with http://localhost:$HGPORT1/
48 searching for changes
50 searching for changes
49 abort: The following includes are not accessible for test: ['path:f3']
51 adding changesets
52 adding manifests
53 adding file changes
54 $ ls -A -1 narrowclone1 | sort
55 .hg
56 f1
57 f2
58 $ hg -R narrowclone1 tracked
59 I path:.
60 X path:f3
61
62
63 Narrow should not be able to remove the exclusion for f3
64 $ hg -R narrowclone1 tracked --removeexclude f3
65 comparing with http://localhost:$HGPORT1/
66 searching for changes
67 abort: The following excludes cannot be removed for test: ['path:f3']
50 [255]
68 [255]
51 $ ls -A -1 narrowclone1 | sort
69 $ ls -A -1 narrowclone1 | sort
52 .hg
70 .hg
53 f1
71 f1
54 f2
72 f2
55 $ hg -R narrowclone1 tracked
73 $ hg -R narrowclone1 tracked
56 I path:f1
74 I path:.
57 I path:f2
75 X path:f3
58
59 Narrow should allow widen to include f2
60 $ hg -R narrowclone1 tracked --removeinclude f2 > /dev/null
61 $ hg -R narrowclone1 tracked
62 I path:f1
63 $ ls -A -1 narrowclone1 | sort
64 .hg
65 f1
66 $ hg -R narrowclone1 tracked --addinclude f2
67 comparing with http://localhost:$HGPORT1/
68 searching for changes
69 adding changesets
70 adding manifests
71 adding file changes
72 added 0 changesets with 1 changes to 1 files
73 $ hg -R narrowclone1 tracked
74 I path:f1
75 I path:f2
76 $ ls -A -1 narrowclone1 | sort
77 .hg
78 f1
79 f2
General Comments 0
You need to be logged in to leave comments. Login now