##// END OF EJS Templates
branching: merge stable into default
Raphaël Gomès -
r50522:7577b864 merge default
parent child Browse files
Show More

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

@@ -1,238 +1,239 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,251 +1,255 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
253 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
254 0000000000000000000000000000000000000000 6.3.0
255 c890d8b8bc59b18e5febf60caada629df5356ee2 6.3.1
@@ -1,342 +1,344 b''
1 #
1 #
2 # This file is autogenerated by pip-compile with python 3.7
2 # This file is autogenerated by pip-compile with python 3.7
3 # To update, run:
3 # To update, run:
4 #
4 #
5 # pip-compile --generate-hashes --output-file=contrib/packaging/requirements-windows-py3.txt contrib/packaging/requirements-windows.txt.in
5 # pip-compile --generate-hashes --no-reuse-hashes --output-file=contrib/packaging/requirements-windows-py3.txt contrib/packaging/requirements-windows.txt.in
6 #
6 #
7 atomicwrites==1.4.0 \
7 atomicwrites==1.4.0 \
8 --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 \
8 --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 \
9 --hash=sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a
9 --hash=sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a
10 # via pytest
10 # via pytest
11 attrs==21.2.0 \
11 attrs==21.2.0 \
12 --hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \
12 --hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \
13 --hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb
13 --hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb
14 # via pytest
14 # via pytest
15 cached-property==1.5.2 \
15 cached-property==1.5.2 \
16 --hash=sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130 \
16 --hash=sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130 \
17 --hash=sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0
17 --hash=sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0
18 # via pygit2
18 # via pygit2
19 cffi==1.15.0 \
19 cffi==1.15.0 \
20 --hash=sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3 \
20 --hash=sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3 \
21 --hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2 \
21 --hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2 \
22 --hash=sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636 \
22 --hash=sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636 \
23 --hash=sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20 \
23 --hash=sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20 \
24 --hash=sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728 \
24 --hash=sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728 \
25 --hash=sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27 \
25 --hash=sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27 \
26 --hash=sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66 \
26 --hash=sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66 \
27 --hash=sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443 \
27 --hash=sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443 \
28 --hash=sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0 \
28 --hash=sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0 \
29 --hash=sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7 \
29 --hash=sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7 \
30 --hash=sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39 \
30 --hash=sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39 \
31 --hash=sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605 \
31 --hash=sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605 \
32 --hash=sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a \
32 --hash=sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a \
33 --hash=sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37 \
33 --hash=sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37 \
34 --hash=sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029 \
34 --hash=sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029 \
35 --hash=sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139 \
35 --hash=sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139 \
36 --hash=sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc \
36 --hash=sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc \
37 --hash=sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df \
37 --hash=sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df \
38 --hash=sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14 \
38 --hash=sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14 \
39 --hash=sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880 \
39 --hash=sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880 \
40 --hash=sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2 \
40 --hash=sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2 \
41 --hash=sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a \
41 --hash=sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a \
42 --hash=sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e \
42 --hash=sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e \
43 --hash=sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474 \
43 --hash=sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474 \
44 --hash=sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024 \
44 --hash=sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024 \
45 --hash=sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8 \
45 --hash=sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8 \
46 --hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \
46 --hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \
47 --hash=sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e \
47 --hash=sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e \
48 --hash=sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a \
48 --hash=sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a \
49 --hash=sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e \
49 --hash=sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e \
50 --hash=sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032 \
50 --hash=sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032 \
51 --hash=sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6 \
51 --hash=sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6 \
52 --hash=sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e \
52 --hash=sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e \
53 --hash=sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b \
53 --hash=sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b \
54 --hash=sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e \
54 --hash=sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e \
55 --hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \
55 --hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \
56 --hash=sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962 \
56 --hash=sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962 \
57 --hash=sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c \
57 --hash=sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c \
58 --hash=sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4 \
58 --hash=sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4 \
59 --hash=sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55 \
59 --hash=sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55 \
60 --hash=sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962 \
60 --hash=sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962 \
61 --hash=sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023 \
61 --hash=sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023 \
62 --hash=sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c \
62 --hash=sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c \
63 --hash=sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6 \
63 --hash=sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6 \
64 --hash=sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8 \
64 --hash=sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8 \
65 --hash=sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382 \
65 --hash=sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382 \
66 --hash=sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7 \
66 --hash=sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7 \
67 --hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \
67 --hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \
68 --hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \
68 --hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \
69 --hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796
69 --hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796
70 # via pygit2
70 # via pygit2
71 colorama==0.4.4 \
71 colorama==0.4.4 \
72 --hash=sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b \
72 --hash=sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b \
73 --hash=sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2
73 --hash=sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2
74 # via pytest
74 # via pytest
75 docutils==0.16 \
75 docutils==0.16 \
76 --hash=sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af \
76 --hash=sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af \
77 --hash=sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc
77 --hash=sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc
78 # via -r contrib/packaging/requirements-windows.txt.in
78 # via -r contrib/packaging/requirements-windows.txt.in
79 dulwich==0.20.46 \
79 dulwich==0.20.46 \
80 --hash=sha256:0a1ca555a3eafe7388d6cb81bb08f34608a1592500f0bd4c26734c91d208a546 \
80 --hash=sha256:0a1ca555a3eafe7388d6cb81bb08f34608a1592500f0bd4c26734c91d208a546 \
81 --hash=sha256:100d39bc18196a07c521fd5f60f78f397493303daa0b8690216864bbc621cd5d \
81 --hash=sha256:100d39bc18196a07c521fd5f60f78f397493303daa0b8690216864bbc621cd5d \
82 --hash=sha256:1162fdafb2abdfe66649617061f3853cb26384fade1f6884f6fe6e9c570a7552 \
82 --hash=sha256:1162fdafb2abdfe66649617061f3853cb26384fade1f6884f6fe6e9c570a7552 \
83 --hash=sha256:153c7512587384a290c60fef330f1ab397a59559e19e8b02a0169ff21b4c69fb \
83 --hash=sha256:153c7512587384a290c60fef330f1ab397a59559e19e8b02a0169ff21b4c69fb \
84 --hash=sha256:3e16376031466848e44aabf3489fafb054482143744b21167dbd168731041c74 \
84 --hash=sha256:3e16376031466848e44aabf3489fafb054482143744b21167dbd168731041c74 \
85 --hash=sha256:42fa5a68908556eb6c40f231a67caf6a4660588aad707a9d6b334fa1d8f04bf7 \
85 --hash=sha256:42fa5a68908556eb6c40f231a67caf6a4660588aad707a9d6b334fa1d8f04bf7 \
86 --hash=sha256:4f0e88ffff5db1523d93d92f1525fe5fa161318ffbaad502c1b9b3be7a067172 \
86 --hash=sha256:4f0e88ffff5db1523d93d92f1525fe5fa161318ffbaad502c1b9b3be7a067172 \
87 --hash=sha256:525115c4d1fbf60a5fe98f340b4ca597ba47b2c75d9c5ec750dd0e9115ef8ec6 \
87 --hash=sha256:525115c4d1fbf60a5fe98f340b4ca597ba47b2c75d9c5ec750dd0e9115ef8ec6 \
88 --hash=sha256:6676196e9cf377cde62aa2f5d741e93207437343e0c62368bd0d784c322a3c49 \
88 --hash=sha256:6676196e9cf377cde62aa2f5d741e93207437343e0c62368bd0d784c322a3c49 \
89 --hash=sha256:669c6b3d82996518a7fec4604771bd285e23f0860f41f565fef5987265d431d9 \
89 --hash=sha256:669c6b3d82996518a7fec4604771bd285e23f0860f41f565fef5987265d431d9 \
90 --hash=sha256:6826512f778eaa47e2e8c0a46cdc555958f9f5286771490b8642b4b508ea5d25 \
90 --hash=sha256:6826512f778eaa47e2e8c0a46cdc555958f9f5286771490b8642b4b508ea5d25 \
91 --hash=sha256:6eed5a3194d64112605fc0f638f4fa91771495e8674fa3e6d6b33bf150d297d5 \
91 --hash=sha256:6eed5a3194d64112605fc0f638f4fa91771495e8674fa3e6d6b33bf150d297d5 \
92 --hash=sha256:73e2585a9fcf1f8cdad8597a0c384c0b365b2e8346463130c96d9ea1478587ae \
92 --hash=sha256:73e2585a9fcf1f8cdad8597a0c384c0b365b2e8346463130c96d9ea1478587ae \
93 --hash=sha256:769442c9657b10fc35ac625beeaf440540c9288c96fcfaba3e58adf745c5cafd \
93 --hash=sha256:769442c9657b10fc35ac625beeaf440540c9288c96fcfaba3e58adf745c5cafd \
94 --hash=sha256:8d6fee82cedb2362942d9ef94061901f7e07d7d8674e4c7b6fceeef7822ae275 \
94 --hash=sha256:8d6fee82cedb2362942d9ef94061901f7e07d7d8674e4c7b6fceeef7822ae275 \
95 --hash=sha256:90a075aeb0fdbad7e18b9db3af161e3d635e2b7697b7a4b467e6844a13b0b210 \
95 --hash=sha256:90a075aeb0fdbad7e18b9db3af161e3d635e2b7697b7a4b467e6844a13b0b210 \
96 --hash=sha256:92024f572d32680e021219f77015c8b443c38022e502b7f51ad7cf51a6285a36 \
96 --hash=sha256:92024f572d32680e021219f77015c8b443c38022e502b7f51ad7cf51a6285a36 \
97 --hash=sha256:9ca4d73987f5b0e2e843497876f9bb39a47384a2e50597a85542285f5c890293 \
97 --hash=sha256:9ca4d73987f5b0e2e843497876f9bb39a47384a2e50597a85542285f5c890293 \
98 --hash=sha256:9fc7a4f633f5468453d5dd84a753cd99d4433f0397437229a0a8b10347935591 \
98 --hash=sha256:9fc7a4f633f5468453d5dd84a753cd99d4433f0397437229a0a8b10347935591 \
99 --hash=sha256:a5b68bd815cd2769c75e5a78708eb0440612df19b370a977aa9e01a056baa9ed \
99 --hash=sha256:a5b68bd815cd2769c75e5a78708eb0440612df19b370a977aa9e01a056baa9ed \
100 --hash=sha256:a5d1b7a3a7d84a5dedbb90092e00097357106b9642ac08a96c2ae89ccd8afd9a \
100 --hash=sha256:a5d1b7a3a7d84a5dedbb90092e00097357106b9642ac08a96c2ae89ccd8afd9a \
101 --hash=sha256:b1339bca70764eb8e780d80c72e7c1cb4651201dc9e43ec5d616bf51eb3bb3a6 \
101 --hash=sha256:b1339bca70764eb8e780d80c72e7c1cb4651201dc9e43ec5d616bf51eb3bb3a6 \
102 --hash=sha256:b739d759c10e2af7c964dcc97fd4e5dc49e8567d080eed8906fc422c79b7fdcf \
102 --hash=sha256:b739d759c10e2af7c964dcc97fd4e5dc49e8567d080eed8906fc422c79b7fdcf \
103 --hash=sha256:b9f49de83911eed7adbe83136229837ef9d102e42dbe6aacb1a18be45c997ace \
103 --hash=sha256:b9f49de83911eed7adbe83136229837ef9d102e42dbe6aacb1a18be45c997ace \
104 --hash=sha256:c4cd2cd7baa81246bdc8c5272d4e9224e2255da7a0618a220aab5e07b9888e9b \
104 --hash=sha256:c4cd2cd7baa81246bdc8c5272d4e9224e2255da7a0618a220aab5e07b9888e9b \
105 --hash=sha256:d38be7d3a78d608ecab3348f7920d6b9002e7972dd245206dc8075cfdb91621d \
105 --hash=sha256:d38be7d3a78d608ecab3348f7920d6b9002e7972dd245206dc8075cfdb91621d \
106 --hash=sha256:d928de1eba0326a2a8a52ed94c9bf7c315ff4db606a1aa3ae688d39574f93267 \
106 --hash=sha256:d928de1eba0326a2a8a52ed94c9bf7c315ff4db606a1aa3ae688d39574f93267 \
107 --hash=sha256:dd3eac228117487a959ac8f49ea2787eac34acc69999fe7adae70b23e3c3571c \
107 --hash=sha256:dd3eac228117487a959ac8f49ea2787eac34acc69999fe7adae70b23e3c3571c \
108 --hash=sha256:de22a54f68c6c4e97f9b924abd46da4618536d7934b9849066be9fc5cd31205d \
108 --hash=sha256:de22a54f68c6c4e97f9b924abd46da4618536d7934b9849066be9fc5cd31205d \
109 --hash=sha256:f4b7a7feb966a4669c254b18385fe0b3c639f3b1f5ddef0d9e083364cc762847 \
109 --hash=sha256:f4b7a7feb966a4669c254b18385fe0b3c639f3b1f5ddef0d9e083364cc762847 \
110 --hash=sha256:f9552ac246bceab1c5cdd1ec3cfe9446fe76b9853eaf59d3244df03eb27fd3fe
110 --hash=sha256:f9552ac246bceab1c5cdd1ec3cfe9446fe76b9853eaf59d3244df03eb27fd3fe
111 # via -r contrib/packaging/requirements-windows.txt.in
111 # via -r contrib/packaging/requirements-windows.txt.in
112 fuzzywuzzy==0.18.0 \
112 fuzzywuzzy==0.18.0 \
113 --hash=sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8
113 --hash=sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8 \
114 --hash=sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993
114 # via -r contrib/packaging/requirements-windows.txt.in
115 # via -r contrib/packaging/requirements-windows.txt.in
115 idna==3.2 \
116 idna==3.2 \
116 --hash=sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a \
117 --hash=sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a \
117 --hash=sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3
118 --hash=sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3
118 # via yarl
119 # via yarl
119 importlib-metadata==3.1.0 \
120 importlib-metadata==3.1.0 \
120 --hash=sha256:590690d61efdd716ff82c39ca9a9d4209252adfe288a4b5721181050acbd4175 \
121 --hash=sha256:590690d61efdd716ff82c39ca9a9d4209252adfe288a4b5721181050acbd4175 \
121 --hash=sha256:d9b8a46a0885337627a6430db287176970fff18ad421becec1d64cfc763c2099
122 --hash=sha256:d9b8a46a0885337627a6430db287176970fff18ad421becec1d64cfc763c2099
122 # via
123 # via
123 # keyring
124 # keyring
124 # pluggy
125 # pluggy
125 # pytest
126 # pytest
126 iniconfig==1.1.1 \
127 iniconfig==1.1.1 \
127 --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \
128 --hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \
128 --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32
129 --hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32
129 # via pytest
130 # via pytest
130 keyring==22.3.0 \
131 keyring==22.3.0 \
131 --hash=sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522 \
132 --hash=sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522 \
132 --hash=sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b
133 --hash=sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b
133 # via -r contrib/packaging/requirements-windows.txt.in
134 # via -r contrib/packaging/requirements-windows.txt.in
134 multidict==5.1.0 \
135 multidict==5.1.0 \
135 --hash=sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a \
136 --hash=sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a \
136 --hash=sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93 \
137 --hash=sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93 \
137 --hash=sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632 \
138 --hash=sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632 \
138 --hash=sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656 \
139 --hash=sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656 \
139 --hash=sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79 \
140 --hash=sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79 \
140 --hash=sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7 \
141 --hash=sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7 \
141 --hash=sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d \
142 --hash=sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d \
142 --hash=sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5 \
143 --hash=sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5 \
143 --hash=sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224 \
144 --hash=sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224 \
144 --hash=sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26 \
145 --hash=sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26 \
145 --hash=sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea \
146 --hash=sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea \
146 --hash=sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348 \
147 --hash=sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348 \
147 --hash=sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6 \
148 --hash=sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6 \
148 --hash=sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76 \
149 --hash=sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76 \
149 --hash=sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1 \
150 --hash=sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1 \
150 --hash=sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f \
151 --hash=sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f \
151 --hash=sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952 \
152 --hash=sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952 \
152 --hash=sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a \
153 --hash=sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a \
153 --hash=sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37 \
154 --hash=sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37 \
154 --hash=sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9 \
155 --hash=sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9 \
155 --hash=sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359 \
156 --hash=sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359 \
156 --hash=sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8 \
157 --hash=sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8 \
157 --hash=sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da \
158 --hash=sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da \
158 --hash=sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3 \
159 --hash=sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3 \
159 --hash=sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d \
160 --hash=sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d \
160 --hash=sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf \
161 --hash=sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf \
161 --hash=sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841 \
162 --hash=sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841 \
162 --hash=sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d \
163 --hash=sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d \
163 --hash=sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93 \
164 --hash=sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93 \
164 --hash=sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f \
165 --hash=sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f \
165 --hash=sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647 \
166 --hash=sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647 \
166 --hash=sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635 \
167 --hash=sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635 \
167 --hash=sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456 \
168 --hash=sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456 \
168 --hash=sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda \
169 --hash=sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda \
169 --hash=sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5 \
170 --hash=sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5 \
170 --hash=sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281 \
171 --hash=sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281 \
171 --hash=sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80
172 --hash=sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80
172 # via yarl
173 # via yarl
173 packaging==21.0 \
174 packaging==21.0 \
174 --hash=sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7 \
175 --hash=sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7 \
175 --hash=sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14
176 --hash=sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14
176 # via pytest
177 # via pytest
177 pluggy==0.13.1 \
178 pluggy==0.13.1 \
178 --hash=sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0 \
179 --hash=sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0 \
179 --hash=sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d
180 --hash=sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d
180 # via pytest
181 # via pytest
181 py==1.10.0 \
182 py==1.10.0 \
182 --hash=sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3 \
183 --hash=sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3 \
183 --hash=sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a
184 --hash=sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a
184 # via pytest
185 # via pytest
185 pycparser==2.21 \
186 pycparser==2.21 \
186 --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
187 --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
187 --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
188 --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
188 # via cffi
189 # via cffi
189 pygit2==1.7.1 \
190 pygit2==1.7.1 \
190 --hash=sha256:2c9e95efb86c0b32cc07c26be3d179e851ca4a7899c47fef63c4203963144f5e \
191 --hash=sha256:2c9e95efb86c0b32cc07c26be3d179e851ca4a7899c47fef63c4203963144f5e \
191 --hash=sha256:3ddacbf461652d3d4900382f821d9fbd5ae2dedecd7862b5245842419ad0ccba \
192 --hash=sha256:3ddacbf461652d3d4900382f821d9fbd5ae2dedecd7862b5245842419ad0ccba \
192 --hash=sha256:4cb0414df6089d0072ebe93ff2f34730737172dd5f0e72289567d06a6caf09c0 \
193 --hash=sha256:4cb0414df6089d0072ebe93ff2f34730737172dd5f0e72289567d06a6caf09c0 \
193 --hash=sha256:56e960dc74f4582bfa3ca17a1a9d542732fc93b5cf8f82574c235d06b2d61eae \
194 --hash=sha256:56e960dc74f4582bfa3ca17a1a9d542732fc93b5cf8f82574c235d06b2d61eae \
194 --hash=sha256:6b17ab922c2a2d99b30ab9222472b07732bf7261d9f9655a4ea23b4c700049d8 \
195 --hash=sha256:6b17ab922c2a2d99b30ab9222472b07732bf7261d9f9655a4ea23b4c700049d8 \
195 --hash=sha256:73a7b471f22cb59e8729016de1f447c472b3b2c1cc2b622194e5e3b48a7f5776 \
196 --hash=sha256:73a7b471f22cb59e8729016de1f447c472b3b2c1cc2b622194e5e3b48a7f5776 \
196 --hash=sha256:761a8850e33822796c1c24d411d5cc2460c04e1a74b04ae8560efd3596bbd6bd \
197 --hash=sha256:761a8850e33822796c1c24d411d5cc2460c04e1a74b04ae8560efd3596bbd6bd \
197 --hash=sha256:7c467e81158f5827b3bca6362e5cc9b92857eff9de65034d338c1f18524b09be \
198 --hash=sha256:7c467e81158f5827b3bca6362e5cc9b92857eff9de65034d338c1f18524b09be \
198 --hash=sha256:7c56e10592e62610a19bd3e2a633aafe3488c57b906c7c2fde0299937f0f0b2f \
199 --hash=sha256:7c56e10592e62610a19bd3e2a633aafe3488c57b906c7c2fde0299937f0f0b2f \
199 --hash=sha256:7cc2a8e29cc9598310a78cf58b70d9331277cf374802be8f97d97c4a9e5d8387 \
200 --hash=sha256:7cc2a8e29cc9598310a78cf58b70d9331277cf374802be8f97d97c4a9e5d8387 \
200 --hash=sha256:812670f7994f31778e873a9eced29d2bbfa91674e8be0ab1e974c8a4bda9cbab \
201 --hash=sha256:812670f7994f31778e873a9eced29d2bbfa91674e8be0ab1e974c8a4bda9cbab \
201 --hash=sha256:8cdb0b1d6c3d24b44f340fed143b16e64ba23fe2a449f1a5db87aaf9339a9dbe \
202 --hash=sha256:8cdb0b1d6c3d24b44f340fed143b16e64ba23fe2a449f1a5db87aaf9339a9dbe \
202 --hash=sha256:91b77a305d8d18b649396e66e832d654cd593a3d29b5728f753f254a04533812 \
203 --hash=sha256:91b77a305d8d18b649396e66e832d654cd593a3d29b5728f753f254a04533812 \
203 --hash=sha256:a75bcde32238c77eb0cf7d9698a5aa899408d7ad999a5920a29a7c4b80fdeaa7 \
204 --hash=sha256:a75bcde32238c77eb0cf7d9698a5aa899408d7ad999a5920a29a7c4b80fdeaa7 \
204 --hash=sha256:b060240cf3038e7a0706bbfc5436dd03b8d5ac797ac1d512b613f4d04b974c80 \
205 --hash=sha256:b060240cf3038e7a0706bbfc5436dd03b8d5ac797ac1d512b613f4d04b974c80 \
205 --hash=sha256:cdfa61c0428a8182e5a6a1161c017b824cd511574f080a40b10d6413774eb0ca \
206 --hash=sha256:cdfa61c0428a8182e5a6a1161c017b824cd511574f080a40b10d6413774eb0ca \
206 --hash=sha256:d7faa29558436decc2e78110f38d6677eb366b683ba5cdc2803d47195711165d \
207 --hash=sha256:d7faa29558436decc2e78110f38d6677eb366b683ba5cdc2803d47195711165d \
207 --hash=sha256:d831825ad9c3b3c28e6b3ef8a2401ad2d3fd4db5455427ff27175a7e254e2592 \
208 --hash=sha256:d831825ad9c3b3c28e6b3ef8a2401ad2d3fd4db5455427ff27175a7e254e2592 \
208 --hash=sha256:df4c477bdfac85d32a1e3180282cd829a0980aa69be9bd0f7cbd4db1778ca72b \
209 --hash=sha256:df4c477bdfac85d32a1e3180282cd829a0980aa69be9bd0f7cbd4db1778ca72b \
209 --hash=sha256:eced3529bafcaaac015d08dfaa743b3cbad37fcd5b13ae9d280b8b7f716ec5ce \
210 --hash=sha256:eced3529bafcaaac015d08dfaa743b3cbad37fcd5b13ae9d280b8b7f716ec5ce \
210 --hash=sha256:fec17e2da668e6bb192d777417aad9c7ca924a166d0a0b9a81a11e00362b1bc7
211 --hash=sha256:fec17e2da668e6bb192d777417aad9c7ca924a166d0a0b9a81a11e00362b1bc7
211 # via -r contrib/packaging/requirements-windows.txt.in
212 # via -r contrib/packaging/requirements-windows.txt.in
212 pygments==2.7.1 \
213 pygments==2.7.1 \
213 --hash=sha256:307543fe65c0947b126e83dd5a61bd8acbd84abec11f43caebaf5534cbc17998 \
214 --hash=sha256:307543fe65c0947b126e83dd5a61bd8acbd84abec11f43caebaf5534cbc17998 \
214 --hash=sha256:926c3f319eda178d1bd90851e4317e6d8cdb5e292a3386aac9bd75eca29cf9c7
215 --hash=sha256:926c3f319eda178d1bd90851e4317e6d8cdb5e292a3386aac9bd75eca29cf9c7
215 # via -r contrib/packaging/requirements-windows.txt.in
216 # via -r contrib/packaging/requirements-windows.txt.in
216 pyparsing==2.4.7 \
217 pyparsing==2.4.7 \
217 --hash=sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1 \
218 --hash=sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1 \
218 --hash=sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b
219 --hash=sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b
219 # via packaging
220 # via packaging
220 pytest==6.2.4 \
221 pytest==6.2.4 \
221 --hash=sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b \
222 --hash=sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b \
222 --hash=sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890
223 --hash=sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890
223 # via pytest-vcr
224 # via pytest-vcr
224 pytest-vcr==1.0.2 \
225 pytest-vcr==1.0.2 \
225 --hash=sha256:23ee51b75abbcc43d926272773aae4f39f93aceb75ed56852d0bf618f92e1896
226 --hash=sha256:23ee51b75abbcc43d926272773aae4f39f93aceb75ed56852d0bf618f92e1896 \
227 --hash=sha256:2f316e0539399bea0296e8b8401145c62b6f85e9066af7e57b6151481b0d6d9c
226 # via -r contrib/packaging/requirements-windows.txt.in
228 # via -r contrib/packaging/requirements-windows.txt.in
227 pywin32-ctypes==0.2.0 \
229 pywin32-ctypes==0.2.0 \
228 --hash=sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942 \
230 --hash=sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942 \
229 --hash=sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98
231 --hash=sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98
230 # via
232 # via
231 # -r contrib/packaging/requirements-windows.txt.in
233 # -r contrib/packaging/requirements-windows.txt.in
232 # keyring
234 # keyring
233 pyyaml==5.4.1 \
235 pyyaml==5.4.1 \
234 --hash=sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf \
236 --hash=sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf \
235 --hash=sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696 \
237 --hash=sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696 \
236 --hash=sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393 \
238 --hash=sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393 \
237 --hash=sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77 \
239 --hash=sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77 \
238 --hash=sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922 \
240 --hash=sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922 \
239 --hash=sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5 \
241 --hash=sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5 \
240 --hash=sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8 \
242 --hash=sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8 \
241 --hash=sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10 \
243 --hash=sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10 \
242 --hash=sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc \
244 --hash=sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc \
243 --hash=sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018 \
245 --hash=sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018 \
244 --hash=sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e \
246 --hash=sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e \
245 --hash=sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253 \
247 --hash=sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253 \
246 --hash=sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347 \
248 --hash=sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347 \
247 --hash=sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183 \
249 --hash=sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183 \
248 --hash=sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541 \
250 --hash=sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541 \
249 --hash=sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb \
251 --hash=sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb \
250 --hash=sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185 \
252 --hash=sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185 \
251 --hash=sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc \
253 --hash=sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc \
252 --hash=sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db \
254 --hash=sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db \
253 --hash=sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa \
255 --hash=sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa \
254 --hash=sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46 \
256 --hash=sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46 \
255 --hash=sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122 \
257 --hash=sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122 \
256 --hash=sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b \
258 --hash=sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b \
257 --hash=sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63 \
259 --hash=sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63 \
258 --hash=sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df \
260 --hash=sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df \
259 --hash=sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc \
261 --hash=sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc \
260 --hash=sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247 \
262 --hash=sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247 \
261 --hash=sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6 \
263 --hash=sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6 \
262 --hash=sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0
264 --hash=sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0
263 # via vcrpy
265 # via vcrpy
264 six==1.16.0 \
266 six==1.16.0 \
265 --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
267 --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
266 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
268 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
267 # via vcrpy
269 # via vcrpy
268 toml==0.10.2 \
270 toml==0.10.2 \
269 --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \
271 --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \
270 --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f
272 --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f
271 # via pytest
273 # via pytest
272 typing-extensions==3.10.0.0 \
274 typing-extensions==3.10.0.0 \
273 --hash=sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497 \
275 --hash=sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497 \
274 --hash=sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342 \
276 --hash=sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342 \
275 --hash=sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84
277 --hash=sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84
276 # via yarl
278 # via yarl
277 urllib3==1.25.11 \
279 urllib3==1.25.11 \
278 --hash=sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2 \
280 --hash=sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2 \
279 --hash=sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e
281 --hash=sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e
280 # via dulwich
282 # via dulwich
281 vcrpy==4.1.1 \
283 vcrpy==4.1.1 \
282 --hash=sha256:12c3fcdae7b88ecf11fc0d3e6d77586549d4575a2ceee18e82eee75c1f626162 \
284 --hash=sha256:12c3fcdae7b88ecf11fc0d3e6d77586549d4575a2ceee18e82eee75c1f626162 \
283 --hash=sha256:57095bf22fc0a2d99ee9674cdafebed0f3ba763018582450706f7d3a74fff599
285 --hash=sha256:57095bf22fc0a2d99ee9674cdafebed0f3ba763018582450706f7d3a74fff599
284 # via pytest-vcr
286 # via pytest-vcr
285 windows-curses==2.3.0 \
287 windows-curses==2.3.0 \
286 --hash=sha256:170c0d941c2e0cdf864e7f0441c1bdf0709232bf4aa7ce7f54d90fc76a4c0504 \
288 --hash=sha256:170c0d941c2e0cdf864e7f0441c1bdf0709232bf4aa7ce7f54d90fc76a4c0504 \
287 --hash=sha256:4d5fb991d1b90a41c2332f02241a1f84c8a1e6bc8f6e0d26f532d0da7a9f7b51 \
289 --hash=sha256:4d5fb991d1b90a41c2332f02241a1f84c8a1e6bc8f6e0d26f532d0da7a9f7b51 \
288 --hash=sha256:7a35eda4cb120b9e1a5ae795f3bc06c55b92c9d391baba6be1903285a05f3551 \
290 --hash=sha256:7a35eda4cb120b9e1a5ae795f3bc06c55b92c9d391baba6be1903285a05f3551 \
289 --hash=sha256:935be95cfdb9213f6f5d3d5bcd489960e3a8fbc9b574e7b2e8a3a3cc46efff49 \
291 --hash=sha256:935be95cfdb9213f6f5d3d5bcd489960e3a8fbc9b574e7b2e8a3a3cc46efff49 \
290 --hash=sha256:a3a63a0597729e10f923724c2cf972a23ea677b400d2387dee1d668cf7116177 \
292 --hash=sha256:a3a63a0597729e10f923724c2cf972a23ea677b400d2387dee1d668cf7116177 \
291 --hash=sha256:c860f596d28377e47f322b7382be4d3573fd76d1292234996bb7f72e0bc0ed0d \
293 --hash=sha256:c860f596d28377e47f322b7382be4d3573fd76d1292234996bb7f72e0bc0ed0d \
292 --hash=sha256:cc5fa913780d60f4a40824d374a4f8ca45b4e205546e83a2d85147315a57457e \
294 --hash=sha256:cc5fa913780d60f4a40824d374a4f8ca45b4e205546e83a2d85147315a57457e \
293 --hash=sha256:d5cde8ec6d582aa77af791eca54f60858339fb3f391945f9cad11b1ab71062e3 \
295 --hash=sha256:d5cde8ec6d582aa77af791eca54f60858339fb3f391945f9cad11b1ab71062e3 \
294 --hash=sha256:e913dc121446d92b33fe4f5bcca26d3a34e4ad19f2af160370d57c3d1e93b4e1 \
296 --hash=sha256:e913dc121446d92b33fe4f5bcca26d3a34e4ad19f2af160370d57c3d1e93b4e1 \
295 --hash=sha256:fbc2131cec57e422c6660e6cdb3420aff5be5169b8e45bb7c471f884b0590a2b
297 --hash=sha256:fbc2131cec57e422c6660e6cdb3420aff5be5169b8e45bb7c471f884b0590a2b
296 # via -r contrib/packaging/requirements-windows.txt.in
298 # via -r contrib/packaging/requirements-windows.txt.in
297 wrapt==1.12.1 \
299 wrapt==1.12.1 \
298 --hash=sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7
300 --hash=sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7
299 # via vcrpy
301 # via vcrpy
300 yarl==1.6.3 \
302 yarl==1.6.3 \
301 --hash=sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e \
303 --hash=sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e \
302 --hash=sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434 \
304 --hash=sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434 \
303 --hash=sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366 \
305 --hash=sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366 \
304 --hash=sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3 \
306 --hash=sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3 \
305 --hash=sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec \
307 --hash=sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec \
306 --hash=sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959 \
308 --hash=sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959 \
307 --hash=sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e \
309 --hash=sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e \
308 --hash=sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c \
310 --hash=sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c \
309 --hash=sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6 \
311 --hash=sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6 \
310 --hash=sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a \
312 --hash=sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a \
311 --hash=sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6 \
313 --hash=sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6 \
312 --hash=sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424 \
314 --hash=sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424 \
313 --hash=sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e \
315 --hash=sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e \
314 --hash=sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f \
316 --hash=sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f \
315 --hash=sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50 \
317 --hash=sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50 \
316 --hash=sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2 \
318 --hash=sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2 \
317 --hash=sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc \
319 --hash=sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc \
318 --hash=sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4 \
320 --hash=sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4 \
319 --hash=sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970 \
321 --hash=sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970 \
320 --hash=sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10 \
322 --hash=sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10 \
321 --hash=sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0 \
323 --hash=sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0 \
322 --hash=sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406 \
324 --hash=sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406 \
323 --hash=sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896 \
325 --hash=sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896 \
324 --hash=sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643 \
326 --hash=sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643 \
325 --hash=sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721 \
327 --hash=sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721 \
326 --hash=sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478 \
328 --hash=sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478 \
327 --hash=sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724 \
329 --hash=sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724 \
328 --hash=sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e \
330 --hash=sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e \
329 --hash=sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8 \
331 --hash=sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8 \
330 --hash=sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96 \
332 --hash=sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96 \
331 --hash=sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25 \
333 --hash=sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25 \
332 --hash=sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76 \
334 --hash=sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76 \
333 --hash=sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2 \
335 --hash=sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2 \
334 --hash=sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2 \
336 --hash=sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2 \
335 --hash=sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c \
337 --hash=sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c \
336 --hash=sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a \
338 --hash=sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a \
337 --hash=sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71
339 --hash=sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71
338 # via vcrpy
340 # via vcrpy
339 zipp==3.4.0 \
341 zipp==3.4.0 \
340 --hash=sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108 \
342 --hash=sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108 \
341 --hash=sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb
343 --hash=sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb
342 # via importlib-metadata
344 # via importlib-metadata
@@ -1,17 +1,23 b''
1 # Declare Windows-specific requirements for generating
2 # the compiled (frozen) set of requirements in
3 # ./requirements-windows-py3.txt.
4 # If run on Windows, it may be necessary to run dos2unix
5 # on the output file to replace any CRLF newlines with LF.
6
1 docutils
7 docutils
2 dulwich
8 dulwich
3
9
4 # Needed by the release note tooling
10 # Needed by the release note tooling
5 fuzzywuzzy
11 fuzzywuzzy
6
12
7 keyring
13 keyring
8 pygit2
14 pygit2
9 pygments
15 pygments
10
16
11 # Needed by the phabricator tests
17 # Needed by the phabricator tests
12 pytest-vcr
18 pytest-vcr
13
19
14 # Need to list explicitly so dependency gets pulled in when
20 # Need to list explicitly so dependency gets pulled in when
15 # not running on Windows.
21 # not running on Windows.
16 pywin32-ctypes
22 pywin32-ctypes
17 windows-curses
23 windows-curses
@@ -1,49 +1,68 b''
1 #
1 #
2 # This file is autogenerated by pip-compile with python 3.7
2 # This file is autogenerated by pip-compile with python 3.7
3 # To update, run:
3 # To update, run:
4 #
4 #
5 # pip-compile --generate-hashes --output-file=contrib/packaging/requirements.txt contrib/packaging/requirements.txt.in
5 # pip-compile --generate-hashes --no-reuse-hashes --output-file=contrib/packaging/requirements.txt contrib/packaging/requirements.txt.in
6 #
6 #
7 docutils==0.16 \
7 docutils==0.16 \
8 --hash=sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af \
8 --hash=sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af \
9 --hash=sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc
9 --hash=sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc
10 # via -r contrib/packaging/requirements.txt.in
10 # via -r contrib/packaging/requirements.txt.in
11 jinja2==2.11.2 \
11 jinja2==2.11.2 \
12 --hash=sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0 \
12 --hash=sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0 \
13 --hash=sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035
13 --hash=sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035
14 # via -r contrib/packaging/requirements.txt.in
14 # via -r contrib/packaging/requirements.txt.in
15 markupsafe==1.1.1 \
15 markupsafe==1.1.1 \
16 --hash=sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473 \
16 --hash=sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473 \
17 --hash=sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161 \
17 --hash=sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161 \
18 --hash=sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235 \
18 --hash=sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235 \
19 --hash=sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5 \
19 --hash=sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5 \
20 --hash=sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42 \
20 --hash=sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42 \
21 --hash=sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f \
22 --hash=sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39 \
21 --hash=sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff \
23 --hash=sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff \
22 --hash=sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b \
24 --hash=sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b \
25 --hash=sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014 \
26 --hash=sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f \
23 --hash=sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1 \
27 --hash=sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1 \
24 --hash=sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e \
28 --hash=sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e \
25 --hash=sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183 \
29 --hash=sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183 \
26 --hash=sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66 \
30 --hash=sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66 \
27 --hash=sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b \
31 --hash=sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b \
28 --hash=sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1 \
32 --hash=sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1 \
29 --hash=sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15 \
33 --hash=sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15 \
30 --hash=sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1 \
34 --hash=sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1 \
35 --hash=sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85 \
36 --hash=sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1 \
31 --hash=sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e \
37 --hash=sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e \
32 --hash=sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b \
38 --hash=sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b \
33 --hash=sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905 \
39 --hash=sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905 \
40 --hash=sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850 \
41 --hash=sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0 \
34 --hash=sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735 \
42 --hash=sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735 \
35 --hash=sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d \
43 --hash=sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d \
44 --hash=sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb \
36 --hash=sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e \
45 --hash=sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e \
37 --hash=sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d \
46 --hash=sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d \
38 --hash=sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c \
47 --hash=sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c \
48 --hash=sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1 \
49 --hash=sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2 \
39 --hash=sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21 \
50 --hash=sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21 \
40 --hash=sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2 \
51 --hash=sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2 \
41 --hash=sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5 \
52 --hash=sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5 \
53 --hash=sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7 \
42 --hash=sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b \
54 --hash=sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b \
55 --hash=sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8 \
43 --hash=sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6 \
56 --hash=sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6 \
57 --hash=sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193 \
44 --hash=sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f \
58 --hash=sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f \
59 --hash=sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b \
45 --hash=sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f \
60 --hash=sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f \
46 --hash=sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2 \
61 --hash=sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2 \
62 --hash=sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5 \
63 --hash=sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c \
64 --hash=sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032 \
47 --hash=sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7 \
65 --hash=sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7 \
48 --hash=sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be
66 --hash=sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be \
67 --hash=sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621
49 # via jinja2
68 # via jinja2
@@ -1,2 +1,5 b''
1 # Declare requirements for generating the compiled (frozen)
2 # set of requirements in ./requirements.txt.
3
1 docutils
4 docutils
2 jinja2
5 jinja2
@@ -1,7983 +1,7985 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 nullrev,
16 nullrev,
17 short,
17 short,
18 wdirrev,
18 wdirrev,
19 )
19 )
20 from .pycompat import open
20 from .pycompat import open
21 from . import (
21 from . import (
22 archival,
22 archival,
23 bookmarks,
23 bookmarks,
24 bundle2,
24 bundle2,
25 bundlecaches,
25 bundlecaches,
26 changegroup,
26 changegroup,
27 cmdutil,
27 cmdutil,
28 copies,
28 copies,
29 debugcommands as debugcommandsmod,
29 debugcommands as debugcommandsmod,
30 destutil,
30 destutil,
31 dirstateguard,
31 dirstateguard,
32 discovery,
32 discovery,
33 encoding,
33 encoding,
34 error,
34 error,
35 exchange,
35 exchange,
36 extensions,
36 extensions,
37 filemerge,
37 filemerge,
38 formatter,
38 formatter,
39 graphmod,
39 graphmod,
40 grep as grepmod,
40 grep as grepmod,
41 hbisect,
41 hbisect,
42 help,
42 help,
43 hg,
43 hg,
44 logcmdutil,
44 logcmdutil,
45 merge as mergemod,
45 merge as mergemod,
46 mergestate as mergestatemod,
46 mergestate as mergestatemod,
47 narrowspec,
47 narrowspec,
48 obsolete,
48 obsolete,
49 obsutil,
49 obsutil,
50 patch,
50 patch,
51 phases,
51 phases,
52 pycompat,
52 pycompat,
53 rcutil,
53 rcutil,
54 registrar,
54 registrar,
55 requirements,
55 requirements,
56 revsetlang,
56 revsetlang,
57 rewriteutil,
57 rewriteutil,
58 scmutil,
58 scmutil,
59 server,
59 server,
60 shelve as shelvemod,
60 shelve as shelvemod,
61 state as statemod,
61 state as statemod,
62 streamclone,
62 streamclone,
63 tags as tagsmod,
63 tags as tagsmod,
64 ui as uimod,
64 ui as uimod,
65 util,
65 util,
66 verify as verifymod,
66 verify as verifymod,
67 vfs as vfsmod,
67 vfs as vfsmod,
68 wireprotoserver,
68 wireprotoserver,
69 )
69 )
70 from .utils import (
70 from .utils import (
71 dateutil,
71 dateutil,
72 stringutil,
72 stringutil,
73 urlutil,
73 urlutil,
74 )
74 )
75
75
76 table = {}
76 table = {}
77 table.update(debugcommandsmod.command._table)
77 table.update(debugcommandsmod.command._table)
78
78
79 command = registrar.command(table)
79 command = registrar.command(table)
80 INTENT_READONLY = registrar.INTENT_READONLY
80 INTENT_READONLY = registrar.INTENT_READONLY
81
81
82 # common command options
82 # common command options
83
83
84 globalopts = [
84 globalopts = [
85 (
85 (
86 b'R',
86 b'R',
87 b'repository',
87 b'repository',
88 b'',
88 b'',
89 _(b'repository root directory or name of overlay bundle file'),
89 _(b'repository root directory or name of overlay bundle file'),
90 _(b'REPO'),
90 _(b'REPO'),
91 ),
91 ),
92 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
92 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
93 (
93 (
94 b'y',
94 b'y',
95 b'noninteractive',
95 b'noninteractive',
96 None,
96 None,
97 _(
97 _(
98 b'do not prompt, automatically pick the first choice for all prompts'
98 b'do not prompt, automatically pick the first choice for all prompts'
99 ),
99 ),
100 ),
100 ),
101 (b'q', b'quiet', None, _(b'suppress output')),
101 (b'q', b'quiet', None, _(b'suppress output')),
102 (b'v', b'verbose', None, _(b'enable additional output')),
102 (b'v', b'verbose', None, _(b'enable additional output')),
103 (
103 (
104 b'',
104 b'',
105 b'color',
105 b'color',
106 b'',
106 b'',
107 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
107 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
108 # and should not be translated
108 # and should not be translated
109 _(b"when to colorize (boolean, always, auto, never, or debug)"),
109 _(b"when to colorize (boolean, always, auto, never, or debug)"),
110 _(b'TYPE'),
110 _(b'TYPE'),
111 ),
111 ),
112 (
112 (
113 b'',
113 b'',
114 b'config',
114 b'config',
115 [],
115 [],
116 _(b'set/override config option (use \'section.name=value\')'),
116 _(b'set/override config option (use \'section.name=value\')'),
117 _(b'CONFIG'),
117 _(b'CONFIG'),
118 ),
118 ),
119 (b'', b'debug', None, _(b'enable debugging output')),
119 (b'', b'debug', None, _(b'enable debugging output')),
120 (b'', b'debugger', None, _(b'start debugger')),
120 (b'', b'debugger', None, _(b'start debugger')),
121 (
121 (
122 b'',
122 b'',
123 b'encoding',
123 b'encoding',
124 encoding.encoding,
124 encoding.encoding,
125 _(b'set the charset encoding'),
125 _(b'set the charset encoding'),
126 _(b'ENCODE'),
126 _(b'ENCODE'),
127 ),
127 ),
128 (
128 (
129 b'',
129 b'',
130 b'encodingmode',
130 b'encodingmode',
131 encoding.encodingmode,
131 encoding.encodingmode,
132 _(b'set the charset encoding mode'),
132 _(b'set the charset encoding mode'),
133 _(b'MODE'),
133 _(b'MODE'),
134 ),
134 ),
135 (b'', b'traceback', None, _(b'always print a traceback on exception')),
135 (b'', b'traceback', None, _(b'always print a traceback on exception')),
136 (b'', b'time', None, _(b'time how long the command takes')),
136 (b'', b'time', None, _(b'time how long the command takes')),
137 (b'', b'profile', None, _(b'print command execution profile')),
137 (b'', b'profile', None, _(b'print command execution profile')),
138 (b'', b'version', None, _(b'output version information and exit')),
138 (b'', b'version', None, _(b'output version information and exit')),
139 (b'h', b'help', None, _(b'display help and exit')),
139 (b'h', b'help', None, _(b'display help and exit')),
140 (b'', b'hidden', False, _(b'consider hidden changesets')),
140 (b'', b'hidden', False, _(b'consider hidden changesets')),
141 (
141 (
142 b'',
142 b'',
143 b'pager',
143 b'pager',
144 b'auto',
144 b'auto',
145 _(b"when to paginate (boolean, always, auto, or never)"),
145 _(b"when to paginate (boolean, always, auto, or never)"),
146 _(b'TYPE'),
146 _(b'TYPE'),
147 ),
147 ),
148 ]
148 ]
149
149
150 dryrunopts = cmdutil.dryrunopts
150 dryrunopts = cmdutil.dryrunopts
151 remoteopts = cmdutil.remoteopts
151 remoteopts = cmdutil.remoteopts
152 walkopts = cmdutil.walkopts
152 walkopts = cmdutil.walkopts
153 commitopts = cmdutil.commitopts
153 commitopts = cmdutil.commitopts
154 commitopts2 = cmdutil.commitopts2
154 commitopts2 = cmdutil.commitopts2
155 commitopts3 = cmdutil.commitopts3
155 commitopts3 = cmdutil.commitopts3
156 formatteropts = cmdutil.formatteropts
156 formatteropts = cmdutil.formatteropts
157 templateopts = cmdutil.templateopts
157 templateopts = cmdutil.templateopts
158 logopts = cmdutil.logopts
158 logopts = cmdutil.logopts
159 diffopts = cmdutil.diffopts
159 diffopts = cmdutil.diffopts
160 diffwsopts = cmdutil.diffwsopts
160 diffwsopts = cmdutil.diffwsopts
161 diffopts2 = cmdutil.diffopts2
161 diffopts2 = cmdutil.diffopts2
162 mergetoolopts = cmdutil.mergetoolopts
162 mergetoolopts = cmdutil.mergetoolopts
163 similarityopts = cmdutil.similarityopts
163 similarityopts = cmdutil.similarityopts
164 subrepoopts = cmdutil.subrepoopts
164 subrepoopts = cmdutil.subrepoopts
165 debugrevlogopts = cmdutil.debugrevlogopts
165 debugrevlogopts = cmdutil.debugrevlogopts
166
166
167 # Commands start here, listed alphabetically
167 # Commands start here, listed alphabetically
168
168
169
169
170 @command(
170 @command(
171 b'abort',
171 b'abort',
172 dryrunopts,
172 dryrunopts,
173 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
173 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
174 helpbasic=True,
174 helpbasic=True,
175 )
175 )
176 def abort(ui, repo, **opts):
176 def abort(ui, repo, **opts):
177 """abort an unfinished operation (EXPERIMENTAL)
177 """abort an unfinished operation (EXPERIMENTAL)
178
178
179 Aborts a multistep operation like graft, histedit, rebase, merge,
179 Aborts a multistep operation like graft, histedit, rebase, merge,
180 and unshelve if they are in an unfinished state.
180 and unshelve if they are in an unfinished state.
181
181
182 use --dry-run/-n to dry run the command.
182 use --dry-run/-n to dry run the command.
183 """
183 """
184 dryrun = opts.get('dry_run')
184 dryrun = opts.get('dry_run')
185 abortstate = cmdutil.getunfinishedstate(repo)
185 abortstate = cmdutil.getunfinishedstate(repo)
186 if not abortstate:
186 if not abortstate:
187 raise error.StateError(_(b'no operation in progress'))
187 raise error.StateError(_(b'no operation in progress'))
188 if not abortstate.abortfunc:
188 if not abortstate.abortfunc:
189 raise error.InputError(
189 raise error.InputError(
190 (
190 (
191 _(b"%s in progress but does not support 'hg abort'")
191 _(b"%s in progress but does not support 'hg abort'")
192 % (abortstate._opname)
192 % (abortstate._opname)
193 ),
193 ),
194 hint=abortstate.hint(),
194 hint=abortstate.hint(),
195 )
195 )
196 if dryrun:
196 if dryrun:
197 ui.status(
197 ui.status(
198 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
198 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
199 )
199 )
200 return
200 return
201 return abortstate.abortfunc(ui, repo)
201 return abortstate.abortfunc(ui, repo)
202
202
203
203
204 @command(
204 @command(
205 b'add',
205 b'add',
206 walkopts + subrepoopts + dryrunopts,
206 walkopts + subrepoopts + dryrunopts,
207 _(b'[OPTION]... [FILE]...'),
207 _(b'[OPTION]... [FILE]...'),
208 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
208 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
209 helpbasic=True,
209 helpbasic=True,
210 inferrepo=True,
210 inferrepo=True,
211 )
211 )
212 def add(ui, repo, *pats, **opts):
212 def add(ui, repo, *pats, **opts):
213 """add the specified files on the next commit
213 """add the specified files on the next commit
214
214
215 Schedule files to be version controlled and added to the
215 Schedule files to be version controlled and added to the
216 repository.
216 repository.
217
217
218 The files will be added to the repository at the next commit. To
218 The files will be added to the repository at the next commit. To
219 undo an add before that, see :hg:`forget`.
219 undo an add before that, see :hg:`forget`.
220
220
221 If no names are given, add all files to the repository (except
221 If no names are given, add all files to the repository (except
222 files matching ``.hgignore``).
222 files matching ``.hgignore``).
223
223
224 .. container:: verbose
224 .. container:: verbose
225
225
226 Examples:
226 Examples:
227
227
228 - New (unknown) files are added
228 - New (unknown) files are added
229 automatically by :hg:`add`::
229 automatically by :hg:`add`::
230
230
231 $ ls
231 $ ls
232 foo.c
232 foo.c
233 $ hg status
233 $ hg status
234 ? foo.c
234 ? foo.c
235 $ hg add
235 $ hg add
236 adding foo.c
236 adding foo.c
237 $ hg status
237 $ hg status
238 A foo.c
238 A foo.c
239
239
240 - Specific files to be added can be specified::
240 - Specific files to be added can be specified::
241
241
242 $ ls
242 $ ls
243 bar.c foo.c
243 bar.c foo.c
244 $ hg status
244 $ hg status
245 ? bar.c
245 ? bar.c
246 ? foo.c
246 ? foo.c
247 $ hg add bar.c
247 $ hg add bar.c
248 $ hg status
248 $ hg status
249 A bar.c
249 A bar.c
250 ? foo.c
250 ? foo.c
251
251
252 Returns 0 if all files are successfully added.
252 Returns 0 if all files are successfully added.
253 """
253 """
254
254
255 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
255 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
256 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
256 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
257 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
257 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
258 return rejected and 1 or 0
258 return rejected and 1 or 0
259
259
260
260
261 @command(
261 @command(
262 b'addremove',
262 b'addremove',
263 similarityopts + subrepoopts + walkopts + dryrunopts,
263 similarityopts + subrepoopts + walkopts + dryrunopts,
264 _(b'[OPTION]... [FILE]...'),
264 _(b'[OPTION]... [FILE]...'),
265 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
265 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
266 inferrepo=True,
266 inferrepo=True,
267 )
267 )
268 def addremove(ui, repo, *pats, **opts):
268 def addremove(ui, repo, *pats, **opts):
269 """add all new files, delete all missing files
269 """add all new files, delete all missing files
270
270
271 Add all new files and remove all missing files from the
271 Add all new files and remove all missing files from the
272 repository.
272 repository.
273
273
274 Unless names are given, new files are ignored if they match any of
274 Unless names are given, new files are ignored if they match any of
275 the patterns in ``.hgignore``. As with add, these changes take
275 the patterns in ``.hgignore``. As with add, these changes take
276 effect at the next commit.
276 effect at the next commit.
277
277
278 Use the -s/--similarity option to detect renamed files. This
278 Use the -s/--similarity option to detect renamed files. This
279 option takes a percentage between 0 (disabled) and 100 (files must
279 option takes a percentage between 0 (disabled) and 100 (files must
280 be identical) as its parameter. With a parameter greater than 0,
280 be identical) as its parameter. With a parameter greater than 0,
281 this compares every removed file with every added file and records
281 this compares every removed file with every added file and records
282 those similar enough as renames. Detecting renamed files this way
282 those similar enough as renames. Detecting renamed files this way
283 can be expensive. After using this option, :hg:`status -C` can be
283 can be expensive. After using this option, :hg:`status -C` can be
284 used to check which files were identified as moved or renamed. If
284 used to check which files were identified as moved or renamed. If
285 not specified, -s/--similarity defaults to 100 and only renames of
285 not specified, -s/--similarity defaults to 100 and only renames of
286 identical files are detected.
286 identical files are detected.
287
287
288 .. container:: verbose
288 .. container:: verbose
289
289
290 Examples:
290 Examples:
291
291
292 - A number of files (bar.c and foo.c) are new,
292 - A number of files (bar.c and foo.c) are new,
293 while foobar.c has been removed (without using :hg:`remove`)
293 while foobar.c has been removed (without using :hg:`remove`)
294 from the repository::
294 from the repository::
295
295
296 $ ls
296 $ ls
297 bar.c foo.c
297 bar.c foo.c
298 $ hg status
298 $ hg status
299 ! foobar.c
299 ! foobar.c
300 ? bar.c
300 ? bar.c
301 ? foo.c
301 ? foo.c
302 $ hg addremove
302 $ hg addremove
303 adding bar.c
303 adding bar.c
304 adding foo.c
304 adding foo.c
305 removing foobar.c
305 removing foobar.c
306 $ hg status
306 $ hg status
307 A bar.c
307 A bar.c
308 A foo.c
308 A foo.c
309 R foobar.c
309 R foobar.c
310
310
311 - A file foobar.c was moved to foo.c without using :hg:`rename`.
311 - A file foobar.c was moved to foo.c without using :hg:`rename`.
312 Afterwards, it was edited slightly::
312 Afterwards, it was edited slightly::
313
313
314 $ ls
314 $ ls
315 foo.c
315 foo.c
316 $ hg status
316 $ hg status
317 ! foobar.c
317 ! foobar.c
318 ? foo.c
318 ? foo.c
319 $ hg addremove --similarity 90
319 $ hg addremove --similarity 90
320 removing foobar.c
320 removing foobar.c
321 adding foo.c
321 adding foo.c
322 recording removal of foobar.c as rename to foo.c (94% similar)
322 recording removal of foobar.c as rename to foo.c (94% similar)
323 $ hg status -C
323 $ hg status -C
324 A foo.c
324 A foo.c
325 foobar.c
325 foobar.c
326 R foobar.c
326 R foobar.c
327
327
328 Returns 0 if all files are successfully added.
328 Returns 0 if all files are successfully added.
329 """
329 """
330 opts = pycompat.byteskwargs(opts)
330 opts = pycompat.byteskwargs(opts)
331 if not opts.get(b'similarity'):
331 if not opts.get(b'similarity'):
332 opts[b'similarity'] = b'100'
332 opts[b'similarity'] = b'100'
333 matcher = scmutil.match(repo[None], pats, opts)
333 matcher = scmutil.match(repo[None], pats, opts)
334 relative = scmutil.anypats(pats, opts)
334 relative = scmutil.anypats(pats, opts)
335 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
335 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
336 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
336 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
337
337
338
338
339 @command(
339 @command(
340 b'annotate|blame',
340 b'annotate|blame',
341 [
341 [
342 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
342 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
343 (
343 (
344 b'',
344 b'',
345 b'follow',
345 b'follow',
346 None,
346 None,
347 _(b'follow copies/renames and list the filename (DEPRECATED)'),
347 _(b'follow copies/renames and list the filename (DEPRECATED)'),
348 ),
348 ),
349 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
349 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
350 (b'a', b'text', None, _(b'treat all files as text')),
350 (b'a', b'text', None, _(b'treat all files as text')),
351 (b'u', b'user', None, _(b'list the author (long with -v)')),
351 (b'u', b'user', None, _(b'list the author (long with -v)')),
352 (b'f', b'file', None, _(b'list the filename')),
352 (b'f', b'file', None, _(b'list the filename')),
353 (b'd', b'date', None, _(b'list the date (short with -q)')),
353 (b'd', b'date', None, _(b'list the date (short with -q)')),
354 (b'n', b'number', None, _(b'list the revision number (default)')),
354 (b'n', b'number', None, _(b'list the revision number (default)')),
355 (b'c', b'changeset', None, _(b'list the changeset')),
355 (b'c', b'changeset', None, _(b'list the changeset')),
356 (
356 (
357 b'l',
357 b'l',
358 b'line-number',
358 b'line-number',
359 None,
359 None,
360 _(b'show line number at the first appearance'),
360 _(b'show line number at the first appearance'),
361 ),
361 ),
362 (
362 (
363 b'',
363 b'',
364 b'skip',
364 b'skip',
365 [],
365 [],
366 _(b'revset to not display (EXPERIMENTAL)'),
366 _(b'revset to not display (EXPERIMENTAL)'),
367 _(b'REV'),
367 _(b'REV'),
368 ),
368 ),
369 ]
369 ]
370 + diffwsopts
370 + diffwsopts
371 + walkopts
371 + walkopts
372 + formatteropts,
372 + formatteropts,
373 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
373 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
374 helpcategory=command.CATEGORY_FILE_CONTENTS,
374 helpcategory=command.CATEGORY_FILE_CONTENTS,
375 helpbasic=True,
375 helpbasic=True,
376 inferrepo=True,
376 inferrepo=True,
377 )
377 )
378 def annotate(ui, repo, *pats, **opts):
378 def annotate(ui, repo, *pats, **opts):
379 """show changeset information by line for each file
379 """show changeset information by line for each file
380
380
381 List changes in files, showing the revision id responsible for
381 List changes in files, showing the revision id responsible for
382 each line.
382 each line.
383
383
384 This command is useful for discovering when a change was made and
384 This command is useful for discovering when a change was made and
385 by whom.
385 by whom.
386
386
387 If you include --file, --user, or --date, the revision number is
387 If you include --file, --user, or --date, the revision number is
388 suppressed unless you also include --number.
388 suppressed unless you also include --number.
389
389
390 Without the -a/--text option, annotate will avoid processing files
390 Without the -a/--text option, annotate will avoid processing files
391 it detects as binary. With -a, annotate will annotate the file
391 it detects as binary. With -a, annotate will annotate the file
392 anyway, although the results will probably be neither useful
392 anyway, although the results will probably be neither useful
393 nor desirable.
393 nor desirable.
394
394
395 .. container:: verbose
395 .. container:: verbose
396
396
397 Template:
397 Template:
398
398
399 The following keywords are supported in addition to the common template
399 The following keywords are supported in addition to the common template
400 keywords and functions. See also :hg:`help templates`.
400 keywords and functions. See also :hg:`help templates`.
401
401
402 :lines: List of lines with annotation data.
402 :lines: List of lines with annotation data.
403 :path: String. Repository-absolute path of the specified file.
403 :path: String. Repository-absolute path of the specified file.
404
404
405 And each entry of ``{lines}`` provides the following sub-keywords in
405 And each entry of ``{lines}`` provides the following sub-keywords in
406 addition to ``{date}``, ``{node}``, ``{rev}``, ``{user}``, etc.
406 addition to ``{date}``, ``{node}``, ``{rev}``, ``{user}``, etc.
407
407
408 :line: String. Line content.
408 :line: String. Line content.
409 :lineno: Integer. Line number at that revision.
409 :lineno: Integer. Line number at that revision.
410 :path: String. Repository-absolute path of the file at that revision.
410 :path: String. Repository-absolute path of the file at that revision.
411
411
412 See :hg:`help templates.operators` for the list expansion syntax.
412 See :hg:`help templates.operators` for the list expansion syntax.
413
413
414 Returns 0 on success.
414 Returns 0 on success.
415 """
415 """
416 opts = pycompat.byteskwargs(opts)
416 opts = pycompat.byteskwargs(opts)
417 if not pats:
417 if not pats:
418 raise error.InputError(
418 raise error.InputError(
419 _(b'at least one filename or pattern is required')
419 _(b'at least one filename or pattern is required')
420 )
420 )
421
421
422 if opts.get(b'follow'):
422 if opts.get(b'follow'):
423 # --follow is deprecated and now just an alias for -f/--file
423 # --follow is deprecated and now just an alias for -f/--file
424 # to mimic the behavior of Mercurial before version 1.5
424 # to mimic the behavior of Mercurial before version 1.5
425 opts[b'file'] = True
425 opts[b'file'] = True
426
426
427 if (
427 if (
428 not opts.get(b'user')
428 not opts.get(b'user')
429 and not opts.get(b'changeset')
429 and not opts.get(b'changeset')
430 and not opts.get(b'date')
430 and not opts.get(b'date')
431 and not opts.get(b'file')
431 and not opts.get(b'file')
432 ):
432 ):
433 opts[b'number'] = True
433 opts[b'number'] = True
434
434
435 linenumber = opts.get(b'line_number') is not None
435 linenumber = opts.get(b'line_number') is not None
436 if (
436 if (
437 linenumber
437 linenumber
438 and (not opts.get(b'changeset'))
438 and (not opts.get(b'changeset'))
439 and (not opts.get(b'number'))
439 and (not opts.get(b'number'))
440 ):
440 ):
441 raise error.InputError(_(b'at least one of -n/-c is required for -l'))
441 raise error.InputError(_(b'at least one of -n/-c is required for -l'))
442
442
443 rev = opts.get(b'rev')
443 rev = opts.get(b'rev')
444 if rev:
444 if rev:
445 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
445 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
446 ctx = logcmdutil.revsingle(repo, rev)
446 ctx = logcmdutil.revsingle(repo, rev)
447
447
448 ui.pager(b'annotate')
448 ui.pager(b'annotate')
449 rootfm = ui.formatter(b'annotate', opts)
449 rootfm = ui.formatter(b'annotate', opts)
450 if ui.debugflag:
450 if ui.debugflag:
451 shorthex = pycompat.identity
451 shorthex = pycompat.identity
452 else:
452 else:
453
453
454 def shorthex(h):
454 def shorthex(h):
455 return h[:12]
455 return h[:12]
456
456
457 if ui.quiet:
457 if ui.quiet:
458 datefunc = dateutil.shortdate
458 datefunc = dateutil.shortdate
459 else:
459 else:
460 datefunc = dateutil.datestr
460 datefunc = dateutil.datestr
461 if ctx.rev() is None:
461 if ctx.rev() is None:
462 if opts.get(b'changeset'):
462 if opts.get(b'changeset'):
463 # omit "+" suffix which is appended to node hex
463 # omit "+" suffix which is appended to node hex
464 def formatrev(rev):
464 def formatrev(rev):
465 if rev == wdirrev:
465 if rev == wdirrev:
466 return b'%d' % ctx.p1().rev()
466 return b'%d' % ctx.p1().rev()
467 else:
467 else:
468 return b'%d' % rev
468 return b'%d' % rev
469
469
470 else:
470 else:
471
471
472 def formatrev(rev):
472 def formatrev(rev):
473 if rev == wdirrev:
473 if rev == wdirrev:
474 return b'%d+' % ctx.p1().rev()
474 return b'%d+' % ctx.p1().rev()
475 else:
475 else:
476 return b'%d ' % rev
476 return b'%d ' % rev
477
477
478 def formathex(h):
478 def formathex(h):
479 if h == repo.nodeconstants.wdirhex:
479 if h == repo.nodeconstants.wdirhex:
480 return b'%s+' % shorthex(hex(ctx.p1().node()))
480 return b'%s+' % shorthex(hex(ctx.p1().node()))
481 else:
481 else:
482 return b'%s ' % shorthex(h)
482 return b'%s ' % shorthex(h)
483
483
484 else:
484 else:
485 formatrev = b'%d'.__mod__
485 formatrev = b'%d'.__mod__
486 formathex = shorthex
486 formathex = shorthex
487
487
488 opmap = [
488 opmap = [
489 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
489 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
490 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
490 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
491 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
491 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
492 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
492 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
493 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
493 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
494 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
494 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
495 ]
495 ]
496 opnamemap = {
496 opnamemap = {
497 b'rev': b'number',
497 b'rev': b'number',
498 b'node': b'changeset',
498 b'node': b'changeset',
499 b'path': b'file',
499 b'path': b'file',
500 b'lineno': b'line_number',
500 b'lineno': b'line_number',
501 }
501 }
502
502
503 if rootfm.isplain():
503 if rootfm.isplain():
504
504
505 def makefunc(get, fmt):
505 def makefunc(get, fmt):
506 return lambda x: fmt(get(x))
506 return lambda x: fmt(get(x))
507
507
508 else:
508 else:
509
509
510 def makefunc(get, fmt):
510 def makefunc(get, fmt):
511 return get
511 return get
512
512
513 datahint = rootfm.datahint()
513 datahint = rootfm.datahint()
514 funcmap = [
514 funcmap = [
515 (makefunc(get, fmt), sep)
515 (makefunc(get, fmt), sep)
516 for fn, sep, get, fmt in opmap
516 for fn, sep, get, fmt in opmap
517 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
517 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
518 ]
518 ]
519 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
519 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
520 fields = b' '.join(
520 fields = b' '.join(
521 fn
521 fn
522 for fn, sep, get, fmt in opmap
522 for fn, sep, get, fmt in opmap
523 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
523 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
524 )
524 )
525
525
526 def bad(x, y):
526 def bad(x, y):
527 raise error.InputError(b"%s: %s" % (x, y))
527 raise error.InputError(b"%s: %s" % (x, y))
528
528
529 m = scmutil.match(ctx, pats, opts, badfn=bad)
529 m = scmutil.match(ctx, pats, opts, badfn=bad)
530
530
531 follow = not opts.get(b'no_follow')
531 follow = not opts.get(b'no_follow')
532 diffopts = patch.difffeatureopts(
532 diffopts = patch.difffeatureopts(
533 ui, opts, section=b'annotate', whitespace=True
533 ui, opts, section=b'annotate', whitespace=True
534 )
534 )
535 skiprevs = opts.get(b'skip')
535 skiprevs = opts.get(b'skip')
536 if skiprevs:
536 if skiprevs:
537 skiprevs = logcmdutil.revrange(repo, skiprevs)
537 skiprevs = logcmdutil.revrange(repo, skiprevs)
538
538
539 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
539 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
540 for abs in ctx.walk(m):
540 for abs in ctx.walk(m):
541 fctx = ctx[abs]
541 fctx = ctx[abs]
542 rootfm.startitem()
542 rootfm.startitem()
543 rootfm.data(path=abs)
543 rootfm.data(path=abs)
544 if not opts.get(b'text') and fctx.isbinary():
544 if not opts.get(b'text') and fctx.isbinary():
545 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
545 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
546 continue
546 continue
547
547
548 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
548 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
549 lines = fctx.annotate(
549 lines = fctx.annotate(
550 follow=follow, skiprevs=skiprevs, diffopts=diffopts
550 follow=follow, skiprevs=skiprevs, diffopts=diffopts
551 )
551 )
552 if not lines:
552 if not lines:
553 fm.end()
553 fm.end()
554 continue
554 continue
555 formats = []
555 formats = []
556 pieces = []
556 pieces = []
557
557
558 for f, sep in funcmap:
558 for f, sep in funcmap:
559 l = [f(n) for n in lines]
559 l = [f(n) for n in lines]
560 if fm.isplain():
560 if fm.isplain():
561 sizes = [encoding.colwidth(x) for x in l]
561 sizes = [encoding.colwidth(x) for x in l]
562 ml = max(sizes)
562 ml = max(sizes)
563 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
563 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
564 else:
564 else:
565 formats.append([b'%s'] * len(l))
565 formats.append([b'%s'] * len(l))
566 pieces.append(l)
566 pieces.append(l)
567
567
568 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
568 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
569 fm.startitem()
569 fm.startitem()
570 fm.context(fctx=n.fctx)
570 fm.context(fctx=n.fctx)
571 fm.write(fields, b"".join(f), *p)
571 fm.write(fields, b"".join(f), *p)
572 if n.skip:
572 if n.skip:
573 fmt = b"* %s"
573 fmt = b"* %s"
574 else:
574 else:
575 fmt = b": %s"
575 fmt = b": %s"
576 fm.write(b'line', fmt, n.text)
576 fm.write(b'line', fmt, n.text)
577
577
578 if not lines[-1].text.endswith(b'\n'):
578 if not lines[-1].text.endswith(b'\n'):
579 fm.plain(b'\n')
579 fm.plain(b'\n')
580 fm.end()
580 fm.end()
581
581
582 rootfm.end()
582 rootfm.end()
583
583
584
584
585 @command(
585 @command(
586 b'archive',
586 b'archive',
587 [
587 [
588 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
588 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
589 (
589 (
590 b'p',
590 b'p',
591 b'prefix',
591 b'prefix',
592 b'',
592 b'',
593 _(b'directory prefix for files in archive'),
593 _(b'directory prefix for files in archive'),
594 _(b'PREFIX'),
594 _(b'PREFIX'),
595 ),
595 ),
596 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
596 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
597 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
597 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
598 ]
598 ]
599 + subrepoopts
599 + subrepoopts
600 + walkopts,
600 + walkopts,
601 _(b'[OPTION]... DEST'),
601 _(b'[OPTION]... DEST'),
602 helpcategory=command.CATEGORY_IMPORT_EXPORT,
602 helpcategory=command.CATEGORY_IMPORT_EXPORT,
603 )
603 )
604 def archive(ui, repo, dest, **opts):
604 def archive(ui, repo, dest, **opts):
605 """create an unversioned archive of a repository revision
605 """create an unversioned archive of a repository revision
606
606
607 By default, the revision used is the parent of the working
607 By default, the revision used is the parent of the working
608 directory; use -r/--rev to specify a different revision.
608 directory; use -r/--rev to specify a different revision.
609
609
610 The archive type is automatically detected based on file
610 The archive type is automatically detected based on file
611 extension (to override, use -t/--type).
611 extension (to override, use -t/--type).
612
612
613 .. container:: verbose
613 .. container:: verbose
614
614
615 Examples:
615 Examples:
616
616
617 - create a zip file containing the 1.0 release::
617 - create a zip file containing the 1.0 release::
618
618
619 hg archive -r 1.0 project-1.0.zip
619 hg archive -r 1.0 project-1.0.zip
620
620
621 - create a tarball excluding .hg files::
621 - create a tarball excluding .hg files::
622
622
623 hg archive project.tar.gz -X ".hg*"
623 hg archive project.tar.gz -X ".hg*"
624
624
625 Valid types are:
625 Valid types are:
626
626
627 :``files``: a directory full of files (default)
627 :``files``: a directory full of files (default)
628 :``tar``: tar archive, uncompressed
628 :``tar``: tar archive, uncompressed
629 :``tbz2``: tar archive, compressed using bzip2
629 :``tbz2``: tar archive, compressed using bzip2
630 :``tgz``: tar archive, compressed using gzip
630 :``tgz``: tar archive, compressed using gzip
631 :``txz``: tar archive, compressed using lzma (only in Python 3)
631 :``txz``: tar archive, compressed using lzma (only in Python 3)
632 :``uzip``: zip archive, uncompressed
632 :``uzip``: zip archive, uncompressed
633 :``zip``: zip archive, compressed using deflate
633 :``zip``: zip archive, compressed using deflate
634
634
635 The exact name of the destination archive or directory is given
635 The exact name of the destination archive or directory is given
636 using a format string; see :hg:`help export` for details.
636 using a format string; see :hg:`help export` for details.
637
637
638 Each member added to an archive file has a directory prefix
638 Each member added to an archive file has a directory prefix
639 prepended. Use -p/--prefix to specify a format string for the
639 prepended. Use -p/--prefix to specify a format string for the
640 prefix. The default is the basename of the archive, with suffixes
640 prefix. The default is the basename of the archive, with suffixes
641 removed.
641 removed.
642
642
643 Returns 0 on success.
643 Returns 0 on success.
644 """
644 """
645
645
646 opts = pycompat.byteskwargs(opts)
646 opts = pycompat.byteskwargs(opts)
647 rev = opts.get(b'rev')
647 rev = opts.get(b'rev')
648 if rev:
648 if rev:
649 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
649 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
650 ctx = logcmdutil.revsingle(repo, rev)
650 ctx = logcmdutil.revsingle(repo, rev)
651 if not ctx:
651 if not ctx:
652 raise error.InputError(
652 raise error.InputError(
653 _(b'no working directory: please specify a revision')
653 _(b'no working directory: please specify a revision')
654 )
654 )
655 node = ctx.node()
655 node = ctx.node()
656 dest = cmdutil.makefilename(ctx, dest)
656 dest = cmdutil.makefilename(ctx, dest)
657 if os.path.realpath(dest) == repo.root:
657 if os.path.realpath(dest) == repo.root:
658 raise error.InputError(_(b'repository root cannot be destination'))
658 raise error.InputError(_(b'repository root cannot be destination'))
659
659
660 kind = opts.get(b'type') or archival.guesskind(dest) or b'files'
660 kind = opts.get(b'type') or archival.guesskind(dest) or b'files'
661 prefix = opts.get(b'prefix')
661 prefix = opts.get(b'prefix')
662
662
663 if dest == b'-':
663 if dest == b'-':
664 if kind == b'files':
664 if kind == b'files':
665 raise error.InputError(_(b'cannot archive plain files to stdout'))
665 raise error.InputError(_(b'cannot archive plain files to stdout'))
666 dest = cmdutil.makefileobj(ctx, dest)
666 dest = cmdutil.makefileobj(ctx, dest)
667 if not prefix:
667 if not prefix:
668 prefix = os.path.basename(repo.root) + b'-%h'
668 prefix = os.path.basename(repo.root) + b'-%h'
669
669
670 prefix = cmdutil.makefilename(ctx, prefix)
670 prefix = cmdutil.makefilename(ctx, prefix)
671 match = scmutil.match(ctx, [], opts)
671 match = scmutil.match(ctx, [], opts)
672 archival.archive(
672 archival.archive(
673 repo,
673 repo,
674 dest,
674 dest,
675 node,
675 node,
676 kind,
676 kind,
677 not opts.get(b'no_decode'),
677 not opts.get(b'no_decode'),
678 match,
678 match,
679 prefix,
679 prefix,
680 subrepos=opts.get(b'subrepos'),
680 subrepos=opts.get(b'subrepos'),
681 )
681 )
682
682
683
683
684 @command(
684 @command(
685 b'backout',
685 b'backout',
686 [
686 [
687 (
687 (
688 b'',
688 b'',
689 b'merge',
689 b'merge',
690 None,
690 None,
691 _(b'merge with old dirstate parent after backout'),
691 _(b'merge with old dirstate parent after backout'),
692 ),
692 ),
693 (
693 (
694 b'',
694 b'',
695 b'commit',
695 b'commit',
696 None,
696 None,
697 _(b'commit if no conflicts were encountered (DEPRECATED)'),
697 _(b'commit if no conflicts were encountered (DEPRECATED)'),
698 ),
698 ),
699 (b'', b'no-commit', None, _(b'do not commit')),
699 (b'', b'no-commit', None, _(b'do not commit')),
700 (
700 (
701 b'',
701 b'',
702 b'parent',
702 b'parent',
703 b'',
703 b'',
704 _(b'parent to choose when backing out merge (DEPRECATED)'),
704 _(b'parent to choose when backing out merge (DEPRECATED)'),
705 _(b'REV'),
705 _(b'REV'),
706 ),
706 ),
707 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
707 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
708 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
708 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
709 ]
709 ]
710 + mergetoolopts
710 + mergetoolopts
711 + walkopts
711 + walkopts
712 + commitopts
712 + commitopts
713 + commitopts2,
713 + commitopts2,
714 _(b'[OPTION]... [-r] REV'),
714 _(b'[OPTION]... [-r] REV'),
715 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
715 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
716 )
716 )
717 def backout(ui, repo, node=None, rev=None, **opts):
717 def backout(ui, repo, node=None, rev=None, **opts):
718 """reverse effect of earlier changeset
718 """reverse effect of earlier changeset
719
719
720 Prepare a new changeset with the effect of REV undone in the
720 Prepare a new changeset with the effect of REV undone in the
721 current working directory. If no conflicts were encountered,
721 current working directory. If no conflicts were encountered,
722 it will be committed immediately.
722 it will be committed immediately.
723
723
724 If REV is the parent of the working directory, then this new changeset
724 If REV is the parent of the working directory, then this new changeset
725 is committed automatically (unless --no-commit is specified).
725 is committed automatically (unless --no-commit is specified).
726
726
727 .. note::
727 .. note::
728
728
729 :hg:`backout` cannot be used to fix either an unwanted or
729 :hg:`backout` cannot be used to fix either an unwanted or
730 incorrect merge.
730 incorrect merge.
731
731
732 .. container:: verbose
732 .. container:: verbose
733
733
734 Examples:
734 Examples:
735
735
736 - Reverse the effect of the parent of the working directory.
736 - Reverse the effect of the parent of the working directory.
737 This backout will be committed immediately::
737 This backout will be committed immediately::
738
738
739 hg backout -r .
739 hg backout -r .
740
740
741 - Reverse the effect of previous bad revision 23::
741 - Reverse the effect of previous bad revision 23::
742
742
743 hg backout -r 23
743 hg backout -r 23
744
744
745 - Reverse the effect of previous bad revision 23 and
745 - Reverse the effect of previous bad revision 23 and
746 leave changes uncommitted::
746 leave changes uncommitted::
747
747
748 hg backout -r 23 --no-commit
748 hg backout -r 23 --no-commit
749 hg commit -m "Backout revision 23"
749 hg commit -m "Backout revision 23"
750
750
751 By default, the pending changeset will have one parent,
751 By default, the pending changeset will have one parent,
752 maintaining a linear history. With --merge, the pending
752 maintaining a linear history. With --merge, the pending
753 changeset will instead have two parents: the old parent of the
753 changeset will instead have two parents: the old parent of the
754 working directory and a new child of REV that simply undoes REV.
754 working directory and a new child of REV that simply undoes REV.
755
755
756 Before version 1.7, the behavior without --merge was equivalent
756 Before version 1.7, the behavior without --merge was equivalent
757 to specifying --merge followed by :hg:`update --clean .` to
757 to specifying --merge followed by :hg:`update --clean .` to
758 cancel the merge and leave the child of REV as a head to be
758 cancel the merge and leave the child of REV as a head to be
759 merged separately.
759 merged separately.
760
760
761 See :hg:`help dates` for a list of formats valid for -d/--date.
761 See :hg:`help dates` for a list of formats valid for -d/--date.
762
762
763 See :hg:`help revert` for a way to restore files to the state
763 See :hg:`help revert` for a way to restore files to the state
764 of another revision.
764 of another revision.
765
765
766 Returns 0 on success, 1 if nothing to backout or there are unresolved
766 Returns 0 on success, 1 if nothing to backout or there are unresolved
767 files.
767 files.
768 """
768 """
769 with repo.wlock(), repo.lock():
769 with repo.wlock(), repo.lock():
770 return _dobackout(ui, repo, node, rev, **opts)
770 return _dobackout(ui, repo, node, rev, **opts)
771
771
772
772
773 def _dobackout(ui, repo, node=None, rev=None, **opts):
773 def _dobackout(ui, repo, node=None, rev=None, **opts):
774 cmdutil.check_incompatible_arguments(opts, 'no_commit', ['commit', 'merge'])
774 cmdutil.check_incompatible_arguments(opts, 'no_commit', ['commit', 'merge'])
775 opts = pycompat.byteskwargs(opts)
775 opts = pycompat.byteskwargs(opts)
776
776
777 if rev and node:
777 if rev and node:
778 raise error.InputError(_(b"please specify just one revision"))
778 raise error.InputError(_(b"please specify just one revision"))
779
779
780 if not rev:
780 if not rev:
781 rev = node
781 rev = node
782
782
783 if not rev:
783 if not rev:
784 raise error.InputError(_(b"please specify a revision to backout"))
784 raise error.InputError(_(b"please specify a revision to backout"))
785
785
786 date = opts.get(b'date')
786 date = opts.get(b'date')
787 if date:
787 if date:
788 opts[b'date'] = dateutil.parsedate(date)
788 opts[b'date'] = dateutil.parsedate(date)
789
789
790 cmdutil.checkunfinished(repo)
790 cmdutil.checkunfinished(repo)
791 cmdutil.bailifchanged(repo)
791 cmdutil.bailifchanged(repo)
792 ctx = logcmdutil.revsingle(repo, rev)
792 ctx = logcmdutil.revsingle(repo, rev)
793 node = ctx.node()
793 node = ctx.node()
794
794
795 op1, op2 = repo.dirstate.parents()
795 op1, op2 = repo.dirstate.parents()
796 if not repo.changelog.isancestor(node, op1):
796 if not repo.changelog.isancestor(node, op1):
797 raise error.InputError(
797 raise error.InputError(
798 _(b'cannot backout change that is not an ancestor')
798 _(b'cannot backout change that is not an ancestor')
799 )
799 )
800
800
801 p1, p2 = repo.changelog.parents(node)
801 p1, p2 = repo.changelog.parents(node)
802 if p1 == repo.nullid:
802 if p1 == repo.nullid:
803 raise error.InputError(_(b'cannot backout a change with no parents'))
803 raise error.InputError(_(b'cannot backout a change with no parents'))
804 if p2 != repo.nullid:
804 if p2 != repo.nullid:
805 if not opts.get(b'parent'):
805 if not opts.get(b'parent'):
806 raise error.InputError(_(b'cannot backout a merge changeset'))
806 raise error.InputError(_(b'cannot backout a merge changeset'))
807 p = repo.lookup(opts[b'parent'])
807 p = repo.lookup(opts[b'parent'])
808 if p not in (p1, p2):
808 if p not in (p1, p2):
809 raise error.InputError(
809 raise error.InputError(
810 _(b'%s is not a parent of %s') % (short(p), short(node))
810 _(b'%s is not a parent of %s') % (short(p), short(node))
811 )
811 )
812 parent = p
812 parent = p
813 else:
813 else:
814 if opts.get(b'parent'):
814 if opts.get(b'parent'):
815 raise error.InputError(
815 raise error.InputError(
816 _(b'cannot use --parent on non-merge changeset')
816 _(b'cannot use --parent on non-merge changeset')
817 )
817 )
818 parent = p1
818 parent = p1
819
819
820 # the backout should appear on the same branch
820 # the backout should appear on the same branch
821 branch = repo.dirstate.branch()
821 branch = repo.dirstate.branch()
822 bheads = repo.branchheads(branch)
822 bheads = repo.branchheads(branch)
823 rctx = scmutil.revsingle(repo, hex(parent))
823 rctx = scmutil.revsingle(repo, hex(parent))
824 if not opts.get(b'merge') and op1 != node:
824 if not opts.get(b'merge') and op1 != node:
825 with dirstateguard.dirstateguard(repo, b'backout'):
825 with dirstateguard.dirstateguard(repo, b'backout'):
826 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
826 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
827 with ui.configoverride(overrides, b'backout'):
827 with ui.configoverride(overrides, b'backout'):
828 stats = mergemod.back_out(ctx, parent=repo[parent])
828 stats = mergemod.back_out(ctx, parent=repo[parent])
829 repo.setparents(op1, op2)
829 repo.setparents(op1, op2)
830 hg._showstats(repo, stats)
830 hg._showstats(repo, stats)
831 if stats.unresolvedcount:
831 if stats.unresolvedcount:
832 repo.ui.status(
832 repo.ui.status(
833 _(b"use 'hg resolve' to retry unresolved file merges\n")
833 _(b"use 'hg resolve' to retry unresolved file merges\n")
834 )
834 )
835 return 1
835 return 1
836 else:
836 else:
837 hg.clean(repo, node, show_stats=False)
837 hg.clean(repo, node, show_stats=False)
838 repo.dirstate.setbranch(branch)
838 repo.dirstate.setbranch(branch)
839 cmdutil.revert(ui, repo, rctx)
839 cmdutil.revert(ui, repo, rctx)
840
840
841 if opts.get(b'no_commit'):
841 if opts.get(b'no_commit'):
842 msg = _(b"changeset %s backed out, don't forget to commit.\n")
842 msg = _(b"changeset %s backed out, don't forget to commit.\n")
843 ui.status(msg % short(node))
843 ui.status(msg % short(node))
844 return 0
844 return 0
845
845
846 def commitfunc(ui, repo, message, match, opts):
846 def commitfunc(ui, repo, message, match, opts):
847 editform = b'backout'
847 editform = b'backout'
848 e = cmdutil.getcommiteditor(
848 e = cmdutil.getcommiteditor(
849 editform=editform, **pycompat.strkwargs(opts)
849 editform=editform, **pycompat.strkwargs(opts)
850 )
850 )
851 if not message:
851 if not message:
852 # we don't translate commit messages
852 # we don't translate commit messages
853 message = b"Backed out changeset %s" % short(node)
853 message = b"Backed out changeset %s" % short(node)
854 e = cmdutil.getcommiteditor(edit=True, editform=editform)
854 e = cmdutil.getcommiteditor(edit=True, editform=editform)
855 return repo.commit(
855 return repo.commit(
856 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
856 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
857 )
857 )
858
858
859 # save to detect changes
859 # save to detect changes
860 tip = repo.changelog.tip()
860 tip = repo.changelog.tip()
861
861
862 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
862 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
863 if not newnode:
863 if not newnode:
864 ui.status(_(b"nothing changed\n"))
864 ui.status(_(b"nothing changed\n"))
865 return 1
865 return 1
866 cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
866 cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
867
867
868 def nice(node):
868 def nice(node):
869 return b'%d:%s' % (repo.changelog.rev(node), short(node))
869 return b'%d:%s' % (repo.changelog.rev(node), short(node))
870
870
871 ui.status(
871 ui.status(
872 _(b'changeset %s backs out changeset %s\n')
872 _(b'changeset %s backs out changeset %s\n')
873 % (nice(newnode), nice(node))
873 % (nice(newnode), nice(node))
874 )
874 )
875 if opts.get(b'merge') and op1 != node:
875 if opts.get(b'merge') and op1 != node:
876 hg.clean(repo, op1, show_stats=False)
876 hg.clean(repo, op1, show_stats=False)
877 ui.status(_(b'merging with changeset %s\n') % nice(newnode))
877 ui.status(_(b'merging with changeset %s\n') % nice(newnode))
878 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
878 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
879 with ui.configoverride(overrides, b'backout'):
879 with ui.configoverride(overrides, b'backout'):
880 return hg.merge(repo[b'tip'])
880 return hg.merge(repo[b'tip'])
881 return 0
881 return 0
882
882
883
883
884 @command(
884 @command(
885 b'bisect',
885 b'bisect',
886 [
886 [
887 (b'r', b'reset', False, _(b'reset bisect state')),
887 (b'r', b'reset', False, _(b'reset bisect state')),
888 (b'g', b'good', False, _(b'mark changeset good')),
888 (b'g', b'good', False, _(b'mark changeset good')),
889 (b'b', b'bad', False, _(b'mark changeset bad')),
889 (b'b', b'bad', False, _(b'mark changeset bad')),
890 (b's', b'skip', False, _(b'skip testing changeset')),
890 (b's', b'skip', False, _(b'skip testing changeset')),
891 (b'e', b'extend', False, _(b'extend the bisect range')),
891 (b'e', b'extend', False, _(b'extend the bisect range')),
892 (
892 (
893 b'c',
893 b'c',
894 b'command',
894 b'command',
895 b'',
895 b'',
896 _(b'use command to check changeset state'),
896 _(b'use command to check changeset state'),
897 _(b'CMD'),
897 _(b'CMD'),
898 ),
898 ),
899 (b'U', b'noupdate', False, _(b'do not update to target')),
899 (b'U', b'noupdate', False, _(b'do not update to target')),
900 ],
900 ],
901 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
901 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
902 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
902 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
903 )
903 )
904 def bisect(
904 def bisect(
905 ui,
905 ui,
906 repo,
906 repo,
907 positional_1=None,
907 positional_1=None,
908 positional_2=None,
908 positional_2=None,
909 command=None,
909 command=None,
910 reset=None,
910 reset=None,
911 good=None,
911 good=None,
912 bad=None,
912 bad=None,
913 skip=None,
913 skip=None,
914 extend=None,
914 extend=None,
915 noupdate=None,
915 noupdate=None,
916 ):
916 ):
917 """subdivision search of changesets
917 """subdivision search of changesets
918
918
919 This command helps to find changesets which introduce problems. To
919 This command helps to find changesets which introduce problems. To
920 use, mark the earliest changeset you know exhibits the problem as
920 use, mark the earliest changeset you know exhibits the problem as
921 bad, then mark the latest changeset which is free from the problem
921 bad, then mark the latest changeset which is free from the problem
922 as good. Bisect will update your working directory to a revision
922 as good. Bisect will update your working directory to a revision
923 for testing (unless the -U/--noupdate option is specified). Once
923 for testing (unless the -U/--noupdate option is specified). Once
924 you have performed tests, mark the working directory as good or
924 you have performed tests, mark the working directory as good or
925 bad, and bisect will either update to another candidate changeset
925 bad, and bisect will either update to another candidate changeset
926 or announce that it has found the bad revision.
926 or announce that it has found the bad revision.
927
927
928 As a shortcut, you can also use the revision argument to mark a
928 As a shortcut, you can also use the revision argument to mark a
929 revision as good or bad without checking it out first.
929 revision as good or bad without checking it out first.
930
930
931 If you supply a command, it will be used for automatic bisection.
931 If you supply a command, it will be used for automatic bisection.
932 The environment variable HG_NODE will contain the ID of the
932 The environment variable HG_NODE will contain the ID of the
933 changeset being tested. The exit status of the command will be
933 changeset being tested. The exit status of the command will be
934 used to mark revisions as good or bad: status 0 means good, 125
934 used to mark revisions as good or bad: status 0 means good, 125
935 means to skip the revision, 127 (command not found) will abort the
935 means to skip the revision, 127 (command not found) will abort the
936 bisection, and any other non-zero exit status means the revision
936 bisection, and any other non-zero exit status means the revision
937 is bad.
937 is bad.
938
938
939 .. container:: verbose
939 .. container:: verbose
940
940
941 Some examples:
941 Some examples:
942
942
943 - start a bisection with known bad revision 34, and good revision 12::
943 - start a bisection with known bad revision 34, and good revision 12::
944
944
945 hg bisect --bad 34
945 hg bisect --bad 34
946 hg bisect --good 12
946 hg bisect --good 12
947
947
948 - advance the current bisection by marking current revision as good or
948 - advance the current bisection by marking current revision as good or
949 bad::
949 bad::
950
950
951 hg bisect --good
951 hg bisect --good
952 hg bisect --bad
952 hg bisect --bad
953
953
954 - mark the current revision, or a known revision, to be skipped (e.g. if
954 - mark the current revision, or a known revision, to be skipped (e.g. if
955 that revision is not usable because of another issue)::
955 that revision is not usable because of another issue)::
956
956
957 hg bisect --skip
957 hg bisect --skip
958 hg bisect --skip 23
958 hg bisect --skip 23
959
959
960 - skip all revisions that do not touch directories ``foo`` or ``bar``::
960 - skip all revisions that do not touch directories ``foo`` or ``bar``::
961
961
962 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
962 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
963
963
964 - forget the current bisection::
964 - forget the current bisection::
965
965
966 hg bisect --reset
966 hg bisect --reset
967
967
968 - use 'make && make tests' to automatically find the first broken
968 - use 'make && make tests' to automatically find the first broken
969 revision::
969 revision::
970
970
971 hg bisect --reset
971 hg bisect --reset
972 hg bisect --bad 34
972 hg bisect --bad 34
973 hg bisect --good 12
973 hg bisect --good 12
974 hg bisect --command "make && make tests"
974 hg bisect --command "make && make tests"
975
975
976 - see all changesets whose states are already known in the current
976 - see all changesets whose states are already known in the current
977 bisection::
977 bisection::
978
978
979 hg log -r "bisect(pruned)"
979 hg log -r "bisect(pruned)"
980
980
981 - see the changeset currently being bisected (especially useful
981 - see the changeset currently being bisected (especially useful
982 if running with -U/--noupdate)::
982 if running with -U/--noupdate)::
983
983
984 hg log -r "bisect(current)"
984 hg log -r "bisect(current)"
985
985
986 - see all changesets that took part in the current bisection::
986 - see all changesets that took part in the current bisection::
987
987
988 hg log -r "bisect(range)"
988 hg log -r "bisect(range)"
989
989
990 - you can even get a nice graph::
990 - you can even get a nice graph::
991
991
992 hg log --graph -r "bisect(range)"
992 hg log --graph -r "bisect(range)"
993
993
994 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
994 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
995
995
996 Returns 0 on success.
996 Returns 0 on success.
997 """
997 """
998 rev = []
998 rev = []
999 # backward compatibility
999 # backward compatibility
1000 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1000 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1001 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1001 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1002 cmd = positional_1
1002 cmd = positional_1
1003 rev.append(positional_2)
1003 rev.append(positional_2)
1004 if cmd == b"good":
1004 if cmd == b"good":
1005 good = True
1005 good = True
1006 elif cmd == b"bad":
1006 elif cmd == b"bad":
1007 bad = True
1007 bad = True
1008 else:
1008 else:
1009 reset = True
1009 reset = True
1010 elif positional_2:
1010 elif positional_2:
1011 raise error.InputError(_(b'incompatible arguments'))
1011 raise error.InputError(_(b'incompatible arguments'))
1012 elif positional_1 is not None:
1012 elif positional_1 is not None:
1013 rev.append(positional_1)
1013 rev.append(positional_1)
1014
1014
1015 incompatibles = {
1015 incompatibles = {
1016 b'--bad': bad,
1016 b'--bad': bad,
1017 b'--command': bool(command),
1017 b'--command': bool(command),
1018 b'--extend': extend,
1018 b'--extend': extend,
1019 b'--good': good,
1019 b'--good': good,
1020 b'--reset': reset,
1020 b'--reset': reset,
1021 b'--skip': skip,
1021 b'--skip': skip,
1022 }
1022 }
1023
1023
1024 enabled = [x for x in incompatibles if incompatibles[x]]
1024 enabled = [x for x in incompatibles if incompatibles[x]]
1025
1025
1026 if len(enabled) > 1:
1026 if len(enabled) > 1:
1027 raise error.InputError(
1027 raise error.InputError(
1028 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1028 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1029 )
1029 )
1030
1030
1031 if reset:
1031 if reset:
1032 hbisect.resetstate(repo)
1032 hbisect.resetstate(repo)
1033 return
1033 return
1034
1034
1035 state = hbisect.load_state(repo)
1035 state = hbisect.load_state(repo)
1036
1036
1037 if rev:
1037 if rev:
1038 revs = logcmdutil.revrange(repo, rev)
1038 revs = logcmdutil.revrange(repo, rev)
1039 goodnodes = state[b'good']
1039 goodnodes = state[b'good']
1040 badnodes = state[b'bad']
1040 badnodes = state[b'bad']
1041 if goodnodes and badnodes:
1041 if goodnodes and badnodes:
1042 candidates = repo.revs(b'(%ln)::(%ln)', goodnodes, badnodes)
1042 candidates = repo.revs(b'(%ln)::(%ln)', goodnodes, badnodes)
1043 candidates += repo.revs(b'(%ln)::(%ln)', badnodes, goodnodes)
1043 candidates += repo.revs(b'(%ln)::(%ln)', badnodes, goodnodes)
1044 revs = candidates & revs
1044 revs = candidates & revs
1045 nodes = [repo.changelog.node(i) for i in revs]
1045 nodes = [repo.changelog.node(i) for i in revs]
1046 else:
1046 else:
1047 nodes = [repo.lookup(b'.')]
1047 nodes = [repo.lookup(b'.')]
1048
1048
1049 # update state
1049 # update state
1050 if good or bad or skip:
1050 if good or bad or skip:
1051 if good:
1051 if good:
1052 state[b'good'] += nodes
1052 state[b'good'] += nodes
1053 elif bad:
1053 elif bad:
1054 state[b'bad'] += nodes
1054 state[b'bad'] += nodes
1055 elif skip:
1055 elif skip:
1056 state[b'skip'] += nodes
1056 state[b'skip'] += nodes
1057 hbisect.save_state(repo, state)
1057 hbisect.save_state(repo, state)
1058 if not (state[b'good'] and state[b'bad']):
1058 if not (state[b'good'] and state[b'bad']):
1059 return
1059 return
1060
1060
1061 def mayupdate(repo, node, show_stats=True):
1061 def mayupdate(repo, node, show_stats=True):
1062 """common used update sequence"""
1062 """common used update sequence"""
1063 if noupdate:
1063 if noupdate:
1064 return
1064 return
1065 cmdutil.checkunfinished(repo)
1065 cmdutil.checkunfinished(repo)
1066 cmdutil.bailifchanged(repo)
1066 cmdutil.bailifchanged(repo)
1067 return hg.clean(repo, node, show_stats=show_stats)
1067 return hg.clean(repo, node, show_stats=show_stats)
1068
1068
1069 displayer = logcmdutil.changesetdisplayer(ui, repo, {})
1069 displayer = logcmdutil.changesetdisplayer(ui, repo, {})
1070
1070
1071 if command:
1071 if command:
1072 changesets = 1
1072 changesets = 1
1073 if noupdate:
1073 if noupdate:
1074 try:
1074 try:
1075 node = state[b'current'][0]
1075 node = state[b'current'][0]
1076 except LookupError:
1076 except LookupError:
1077 raise error.StateError(
1077 raise error.StateError(
1078 _(
1078 _(
1079 b'current bisect revision is unknown - '
1079 b'current bisect revision is unknown - '
1080 b'start a new bisect to fix'
1080 b'start a new bisect to fix'
1081 )
1081 )
1082 )
1082 )
1083 else:
1083 else:
1084 node, p2 = repo.dirstate.parents()
1084 node, p2 = repo.dirstate.parents()
1085 if p2 != repo.nullid:
1085 if p2 != repo.nullid:
1086 raise error.StateError(_(b'current bisect revision is a merge'))
1086 raise error.StateError(_(b'current bisect revision is a merge'))
1087 if rev:
1087 if rev:
1088 if not nodes:
1088 if not nodes:
1089 raise error.InputError(_(b'empty revision set'))
1089 raise error.InputError(_(b'empty revision set'))
1090 node = repo[nodes[-1]].node()
1090 node = repo[nodes[-1]].node()
1091 with hbisect.restore_state(repo, state, node):
1091 with hbisect.restore_state(repo, state, node):
1092 while changesets:
1092 while changesets:
1093 # update state
1093 # update state
1094 state[b'current'] = [node]
1094 state[b'current'] = [node]
1095 hbisect.save_state(repo, state)
1095 hbisect.save_state(repo, state)
1096 status = ui.system(
1096 status = ui.system(
1097 command,
1097 command,
1098 environ={b'HG_NODE': hex(node)},
1098 environ={b'HG_NODE': hex(node)},
1099 blockedtag=b'bisect_check',
1099 blockedtag=b'bisect_check',
1100 )
1100 )
1101 if status == 125:
1101 if status == 125:
1102 transition = b"skip"
1102 transition = b"skip"
1103 elif status == 0:
1103 elif status == 0:
1104 transition = b"good"
1104 transition = b"good"
1105 # status < 0 means process was killed
1105 # status < 0 means process was killed
1106 elif status == 127:
1106 elif status == 127:
1107 raise error.Abort(_(b"failed to execute %s") % command)
1107 raise error.Abort(_(b"failed to execute %s") % command)
1108 elif status < 0:
1108 elif status < 0:
1109 raise error.Abort(_(b"%s killed") % command)
1109 raise error.Abort(_(b"%s killed") % command)
1110 else:
1110 else:
1111 transition = b"bad"
1111 transition = b"bad"
1112 state[transition].append(node)
1112 state[transition].append(node)
1113 ctx = repo[node]
1113 ctx = repo[node]
1114 summary = cmdutil.format_changeset_summary(ui, ctx, b'bisect')
1114 summary = cmdutil.format_changeset_summary(ui, ctx, b'bisect')
1115 ui.status(_(b'changeset %s: %s\n') % (summary, transition))
1115 ui.status(_(b'changeset %s: %s\n') % (summary, transition))
1116 hbisect.checkstate(state)
1116 hbisect.checkstate(state)
1117 # bisect
1117 # bisect
1118 nodes, changesets, bgood = hbisect.bisect(repo, state)
1118 nodes, changesets, bgood = hbisect.bisect(repo, state)
1119 # update to next check
1119 # update to next check
1120 node = nodes[0]
1120 node = nodes[0]
1121 mayupdate(repo, node, show_stats=False)
1121 mayupdate(repo, node, show_stats=False)
1122 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1122 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1123 return
1123 return
1124
1124
1125 hbisect.checkstate(state)
1125 hbisect.checkstate(state)
1126
1126
1127 # actually bisect
1127 # actually bisect
1128 nodes, changesets, good = hbisect.bisect(repo, state)
1128 nodes, changesets, good = hbisect.bisect(repo, state)
1129 if extend:
1129 if extend:
1130 if not changesets:
1130 if not changesets:
1131 extendctx = hbisect.extendrange(repo, state, nodes, good)
1131 extendctx = hbisect.extendrange(repo, state, nodes, good)
1132 if extendctx is not None:
1132 if extendctx is not None:
1133 ui.write(
1133 ui.write(
1134 _(b"Extending search to changeset %s\n")
1134 _(b"Extending search to changeset %s\n")
1135 % cmdutil.format_changeset_summary(ui, extendctx, b'bisect')
1135 % cmdutil.format_changeset_summary(ui, extendctx, b'bisect')
1136 )
1136 )
1137 state[b'current'] = [extendctx.node()]
1137 state[b'current'] = [extendctx.node()]
1138 hbisect.save_state(repo, state)
1138 hbisect.save_state(repo, state)
1139 return mayupdate(repo, extendctx.node())
1139 return mayupdate(repo, extendctx.node())
1140 raise error.StateError(_(b"nothing to extend"))
1140 raise error.StateError(_(b"nothing to extend"))
1141
1141
1142 if changesets == 0:
1142 if changesets == 0:
1143 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1143 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1144 else:
1144 else:
1145 assert len(nodes) == 1 # only a single node can be tested next
1145 assert len(nodes) == 1 # only a single node can be tested next
1146 node = nodes[0]
1146 node = nodes[0]
1147 # compute the approximate number of remaining tests
1147 # compute the approximate number of remaining tests
1148 tests, size = 0, 2
1148 tests, size = 0, 2
1149 while size <= changesets:
1149 while size <= changesets:
1150 tests, size = tests + 1, size * 2
1150 tests, size = tests + 1, size * 2
1151 rev = repo.changelog.rev(node)
1151 rev = repo.changelog.rev(node)
1152 summary = cmdutil.format_changeset_summary(ui, repo[rev], b'bisect')
1152 summary = cmdutil.format_changeset_summary(ui, repo[rev], b'bisect')
1153 ui.write(
1153 ui.write(
1154 _(
1154 _(
1155 b"Testing changeset %s "
1155 b"Testing changeset %s "
1156 b"(%d changesets remaining, ~%d tests)\n"
1156 b"(%d changesets remaining, ~%d tests)\n"
1157 )
1157 )
1158 % (summary, changesets, tests)
1158 % (summary, changesets, tests)
1159 )
1159 )
1160 state[b'current'] = [node]
1160 state[b'current'] = [node]
1161 hbisect.save_state(repo, state)
1161 hbisect.save_state(repo, state)
1162 return mayupdate(repo, node)
1162 return mayupdate(repo, node)
1163
1163
1164
1164
1165 @command(
1165 @command(
1166 b'bookmarks|bookmark',
1166 b'bookmarks|bookmark',
1167 [
1167 [
1168 (b'f', b'force', False, _(b'force')),
1168 (b'f', b'force', False, _(b'force')),
1169 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1169 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1170 (b'd', b'delete', False, _(b'delete a given bookmark')),
1170 (b'd', b'delete', False, _(b'delete a given bookmark')),
1171 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1171 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1172 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1172 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1173 (b'l', b'list', False, _(b'list existing bookmarks')),
1173 (b'l', b'list', False, _(b'list existing bookmarks')),
1174 ]
1174 ]
1175 + formatteropts,
1175 + formatteropts,
1176 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1176 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1177 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1177 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1178 )
1178 )
1179 def bookmark(ui, repo, *names, **opts):
1179 def bookmark(ui, repo, *names, **opts):
1180 """create a new bookmark or list existing bookmarks
1180 """create a new bookmark or list existing bookmarks
1181
1181
1182 Bookmarks are labels on changesets to help track lines of development.
1182 Bookmarks are labels on changesets to help track lines of development.
1183 Bookmarks are unversioned and can be moved, renamed and deleted.
1183 Bookmarks are unversioned and can be moved, renamed and deleted.
1184 Deleting or moving a bookmark has no effect on the associated changesets.
1184 Deleting or moving a bookmark has no effect on the associated changesets.
1185
1185
1186 Creating or updating to a bookmark causes it to be marked as 'active'.
1186 Creating or updating to a bookmark causes it to be marked as 'active'.
1187 The active bookmark is indicated with a '*'.
1187 The active bookmark is indicated with a '*'.
1188 When a commit is made, the active bookmark will advance to the new commit.
1188 When a commit is made, the active bookmark will advance to the new commit.
1189 A plain :hg:`update` will also advance an active bookmark, if possible.
1189 A plain :hg:`update` will also advance an active bookmark, if possible.
1190 Updating away from a bookmark will cause it to be deactivated.
1190 Updating away from a bookmark will cause it to be deactivated.
1191
1191
1192 Bookmarks can be pushed and pulled between repositories (see
1192 Bookmarks can be pushed and pulled between repositories (see
1193 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
1193 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
1194 diverged, a new 'divergent bookmark' of the form 'name@path' will
1194 diverged, a new 'divergent bookmark' of the form 'name@path' will
1195 be created. Using :hg:`merge` will resolve the divergence.
1195 be created. Using :hg:`merge` will resolve the divergence.
1196
1196
1197 Specifying bookmark as '.' to -m/-d/-l options is equivalent to specifying
1197 Specifying bookmark as '.' to -m/-d/-l options is equivalent to specifying
1198 the active bookmark's name.
1198 the active bookmark's name.
1199
1199
1200 A bookmark named '@' has the special property that :hg:`clone` will
1200 A bookmark named '@' has the special property that :hg:`clone` will
1201 check it out by default if it exists.
1201 check it out by default if it exists.
1202
1202
1203 .. container:: verbose
1203 .. container:: verbose
1204
1204
1205 Template:
1205 Template:
1206
1206
1207 The following keywords are supported in addition to the common template
1207 The following keywords are supported in addition to the common template
1208 keywords and functions such as ``{bookmark}``. See also
1208 keywords and functions such as ``{bookmark}``. See also
1209 :hg:`help templates`.
1209 :hg:`help templates`.
1210
1210
1211 :active: Boolean. True if the bookmark is active.
1211 :active: Boolean. True if the bookmark is active.
1212
1212
1213 Examples:
1213 Examples:
1214
1214
1215 - create an active bookmark for a new line of development::
1215 - create an active bookmark for a new line of development::
1216
1216
1217 hg book new-feature
1217 hg book new-feature
1218
1218
1219 - create an inactive bookmark as a place marker::
1219 - create an inactive bookmark as a place marker::
1220
1220
1221 hg book -i reviewed
1221 hg book -i reviewed
1222
1222
1223 - create an inactive bookmark on another changeset::
1223 - create an inactive bookmark on another changeset::
1224
1224
1225 hg book -r .^ tested
1225 hg book -r .^ tested
1226
1226
1227 - rename bookmark turkey to dinner::
1227 - rename bookmark turkey to dinner::
1228
1228
1229 hg book -m turkey dinner
1229 hg book -m turkey dinner
1230
1230
1231 - move the '@' bookmark from another branch::
1231 - move the '@' bookmark from another branch::
1232
1232
1233 hg book -f @
1233 hg book -f @
1234
1234
1235 - print only the active bookmark name::
1235 - print only the active bookmark name::
1236
1236
1237 hg book -ql .
1237 hg book -ql .
1238 """
1238 """
1239 opts = pycompat.byteskwargs(opts)
1239 opts = pycompat.byteskwargs(opts)
1240 force = opts.get(b'force')
1240 force = opts.get(b'force')
1241 rev = opts.get(b'rev')
1241 rev = opts.get(b'rev')
1242 inactive = opts.get(b'inactive') # meaning add/rename to inactive bookmark
1242 inactive = opts.get(b'inactive') # meaning add/rename to inactive bookmark
1243
1243
1244 action = cmdutil.check_at_most_one_arg(opts, b'delete', b'rename', b'list')
1244 action = cmdutil.check_at_most_one_arg(opts, b'delete', b'rename', b'list')
1245 if action:
1245 if action:
1246 cmdutil.check_incompatible_arguments(opts, action, [b'rev'])
1246 cmdutil.check_incompatible_arguments(opts, action, [b'rev'])
1247 elif names or rev:
1247 elif names or rev:
1248 action = b'add'
1248 action = b'add'
1249 elif inactive:
1249 elif inactive:
1250 action = b'inactive' # meaning deactivate
1250 action = b'inactive' # meaning deactivate
1251 else:
1251 else:
1252 action = b'list'
1252 action = b'list'
1253
1253
1254 cmdutil.check_incompatible_arguments(
1254 cmdutil.check_incompatible_arguments(
1255 opts, b'inactive', [b'delete', b'list']
1255 opts, b'inactive', [b'delete', b'list']
1256 )
1256 )
1257 if not names and action in {b'add', b'delete'}:
1257 if not names and action in {b'add', b'delete'}:
1258 raise error.InputError(_(b"bookmark name required"))
1258 raise error.InputError(_(b"bookmark name required"))
1259
1259
1260 if action in {b'add', b'delete', b'rename', b'inactive'}:
1260 if action in {b'add', b'delete', b'rename', b'inactive'}:
1261 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1261 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1262 if action == b'delete':
1262 if action == b'delete':
1263 names = pycompat.maplist(repo._bookmarks.expandname, names)
1263 names = pycompat.maplist(repo._bookmarks.expandname, names)
1264 bookmarks.delete(repo, tr, names)
1264 bookmarks.delete(repo, tr, names)
1265 elif action == b'rename':
1265 elif action == b'rename':
1266 if not names:
1266 if not names:
1267 raise error.InputError(_(b"new bookmark name required"))
1267 raise error.InputError(_(b"new bookmark name required"))
1268 elif len(names) > 1:
1268 elif len(names) > 1:
1269 raise error.InputError(
1269 raise error.InputError(
1270 _(b"only one new bookmark name allowed")
1270 _(b"only one new bookmark name allowed")
1271 )
1271 )
1272 oldname = repo._bookmarks.expandname(opts[b'rename'])
1272 oldname = repo._bookmarks.expandname(opts[b'rename'])
1273 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1273 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1274 elif action == b'add':
1274 elif action == b'add':
1275 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1275 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1276 elif action == b'inactive':
1276 elif action == b'inactive':
1277 if len(repo._bookmarks) == 0:
1277 if len(repo._bookmarks) == 0:
1278 ui.status(_(b"no bookmarks set\n"))
1278 ui.status(_(b"no bookmarks set\n"))
1279 elif not repo._activebookmark:
1279 elif not repo._activebookmark:
1280 ui.status(_(b"no active bookmark\n"))
1280 ui.status(_(b"no active bookmark\n"))
1281 else:
1281 else:
1282 bookmarks.deactivate(repo)
1282 bookmarks.deactivate(repo)
1283 elif action == b'list':
1283 elif action == b'list':
1284 names = pycompat.maplist(repo._bookmarks.expandname, names)
1284 names = pycompat.maplist(repo._bookmarks.expandname, names)
1285 with ui.formatter(b'bookmarks', opts) as fm:
1285 with ui.formatter(b'bookmarks', opts) as fm:
1286 bookmarks.printbookmarks(ui, repo, fm, names)
1286 bookmarks.printbookmarks(ui, repo, fm, names)
1287 else:
1287 else:
1288 raise error.ProgrammingError(b'invalid action: %s' % action)
1288 raise error.ProgrammingError(b'invalid action: %s' % action)
1289
1289
1290
1290
1291 @command(
1291 @command(
1292 b'branch',
1292 b'branch',
1293 [
1293 [
1294 (
1294 (
1295 b'f',
1295 b'f',
1296 b'force',
1296 b'force',
1297 None,
1297 None,
1298 _(b'set branch name even if it shadows an existing branch'),
1298 _(b'set branch name even if it shadows an existing branch'),
1299 ),
1299 ),
1300 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1300 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1301 (
1301 (
1302 b'r',
1302 b'r',
1303 b'rev',
1303 b'rev',
1304 [],
1304 [],
1305 _(b'change branches of the given revs (EXPERIMENTAL)'),
1305 _(b'change branches of the given revs (EXPERIMENTAL)'),
1306 ),
1306 ),
1307 ],
1307 ],
1308 _(b'[-fC] [NAME]'),
1308 _(b'[-fC] [NAME]'),
1309 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1309 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1310 )
1310 )
1311 def branch(ui, repo, label=None, **opts):
1311 def branch(ui, repo, label=None, **opts):
1312 """set or show the current branch name
1312 """set or show the current branch name
1313
1313
1314 .. note::
1314 .. note::
1315
1315
1316 Branch names are permanent and global. Use :hg:`bookmark` to create a
1316 Branch names are permanent and global. Use :hg:`bookmark` to create a
1317 light-weight bookmark instead. See :hg:`help glossary` for more
1317 light-weight bookmark instead. See :hg:`help glossary` for more
1318 information about named branches and bookmarks.
1318 information about named branches and bookmarks.
1319
1319
1320 With no argument, show the current branch name. With one argument,
1320 With no argument, show the current branch name. With one argument,
1321 set the working directory branch name (the branch will not exist
1321 set the working directory branch name (the branch will not exist
1322 in the repository until the next commit). Standard practice
1322 in the repository until the next commit). Standard practice
1323 recommends that primary development take place on the 'default'
1323 recommends that primary development take place on the 'default'
1324 branch.
1324 branch.
1325
1325
1326 Unless -f/--force is specified, branch will not let you set a
1326 Unless -f/--force is specified, branch will not let you set a
1327 branch name that already exists.
1327 branch name that already exists.
1328
1328
1329 Use -C/--clean to reset the working directory branch to that of
1329 Use -C/--clean to reset the working directory branch to that of
1330 the parent of the working directory, negating a previous branch
1330 the parent of the working directory, negating a previous branch
1331 change.
1331 change.
1332
1332
1333 Use the command :hg:`update` to switch to an existing branch. Use
1333 Use the command :hg:`update` to switch to an existing branch. Use
1334 :hg:`commit --close-branch` to mark this branch head as closed.
1334 :hg:`commit --close-branch` to mark this branch head as closed.
1335 When all heads of a branch are closed, the branch will be
1335 When all heads of a branch are closed, the branch will be
1336 considered closed.
1336 considered closed.
1337
1337
1338 Returns 0 on success.
1338 Returns 0 on success.
1339 """
1339 """
1340 opts = pycompat.byteskwargs(opts)
1340 opts = pycompat.byteskwargs(opts)
1341 revs = opts.get(b'rev')
1341 revs = opts.get(b'rev')
1342 if label:
1342 if label:
1343 label = label.strip()
1343 label = label.strip()
1344
1344
1345 if not opts.get(b'clean') and not label:
1345 if not opts.get(b'clean') and not label:
1346 if revs:
1346 if revs:
1347 raise error.InputError(
1347 raise error.InputError(
1348 _(b"no branch name specified for the revisions")
1348 _(b"no branch name specified for the revisions")
1349 )
1349 )
1350 ui.write(b"%s\n" % repo.dirstate.branch())
1350 ui.write(b"%s\n" % repo.dirstate.branch())
1351 return
1351 return
1352
1352
1353 with repo.wlock():
1353 with repo.wlock():
1354 if opts.get(b'clean'):
1354 if opts.get(b'clean'):
1355 label = repo[b'.'].branch()
1355 label = repo[b'.'].branch()
1356 repo.dirstate.setbranch(label)
1356 repo.dirstate.setbranch(label)
1357 ui.status(_(b'reset working directory to branch %s\n') % label)
1357 ui.status(_(b'reset working directory to branch %s\n') % label)
1358 elif label:
1358 elif label:
1359
1359
1360 scmutil.checknewlabel(repo, label, b'branch')
1360 scmutil.checknewlabel(repo, label, b'branch')
1361 if revs:
1361 if revs:
1362 return cmdutil.changebranch(ui, repo, revs, label, opts)
1362 return cmdutil.changebranch(ui, repo, revs, label, opts)
1363
1363
1364 if not opts.get(b'force') and label in repo.branchmap():
1364 if not opts.get(b'force') and label in repo.branchmap():
1365 if label not in [p.branch() for p in repo[None].parents()]:
1365 if label not in [p.branch() for p in repo[None].parents()]:
1366 raise error.InputError(
1366 raise error.InputError(
1367 _(b'a branch of the same name already exists'),
1367 _(b'a branch of the same name already exists'),
1368 # i18n: "it" refers to an existing branch
1368 # i18n: "it" refers to an existing branch
1369 hint=_(b"use 'hg update' to switch to it"),
1369 hint=_(b"use 'hg update' to switch to it"),
1370 )
1370 )
1371
1371
1372 repo.dirstate.setbranch(label)
1372 repo.dirstate.setbranch(label)
1373 ui.status(_(b'marked working directory as branch %s\n') % label)
1373 ui.status(_(b'marked working directory as branch %s\n') % label)
1374
1374
1375 # find any open named branches aside from default
1375 # find any open named branches aside from default
1376 for n, h, t, c in repo.branchmap().iterbranches():
1376 for n, h, t, c in repo.branchmap().iterbranches():
1377 if n != b"default" and not c:
1377 if n != b"default" and not c:
1378 return 0
1378 return 0
1379 ui.status(
1379 ui.status(
1380 _(
1380 _(
1381 b'(branches are permanent and global, '
1381 b'(branches are permanent and global, '
1382 b'did you want a bookmark?)\n'
1382 b'did you want a bookmark?)\n'
1383 )
1383 )
1384 )
1384 )
1385
1385
1386
1386
1387 @command(
1387 @command(
1388 b'branches',
1388 b'branches',
1389 [
1389 [
1390 (
1390 (
1391 b'a',
1391 b'a',
1392 b'active',
1392 b'active',
1393 False,
1393 False,
1394 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1394 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1395 ),
1395 ),
1396 (b'c', b'closed', False, _(b'show normal and closed branches')),
1396 (b'c', b'closed', False, _(b'show normal and closed branches')),
1397 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1397 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1398 ]
1398 ]
1399 + formatteropts,
1399 + formatteropts,
1400 _(b'[-c]'),
1400 _(b'[-c]'),
1401 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1401 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1402 intents={INTENT_READONLY},
1402 intents={INTENT_READONLY},
1403 )
1403 )
1404 def branches(ui, repo, active=False, closed=False, **opts):
1404 def branches(ui, repo, active=False, closed=False, **opts):
1405 """list repository named branches
1405 """list repository named branches
1406
1406
1407 List the repository's named branches, indicating which ones are
1407 List the repository's named branches, indicating which ones are
1408 inactive. If -c/--closed is specified, also list branches which have
1408 inactive. If -c/--closed is specified, also list branches which have
1409 been marked closed (see :hg:`commit --close-branch`).
1409 been marked closed (see :hg:`commit --close-branch`).
1410
1410
1411 Use the command :hg:`update` to switch to an existing branch.
1411 Use the command :hg:`update` to switch to an existing branch.
1412
1412
1413 .. container:: verbose
1413 .. container:: verbose
1414
1414
1415 Template:
1415 Template:
1416
1416
1417 The following keywords are supported in addition to the common template
1417 The following keywords are supported in addition to the common template
1418 keywords and functions such as ``{branch}``. See also
1418 keywords and functions such as ``{branch}``. See also
1419 :hg:`help templates`.
1419 :hg:`help templates`.
1420
1420
1421 :active: Boolean. True if the branch is active.
1421 :active: Boolean. True if the branch is active.
1422 :closed: Boolean. True if the branch is closed.
1422 :closed: Boolean. True if the branch is closed.
1423 :current: Boolean. True if it is the current branch.
1423 :current: Boolean. True if it is the current branch.
1424
1424
1425 Returns 0.
1425 Returns 0.
1426 """
1426 """
1427
1427
1428 opts = pycompat.byteskwargs(opts)
1428 opts = pycompat.byteskwargs(opts)
1429 revs = opts.get(b'rev')
1429 revs = opts.get(b'rev')
1430 selectedbranches = None
1430 selectedbranches = None
1431 if revs:
1431 if revs:
1432 revs = logcmdutil.revrange(repo, revs)
1432 revs = logcmdutil.revrange(repo, revs)
1433 getbi = repo.revbranchcache().branchinfo
1433 getbi = repo.revbranchcache().branchinfo
1434 selectedbranches = {getbi(r)[0] for r in revs}
1434 selectedbranches = {getbi(r)[0] for r in revs}
1435
1435
1436 ui.pager(b'branches')
1436 ui.pager(b'branches')
1437 fm = ui.formatter(b'branches', opts)
1437 fm = ui.formatter(b'branches', opts)
1438 hexfunc = fm.hexfunc
1438 hexfunc = fm.hexfunc
1439
1439
1440 allheads = set(repo.heads())
1440 allheads = set(repo.heads())
1441 branches = []
1441 branches = []
1442 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1442 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1443 if selectedbranches is not None and tag not in selectedbranches:
1443 if selectedbranches is not None and tag not in selectedbranches:
1444 continue
1444 continue
1445 isactive = False
1445 isactive = False
1446 if not isclosed:
1446 if not isclosed:
1447 openheads = set(repo.branchmap().iteropen(heads))
1447 openheads = set(repo.branchmap().iteropen(heads))
1448 isactive = bool(openheads & allheads)
1448 isactive = bool(openheads & allheads)
1449 branches.append((tag, repo[tip], isactive, not isclosed))
1449 branches.append((tag, repo[tip], isactive, not isclosed))
1450 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]), reverse=True)
1450 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]), reverse=True)
1451
1451
1452 for tag, ctx, isactive, isopen in branches:
1452 for tag, ctx, isactive, isopen in branches:
1453 if active and not isactive:
1453 if active and not isactive:
1454 continue
1454 continue
1455 if isactive:
1455 if isactive:
1456 label = b'branches.active'
1456 label = b'branches.active'
1457 notice = b''
1457 notice = b''
1458 elif not isopen:
1458 elif not isopen:
1459 if not closed:
1459 if not closed:
1460 continue
1460 continue
1461 label = b'branches.closed'
1461 label = b'branches.closed'
1462 notice = _(b' (closed)')
1462 notice = _(b' (closed)')
1463 else:
1463 else:
1464 label = b'branches.inactive'
1464 label = b'branches.inactive'
1465 notice = _(b' (inactive)')
1465 notice = _(b' (inactive)')
1466 current = tag == repo.dirstate.branch()
1466 current = tag == repo.dirstate.branch()
1467 if current:
1467 if current:
1468 label = b'branches.current'
1468 label = b'branches.current'
1469
1469
1470 fm.startitem()
1470 fm.startitem()
1471 fm.write(b'branch', b'%s', tag, label=label)
1471 fm.write(b'branch', b'%s', tag, label=label)
1472 rev = ctx.rev()
1472 rev = ctx.rev()
1473 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1473 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1474 fmt = b' ' * padsize + b' %d:%s'
1474 fmt = b' ' * padsize + b' %d:%s'
1475 fm.condwrite(
1475 fm.condwrite(
1476 not ui.quiet,
1476 not ui.quiet,
1477 b'rev node',
1477 b'rev node',
1478 fmt,
1478 fmt,
1479 rev,
1479 rev,
1480 hexfunc(ctx.node()),
1480 hexfunc(ctx.node()),
1481 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1481 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1482 )
1482 )
1483 fm.context(ctx=ctx)
1483 fm.context(ctx=ctx)
1484 fm.data(active=isactive, closed=not isopen, current=current)
1484 fm.data(active=isactive, closed=not isopen, current=current)
1485 if not ui.quiet:
1485 if not ui.quiet:
1486 fm.plain(notice)
1486 fm.plain(notice)
1487 fm.plain(b'\n')
1487 fm.plain(b'\n')
1488 fm.end()
1488 fm.end()
1489
1489
1490
1490
1491 @command(
1491 @command(
1492 b'bundle',
1492 b'bundle',
1493 [
1493 [
1494 (
1494 (
1495 b'',
1495 b'',
1496 b'exact',
1496 b'exact',
1497 None,
1497 None,
1498 _(b'compute the base from the revision specified'),
1498 _(b'compute the base from the revision specified'),
1499 ),
1499 ),
1500 (
1500 (
1501 b'f',
1501 b'f',
1502 b'force',
1502 b'force',
1503 None,
1503 None,
1504 _(b'run even when the destination is unrelated'),
1504 _(b'run even when the destination is unrelated'),
1505 ),
1505 ),
1506 (
1506 (
1507 b'r',
1507 b'r',
1508 b'rev',
1508 b'rev',
1509 [],
1509 [],
1510 _(b'a changeset intended to be added to the destination'),
1510 _(b'a changeset intended to be added to the destination'),
1511 _(b'REV'),
1511 _(b'REV'),
1512 ),
1512 ),
1513 (
1513 (
1514 b'b',
1514 b'b',
1515 b'branch',
1515 b'branch',
1516 [],
1516 [],
1517 _(b'a specific branch you would like to bundle'),
1517 _(b'a specific branch you would like to bundle'),
1518 _(b'BRANCH'),
1518 _(b'BRANCH'),
1519 ),
1519 ),
1520 (
1520 (
1521 b'',
1521 b'',
1522 b'base',
1522 b'base',
1523 [],
1523 [],
1524 _(b'a base changeset assumed to be available at the destination'),
1524 _(b'a base changeset assumed to be available at the destination'),
1525 _(b'REV'),
1525 _(b'REV'),
1526 ),
1526 ),
1527 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1527 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1528 (
1528 (
1529 b't',
1529 b't',
1530 b'type',
1530 b'type',
1531 b'bzip2',
1531 b'bzip2',
1532 _(b'bundle compression type to use'),
1532 _(b'bundle compression type to use'),
1533 _(b'TYPE'),
1533 _(b'TYPE'),
1534 ),
1534 ),
1535 ]
1535 ]
1536 + remoteopts,
1536 + remoteopts,
1537 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]...'),
1537 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]...'),
1538 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1538 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1539 )
1539 )
1540 def bundle(ui, repo, fname, *dests, **opts):
1540 def bundle(ui, repo, fname, *dests, **opts):
1541 """create a bundle file
1541 """create a bundle file
1542
1542
1543 Generate a bundle file containing data to be transferred to another
1543 Generate a bundle file containing data to be transferred to another
1544 repository.
1544 repository.
1545
1545
1546 To create a bundle containing all changesets, use -a/--all
1546 To create a bundle containing all changesets, use -a/--all
1547 (or --base null). Otherwise, hg assumes the destination will have
1547 (or --base null). Otherwise, hg assumes the destination will have
1548 all the nodes you specify with --base parameters. Otherwise, hg
1548 all the nodes you specify with --base parameters. Otherwise, hg
1549 will assume the repository has all the nodes in destination, or
1549 will assume the repository has all the nodes in destination, or
1550 default-push/default if no destination is specified, where destination
1550 default-push/default if no destination is specified, where destination
1551 is the repositories you provide through DEST option.
1551 is the repositories you provide through DEST option.
1552
1552
1553 You can change bundle format with the -t/--type option. See
1553 You can change bundle format with the -t/--type option. See
1554 :hg:`help bundlespec` for documentation on this format. By default,
1554 :hg:`help bundlespec` for documentation on this format. By default,
1555 the most appropriate format is used and compression defaults to
1555 the most appropriate format is used and compression defaults to
1556 bzip2.
1556 bzip2.
1557
1557
1558 The bundle file can then be transferred using conventional means
1558 The bundle file can then be transferred using conventional means
1559 and applied to another repository with the unbundle or pull
1559 and applied to another repository with the unbundle or pull
1560 command. This is useful when direct push and pull are not
1560 command. This is useful when direct push and pull are not
1561 available or when exporting an entire repository is undesirable.
1561 available or when exporting an entire repository is undesirable.
1562
1562
1563 Applying bundles preserves all changeset contents including
1563 Applying bundles preserves all changeset contents including
1564 permissions, copy/rename information, and revision history.
1564 permissions, copy/rename information, and revision history.
1565
1565
1566 Returns 0 on success, 1 if no changes found.
1566 Returns 0 on success, 1 if no changes found.
1567 """
1567 """
1568 opts = pycompat.byteskwargs(opts)
1568 opts = pycompat.byteskwargs(opts)
1569
1569
1570 revs = None
1570 revs = None
1571 if b'rev' in opts:
1571 if b'rev' in opts:
1572 revstrings = opts[b'rev']
1572 revstrings = opts[b'rev']
1573 revs = logcmdutil.revrange(repo, revstrings)
1573 revs = logcmdutil.revrange(repo, revstrings)
1574 if revstrings and not revs:
1574 if revstrings and not revs:
1575 raise error.InputError(_(b'no commits to bundle'))
1575 raise error.InputError(_(b'no commits to bundle'))
1576
1576
1577 bundletype = opts.get(b'type', b'bzip2').lower()
1577 bundletype = opts.get(b'type', b'bzip2').lower()
1578 try:
1578 try:
1579 bundlespec = bundlecaches.parsebundlespec(
1579 bundlespec = bundlecaches.parsebundlespec(
1580 repo, bundletype, strict=False
1580 repo, bundletype, strict=False
1581 )
1581 )
1582 except error.UnsupportedBundleSpecification as e:
1582 except error.UnsupportedBundleSpecification as e:
1583 raise error.InputError(
1583 raise error.InputError(
1584 pycompat.bytestr(e),
1584 pycompat.bytestr(e),
1585 hint=_(b"see 'hg help bundlespec' for supported values for --type"),
1585 hint=_(b"see 'hg help bundlespec' for supported values for --type"),
1586 )
1586 )
1587 cgversion = bundlespec.params[b"cg.version"]
1587 cgversion = bundlespec.params[b"cg.version"]
1588
1588
1589 # Packed bundles are a pseudo bundle format for now.
1589 # Packed bundles are a pseudo bundle format for now.
1590 if cgversion == b's1':
1590 if cgversion == b's1':
1591 raise error.InputError(
1591 raise error.InputError(
1592 _(b'packed bundles cannot be produced by "hg bundle"'),
1592 _(b'packed bundles cannot be produced by "hg bundle"'),
1593 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1593 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1594 )
1594 )
1595
1595
1596 if opts.get(b'all'):
1596 if opts.get(b'all'):
1597 if dests:
1597 if dests:
1598 raise error.InputError(
1598 raise error.InputError(
1599 _(b"--all is incompatible with specifying destinations")
1599 _(b"--all is incompatible with specifying destinations")
1600 )
1600 )
1601 if opts.get(b'base'):
1601 if opts.get(b'base'):
1602 ui.warn(_(b"ignoring --base because --all was specified\n"))
1602 ui.warn(_(b"ignoring --base because --all was specified\n"))
1603 if opts.get(b'exact'):
1603 if opts.get(b'exact'):
1604 ui.warn(_(b"ignoring --exact because --all was specified\n"))
1604 ui.warn(_(b"ignoring --exact because --all was specified\n"))
1605 base = [nullrev]
1605 base = [nullrev]
1606 elif opts.get(b'exact'):
1606 elif opts.get(b'exact'):
1607 if dests:
1607 if dests:
1608 raise error.InputError(
1608 raise error.InputError(
1609 _(b"--exact is incompatible with specifying destinations")
1609 _(b"--exact is incompatible with specifying destinations")
1610 )
1610 )
1611 if opts.get(b'base'):
1611 if opts.get(b'base'):
1612 ui.warn(_(b"ignoring --base because --exact was specified\n"))
1612 ui.warn(_(b"ignoring --base because --exact was specified\n"))
1613 base = repo.revs(b'parents(%ld) - %ld', revs, revs)
1613 base = repo.revs(b'parents(%ld) - %ld', revs, revs)
1614 if not base:
1614 if not base:
1615 base = [nullrev]
1615 base = [nullrev]
1616 else:
1616 else:
1617 base = logcmdutil.revrange(repo, opts.get(b'base'))
1617 base = logcmdutil.revrange(repo, opts.get(b'base'))
1618 if cgversion not in changegroup.supportedoutgoingversions(repo):
1618 if cgversion not in changegroup.supportedoutgoingversions(repo):
1619 raise error.Abort(
1619 raise error.Abort(
1620 _(b"repository does not support bundle version %s") % cgversion
1620 _(b"repository does not support bundle version %s") % cgversion
1621 )
1621 )
1622
1622
1623 if base:
1623 if base:
1624 if dests:
1624 if dests:
1625 raise error.InputError(
1625 raise error.InputError(
1626 _(b"--base is incompatible with specifying destinations")
1626 _(b"--base is incompatible with specifying destinations")
1627 )
1627 )
1628 cl = repo.changelog
1628 cl = repo.changelog
1629 common = [cl.node(rev) for rev in base]
1629 common = [cl.node(rev) for rev in base]
1630 heads = [cl.node(r) for r in revs] if revs else None
1630 heads = [cl.node(r) for r in revs] if revs else None
1631 outgoing = discovery.outgoing(repo, common, heads)
1631 outgoing = discovery.outgoing(repo, common, heads)
1632 missing = outgoing.missing
1632 missing = outgoing.missing
1633 excluded = outgoing.excluded
1633 excluded = outgoing.excluded
1634 else:
1634 else:
1635 missing = set()
1635 missing = set()
1636 excluded = set()
1636 excluded = set()
1637 for path in urlutil.get_push_paths(repo, ui, dests):
1637 for path in urlutil.get_push_paths(repo, ui, dests):
1638 other = hg.peer(repo, opts, path.rawloc)
1638 other = hg.peer(repo, opts, path.rawloc)
1639 if revs is not None:
1639 if revs is not None:
1640 hex_revs = [repo[r].hex() for r in revs]
1640 hex_revs = [repo[r].hex() for r in revs]
1641 else:
1641 else:
1642 hex_revs = None
1642 hex_revs = None
1643 branches = (path.branch, [])
1643 branches = (path.branch, [])
1644 head_revs, checkout = hg.addbranchrevs(
1644 head_revs, checkout = hg.addbranchrevs(
1645 repo, repo, branches, hex_revs
1645 repo, repo, branches, hex_revs
1646 )
1646 )
1647 heads = (
1647 heads = (
1648 head_revs
1648 head_revs
1649 and pycompat.maplist(repo.lookup, head_revs)
1649 and pycompat.maplist(repo.lookup, head_revs)
1650 or head_revs
1650 or head_revs
1651 )
1651 )
1652 outgoing = discovery.findcommonoutgoing(
1652 outgoing = discovery.findcommonoutgoing(
1653 repo,
1653 repo,
1654 other,
1654 other,
1655 onlyheads=heads,
1655 onlyheads=heads,
1656 force=opts.get(b'force'),
1656 force=opts.get(b'force'),
1657 portable=True,
1657 portable=True,
1658 )
1658 )
1659 missing.update(outgoing.missing)
1659 missing.update(outgoing.missing)
1660 excluded.update(outgoing.excluded)
1660 excluded.update(outgoing.excluded)
1661
1661
1662 if not missing:
1662 if not missing:
1663 scmutil.nochangesfound(ui, repo, not base and excluded)
1663 scmutil.nochangesfound(ui, repo, not base and excluded)
1664 return 1
1664 return 1
1665
1665
1666 if heads:
1666 if heads:
1667 outgoing = discovery.outgoing(
1667 outgoing = discovery.outgoing(
1668 repo, missingroots=missing, ancestorsof=heads
1668 repo, missingroots=missing, ancestorsof=heads
1669 )
1669 )
1670 else:
1670 else:
1671 outgoing = discovery.outgoing(repo, missingroots=missing)
1671 outgoing = discovery.outgoing(repo, missingroots=missing)
1672 outgoing.excluded = sorted(excluded)
1672 outgoing.excluded = sorted(excluded)
1673
1673
1674 if cgversion == b'01': # bundle1
1674 if cgversion == b'01': # bundle1
1675 bversion = b'HG10' + bundlespec.wirecompression
1675 bversion = b'HG10' + bundlespec.wirecompression
1676 bcompression = None
1676 bcompression = None
1677 elif cgversion in (b'02', b'03'):
1677 elif cgversion in (b'02', b'03'):
1678 bversion = b'HG20'
1678 bversion = b'HG20'
1679 bcompression = bundlespec.wirecompression
1679 bcompression = bundlespec.wirecompression
1680 else:
1680 else:
1681 raise error.ProgrammingError(
1681 raise error.ProgrammingError(
1682 b'bundle: unexpected changegroup version %s' % cgversion
1682 b'bundle: unexpected changegroup version %s' % cgversion
1683 )
1683 )
1684
1684
1685 # TODO compression options should be derived from bundlespec parsing.
1685 # TODO compression options should be derived from bundlespec parsing.
1686 # This is a temporary hack to allow adjusting bundle compression
1686 # This is a temporary hack to allow adjusting bundle compression
1687 # level without a) formalizing the bundlespec changes to declare it
1687 # level without a) formalizing the bundlespec changes to declare it
1688 # b) introducing a command flag.
1688 # b) introducing a command flag.
1689 compopts = {}
1689 compopts = {}
1690 complevel = ui.configint(
1690 complevel = ui.configint(
1691 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1691 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1692 )
1692 )
1693 if complevel is None:
1693 if complevel is None:
1694 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1694 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1695 if complevel is not None:
1695 if complevel is not None:
1696 compopts[b'level'] = complevel
1696 compopts[b'level'] = complevel
1697
1697
1698 compthreads = ui.configint(
1698 compthreads = ui.configint(
1699 b'experimental', b'bundlecompthreads.' + bundlespec.compression
1699 b'experimental', b'bundlecompthreads.' + bundlespec.compression
1700 )
1700 )
1701 if compthreads is None:
1701 if compthreads is None:
1702 compthreads = ui.configint(b'experimental', b'bundlecompthreads')
1702 compthreads = ui.configint(b'experimental', b'bundlecompthreads')
1703 if compthreads is not None:
1703 if compthreads is not None:
1704 compopts[b'threads'] = compthreads
1704 compopts[b'threads'] = compthreads
1705
1705
1706 # Bundling of obsmarker and phases is optional as not all clients
1706 # Bundling of obsmarker and phases is optional as not all clients
1707 # support the necessary features.
1707 # support the necessary features.
1708 cfg = ui.configbool
1708 cfg = ui.configbool
1709 obsolescence_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker')
1709 obsolescence_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker')
1710 bundlespec.set_param(b'obsolescence', obsolescence_cfg, overwrite=False)
1710 bundlespec.set_param(b'obsolescence', obsolescence_cfg, overwrite=False)
1711 obs_mand_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker:mandatory')
1711 obs_mand_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker:mandatory')
1712 bundlespec.set_param(
1712 bundlespec.set_param(
1713 b'obsolescence-mandatory', obs_mand_cfg, overwrite=False
1713 b'obsolescence-mandatory', obs_mand_cfg, overwrite=False
1714 )
1714 )
1715 phases_cfg = cfg(b'experimental', b'bundle-phases')
1715 phases_cfg = cfg(b'experimental', b'bundle-phases')
1716 bundlespec.set_param(b'phases', phases_cfg, overwrite=False)
1716 bundlespec.set_param(b'phases', phases_cfg, overwrite=False)
1717
1717
1718 bundle2.writenewbundle(
1718 bundle2.writenewbundle(
1719 ui,
1719 ui,
1720 repo,
1720 repo,
1721 b'bundle',
1721 b'bundle',
1722 fname,
1722 fname,
1723 bversion,
1723 bversion,
1724 outgoing,
1724 outgoing,
1725 bundlespec.params,
1725 bundlespec.params,
1726 compression=bcompression,
1726 compression=bcompression,
1727 compopts=compopts,
1727 compopts=compopts,
1728 )
1728 )
1729
1729
1730
1730
1731 @command(
1731 @command(
1732 b'cat',
1732 b'cat',
1733 [
1733 [
1734 (
1734 (
1735 b'o',
1735 b'o',
1736 b'output',
1736 b'output',
1737 b'',
1737 b'',
1738 _(b'print output to file with formatted name'),
1738 _(b'print output to file with formatted name'),
1739 _(b'FORMAT'),
1739 _(b'FORMAT'),
1740 ),
1740 ),
1741 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1741 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1742 (b'', b'decode', None, _(b'apply any matching decode filter')),
1742 (b'', b'decode', None, _(b'apply any matching decode filter')),
1743 ]
1743 ]
1744 + walkopts
1744 + walkopts
1745 + formatteropts,
1745 + formatteropts,
1746 _(b'[OPTION]... FILE...'),
1746 _(b'[OPTION]... FILE...'),
1747 helpcategory=command.CATEGORY_FILE_CONTENTS,
1747 helpcategory=command.CATEGORY_FILE_CONTENTS,
1748 inferrepo=True,
1748 inferrepo=True,
1749 intents={INTENT_READONLY},
1749 intents={INTENT_READONLY},
1750 )
1750 )
1751 def cat(ui, repo, file1, *pats, **opts):
1751 def cat(ui, repo, file1, *pats, **opts):
1752 """output the current or given revision of files
1752 """output the current or given revision of files
1753
1753
1754 Print the specified files as they were at the given revision. If
1754 Print the specified files as they were at the given revision. If
1755 no revision is given, the parent of the working directory is used.
1755 no revision is given, the parent of the working directory is used.
1756
1756
1757 Output may be to a file, in which case the name of the file is
1757 Output may be to a file, in which case the name of the file is
1758 given using a template string. See :hg:`help templates`. In addition
1758 given using a template string. See :hg:`help templates`. In addition
1759 to the common template keywords, the following formatting rules are
1759 to the common template keywords, the following formatting rules are
1760 supported:
1760 supported:
1761
1761
1762 :``%%``: literal "%" character
1762 :``%%``: literal "%" character
1763 :``%s``: basename of file being printed
1763 :``%s``: basename of file being printed
1764 :``%d``: dirname of file being printed, or '.' if in repository root
1764 :``%d``: dirname of file being printed, or '.' if in repository root
1765 :``%p``: root-relative path name of file being printed
1765 :``%p``: root-relative path name of file being printed
1766 :``%H``: changeset hash (40 hexadecimal digits)
1766 :``%H``: changeset hash (40 hexadecimal digits)
1767 :``%R``: changeset revision number
1767 :``%R``: changeset revision number
1768 :``%h``: short-form changeset hash (12 hexadecimal digits)
1768 :``%h``: short-form changeset hash (12 hexadecimal digits)
1769 :``%r``: zero-padded changeset revision number
1769 :``%r``: zero-padded changeset revision number
1770 :``%b``: basename of the exporting repository
1770 :``%b``: basename of the exporting repository
1771 :``\\``: literal "\\" character
1771 :``\\``: literal "\\" character
1772
1772
1773 .. container:: verbose
1773 .. container:: verbose
1774
1774
1775 Template:
1775 Template:
1776
1776
1777 The following keywords are supported in addition to the common template
1777 The following keywords are supported in addition to the common template
1778 keywords and functions. See also :hg:`help templates`.
1778 keywords and functions. See also :hg:`help templates`.
1779
1779
1780 :data: String. File content.
1780 :data: String. File content.
1781 :path: String. Repository-absolute path of the file.
1781 :path: String. Repository-absolute path of the file.
1782
1782
1783 Returns 0 on success.
1783 Returns 0 on success.
1784 """
1784 """
1785 opts = pycompat.byteskwargs(opts)
1785 opts = pycompat.byteskwargs(opts)
1786 rev = opts.get(b'rev')
1786 rev = opts.get(b'rev')
1787 if rev:
1787 if rev:
1788 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1788 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1789 ctx = logcmdutil.revsingle(repo, rev)
1789 ctx = logcmdutil.revsingle(repo, rev)
1790 m = scmutil.match(ctx, (file1,) + pats, opts)
1790 m = scmutil.match(ctx, (file1,) + pats, opts)
1791 fntemplate = opts.pop(b'output', b'')
1791 fntemplate = opts.pop(b'output', b'')
1792 if cmdutil.isstdiofilename(fntemplate):
1792 if cmdutil.isstdiofilename(fntemplate):
1793 fntemplate = b''
1793 fntemplate = b''
1794
1794
1795 if fntemplate:
1795 if fntemplate:
1796 fm = formatter.nullformatter(ui, b'cat', opts)
1796 fm = formatter.nullformatter(ui, b'cat', opts)
1797 else:
1797 else:
1798 ui.pager(b'cat')
1798 ui.pager(b'cat')
1799 fm = ui.formatter(b'cat', opts)
1799 fm = ui.formatter(b'cat', opts)
1800 with fm:
1800 with fm:
1801 return cmdutil.cat(
1801 return cmdutil.cat(
1802 ui, repo, ctx, m, fm, fntemplate, b'', **pycompat.strkwargs(opts)
1802 ui, repo, ctx, m, fm, fntemplate, b'', **pycompat.strkwargs(opts)
1803 )
1803 )
1804
1804
1805
1805
1806 @command(
1806 @command(
1807 b'clone',
1807 b'clone',
1808 [
1808 [
1809 (
1809 (
1810 b'U',
1810 b'U',
1811 b'noupdate',
1811 b'noupdate',
1812 None,
1812 None,
1813 _(
1813 _(
1814 b'the clone will include an empty working '
1814 b'the clone will include an empty working '
1815 b'directory (only a repository)'
1815 b'directory (only a repository)'
1816 ),
1816 ),
1817 ),
1817 ),
1818 (
1818 (
1819 b'u',
1819 b'u',
1820 b'updaterev',
1820 b'updaterev',
1821 b'',
1821 b'',
1822 _(b'revision, tag, or branch to check out'),
1822 _(b'revision, tag, or branch to check out'),
1823 _(b'REV'),
1823 _(b'REV'),
1824 ),
1824 ),
1825 (
1825 (
1826 b'r',
1826 b'r',
1827 b'rev',
1827 b'rev',
1828 [],
1828 [],
1829 _(
1829 _(
1830 b'do not clone everything, but include this changeset'
1830 b'do not clone everything, but include this changeset'
1831 b' and its ancestors'
1831 b' and its ancestors'
1832 ),
1832 ),
1833 _(b'REV'),
1833 _(b'REV'),
1834 ),
1834 ),
1835 (
1835 (
1836 b'b',
1836 b'b',
1837 b'branch',
1837 b'branch',
1838 [],
1838 [],
1839 _(
1839 _(
1840 b'do not clone everything, but include this branch\'s'
1840 b'do not clone everything, but include this branch\'s'
1841 b' changesets and their ancestors'
1841 b' changesets and their ancestors'
1842 ),
1842 ),
1843 _(b'BRANCH'),
1843 _(b'BRANCH'),
1844 ),
1844 ),
1845 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1845 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1846 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1846 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1847 (b'', b'stream', None, _(b'clone with minimal data processing')),
1847 (b'', b'stream', None, _(b'clone with minimal data processing')),
1848 ]
1848 ]
1849 + remoteopts,
1849 + remoteopts,
1850 _(b'[OPTION]... SOURCE [DEST]'),
1850 _(b'[OPTION]... SOURCE [DEST]'),
1851 helpcategory=command.CATEGORY_REPO_CREATION,
1851 helpcategory=command.CATEGORY_REPO_CREATION,
1852 helpbasic=True,
1852 helpbasic=True,
1853 norepo=True,
1853 norepo=True,
1854 )
1854 )
1855 def clone(ui, source, dest=None, **opts):
1855 def clone(ui, source, dest=None, **opts):
1856 """make a copy of an existing repository
1856 """make a copy of an existing repository
1857
1857
1858 Create a copy of an existing repository in a new directory.
1858 Create a copy of an existing repository in a new directory.
1859
1859
1860 If no destination directory name is specified, it defaults to the
1860 If no destination directory name is specified, it defaults to the
1861 basename of the source.
1861 basename of the source.
1862
1862
1863 The location of the source is added to the new repository's
1863 The location of the source is added to the new repository's
1864 ``.hg/hgrc`` file, as the default to be used for future pulls.
1864 ``.hg/hgrc`` file, as the default to be used for future pulls.
1865
1865
1866 Only local paths and ``ssh://`` URLs are supported as
1866 Only local paths and ``ssh://`` URLs are supported as
1867 destinations. For ``ssh://`` destinations, no working directory or
1867 destinations. For ``ssh://`` destinations, no working directory or
1868 ``.hg/hgrc`` will be created on the remote side.
1868 ``.hg/hgrc`` will be created on the remote side.
1869
1869
1870 If the source repository has a bookmark called '@' set, that
1870 If the source repository has a bookmark called '@' set, that
1871 revision will be checked out in the new repository by default.
1871 revision will be checked out in the new repository by default.
1872
1872
1873 To check out a particular version, use -u/--update, or
1873 To check out a particular version, use -u/--update, or
1874 -U/--noupdate to create a clone with no working directory.
1874 -U/--noupdate to create a clone with no working directory.
1875
1875
1876 To pull only a subset of changesets, specify one or more revisions
1876 To pull only a subset of changesets, specify one or more revisions
1877 identifiers with -r/--rev or branches with -b/--branch. The
1877 identifiers with -r/--rev or branches with -b/--branch. The
1878 resulting clone will contain only the specified changesets and
1878 resulting clone will contain only the specified changesets and
1879 their ancestors. These options (or 'clone src#rev dest') imply
1879 their ancestors. These options (or 'clone src#rev dest') imply
1880 --pull, even for local source repositories.
1880 --pull, even for local source repositories.
1881
1881
1882 In normal clone mode, the remote normalizes repository data into a common
1882 In normal clone mode, the remote normalizes repository data into a common
1883 exchange format and the receiving end translates this data into its local
1883 exchange format and the receiving end translates this data into its local
1884 storage format. --stream activates a different clone mode that essentially
1884 storage format. --stream activates a different clone mode that essentially
1885 copies repository files from the remote with minimal data processing. This
1885 copies repository files from the remote with minimal data processing. This
1886 significantly reduces the CPU cost of a clone both remotely and locally.
1886 significantly reduces the CPU cost of a clone both remotely and locally.
1887 However, it often increases the transferred data size by 30-40%. This can
1887 However, it often increases the transferred data size by 30-40%. This can
1888 result in substantially faster clones where I/O throughput is plentiful,
1888 result in substantially faster clones where I/O throughput is plentiful,
1889 especially for larger repositories. A side-effect of --stream clones is
1889 especially for larger repositories. A side-effect of --stream clones is
1890 that storage settings and requirements on the remote are applied locally:
1890 that storage settings and requirements on the remote are applied locally:
1891 a modern client may inherit legacy or inefficient storage used by the
1891 a modern client may inherit legacy or inefficient storage used by the
1892 remote or a legacy Mercurial client may not be able to clone from a
1892 remote or a legacy Mercurial client may not be able to clone from a
1893 modern Mercurial remote.
1893 modern Mercurial remote.
1894
1894
1895 .. note::
1895 .. note::
1896
1896
1897 Specifying a tag will include the tagged changeset but not the
1897 Specifying a tag will include the tagged changeset but not the
1898 changeset containing the tag.
1898 changeset containing the tag.
1899
1899
1900 .. container:: verbose
1900 .. container:: verbose
1901
1901
1902 For efficiency, hardlinks are used for cloning whenever the
1902 For efficiency, hardlinks are used for cloning whenever the
1903 source and destination are on the same filesystem (note this
1903 source and destination are on the same filesystem (note this
1904 applies only to the repository data, not to the working
1904 applies only to the repository data, not to the working
1905 directory). Some filesystems, such as AFS, implement hardlinking
1905 directory). Some filesystems, such as AFS, implement hardlinking
1906 incorrectly, but do not report errors. In these cases, use the
1906 incorrectly, but do not report errors. In these cases, use the
1907 --pull option to avoid hardlinking.
1907 --pull option to avoid hardlinking.
1908
1908
1909 Mercurial will update the working directory to the first applicable
1909 Mercurial will update the working directory to the first applicable
1910 revision from this list:
1910 revision from this list:
1911
1911
1912 a) null if -U or the source repository has no changesets
1912 a) null if -U or the source repository has no changesets
1913 b) if -u . and the source repository is local, the first parent of
1913 b) if -u . and the source repository is local, the first parent of
1914 the source repository's working directory
1914 the source repository's working directory
1915 c) the changeset specified with -u (if a branch name, this means the
1915 c) the changeset specified with -u (if a branch name, this means the
1916 latest head of that branch)
1916 latest head of that branch)
1917 d) the changeset specified with -r
1917 d) the changeset specified with -r
1918 e) the tipmost head specified with -b
1918 e) the tipmost head specified with -b
1919 f) the tipmost head specified with the url#branch source syntax
1919 f) the tipmost head specified with the url#branch source syntax
1920 g) the revision marked with the '@' bookmark, if present
1920 g) the revision marked with the '@' bookmark, if present
1921 h) the tipmost head of the default branch
1921 h) the tipmost head of the default branch
1922 i) tip
1922 i) tip
1923
1923
1924 When cloning from servers that support it, Mercurial may fetch
1924 When cloning from servers that support it, Mercurial may fetch
1925 pre-generated data from a server-advertised URL or inline from the
1925 pre-generated data from a server-advertised URL or inline from the
1926 same stream. When this is done, hooks operating on incoming changesets
1926 same stream. When this is done, hooks operating on incoming changesets
1927 and changegroups may fire more than once, once for each pre-generated
1927 and changegroups may fire more than once, once for each pre-generated
1928 bundle and as well as for any additional remaining data. In addition,
1928 bundle and as well as for any additional remaining data. In addition,
1929 if an error occurs, the repository may be rolled back to a partial
1929 if an error occurs, the repository may be rolled back to a partial
1930 clone. This behavior may change in future releases.
1930 clone. This behavior may change in future releases.
1931 See :hg:`help -e clonebundles` for more.
1931 See :hg:`help -e clonebundles` for more.
1932
1932
1933 Examples:
1933 Examples:
1934
1934
1935 - clone a remote repository to a new directory named hg/::
1935 - clone a remote repository to a new directory named hg/::
1936
1936
1937 hg clone https://www.mercurial-scm.org/repo/hg/
1937 hg clone https://www.mercurial-scm.org/repo/hg/
1938
1938
1939 - create a lightweight local clone::
1939 - create a lightweight local clone::
1940
1940
1941 hg clone project/ project-feature/
1941 hg clone project/ project-feature/
1942
1942
1943 - clone from an absolute path on an ssh server (note double-slash)::
1943 - clone from an absolute path on an ssh server (note double-slash)::
1944
1944
1945 hg clone ssh://user@server//home/projects/alpha/
1945 hg clone ssh://user@server//home/projects/alpha/
1946
1946
1947 - do a streaming clone while checking out a specified version::
1947 - do a streaming clone while checking out a specified version::
1948
1948
1949 hg clone --stream http://server/repo -u 1.5
1949 hg clone --stream http://server/repo -u 1.5
1950
1950
1951 - create a repository without changesets after a particular revision::
1951 - create a repository without changesets after a particular revision::
1952
1952
1953 hg clone -r 04e544 experimental/ good/
1953 hg clone -r 04e544 experimental/ good/
1954
1954
1955 - clone (and track) a particular named branch::
1955 - clone (and track) a particular named branch::
1956
1956
1957 hg clone https://www.mercurial-scm.org/repo/hg/#stable
1957 hg clone https://www.mercurial-scm.org/repo/hg/#stable
1958
1958
1959 See :hg:`help urls` for details on specifying URLs.
1959 See :hg:`help urls` for details on specifying URLs.
1960
1960
1961 Returns 0 on success.
1961 Returns 0 on success.
1962 """
1962 """
1963 opts = pycompat.byteskwargs(opts)
1963 opts = pycompat.byteskwargs(opts)
1964 cmdutil.check_at_most_one_arg(opts, b'noupdate', b'updaterev')
1964 cmdutil.check_at_most_one_arg(opts, b'noupdate', b'updaterev')
1965
1965
1966 # --include/--exclude can come from narrow or sparse.
1966 # --include/--exclude can come from narrow or sparse.
1967 includepats, excludepats = None, None
1967 includepats, excludepats = None, None
1968
1968
1969 # hg.clone() differentiates between None and an empty set. So make sure
1969 # hg.clone() differentiates between None and an empty set. So make sure
1970 # patterns are sets if narrow is requested without patterns.
1970 # patterns are sets if narrow is requested without patterns.
1971 if opts.get(b'narrow'):
1971 if opts.get(b'narrow'):
1972 includepats = set()
1972 includepats = set()
1973 excludepats = set()
1973 excludepats = set()
1974
1974
1975 if opts.get(b'include'):
1975 if opts.get(b'include'):
1976 includepats = narrowspec.parsepatterns(opts.get(b'include'))
1976 includepats = narrowspec.parsepatterns(opts.get(b'include'))
1977 if opts.get(b'exclude'):
1977 if opts.get(b'exclude'):
1978 excludepats = narrowspec.parsepatterns(opts.get(b'exclude'))
1978 excludepats = narrowspec.parsepatterns(opts.get(b'exclude'))
1979
1979
1980 r = hg.clone(
1980 r = hg.clone(
1981 ui,
1981 ui,
1982 opts,
1982 opts,
1983 source,
1983 source,
1984 dest,
1984 dest,
1985 pull=opts.get(b'pull'),
1985 pull=opts.get(b'pull'),
1986 stream=opts.get(b'stream') or opts.get(b'uncompressed'),
1986 stream=opts.get(b'stream') or opts.get(b'uncompressed'),
1987 revs=opts.get(b'rev'),
1987 revs=opts.get(b'rev'),
1988 update=opts.get(b'updaterev') or not opts.get(b'noupdate'),
1988 update=opts.get(b'updaterev') or not opts.get(b'noupdate'),
1989 branch=opts.get(b'branch'),
1989 branch=opts.get(b'branch'),
1990 shareopts=opts.get(b'shareopts'),
1990 shareopts=opts.get(b'shareopts'),
1991 storeincludepats=includepats,
1991 storeincludepats=includepats,
1992 storeexcludepats=excludepats,
1992 storeexcludepats=excludepats,
1993 depth=opts.get(b'depth') or None,
1993 depth=opts.get(b'depth') or None,
1994 )
1994 )
1995
1995
1996 return r is None
1996 return r is None
1997
1997
1998
1998
1999 @command(
1999 @command(
2000 b'commit|ci',
2000 b'commit|ci',
2001 [
2001 [
2002 (
2002 (
2003 b'A',
2003 b'A',
2004 b'addremove',
2004 b'addremove',
2005 None,
2005 None,
2006 _(b'mark new/missing files as added/removed before committing'),
2006 _(b'mark new/missing files as added/removed before committing'),
2007 ),
2007 ),
2008 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
2008 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
2009 (b'', b'amend', None, _(b'amend the parent of the working directory')),
2009 (b'', b'amend', None, _(b'amend the parent of the working directory')),
2010 (b's', b'secret', None, _(b'use the secret phase for committing')),
2010 (b's', b'secret', None, _(b'use the secret phase for committing')),
2011 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
2011 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
2012 (
2012 (
2013 b'',
2013 b'',
2014 b'force-close-branch',
2014 b'force-close-branch',
2015 None,
2015 None,
2016 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
2016 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
2017 ),
2017 ),
2018 (b'i', b'interactive', None, _(b'use interactive mode')),
2018 (b'i', b'interactive', None, _(b'use interactive mode')),
2019 ]
2019 ]
2020 + walkopts
2020 + walkopts
2021 + commitopts
2021 + commitopts
2022 + commitopts2
2022 + commitopts2
2023 + subrepoopts,
2023 + subrepoopts,
2024 _(b'[OPTION]... [FILE]...'),
2024 _(b'[OPTION]... [FILE]...'),
2025 helpcategory=command.CATEGORY_COMMITTING,
2025 helpcategory=command.CATEGORY_COMMITTING,
2026 helpbasic=True,
2026 helpbasic=True,
2027 inferrepo=True,
2027 inferrepo=True,
2028 )
2028 )
2029 def commit(ui, repo, *pats, **opts):
2029 def commit(ui, repo, *pats, **opts):
2030 """commit the specified files or all outstanding changes
2030 """commit the specified files or all outstanding changes
2031
2031
2032 Commit changes to the given files into the repository. Unlike a
2032 Commit changes to the given files into the repository. Unlike a
2033 centralized SCM, this operation is a local operation. See
2033 centralized SCM, this operation is a local operation. See
2034 :hg:`push` for a way to actively distribute your changes.
2034 :hg:`push` for a way to actively distribute your changes.
2035
2035
2036 If a list of files is omitted, all changes reported by :hg:`status`
2036 If a list of files is omitted, all changes reported by :hg:`status`
2037 will be committed.
2037 will be committed.
2038
2038
2039 If you are committing the result of a merge, do not provide any
2039 If you are committing the result of a merge, do not provide any
2040 filenames or -I/-X filters.
2040 filenames or -I/-X filters.
2041
2041
2042 If no commit message is specified, Mercurial starts your
2042 If no commit message is specified, Mercurial starts your
2043 configured editor where you can enter a message. In case your
2043 configured editor where you can enter a message. In case your
2044 commit fails, you will find a backup of your message in
2044 commit fails, you will find a backup of your message in
2045 ``.hg/last-message.txt``.
2045 ``.hg/last-message.txt``.
2046
2046
2047 The --close-branch flag can be used to mark the current branch
2047 The --close-branch flag can be used to mark the current branch
2048 head closed. When all heads of a branch are closed, the branch
2048 head closed. When all heads of a branch are closed, the branch
2049 will be considered closed and no longer listed.
2049 will be considered closed and no longer listed.
2050
2050
2051 The --amend flag can be used to amend the parent of the
2051 The --amend flag can be used to amend the parent of the
2052 working directory with a new commit that contains the changes
2052 working directory with a new commit that contains the changes
2053 in the parent in addition to those currently reported by :hg:`status`,
2053 in the parent in addition to those currently reported by :hg:`status`,
2054 if there are any. The old commit is stored in a backup bundle in
2054 if there are any. The old commit is stored in a backup bundle in
2055 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
2055 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
2056 on how to restore it).
2056 on how to restore it).
2057
2057
2058 Message, user and date are taken from the amended commit unless
2058 Message, user and date are taken from the amended commit unless
2059 specified. When a message isn't specified on the command line,
2059 specified. When a message isn't specified on the command line,
2060 the editor will open with the message of the amended commit.
2060 the editor will open with the message of the amended commit.
2061
2061
2062 It is not possible to amend public changesets (see :hg:`help phases`)
2062 It is not possible to amend public changesets (see :hg:`help phases`)
2063 or changesets that have children.
2063 or changesets that have children.
2064
2064
2065 See :hg:`help dates` for a list of formats valid for -d/--date.
2065 See :hg:`help dates` for a list of formats valid for -d/--date.
2066
2066
2067 Returns 0 on success, 1 if nothing changed.
2067 Returns 0 on success, 1 if nothing changed.
2068
2068
2069 .. container:: verbose
2069 .. container:: verbose
2070
2070
2071 Examples:
2071 Examples:
2072
2072
2073 - commit all files ending in .py::
2073 - commit all files ending in .py::
2074
2074
2075 hg commit --include "set:**.py"
2075 hg commit --include "set:**.py"
2076
2076
2077 - commit all non-binary files::
2077 - commit all non-binary files::
2078
2078
2079 hg commit --exclude "set:binary()"
2079 hg commit --exclude "set:binary()"
2080
2080
2081 - amend the current commit and set the date to now::
2081 - amend the current commit and set the date to now::
2082
2082
2083 hg commit --amend --date now
2083 hg commit --amend --date now
2084 """
2084 """
2085 with repo.wlock(), repo.lock():
2085 with repo.wlock(), repo.lock():
2086 return _docommit(ui, repo, *pats, **opts)
2086 return _docommit(ui, repo, *pats, **opts)
2087
2087
2088
2088
2089 def _docommit(ui, repo, *pats, **opts):
2089 def _docommit(ui, repo, *pats, **opts):
2090 if opts.get('interactive'):
2090 if opts.get('interactive'):
2091 opts.pop('interactive')
2091 opts.pop('interactive')
2092 ret = cmdutil.dorecord(
2092 ret = cmdutil.dorecord(
2093 ui, repo, commit, None, False, cmdutil.recordfilter, *pats, **opts
2093 ui, repo, commit, None, False, cmdutil.recordfilter, *pats, **opts
2094 )
2094 )
2095 # ret can be 0 (no changes to record) or the value returned by
2095 # ret can be 0 (no changes to record) or the value returned by
2096 # commit(), 1 if nothing changed or None on success.
2096 # commit(), 1 if nothing changed or None on success.
2097 return 1 if ret == 0 else ret
2097 return 1 if ret == 0 else ret
2098
2098
2099 if opts.get('subrepos'):
2099 if opts.get('subrepos'):
2100 cmdutil.check_incompatible_arguments(opts, 'subrepos', ['amend'])
2100 cmdutil.check_incompatible_arguments(opts, 'subrepos', ['amend'])
2101 # Let --subrepos on the command line override config setting.
2101 # Let --subrepos on the command line override config setting.
2102 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
2102 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
2103
2103
2104 cmdutil.checkunfinished(repo, commit=True)
2104 cmdutil.checkunfinished(repo, commit=True)
2105
2105
2106 branch = repo[None].branch()
2106 branch = repo[None].branch()
2107 bheads = repo.branchheads(branch)
2107 bheads = repo.branchheads(branch)
2108 tip = repo.changelog.tip()
2108 tip = repo.changelog.tip()
2109
2109
2110 extra = {}
2110 extra = {}
2111 if opts.get('close_branch') or opts.get('force_close_branch'):
2111 if opts.get('close_branch') or opts.get('force_close_branch'):
2112 extra[b'close'] = b'1'
2112 extra[b'close'] = b'1'
2113
2113
2114 if repo[b'.'].closesbranch():
2114 if repo[b'.'].closesbranch():
2115 # Not ideal, but let us do an extra status early to prevent early
2115 # Not ideal, but let us do an extra status early to prevent early
2116 # bail out.
2116 # bail out.
2117 matcher = scmutil.match(repo[None], pats, opts)
2117 matcher = scmutil.match(
2118 repo[None], pats, pycompat.byteskwargs(opts)
2119 )
2118 s = repo.status(match=matcher)
2120 s = repo.status(match=matcher)
2119 if s.modified or s.added or s.removed:
2121 if s.modified or s.added or s.removed:
2120 bheads = repo.branchheads(branch, closed=True)
2122 bheads = repo.branchheads(branch, closed=True)
2121 else:
2123 else:
2122 msg = _(b'current revision is already a branch closing head')
2124 msg = _(b'current revision is already a branch closing head')
2123 raise error.InputError(msg)
2125 raise error.InputError(msg)
2124
2126
2125 if not bheads:
2127 if not bheads:
2126 raise error.InputError(
2128 raise error.InputError(
2127 _(b'branch "%s" has no heads to close') % branch
2129 _(b'branch "%s" has no heads to close') % branch
2128 )
2130 )
2129 elif (
2131 elif (
2130 branch == repo[b'.'].branch()
2132 branch == repo[b'.'].branch()
2131 and repo[b'.'].node() not in bheads
2133 and repo[b'.'].node() not in bheads
2132 and not opts.get('force_close_branch')
2134 and not opts.get('force_close_branch')
2133 ):
2135 ):
2134 hint = _(
2136 hint = _(
2135 b'use --force-close-branch to close branch from a non-head'
2137 b'use --force-close-branch to close branch from a non-head'
2136 b' changeset'
2138 b' changeset'
2137 )
2139 )
2138 raise error.InputError(_(b'can only close branch heads'), hint=hint)
2140 raise error.InputError(_(b'can only close branch heads'), hint=hint)
2139 elif opts.get('amend'):
2141 elif opts.get('amend'):
2140 if (
2142 if (
2141 repo[b'.'].p1().branch() != branch
2143 repo[b'.'].p1().branch() != branch
2142 and repo[b'.'].p2().branch() != branch
2144 and repo[b'.'].p2().branch() != branch
2143 ):
2145 ):
2144 raise error.InputError(_(b'can only close branch heads'))
2146 raise error.InputError(_(b'can only close branch heads'))
2145
2147
2146 if opts.get('amend'):
2148 if opts.get('amend'):
2147 if ui.configbool(b'ui', b'commitsubrepos'):
2149 if ui.configbool(b'ui', b'commitsubrepos'):
2148 raise error.InputError(
2150 raise error.InputError(
2149 _(b'cannot amend with ui.commitsubrepos enabled')
2151 _(b'cannot amend with ui.commitsubrepos enabled')
2150 )
2152 )
2151
2153
2152 old = repo[b'.']
2154 old = repo[b'.']
2153 rewriteutil.precheck(repo, [old.rev()], b'amend')
2155 rewriteutil.precheck(repo, [old.rev()], b'amend')
2154
2156
2155 # Currently histedit gets confused if an amend happens while histedit
2157 # Currently histedit gets confused if an amend happens while histedit
2156 # is in progress. Since we have a checkunfinished command, we are
2158 # is in progress. Since we have a checkunfinished command, we are
2157 # temporarily honoring it.
2159 # temporarily honoring it.
2158 #
2160 #
2159 # Note: eventually this guard will be removed. Please do not expect
2161 # Note: eventually this guard will be removed. Please do not expect
2160 # this behavior to remain.
2162 # this behavior to remain.
2161 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2163 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2162 cmdutil.checkunfinished(repo)
2164 cmdutil.checkunfinished(repo)
2163
2165
2164 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2166 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2165 opts = pycompat.byteskwargs(opts)
2167 opts = pycompat.byteskwargs(opts)
2166 if node == old.node():
2168 if node == old.node():
2167 ui.status(_(b"nothing changed\n"))
2169 ui.status(_(b"nothing changed\n"))
2168 return 1
2170 return 1
2169 else:
2171 else:
2170
2172
2171 def commitfunc(ui, repo, message, match, opts):
2173 def commitfunc(ui, repo, message, match, opts):
2172 overrides = {}
2174 overrides = {}
2173 if opts.get(b'secret'):
2175 if opts.get(b'secret'):
2174 overrides[(b'phases', b'new-commit')] = b'secret'
2176 overrides[(b'phases', b'new-commit')] = b'secret'
2175
2177
2176 baseui = repo.baseui
2178 baseui = repo.baseui
2177 with baseui.configoverride(overrides, b'commit'):
2179 with baseui.configoverride(overrides, b'commit'):
2178 with ui.configoverride(overrides, b'commit'):
2180 with ui.configoverride(overrides, b'commit'):
2179 editform = cmdutil.mergeeditform(
2181 editform = cmdutil.mergeeditform(
2180 repo[None], b'commit.normal'
2182 repo[None], b'commit.normal'
2181 )
2183 )
2182 editor = cmdutil.getcommiteditor(
2184 editor = cmdutil.getcommiteditor(
2183 editform=editform, **pycompat.strkwargs(opts)
2185 editform=editform, **pycompat.strkwargs(opts)
2184 )
2186 )
2185 return repo.commit(
2187 return repo.commit(
2186 message,
2188 message,
2187 opts.get(b'user'),
2189 opts.get(b'user'),
2188 opts.get(b'date'),
2190 opts.get(b'date'),
2189 match,
2191 match,
2190 editor=editor,
2192 editor=editor,
2191 extra=extra,
2193 extra=extra,
2192 )
2194 )
2193
2195
2194 opts = pycompat.byteskwargs(opts)
2196 opts = pycompat.byteskwargs(opts)
2195 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
2197 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
2196
2198
2197 if not node:
2199 if not node:
2198 stat = cmdutil.postcommitstatus(repo, pats, opts)
2200 stat = cmdutil.postcommitstatus(repo, pats, opts)
2199 if stat.deleted:
2201 if stat.deleted:
2200 ui.status(
2202 ui.status(
2201 _(
2203 _(
2202 b"nothing changed (%d missing files, see "
2204 b"nothing changed (%d missing files, see "
2203 b"'hg status')\n"
2205 b"'hg status')\n"
2204 )
2206 )
2205 % len(stat.deleted)
2207 % len(stat.deleted)
2206 )
2208 )
2207 else:
2209 else:
2208 ui.status(_(b"nothing changed\n"))
2210 ui.status(_(b"nothing changed\n"))
2209 return 1
2211 return 1
2210
2212
2211 cmdutil.commitstatus(repo, node, branch, bheads, tip, opts)
2213 cmdutil.commitstatus(repo, node, branch, bheads, tip, opts)
2212
2214
2213 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2215 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2214 status(
2216 status(
2215 ui,
2217 ui,
2216 repo,
2218 repo,
2217 modified=True,
2219 modified=True,
2218 added=True,
2220 added=True,
2219 removed=True,
2221 removed=True,
2220 deleted=True,
2222 deleted=True,
2221 unknown=True,
2223 unknown=True,
2222 subrepos=opts.get(b'subrepos'),
2224 subrepos=opts.get(b'subrepos'),
2223 )
2225 )
2224
2226
2225
2227
2226 @command(
2228 @command(
2227 b'config|showconfig|debugconfig',
2229 b'config|showconfig|debugconfig',
2228 [
2230 [
2229 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2231 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2230 # This is experimental because we need
2232 # This is experimental because we need
2231 # * reasonable behavior around aliases,
2233 # * reasonable behavior around aliases,
2232 # * decide if we display [debug] [experimental] and [devel] section par
2234 # * decide if we display [debug] [experimental] and [devel] section par
2233 # default
2235 # default
2234 # * some way to display "generic" config entry (the one matching
2236 # * some way to display "generic" config entry (the one matching
2235 # regexp,
2237 # regexp,
2236 # * proper display of the different value type
2238 # * proper display of the different value type
2237 # * a better way to handle <DYNAMIC> values (and variable types),
2239 # * a better way to handle <DYNAMIC> values (and variable types),
2238 # * maybe some type information ?
2240 # * maybe some type information ?
2239 (
2241 (
2240 b'',
2242 b'',
2241 b'exp-all-known',
2243 b'exp-all-known',
2242 None,
2244 None,
2243 _(b'show all known config option (EXPERIMENTAL)'),
2245 _(b'show all known config option (EXPERIMENTAL)'),
2244 ),
2246 ),
2245 (b'e', b'edit', None, _(b'edit user config')),
2247 (b'e', b'edit', None, _(b'edit user config')),
2246 (b'l', b'local', None, _(b'edit repository config')),
2248 (b'l', b'local', None, _(b'edit repository config')),
2247 (b'', b'source', None, _(b'show source of configuration value')),
2249 (b'', b'source', None, _(b'show source of configuration value')),
2248 (
2250 (
2249 b'',
2251 b'',
2250 b'shared',
2252 b'shared',
2251 None,
2253 None,
2252 _(b'edit shared source repository config (EXPERIMENTAL)'),
2254 _(b'edit shared source repository config (EXPERIMENTAL)'),
2253 ),
2255 ),
2254 (b'', b'non-shared', None, _(b'edit non shared config (EXPERIMENTAL)')),
2256 (b'', b'non-shared', None, _(b'edit non shared config (EXPERIMENTAL)')),
2255 (b'g', b'global', None, _(b'edit global config')),
2257 (b'g', b'global', None, _(b'edit global config')),
2256 ]
2258 ]
2257 + formatteropts,
2259 + formatteropts,
2258 _(b'[-u] [NAME]...'),
2260 _(b'[-u] [NAME]...'),
2259 helpcategory=command.CATEGORY_HELP,
2261 helpcategory=command.CATEGORY_HELP,
2260 optionalrepo=True,
2262 optionalrepo=True,
2261 intents={INTENT_READONLY},
2263 intents={INTENT_READONLY},
2262 )
2264 )
2263 def config(ui, repo, *values, **opts):
2265 def config(ui, repo, *values, **opts):
2264 """show combined config settings from all hgrc files
2266 """show combined config settings from all hgrc files
2265
2267
2266 With no arguments, print names and values of all config items.
2268 With no arguments, print names and values of all config items.
2267
2269
2268 With one argument of the form section.name, print just the value
2270 With one argument of the form section.name, print just the value
2269 of that config item.
2271 of that config item.
2270
2272
2271 With multiple arguments, print names and values of all config
2273 With multiple arguments, print names and values of all config
2272 items with matching section names or section.names.
2274 items with matching section names or section.names.
2273
2275
2274 With --edit, start an editor on the user-level config file. With
2276 With --edit, start an editor on the user-level config file. With
2275 --global, edit the system-wide config file. With --local, edit the
2277 --global, edit the system-wide config file. With --local, edit the
2276 repository-level config file.
2278 repository-level config file.
2277
2279
2278 With --source, the source (filename and line number) is printed
2280 With --source, the source (filename and line number) is printed
2279 for each config item.
2281 for each config item.
2280
2282
2281 See :hg:`help config` for more information about config files.
2283 See :hg:`help config` for more information about config files.
2282
2284
2283 .. container:: verbose
2285 .. container:: verbose
2284
2286
2285 --non-shared flag is used to edit `.hg/hgrc-not-shared` config file.
2287 --non-shared flag is used to edit `.hg/hgrc-not-shared` config file.
2286 This file is not shared across shares when in share-safe mode.
2288 This file is not shared across shares when in share-safe mode.
2287
2289
2288 Template:
2290 Template:
2289
2291
2290 The following keywords are supported. See also :hg:`help templates`.
2292 The following keywords are supported. See also :hg:`help templates`.
2291
2293
2292 :name: String. Config name.
2294 :name: String. Config name.
2293 :source: String. Filename and line number where the item is defined.
2295 :source: String. Filename and line number where the item is defined.
2294 :value: String. Config value.
2296 :value: String. Config value.
2295
2297
2296 The --shared flag can be used to edit the config file of shared source
2298 The --shared flag can be used to edit the config file of shared source
2297 repository. It only works when you have shared using the experimental
2299 repository. It only works when you have shared using the experimental
2298 share safe feature.
2300 share safe feature.
2299
2301
2300 Returns 0 on success, 1 if NAME does not exist.
2302 Returns 0 on success, 1 if NAME does not exist.
2301
2303
2302 """
2304 """
2303
2305
2304 opts = pycompat.byteskwargs(opts)
2306 opts = pycompat.byteskwargs(opts)
2305 editopts = (b'edit', b'local', b'global', b'shared', b'non_shared')
2307 editopts = (b'edit', b'local', b'global', b'shared', b'non_shared')
2306 if any(opts.get(o) for o in editopts):
2308 if any(opts.get(o) for o in editopts):
2307 cmdutil.check_at_most_one_arg(opts, *editopts[1:])
2309 cmdutil.check_at_most_one_arg(opts, *editopts[1:])
2308 if opts.get(b'local'):
2310 if opts.get(b'local'):
2309 if not repo:
2311 if not repo:
2310 raise error.InputError(
2312 raise error.InputError(
2311 _(b"can't use --local outside a repository")
2313 _(b"can't use --local outside a repository")
2312 )
2314 )
2313 paths = [repo.vfs.join(b'hgrc')]
2315 paths = [repo.vfs.join(b'hgrc')]
2314 elif opts.get(b'global'):
2316 elif opts.get(b'global'):
2315 paths = rcutil.systemrcpath()
2317 paths = rcutil.systemrcpath()
2316 elif opts.get(b'shared'):
2318 elif opts.get(b'shared'):
2317 if not repo.shared():
2319 if not repo.shared():
2318 raise error.InputError(
2320 raise error.InputError(
2319 _(b"repository is not shared; can't use --shared")
2321 _(b"repository is not shared; can't use --shared")
2320 )
2322 )
2321 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements:
2323 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements:
2322 raise error.InputError(
2324 raise error.InputError(
2323 _(
2325 _(
2324 b"share safe feature not enabled; "
2326 b"share safe feature not enabled; "
2325 b"unable to edit shared source repository config"
2327 b"unable to edit shared source repository config"
2326 )
2328 )
2327 )
2329 )
2328 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')]
2330 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')]
2329 elif opts.get(b'non_shared'):
2331 elif opts.get(b'non_shared'):
2330 paths = [repo.vfs.join(b'hgrc-not-shared')]
2332 paths = [repo.vfs.join(b'hgrc-not-shared')]
2331 else:
2333 else:
2332 paths = rcutil.userrcpath()
2334 paths = rcutil.userrcpath()
2333
2335
2334 for f in paths:
2336 for f in paths:
2335 if os.path.exists(f):
2337 if os.path.exists(f):
2336 break
2338 break
2337 else:
2339 else:
2338 if opts.get(b'global'):
2340 if opts.get(b'global'):
2339 samplehgrc = uimod.samplehgrcs[b'global']
2341 samplehgrc = uimod.samplehgrcs[b'global']
2340 elif opts.get(b'local'):
2342 elif opts.get(b'local'):
2341 samplehgrc = uimod.samplehgrcs[b'local']
2343 samplehgrc = uimod.samplehgrcs[b'local']
2342 else:
2344 else:
2343 samplehgrc = uimod.samplehgrcs[b'user']
2345 samplehgrc = uimod.samplehgrcs[b'user']
2344
2346
2345 f = paths[0]
2347 f = paths[0]
2346 fp = open(f, b"wb")
2348 fp = open(f, b"wb")
2347 fp.write(util.tonativeeol(samplehgrc))
2349 fp.write(util.tonativeeol(samplehgrc))
2348 fp.close()
2350 fp.close()
2349
2351
2350 editor = ui.geteditor()
2352 editor = ui.geteditor()
2351 ui.system(
2353 ui.system(
2352 b"%s \"%s\"" % (editor, f),
2354 b"%s \"%s\"" % (editor, f),
2353 onerr=error.InputError,
2355 onerr=error.InputError,
2354 errprefix=_(b"edit failed"),
2356 errprefix=_(b"edit failed"),
2355 blockedtag=b'config_edit',
2357 blockedtag=b'config_edit',
2356 )
2358 )
2357 return
2359 return
2358 ui.pager(b'config')
2360 ui.pager(b'config')
2359 fm = ui.formatter(b'config', opts)
2361 fm = ui.formatter(b'config', opts)
2360 for t, f in rcutil.rccomponents():
2362 for t, f in rcutil.rccomponents():
2361 if t == b'path':
2363 if t == b'path':
2362 ui.debug(b'read config from: %s\n' % f)
2364 ui.debug(b'read config from: %s\n' % f)
2363 elif t == b'resource':
2365 elif t == b'resource':
2364 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
2366 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
2365 elif t == b'items':
2367 elif t == b'items':
2366 # Don't print anything for 'items'.
2368 # Don't print anything for 'items'.
2367 pass
2369 pass
2368 else:
2370 else:
2369 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2371 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2370 untrusted = bool(opts.get(b'untrusted'))
2372 untrusted = bool(opts.get(b'untrusted'))
2371
2373
2372 selsections = selentries = []
2374 selsections = selentries = []
2373 if values:
2375 if values:
2374 selsections = [v for v in values if b'.' not in v]
2376 selsections = [v for v in values if b'.' not in v]
2375 selentries = [v for v in values if b'.' in v]
2377 selentries = [v for v in values if b'.' in v]
2376 uniquesel = len(selentries) == 1 and not selsections
2378 uniquesel = len(selentries) == 1 and not selsections
2377 selsections = set(selsections)
2379 selsections = set(selsections)
2378 selentries = set(selentries)
2380 selentries = set(selentries)
2379
2381
2380 matched = False
2382 matched = False
2381 all_known = opts[b'exp_all_known']
2383 all_known = opts[b'exp_all_known']
2382 show_source = ui.debugflag or opts.get(b'source')
2384 show_source = ui.debugflag or opts.get(b'source')
2383 entries = ui.walkconfig(untrusted=untrusted, all_known=all_known)
2385 entries = ui.walkconfig(untrusted=untrusted, all_known=all_known)
2384 for section, name, value in entries:
2386 for section, name, value in entries:
2385 source = ui.configsource(section, name, untrusted)
2387 source = ui.configsource(section, name, untrusted)
2386 value = pycompat.bytestr(value)
2388 value = pycompat.bytestr(value)
2387 defaultvalue = ui.configdefault(section, name)
2389 defaultvalue = ui.configdefault(section, name)
2388 if fm.isplain():
2390 if fm.isplain():
2389 source = source or b'none'
2391 source = source or b'none'
2390 value = value.replace(b'\n', b'\\n')
2392 value = value.replace(b'\n', b'\\n')
2391 entryname = section + b'.' + name
2393 entryname = section + b'.' + name
2392 if values and not (section in selsections or entryname in selentries):
2394 if values and not (section in selsections or entryname in selentries):
2393 continue
2395 continue
2394 fm.startitem()
2396 fm.startitem()
2395 fm.condwrite(show_source, b'source', b'%s: ', source)
2397 fm.condwrite(show_source, b'source', b'%s: ', source)
2396 if uniquesel:
2398 if uniquesel:
2397 fm.data(name=entryname)
2399 fm.data(name=entryname)
2398 fm.write(b'value', b'%s\n', value)
2400 fm.write(b'value', b'%s\n', value)
2399 else:
2401 else:
2400 fm.write(b'name value', b'%s=%s\n', entryname, value)
2402 fm.write(b'name value', b'%s=%s\n', entryname, value)
2401 if formatter.isprintable(defaultvalue):
2403 if formatter.isprintable(defaultvalue):
2402 fm.data(defaultvalue=defaultvalue)
2404 fm.data(defaultvalue=defaultvalue)
2403 elif isinstance(defaultvalue, list) and all(
2405 elif isinstance(defaultvalue, list) and all(
2404 formatter.isprintable(e) for e in defaultvalue
2406 formatter.isprintable(e) for e in defaultvalue
2405 ):
2407 ):
2406 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value'))
2408 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value'))
2407 # TODO: no idea how to process unsupported defaultvalue types
2409 # TODO: no idea how to process unsupported defaultvalue types
2408 matched = True
2410 matched = True
2409 fm.end()
2411 fm.end()
2410 if matched:
2412 if matched:
2411 return 0
2413 return 0
2412 return 1
2414 return 1
2413
2415
2414
2416
2415 @command(
2417 @command(
2416 b'continue',
2418 b'continue',
2417 dryrunopts,
2419 dryrunopts,
2418 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2420 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2419 helpbasic=True,
2421 helpbasic=True,
2420 )
2422 )
2421 def continuecmd(ui, repo, **opts):
2423 def continuecmd(ui, repo, **opts):
2422 """resumes an interrupted operation (EXPERIMENTAL)
2424 """resumes an interrupted operation (EXPERIMENTAL)
2423
2425
2424 Finishes a multistep operation like graft, histedit, rebase, merge,
2426 Finishes a multistep operation like graft, histedit, rebase, merge,
2425 and unshelve if they are in an interrupted state.
2427 and unshelve if they are in an interrupted state.
2426
2428
2427 use --dry-run/-n to dry run the command.
2429 use --dry-run/-n to dry run the command.
2428 """
2430 """
2429 dryrun = opts.get('dry_run')
2431 dryrun = opts.get('dry_run')
2430 contstate = cmdutil.getunfinishedstate(repo)
2432 contstate = cmdutil.getunfinishedstate(repo)
2431 if not contstate:
2433 if not contstate:
2432 raise error.StateError(_(b'no operation in progress'))
2434 raise error.StateError(_(b'no operation in progress'))
2433 if not contstate.continuefunc:
2435 if not contstate.continuefunc:
2434 raise error.StateError(
2436 raise error.StateError(
2435 (
2437 (
2436 _(b"%s in progress but does not support 'hg continue'")
2438 _(b"%s in progress but does not support 'hg continue'")
2437 % (contstate._opname)
2439 % (contstate._opname)
2438 ),
2440 ),
2439 hint=contstate.continuemsg(),
2441 hint=contstate.continuemsg(),
2440 )
2442 )
2441 if dryrun:
2443 if dryrun:
2442 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2444 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2443 return
2445 return
2444 return contstate.continuefunc(ui, repo)
2446 return contstate.continuefunc(ui, repo)
2445
2447
2446
2448
2447 @command(
2449 @command(
2448 b'copy|cp',
2450 b'copy|cp',
2449 [
2451 [
2450 (b'', b'forget', None, _(b'unmark a destination file as copied')),
2452 (b'', b'forget', None, _(b'unmark a destination file as copied')),
2451 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2453 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2452 (
2454 (
2453 b'',
2455 b'',
2454 b'at-rev',
2456 b'at-rev',
2455 b'',
2457 b'',
2456 _(b'(un)mark copies in the given revision (EXPERIMENTAL)'),
2458 _(b'(un)mark copies in the given revision (EXPERIMENTAL)'),
2457 _(b'REV'),
2459 _(b'REV'),
2458 ),
2460 ),
2459 (
2461 (
2460 b'f',
2462 b'f',
2461 b'force',
2463 b'force',
2462 None,
2464 None,
2463 _(b'forcibly copy over an existing managed file'),
2465 _(b'forcibly copy over an existing managed file'),
2464 ),
2466 ),
2465 ]
2467 ]
2466 + walkopts
2468 + walkopts
2467 + dryrunopts,
2469 + dryrunopts,
2468 _(b'[OPTION]... (SOURCE... DEST | --forget DEST...)'),
2470 _(b'[OPTION]... (SOURCE... DEST | --forget DEST...)'),
2469 helpcategory=command.CATEGORY_FILE_CONTENTS,
2471 helpcategory=command.CATEGORY_FILE_CONTENTS,
2470 )
2472 )
2471 def copy(ui, repo, *pats, **opts):
2473 def copy(ui, repo, *pats, **opts):
2472 """mark files as copied for the next commit
2474 """mark files as copied for the next commit
2473
2475
2474 Mark dest as having copies of source files. If dest is a
2476 Mark dest as having copies of source files. If dest is a
2475 directory, copies are put in that directory. If dest is a file,
2477 directory, copies are put in that directory. If dest is a file,
2476 the source must be a single file.
2478 the source must be a single file.
2477
2479
2478 By default, this command copies the contents of files as they
2480 By default, this command copies the contents of files as they
2479 exist in the working directory. If invoked with -A/--after, the
2481 exist in the working directory. If invoked with -A/--after, the
2480 operation is recorded, but no copying is performed.
2482 operation is recorded, but no copying is performed.
2481
2483
2482 To undo marking a destination file as copied, use --forget. With that
2484 To undo marking a destination file as copied, use --forget. With that
2483 option, all given (positional) arguments are unmarked as copies. The
2485 option, all given (positional) arguments are unmarked as copies. The
2484 destination file(s) will be left in place (still tracked). Note that
2486 destination file(s) will be left in place (still tracked). Note that
2485 :hg:`copy --forget` behaves the same way as :hg:`rename --forget`.
2487 :hg:`copy --forget` behaves the same way as :hg:`rename --forget`.
2486
2488
2487 This command takes effect with the next commit by default.
2489 This command takes effect with the next commit by default.
2488
2490
2489 Returns 0 on success, 1 if errors are encountered.
2491 Returns 0 on success, 1 if errors are encountered.
2490 """
2492 """
2491 opts = pycompat.byteskwargs(opts)
2493 opts = pycompat.byteskwargs(opts)
2492 with repo.wlock():
2494 with repo.wlock():
2493 return cmdutil.copy(ui, repo, pats, opts)
2495 return cmdutil.copy(ui, repo, pats, opts)
2494
2496
2495
2497
2496 @command(
2498 @command(
2497 b'debugcommands',
2499 b'debugcommands',
2498 [],
2500 [],
2499 _(b'[COMMAND]'),
2501 _(b'[COMMAND]'),
2500 helpcategory=command.CATEGORY_HELP,
2502 helpcategory=command.CATEGORY_HELP,
2501 norepo=True,
2503 norepo=True,
2502 )
2504 )
2503 def debugcommands(ui, cmd=b'', *args):
2505 def debugcommands(ui, cmd=b'', *args):
2504 """list all available commands and options"""
2506 """list all available commands and options"""
2505 for cmd, vals in sorted(table.items()):
2507 for cmd, vals in sorted(table.items()):
2506 cmd = cmd.split(b'|')[0]
2508 cmd = cmd.split(b'|')[0]
2507 opts = b', '.join([i[1] for i in vals[1]])
2509 opts = b', '.join([i[1] for i in vals[1]])
2508 ui.write(b'%s: %s\n' % (cmd, opts))
2510 ui.write(b'%s: %s\n' % (cmd, opts))
2509
2511
2510
2512
2511 @command(
2513 @command(
2512 b'debugcomplete',
2514 b'debugcomplete',
2513 [(b'o', b'options', None, _(b'show the command options'))],
2515 [(b'o', b'options', None, _(b'show the command options'))],
2514 _(b'[-o] CMD'),
2516 _(b'[-o] CMD'),
2515 helpcategory=command.CATEGORY_HELP,
2517 helpcategory=command.CATEGORY_HELP,
2516 norepo=True,
2518 norepo=True,
2517 )
2519 )
2518 def debugcomplete(ui, cmd=b'', **opts):
2520 def debugcomplete(ui, cmd=b'', **opts):
2519 """returns the completion list associated with the given command"""
2521 """returns the completion list associated with the given command"""
2520
2522
2521 if opts.get('options'):
2523 if opts.get('options'):
2522 options = []
2524 options = []
2523 otables = [globalopts]
2525 otables = [globalopts]
2524 if cmd:
2526 if cmd:
2525 aliases, entry = cmdutil.findcmd(cmd, table, False)
2527 aliases, entry = cmdutil.findcmd(cmd, table, False)
2526 otables.append(entry[1])
2528 otables.append(entry[1])
2527 for t in otables:
2529 for t in otables:
2528 for o in t:
2530 for o in t:
2529 if b"(DEPRECATED)" in o[3]:
2531 if b"(DEPRECATED)" in o[3]:
2530 continue
2532 continue
2531 if o[0]:
2533 if o[0]:
2532 options.append(b'-%s' % o[0])
2534 options.append(b'-%s' % o[0])
2533 options.append(b'--%s' % o[1])
2535 options.append(b'--%s' % o[1])
2534 ui.write(b"%s\n" % b"\n".join(options))
2536 ui.write(b"%s\n" % b"\n".join(options))
2535 return
2537 return
2536
2538
2537 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2539 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2538 if ui.verbose:
2540 if ui.verbose:
2539 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2541 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2540 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2542 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2541
2543
2542
2544
2543 @command(
2545 @command(
2544 b'diff',
2546 b'diff',
2545 [
2547 [
2546 (b'r', b'rev', [], _(b'revision (DEPRECATED)'), _(b'REV')),
2548 (b'r', b'rev', [], _(b'revision (DEPRECATED)'), _(b'REV')),
2547 (b'', b'from', b'', _(b'revision to diff from'), _(b'REV1')),
2549 (b'', b'from', b'', _(b'revision to diff from'), _(b'REV1')),
2548 (b'', b'to', b'', _(b'revision to diff to'), _(b'REV2')),
2550 (b'', b'to', b'', _(b'revision to diff to'), _(b'REV2')),
2549 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2551 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2550 ]
2552 ]
2551 + diffopts
2553 + diffopts
2552 + diffopts2
2554 + diffopts2
2553 + walkopts
2555 + walkopts
2554 + subrepoopts,
2556 + subrepoopts,
2555 _(b'[OPTION]... ([-c REV] | [--from REV1] [--to REV2]) [FILE]...'),
2557 _(b'[OPTION]... ([-c REV] | [--from REV1] [--to REV2]) [FILE]...'),
2556 helpcategory=command.CATEGORY_FILE_CONTENTS,
2558 helpcategory=command.CATEGORY_FILE_CONTENTS,
2557 helpbasic=True,
2559 helpbasic=True,
2558 inferrepo=True,
2560 inferrepo=True,
2559 intents={INTENT_READONLY},
2561 intents={INTENT_READONLY},
2560 )
2562 )
2561 def diff(ui, repo, *pats, **opts):
2563 def diff(ui, repo, *pats, **opts):
2562 """diff repository (or selected files)
2564 """diff repository (or selected files)
2563
2565
2564 Show differences between revisions for the specified files.
2566 Show differences between revisions for the specified files.
2565
2567
2566 Differences between files are shown using the unified diff format.
2568 Differences between files are shown using the unified diff format.
2567
2569
2568 .. note::
2570 .. note::
2569
2571
2570 :hg:`diff` may generate unexpected results for merges, as it will
2572 :hg:`diff` may generate unexpected results for merges, as it will
2571 default to comparing against the working directory's first
2573 default to comparing against the working directory's first
2572 parent changeset if no revisions are specified. To diff against the
2574 parent changeset if no revisions are specified. To diff against the
2573 conflict regions, you can use `--config diff.merge=yes`.
2575 conflict regions, you can use `--config diff.merge=yes`.
2574
2576
2575 By default, the working directory files are compared to its first parent. To
2577 By default, the working directory files are compared to its first parent. To
2576 see the differences from another revision, use --from. To see the difference
2578 see the differences from another revision, use --from. To see the difference
2577 to another revision, use --to. For example, :hg:`diff --from .^` will show
2579 to another revision, use --to. For example, :hg:`diff --from .^` will show
2578 the differences from the working copy's grandparent to the working copy,
2580 the differences from the working copy's grandparent to the working copy,
2579 :hg:`diff --to .` will show the diff from the working copy to its parent
2581 :hg:`diff --to .` will show the diff from the working copy to its parent
2580 (i.e. the reverse of the default), and :hg:`diff --from 1.0 --to 1.2` will
2582 (i.e. the reverse of the default), and :hg:`diff --from 1.0 --to 1.2` will
2581 show the diff between those two revisions.
2583 show the diff between those two revisions.
2582
2584
2583 Alternatively you can specify -c/--change with a revision to see the changes
2585 Alternatively you can specify -c/--change with a revision to see the changes
2584 in that changeset relative to its first parent (i.e. :hg:`diff -c 42` is
2586 in that changeset relative to its first parent (i.e. :hg:`diff -c 42` is
2585 equivalent to :hg:`diff --from 42^ --to 42`)
2587 equivalent to :hg:`diff --from 42^ --to 42`)
2586
2588
2587 Without the -a/--text option, diff will avoid generating diffs of
2589 Without the -a/--text option, diff will avoid generating diffs of
2588 files it detects as binary. With -a, diff will generate a diff
2590 files it detects as binary. With -a, diff will generate a diff
2589 anyway, probably with undesirable results.
2591 anyway, probably with undesirable results.
2590
2592
2591 Use the -g/--git option to generate diffs in the git extended diff
2593 Use the -g/--git option to generate diffs in the git extended diff
2592 format. For more information, read :hg:`help diffs`.
2594 format. For more information, read :hg:`help diffs`.
2593
2595
2594 .. container:: verbose
2596 .. container:: verbose
2595
2597
2596 Examples:
2598 Examples:
2597
2599
2598 - compare a file in the current working directory to its parent::
2600 - compare a file in the current working directory to its parent::
2599
2601
2600 hg diff foo.c
2602 hg diff foo.c
2601
2603
2602 - compare two historical versions of a directory, with rename info::
2604 - compare two historical versions of a directory, with rename info::
2603
2605
2604 hg diff --git --from 1.0 --to 1.2 lib/
2606 hg diff --git --from 1.0 --to 1.2 lib/
2605
2607
2606 - get change stats relative to the last change on some date::
2608 - get change stats relative to the last change on some date::
2607
2609
2608 hg diff --stat --from "date('may 2')"
2610 hg diff --stat --from "date('may 2')"
2609
2611
2610 - diff all newly-added files that contain a keyword::
2612 - diff all newly-added files that contain a keyword::
2611
2613
2612 hg diff "set:added() and grep(GNU)"
2614 hg diff "set:added() and grep(GNU)"
2613
2615
2614 - compare a revision and its parents::
2616 - compare a revision and its parents::
2615
2617
2616 hg diff -c 9353 # compare against first parent
2618 hg diff -c 9353 # compare against first parent
2617 hg diff --from 9353^ --to 9353 # same using revset syntax
2619 hg diff --from 9353^ --to 9353 # same using revset syntax
2618 hg diff --from 9353^2 --to 9353 # compare against the second parent
2620 hg diff --from 9353^2 --to 9353 # compare against the second parent
2619
2621
2620 Returns 0 on success.
2622 Returns 0 on success.
2621 """
2623 """
2622
2624
2623 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
2625 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
2624 opts = pycompat.byteskwargs(opts)
2626 opts = pycompat.byteskwargs(opts)
2625 revs = opts.get(b'rev')
2627 revs = opts.get(b'rev')
2626 change = opts.get(b'change')
2628 change = opts.get(b'change')
2627 from_rev = opts.get(b'from')
2629 from_rev = opts.get(b'from')
2628 to_rev = opts.get(b'to')
2630 to_rev = opts.get(b'to')
2629 stat = opts.get(b'stat')
2631 stat = opts.get(b'stat')
2630 reverse = opts.get(b'reverse')
2632 reverse = opts.get(b'reverse')
2631
2633
2632 cmdutil.check_incompatible_arguments(opts, b'from', [b'rev', b'change'])
2634 cmdutil.check_incompatible_arguments(opts, b'from', [b'rev', b'change'])
2633 cmdutil.check_incompatible_arguments(opts, b'to', [b'rev', b'change'])
2635 cmdutil.check_incompatible_arguments(opts, b'to', [b'rev', b'change'])
2634 if change:
2636 if change:
2635 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2637 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2636 ctx2 = logcmdutil.revsingle(repo, change, None)
2638 ctx2 = logcmdutil.revsingle(repo, change, None)
2637 ctx1 = logcmdutil.diff_parent(ctx2)
2639 ctx1 = logcmdutil.diff_parent(ctx2)
2638 elif from_rev or to_rev:
2640 elif from_rev or to_rev:
2639 repo = scmutil.unhidehashlikerevs(
2641 repo = scmutil.unhidehashlikerevs(
2640 repo, [from_rev] + [to_rev], b'nowarn'
2642 repo, [from_rev] + [to_rev], b'nowarn'
2641 )
2643 )
2642 ctx1 = logcmdutil.revsingle(repo, from_rev, None)
2644 ctx1 = logcmdutil.revsingle(repo, from_rev, None)
2643 ctx2 = logcmdutil.revsingle(repo, to_rev, None)
2645 ctx2 = logcmdutil.revsingle(repo, to_rev, None)
2644 else:
2646 else:
2645 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2647 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2646 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
2648 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
2647
2649
2648 if reverse:
2650 if reverse:
2649 ctxleft = ctx2
2651 ctxleft = ctx2
2650 ctxright = ctx1
2652 ctxright = ctx1
2651 else:
2653 else:
2652 ctxleft = ctx1
2654 ctxleft = ctx1
2653 ctxright = ctx2
2655 ctxright = ctx2
2654
2656
2655 diffopts = patch.diffallopts(ui, opts)
2657 diffopts = patch.diffallopts(ui, opts)
2656 m = scmutil.match(ctx2, pats, opts)
2658 m = scmutil.match(ctx2, pats, opts)
2657 m = repo.narrowmatch(m)
2659 m = repo.narrowmatch(m)
2658 ui.pager(b'diff')
2660 ui.pager(b'diff')
2659 logcmdutil.diffordiffstat(
2661 logcmdutil.diffordiffstat(
2660 ui,
2662 ui,
2661 repo,
2663 repo,
2662 diffopts,
2664 diffopts,
2663 ctxleft,
2665 ctxleft,
2664 ctxright,
2666 ctxright,
2665 m,
2667 m,
2666 stat=stat,
2668 stat=stat,
2667 listsubrepos=opts.get(b'subrepos'),
2669 listsubrepos=opts.get(b'subrepos'),
2668 root=opts.get(b'root'),
2670 root=opts.get(b'root'),
2669 )
2671 )
2670
2672
2671
2673
2672 @command(
2674 @command(
2673 b'export',
2675 b'export',
2674 [
2676 [
2675 (
2677 (
2676 b'B',
2678 b'B',
2677 b'bookmark',
2679 b'bookmark',
2678 b'',
2680 b'',
2679 _(b'export changes only reachable by given bookmark'),
2681 _(b'export changes only reachable by given bookmark'),
2680 _(b'BOOKMARK'),
2682 _(b'BOOKMARK'),
2681 ),
2683 ),
2682 (
2684 (
2683 b'o',
2685 b'o',
2684 b'output',
2686 b'output',
2685 b'',
2687 b'',
2686 _(b'print output to file with formatted name'),
2688 _(b'print output to file with formatted name'),
2687 _(b'FORMAT'),
2689 _(b'FORMAT'),
2688 ),
2690 ),
2689 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2691 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2690 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2692 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2691 ]
2693 ]
2692 + diffopts
2694 + diffopts
2693 + formatteropts,
2695 + formatteropts,
2694 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2696 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2695 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2697 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2696 helpbasic=True,
2698 helpbasic=True,
2697 intents={INTENT_READONLY},
2699 intents={INTENT_READONLY},
2698 )
2700 )
2699 def export(ui, repo, *changesets, **opts):
2701 def export(ui, repo, *changesets, **opts):
2700 """dump the header and diffs for one or more changesets
2702 """dump the header and diffs for one or more changesets
2701
2703
2702 Print the changeset header and diffs for one or more revisions.
2704 Print the changeset header and diffs for one or more revisions.
2703 If no revision is given, the parent of the working directory is used.
2705 If no revision is given, the parent of the working directory is used.
2704
2706
2705 The information shown in the changeset header is: author, date,
2707 The information shown in the changeset header is: author, date,
2706 branch name (if non-default), changeset hash, parent(s) and commit
2708 branch name (if non-default), changeset hash, parent(s) and commit
2707 comment.
2709 comment.
2708
2710
2709 .. note::
2711 .. note::
2710
2712
2711 :hg:`export` may generate unexpected diff output for merge
2713 :hg:`export` may generate unexpected diff output for merge
2712 changesets, as it will compare the merge changeset against its
2714 changesets, as it will compare the merge changeset against its
2713 first parent only.
2715 first parent only.
2714
2716
2715 Output may be to a file, in which case the name of the file is
2717 Output may be to a file, in which case the name of the file is
2716 given using a template string. See :hg:`help templates`. In addition
2718 given using a template string. See :hg:`help templates`. In addition
2717 to the common template keywords, the following formatting rules are
2719 to the common template keywords, the following formatting rules are
2718 supported:
2720 supported:
2719
2721
2720 :``%%``: literal "%" character
2722 :``%%``: literal "%" character
2721 :``%H``: changeset hash (40 hexadecimal digits)
2723 :``%H``: changeset hash (40 hexadecimal digits)
2722 :``%N``: number of patches being generated
2724 :``%N``: number of patches being generated
2723 :``%R``: changeset revision number
2725 :``%R``: changeset revision number
2724 :``%b``: basename of the exporting repository
2726 :``%b``: basename of the exporting repository
2725 :``%h``: short-form changeset hash (12 hexadecimal digits)
2727 :``%h``: short-form changeset hash (12 hexadecimal digits)
2726 :``%m``: first line of the commit message (only alphanumeric characters)
2728 :``%m``: first line of the commit message (only alphanumeric characters)
2727 :``%n``: zero-padded sequence number, starting at 1
2729 :``%n``: zero-padded sequence number, starting at 1
2728 :``%r``: zero-padded changeset revision number
2730 :``%r``: zero-padded changeset revision number
2729 :``\\``: literal "\\" character
2731 :``\\``: literal "\\" character
2730
2732
2731 Without the -a/--text option, export will avoid generating diffs
2733 Without the -a/--text option, export will avoid generating diffs
2732 of files it detects as binary. With -a, export will generate a
2734 of files it detects as binary. With -a, export will generate a
2733 diff anyway, probably with undesirable results.
2735 diff anyway, probably with undesirable results.
2734
2736
2735 With -B/--bookmark changesets reachable by the given bookmark are
2737 With -B/--bookmark changesets reachable by the given bookmark are
2736 selected.
2738 selected.
2737
2739
2738 Use the -g/--git option to generate diffs in the git extended diff
2740 Use the -g/--git option to generate diffs in the git extended diff
2739 format. See :hg:`help diffs` for more information.
2741 format. See :hg:`help diffs` for more information.
2740
2742
2741 With the --switch-parent option, the diff will be against the
2743 With the --switch-parent option, the diff will be against the
2742 second parent. It can be useful to review a merge.
2744 second parent. It can be useful to review a merge.
2743
2745
2744 .. container:: verbose
2746 .. container:: verbose
2745
2747
2746 Template:
2748 Template:
2747
2749
2748 The following keywords are supported in addition to the common template
2750 The following keywords are supported in addition to the common template
2749 keywords and functions. See also :hg:`help templates`.
2751 keywords and functions. See also :hg:`help templates`.
2750
2752
2751 :diff: String. Diff content.
2753 :diff: String. Diff content.
2752 :parents: List of strings. Parent nodes of the changeset.
2754 :parents: List of strings. Parent nodes of the changeset.
2753
2755
2754 Examples:
2756 Examples:
2755
2757
2756 - use export and import to transplant a bugfix to the current
2758 - use export and import to transplant a bugfix to the current
2757 branch::
2759 branch::
2758
2760
2759 hg export -r 9353 | hg import -
2761 hg export -r 9353 | hg import -
2760
2762
2761 - export all the changesets between two revisions to a file with
2763 - export all the changesets between two revisions to a file with
2762 rename information::
2764 rename information::
2763
2765
2764 hg export --git -r 123:150 > changes.txt
2766 hg export --git -r 123:150 > changes.txt
2765
2767
2766 - split outgoing changes into a series of patches with
2768 - split outgoing changes into a series of patches with
2767 descriptive names::
2769 descriptive names::
2768
2770
2769 hg export -r "outgoing()" -o "%n-%m.patch"
2771 hg export -r "outgoing()" -o "%n-%m.patch"
2770
2772
2771 Returns 0 on success.
2773 Returns 0 on success.
2772 """
2774 """
2773 opts = pycompat.byteskwargs(opts)
2775 opts = pycompat.byteskwargs(opts)
2774 bookmark = opts.get(b'bookmark')
2776 bookmark = opts.get(b'bookmark')
2775 changesets += tuple(opts.get(b'rev', []))
2777 changesets += tuple(opts.get(b'rev', []))
2776
2778
2777 cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
2779 cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
2778
2780
2779 if bookmark:
2781 if bookmark:
2780 if bookmark not in repo._bookmarks:
2782 if bookmark not in repo._bookmarks:
2781 raise error.InputError(_(b"bookmark '%s' not found") % bookmark)
2783 raise error.InputError(_(b"bookmark '%s' not found") % bookmark)
2782
2784
2783 revs = scmutil.bookmarkrevs(repo, bookmark)
2785 revs = scmutil.bookmarkrevs(repo, bookmark)
2784 else:
2786 else:
2785 if not changesets:
2787 if not changesets:
2786 changesets = [b'.']
2788 changesets = [b'.']
2787
2789
2788 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2790 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2789 revs = logcmdutil.revrange(repo, changesets)
2791 revs = logcmdutil.revrange(repo, changesets)
2790
2792
2791 if not revs:
2793 if not revs:
2792 raise error.InputError(_(b"export requires at least one changeset"))
2794 raise error.InputError(_(b"export requires at least one changeset"))
2793 if len(revs) > 1:
2795 if len(revs) > 1:
2794 ui.note(_(b'exporting patches:\n'))
2796 ui.note(_(b'exporting patches:\n'))
2795 else:
2797 else:
2796 ui.note(_(b'exporting patch:\n'))
2798 ui.note(_(b'exporting patch:\n'))
2797
2799
2798 fntemplate = opts.get(b'output')
2800 fntemplate = opts.get(b'output')
2799 if cmdutil.isstdiofilename(fntemplate):
2801 if cmdutil.isstdiofilename(fntemplate):
2800 fntemplate = b''
2802 fntemplate = b''
2801
2803
2802 if fntemplate:
2804 if fntemplate:
2803 fm = formatter.nullformatter(ui, b'export', opts)
2805 fm = formatter.nullformatter(ui, b'export', opts)
2804 else:
2806 else:
2805 ui.pager(b'export')
2807 ui.pager(b'export')
2806 fm = ui.formatter(b'export', opts)
2808 fm = ui.formatter(b'export', opts)
2807 with fm:
2809 with fm:
2808 cmdutil.export(
2810 cmdutil.export(
2809 repo,
2811 repo,
2810 revs,
2812 revs,
2811 fm,
2813 fm,
2812 fntemplate=fntemplate,
2814 fntemplate=fntemplate,
2813 switch_parent=opts.get(b'switch_parent'),
2815 switch_parent=opts.get(b'switch_parent'),
2814 opts=patch.diffallopts(ui, opts),
2816 opts=patch.diffallopts(ui, opts),
2815 )
2817 )
2816
2818
2817
2819
2818 @command(
2820 @command(
2819 b'files',
2821 b'files',
2820 [
2822 [
2821 (
2823 (
2822 b'r',
2824 b'r',
2823 b'rev',
2825 b'rev',
2824 b'',
2826 b'',
2825 _(b'search the repository as it is in REV'),
2827 _(b'search the repository as it is in REV'),
2826 _(b'REV'),
2828 _(b'REV'),
2827 ),
2829 ),
2828 (
2830 (
2829 b'0',
2831 b'0',
2830 b'print0',
2832 b'print0',
2831 None,
2833 None,
2832 _(b'end filenames with NUL, for use with xargs'),
2834 _(b'end filenames with NUL, for use with xargs'),
2833 ),
2835 ),
2834 ]
2836 ]
2835 + walkopts
2837 + walkopts
2836 + formatteropts
2838 + formatteropts
2837 + subrepoopts,
2839 + subrepoopts,
2838 _(b'[OPTION]... [FILE]...'),
2840 _(b'[OPTION]... [FILE]...'),
2839 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2841 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2840 intents={INTENT_READONLY},
2842 intents={INTENT_READONLY},
2841 )
2843 )
2842 def files(ui, repo, *pats, **opts):
2844 def files(ui, repo, *pats, **opts):
2843 """list tracked files
2845 """list tracked files
2844
2846
2845 Print files under Mercurial control in the working directory or
2847 Print files under Mercurial control in the working directory or
2846 specified revision for given files (excluding removed files).
2848 specified revision for given files (excluding removed files).
2847 Files can be specified as filenames or filesets.
2849 Files can be specified as filenames or filesets.
2848
2850
2849 If no files are given to match, this command prints the names
2851 If no files are given to match, this command prints the names
2850 of all files under Mercurial control.
2852 of all files under Mercurial control.
2851
2853
2852 .. container:: verbose
2854 .. container:: verbose
2853
2855
2854 Template:
2856 Template:
2855
2857
2856 The following keywords are supported in addition to the common template
2858 The following keywords are supported in addition to the common template
2857 keywords and functions. See also :hg:`help templates`.
2859 keywords and functions. See also :hg:`help templates`.
2858
2860
2859 :flags: String. Character denoting file's symlink and executable bits.
2861 :flags: String. Character denoting file's symlink and executable bits.
2860 :path: String. Repository-absolute path of the file.
2862 :path: String. Repository-absolute path of the file.
2861 :size: Integer. Size of the file in bytes.
2863 :size: Integer. Size of the file in bytes.
2862
2864
2863 Examples:
2865 Examples:
2864
2866
2865 - list all files under the current directory::
2867 - list all files under the current directory::
2866
2868
2867 hg files .
2869 hg files .
2868
2870
2869 - shows sizes and flags for current revision::
2871 - shows sizes and flags for current revision::
2870
2872
2871 hg files -vr .
2873 hg files -vr .
2872
2874
2873 - list all files named README::
2875 - list all files named README::
2874
2876
2875 hg files -I "**/README"
2877 hg files -I "**/README"
2876
2878
2877 - list all binary files::
2879 - list all binary files::
2878
2880
2879 hg files "set:binary()"
2881 hg files "set:binary()"
2880
2882
2881 - find files containing a regular expression::
2883 - find files containing a regular expression::
2882
2884
2883 hg files "set:grep('bob')"
2885 hg files "set:grep('bob')"
2884
2886
2885 - search tracked file contents with xargs and grep::
2887 - search tracked file contents with xargs and grep::
2886
2888
2887 hg files -0 | xargs -0 grep foo
2889 hg files -0 | xargs -0 grep foo
2888
2890
2889 See :hg:`help patterns` and :hg:`help filesets` for more information
2891 See :hg:`help patterns` and :hg:`help filesets` for more information
2890 on specifying file patterns.
2892 on specifying file patterns.
2891
2893
2892 Returns 0 if a match is found, 1 otherwise.
2894 Returns 0 if a match is found, 1 otherwise.
2893
2895
2894 """
2896 """
2895
2897
2896 opts = pycompat.byteskwargs(opts)
2898 opts = pycompat.byteskwargs(opts)
2897 rev = opts.get(b'rev')
2899 rev = opts.get(b'rev')
2898 if rev:
2900 if rev:
2899 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2901 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2900 ctx = logcmdutil.revsingle(repo, rev, None)
2902 ctx = logcmdutil.revsingle(repo, rev, None)
2901
2903
2902 end = b'\n'
2904 end = b'\n'
2903 if opts.get(b'print0'):
2905 if opts.get(b'print0'):
2904 end = b'\0'
2906 end = b'\0'
2905 fmt = b'%s' + end
2907 fmt = b'%s' + end
2906
2908
2907 m = scmutil.match(ctx, pats, opts)
2909 m = scmutil.match(ctx, pats, opts)
2908 ui.pager(b'files')
2910 ui.pager(b'files')
2909 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2911 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2910 with ui.formatter(b'files', opts) as fm:
2912 with ui.formatter(b'files', opts) as fm:
2911 return cmdutil.files(
2913 return cmdutil.files(
2912 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2914 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2913 )
2915 )
2914
2916
2915
2917
2916 @command(
2918 @command(
2917 b'forget',
2919 b'forget',
2918 [
2920 [
2919 (b'i', b'interactive', None, _(b'use interactive mode')),
2921 (b'i', b'interactive', None, _(b'use interactive mode')),
2920 ]
2922 ]
2921 + walkopts
2923 + walkopts
2922 + dryrunopts,
2924 + dryrunopts,
2923 _(b'[OPTION]... FILE...'),
2925 _(b'[OPTION]... FILE...'),
2924 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2926 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2925 helpbasic=True,
2927 helpbasic=True,
2926 inferrepo=True,
2928 inferrepo=True,
2927 )
2929 )
2928 def forget(ui, repo, *pats, **opts):
2930 def forget(ui, repo, *pats, **opts):
2929 """forget the specified files on the next commit
2931 """forget the specified files on the next commit
2930
2932
2931 Mark the specified files so they will no longer be tracked
2933 Mark the specified files so they will no longer be tracked
2932 after the next commit.
2934 after the next commit.
2933
2935
2934 This only removes files from the current branch, not from the
2936 This only removes files from the current branch, not from the
2935 entire project history, and it does not delete them from the
2937 entire project history, and it does not delete them from the
2936 working directory.
2938 working directory.
2937
2939
2938 To delete the file from the working directory, see :hg:`remove`.
2940 To delete the file from the working directory, see :hg:`remove`.
2939
2941
2940 To undo a forget before the next commit, see :hg:`add`.
2942 To undo a forget before the next commit, see :hg:`add`.
2941
2943
2942 .. container:: verbose
2944 .. container:: verbose
2943
2945
2944 Examples:
2946 Examples:
2945
2947
2946 - forget newly-added binary files::
2948 - forget newly-added binary files::
2947
2949
2948 hg forget "set:added() and binary()"
2950 hg forget "set:added() and binary()"
2949
2951
2950 - forget files that would be excluded by .hgignore::
2952 - forget files that would be excluded by .hgignore::
2951
2953
2952 hg forget "set:hgignore()"
2954 hg forget "set:hgignore()"
2953
2955
2954 Returns 0 on success.
2956 Returns 0 on success.
2955 """
2957 """
2956
2958
2957 opts = pycompat.byteskwargs(opts)
2959 opts = pycompat.byteskwargs(opts)
2958 if not pats:
2960 if not pats:
2959 raise error.InputError(_(b'no files specified'))
2961 raise error.InputError(_(b'no files specified'))
2960
2962
2961 m = scmutil.match(repo[None], pats, opts)
2963 m = scmutil.match(repo[None], pats, opts)
2962 dryrun, interactive = opts.get(b'dry_run'), opts.get(b'interactive')
2964 dryrun, interactive = opts.get(b'dry_run'), opts.get(b'interactive')
2963 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2965 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2964 rejected = cmdutil.forget(
2966 rejected = cmdutil.forget(
2965 ui,
2967 ui,
2966 repo,
2968 repo,
2967 m,
2969 m,
2968 prefix=b"",
2970 prefix=b"",
2969 uipathfn=uipathfn,
2971 uipathfn=uipathfn,
2970 explicitonly=False,
2972 explicitonly=False,
2971 dryrun=dryrun,
2973 dryrun=dryrun,
2972 interactive=interactive,
2974 interactive=interactive,
2973 )[0]
2975 )[0]
2974 return rejected and 1 or 0
2976 return rejected and 1 or 0
2975
2977
2976
2978
2977 @command(
2979 @command(
2978 b'graft',
2980 b'graft',
2979 [
2981 [
2980 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
2982 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
2981 (
2983 (
2982 b'',
2984 b'',
2983 b'base',
2985 b'base',
2984 b'',
2986 b'',
2985 _(b'base revision when doing the graft merge (ADVANCED)'),
2987 _(b'base revision when doing the graft merge (ADVANCED)'),
2986 _(b'REV'),
2988 _(b'REV'),
2987 ),
2989 ),
2988 (b'c', b'continue', False, _(b'resume interrupted graft')),
2990 (b'c', b'continue', False, _(b'resume interrupted graft')),
2989 (b'', b'stop', False, _(b'stop interrupted graft')),
2991 (b'', b'stop', False, _(b'stop interrupted graft')),
2990 (b'', b'abort', False, _(b'abort interrupted graft')),
2992 (b'', b'abort', False, _(b'abort interrupted graft')),
2991 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
2993 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
2992 (b'', b'log', None, _(b'append graft info to log message')),
2994 (b'', b'log', None, _(b'append graft info to log message')),
2993 (
2995 (
2994 b'',
2996 b'',
2995 b'no-commit',
2997 b'no-commit',
2996 None,
2998 None,
2997 _(b"don't commit, just apply the changes in working directory"),
2999 _(b"don't commit, just apply the changes in working directory"),
2998 ),
3000 ),
2999 (b'f', b'force', False, _(b'force graft')),
3001 (b'f', b'force', False, _(b'force graft')),
3000 (
3002 (
3001 b'D',
3003 b'D',
3002 b'currentdate',
3004 b'currentdate',
3003 False,
3005 False,
3004 _(b'record the current date as commit date'),
3006 _(b'record the current date as commit date'),
3005 ),
3007 ),
3006 (
3008 (
3007 b'U',
3009 b'U',
3008 b'currentuser',
3010 b'currentuser',
3009 False,
3011 False,
3010 _(b'record the current user as committer'),
3012 _(b'record the current user as committer'),
3011 ),
3013 ),
3012 ]
3014 ]
3013 + commitopts2
3015 + commitopts2
3014 + mergetoolopts
3016 + mergetoolopts
3015 + dryrunopts,
3017 + dryrunopts,
3016 _(b'[OPTION]... [-r REV]... REV...'),
3018 _(b'[OPTION]... [-r REV]... REV...'),
3017 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
3019 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
3018 )
3020 )
3019 def graft(ui, repo, *revs, **opts):
3021 def graft(ui, repo, *revs, **opts):
3020 """copy changes from other branches onto the current branch
3022 """copy changes from other branches onto the current branch
3021
3023
3022 This command uses Mercurial's merge logic to copy individual
3024 This command uses Mercurial's merge logic to copy individual
3023 changes from other branches without merging branches in the
3025 changes from other branches without merging branches in the
3024 history graph. This is sometimes known as 'backporting' or
3026 history graph. This is sometimes known as 'backporting' or
3025 'cherry-picking'. By default, graft will copy user, date, and
3027 'cherry-picking'. By default, graft will copy user, date, and
3026 description from the source changesets.
3028 description from the source changesets.
3027
3029
3028 Changesets that are ancestors of the current revision, that have
3030 Changesets that are ancestors of the current revision, that have
3029 already been grafted, or that are merges will be skipped.
3031 already been grafted, or that are merges will be skipped.
3030
3032
3031 If --log is specified, log messages will have a comment appended
3033 If --log is specified, log messages will have a comment appended
3032 of the form::
3034 of the form::
3033
3035
3034 (grafted from CHANGESETHASH)
3036 (grafted from CHANGESETHASH)
3035
3037
3036 If --force is specified, revisions will be grafted even if they
3038 If --force is specified, revisions will be grafted even if they
3037 are already ancestors of, or have been grafted to, the destination.
3039 are already ancestors of, or have been grafted to, the destination.
3038 This is useful when the revisions have since been backed out.
3040 This is useful when the revisions have since been backed out.
3039
3041
3040 If a graft merge results in conflicts, the graft process is
3042 If a graft merge results in conflicts, the graft process is
3041 interrupted so that the current merge can be manually resolved.
3043 interrupted so that the current merge can be manually resolved.
3042 Once all conflicts are addressed, the graft process can be
3044 Once all conflicts are addressed, the graft process can be
3043 continued with the -c/--continue option.
3045 continued with the -c/--continue option.
3044
3046
3045 The -c/--continue option reapplies all the earlier options.
3047 The -c/--continue option reapplies all the earlier options.
3046
3048
3047 .. container:: verbose
3049 .. container:: verbose
3048
3050
3049 The --base option exposes more of how graft internally uses merge with a
3051 The --base option exposes more of how graft internally uses merge with a
3050 custom base revision. --base can be used to specify another ancestor than
3052 custom base revision. --base can be used to specify another ancestor than
3051 the first and only parent.
3053 the first and only parent.
3052
3054
3053 The command::
3055 The command::
3054
3056
3055 hg graft -r 345 --base 234
3057 hg graft -r 345 --base 234
3056
3058
3057 is thus pretty much the same as::
3059 is thus pretty much the same as::
3058
3060
3059 hg diff --from 234 --to 345 | hg import
3061 hg diff --from 234 --to 345 | hg import
3060
3062
3061 but using merge to resolve conflicts and track moved files.
3063 but using merge to resolve conflicts and track moved files.
3062
3064
3063 The result of a merge can thus be backported as a single commit by
3065 The result of a merge can thus be backported as a single commit by
3064 specifying one of the merge parents as base, and thus effectively
3066 specifying one of the merge parents as base, and thus effectively
3065 grafting the changes from the other side.
3067 grafting the changes from the other side.
3066
3068
3067 It is also possible to collapse multiple changesets and clean up history
3069 It is also possible to collapse multiple changesets and clean up history
3068 by specifying another ancestor as base, much like rebase --collapse
3070 by specifying another ancestor as base, much like rebase --collapse
3069 --keep.
3071 --keep.
3070
3072
3071 The commit message can be tweaked after the fact using commit --amend .
3073 The commit message can be tweaked after the fact using commit --amend .
3072
3074
3073 For using non-ancestors as the base to backout changes, see the backout
3075 For using non-ancestors as the base to backout changes, see the backout
3074 command and the hidden --parent option.
3076 command and the hidden --parent option.
3075
3077
3076 .. container:: verbose
3078 .. container:: verbose
3077
3079
3078 Examples:
3080 Examples:
3079
3081
3080 - copy a single change to the stable branch and edit its description::
3082 - copy a single change to the stable branch and edit its description::
3081
3083
3082 hg update stable
3084 hg update stable
3083 hg graft --edit 9393
3085 hg graft --edit 9393
3084
3086
3085 - graft a range of changesets with one exception, updating dates::
3087 - graft a range of changesets with one exception, updating dates::
3086
3088
3087 hg graft -D "2085::2093 and not 2091"
3089 hg graft -D "2085::2093 and not 2091"
3088
3090
3089 - continue a graft after resolving conflicts::
3091 - continue a graft after resolving conflicts::
3090
3092
3091 hg graft -c
3093 hg graft -c
3092
3094
3093 - show the source of a grafted changeset::
3095 - show the source of a grafted changeset::
3094
3096
3095 hg log --debug -r .
3097 hg log --debug -r .
3096
3098
3097 - show revisions sorted by date::
3099 - show revisions sorted by date::
3098
3100
3099 hg log -r "sort(all(), date)"
3101 hg log -r "sort(all(), date)"
3100
3102
3101 - backport the result of a merge as a single commit::
3103 - backport the result of a merge as a single commit::
3102
3104
3103 hg graft -r 123 --base 123^
3105 hg graft -r 123 --base 123^
3104
3106
3105 - land a feature branch as one changeset::
3107 - land a feature branch as one changeset::
3106
3108
3107 hg up -cr default
3109 hg up -cr default
3108 hg graft -r featureX --base "ancestor('featureX', 'default')"
3110 hg graft -r featureX --base "ancestor('featureX', 'default')"
3109
3111
3110 See :hg:`help revisions` for more about specifying revisions.
3112 See :hg:`help revisions` for more about specifying revisions.
3111
3113
3112 Returns 0 on successful completion, 1 if there are unresolved files.
3114 Returns 0 on successful completion, 1 if there are unresolved files.
3113 """
3115 """
3114 with repo.wlock():
3116 with repo.wlock():
3115 return _dograft(ui, repo, *revs, **opts)
3117 return _dograft(ui, repo, *revs, **opts)
3116
3118
3117
3119
3118 def _dograft(ui, repo, *revs, **opts):
3120 def _dograft(ui, repo, *revs, **opts):
3119 if revs and opts.get('rev'):
3121 if revs and opts.get('rev'):
3120 ui.warn(
3122 ui.warn(
3121 _(
3123 _(
3122 b'warning: inconsistent use of --rev might give unexpected '
3124 b'warning: inconsistent use of --rev might give unexpected '
3123 b'revision ordering!\n'
3125 b'revision ordering!\n'
3124 )
3126 )
3125 )
3127 )
3126
3128
3127 revs = list(revs)
3129 revs = list(revs)
3128 revs.extend(opts.get('rev'))
3130 revs.extend(opts.get('rev'))
3129 # a dict of data to be stored in state file
3131 # a dict of data to be stored in state file
3130 statedata = {}
3132 statedata = {}
3131 # list of new nodes created by ongoing graft
3133 # list of new nodes created by ongoing graft
3132 statedata[b'newnodes'] = []
3134 statedata[b'newnodes'] = []
3133
3135
3134 cmdutil.resolve_commit_options(ui, opts)
3136 cmdutil.resolve_commit_options(ui, opts)
3135
3137
3136 editor = cmdutil.getcommiteditor(editform=b'graft', **opts)
3138 editor = cmdutil.getcommiteditor(editform=b'graft', **opts)
3137
3139
3138 cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
3140 cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
3139
3141
3140 cont = False
3142 cont = False
3141 if opts.get('no_commit'):
3143 if opts.get('no_commit'):
3142 cmdutil.check_incompatible_arguments(
3144 cmdutil.check_incompatible_arguments(
3143 opts,
3145 opts,
3144 'no_commit',
3146 'no_commit',
3145 ['edit', 'currentuser', 'currentdate', 'log'],
3147 ['edit', 'currentuser', 'currentdate', 'log'],
3146 )
3148 )
3147
3149
3148 graftstate = statemod.cmdstate(repo, b'graftstate')
3150 graftstate = statemod.cmdstate(repo, b'graftstate')
3149
3151
3150 if opts.get('stop'):
3152 if opts.get('stop'):
3151 cmdutil.check_incompatible_arguments(
3153 cmdutil.check_incompatible_arguments(
3152 opts,
3154 opts,
3153 'stop',
3155 'stop',
3154 [
3156 [
3155 'edit',
3157 'edit',
3156 'log',
3158 'log',
3157 'user',
3159 'user',
3158 'date',
3160 'date',
3159 'currentdate',
3161 'currentdate',
3160 'currentuser',
3162 'currentuser',
3161 'rev',
3163 'rev',
3162 ],
3164 ],
3163 )
3165 )
3164 return _stopgraft(ui, repo, graftstate)
3166 return _stopgraft(ui, repo, graftstate)
3165 elif opts.get('abort'):
3167 elif opts.get('abort'):
3166 cmdutil.check_incompatible_arguments(
3168 cmdutil.check_incompatible_arguments(
3167 opts,
3169 opts,
3168 'abort',
3170 'abort',
3169 [
3171 [
3170 'edit',
3172 'edit',
3171 'log',
3173 'log',
3172 'user',
3174 'user',
3173 'date',
3175 'date',
3174 'currentdate',
3176 'currentdate',
3175 'currentuser',
3177 'currentuser',
3176 'rev',
3178 'rev',
3177 ],
3179 ],
3178 )
3180 )
3179 return cmdutil.abortgraft(ui, repo, graftstate)
3181 return cmdutil.abortgraft(ui, repo, graftstate)
3180 elif opts.get('continue'):
3182 elif opts.get('continue'):
3181 cont = True
3183 cont = True
3182 if revs:
3184 if revs:
3183 raise error.InputError(_(b"can't specify --continue and revisions"))
3185 raise error.InputError(_(b"can't specify --continue and revisions"))
3184 # read in unfinished revisions
3186 # read in unfinished revisions
3185 if graftstate.exists():
3187 if graftstate.exists():
3186 statedata = cmdutil.readgraftstate(repo, graftstate)
3188 statedata = cmdutil.readgraftstate(repo, graftstate)
3187 if statedata.get(b'date'):
3189 if statedata.get(b'date'):
3188 opts['date'] = statedata[b'date']
3190 opts['date'] = statedata[b'date']
3189 if statedata.get(b'user'):
3191 if statedata.get(b'user'):
3190 opts['user'] = statedata[b'user']
3192 opts['user'] = statedata[b'user']
3191 if statedata.get(b'log'):
3193 if statedata.get(b'log'):
3192 opts['log'] = True
3194 opts['log'] = True
3193 if statedata.get(b'no_commit'):
3195 if statedata.get(b'no_commit'):
3194 opts['no_commit'] = statedata.get(b'no_commit')
3196 opts['no_commit'] = statedata.get(b'no_commit')
3195 if statedata.get(b'base'):
3197 if statedata.get(b'base'):
3196 opts['base'] = statedata.get(b'base')
3198 opts['base'] = statedata.get(b'base')
3197 nodes = statedata[b'nodes']
3199 nodes = statedata[b'nodes']
3198 revs = [repo[node].rev() for node in nodes]
3200 revs = [repo[node].rev() for node in nodes]
3199 else:
3201 else:
3200 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3202 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3201 else:
3203 else:
3202 if not revs:
3204 if not revs:
3203 raise error.InputError(_(b'no revisions specified'))
3205 raise error.InputError(_(b'no revisions specified'))
3204 cmdutil.checkunfinished(repo)
3206 cmdutil.checkunfinished(repo)
3205 cmdutil.bailifchanged(repo)
3207 cmdutil.bailifchanged(repo)
3206 revs = logcmdutil.revrange(repo, revs)
3208 revs = logcmdutil.revrange(repo, revs)
3207
3209
3208 skipped = set()
3210 skipped = set()
3209 basectx = None
3211 basectx = None
3210 if opts.get('base'):
3212 if opts.get('base'):
3211 basectx = logcmdutil.revsingle(repo, opts['base'], None)
3213 basectx = logcmdutil.revsingle(repo, opts['base'], None)
3212 if basectx is None:
3214 if basectx is None:
3213 # check for merges
3215 # check for merges
3214 for rev in repo.revs(b'%ld and merge()', revs):
3216 for rev in repo.revs(b'%ld and merge()', revs):
3215 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3217 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3216 skipped.add(rev)
3218 skipped.add(rev)
3217 revs = [r for r in revs if r not in skipped]
3219 revs = [r for r in revs if r not in skipped]
3218 if not revs:
3220 if not revs:
3219 return -1
3221 return -1
3220 if basectx is not None and len(revs) != 1:
3222 if basectx is not None and len(revs) != 1:
3221 raise error.InputError(_(b'only one revision allowed with --base '))
3223 raise error.InputError(_(b'only one revision allowed with --base '))
3222
3224
3223 # Don't check in the --continue case, in effect retaining --force across
3225 # Don't check in the --continue case, in effect retaining --force across
3224 # --continues. That's because without --force, any revisions we decided to
3226 # --continues. That's because without --force, any revisions we decided to
3225 # skip would have been filtered out here, so they wouldn't have made their
3227 # skip would have been filtered out here, so they wouldn't have made their
3226 # way to the graftstate. With --force, any revisions we would have otherwise
3228 # way to the graftstate. With --force, any revisions we would have otherwise
3227 # skipped would not have been filtered out, and if they hadn't been applied
3229 # skipped would not have been filtered out, and if they hadn't been applied
3228 # already, they'd have been in the graftstate.
3230 # already, they'd have been in the graftstate.
3229 if not (cont or opts.get('force')) and basectx is None:
3231 if not (cont or opts.get('force')) and basectx is None:
3230 # check for ancestors of dest branch
3232 # check for ancestors of dest branch
3231 ancestors = repo.revs(b'%ld & (::.)', revs)
3233 ancestors = repo.revs(b'%ld & (::.)', revs)
3232 for rev in ancestors:
3234 for rev in ancestors:
3233 ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
3235 ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
3234
3236
3235 revs = [r for r in revs if r not in ancestors]
3237 revs = [r for r in revs if r not in ancestors]
3236
3238
3237 if not revs:
3239 if not revs:
3238 return -1
3240 return -1
3239
3241
3240 # analyze revs for earlier grafts
3242 # analyze revs for earlier grafts
3241 ids = {}
3243 ids = {}
3242 for ctx in repo.set(b"%ld", revs):
3244 for ctx in repo.set(b"%ld", revs):
3243 ids[ctx.hex()] = ctx.rev()
3245 ids[ctx.hex()] = ctx.rev()
3244 n = ctx.extra().get(b'source')
3246 n = ctx.extra().get(b'source')
3245 if n:
3247 if n:
3246 ids[n] = ctx.rev()
3248 ids[n] = ctx.rev()
3247
3249
3248 # check ancestors for earlier grafts
3250 # check ancestors for earlier grafts
3249 ui.debug(b'scanning for duplicate grafts\n')
3251 ui.debug(b'scanning for duplicate grafts\n')
3250
3252
3251 # The only changesets we can be sure doesn't contain grafts of any
3253 # The only changesets we can be sure doesn't contain grafts of any
3252 # revs, are the ones that are common ancestors of *all* revs:
3254 # revs, are the ones that are common ancestors of *all* revs:
3253 for rev in repo.revs(b'only(%d,ancestor(%ld))', repo[b'.'].rev(), revs):
3255 for rev in repo.revs(b'only(%d,ancestor(%ld))', repo[b'.'].rev(), revs):
3254 ctx = repo[rev]
3256 ctx = repo[rev]
3255 n = ctx.extra().get(b'source')
3257 n = ctx.extra().get(b'source')
3256 if n in ids:
3258 if n in ids:
3257 try:
3259 try:
3258 r = repo[n].rev()
3260 r = repo[n].rev()
3259 except error.RepoLookupError:
3261 except error.RepoLookupError:
3260 r = None
3262 r = None
3261 if r in revs:
3263 if r in revs:
3262 ui.warn(
3264 ui.warn(
3263 _(
3265 _(
3264 b'skipping revision %d:%s '
3266 b'skipping revision %d:%s '
3265 b'(already grafted to %d:%s)\n'
3267 b'(already grafted to %d:%s)\n'
3266 )
3268 )
3267 % (r, repo[r], rev, ctx)
3269 % (r, repo[r], rev, ctx)
3268 )
3270 )
3269 revs.remove(r)
3271 revs.remove(r)
3270 elif ids[n] in revs:
3272 elif ids[n] in revs:
3271 if r is None:
3273 if r is None:
3272 ui.warn(
3274 ui.warn(
3273 _(
3275 _(
3274 b'skipping already grafted revision %d:%s '
3276 b'skipping already grafted revision %d:%s '
3275 b'(%d:%s also has unknown origin %s)\n'
3277 b'(%d:%s also has unknown origin %s)\n'
3276 )
3278 )
3277 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3279 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3278 )
3280 )
3279 else:
3281 else:
3280 ui.warn(
3282 ui.warn(
3281 _(
3283 _(
3282 b'skipping already grafted revision %d:%s '
3284 b'skipping already grafted revision %d:%s '
3283 b'(%d:%s also has origin %d:%s)\n'
3285 b'(%d:%s also has origin %d:%s)\n'
3284 )
3286 )
3285 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3287 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3286 )
3288 )
3287 revs.remove(ids[n])
3289 revs.remove(ids[n])
3288 elif ctx.hex() in ids:
3290 elif ctx.hex() in ids:
3289 r = ids[ctx.hex()]
3291 r = ids[ctx.hex()]
3290 if r in revs:
3292 if r in revs:
3291 ui.warn(
3293 ui.warn(
3292 _(
3294 _(
3293 b'skipping already grafted revision %d:%s '
3295 b'skipping already grafted revision %d:%s '
3294 b'(was grafted from %d:%s)\n'
3296 b'(was grafted from %d:%s)\n'
3295 )
3297 )
3296 % (r, repo[r], rev, ctx)
3298 % (r, repo[r], rev, ctx)
3297 )
3299 )
3298 revs.remove(r)
3300 revs.remove(r)
3299 if not revs:
3301 if not revs:
3300 return -1
3302 return -1
3301
3303
3302 if opts.get('no_commit'):
3304 if opts.get('no_commit'):
3303 statedata[b'no_commit'] = True
3305 statedata[b'no_commit'] = True
3304 if opts.get('base'):
3306 if opts.get('base'):
3305 statedata[b'base'] = opts['base']
3307 statedata[b'base'] = opts['base']
3306 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3308 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3307 desc = b'%d:%s "%s"' % (
3309 desc = b'%d:%s "%s"' % (
3308 ctx.rev(),
3310 ctx.rev(),
3309 ctx,
3311 ctx,
3310 ctx.description().split(b'\n', 1)[0],
3312 ctx.description().split(b'\n', 1)[0],
3311 )
3313 )
3312 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3314 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3313 if names:
3315 if names:
3314 desc += b' (%s)' % b' '.join(names)
3316 desc += b' (%s)' % b' '.join(names)
3315 ui.status(_(b'grafting %s\n') % desc)
3317 ui.status(_(b'grafting %s\n') % desc)
3316 if opts.get('dry_run'):
3318 if opts.get('dry_run'):
3317 continue
3319 continue
3318
3320
3319 source = ctx.extra().get(b'source')
3321 source = ctx.extra().get(b'source')
3320 extra = {}
3322 extra = {}
3321 if source:
3323 if source:
3322 extra[b'source'] = source
3324 extra[b'source'] = source
3323 extra[b'intermediate-source'] = ctx.hex()
3325 extra[b'intermediate-source'] = ctx.hex()
3324 else:
3326 else:
3325 extra[b'source'] = ctx.hex()
3327 extra[b'source'] = ctx.hex()
3326 user = ctx.user()
3328 user = ctx.user()
3327 if opts.get('user'):
3329 if opts.get('user'):
3328 user = opts['user']
3330 user = opts['user']
3329 statedata[b'user'] = user
3331 statedata[b'user'] = user
3330 date = ctx.date()
3332 date = ctx.date()
3331 if opts.get('date'):
3333 if opts.get('date'):
3332 date = opts['date']
3334 date = opts['date']
3333 statedata[b'date'] = date
3335 statedata[b'date'] = date
3334 message = ctx.description()
3336 message = ctx.description()
3335 if opts.get('log'):
3337 if opts.get('log'):
3336 message += b'\n(grafted from %s)' % ctx.hex()
3338 message += b'\n(grafted from %s)' % ctx.hex()
3337 statedata[b'log'] = True
3339 statedata[b'log'] = True
3338
3340
3339 # we don't merge the first commit when continuing
3341 # we don't merge the first commit when continuing
3340 if not cont:
3342 if not cont:
3341 # perform the graft merge with p1(rev) as 'ancestor'
3343 # perform the graft merge with p1(rev) as 'ancestor'
3342 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
3344 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
3343 base = ctx.p1() if basectx is None else basectx
3345 base = ctx.p1() if basectx is None else basectx
3344 with ui.configoverride(overrides, b'graft'):
3346 with ui.configoverride(overrides, b'graft'):
3345 stats = mergemod.graft(
3347 stats = mergemod.graft(
3346 repo, ctx, base, [b'local', b'graft', b'parent of graft']
3348 repo, ctx, base, [b'local', b'graft', b'parent of graft']
3347 )
3349 )
3348 # report any conflicts
3350 # report any conflicts
3349 if stats.unresolvedcount > 0:
3351 if stats.unresolvedcount > 0:
3350 # write out state for --continue
3352 # write out state for --continue
3351 nodes = [repo[rev].hex() for rev in revs[pos:]]
3353 nodes = [repo[rev].hex() for rev in revs[pos:]]
3352 statedata[b'nodes'] = nodes
3354 statedata[b'nodes'] = nodes
3353 stateversion = 1
3355 stateversion = 1
3354 graftstate.save(stateversion, statedata)
3356 graftstate.save(stateversion, statedata)
3355 ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
3357 ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
3356 ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
3358 ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
3357 return 1
3359 return 1
3358 else:
3360 else:
3359 cont = False
3361 cont = False
3360
3362
3361 # commit if --no-commit is false
3363 # commit if --no-commit is false
3362 if not opts.get('no_commit'):
3364 if not opts.get('no_commit'):
3363 node = repo.commit(
3365 node = repo.commit(
3364 text=message, user=user, date=date, extra=extra, editor=editor
3366 text=message, user=user, date=date, extra=extra, editor=editor
3365 )
3367 )
3366 if node is None:
3368 if node is None:
3367 ui.warn(
3369 ui.warn(
3368 _(b'note: graft of %d:%s created no changes to commit\n')
3370 _(b'note: graft of %d:%s created no changes to commit\n')
3369 % (ctx.rev(), ctx)
3371 % (ctx.rev(), ctx)
3370 )
3372 )
3371 # checking that newnodes exist because old state files won't have it
3373 # checking that newnodes exist because old state files won't have it
3372 elif statedata.get(b'newnodes') is not None:
3374 elif statedata.get(b'newnodes') is not None:
3373 nn = statedata[b'newnodes']
3375 nn = statedata[b'newnodes']
3374 assert isinstance(nn, list) # list of bytes
3376 assert isinstance(nn, list) # list of bytes
3375 nn.append(node)
3377 nn.append(node)
3376
3378
3377 # remove state when we complete successfully
3379 # remove state when we complete successfully
3378 if not opts.get('dry_run'):
3380 if not opts.get('dry_run'):
3379 graftstate.delete()
3381 graftstate.delete()
3380
3382
3381 return 0
3383 return 0
3382
3384
3383
3385
3384 def _stopgraft(ui, repo, graftstate):
3386 def _stopgraft(ui, repo, graftstate):
3385 """stop the interrupted graft"""
3387 """stop the interrupted graft"""
3386 if not graftstate.exists():
3388 if not graftstate.exists():
3387 raise error.StateError(_(b"no interrupted graft found"))
3389 raise error.StateError(_(b"no interrupted graft found"))
3388 pctx = repo[b'.']
3390 pctx = repo[b'.']
3389 mergemod.clean_update(pctx)
3391 mergemod.clean_update(pctx)
3390 graftstate.delete()
3392 graftstate.delete()
3391 ui.status(_(b"stopped the interrupted graft\n"))
3393 ui.status(_(b"stopped the interrupted graft\n"))
3392 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3394 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3393 return 0
3395 return 0
3394
3396
3395
3397
3396 statemod.addunfinished(
3398 statemod.addunfinished(
3397 b'graft',
3399 b'graft',
3398 fname=b'graftstate',
3400 fname=b'graftstate',
3399 clearable=True,
3401 clearable=True,
3400 stopflag=True,
3402 stopflag=True,
3401 continueflag=True,
3403 continueflag=True,
3402 abortfunc=cmdutil.hgabortgraft,
3404 abortfunc=cmdutil.hgabortgraft,
3403 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3405 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3404 )
3406 )
3405
3407
3406
3408
3407 @command(
3409 @command(
3408 b'grep',
3410 b'grep',
3409 [
3411 [
3410 (b'0', b'print0', None, _(b'end fields with NUL')),
3412 (b'0', b'print0', None, _(b'end fields with NUL')),
3411 (b'', b'all', None, _(b'an alias to --diff (DEPRECATED)')),
3413 (b'', b'all', None, _(b'an alias to --diff (DEPRECATED)')),
3412 (
3414 (
3413 b'',
3415 b'',
3414 b'diff',
3416 b'diff',
3415 None,
3417 None,
3416 _(
3418 _(
3417 b'search revision differences for when the pattern was added '
3419 b'search revision differences for when the pattern was added '
3418 b'or removed'
3420 b'or removed'
3419 ),
3421 ),
3420 ),
3422 ),
3421 (b'a', b'text', None, _(b'treat all files as text')),
3423 (b'a', b'text', None, _(b'treat all files as text')),
3422 (
3424 (
3423 b'f',
3425 b'f',
3424 b'follow',
3426 b'follow',
3425 None,
3427 None,
3426 _(
3428 _(
3427 b'follow changeset history,'
3429 b'follow changeset history,'
3428 b' or file history across copies and renames'
3430 b' or file history across copies and renames'
3429 ),
3431 ),
3430 ),
3432 ),
3431 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3433 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3432 (
3434 (
3433 b'l',
3435 b'l',
3434 b'files-with-matches',
3436 b'files-with-matches',
3435 None,
3437 None,
3436 _(b'print only filenames and revisions that match'),
3438 _(b'print only filenames and revisions that match'),
3437 ),
3439 ),
3438 (b'n', b'line-number', None, _(b'print matching line numbers')),
3440 (b'n', b'line-number', None, _(b'print matching line numbers')),
3439 (
3441 (
3440 b'r',
3442 b'r',
3441 b'rev',
3443 b'rev',
3442 [],
3444 [],
3443 _(b'search files changed within revision range'),
3445 _(b'search files changed within revision range'),
3444 _(b'REV'),
3446 _(b'REV'),
3445 ),
3447 ),
3446 (
3448 (
3447 b'',
3449 b'',
3448 b'all-files',
3450 b'all-files',
3449 None,
3451 None,
3450 _(
3452 _(
3451 b'include all files in the changeset while grepping (DEPRECATED)'
3453 b'include all files in the changeset while grepping (DEPRECATED)'
3452 ),
3454 ),
3453 ),
3455 ),
3454 (b'u', b'user', None, _(b'list the author (long with -v)')),
3456 (b'u', b'user', None, _(b'list the author (long with -v)')),
3455 (b'd', b'date', None, _(b'list the date (short with -q)')),
3457 (b'd', b'date', None, _(b'list the date (short with -q)')),
3456 ]
3458 ]
3457 + formatteropts
3459 + formatteropts
3458 + walkopts,
3460 + walkopts,
3459 _(b'[--diff] [OPTION]... PATTERN [FILE]...'),
3461 _(b'[--diff] [OPTION]... PATTERN [FILE]...'),
3460 helpcategory=command.CATEGORY_FILE_CONTENTS,
3462 helpcategory=command.CATEGORY_FILE_CONTENTS,
3461 inferrepo=True,
3463 inferrepo=True,
3462 intents={INTENT_READONLY},
3464 intents={INTENT_READONLY},
3463 )
3465 )
3464 def grep(ui, repo, pattern, *pats, **opts):
3466 def grep(ui, repo, pattern, *pats, **opts):
3465 """search for a pattern in specified files
3467 """search for a pattern in specified files
3466
3468
3467 Search the working directory or revision history for a regular
3469 Search the working directory or revision history for a regular
3468 expression in the specified files for the entire repository.
3470 expression in the specified files for the entire repository.
3469
3471
3470 By default, grep searches the repository files in the working
3472 By default, grep searches the repository files in the working
3471 directory and prints the files where it finds a match. To specify
3473 directory and prints the files where it finds a match. To specify
3472 historical revisions instead of the working directory, use the
3474 historical revisions instead of the working directory, use the
3473 --rev flag.
3475 --rev flag.
3474
3476
3475 To search instead historical revision differences that contains a
3477 To search instead historical revision differences that contains a
3476 change in match status ("-" for a match that becomes a non-match,
3478 change in match status ("-" for a match that becomes a non-match,
3477 or "+" for a non-match that becomes a match), use the --diff flag.
3479 or "+" for a non-match that becomes a match), use the --diff flag.
3478
3480
3479 PATTERN can be any Python (roughly Perl-compatible) regular
3481 PATTERN can be any Python (roughly Perl-compatible) regular
3480 expression.
3482 expression.
3481
3483
3482 If no FILEs are specified and the --rev flag isn't supplied, all
3484 If no FILEs are specified and the --rev flag isn't supplied, all
3483 files in the working directory are searched. When using the --rev
3485 files in the working directory are searched. When using the --rev
3484 flag and specifying FILEs, use the --follow argument to also
3486 flag and specifying FILEs, use the --follow argument to also
3485 follow the specified FILEs across renames and copies.
3487 follow the specified FILEs across renames and copies.
3486
3488
3487 .. container:: verbose
3489 .. container:: verbose
3488
3490
3489 Template:
3491 Template:
3490
3492
3491 The following keywords are supported in addition to the common template
3493 The following keywords are supported in addition to the common template
3492 keywords and functions. See also :hg:`help templates`.
3494 keywords and functions. See also :hg:`help templates`.
3493
3495
3494 :change: String. Character denoting insertion ``+`` or removal ``-``.
3496 :change: String. Character denoting insertion ``+`` or removal ``-``.
3495 Available if ``--diff`` is specified.
3497 Available if ``--diff`` is specified.
3496 :lineno: Integer. Line number of the match.
3498 :lineno: Integer. Line number of the match.
3497 :path: String. Repository-absolute path of the file.
3499 :path: String. Repository-absolute path of the file.
3498 :texts: List of text chunks.
3500 :texts: List of text chunks.
3499
3501
3500 And each entry of ``{texts}`` provides the following sub-keywords.
3502 And each entry of ``{texts}`` provides the following sub-keywords.
3501
3503
3502 :matched: Boolean. True if the chunk matches the specified pattern.
3504 :matched: Boolean. True if the chunk matches the specified pattern.
3503 :text: String. Chunk content.
3505 :text: String. Chunk content.
3504
3506
3505 See :hg:`help templates.operators` for the list expansion syntax.
3507 See :hg:`help templates.operators` for the list expansion syntax.
3506
3508
3507 Returns 0 if a match is found, 1 otherwise.
3509 Returns 0 if a match is found, 1 otherwise.
3508
3510
3509 """
3511 """
3510 cmdutil.check_incompatible_arguments(opts, 'all_files', ['all', 'diff'])
3512 cmdutil.check_incompatible_arguments(opts, 'all_files', ['all', 'diff'])
3511 opts = pycompat.byteskwargs(opts)
3513 opts = pycompat.byteskwargs(opts)
3512 diff = opts.get(b'all') or opts.get(b'diff')
3514 diff = opts.get(b'all') or opts.get(b'diff')
3513 follow = opts.get(b'follow')
3515 follow = opts.get(b'follow')
3514 if opts.get(b'all_files') is None and not diff:
3516 if opts.get(b'all_files') is None and not diff:
3515 opts[b'all_files'] = True
3517 opts[b'all_files'] = True
3516 plaingrep = (
3518 plaingrep = (
3517 opts.get(b'all_files')
3519 opts.get(b'all_files')
3518 and not opts.get(b'rev')
3520 and not opts.get(b'rev')
3519 and not opts.get(b'follow')
3521 and not opts.get(b'follow')
3520 )
3522 )
3521 all_files = opts.get(b'all_files')
3523 all_files = opts.get(b'all_files')
3522 if plaingrep:
3524 if plaingrep:
3523 opts[b'rev'] = [b'wdir()']
3525 opts[b'rev'] = [b'wdir()']
3524
3526
3525 reflags = re.M
3527 reflags = re.M
3526 if opts.get(b'ignore_case'):
3528 if opts.get(b'ignore_case'):
3527 reflags |= re.I
3529 reflags |= re.I
3528 try:
3530 try:
3529 regexp = util.re.compile(pattern, reflags)
3531 regexp = util.re.compile(pattern, reflags)
3530 except re.error as inst:
3532 except re.error as inst:
3531 ui.warn(
3533 ui.warn(
3532 _(b"grep: invalid match pattern: %s\n")
3534 _(b"grep: invalid match pattern: %s\n")
3533 % stringutil.forcebytestr(inst)
3535 % stringutil.forcebytestr(inst)
3534 )
3536 )
3535 return 1
3537 return 1
3536 sep, eol = b':', b'\n'
3538 sep, eol = b':', b'\n'
3537 if opts.get(b'print0'):
3539 if opts.get(b'print0'):
3538 sep = eol = b'\0'
3540 sep = eol = b'\0'
3539
3541
3540 searcher = grepmod.grepsearcher(
3542 searcher = grepmod.grepsearcher(
3541 ui, repo, regexp, all_files=all_files, diff=diff, follow=follow
3543 ui, repo, regexp, all_files=all_files, diff=diff, follow=follow
3542 )
3544 )
3543
3545
3544 getfile = searcher._getfile
3546 getfile = searcher._getfile
3545
3547
3546 uipathfn = scmutil.getuipathfn(repo)
3548 uipathfn = scmutil.getuipathfn(repo)
3547
3549
3548 def display(fm, fn, ctx, pstates, states):
3550 def display(fm, fn, ctx, pstates, states):
3549 rev = scmutil.intrev(ctx)
3551 rev = scmutil.intrev(ctx)
3550 if fm.isplain():
3552 if fm.isplain():
3551 formatuser = ui.shortuser
3553 formatuser = ui.shortuser
3552 else:
3554 else:
3553 formatuser = pycompat.bytestr
3555 formatuser = pycompat.bytestr
3554 if ui.quiet:
3556 if ui.quiet:
3555 datefmt = b'%Y-%m-%d'
3557 datefmt = b'%Y-%m-%d'
3556 else:
3558 else:
3557 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3559 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3558 found = False
3560 found = False
3559
3561
3560 @util.cachefunc
3562 @util.cachefunc
3561 def binary():
3563 def binary():
3562 flog = getfile(fn)
3564 flog = getfile(fn)
3563 try:
3565 try:
3564 return stringutil.binary(flog.read(ctx.filenode(fn)))
3566 return stringutil.binary(flog.read(ctx.filenode(fn)))
3565 except error.WdirUnsupported:
3567 except error.WdirUnsupported:
3566 return ctx[fn].isbinary()
3568 return ctx[fn].isbinary()
3567
3569
3568 fieldnamemap = {b'linenumber': b'lineno'}
3570 fieldnamemap = {b'linenumber': b'lineno'}
3569 if diff:
3571 if diff:
3570 iter = grepmod.difflinestates(pstates, states)
3572 iter = grepmod.difflinestates(pstates, states)
3571 else:
3573 else:
3572 iter = [(b'', l) for l in states]
3574 iter = [(b'', l) for l in states]
3573 for change, l in iter:
3575 for change, l in iter:
3574 fm.startitem()
3576 fm.startitem()
3575 fm.context(ctx=ctx)
3577 fm.context(ctx=ctx)
3576 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3578 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3577 fm.plain(uipathfn(fn), label=b'grep.filename')
3579 fm.plain(uipathfn(fn), label=b'grep.filename')
3578
3580
3579 cols = [
3581 cols = [
3580 (b'rev', b'%d', rev, not plaingrep, b''),
3582 (b'rev', b'%d', rev, not plaingrep, b''),
3581 (
3583 (
3582 b'linenumber',
3584 b'linenumber',
3583 b'%d',
3585 b'%d',
3584 l.linenum,
3586 l.linenum,
3585 opts.get(b'line_number'),
3587 opts.get(b'line_number'),
3586 b'',
3588 b'',
3587 ),
3589 ),
3588 ]
3590 ]
3589 if diff:
3591 if diff:
3590 cols.append(
3592 cols.append(
3591 (
3593 (
3592 b'change',
3594 b'change',
3593 b'%s',
3595 b'%s',
3594 change,
3596 change,
3595 True,
3597 True,
3596 b'grep.inserted '
3598 b'grep.inserted '
3597 if change == b'+'
3599 if change == b'+'
3598 else b'grep.deleted ',
3600 else b'grep.deleted ',
3599 )
3601 )
3600 )
3602 )
3601 cols.extend(
3603 cols.extend(
3602 [
3604 [
3603 (
3605 (
3604 b'user',
3606 b'user',
3605 b'%s',
3607 b'%s',
3606 formatuser(ctx.user()),
3608 formatuser(ctx.user()),
3607 opts.get(b'user'),
3609 opts.get(b'user'),
3608 b'',
3610 b'',
3609 ),
3611 ),
3610 (
3612 (
3611 b'date',
3613 b'date',
3612 b'%s',
3614 b'%s',
3613 fm.formatdate(ctx.date(), datefmt),
3615 fm.formatdate(ctx.date(), datefmt),
3614 opts.get(b'date'),
3616 opts.get(b'date'),
3615 b'',
3617 b'',
3616 ),
3618 ),
3617 ]
3619 ]
3618 )
3620 )
3619 for name, fmt, data, cond, extra_label in cols:
3621 for name, fmt, data, cond, extra_label in cols:
3620 if cond:
3622 if cond:
3621 fm.plain(sep, label=b'grep.sep')
3623 fm.plain(sep, label=b'grep.sep')
3622 field = fieldnamemap.get(name, name)
3624 field = fieldnamemap.get(name, name)
3623 label = extra_label + (b'grep.%s' % name)
3625 label = extra_label + (b'grep.%s' % name)
3624 fm.condwrite(cond, field, fmt, data, label=label)
3626 fm.condwrite(cond, field, fmt, data, label=label)
3625 if not opts.get(b'files_with_matches'):
3627 if not opts.get(b'files_with_matches'):
3626 fm.plain(sep, label=b'grep.sep')
3628 fm.plain(sep, label=b'grep.sep')
3627 if not opts.get(b'text') and binary():
3629 if not opts.get(b'text') and binary():
3628 fm.plain(_(b" Binary file matches"))
3630 fm.plain(_(b" Binary file matches"))
3629 else:
3631 else:
3630 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3632 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3631 fm.plain(eol)
3633 fm.plain(eol)
3632 found = True
3634 found = True
3633 if opts.get(b'files_with_matches'):
3635 if opts.get(b'files_with_matches'):
3634 break
3636 break
3635 return found
3637 return found
3636
3638
3637 def displaymatches(fm, l):
3639 def displaymatches(fm, l):
3638 p = 0
3640 p = 0
3639 for s, e in l.findpos(regexp):
3641 for s, e in l.findpos(regexp):
3640 if p < s:
3642 if p < s:
3641 fm.startitem()
3643 fm.startitem()
3642 fm.write(b'text', b'%s', l.line[p:s])
3644 fm.write(b'text', b'%s', l.line[p:s])
3643 fm.data(matched=False)
3645 fm.data(matched=False)
3644 fm.startitem()
3646 fm.startitem()
3645 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3647 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3646 fm.data(matched=True)
3648 fm.data(matched=True)
3647 p = e
3649 p = e
3648 if p < len(l.line):
3650 if p < len(l.line):
3649 fm.startitem()
3651 fm.startitem()
3650 fm.write(b'text', b'%s', l.line[p:])
3652 fm.write(b'text', b'%s', l.line[p:])
3651 fm.data(matched=False)
3653 fm.data(matched=False)
3652 fm.end()
3654 fm.end()
3653
3655
3654 found = False
3656 found = False
3655
3657
3656 wopts = logcmdutil.walkopts(
3658 wopts = logcmdutil.walkopts(
3657 pats=pats,
3659 pats=pats,
3658 opts=opts,
3660 opts=opts,
3659 revspec=opts[b'rev'],
3661 revspec=opts[b'rev'],
3660 include_pats=opts[b'include'],
3662 include_pats=opts[b'include'],
3661 exclude_pats=opts[b'exclude'],
3663 exclude_pats=opts[b'exclude'],
3662 follow=follow,
3664 follow=follow,
3663 force_changelog_traversal=all_files,
3665 force_changelog_traversal=all_files,
3664 filter_revisions_by_pats=not all_files,
3666 filter_revisions_by_pats=not all_files,
3665 )
3667 )
3666 revs, makefilematcher = logcmdutil.makewalker(repo, wopts)
3668 revs, makefilematcher = logcmdutil.makewalker(repo, wopts)
3667
3669
3668 ui.pager(b'grep')
3670 ui.pager(b'grep')
3669 fm = ui.formatter(b'grep', opts)
3671 fm = ui.formatter(b'grep', opts)
3670 for fn, ctx, pstates, states in searcher.searchfiles(revs, makefilematcher):
3672 for fn, ctx, pstates, states in searcher.searchfiles(revs, makefilematcher):
3671 r = display(fm, fn, ctx, pstates, states)
3673 r = display(fm, fn, ctx, pstates, states)
3672 found = found or r
3674 found = found or r
3673 if r and not diff and not all_files:
3675 if r and not diff and not all_files:
3674 searcher.skipfile(fn, ctx.rev())
3676 searcher.skipfile(fn, ctx.rev())
3675 fm.end()
3677 fm.end()
3676
3678
3677 return not found
3679 return not found
3678
3680
3679
3681
3680 @command(
3682 @command(
3681 b'heads',
3683 b'heads',
3682 [
3684 [
3683 (
3685 (
3684 b'r',
3686 b'r',
3685 b'rev',
3687 b'rev',
3686 b'',
3688 b'',
3687 _(b'show only heads which are descendants of STARTREV'),
3689 _(b'show only heads which are descendants of STARTREV'),
3688 _(b'STARTREV'),
3690 _(b'STARTREV'),
3689 ),
3691 ),
3690 (b't', b'topo', False, _(b'show topological heads only')),
3692 (b't', b'topo', False, _(b'show topological heads only')),
3691 (
3693 (
3692 b'a',
3694 b'a',
3693 b'active',
3695 b'active',
3694 False,
3696 False,
3695 _(b'show active branchheads only (DEPRECATED)'),
3697 _(b'show active branchheads only (DEPRECATED)'),
3696 ),
3698 ),
3697 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3699 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3698 ]
3700 ]
3699 + templateopts,
3701 + templateopts,
3700 _(b'[-ct] [-r STARTREV] [REV]...'),
3702 _(b'[-ct] [-r STARTREV] [REV]...'),
3701 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3703 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3702 intents={INTENT_READONLY},
3704 intents={INTENT_READONLY},
3703 )
3705 )
3704 def heads(ui, repo, *branchrevs, **opts):
3706 def heads(ui, repo, *branchrevs, **opts):
3705 """show branch heads
3707 """show branch heads
3706
3708
3707 With no arguments, show all open branch heads in the repository.
3709 With no arguments, show all open branch heads in the repository.
3708 Branch heads are changesets that have no descendants on the
3710 Branch heads are changesets that have no descendants on the
3709 same branch. They are where development generally takes place and
3711 same branch. They are where development generally takes place and
3710 are the usual targets for update and merge operations.
3712 are the usual targets for update and merge operations.
3711
3713
3712 If one or more REVs are given, only open branch heads on the
3714 If one or more REVs are given, only open branch heads on the
3713 branches associated with the specified changesets are shown. This
3715 branches associated with the specified changesets are shown. This
3714 means that you can use :hg:`heads .` to see the heads on the
3716 means that you can use :hg:`heads .` to see the heads on the
3715 currently checked-out branch.
3717 currently checked-out branch.
3716
3718
3717 If -c/--closed is specified, also show branch heads marked closed
3719 If -c/--closed is specified, also show branch heads marked closed
3718 (see :hg:`commit --close-branch`).
3720 (see :hg:`commit --close-branch`).
3719
3721
3720 If STARTREV is specified, only those heads that are descendants of
3722 If STARTREV is specified, only those heads that are descendants of
3721 STARTREV will be displayed.
3723 STARTREV will be displayed.
3722
3724
3723 If -t/--topo is specified, named branch mechanics will be ignored and only
3725 If -t/--topo is specified, named branch mechanics will be ignored and only
3724 topological heads (changesets with no children) will be shown.
3726 topological heads (changesets with no children) will be shown.
3725
3727
3726 Returns 0 if matching heads are found, 1 if not.
3728 Returns 0 if matching heads are found, 1 if not.
3727 """
3729 """
3728
3730
3729 opts = pycompat.byteskwargs(opts)
3731 opts = pycompat.byteskwargs(opts)
3730 start = None
3732 start = None
3731 rev = opts.get(b'rev')
3733 rev = opts.get(b'rev')
3732 if rev:
3734 if rev:
3733 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3735 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3734 start = logcmdutil.revsingle(repo, rev, None).node()
3736 start = logcmdutil.revsingle(repo, rev, None).node()
3735
3737
3736 if opts.get(b'topo'):
3738 if opts.get(b'topo'):
3737 heads = [repo[h] for h in repo.heads(start)]
3739 heads = [repo[h] for h in repo.heads(start)]
3738 else:
3740 else:
3739 heads = []
3741 heads = []
3740 for branch in repo.branchmap():
3742 for branch in repo.branchmap():
3741 heads += repo.branchheads(branch, start, opts.get(b'closed'))
3743 heads += repo.branchheads(branch, start, opts.get(b'closed'))
3742 heads = [repo[h] for h in heads]
3744 heads = [repo[h] for h in heads]
3743
3745
3744 if branchrevs:
3746 if branchrevs:
3745 branches = {
3747 branches = {
3746 repo[r].branch() for r in logcmdutil.revrange(repo, branchrevs)
3748 repo[r].branch() for r in logcmdutil.revrange(repo, branchrevs)
3747 }
3749 }
3748 heads = [h for h in heads if h.branch() in branches]
3750 heads = [h for h in heads if h.branch() in branches]
3749
3751
3750 if opts.get(b'active') and branchrevs:
3752 if opts.get(b'active') and branchrevs:
3751 dagheads = repo.heads(start)
3753 dagheads = repo.heads(start)
3752 heads = [h for h in heads if h.node() in dagheads]
3754 heads = [h for h in heads if h.node() in dagheads]
3753
3755
3754 if branchrevs:
3756 if branchrevs:
3755 haveheads = {h.branch() for h in heads}
3757 haveheads = {h.branch() for h in heads}
3756 if branches - haveheads:
3758 if branches - haveheads:
3757 headless = b', '.join(b for b in branches - haveheads)
3759 headless = b', '.join(b for b in branches - haveheads)
3758 msg = _(b'no open branch heads found on branches %s')
3760 msg = _(b'no open branch heads found on branches %s')
3759 if opts.get(b'rev'):
3761 if opts.get(b'rev'):
3760 msg += _(b' (started at %s)') % opts[b'rev']
3762 msg += _(b' (started at %s)') % opts[b'rev']
3761 ui.warn((msg + b'\n') % headless)
3763 ui.warn((msg + b'\n') % headless)
3762
3764
3763 if not heads:
3765 if not heads:
3764 return 1
3766 return 1
3765
3767
3766 ui.pager(b'heads')
3768 ui.pager(b'heads')
3767 heads = sorted(heads, key=lambda x: -(x.rev()))
3769 heads = sorted(heads, key=lambda x: -(x.rev()))
3768 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
3770 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
3769 for ctx in heads:
3771 for ctx in heads:
3770 displayer.show(ctx)
3772 displayer.show(ctx)
3771 displayer.close()
3773 displayer.close()
3772
3774
3773
3775
3774 @command(
3776 @command(
3775 b'help',
3777 b'help',
3776 [
3778 [
3777 (b'e', b'extension', None, _(b'show only help for extensions')),
3779 (b'e', b'extension', None, _(b'show only help for extensions')),
3778 (b'c', b'command', None, _(b'show only help for commands')),
3780 (b'c', b'command', None, _(b'show only help for commands')),
3779 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3781 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3780 (
3782 (
3781 b's',
3783 b's',
3782 b'system',
3784 b'system',
3783 [],
3785 [],
3784 _(b'show help for specific platform(s)'),
3786 _(b'show help for specific platform(s)'),
3785 _(b'PLATFORM'),
3787 _(b'PLATFORM'),
3786 ),
3788 ),
3787 ],
3789 ],
3788 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3790 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3789 helpcategory=command.CATEGORY_HELP,
3791 helpcategory=command.CATEGORY_HELP,
3790 norepo=True,
3792 norepo=True,
3791 intents={INTENT_READONLY},
3793 intents={INTENT_READONLY},
3792 )
3794 )
3793 def help_(ui, name=None, **opts):
3795 def help_(ui, name=None, **opts):
3794 """show help for a given topic or a help overview
3796 """show help for a given topic or a help overview
3795
3797
3796 With no arguments, print a list of commands with short help messages.
3798 With no arguments, print a list of commands with short help messages.
3797
3799
3798 Given a topic, extension, or command name, print help for that
3800 Given a topic, extension, or command name, print help for that
3799 topic.
3801 topic.
3800
3802
3801 Returns 0 if successful.
3803 Returns 0 if successful.
3802 """
3804 """
3803
3805
3804 keep = opts.get('system') or []
3806 keep = opts.get('system') or []
3805 if len(keep) == 0:
3807 if len(keep) == 0:
3806 if pycompat.sysplatform.startswith(b'win'):
3808 if pycompat.sysplatform.startswith(b'win'):
3807 keep.append(b'windows')
3809 keep.append(b'windows')
3808 elif pycompat.sysplatform == b'OpenVMS':
3810 elif pycompat.sysplatform == b'OpenVMS':
3809 keep.append(b'vms')
3811 keep.append(b'vms')
3810 elif pycompat.sysplatform == b'plan9':
3812 elif pycompat.sysplatform == b'plan9':
3811 keep.append(b'plan9')
3813 keep.append(b'plan9')
3812 else:
3814 else:
3813 keep.append(b'unix')
3815 keep.append(b'unix')
3814 keep.append(pycompat.sysplatform.lower())
3816 keep.append(pycompat.sysplatform.lower())
3815 if ui.verbose:
3817 if ui.verbose:
3816 keep.append(b'verbose')
3818 keep.append(b'verbose')
3817
3819
3818 commands = sys.modules[__name__]
3820 commands = sys.modules[__name__]
3819 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3821 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3820 ui.pager(b'help')
3822 ui.pager(b'help')
3821 ui.write(formatted)
3823 ui.write(formatted)
3822
3824
3823
3825
3824 @command(
3826 @command(
3825 b'identify|id',
3827 b'identify|id',
3826 [
3828 [
3827 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3829 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3828 (b'n', b'num', None, _(b'show local revision number')),
3830 (b'n', b'num', None, _(b'show local revision number')),
3829 (b'i', b'id', None, _(b'show global revision id')),
3831 (b'i', b'id', None, _(b'show global revision id')),
3830 (b'b', b'branch', None, _(b'show branch')),
3832 (b'b', b'branch', None, _(b'show branch')),
3831 (b't', b'tags', None, _(b'show tags')),
3833 (b't', b'tags', None, _(b'show tags')),
3832 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3834 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3833 ]
3835 ]
3834 + remoteopts
3836 + remoteopts
3835 + formatteropts,
3837 + formatteropts,
3836 _(b'[-nibtB] [-r REV] [SOURCE]'),
3838 _(b'[-nibtB] [-r REV] [SOURCE]'),
3837 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3839 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3838 optionalrepo=True,
3840 optionalrepo=True,
3839 intents={INTENT_READONLY},
3841 intents={INTENT_READONLY},
3840 )
3842 )
3841 def identify(
3843 def identify(
3842 ui,
3844 ui,
3843 repo,
3845 repo,
3844 source=None,
3846 source=None,
3845 rev=None,
3847 rev=None,
3846 num=None,
3848 num=None,
3847 id=None,
3849 id=None,
3848 branch=None,
3850 branch=None,
3849 tags=None,
3851 tags=None,
3850 bookmarks=None,
3852 bookmarks=None,
3851 **opts
3853 **opts
3852 ):
3854 ):
3853 """identify the working directory or specified revision
3855 """identify the working directory or specified revision
3854
3856
3855 Print a summary identifying the repository state at REV using one or
3857 Print a summary identifying the repository state at REV using one or
3856 two parent hash identifiers, followed by a "+" if the working
3858 two parent hash identifiers, followed by a "+" if the working
3857 directory has uncommitted changes, the branch name (if not default),
3859 directory has uncommitted changes, the branch name (if not default),
3858 a list of tags, and a list of bookmarks.
3860 a list of tags, and a list of bookmarks.
3859
3861
3860 When REV is not given, print a summary of the current state of the
3862 When REV is not given, print a summary of the current state of the
3861 repository including the working directory. Specify -r. to get information
3863 repository including the working directory. Specify -r. to get information
3862 of the working directory parent without scanning uncommitted changes.
3864 of the working directory parent without scanning uncommitted changes.
3863
3865
3864 Specifying a path to a repository root or Mercurial bundle will
3866 Specifying a path to a repository root or Mercurial bundle will
3865 cause lookup to operate on that repository/bundle.
3867 cause lookup to operate on that repository/bundle.
3866
3868
3867 .. container:: verbose
3869 .. container:: verbose
3868
3870
3869 Template:
3871 Template:
3870
3872
3871 The following keywords are supported in addition to the common template
3873 The following keywords are supported in addition to the common template
3872 keywords and functions. See also :hg:`help templates`.
3874 keywords and functions. See also :hg:`help templates`.
3873
3875
3874 :dirty: String. Character ``+`` denoting if the working directory has
3876 :dirty: String. Character ``+`` denoting if the working directory has
3875 uncommitted changes.
3877 uncommitted changes.
3876 :id: String. One or two nodes, optionally followed by ``+``.
3878 :id: String. One or two nodes, optionally followed by ``+``.
3877 :parents: List of strings. Parent nodes of the changeset.
3879 :parents: List of strings. Parent nodes of the changeset.
3878
3880
3879 Examples:
3881 Examples:
3880
3882
3881 - generate a build identifier for the working directory::
3883 - generate a build identifier for the working directory::
3882
3884
3883 hg id --id > build-id.dat
3885 hg id --id > build-id.dat
3884
3886
3885 - find the revision corresponding to a tag::
3887 - find the revision corresponding to a tag::
3886
3888
3887 hg id -n -r 1.3
3889 hg id -n -r 1.3
3888
3890
3889 - check the most recent revision of a remote repository::
3891 - check the most recent revision of a remote repository::
3890
3892
3891 hg id -r tip https://www.mercurial-scm.org/repo/hg/
3893 hg id -r tip https://www.mercurial-scm.org/repo/hg/
3892
3894
3893 See :hg:`log` for generating more information about specific revisions,
3895 See :hg:`log` for generating more information about specific revisions,
3894 including full hash identifiers.
3896 including full hash identifiers.
3895
3897
3896 Returns 0 if successful.
3898 Returns 0 if successful.
3897 """
3899 """
3898
3900
3899 opts = pycompat.byteskwargs(opts)
3901 opts = pycompat.byteskwargs(opts)
3900 if not repo and not source:
3902 if not repo and not source:
3901 raise error.InputError(
3903 raise error.InputError(
3902 _(b"there is no Mercurial repository here (.hg not found)")
3904 _(b"there is no Mercurial repository here (.hg not found)")
3903 )
3905 )
3904
3906
3905 default = not (num or id or branch or tags or bookmarks)
3907 default = not (num or id or branch or tags or bookmarks)
3906 output = []
3908 output = []
3907 revs = []
3909 revs = []
3908
3910
3909 peer = None
3911 peer = None
3910 try:
3912 try:
3911 if source:
3913 if source:
3912 source, branches = urlutil.get_unique_pull_path(
3914 source, branches = urlutil.get_unique_pull_path(
3913 b'identify', repo, ui, source
3915 b'identify', repo, ui, source
3914 )
3916 )
3915 # only pass ui when no repo
3917 # only pass ui when no repo
3916 peer = hg.peer(repo or ui, opts, source)
3918 peer = hg.peer(repo or ui, opts, source)
3917 repo = peer.local()
3919 repo = peer.local()
3918 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3920 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3919
3921
3920 fm = ui.formatter(b'identify', opts)
3922 fm = ui.formatter(b'identify', opts)
3921 fm.startitem()
3923 fm.startitem()
3922
3924
3923 if not repo:
3925 if not repo:
3924 if num or branch or tags:
3926 if num or branch or tags:
3925 raise error.InputError(
3927 raise error.InputError(
3926 _(b"can't query remote revision number, branch, or tags")
3928 _(b"can't query remote revision number, branch, or tags")
3927 )
3929 )
3928 if not rev and revs:
3930 if not rev and revs:
3929 rev = revs[0]
3931 rev = revs[0]
3930 if not rev:
3932 if not rev:
3931 rev = b"tip"
3933 rev = b"tip"
3932
3934
3933 remoterev = peer.lookup(rev)
3935 remoterev = peer.lookup(rev)
3934 hexrev = fm.hexfunc(remoterev)
3936 hexrev = fm.hexfunc(remoterev)
3935 if default or id:
3937 if default or id:
3936 output = [hexrev]
3938 output = [hexrev]
3937 fm.data(id=hexrev)
3939 fm.data(id=hexrev)
3938
3940
3939 @util.cachefunc
3941 @util.cachefunc
3940 def getbms():
3942 def getbms():
3941 bms = []
3943 bms = []
3942
3944
3943 if b'bookmarks' in peer.listkeys(b'namespaces'):
3945 if b'bookmarks' in peer.listkeys(b'namespaces'):
3944 hexremoterev = hex(remoterev)
3946 hexremoterev = hex(remoterev)
3945 bms = [
3947 bms = [
3946 bm
3948 bm
3947 for bm, bmr in peer.listkeys(b'bookmarks').items()
3949 for bm, bmr in peer.listkeys(b'bookmarks').items()
3948 if bmr == hexremoterev
3950 if bmr == hexremoterev
3949 ]
3951 ]
3950
3952
3951 return sorted(bms)
3953 return sorted(bms)
3952
3954
3953 if fm.isplain():
3955 if fm.isplain():
3954 if bookmarks:
3956 if bookmarks:
3955 output.extend(getbms())
3957 output.extend(getbms())
3956 elif default and not ui.quiet:
3958 elif default and not ui.quiet:
3957 # multiple bookmarks for a single parent separated by '/'
3959 # multiple bookmarks for a single parent separated by '/'
3958 bm = b'/'.join(getbms())
3960 bm = b'/'.join(getbms())
3959 if bm:
3961 if bm:
3960 output.append(bm)
3962 output.append(bm)
3961 else:
3963 else:
3962 fm.data(node=hex(remoterev))
3964 fm.data(node=hex(remoterev))
3963 if bookmarks or b'bookmarks' in fm.datahint():
3965 if bookmarks or b'bookmarks' in fm.datahint():
3964 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3966 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3965 else:
3967 else:
3966 if rev:
3968 if rev:
3967 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3969 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3968 ctx = logcmdutil.revsingle(repo, rev, None)
3970 ctx = logcmdutil.revsingle(repo, rev, None)
3969
3971
3970 if ctx.rev() is None:
3972 if ctx.rev() is None:
3971 ctx = repo[None]
3973 ctx = repo[None]
3972 parents = ctx.parents()
3974 parents = ctx.parents()
3973 taglist = []
3975 taglist = []
3974 for p in parents:
3976 for p in parents:
3975 taglist.extend(p.tags())
3977 taglist.extend(p.tags())
3976
3978
3977 dirty = b""
3979 dirty = b""
3978 if ctx.dirty(missing=True, merge=False, branch=False):
3980 if ctx.dirty(missing=True, merge=False, branch=False):
3979 dirty = b'+'
3981 dirty = b'+'
3980 fm.data(dirty=dirty)
3982 fm.data(dirty=dirty)
3981
3983
3982 hexoutput = [fm.hexfunc(p.node()) for p in parents]
3984 hexoutput = [fm.hexfunc(p.node()) for p in parents]
3983 if default or id:
3985 if default or id:
3984 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
3986 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
3985 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
3987 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
3986
3988
3987 if num:
3989 if num:
3988 numoutput = [b"%d" % p.rev() for p in parents]
3990 numoutput = [b"%d" % p.rev() for p in parents]
3989 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
3991 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
3990
3992
3991 fm.data(
3993 fm.data(
3992 parents=fm.formatlist(
3994 parents=fm.formatlist(
3993 [fm.hexfunc(p.node()) for p in parents], name=b'node'
3995 [fm.hexfunc(p.node()) for p in parents], name=b'node'
3994 )
3996 )
3995 )
3997 )
3996 else:
3998 else:
3997 hexoutput = fm.hexfunc(ctx.node())
3999 hexoutput = fm.hexfunc(ctx.node())
3998 if default or id:
4000 if default or id:
3999 output = [hexoutput]
4001 output = [hexoutput]
4000 fm.data(id=hexoutput)
4002 fm.data(id=hexoutput)
4001
4003
4002 if num:
4004 if num:
4003 output.append(pycompat.bytestr(ctx.rev()))
4005 output.append(pycompat.bytestr(ctx.rev()))
4004 taglist = ctx.tags()
4006 taglist = ctx.tags()
4005
4007
4006 if default and not ui.quiet:
4008 if default and not ui.quiet:
4007 b = ctx.branch()
4009 b = ctx.branch()
4008 if b != b'default':
4010 if b != b'default':
4009 output.append(b"(%s)" % b)
4011 output.append(b"(%s)" % b)
4010
4012
4011 # multiple tags for a single parent separated by '/'
4013 # multiple tags for a single parent separated by '/'
4012 t = b'/'.join(taglist)
4014 t = b'/'.join(taglist)
4013 if t:
4015 if t:
4014 output.append(t)
4016 output.append(t)
4015
4017
4016 # multiple bookmarks for a single parent separated by '/'
4018 # multiple bookmarks for a single parent separated by '/'
4017 bm = b'/'.join(ctx.bookmarks())
4019 bm = b'/'.join(ctx.bookmarks())
4018 if bm:
4020 if bm:
4019 output.append(bm)
4021 output.append(bm)
4020 else:
4022 else:
4021 if branch:
4023 if branch:
4022 output.append(ctx.branch())
4024 output.append(ctx.branch())
4023
4025
4024 if tags:
4026 if tags:
4025 output.extend(taglist)
4027 output.extend(taglist)
4026
4028
4027 if bookmarks:
4029 if bookmarks:
4028 output.extend(ctx.bookmarks())
4030 output.extend(ctx.bookmarks())
4029
4031
4030 fm.data(node=ctx.hex())
4032 fm.data(node=ctx.hex())
4031 fm.data(branch=ctx.branch())
4033 fm.data(branch=ctx.branch())
4032 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
4034 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
4033 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
4035 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
4034 fm.context(ctx=ctx)
4036 fm.context(ctx=ctx)
4035
4037
4036 fm.plain(b"%s\n" % b' '.join(output))
4038 fm.plain(b"%s\n" % b' '.join(output))
4037 fm.end()
4039 fm.end()
4038 finally:
4040 finally:
4039 if peer:
4041 if peer:
4040 peer.close()
4042 peer.close()
4041
4043
4042
4044
4043 @command(
4045 @command(
4044 b'import|patch',
4046 b'import|patch',
4045 [
4047 [
4046 (
4048 (
4047 b'p',
4049 b'p',
4048 b'strip',
4050 b'strip',
4049 1,
4051 1,
4050 _(
4052 _(
4051 b'directory strip option for patch. This has the same '
4053 b'directory strip option for patch. This has the same '
4052 b'meaning as the corresponding patch option'
4054 b'meaning as the corresponding patch option'
4053 ),
4055 ),
4054 _(b'NUM'),
4056 _(b'NUM'),
4055 ),
4057 ),
4056 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
4058 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
4057 (b'', b'secret', None, _(b'use the secret phase for committing')),
4059 (b'', b'secret', None, _(b'use the secret phase for committing')),
4058 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
4060 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
4059 (
4061 (
4060 b'f',
4062 b'f',
4061 b'force',
4063 b'force',
4062 None,
4064 None,
4063 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
4065 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
4064 ),
4066 ),
4065 (
4067 (
4066 b'',
4068 b'',
4067 b'no-commit',
4069 b'no-commit',
4068 None,
4070 None,
4069 _(b"don't commit, just update the working directory"),
4071 _(b"don't commit, just update the working directory"),
4070 ),
4072 ),
4071 (
4073 (
4072 b'',
4074 b'',
4073 b'bypass',
4075 b'bypass',
4074 None,
4076 None,
4075 _(b"apply patch without touching the working directory"),
4077 _(b"apply patch without touching the working directory"),
4076 ),
4078 ),
4077 (b'', b'partial', None, _(b'commit even if some hunks fail')),
4079 (b'', b'partial', None, _(b'commit even if some hunks fail')),
4078 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
4080 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
4079 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
4081 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
4080 (
4082 (
4081 b'',
4083 b'',
4082 b'import-branch',
4084 b'import-branch',
4083 None,
4085 None,
4084 _(b'use any branch information in patch (implied by --exact)'),
4086 _(b'use any branch information in patch (implied by --exact)'),
4085 ),
4087 ),
4086 ]
4088 ]
4087 + commitopts
4089 + commitopts
4088 + commitopts2
4090 + commitopts2
4089 + similarityopts,
4091 + similarityopts,
4090 _(b'[OPTION]... PATCH...'),
4092 _(b'[OPTION]... PATCH...'),
4091 helpcategory=command.CATEGORY_IMPORT_EXPORT,
4093 helpcategory=command.CATEGORY_IMPORT_EXPORT,
4092 )
4094 )
4093 def import_(ui, repo, patch1=None, *patches, **opts):
4095 def import_(ui, repo, patch1=None, *patches, **opts):
4094 """import an ordered set of patches
4096 """import an ordered set of patches
4095
4097
4096 Import a list of patches and commit them individually (unless
4098 Import a list of patches and commit them individually (unless
4097 --no-commit is specified).
4099 --no-commit is specified).
4098
4100
4099 To read a patch from standard input (stdin), use "-" as the patch
4101 To read a patch from standard input (stdin), use "-" as the patch
4100 name. If a URL is specified, the patch will be downloaded from
4102 name. If a URL is specified, the patch will be downloaded from
4101 there.
4103 there.
4102
4104
4103 Import first applies changes to the working directory (unless
4105 Import first applies changes to the working directory (unless
4104 --bypass is specified), import will abort if there are outstanding
4106 --bypass is specified), import will abort if there are outstanding
4105 changes.
4107 changes.
4106
4108
4107 Use --bypass to apply and commit patches directly to the
4109 Use --bypass to apply and commit patches directly to the
4108 repository, without affecting the working directory. Without
4110 repository, without affecting the working directory. Without
4109 --exact, patches will be applied on top of the working directory
4111 --exact, patches will be applied on top of the working directory
4110 parent revision.
4112 parent revision.
4111
4113
4112 You can import a patch straight from a mail message. Even patches
4114 You can import a patch straight from a mail message. Even patches
4113 as attachments work (to use the body part, it must have type
4115 as attachments work (to use the body part, it must have type
4114 text/plain or text/x-patch). From and Subject headers of email
4116 text/plain or text/x-patch). From and Subject headers of email
4115 message are used as default committer and commit message. All
4117 message are used as default committer and commit message. All
4116 text/plain body parts before first diff are added to the commit
4118 text/plain body parts before first diff are added to the commit
4117 message.
4119 message.
4118
4120
4119 If the imported patch was generated by :hg:`export`, user and
4121 If the imported patch was generated by :hg:`export`, user and
4120 description from patch override values from message headers and
4122 description from patch override values from message headers and
4121 body. Values given on command line with -m/--message and -u/--user
4123 body. Values given on command line with -m/--message and -u/--user
4122 override these.
4124 override these.
4123
4125
4124 If --exact is specified, import will set the working directory to
4126 If --exact is specified, import will set the working directory to
4125 the parent of each patch before applying it, and will abort if the
4127 the parent of each patch before applying it, and will abort if the
4126 resulting changeset has a different ID than the one recorded in
4128 resulting changeset has a different ID than the one recorded in
4127 the patch. This will guard against various ways that portable
4129 the patch. This will guard against various ways that portable
4128 patch formats and mail systems might fail to transfer Mercurial
4130 patch formats and mail systems might fail to transfer Mercurial
4129 data or metadata. See :hg:`bundle` for lossless transmission.
4131 data or metadata. See :hg:`bundle` for lossless transmission.
4130
4132
4131 Use --partial to ensure a changeset will be created from the patch
4133 Use --partial to ensure a changeset will be created from the patch
4132 even if some hunks fail to apply. Hunks that fail to apply will be
4134 even if some hunks fail to apply. Hunks that fail to apply will be
4133 written to a <target-file>.rej file. Conflicts can then be resolved
4135 written to a <target-file>.rej file. Conflicts can then be resolved
4134 by hand before :hg:`commit --amend` is run to update the created
4136 by hand before :hg:`commit --amend` is run to update the created
4135 changeset. This flag exists to let people import patches that
4137 changeset. This flag exists to let people import patches that
4136 partially apply without losing the associated metadata (author,
4138 partially apply without losing the associated metadata (author,
4137 date, description, ...).
4139 date, description, ...).
4138
4140
4139 .. note::
4141 .. note::
4140
4142
4141 When no hunks apply cleanly, :hg:`import --partial` will create
4143 When no hunks apply cleanly, :hg:`import --partial` will create
4142 an empty changeset, importing only the patch metadata.
4144 an empty changeset, importing only the patch metadata.
4143
4145
4144 With -s/--similarity, hg will attempt to discover renames and
4146 With -s/--similarity, hg will attempt to discover renames and
4145 copies in the patch in the same way as :hg:`addremove`.
4147 copies in the patch in the same way as :hg:`addremove`.
4146
4148
4147 It is possible to use external patch programs to perform the patch
4149 It is possible to use external patch programs to perform the patch
4148 by setting the ``ui.patch`` configuration option. For the default
4150 by setting the ``ui.patch`` configuration option. For the default
4149 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4151 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4150 See :hg:`help config` for more information about configuration
4152 See :hg:`help config` for more information about configuration
4151 files and how to use these options.
4153 files and how to use these options.
4152
4154
4153 See :hg:`help dates` for a list of formats valid for -d/--date.
4155 See :hg:`help dates` for a list of formats valid for -d/--date.
4154
4156
4155 .. container:: verbose
4157 .. container:: verbose
4156
4158
4157 Examples:
4159 Examples:
4158
4160
4159 - import a traditional patch from a website and detect renames::
4161 - import a traditional patch from a website and detect renames::
4160
4162
4161 hg import -s 80 http://example.com/bugfix.patch
4163 hg import -s 80 http://example.com/bugfix.patch
4162
4164
4163 - import a changeset from an hgweb server::
4165 - import a changeset from an hgweb server::
4164
4166
4165 hg import https://www.mercurial-scm.org/repo/hg/rev/5ca8c111e9aa
4167 hg import https://www.mercurial-scm.org/repo/hg/rev/5ca8c111e9aa
4166
4168
4167 - import all the patches in an Unix-style mbox::
4169 - import all the patches in an Unix-style mbox::
4168
4170
4169 hg import incoming-patches.mbox
4171 hg import incoming-patches.mbox
4170
4172
4171 - import patches from stdin::
4173 - import patches from stdin::
4172
4174
4173 hg import -
4175 hg import -
4174
4176
4175 - attempt to exactly restore an exported changeset (not always
4177 - attempt to exactly restore an exported changeset (not always
4176 possible)::
4178 possible)::
4177
4179
4178 hg import --exact proposed-fix.patch
4180 hg import --exact proposed-fix.patch
4179
4181
4180 - use an external tool to apply a patch which is too fuzzy for
4182 - use an external tool to apply a patch which is too fuzzy for
4181 the default internal tool.
4183 the default internal tool.
4182
4184
4183 hg import --config ui.patch="patch --merge" fuzzy.patch
4185 hg import --config ui.patch="patch --merge" fuzzy.patch
4184
4186
4185 - change the default fuzzing from 2 to a less strict 7
4187 - change the default fuzzing from 2 to a less strict 7
4186
4188
4187 hg import --config ui.fuzz=7 fuzz.patch
4189 hg import --config ui.fuzz=7 fuzz.patch
4188
4190
4189 Returns 0 on success, 1 on partial success (see --partial).
4191 Returns 0 on success, 1 on partial success (see --partial).
4190 """
4192 """
4191
4193
4192 cmdutil.check_incompatible_arguments(
4194 cmdutil.check_incompatible_arguments(
4193 opts, 'no_commit', ['bypass', 'secret']
4195 opts, 'no_commit', ['bypass', 'secret']
4194 )
4196 )
4195 cmdutil.check_incompatible_arguments(opts, 'exact', ['edit', 'prefix'])
4197 cmdutil.check_incompatible_arguments(opts, 'exact', ['edit', 'prefix'])
4196 opts = pycompat.byteskwargs(opts)
4198 opts = pycompat.byteskwargs(opts)
4197 if not patch1:
4199 if not patch1:
4198 raise error.InputError(_(b'need at least one patch to import'))
4200 raise error.InputError(_(b'need at least one patch to import'))
4199
4201
4200 patches = (patch1,) + patches
4202 patches = (patch1,) + patches
4201
4203
4202 date = opts.get(b'date')
4204 date = opts.get(b'date')
4203 if date:
4205 if date:
4204 opts[b'date'] = dateutil.parsedate(date)
4206 opts[b'date'] = dateutil.parsedate(date)
4205
4207
4206 exact = opts.get(b'exact')
4208 exact = opts.get(b'exact')
4207 update = not opts.get(b'bypass')
4209 update = not opts.get(b'bypass')
4208 try:
4210 try:
4209 sim = float(opts.get(b'similarity') or 0)
4211 sim = float(opts.get(b'similarity') or 0)
4210 except ValueError:
4212 except ValueError:
4211 raise error.InputError(_(b'similarity must be a number'))
4213 raise error.InputError(_(b'similarity must be a number'))
4212 if sim < 0 or sim > 100:
4214 if sim < 0 or sim > 100:
4213 raise error.InputError(_(b'similarity must be between 0 and 100'))
4215 raise error.InputError(_(b'similarity must be between 0 and 100'))
4214 if sim and not update:
4216 if sim and not update:
4215 raise error.InputError(_(b'cannot use --similarity with --bypass'))
4217 raise error.InputError(_(b'cannot use --similarity with --bypass'))
4216
4218
4217 base = opts[b"base"]
4219 base = opts[b"base"]
4218 msgs = []
4220 msgs = []
4219 ret = 0
4221 ret = 0
4220
4222
4221 with repo.wlock():
4223 with repo.wlock():
4222 if update:
4224 if update:
4223 cmdutil.checkunfinished(repo)
4225 cmdutil.checkunfinished(repo)
4224 if exact or not opts.get(b'force'):
4226 if exact or not opts.get(b'force'):
4225 cmdutil.bailifchanged(repo)
4227 cmdutil.bailifchanged(repo)
4226
4228
4227 if not opts.get(b'no_commit'):
4229 if not opts.get(b'no_commit'):
4228 lock = repo.lock
4230 lock = repo.lock
4229 tr = lambda: repo.transaction(b'import')
4231 tr = lambda: repo.transaction(b'import')
4230 dsguard = util.nullcontextmanager
4232 dsguard = util.nullcontextmanager
4231 else:
4233 else:
4232 lock = util.nullcontextmanager
4234 lock = util.nullcontextmanager
4233 tr = util.nullcontextmanager
4235 tr = util.nullcontextmanager
4234 dsguard = lambda: dirstateguard.dirstateguard(repo, b'import')
4236 dsguard = lambda: dirstateguard.dirstateguard(repo, b'import')
4235 with lock(), tr(), dsguard():
4237 with lock(), tr(), dsguard():
4236 parents = repo[None].parents()
4238 parents = repo[None].parents()
4237 for patchurl in patches:
4239 for patchurl in patches:
4238 if patchurl == b'-':
4240 if patchurl == b'-':
4239 ui.status(_(b'applying patch from stdin\n'))
4241 ui.status(_(b'applying patch from stdin\n'))
4240 patchfile = ui.fin
4242 patchfile = ui.fin
4241 patchurl = b'stdin' # for error message
4243 patchurl = b'stdin' # for error message
4242 else:
4244 else:
4243 patchurl = os.path.join(base, patchurl)
4245 patchurl = os.path.join(base, patchurl)
4244 ui.status(_(b'applying %s\n') % patchurl)
4246 ui.status(_(b'applying %s\n') % patchurl)
4245 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4247 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4246
4248
4247 haspatch = False
4249 haspatch = False
4248 for hunk in patch.split(patchfile):
4250 for hunk in patch.split(patchfile):
4249 with patch.extract(ui, hunk) as patchdata:
4251 with patch.extract(ui, hunk) as patchdata:
4250 msg, node, rej = cmdutil.tryimportone(
4252 msg, node, rej = cmdutil.tryimportone(
4251 ui, repo, patchdata, parents, opts, msgs, hg.clean
4253 ui, repo, patchdata, parents, opts, msgs, hg.clean
4252 )
4254 )
4253 if msg:
4255 if msg:
4254 haspatch = True
4256 haspatch = True
4255 ui.note(msg + b'\n')
4257 ui.note(msg + b'\n')
4256 if update or exact:
4258 if update or exact:
4257 parents = repo[None].parents()
4259 parents = repo[None].parents()
4258 else:
4260 else:
4259 parents = [repo[node]]
4261 parents = [repo[node]]
4260 if rej:
4262 if rej:
4261 ui.write_err(_(b"patch applied partially\n"))
4263 ui.write_err(_(b"patch applied partially\n"))
4262 ui.write_err(
4264 ui.write_err(
4263 _(
4265 _(
4264 b"(fix the .rej files and run "
4266 b"(fix the .rej files and run "
4265 b"`hg commit --amend`)\n"
4267 b"`hg commit --amend`)\n"
4266 )
4268 )
4267 )
4269 )
4268 ret = 1
4270 ret = 1
4269 break
4271 break
4270
4272
4271 if not haspatch:
4273 if not haspatch:
4272 raise error.InputError(_(b'%s: no diffs found') % patchurl)
4274 raise error.InputError(_(b'%s: no diffs found') % patchurl)
4273
4275
4274 if msgs:
4276 if msgs:
4275 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4277 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4276 return ret
4278 return ret
4277
4279
4278
4280
4279 @command(
4281 @command(
4280 b'incoming|in',
4282 b'incoming|in',
4281 [
4283 [
4282 (
4284 (
4283 b'f',
4285 b'f',
4284 b'force',
4286 b'force',
4285 None,
4287 None,
4286 _(b'run even if remote repository is unrelated'),
4288 _(b'run even if remote repository is unrelated'),
4287 ),
4289 ),
4288 (b'n', b'newest-first', None, _(b'show newest record first')),
4290 (b'n', b'newest-first', None, _(b'show newest record first')),
4289 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4291 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4290 (
4292 (
4291 b'r',
4293 b'r',
4292 b'rev',
4294 b'rev',
4293 [],
4295 [],
4294 _(b'a remote changeset intended to be added'),
4296 _(b'a remote changeset intended to be added'),
4295 _(b'REV'),
4297 _(b'REV'),
4296 ),
4298 ),
4297 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4299 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4298 (
4300 (
4299 b'b',
4301 b'b',
4300 b'branch',
4302 b'branch',
4301 [],
4303 [],
4302 _(b'a specific branch you would like to pull'),
4304 _(b'a specific branch you would like to pull'),
4303 _(b'BRANCH'),
4305 _(b'BRANCH'),
4304 ),
4306 ),
4305 ]
4307 ]
4306 + logopts
4308 + logopts
4307 + remoteopts
4309 + remoteopts
4308 + subrepoopts,
4310 + subrepoopts,
4309 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4311 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4310 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4312 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4311 )
4313 )
4312 def incoming(ui, repo, source=b"default", **opts):
4314 def incoming(ui, repo, source=b"default", **opts):
4313 """show new changesets found in source
4315 """show new changesets found in source
4314
4316
4315 Show new changesets found in the specified path/URL or the default
4317 Show new changesets found in the specified path/URL or the default
4316 pull location. These are the changesets that would have been pulled
4318 pull location. These are the changesets that would have been pulled
4317 by :hg:`pull` at the time you issued this command.
4319 by :hg:`pull` at the time you issued this command.
4318
4320
4319 See pull for valid source format details.
4321 See pull for valid source format details.
4320
4322
4321 .. container:: verbose
4323 .. container:: verbose
4322
4324
4323 With -B/--bookmarks, the result of bookmark comparison between
4325 With -B/--bookmarks, the result of bookmark comparison between
4324 local and remote repositories is displayed. With -v/--verbose,
4326 local and remote repositories is displayed. With -v/--verbose,
4325 status is also displayed for each bookmark like below::
4327 status is also displayed for each bookmark like below::
4326
4328
4327 BM1 01234567890a added
4329 BM1 01234567890a added
4328 BM2 1234567890ab advanced
4330 BM2 1234567890ab advanced
4329 BM3 234567890abc diverged
4331 BM3 234567890abc diverged
4330 BM4 34567890abcd changed
4332 BM4 34567890abcd changed
4331
4333
4332 The action taken locally when pulling depends on the
4334 The action taken locally when pulling depends on the
4333 status of each bookmark:
4335 status of each bookmark:
4334
4336
4335 :``added``: pull will create it
4337 :``added``: pull will create it
4336 :``advanced``: pull will update it
4338 :``advanced``: pull will update it
4337 :``diverged``: pull will create a divergent bookmark
4339 :``diverged``: pull will create a divergent bookmark
4338 :``changed``: result depends on remote changesets
4340 :``changed``: result depends on remote changesets
4339
4341
4340 From the point of view of pulling behavior, bookmark
4342 From the point of view of pulling behavior, bookmark
4341 existing only in the remote repository are treated as ``added``,
4343 existing only in the remote repository are treated as ``added``,
4342 even if it is in fact locally deleted.
4344 even if it is in fact locally deleted.
4343
4345
4344 .. container:: verbose
4346 .. container:: verbose
4345
4347
4346 For remote repository, using --bundle avoids downloading the
4348 For remote repository, using --bundle avoids downloading the
4347 changesets twice if the incoming is followed by a pull.
4349 changesets twice if the incoming is followed by a pull.
4348
4350
4349 Examples:
4351 Examples:
4350
4352
4351 - show incoming changes with patches and full description::
4353 - show incoming changes with patches and full description::
4352
4354
4353 hg incoming -vp
4355 hg incoming -vp
4354
4356
4355 - show incoming changes excluding merges, store a bundle::
4357 - show incoming changes excluding merges, store a bundle::
4356
4358
4357 hg in -vpM --bundle incoming.hg
4359 hg in -vpM --bundle incoming.hg
4358 hg pull incoming.hg
4360 hg pull incoming.hg
4359
4361
4360 - briefly list changes inside a bundle::
4362 - briefly list changes inside a bundle::
4361
4363
4362 hg in changes.hg -T "{desc|firstline}\\n"
4364 hg in changes.hg -T "{desc|firstline}\\n"
4363
4365
4364 Returns 0 if there are incoming changes, 1 otherwise.
4366 Returns 0 if there are incoming changes, 1 otherwise.
4365 """
4367 """
4366 opts = pycompat.byteskwargs(opts)
4368 opts = pycompat.byteskwargs(opts)
4367 if opts.get(b'graph'):
4369 if opts.get(b'graph'):
4368 logcmdutil.checkunsupportedgraphflags([], opts)
4370 logcmdutil.checkunsupportedgraphflags([], opts)
4369
4371
4370 def display(other, chlist, displayer):
4372 def display(other, chlist, displayer):
4371 revdag = logcmdutil.graphrevs(other, chlist, opts)
4373 revdag = logcmdutil.graphrevs(other, chlist, opts)
4372 logcmdutil.displaygraph(
4374 logcmdutil.displaygraph(
4373 ui, repo, revdag, displayer, graphmod.asciiedges
4375 ui, repo, revdag, displayer, graphmod.asciiedges
4374 )
4376 )
4375
4377
4376 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4378 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4377 return 0
4379 return 0
4378
4380
4379 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'bundle'])
4381 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'bundle'])
4380
4382
4381 if opts.get(b'bookmarks'):
4383 if opts.get(b'bookmarks'):
4382 srcs = urlutil.get_pull_paths(repo, ui, [source])
4384 srcs = urlutil.get_pull_paths(repo, ui, [source])
4383 for path in srcs:
4385 for path in srcs:
4384 source, branches = urlutil.parseurl(
4386 source, branches = urlutil.parseurl(
4385 path.rawloc, opts.get(b'branch')
4387 path.rawloc, opts.get(b'branch')
4386 )
4388 )
4387 other = hg.peer(repo, opts, source)
4389 other = hg.peer(repo, opts, source)
4388 try:
4390 try:
4389 if b'bookmarks' not in other.listkeys(b'namespaces'):
4391 if b'bookmarks' not in other.listkeys(b'namespaces'):
4390 ui.warn(_(b"remote doesn't support bookmarks\n"))
4392 ui.warn(_(b"remote doesn't support bookmarks\n"))
4391 return 0
4393 return 0
4392 ui.pager(b'incoming')
4394 ui.pager(b'incoming')
4393 ui.status(
4395 ui.status(
4394 _(b'comparing with %s\n') % urlutil.hidepassword(source)
4396 _(b'comparing with %s\n') % urlutil.hidepassword(source)
4395 )
4397 )
4396 return bookmarks.incoming(
4398 return bookmarks.incoming(
4397 ui, repo, other, mode=path.bookmarks_mode
4399 ui, repo, other, mode=path.bookmarks_mode
4398 )
4400 )
4399 finally:
4401 finally:
4400 other.close()
4402 other.close()
4401
4403
4402 return hg.incoming(ui, repo, source, opts)
4404 return hg.incoming(ui, repo, source, opts)
4403
4405
4404
4406
4405 @command(
4407 @command(
4406 b'init',
4408 b'init',
4407 remoteopts,
4409 remoteopts,
4408 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4410 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4409 helpcategory=command.CATEGORY_REPO_CREATION,
4411 helpcategory=command.CATEGORY_REPO_CREATION,
4410 helpbasic=True,
4412 helpbasic=True,
4411 norepo=True,
4413 norepo=True,
4412 )
4414 )
4413 def init(ui, dest=b".", **opts):
4415 def init(ui, dest=b".", **opts):
4414 """create a new repository in the given directory
4416 """create a new repository in the given directory
4415
4417
4416 Initialize a new repository in the given directory. If the given
4418 Initialize a new repository in the given directory. If the given
4417 directory does not exist, it will be created.
4419 directory does not exist, it will be created.
4418
4420
4419 If no directory is given, the current directory is used.
4421 If no directory is given, the current directory is used.
4420
4422
4421 It is possible to specify an ``ssh://`` URL as the destination.
4423 It is possible to specify an ``ssh://`` URL as the destination.
4422 See :hg:`help urls` for more information.
4424 See :hg:`help urls` for more information.
4423
4425
4424 Returns 0 on success.
4426 Returns 0 on success.
4425 """
4427 """
4426 opts = pycompat.byteskwargs(opts)
4428 opts = pycompat.byteskwargs(opts)
4427 path = urlutil.get_clone_path(ui, dest)[1]
4429 path = urlutil.get_clone_path(ui, dest)[1]
4428 peer = hg.peer(ui, opts, path, create=True)
4430 peer = hg.peer(ui, opts, path, create=True)
4429 peer.close()
4431 peer.close()
4430
4432
4431
4433
4432 @command(
4434 @command(
4433 b'locate',
4435 b'locate',
4434 [
4436 [
4435 (
4437 (
4436 b'r',
4438 b'r',
4437 b'rev',
4439 b'rev',
4438 b'',
4440 b'',
4439 _(b'search the repository as it is in REV'),
4441 _(b'search the repository as it is in REV'),
4440 _(b'REV'),
4442 _(b'REV'),
4441 ),
4443 ),
4442 (
4444 (
4443 b'0',
4445 b'0',
4444 b'print0',
4446 b'print0',
4445 None,
4447 None,
4446 _(b'end filenames with NUL, for use with xargs'),
4448 _(b'end filenames with NUL, for use with xargs'),
4447 ),
4449 ),
4448 (
4450 (
4449 b'f',
4451 b'f',
4450 b'fullpath',
4452 b'fullpath',
4451 None,
4453 None,
4452 _(b'print complete paths from the filesystem root'),
4454 _(b'print complete paths from the filesystem root'),
4453 ),
4455 ),
4454 ]
4456 ]
4455 + walkopts,
4457 + walkopts,
4456 _(b'[OPTION]... [PATTERN]...'),
4458 _(b'[OPTION]... [PATTERN]...'),
4457 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4459 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4458 )
4460 )
4459 def locate(ui, repo, *pats, **opts):
4461 def locate(ui, repo, *pats, **opts):
4460 """locate files matching specific patterns (DEPRECATED)
4462 """locate files matching specific patterns (DEPRECATED)
4461
4463
4462 Print files under Mercurial control in the working directory whose
4464 Print files under Mercurial control in the working directory whose
4463 names match the given patterns.
4465 names match the given patterns.
4464
4466
4465 By default, this command searches all directories in the working
4467 By default, this command searches all directories in the working
4466 directory. To search just the current directory and its
4468 directory. To search just the current directory and its
4467 subdirectories, use "--include .".
4469 subdirectories, use "--include .".
4468
4470
4469 If no patterns are given to match, this command prints the names
4471 If no patterns are given to match, this command prints the names
4470 of all files under Mercurial control in the working directory.
4472 of all files under Mercurial control in the working directory.
4471
4473
4472 If you want to feed the output of this command into the "xargs"
4474 If you want to feed the output of this command into the "xargs"
4473 command, use the -0 option to both this command and "xargs". This
4475 command, use the -0 option to both this command and "xargs". This
4474 will avoid the problem of "xargs" treating single filenames that
4476 will avoid the problem of "xargs" treating single filenames that
4475 contain whitespace as multiple filenames.
4477 contain whitespace as multiple filenames.
4476
4478
4477 See :hg:`help files` for a more versatile command.
4479 See :hg:`help files` for a more versatile command.
4478
4480
4479 Returns 0 if a match is found, 1 otherwise.
4481 Returns 0 if a match is found, 1 otherwise.
4480 """
4482 """
4481 opts = pycompat.byteskwargs(opts)
4483 opts = pycompat.byteskwargs(opts)
4482 if opts.get(b'print0'):
4484 if opts.get(b'print0'):
4483 end = b'\0'
4485 end = b'\0'
4484 else:
4486 else:
4485 end = b'\n'
4487 end = b'\n'
4486 ctx = logcmdutil.revsingle(repo, opts.get(b'rev'), None)
4488 ctx = logcmdutil.revsingle(repo, opts.get(b'rev'), None)
4487
4489
4488 ret = 1
4490 ret = 1
4489 m = scmutil.match(
4491 m = scmutil.match(
4490 ctx, pats, opts, default=b'relglob', badfn=lambda x, y: False
4492 ctx, pats, opts, default=b'relglob', badfn=lambda x, y: False
4491 )
4493 )
4492
4494
4493 ui.pager(b'locate')
4495 ui.pager(b'locate')
4494 if ctx.rev() is None:
4496 if ctx.rev() is None:
4495 # When run on the working copy, "locate" includes removed files, so
4497 # When run on the working copy, "locate" includes removed files, so
4496 # we get the list of files from the dirstate.
4498 # we get the list of files from the dirstate.
4497 filesgen = sorted(repo.dirstate.matches(m))
4499 filesgen = sorted(repo.dirstate.matches(m))
4498 else:
4500 else:
4499 filesgen = ctx.matches(m)
4501 filesgen = ctx.matches(m)
4500 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4502 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4501 for abs in filesgen:
4503 for abs in filesgen:
4502 if opts.get(b'fullpath'):
4504 if opts.get(b'fullpath'):
4503 ui.write(repo.wjoin(abs), end)
4505 ui.write(repo.wjoin(abs), end)
4504 else:
4506 else:
4505 ui.write(uipathfn(abs), end)
4507 ui.write(uipathfn(abs), end)
4506 ret = 0
4508 ret = 0
4507
4509
4508 return ret
4510 return ret
4509
4511
4510
4512
4511 @command(
4513 @command(
4512 b'log|history',
4514 b'log|history',
4513 [
4515 [
4514 (
4516 (
4515 b'f',
4517 b'f',
4516 b'follow',
4518 b'follow',
4517 None,
4519 None,
4518 _(
4520 _(
4519 b'follow changeset history, or file history across copies and renames'
4521 b'follow changeset history, or file history across copies and renames'
4520 ),
4522 ),
4521 ),
4523 ),
4522 (
4524 (
4523 b'',
4525 b'',
4524 b'follow-first',
4526 b'follow-first',
4525 None,
4527 None,
4526 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4528 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4527 ),
4529 ),
4528 (
4530 (
4529 b'd',
4531 b'd',
4530 b'date',
4532 b'date',
4531 b'',
4533 b'',
4532 _(b'show revisions matching date spec'),
4534 _(b'show revisions matching date spec'),
4533 _(b'DATE'),
4535 _(b'DATE'),
4534 ),
4536 ),
4535 (b'C', b'copies', None, _(b'show copied files')),
4537 (b'C', b'copies', None, _(b'show copied files')),
4536 (
4538 (
4537 b'k',
4539 b'k',
4538 b'keyword',
4540 b'keyword',
4539 [],
4541 [],
4540 _(b'do case-insensitive search for a given text'),
4542 _(b'do case-insensitive search for a given text'),
4541 _(b'TEXT'),
4543 _(b'TEXT'),
4542 ),
4544 ),
4543 (
4545 (
4544 b'r',
4546 b'r',
4545 b'rev',
4547 b'rev',
4546 [],
4548 [],
4547 _(b'revisions to select or follow from'),
4549 _(b'revisions to select or follow from'),
4548 _(b'REV'),
4550 _(b'REV'),
4549 ),
4551 ),
4550 (
4552 (
4551 b'L',
4553 b'L',
4552 b'line-range',
4554 b'line-range',
4553 [],
4555 [],
4554 _(b'follow line range of specified file (EXPERIMENTAL)'),
4556 _(b'follow line range of specified file (EXPERIMENTAL)'),
4555 _(b'FILE,RANGE'),
4557 _(b'FILE,RANGE'),
4556 ),
4558 ),
4557 (
4559 (
4558 b'',
4560 b'',
4559 b'removed',
4561 b'removed',
4560 None,
4562 None,
4561 _(b'include revisions where files were removed'),
4563 _(b'include revisions where files were removed'),
4562 ),
4564 ),
4563 (
4565 (
4564 b'm',
4566 b'm',
4565 b'only-merges',
4567 b'only-merges',
4566 None,
4568 None,
4567 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4569 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4568 ),
4570 ),
4569 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4571 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4570 (
4572 (
4571 b'',
4573 b'',
4572 b'only-branch',
4574 b'only-branch',
4573 [],
4575 [],
4574 _(
4576 _(
4575 b'show only changesets within the given named branch (DEPRECATED)'
4577 b'show only changesets within the given named branch (DEPRECATED)'
4576 ),
4578 ),
4577 _(b'BRANCH'),
4579 _(b'BRANCH'),
4578 ),
4580 ),
4579 (
4581 (
4580 b'b',
4582 b'b',
4581 b'branch',
4583 b'branch',
4582 [],
4584 [],
4583 _(b'show changesets within the given named branch'),
4585 _(b'show changesets within the given named branch'),
4584 _(b'BRANCH'),
4586 _(b'BRANCH'),
4585 ),
4587 ),
4586 (
4588 (
4587 b'B',
4589 b'B',
4588 b'bookmark',
4590 b'bookmark',
4589 [],
4591 [],
4590 _(b"show changesets within the given bookmark"),
4592 _(b"show changesets within the given bookmark"),
4591 _(b'BOOKMARK'),
4593 _(b'BOOKMARK'),
4592 ),
4594 ),
4593 (
4595 (
4594 b'P',
4596 b'P',
4595 b'prune',
4597 b'prune',
4596 [],
4598 [],
4597 _(b'do not display revision or any of its ancestors'),
4599 _(b'do not display revision or any of its ancestors'),
4598 _(b'REV'),
4600 _(b'REV'),
4599 ),
4601 ),
4600 ]
4602 ]
4601 + logopts
4603 + logopts
4602 + walkopts,
4604 + walkopts,
4603 _(b'[OPTION]... [FILE]'),
4605 _(b'[OPTION]... [FILE]'),
4604 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4606 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4605 helpbasic=True,
4607 helpbasic=True,
4606 inferrepo=True,
4608 inferrepo=True,
4607 intents={INTENT_READONLY},
4609 intents={INTENT_READONLY},
4608 )
4610 )
4609 def log(ui, repo, *pats, **opts):
4611 def log(ui, repo, *pats, **opts):
4610 """show revision history of entire repository or files
4612 """show revision history of entire repository or files
4611
4613
4612 Print the revision history of the specified files or the entire
4614 Print the revision history of the specified files or the entire
4613 project.
4615 project.
4614
4616
4615 If no revision range is specified, the default is ``tip:0`` unless
4617 If no revision range is specified, the default is ``tip:0`` unless
4616 --follow is set.
4618 --follow is set.
4617
4619
4618 File history is shown without following rename or copy history of
4620 File history is shown without following rename or copy history of
4619 files. Use -f/--follow with a filename to follow history across
4621 files. Use -f/--follow with a filename to follow history across
4620 renames and copies. --follow without a filename will only show
4622 renames and copies. --follow without a filename will only show
4621 ancestors of the starting revisions. The starting revisions can be
4623 ancestors of the starting revisions. The starting revisions can be
4622 specified by -r/--rev, which default to the working directory parent.
4624 specified by -r/--rev, which default to the working directory parent.
4623
4625
4624 By default this command prints revision number and changeset id,
4626 By default this command prints revision number and changeset id,
4625 tags, non-trivial parents, user, date and time, and a summary for
4627 tags, non-trivial parents, user, date and time, and a summary for
4626 each commit. When the -v/--verbose switch is used, the list of
4628 each commit. When the -v/--verbose switch is used, the list of
4627 changed files and full commit message are shown.
4629 changed files and full commit message are shown.
4628
4630
4629 With --graph the revisions are shown as an ASCII art DAG with the most
4631 With --graph the revisions are shown as an ASCII art DAG with the most
4630 recent changeset at the top.
4632 recent changeset at the top.
4631 'o' is a changeset, '@' is a working directory parent, '%' is a changeset
4633 'o' is a changeset, '@' is a working directory parent, '%' is a changeset
4632 involved in an unresolved merge conflict, '_' closes a branch,
4634 involved in an unresolved merge conflict, '_' closes a branch,
4633 'x' is obsolete, '*' is unstable, and '+' represents a fork where the
4635 'x' is obsolete, '*' is unstable, and '+' represents a fork where the
4634 changeset from the lines below is a parent of the 'o' merge on the same
4636 changeset from the lines below is a parent of the 'o' merge on the same
4635 line.
4637 line.
4636 Paths in the DAG are represented with '|', '/' and so forth. ':' in place
4638 Paths in the DAG are represented with '|', '/' and so forth. ':' in place
4637 of a '|' indicates one or more revisions in a path are omitted.
4639 of a '|' indicates one or more revisions in a path are omitted.
4638
4640
4639 .. container:: verbose
4641 .. container:: verbose
4640
4642
4641 Use -L/--line-range FILE,M:N options to follow the history of lines
4643 Use -L/--line-range FILE,M:N options to follow the history of lines
4642 from M to N in FILE. With -p/--patch only diff hunks affecting
4644 from M to N in FILE. With -p/--patch only diff hunks affecting
4643 specified line range will be shown. This option requires --follow;
4645 specified line range will be shown. This option requires --follow;
4644 it can be specified multiple times. Currently, this option is not
4646 it can be specified multiple times. Currently, this option is not
4645 compatible with --graph. This option is experimental.
4647 compatible with --graph. This option is experimental.
4646
4648
4647 .. note::
4649 .. note::
4648
4650
4649 :hg:`log --patch` may generate unexpected diff output for merge
4651 :hg:`log --patch` may generate unexpected diff output for merge
4650 changesets, as it will only compare the merge changeset against
4652 changesets, as it will only compare the merge changeset against
4651 its first parent. Also, only files different from BOTH parents
4653 its first parent. Also, only files different from BOTH parents
4652 will appear in files:.
4654 will appear in files:.
4653
4655
4654 .. note::
4656 .. note::
4655
4657
4656 For performance reasons, :hg:`log FILE` may omit duplicate changes
4658 For performance reasons, :hg:`log FILE` may omit duplicate changes
4657 made on branches and will not show removals or mode changes. To
4659 made on branches and will not show removals or mode changes. To
4658 see all such changes, use the --removed switch.
4660 see all such changes, use the --removed switch.
4659
4661
4660 .. container:: verbose
4662 .. container:: verbose
4661
4663
4662 .. note::
4664 .. note::
4663
4665
4664 The history resulting from -L/--line-range options depends on diff
4666 The history resulting from -L/--line-range options depends on diff
4665 options; for instance if white-spaces are ignored, respective changes
4667 options; for instance if white-spaces are ignored, respective changes
4666 with only white-spaces in specified line range will not be listed.
4668 with only white-spaces in specified line range will not be listed.
4667
4669
4668 .. container:: verbose
4670 .. container:: verbose
4669
4671
4670 Some examples:
4672 Some examples:
4671
4673
4672 - changesets with full descriptions and file lists::
4674 - changesets with full descriptions and file lists::
4673
4675
4674 hg log -v
4676 hg log -v
4675
4677
4676 - changesets ancestral to the working directory::
4678 - changesets ancestral to the working directory::
4677
4679
4678 hg log -f
4680 hg log -f
4679
4681
4680 - last 10 commits on the current branch::
4682 - last 10 commits on the current branch::
4681
4683
4682 hg log -l 10 -b .
4684 hg log -l 10 -b .
4683
4685
4684 - changesets showing all modifications of a file, including removals::
4686 - changesets showing all modifications of a file, including removals::
4685
4687
4686 hg log --removed file.c
4688 hg log --removed file.c
4687
4689
4688 - all changesets that touch a directory, with diffs, excluding merges::
4690 - all changesets that touch a directory, with diffs, excluding merges::
4689
4691
4690 hg log -Mp lib/
4692 hg log -Mp lib/
4691
4693
4692 - all revision numbers that match a keyword::
4694 - all revision numbers that match a keyword::
4693
4695
4694 hg log -k bug --template "{rev}\\n"
4696 hg log -k bug --template "{rev}\\n"
4695
4697
4696 - the full hash identifier of the working directory parent::
4698 - the full hash identifier of the working directory parent::
4697
4699
4698 hg log -r . --template "{node}\\n"
4700 hg log -r . --template "{node}\\n"
4699
4701
4700 - list available log templates::
4702 - list available log templates::
4701
4703
4702 hg log -T list
4704 hg log -T list
4703
4705
4704 - check if a given changeset is included in a tagged release::
4706 - check if a given changeset is included in a tagged release::
4705
4707
4706 hg log -r "a21ccf and ancestor(1.9)"
4708 hg log -r "a21ccf and ancestor(1.9)"
4707
4709
4708 - find all changesets by some user in a date range::
4710 - find all changesets by some user in a date range::
4709
4711
4710 hg log -k alice -d "may 2008 to jul 2008"
4712 hg log -k alice -d "may 2008 to jul 2008"
4711
4713
4712 - summary of all changesets after the last tag::
4714 - summary of all changesets after the last tag::
4713
4715
4714 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4716 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4715
4717
4716 - changesets touching lines 13 to 23 for file.c::
4718 - changesets touching lines 13 to 23 for file.c::
4717
4719
4718 hg log -L file.c,13:23
4720 hg log -L file.c,13:23
4719
4721
4720 - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of
4722 - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of
4721 main.c with patch::
4723 main.c with patch::
4722
4724
4723 hg log -L file.c,13:23 -L main.c,2:6 -p
4725 hg log -L file.c,13:23 -L main.c,2:6 -p
4724
4726
4725 See :hg:`help dates` for a list of formats valid for -d/--date.
4727 See :hg:`help dates` for a list of formats valid for -d/--date.
4726
4728
4727 See :hg:`help revisions` for more about specifying and ordering
4729 See :hg:`help revisions` for more about specifying and ordering
4728 revisions.
4730 revisions.
4729
4731
4730 See :hg:`help templates` for more about pre-packaged styles and
4732 See :hg:`help templates` for more about pre-packaged styles and
4731 specifying custom templates. The default template used by the log
4733 specifying custom templates. The default template used by the log
4732 command can be customized via the ``command-templates.log`` configuration
4734 command can be customized via the ``command-templates.log`` configuration
4733 setting.
4735 setting.
4734
4736
4735 Returns 0 on success.
4737 Returns 0 on success.
4736
4738
4737 """
4739 """
4738 opts = pycompat.byteskwargs(opts)
4740 opts = pycompat.byteskwargs(opts)
4739 linerange = opts.get(b'line_range')
4741 linerange = opts.get(b'line_range')
4740
4742
4741 if linerange and not opts.get(b'follow'):
4743 if linerange and not opts.get(b'follow'):
4742 raise error.InputError(_(b'--line-range requires --follow'))
4744 raise error.InputError(_(b'--line-range requires --follow'))
4743
4745
4744 if linerange and pats:
4746 if linerange and pats:
4745 # TODO: take pats as patterns with no line-range filter
4747 # TODO: take pats as patterns with no line-range filter
4746 raise error.InputError(
4748 raise error.InputError(
4747 _(b'FILE arguments are not compatible with --line-range option')
4749 _(b'FILE arguments are not compatible with --line-range option')
4748 )
4750 )
4749
4751
4750 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4752 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4751 walk_opts = logcmdutil.parseopts(ui, pats, opts)
4753 walk_opts = logcmdutil.parseopts(ui, pats, opts)
4752 revs, differ = logcmdutil.getrevs(repo, walk_opts)
4754 revs, differ = logcmdutil.getrevs(repo, walk_opts)
4753 if linerange:
4755 if linerange:
4754 # TODO: should follow file history from logcmdutil._initialrevs(),
4756 # TODO: should follow file history from logcmdutil._initialrevs(),
4755 # then filter the result by logcmdutil._makerevset() and --limit
4757 # then filter the result by logcmdutil._makerevset() and --limit
4756 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4758 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4757
4759
4758 getcopies = None
4760 getcopies = None
4759 if opts.get(b'copies'):
4761 if opts.get(b'copies'):
4760 endrev = None
4762 endrev = None
4761 if revs:
4763 if revs:
4762 endrev = revs.max() + 1
4764 endrev = revs.max() + 1
4763 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4765 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4764
4766
4765 ui.pager(b'log')
4767 ui.pager(b'log')
4766 displayer = logcmdutil.changesetdisplayer(
4768 displayer = logcmdutil.changesetdisplayer(
4767 ui, repo, opts, differ, buffered=True
4769 ui, repo, opts, differ, buffered=True
4768 )
4770 )
4769 if opts.get(b'graph'):
4771 if opts.get(b'graph'):
4770 displayfn = logcmdutil.displaygraphrevs
4772 displayfn = logcmdutil.displaygraphrevs
4771 else:
4773 else:
4772 displayfn = logcmdutil.displayrevs
4774 displayfn = logcmdutil.displayrevs
4773 displayfn(ui, repo, revs, displayer, getcopies)
4775 displayfn(ui, repo, revs, displayer, getcopies)
4774
4776
4775
4777
4776 @command(
4778 @command(
4777 b'manifest',
4779 b'manifest',
4778 [
4780 [
4779 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4781 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4780 (b'', b'all', False, _(b"list files from all revisions")),
4782 (b'', b'all', False, _(b"list files from all revisions")),
4781 ]
4783 ]
4782 + formatteropts,
4784 + formatteropts,
4783 _(b'[-r REV]'),
4785 _(b'[-r REV]'),
4784 helpcategory=command.CATEGORY_MAINTENANCE,
4786 helpcategory=command.CATEGORY_MAINTENANCE,
4785 intents={INTENT_READONLY},
4787 intents={INTENT_READONLY},
4786 )
4788 )
4787 def manifest(ui, repo, node=None, rev=None, **opts):
4789 def manifest(ui, repo, node=None, rev=None, **opts):
4788 """output the current or given revision of the project manifest
4790 """output the current or given revision of the project manifest
4789
4791
4790 Print a list of version controlled files for the given revision.
4792 Print a list of version controlled files for the given revision.
4791 If no revision is given, the first parent of the working directory
4793 If no revision is given, the first parent of the working directory
4792 is used, or the null revision if no revision is checked out.
4794 is used, or the null revision if no revision is checked out.
4793
4795
4794 With -v, print file permissions, symlink and executable bits.
4796 With -v, print file permissions, symlink and executable bits.
4795 With --debug, print file revision hashes.
4797 With --debug, print file revision hashes.
4796
4798
4797 If option --all is specified, the list of all files from all revisions
4799 If option --all is specified, the list of all files from all revisions
4798 is printed. This includes deleted and renamed files.
4800 is printed. This includes deleted and renamed files.
4799
4801
4800 Returns 0 on success.
4802 Returns 0 on success.
4801 """
4803 """
4802 opts = pycompat.byteskwargs(opts)
4804 opts = pycompat.byteskwargs(opts)
4803 fm = ui.formatter(b'manifest', opts)
4805 fm = ui.formatter(b'manifest', opts)
4804
4806
4805 if opts.get(b'all'):
4807 if opts.get(b'all'):
4806 if rev or node:
4808 if rev or node:
4807 raise error.InputError(_(b"can't specify a revision with --all"))
4809 raise error.InputError(_(b"can't specify a revision with --all"))
4808
4810
4809 res = set()
4811 res = set()
4810 for rev in repo:
4812 for rev in repo:
4811 ctx = repo[rev]
4813 ctx = repo[rev]
4812 res |= set(ctx.files())
4814 res |= set(ctx.files())
4813
4815
4814 ui.pager(b'manifest')
4816 ui.pager(b'manifest')
4815 for f in sorted(res):
4817 for f in sorted(res):
4816 fm.startitem()
4818 fm.startitem()
4817 fm.write(b"path", b'%s\n', f)
4819 fm.write(b"path", b'%s\n', f)
4818 fm.end()
4820 fm.end()
4819 return
4821 return
4820
4822
4821 if rev and node:
4823 if rev and node:
4822 raise error.InputError(_(b"please specify just one revision"))
4824 raise error.InputError(_(b"please specify just one revision"))
4823
4825
4824 if not node:
4826 if not node:
4825 node = rev
4827 node = rev
4826
4828
4827 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4829 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4828 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4830 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4829 if node:
4831 if node:
4830 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4832 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4831 ctx = logcmdutil.revsingle(repo, node)
4833 ctx = logcmdutil.revsingle(repo, node)
4832 mf = ctx.manifest()
4834 mf = ctx.manifest()
4833 ui.pager(b'manifest')
4835 ui.pager(b'manifest')
4834 for f in ctx:
4836 for f in ctx:
4835 fm.startitem()
4837 fm.startitem()
4836 fm.context(ctx=ctx)
4838 fm.context(ctx=ctx)
4837 fl = ctx[f].flags()
4839 fl = ctx[f].flags()
4838 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4840 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4839 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4841 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4840 fm.write(b'path', b'%s\n', f)
4842 fm.write(b'path', b'%s\n', f)
4841 fm.end()
4843 fm.end()
4842
4844
4843
4845
4844 @command(
4846 @command(
4845 b'merge',
4847 b'merge',
4846 [
4848 [
4847 (
4849 (
4848 b'f',
4850 b'f',
4849 b'force',
4851 b'force',
4850 None,
4852 None,
4851 _(b'force a merge including outstanding changes (DEPRECATED)'),
4853 _(b'force a merge including outstanding changes (DEPRECATED)'),
4852 ),
4854 ),
4853 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4855 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4854 (
4856 (
4855 b'P',
4857 b'P',
4856 b'preview',
4858 b'preview',
4857 None,
4859 None,
4858 _(b'review revisions to merge (no merge is performed)'),
4860 _(b'review revisions to merge (no merge is performed)'),
4859 ),
4861 ),
4860 (b'', b'abort', None, _(b'abort the ongoing merge')),
4862 (b'', b'abort', None, _(b'abort the ongoing merge')),
4861 ]
4863 ]
4862 + mergetoolopts,
4864 + mergetoolopts,
4863 _(b'[-P] [[-r] REV]'),
4865 _(b'[-P] [[-r] REV]'),
4864 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4866 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4865 helpbasic=True,
4867 helpbasic=True,
4866 )
4868 )
4867 def merge(ui, repo, node=None, **opts):
4869 def merge(ui, repo, node=None, **opts):
4868 """merge another revision into working directory
4870 """merge another revision into working directory
4869
4871
4870 The current working directory is updated with all changes made in
4872 The current working directory is updated with all changes made in
4871 the requested revision since the last common predecessor revision.
4873 the requested revision since the last common predecessor revision.
4872
4874
4873 Files that changed between either parent are marked as changed for
4875 Files that changed between either parent are marked as changed for
4874 the next commit and a commit must be performed before any further
4876 the next commit and a commit must be performed before any further
4875 updates to the repository are allowed. The next commit will have
4877 updates to the repository are allowed. The next commit will have
4876 two parents.
4878 two parents.
4877
4879
4878 ``--tool`` can be used to specify the merge tool used for file
4880 ``--tool`` can be used to specify the merge tool used for file
4879 merges. It overrides the HGMERGE environment variable and your
4881 merges. It overrides the HGMERGE environment variable and your
4880 configuration files. See :hg:`help merge-tools` for options.
4882 configuration files. See :hg:`help merge-tools` for options.
4881
4883
4882 If no revision is specified, the working directory's parent is a
4884 If no revision is specified, the working directory's parent is a
4883 head revision, and the current branch contains exactly one other
4885 head revision, and the current branch contains exactly one other
4884 head, the other head is merged with by default. Otherwise, an
4886 head, the other head is merged with by default. Otherwise, an
4885 explicit revision with which to merge must be provided.
4887 explicit revision with which to merge must be provided.
4886
4888
4887 See :hg:`help resolve` for information on handling file conflicts.
4889 See :hg:`help resolve` for information on handling file conflicts.
4888
4890
4889 To undo an uncommitted merge, use :hg:`merge --abort` which
4891 To undo an uncommitted merge, use :hg:`merge --abort` which
4890 will check out a clean copy of the original merge parent, losing
4892 will check out a clean copy of the original merge parent, losing
4891 all changes.
4893 all changes.
4892
4894
4893 Returns 0 on success, 1 if there are unresolved files.
4895 Returns 0 on success, 1 if there are unresolved files.
4894 """
4896 """
4895
4897
4896 opts = pycompat.byteskwargs(opts)
4898 opts = pycompat.byteskwargs(opts)
4897 abort = opts.get(b'abort')
4899 abort = opts.get(b'abort')
4898 if abort and repo.dirstate.p2() == repo.nullid:
4900 if abort and repo.dirstate.p2() == repo.nullid:
4899 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4901 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4900 cmdutil.check_incompatible_arguments(opts, b'abort', [b'rev', b'preview'])
4902 cmdutil.check_incompatible_arguments(opts, b'abort', [b'rev', b'preview'])
4901 if abort:
4903 if abort:
4902 state = cmdutil.getunfinishedstate(repo)
4904 state = cmdutil.getunfinishedstate(repo)
4903 if state and state._opname != b'merge':
4905 if state and state._opname != b'merge':
4904 raise error.StateError(
4906 raise error.StateError(
4905 _(b'cannot abort merge with %s in progress') % (state._opname),
4907 _(b'cannot abort merge with %s in progress') % (state._opname),
4906 hint=state.hint(),
4908 hint=state.hint(),
4907 )
4909 )
4908 if node:
4910 if node:
4909 raise error.InputError(_(b"cannot specify a node with --abort"))
4911 raise error.InputError(_(b"cannot specify a node with --abort"))
4910 return hg.abortmerge(repo.ui, repo)
4912 return hg.abortmerge(repo.ui, repo)
4911
4913
4912 if opts.get(b'rev') and node:
4914 if opts.get(b'rev') and node:
4913 raise error.InputError(_(b"please specify just one revision"))
4915 raise error.InputError(_(b"please specify just one revision"))
4914 if not node:
4916 if not node:
4915 node = opts.get(b'rev')
4917 node = opts.get(b'rev')
4916
4918
4917 if node:
4919 if node:
4918 ctx = logcmdutil.revsingle(repo, node)
4920 ctx = logcmdutil.revsingle(repo, node)
4919 else:
4921 else:
4920 if ui.configbool(b'commands', b'merge.require-rev'):
4922 if ui.configbool(b'commands', b'merge.require-rev'):
4921 raise error.InputError(
4923 raise error.InputError(
4922 _(
4924 _(
4923 b'configuration requires specifying revision to merge '
4925 b'configuration requires specifying revision to merge '
4924 b'with'
4926 b'with'
4925 )
4927 )
4926 )
4928 )
4927 ctx = repo[destutil.destmerge(repo)]
4929 ctx = repo[destutil.destmerge(repo)]
4928
4930
4929 if ctx.node() is None:
4931 if ctx.node() is None:
4930 raise error.InputError(
4932 raise error.InputError(
4931 _(b'merging with the working copy has no effect')
4933 _(b'merging with the working copy has no effect')
4932 )
4934 )
4933
4935
4934 if opts.get(b'preview'):
4936 if opts.get(b'preview'):
4935 # find nodes that are ancestors of p2 but not of p1
4937 # find nodes that are ancestors of p2 but not of p1
4936 p1 = repo[b'.'].node()
4938 p1 = repo[b'.'].node()
4937 p2 = ctx.node()
4939 p2 = ctx.node()
4938 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4940 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4939
4941
4940 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
4942 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
4941 for node in nodes:
4943 for node in nodes:
4942 displayer.show(repo[node])
4944 displayer.show(repo[node])
4943 displayer.close()
4945 displayer.close()
4944 return 0
4946 return 0
4945
4947
4946 # ui.forcemerge is an internal variable, do not document
4948 # ui.forcemerge is an internal variable, do not document
4947 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
4949 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
4948 with ui.configoverride(overrides, b'merge'):
4950 with ui.configoverride(overrides, b'merge'):
4949 force = opts.get(b'force')
4951 force = opts.get(b'force')
4950 labels = [b'working copy', b'merge rev', b'common ancestor']
4952 labels = [b'working copy', b'merge rev', b'common ancestor']
4951 return hg.merge(ctx, force=force, labels=labels)
4953 return hg.merge(ctx, force=force, labels=labels)
4952
4954
4953
4955
4954 statemod.addunfinished(
4956 statemod.addunfinished(
4955 b'merge',
4957 b'merge',
4956 fname=None,
4958 fname=None,
4957 clearable=True,
4959 clearable=True,
4958 allowcommit=True,
4960 allowcommit=True,
4959 cmdmsg=_(b'outstanding uncommitted merge'),
4961 cmdmsg=_(b'outstanding uncommitted merge'),
4960 abortfunc=hg.abortmerge,
4962 abortfunc=hg.abortmerge,
4961 statushint=_(
4963 statushint=_(
4962 b'To continue: hg commit\nTo abort: hg merge --abort'
4964 b'To continue: hg commit\nTo abort: hg merge --abort'
4963 ),
4965 ),
4964 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4966 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4965 )
4967 )
4966
4968
4967
4969
4968 @command(
4970 @command(
4969 b'outgoing|out',
4971 b'outgoing|out',
4970 [
4972 [
4971 (
4973 (
4972 b'f',
4974 b'f',
4973 b'force',
4975 b'force',
4974 None,
4976 None,
4975 _(b'run even when the destination is unrelated'),
4977 _(b'run even when the destination is unrelated'),
4976 ),
4978 ),
4977 (
4979 (
4978 b'r',
4980 b'r',
4979 b'rev',
4981 b'rev',
4980 [],
4982 [],
4981 _(b'a changeset intended to be included in the destination'),
4983 _(b'a changeset intended to be included in the destination'),
4982 _(b'REV'),
4984 _(b'REV'),
4983 ),
4985 ),
4984 (b'n', b'newest-first', None, _(b'show newest record first')),
4986 (b'n', b'newest-first', None, _(b'show newest record first')),
4985 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
4987 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
4986 (
4988 (
4987 b'b',
4989 b'b',
4988 b'branch',
4990 b'branch',
4989 [],
4991 [],
4990 _(b'a specific branch you would like to push'),
4992 _(b'a specific branch you would like to push'),
4991 _(b'BRANCH'),
4993 _(b'BRANCH'),
4992 ),
4994 ),
4993 ]
4995 ]
4994 + logopts
4996 + logopts
4995 + remoteopts
4997 + remoteopts
4996 + subrepoopts,
4998 + subrepoopts,
4997 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]...'),
4999 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]...'),
4998 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5000 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4999 )
5001 )
5000 def outgoing(ui, repo, *dests, **opts):
5002 def outgoing(ui, repo, *dests, **opts):
5001 """show changesets not found in the destination
5003 """show changesets not found in the destination
5002
5004
5003 Show changesets not found in the specified destination repository
5005 Show changesets not found in the specified destination repository
5004 or the default push location. These are the changesets that would
5006 or the default push location. These are the changesets that would
5005 be pushed if a push was requested.
5007 be pushed if a push was requested.
5006
5008
5007 See pull for details of valid destination formats.
5009 See pull for details of valid destination formats.
5008
5010
5009 .. container:: verbose
5011 .. container:: verbose
5010
5012
5011 With -B/--bookmarks, the result of bookmark comparison between
5013 With -B/--bookmarks, the result of bookmark comparison between
5012 local and remote repositories is displayed. With -v/--verbose,
5014 local and remote repositories is displayed. With -v/--verbose,
5013 status is also displayed for each bookmark like below::
5015 status is also displayed for each bookmark like below::
5014
5016
5015 BM1 01234567890a added
5017 BM1 01234567890a added
5016 BM2 deleted
5018 BM2 deleted
5017 BM3 234567890abc advanced
5019 BM3 234567890abc advanced
5018 BM4 34567890abcd diverged
5020 BM4 34567890abcd diverged
5019 BM5 4567890abcde changed
5021 BM5 4567890abcde changed
5020
5022
5021 The action taken when pushing depends on the
5023 The action taken when pushing depends on the
5022 status of each bookmark:
5024 status of each bookmark:
5023
5025
5024 :``added``: push with ``-B`` will create it
5026 :``added``: push with ``-B`` will create it
5025 :``deleted``: push with ``-B`` will delete it
5027 :``deleted``: push with ``-B`` will delete it
5026 :``advanced``: push will update it
5028 :``advanced``: push will update it
5027 :``diverged``: push with ``-B`` will update it
5029 :``diverged``: push with ``-B`` will update it
5028 :``changed``: push with ``-B`` will update it
5030 :``changed``: push with ``-B`` will update it
5029
5031
5030 From the point of view of pushing behavior, bookmarks
5032 From the point of view of pushing behavior, bookmarks
5031 existing only in the remote repository are treated as
5033 existing only in the remote repository are treated as
5032 ``deleted``, even if it is in fact added remotely.
5034 ``deleted``, even if it is in fact added remotely.
5033
5035
5034 Returns 0 if there are outgoing changes, 1 otherwise.
5036 Returns 0 if there are outgoing changes, 1 otherwise.
5035 """
5037 """
5036 opts = pycompat.byteskwargs(opts)
5038 opts = pycompat.byteskwargs(opts)
5037 if opts.get(b'bookmarks'):
5039 if opts.get(b'bookmarks'):
5038 for path in urlutil.get_push_paths(repo, ui, dests):
5040 for path in urlutil.get_push_paths(repo, ui, dests):
5039 dest = path.pushloc or path.loc
5041 dest = path.pushloc or path.loc
5040 other = hg.peer(repo, opts, dest)
5042 other = hg.peer(repo, opts, dest)
5041 try:
5043 try:
5042 if b'bookmarks' not in other.listkeys(b'namespaces'):
5044 if b'bookmarks' not in other.listkeys(b'namespaces'):
5043 ui.warn(_(b"remote doesn't support bookmarks\n"))
5045 ui.warn(_(b"remote doesn't support bookmarks\n"))
5044 return 0
5046 return 0
5045 ui.status(
5047 ui.status(
5046 _(b'comparing with %s\n') % urlutil.hidepassword(dest)
5048 _(b'comparing with %s\n') % urlutil.hidepassword(dest)
5047 )
5049 )
5048 ui.pager(b'outgoing')
5050 ui.pager(b'outgoing')
5049 return bookmarks.outgoing(ui, repo, other)
5051 return bookmarks.outgoing(ui, repo, other)
5050 finally:
5052 finally:
5051 other.close()
5053 other.close()
5052
5054
5053 return hg.outgoing(ui, repo, dests, opts)
5055 return hg.outgoing(ui, repo, dests, opts)
5054
5056
5055
5057
5056 @command(
5058 @command(
5057 b'parents',
5059 b'parents',
5058 [
5060 [
5059 (
5061 (
5060 b'r',
5062 b'r',
5061 b'rev',
5063 b'rev',
5062 b'',
5064 b'',
5063 _(b'show parents of the specified revision'),
5065 _(b'show parents of the specified revision'),
5064 _(b'REV'),
5066 _(b'REV'),
5065 ),
5067 ),
5066 ]
5068 ]
5067 + templateopts,
5069 + templateopts,
5068 _(b'[-r REV] [FILE]'),
5070 _(b'[-r REV] [FILE]'),
5069 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
5071 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
5070 inferrepo=True,
5072 inferrepo=True,
5071 )
5073 )
5072 def parents(ui, repo, file_=None, **opts):
5074 def parents(ui, repo, file_=None, **opts):
5073 """show the parents of the working directory or revision (DEPRECATED)
5075 """show the parents of the working directory or revision (DEPRECATED)
5074
5076
5075 Print the working directory's parent revisions. If a revision is
5077 Print the working directory's parent revisions. If a revision is
5076 given via -r/--rev, the parent of that revision will be printed.
5078 given via -r/--rev, the parent of that revision will be printed.
5077 If a file argument is given, the revision in which the file was
5079 If a file argument is given, the revision in which the file was
5078 last changed (before the working directory revision or the
5080 last changed (before the working directory revision or the
5079 argument to --rev if given) is printed.
5081 argument to --rev if given) is printed.
5080
5082
5081 This command is equivalent to::
5083 This command is equivalent to::
5082
5084
5083 hg log -r "p1()+p2()" or
5085 hg log -r "p1()+p2()" or
5084 hg log -r "p1(REV)+p2(REV)" or
5086 hg log -r "p1(REV)+p2(REV)" or
5085 hg log -r "max(::p1() and file(FILE))+max(::p2() and file(FILE))" or
5087 hg log -r "max(::p1() and file(FILE))+max(::p2() and file(FILE))" or
5086 hg log -r "max(::p1(REV) and file(FILE))+max(::p2(REV) and file(FILE))"
5088 hg log -r "max(::p1(REV) and file(FILE))+max(::p2(REV) and file(FILE))"
5087
5089
5088 See :hg:`summary` and :hg:`help revsets` for related information.
5090 See :hg:`summary` and :hg:`help revsets` for related information.
5089
5091
5090 Returns 0 on success.
5092 Returns 0 on success.
5091 """
5093 """
5092
5094
5093 opts = pycompat.byteskwargs(opts)
5095 opts = pycompat.byteskwargs(opts)
5094 rev = opts.get(b'rev')
5096 rev = opts.get(b'rev')
5095 if rev:
5097 if rev:
5096 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
5098 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
5097 ctx = logcmdutil.revsingle(repo, rev, None)
5099 ctx = logcmdutil.revsingle(repo, rev, None)
5098
5100
5099 if file_:
5101 if file_:
5100 m = scmutil.match(ctx, (file_,), opts)
5102 m = scmutil.match(ctx, (file_,), opts)
5101 if m.anypats() or len(m.files()) != 1:
5103 if m.anypats() or len(m.files()) != 1:
5102 raise error.InputError(_(b'can only specify an explicit filename'))
5104 raise error.InputError(_(b'can only specify an explicit filename'))
5103 file_ = m.files()[0]
5105 file_ = m.files()[0]
5104 filenodes = []
5106 filenodes = []
5105 for cp in ctx.parents():
5107 for cp in ctx.parents():
5106 if not cp:
5108 if not cp:
5107 continue
5109 continue
5108 try:
5110 try:
5109 filenodes.append(cp.filenode(file_))
5111 filenodes.append(cp.filenode(file_))
5110 except error.LookupError:
5112 except error.LookupError:
5111 pass
5113 pass
5112 if not filenodes:
5114 if not filenodes:
5113 raise error.InputError(_(b"'%s' not found in manifest") % file_)
5115 raise error.InputError(_(b"'%s' not found in manifest") % file_)
5114 p = []
5116 p = []
5115 for fn in filenodes:
5117 for fn in filenodes:
5116 fctx = repo.filectx(file_, fileid=fn)
5118 fctx = repo.filectx(file_, fileid=fn)
5117 p.append(fctx.node())
5119 p.append(fctx.node())
5118 else:
5120 else:
5119 p = [cp.node() for cp in ctx.parents()]
5121 p = [cp.node() for cp in ctx.parents()]
5120
5122
5121 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
5123 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
5122 for n in p:
5124 for n in p:
5123 if n != repo.nullid:
5125 if n != repo.nullid:
5124 displayer.show(repo[n])
5126 displayer.show(repo[n])
5125 displayer.close()
5127 displayer.close()
5126
5128
5127
5129
5128 @command(
5130 @command(
5129 b'paths',
5131 b'paths',
5130 formatteropts,
5132 formatteropts,
5131 _(b'[NAME]'),
5133 _(b'[NAME]'),
5132 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5134 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5133 optionalrepo=True,
5135 optionalrepo=True,
5134 intents={INTENT_READONLY},
5136 intents={INTENT_READONLY},
5135 )
5137 )
5136 def paths(ui, repo, search=None, **opts):
5138 def paths(ui, repo, search=None, **opts):
5137 """show aliases for remote repositories
5139 """show aliases for remote repositories
5138
5140
5139 Show definition of symbolic path name NAME. If no name is given,
5141 Show definition of symbolic path name NAME. If no name is given,
5140 show definition of all available names.
5142 show definition of all available names.
5141
5143
5142 Option -q/--quiet suppresses all output when searching for NAME
5144 Option -q/--quiet suppresses all output when searching for NAME
5143 and shows only the path names when listing all definitions.
5145 and shows only the path names when listing all definitions.
5144
5146
5145 Path names are defined in the [paths] section of your
5147 Path names are defined in the [paths] section of your
5146 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5148 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5147 repository, ``.hg/hgrc`` is used, too.
5149 repository, ``.hg/hgrc`` is used, too.
5148
5150
5149 The path names ``default`` and ``default-push`` have a special
5151 The path names ``default`` and ``default-push`` have a special
5150 meaning. When performing a push or pull operation, they are used
5152 meaning. When performing a push or pull operation, they are used
5151 as fallbacks if no location is specified on the command-line.
5153 as fallbacks if no location is specified on the command-line.
5152 When ``default-push`` is set, it will be used for push and
5154 When ``default-push`` is set, it will be used for push and
5153 ``default`` will be used for pull; otherwise ``default`` is used
5155 ``default`` will be used for pull; otherwise ``default`` is used
5154 as the fallback for both. When cloning a repository, the clone
5156 as the fallback for both. When cloning a repository, the clone
5155 source is written as ``default`` in ``.hg/hgrc``.
5157 source is written as ``default`` in ``.hg/hgrc``.
5156
5158
5157 .. note::
5159 .. note::
5158
5160
5159 ``default`` and ``default-push`` apply to all inbound (e.g.
5161 ``default`` and ``default-push`` apply to all inbound (e.g.
5160 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email`
5162 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email`
5161 and :hg:`bundle`) operations.
5163 and :hg:`bundle`) operations.
5162
5164
5163 See :hg:`help urls` for more information.
5165 See :hg:`help urls` for more information.
5164
5166
5165 .. container:: verbose
5167 .. container:: verbose
5166
5168
5167 Template:
5169 Template:
5168
5170
5169 The following keywords are supported. See also :hg:`help templates`.
5171 The following keywords are supported. See also :hg:`help templates`.
5170
5172
5171 :name: String. Symbolic name of the path alias.
5173 :name: String. Symbolic name of the path alias.
5172 :pushurl: String. URL for push operations.
5174 :pushurl: String. URL for push operations.
5173 :url: String. URL or directory path for the other operations.
5175 :url: String. URL or directory path for the other operations.
5174
5176
5175 Returns 0 on success.
5177 Returns 0 on success.
5176 """
5178 """
5177
5179
5178 opts = pycompat.byteskwargs(opts)
5180 opts = pycompat.byteskwargs(opts)
5179
5181
5180 pathitems = urlutil.list_paths(ui, search)
5182 pathitems = urlutil.list_paths(ui, search)
5181 ui.pager(b'paths')
5183 ui.pager(b'paths')
5182
5184
5183 fm = ui.formatter(b'paths', opts)
5185 fm = ui.formatter(b'paths', opts)
5184 if fm.isplain():
5186 if fm.isplain():
5185 hidepassword = urlutil.hidepassword
5187 hidepassword = urlutil.hidepassword
5186 else:
5188 else:
5187 hidepassword = bytes
5189 hidepassword = bytes
5188 if ui.quiet:
5190 if ui.quiet:
5189 namefmt = b'%s\n'
5191 namefmt = b'%s\n'
5190 else:
5192 else:
5191 namefmt = b'%s = '
5193 namefmt = b'%s = '
5192 showsubopts = not search and not ui.quiet
5194 showsubopts = not search and not ui.quiet
5193
5195
5194 for name, path in pathitems:
5196 for name, path in pathitems:
5195 fm.startitem()
5197 fm.startitem()
5196 fm.condwrite(not search, b'name', namefmt, name)
5198 fm.condwrite(not search, b'name', namefmt, name)
5197 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5199 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5198 for subopt, value in sorted(path.suboptions.items()):
5200 for subopt, value in sorted(path.suboptions.items()):
5199 assert subopt not in (b'name', b'url')
5201 assert subopt not in (b'name', b'url')
5200 if showsubopts:
5202 if showsubopts:
5201 fm.plain(b'%s:%s = ' % (name, subopt))
5203 fm.plain(b'%s:%s = ' % (name, subopt))
5202 if isinstance(value, bool):
5204 if isinstance(value, bool):
5203 if value:
5205 if value:
5204 value = b'yes'
5206 value = b'yes'
5205 else:
5207 else:
5206 value = b'no'
5208 value = b'no'
5207 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5209 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5208
5210
5209 fm.end()
5211 fm.end()
5210
5212
5211 if search and not pathitems:
5213 if search and not pathitems:
5212 if not ui.quiet:
5214 if not ui.quiet:
5213 ui.warn(_(b"not found!\n"))
5215 ui.warn(_(b"not found!\n"))
5214 return 1
5216 return 1
5215 else:
5217 else:
5216 return 0
5218 return 0
5217
5219
5218
5220
5219 @command(
5221 @command(
5220 b'phase',
5222 b'phase',
5221 [
5223 [
5222 (b'p', b'public', False, _(b'set changeset phase to public')),
5224 (b'p', b'public', False, _(b'set changeset phase to public')),
5223 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5225 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5224 (b's', b'secret', False, _(b'set changeset phase to secret')),
5226 (b's', b'secret', False, _(b'set changeset phase to secret')),
5225 (b'f', b'force', False, _(b'allow to move boundary backward')),
5227 (b'f', b'force', False, _(b'allow to move boundary backward')),
5226 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5228 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5227 ],
5229 ],
5228 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5230 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5229 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5231 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5230 )
5232 )
5231 def phase(ui, repo, *revs, **opts):
5233 def phase(ui, repo, *revs, **opts):
5232 """set or show the current phase name
5234 """set or show the current phase name
5233
5235
5234 With no argument, show the phase name of the current revision(s).
5236 With no argument, show the phase name of the current revision(s).
5235
5237
5236 With one of -p/--public, -d/--draft or -s/--secret, change the
5238 With one of -p/--public, -d/--draft or -s/--secret, change the
5237 phase value of the specified revisions.
5239 phase value of the specified revisions.
5238
5240
5239 Unless -f/--force is specified, :hg:`phase` won't move changesets from a
5241 Unless -f/--force is specified, :hg:`phase` won't move changesets from a
5240 lower phase to a higher phase. Phases are ordered as follows::
5242 lower phase to a higher phase. Phases are ordered as follows::
5241
5243
5242 public < draft < secret
5244 public < draft < secret
5243
5245
5244 Returns 0 on success, 1 if some phases could not be changed.
5246 Returns 0 on success, 1 if some phases could not be changed.
5245
5247
5246 (For more information about the phases concept, see :hg:`help phases`.)
5248 (For more information about the phases concept, see :hg:`help phases`.)
5247 """
5249 """
5248 opts = pycompat.byteskwargs(opts)
5250 opts = pycompat.byteskwargs(opts)
5249 # search for a unique phase argument
5251 # search for a unique phase argument
5250 targetphase = None
5252 targetphase = None
5251 for idx, name in enumerate(phases.cmdphasenames):
5253 for idx, name in enumerate(phases.cmdphasenames):
5252 if opts[name]:
5254 if opts[name]:
5253 if targetphase is not None:
5255 if targetphase is not None:
5254 raise error.InputError(_(b'only one phase can be specified'))
5256 raise error.InputError(_(b'only one phase can be specified'))
5255 targetphase = idx
5257 targetphase = idx
5256
5258
5257 # look for specified revision
5259 # look for specified revision
5258 revs = list(revs)
5260 revs = list(revs)
5259 revs.extend(opts[b'rev'])
5261 revs.extend(opts[b'rev'])
5260 if revs:
5262 if revs:
5261 revs = logcmdutil.revrange(repo, revs)
5263 revs = logcmdutil.revrange(repo, revs)
5262 else:
5264 else:
5263 # display both parents as the second parent phase can influence
5265 # display both parents as the second parent phase can influence
5264 # the phase of a merge commit
5266 # the phase of a merge commit
5265 revs = [c.rev() for c in repo[None].parents()]
5267 revs = [c.rev() for c in repo[None].parents()]
5266
5268
5267 ret = 0
5269 ret = 0
5268 if targetphase is None:
5270 if targetphase is None:
5269 # display
5271 # display
5270 for r in revs:
5272 for r in revs:
5271 ctx = repo[r]
5273 ctx = repo[r]
5272 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5274 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5273 else:
5275 else:
5274 with repo.lock(), repo.transaction(b"phase") as tr:
5276 with repo.lock(), repo.transaction(b"phase") as tr:
5275 # set phase
5277 # set phase
5276 if not revs:
5278 if not revs:
5277 raise error.InputError(_(b'empty revision set'))
5279 raise error.InputError(_(b'empty revision set'))
5278 nodes = [repo[r].node() for r in revs]
5280 nodes = [repo[r].node() for r in revs]
5279 # moving revision from public to draft may hide them
5281 # moving revision from public to draft may hide them
5280 # We have to check result on an unfiltered repository
5282 # We have to check result on an unfiltered repository
5281 unfi = repo.unfiltered()
5283 unfi = repo.unfiltered()
5282 getphase = unfi._phasecache.phase
5284 getphase = unfi._phasecache.phase
5283 olddata = [getphase(unfi, r) for r in unfi]
5285 olddata = [getphase(unfi, r) for r in unfi]
5284 phases.advanceboundary(repo, tr, targetphase, nodes)
5286 phases.advanceboundary(repo, tr, targetphase, nodes)
5285 if opts[b'force']:
5287 if opts[b'force']:
5286 phases.retractboundary(repo, tr, targetphase, nodes)
5288 phases.retractboundary(repo, tr, targetphase, nodes)
5287 getphase = unfi._phasecache.phase
5289 getphase = unfi._phasecache.phase
5288 newdata = [getphase(unfi, r) for r in unfi]
5290 newdata = [getphase(unfi, r) for r in unfi]
5289 changes = sum(newdata[r] != olddata[r] for r in unfi)
5291 changes = sum(newdata[r] != olddata[r] for r in unfi)
5290 cl = unfi.changelog
5292 cl = unfi.changelog
5291 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5293 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5292 if rejected:
5294 if rejected:
5293 ui.warn(
5295 ui.warn(
5294 _(
5296 _(
5295 b'cannot move %i changesets to a higher '
5297 b'cannot move %i changesets to a higher '
5296 b'phase, use --force\n'
5298 b'phase, use --force\n'
5297 )
5299 )
5298 % len(rejected)
5300 % len(rejected)
5299 )
5301 )
5300 ret = 1
5302 ret = 1
5301 if changes:
5303 if changes:
5302 msg = _(b'phase changed for %i changesets\n') % changes
5304 msg = _(b'phase changed for %i changesets\n') % changes
5303 if ret:
5305 if ret:
5304 ui.status(msg)
5306 ui.status(msg)
5305 else:
5307 else:
5306 ui.note(msg)
5308 ui.note(msg)
5307 else:
5309 else:
5308 ui.warn(_(b'no phases changed\n'))
5310 ui.warn(_(b'no phases changed\n'))
5309 return ret
5311 return ret
5310
5312
5311
5313
5312 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5314 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5313 """Run after a changegroup has been added via pull/unbundle
5315 """Run after a changegroup has been added via pull/unbundle
5314
5316
5315 This takes arguments below:
5317 This takes arguments below:
5316
5318
5317 :modheads: change of heads by pull/unbundle
5319 :modheads: change of heads by pull/unbundle
5318 :optupdate: updating working directory is needed or not
5320 :optupdate: updating working directory is needed or not
5319 :checkout: update destination revision (or None to default destination)
5321 :checkout: update destination revision (or None to default destination)
5320 :brev: a name, which might be a bookmark to be activated after updating
5322 :brev: a name, which might be a bookmark to be activated after updating
5321
5323
5322 return True if update raise any conflict, False otherwise.
5324 return True if update raise any conflict, False otherwise.
5323 """
5325 """
5324 if modheads == 0:
5326 if modheads == 0:
5325 return False
5327 return False
5326 if optupdate:
5328 if optupdate:
5327 try:
5329 try:
5328 return hg.updatetotally(ui, repo, checkout, brev)
5330 return hg.updatetotally(ui, repo, checkout, brev)
5329 except error.UpdateAbort as inst:
5331 except error.UpdateAbort as inst:
5330 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5332 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5331 hint = inst.hint
5333 hint = inst.hint
5332 raise error.UpdateAbort(msg, hint=hint)
5334 raise error.UpdateAbort(msg, hint=hint)
5333 if modheads is not None and modheads > 1:
5335 if modheads is not None and modheads > 1:
5334 currentbranchheads = len(repo.branchheads())
5336 currentbranchheads = len(repo.branchheads())
5335 if currentbranchheads == modheads:
5337 if currentbranchheads == modheads:
5336 ui.status(
5338 ui.status(
5337 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5339 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5338 )
5340 )
5339 elif currentbranchheads > 1:
5341 elif currentbranchheads > 1:
5340 ui.status(
5342 ui.status(
5341 _(b"(run 'hg heads .' to see heads, 'hg merge' to merge)\n")
5343 _(b"(run 'hg heads .' to see heads, 'hg merge' to merge)\n")
5342 )
5344 )
5343 else:
5345 else:
5344 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5346 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5345 elif not ui.configbool(b'commands', b'update.requiredest'):
5347 elif not ui.configbool(b'commands', b'update.requiredest'):
5346 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5348 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5347 return False
5349 return False
5348
5350
5349
5351
5350 @command(
5352 @command(
5351 b'pull',
5353 b'pull',
5352 [
5354 [
5353 (
5355 (
5354 b'u',
5356 b'u',
5355 b'update',
5357 b'update',
5356 None,
5358 None,
5357 _(b'update to new branch head if new descendants were pulled'),
5359 _(b'update to new branch head if new descendants were pulled'),
5358 ),
5360 ),
5359 (
5361 (
5360 b'f',
5362 b'f',
5361 b'force',
5363 b'force',
5362 None,
5364 None,
5363 _(b'run even when remote repository is unrelated'),
5365 _(b'run even when remote repository is unrelated'),
5364 ),
5366 ),
5365 (
5367 (
5366 b'',
5368 b'',
5367 b'confirm',
5369 b'confirm',
5368 None,
5370 None,
5369 _(b'confirm pull before applying changes'),
5371 _(b'confirm pull before applying changes'),
5370 ),
5372 ),
5371 (
5373 (
5372 b'r',
5374 b'r',
5373 b'rev',
5375 b'rev',
5374 [],
5376 [],
5375 _(b'a remote changeset intended to be added'),
5377 _(b'a remote changeset intended to be added'),
5376 _(b'REV'),
5378 _(b'REV'),
5377 ),
5379 ),
5378 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5380 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5379 (
5381 (
5380 b'b',
5382 b'b',
5381 b'branch',
5383 b'branch',
5382 [],
5384 [],
5383 _(b'a specific branch you would like to pull'),
5385 _(b'a specific branch you would like to pull'),
5384 _(b'BRANCH'),
5386 _(b'BRANCH'),
5385 ),
5387 ),
5386 ]
5388 ]
5387 + remoteopts,
5389 + remoteopts,
5388 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]...'),
5390 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]...'),
5389 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5391 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5390 helpbasic=True,
5392 helpbasic=True,
5391 )
5393 )
5392 def pull(ui, repo, *sources, **opts):
5394 def pull(ui, repo, *sources, **opts):
5393 """pull changes from the specified source
5395 """pull changes from the specified source
5394
5396
5395 Pull changes from a remote repository to a local one.
5397 Pull changes from a remote repository to a local one.
5396
5398
5397 This finds all changes from the repository at the specified path
5399 This finds all changes from the repository at the specified path
5398 or URL and adds them to a local repository (the current one unless
5400 or URL and adds them to a local repository (the current one unless
5399 -R is specified). By default, this does not update the copy of the
5401 -R is specified). By default, this does not update the copy of the
5400 project in the working directory.
5402 project in the working directory.
5401
5403
5402 When cloning from servers that support it, Mercurial may fetch
5404 When cloning from servers that support it, Mercurial may fetch
5403 pre-generated data. When this is done, hooks operating on incoming
5405 pre-generated data. When this is done, hooks operating on incoming
5404 changesets and changegroups may fire more than once, once for each
5406 changesets and changegroups may fire more than once, once for each
5405 pre-generated bundle and as well as for any additional remaining
5407 pre-generated bundle and as well as for any additional remaining
5406 data. See :hg:`help -e clonebundles` for more.
5408 data. See :hg:`help -e clonebundles` for more.
5407
5409
5408 Use :hg:`incoming` if you want to see what would have been added
5410 Use :hg:`incoming` if you want to see what would have been added
5409 by a pull at the time you issued this command. If you then decide
5411 by a pull at the time you issued this command. If you then decide
5410 to add those changes to the repository, you should use :hg:`pull
5412 to add those changes to the repository, you should use :hg:`pull
5411 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5413 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5412
5414
5413 If SOURCE is omitted, the 'default' path will be used.
5415 If SOURCE is omitted, the 'default' path will be used.
5414 See :hg:`help urls` for more information.
5416 See :hg:`help urls` for more information.
5415
5417
5416 If multiple sources are specified, they will be pulled sequentially as if
5418 If multiple sources are specified, they will be pulled sequentially as if
5417 the command was run multiple time. If --update is specify and the command
5419 the command was run multiple time. If --update is specify and the command
5418 will stop at the first failed --update.
5420 will stop at the first failed --update.
5419
5421
5420 Specifying bookmark as ``.`` is equivalent to specifying the active
5422 Specifying bookmark as ``.`` is equivalent to specifying the active
5421 bookmark's name.
5423 bookmark's name.
5422
5424
5423 Returns 0 on success, 1 if an update had unresolved files.
5425 Returns 0 on success, 1 if an update had unresolved files.
5424 """
5426 """
5425
5427
5426 opts = pycompat.byteskwargs(opts)
5428 opts = pycompat.byteskwargs(opts)
5427 if ui.configbool(b'commands', b'update.requiredest') and opts.get(
5429 if ui.configbool(b'commands', b'update.requiredest') and opts.get(
5428 b'update'
5430 b'update'
5429 ):
5431 ):
5430 msg = _(b'update destination required by configuration')
5432 msg = _(b'update destination required by configuration')
5431 hint = _(b'use hg pull followed by hg update DEST')
5433 hint = _(b'use hg pull followed by hg update DEST')
5432 raise error.InputError(msg, hint=hint)
5434 raise error.InputError(msg, hint=hint)
5433
5435
5434 for path in urlutil.get_pull_paths(repo, ui, sources):
5436 for path in urlutil.get_pull_paths(repo, ui, sources):
5435 source, branches = urlutil.parseurl(path.rawloc, opts.get(b'branch'))
5437 source, branches = urlutil.parseurl(path.rawloc, opts.get(b'branch'))
5436 ui.status(_(b'pulling from %s\n') % urlutil.hidepassword(source))
5438 ui.status(_(b'pulling from %s\n') % urlutil.hidepassword(source))
5437 ui.flush()
5439 ui.flush()
5438 other = hg.peer(repo, opts, source)
5440 other = hg.peer(repo, opts, source)
5439 update_conflict = None
5441 update_conflict = None
5440 try:
5442 try:
5441 revs, checkout = hg.addbranchrevs(
5443 revs, checkout = hg.addbranchrevs(
5442 repo, other, branches, opts.get(b'rev')
5444 repo, other, branches, opts.get(b'rev')
5443 )
5445 )
5444
5446
5445 pullopargs = {}
5447 pullopargs = {}
5446
5448
5447 nodes = None
5449 nodes = None
5448 if opts.get(b'bookmark') or revs:
5450 if opts.get(b'bookmark') or revs:
5449 # The list of bookmark used here is the same used to actually update
5451 # The list of bookmark used here is the same used to actually update
5450 # the bookmark names, to avoid the race from issue 4689 and we do
5452 # the bookmark names, to avoid the race from issue 4689 and we do
5451 # all lookup and bookmark queries in one go so they see the same
5453 # all lookup and bookmark queries in one go so they see the same
5452 # version of the server state (issue 4700).
5454 # version of the server state (issue 4700).
5453 nodes = []
5455 nodes = []
5454 fnodes = []
5456 fnodes = []
5455 revs = revs or []
5457 revs = revs or []
5456 if revs and not other.capable(b'lookup'):
5458 if revs and not other.capable(b'lookup'):
5457 err = _(
5459 err = _(
5458 b"other repository doesn't support revision lookup, "
5460 b"other repository doesn't support revision lookup, "
5459 b"so a rev cannot be specified."
5461 b"so a rev cannot be specified."
5460 )
5462 )
5461 raise error.Abort(err)
5463 raise error.Abort(err)
5462 with other.commandexecutor() as e:
5464 with other.commandexecutor() as e:
5463 fremotebookmarks = e.callcommand(
5465 fremotebookmarks = e.callcommand(
5464 b'listkeys', {b'namespace': b'bookmarks'}
5466 b'listkeys', {b'namespace': b'bookmarks'}
5465 )
5467 )
5466 for r in revs:
5468 for r in revs:
5467 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5469 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5468 remotebookmarks = fremotebookmarks.result()
5470 remotebookmarks = fremotebookmarks.result()
5469 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5471 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5470 pullopargs[b'remotebookmarks'] = remotebookmarks
5472 pullopargs[b'remotebookmarks'] = remotebookmarks
5471 for b in opts.get(b'bookmark', []):
5473 for b in opts.get(b'bookmark', []):
5472 b = repo._bookmarks.expandname(b)
5474 b = repo._bookmarks.expandname(b)
5473 if b not in remotebookmarks:
5475 if b not in remotebookmarks:
5474 raise error.InputError(
5476 raise error.InputError(
5475 _(b'remote bookmark %s not found!') % b
5477 _(b'remote bookmark %s not found!') % b
5476 )
5478 )
5477 nodes.append(remotebookmarks[b])
5479 nodes.append(remotebookmarks[b])
5478 for i, rev in enumerate(revs):
5480 for i, rev in enumerate(revs):
5479 node = fnodes[i].result()
5481 node = fnodes[i].result()
5480 nodes.append(node)
5482 nodes.append(node)
5481 if rev == checkout:
5483 if rev == checkout:
5482 checkout = node
5484 checkout = node
5483
5485
5484 wlock = util.nullcontextmanager()
5486 wlock = util.nullcontextmanager()
5485 if opts.get(b'update'):
5487 if opts.get(b'update'):
5486 wlock = repo.wlock()
5488 wlock = repo.wlock()
5487 with wlock:
5489 with wlock:
5488 pullopargs.update(opts.get(b'opargs', {}))
5490 pullopargs.update(opts.get(b'opargs', {}))
5489 modheads = exchange.pull(
5491 modheads = exchange.pull(
5490 repo,
5492 repo,
5491 other,
5493 other,
5492 path=path,
5494 path=path,
5493 heads=nodes,
5495 heads=nodes,
5494 force=opts.get(b'force'),
5496 force=opts.get(b'force'),
5495 bookmarks=opts.get(b'bookmark', ()),
5497 bookmarks=opts.get(b'bookmark', ()),
5496 opargs=pullopargs,
5498 opargs=pullopargs,
5497 confirm=opts.get(b'confirm'),
5499 confirm=opts.get(b'confirm'),
5498 ).cgresult
5500 ).cgresult
5499
5501
5500 # brev is a name, which might be a bookmark to be activated at
5502 # brev is a name, which might be a bookmark to be activated at
5501 # the end of the update. In other words, it is an explicit
5503 # the end of the update. In other words, it is an explicit
5502 # destination of the update
5504 # destination of the update
5503 brev = None
5505 brev = None
5504
5506
5505 if checkout:
5507 if checkout:
5506 checkout = repo.unfiltered().changelog.rev(checkout)
5508 checkout = repo.unfiltered().changelog.rev(checkout)
5507
5509
5508 # order below depends on implementation of
5510 # order below depends on implementation of
5509 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5511 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5510 # because 'checkout' is determined without it.
5512 # because 'checkout' is determined without it.
5511 if opts.get(b'rev'):
5513 if opts.get(b'rev'):
5512 brev = opts[b'rev'][0]
5514 brev = opts[b'rev'][0]
5513 elif opts.get(b'branch'):
5515 elif opts.get(b'branch'):
5514 brev = opts[b'branch'][0]
5516 brev = opts[b'branch'][0]
5515 else:
5517 else:
5516 brev = branches[0]
5518 brev = branches[0]
5517 repo._subtoppath = source
5519 repo._subtoppath = source
5518 try:
5520 try:
5519 update_conflict = postincoming(
5521 update_conflict = postincoming(
5520 ui, repo, modheads, opts.get(b'update'), checkout, brev
5522 ui, repo, modheads, opts.get(b'update'), checkout, brev
5521 )
5523 )
5522 except error.FilteredRepoLookupError as exc:
5524 except error.FilteredRepoLookupError as exc:
5523 msg = _(b'cannot update to target: %s') % exc.args[0]
5525 msg = _(b'cannot update to target: %s') % exc.args[0]
5524 exc.args = (msg,) + exc.args[1:]
5526 exc.args = (msg,) + exc.args[1:]
5525 raise
5527 raise
5526 finally:
5528 finally:
5527 del repo._subtoppath
5529 del repo._subtoppath
5528
5530
5529 finally:
5531 finally:
5530 other.close()
5532 other.close()
5531 # skip the remaining pull source if they are some conflict.
5533 # skip the remaining pull source if they are some conflict.
5532 if update_conflict:
5534 if update_conflict:
5533 break
5535 break
5534 if update_conflict:
5536 if update_conflict:
5535 return 1
5537 return 1
5536 else:
5538 else:
5537 return 0
5539 return 0
5538
5540
5539
5541
5540 @command(
5542 @command(
5541 b'purge|clean',
5543 b'purge|clean',
5542 [
5544 [
5543 (b'a', b'abort-on-err', None, _(b'abort if an error occurs')),
5545 (b'a', b'abort-on-err', None, _(b'abort if an error occurs')),
5544 (b'', b'all', None, _(b'purge ignored files too')),
5546 (b'', b'all', None, _(b'purge ignored files too')),
5545 (b'i', b'ignored', None, _(b'purge only ignored files')),
5547 (b'i', b'ignored', None, _(b'purge only ignored files')),
5546 (b'', b'dirs', None, _(b'purge empty directories')),
5548 (b'', b'dirs', None, _(b'purge empty directories')),
5547 (b'', b'files', None, _(b'purge files')),
5549 (b'', b'files', None, _(b'purge files')),
5548 (b'p', b'print', None, _(b'print filenames instead of deleting them')),
5550 (b'p', b'print', None, _(b'print filenames instead of deleting them')),
5549 (
5551 (
5550 b'0',
5552 b'0',
5551 b'print0',
5553 b'print0',
5552 None,
5554 None,
5553 _(
5555 _(
5554 b'end filenames with NUL, for use with xargs'
5556 b'end filenames with NUL, for use with xargs'
5555 b' (implies -p/--print)'
5557 b' (implies -p/--print)'
5556 ),
5558 ),
5557 ),
5559 ),
5558 (b'', b'confirm', None, _(b'ask before permanently deleting files')),
5560 (b'', b'confirm', None, _(b'ask before permanently deleting files')),
5559 ]
5561 ]
5560 + cmdutil.walkopts,
5562 + cmdutil.walkopts,
5561 _(b'hg purge [OPTION]... [DIR]...'),
5563 _(b'hg purge [OPTION]... [DIR]...'),
5562 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5564 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5563 )
5565 )
5564 def purge(ui, repo, *dirs, **opts):
5566 def purge(ui, repo, *dirs, **opts):
5565 """removes files not tracked by Mercurial
5567 """removes files not tracked by Mercurial
5566
5568
5567 Delete files not known to Mercurial. This is useful to test local
5569 Delete files not known to Mercurial. This is useful to test local
5568 and uncommitted changes in an otherwise-clean source tree.
5570 and uncommitted changes in an otherwise-clean source tree.
5569
5571
5570 This means that purge will delete the following by default:
5572 This means that purge will delete the following by default:
5571
5573
5572 - Unknown files: files marked with "?" by :hg:`status`
5574 - Unknown files: files marked with "?" by :hg:`status`
5573 - Empty directories: in fact Mercurial ignores directories unless
5575 - Empty directories: in fact Mercurial ignores directories unless
5574 they contain files under source control management
5576 they contain files under source control management
5575
5577
5576 But it will leave untouched:
5578 But it will leave untouched:
5577
5579
5578 - Modified and unmodified tracked files
5580 - Modified and unmodified tracked files
5579 - Ignored files (unless -i or --all is specified)
5581 - Ignored files (unless -i or --all is specified)
5580 - New files added to the repository (with :hg:`add`)
5582 - New files added to the repository (with :hg:`add`)
5581
5583
5582 The --files and --dirs options can be used to direct purge to delete
5584 The --files and --dirs options can be used to direct purge to delete
5583 only files, only directories, or both. If neither option is given,
5585 only files, only directories, or both. If neither option is given,
5584 both will be deleted.
5586 both will be deleted.
5585
5587
5586 If directories are given on the command line, only files in these
5588 If directories are given on the command line, only files in these
5587 directories are considered.
5589 directories are considered.
5588
5590
5589 Be careful with purge, as you could irreversibly delete some files
5591 Be careful with purge, as you could irreversibly delete some files
5590 you forgot to add to the repository. If you only want to print the
5592 you forgot to add to the repository. If you only want to print the
5591 list of files that this program would delete, use the --print
5593 list of files that this program would delete, use the --print
5592 option.
5594 option.
5593 """
5595 """
5594 opts = pycompat.byteskwargs(opts)
5596 opts = pycompat.byteskwargs(opts)
5595 cmdutil.check_at_most_one_arg(opts, b'all', b'ignored')
5597 cmdutil.check_at_most_one_arg(opts, b'all', b'ignored')
5596
5598
5597 act = not opts.get(b'print')
5599 act = not opts.get(b'print')
5598 eol = b'\n'
5600 eol = b'\n'
5599 if opts.get(b'print0'):
5601 if opts.get(b'print0'):
5600 eol = b'\0'
5602 eol = b'\0'
5601 act = False # --print0 implies --print
5603 act = False # --print0 implies --print
5602 if opts.get(b'all', False):
5604 if opts.get(b'all', False):
5603 ignored = True
5605 ignored = True
5604 unknown = True
5606 unknown = True
5605 else:
5607 else:
5606 ignored = opts.get(b'ignored', False)
5608 ignored = opts.get(b'ignored', False)
5607 unknown = not ignored
5609 unknown = not ignored
5608
5610
5609 removefiles = opts.get(b'files')
5611 removefiles = opts.get(b'files')
5610 removedirs = opts.get(b'dirs')
5612 removedirs = opts.get(b'dirs')
5611 confirm = opts.get(b'confirm')
5613 confirm = opts.get(b'confirm')
5612 if confirm is None:
5614 if confirm is None:
5613 try:
5615 try:
5614 extensions.find(b'purge')
5616 extensions.find(b'purge')
5615 confirm = False
5617 confirm = False
5616 except KeyError:
5618 except KeyError:
5617 confirm = True
5619 confirm = True
5618
5620
5619 if not removefiles and not removedirs:
5621 if not removefiles and not removedirs:
5620 removefiles = True
5622 removefiles = True
5621 removedirs = True
5623 removedirs = True
5622
5624
5623 match = scmutil.match(repo[None], dirs, opts)
5625 match = scmutil.match(repo[None], dirs, opts)
5624
5626
5625 paths = mergemod.purge(
5627 paths = mergemod.purge(
5626 repo,
5628 repo,
5627 match,
5629 match,
5628 unknown=unknown,
5630 unknown=unknown,
5629 ignored=ignored,
5631 ignored=ignored,
5630 removeemptydirs=removedirs,
5632 removeemptydirs=removedirs,
5631 removefiles=removefiles,
5633 removefiles=removefiles,
5632 abortonerror=opts.get(b'abort_on_err'),
5634 abortonerror=opts.get(b'abort_on_err'),
5633 noop=not act,
5635 noop=not act,
5634 confirm=confirm,
5636 confirm=confirm,
5635 )
5637 )
5636
5638
5637 for path in paths:
5639 for path in paths:
5638 if not act:
5640 if not act:
5639 ui.write(b'%s%s' % (path, eol))
5641 ui.write(b'%s%s' % (path, eol))
5640
5642
5641
5643
5642 @command(
5644 @command(
5643 b'push',
5645 b'push',
5644 [
5646 [
5645 (b'f', b'force', None, _(b'force push')),
5647 (b'f', b'force', None, _(b'force push')),
5646 (
5648 (
5647 b'r',
5649 b'r',
5648 b'rev',
5650 b'rev',
5649 [],
5651 [],
5650 _(b'a changeset intended to be included in the destination'),
5652 _(b'a changeset intended to be included in the destination'),
5651 _(b'REV'),
5653 _(b'REV'),
5652 ),
5654 ),
5653 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5655 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5654 (b'', b'all-bookmarks', None, _(b"push all bookmarks (EXPERIMENTAL)")),
5656 (b'', b'all-bookmarks', None, _(b"push all bookmarks (EXPERIMENTAL)")),
5655 (
5657 (
5656 b'b',
5658 b'b',
5657 b'branch',
5659 b'branch',
5658 [],
5660 [],
5659 _(b'a specific branch you would like to push'),
5661 _(b'a specific branch you would like to push'),
5660 _(b'BRANCH'),
5662 _(b'BRANCH'),
5661 ),
5663 ),
5662 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5664 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5663 (
5665 (
5664 b'',
5666 b'',
5665 b'pushvars',
5667 b'pushvars',
5666 [],
5668 [],
5667 _(b'variables that can be sent to server (ADVANCED)'),
5669 _(b'variables that can be sent to server (ADVANCED)'),
5668 ),
5670 ),
5669 (
5671 (
5670 b'',
5672 b'',
5671 b'publish',
5673 b'publish',
5672 False,
5674 False,
5673 _(b'push the changeset as public (EXPERIMENTAL)'),
5675 _(b'push the changeset as public (EXPERIMENTAL)'),
5674 ),
5676 ),
5675 ]
5677 ]
5676 + remoteopts,
5678 + remoteopts,
5677 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]...'),
5679 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]...'),
5678 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5680 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5679 helpbasic=True,
5681 helpbasic=True,
5680 )
5682 )
5681 def push(ui, repo, *dests, **opts):
5683 def push(ui, repo, *dests, **opts):
5682 """push changes to the specified destination
5684 """push changes to the specified destination
5683
5685
5684 Push changesets from the local repository to the specified
5686 Push changesets from the local repository to the specified
5685 destination.
5687 destination.
5686
5688
5687 This operation is symmetrical to pull: it is identical to a pull
5689 This operation is symmetrical to pull: it is identical to a pull
5688 in the destination repository from the current one.
5690 in the destination repository from the current one.
5689
5691
5690 By default, push will not allow creation of new heads at the
5692 By default, push will not allow creation of new heads at the
5691 destination, since multiple heads would make it unclear which head
5693 destination, since multiple heads would make it unclear which head
5692 to use. In this situation, it is recommended to pull and merge
5694 to use. In this situation, it is recommended to pull and merge
5693 before pushing.
5695 before pushing.
5694
5696
5695 Use --new-branch if you want to allow push to create a new named
5697 Use --new-branch if you want to allow push to create a new named
5696 branch that is not present at the destination. This allows you to
5698 branch that is not present at the destination. This allows you to
5697 only create a new branch without forcing other changes.
5699 only create a new branch without forcing other changes.
5698
5700
5699 .. note::
5701 .. note::
5700
5702
5701 Extra care should be taken with the -f/--force option,
5703 Extra care should be taken with the -f/--force option,
5702 which will push all new heads on all branches, an action which will
5704 which will push all new heads on all branches, an action which will
5703 almost always cause confusion for collaborators.
5705 almost always cause confusion for collaborators.
5704
5706
5705 If -r/--rev is used, the specified revision and all its ancestors
5707 If -r/--rev is used, the specified revision and all its ancestors
5706 will be pushed to the remote repository.
5708 will be pushed to the remote repository.
5707
5709
5708 If -B/--bookmark is used, the specified bookmarked revision, its
5710 If -B/--bookmark is used, the specified bookmarked revision, its
5709 ancestors, and the bookmark will be pushed to the remote
5711 ancestors, and the bookmark will be pushed to the remote
5710 repository. Specifying ``.`` is equivalent to specifying the active
5712 repository. Specifying ``.`` is equivalent to specifying the active
5711 bookmark's name. Use the --all-bookmarks option for pushing all
5713 bookmark's name. Use the --all-bookmarks option for pushing all
5712 current bookmarks.
5714 current bookmarks.
5713
5715
5714 Please see :hg:`help urls` for important details about ``ssh://``
5716 Please see :hg:`help urls` for important details about ``ssh://``
5715 URLs. If DESTINATION is omitted, a default path will be used.
5717 URLs. If DESTINATION is omitted, a default path will be used.
5716
5718
5717 When passed multiple destinations, push will process them one after the
5719 When passed multiple destinations, push will process them one after the
5718 other, but stop should an error occur.
5720 other, but stop should an error occur.
5719
5721
5720 .. container:: verbose
5722 .. container:: verbose
5721
5723
5722 The --pushvars option sends strings to the server that become
5724 The --pushvars option sends strings to the server that become
5723 environment variables prepended with ``HG_USERVAR_``. For example,
5725 environment variables prepended with ``HG_USERVAR_``. For example,
5724 ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with
5726 ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with
5725 ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment.
5727 ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment.
5726
5728
5727 pushvars can provide for user-overridable hooks as well as set debug
5729 pushvars can provide for user-overridable hooks as well as set debug
5728 levels. One example is having a hook that blocks commits containing
5730 levels. One example is having a hook that blocks commits containing
5729 conflict markers, but enables the user to override the hook if the file
5731 conflict markers, but enables the user to override the hook if the file
5730 is using conflict markers for testing purposes or the file format has
5732 is using conflict markers for testing purposes or the file format has
5731 strings that look like conflict markers.
5733 strings that look like conflict markers.
5732
5734
5733 By default, servers will ignore `--pushvars`. To enable it add the
5735 By default, servers will ignore `--pushvars`. To enable it add the
5734 following to your configuration file::
5736 following to your configuration file::
5735
5737
5736 [push]
5738 [push]
5737 pushvars.server = true
5739 pushvars.server = true
5738
5740
5739 Returns 0 if push was successful, 1 if nothing to push.
5741 Returns 0 if push was successful, 1 if nothing to push.
5740 """
5742 """
5741
5743
5742 opts = pycompat.byteskwargs(opts)
5744 opts = pycompat.byteskwargs(opts)
5743
5745
5744 if opts.get(b'all_bookmarks'):
5746 if opts.get(b'all_bookmarks'):
5745 cmdutil.check_incompatible_arguments(
5747 cmdutil.check_incompatible_arguments(
5746 opts,
5748 opts,
5747 b'all_bookmarks',
5749 b'all_bookmarks',
5748 [b'bookmark', b'rev'],
5750 [b'bookmark', b'rev'],
5749 )
5751 )
5750 opts[b'bookmark'] = list(repo._bookmarks)
5752 opts[b'bookmark'] = list(repo._bookmarks)
5751
5753
5752 if opts.get(b'bookmark'):
5754 if opts.get(b'bookmark'):
5753 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5755 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5754 for b in opts[b'bookmark']:
5756 for b in opts[b'bookmark']:
5755 # translate -B options to -r so changesets get pushed
5757 # translate -B options to -r so changesets get pushed
5756 b = repo._bookmarks.expandname(b)
5758 b = repo._bookmarks.expandname(b)
5757 if b in repo._bookmarks:
5759 if b in repo._bookmarks:
5758 opts.setdefault(b'rev', []).append(b)
5760 opts.setdefault(b'rev', []).append(b)
5759 else:
5761 else:
5760 # if we try to push a deleted bookmark, translate it to null
5762 # if we try to push a deleted bookmark, translate it to null
5761 # this lets simultaneous -r, -b options continue working
5763 # this lets simultaneous -r, -b options continue working
5762 opts.setdefault(b'rev', []).append(b"null")
5764 opts.setdefault(b'rev', []).append(b"null")
5763
5765
5764 some_pushed = False
5766 some_pushed = False
5765 result = 0
5767 result = 0
5766 for path in urlutil.get_push_paths(repo, ui, dests):
5768 for path in urlutil.get_push_paths(repo, ui, dests):
5767 dest = path.pushloc or path.loc
5769 dest = path.pushloc or path.loc
5768 branches = (path.branch, opts.get(b'branch') or [])
5770 branches = (path.branch, opts.get(b'branch') or [])
5769 ui.status(_(b'pushing to %s\n') % urlutil.hidepassword(dest))
5771 ui.status(_(b'pushing to %s\n') % urlutil.hidepassword(dest))
5770 revs, checkout = hg.addbranchrevs(
5772 revs, checkout = hg.addbranchrevs(
5771 repo, repo, branches, opts.get(b'rev')
5773 repo, repo, branches, opts.get(b'rev')
5772 )
5774 )
5773 other = hg.peer(repo, opts, dest)
5775 other = hg.peer(repo, opts, dest)
5774
5776
5775 try:
5777 try:
5776 if revs:
5778 if revs:
5777 revs = [repo[r].node() for r in logcmdutil.revrange(repo, revs)]
5779 revs = [repo[r].node() for r in logcmdutil.revrange(repo, revs)]
5778 if not revs:
5780 if not revs:
5779 raise error.InputError(
5781 raise error.InputError(
5780 _(b"specified revisions evaluate to an empty set"),
5782 _(b"specified revisions evaluate to an empty set"),
5781 hint=_(b"use different revision arguments"),
5783 hint=_(b"use different revision arguments"),
5782 )
5784 )
5783 elif path.pushrev:
5785 elif path.pushrev:
5784 # It doesn't make any sense to specify ancestor revisions. So limit
5786 # It doesn't make any sense to specify ancestor revisions. So limit
5785 # to DAG heads to make discovery simpler.
5787 # to DAG heads to make discovery simpler.
5786 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5788 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5787 revs = scmutil.revrange(repo, [expr])
5789 revs = scmutil.revrange(repo, [expr])
5788 revs = [repo[rev].node() for rev in revs]
5790 revs = [repo[rev].node() for rev in revs]
5789 if not revs:
5791 if not revs:
5790 raise error.InputError(
5792 raise error.InputError(
5791 _(
5793 _(
5792 b'default push revset for path evaluates to an empty set'
5794 b'default push revset for path evaluates to an empty set'
5793 )
5795 )
5794 )
5796 )
5795 elif ui.configbool(b'commands', b'push.require-revs'):
5797 elif ui.configbool(b'commands', b'push.require-revs'):
5796 raise error.InputError(
5798 raise error.InputError(
5797 _(b'no revisions specified to push'),
5799 _(b'no revisions specified to push'),
5798 hint=_(b'did you mean "hg push -r ."?'),
5800 hint=_(b'did you mean "hg push -r ."?'),
5799 )
5801 )
5800
5802
5801 repo._subtoppath = dest
5803 repo._subtoppath = dest
5802 try:
5804 try:
5803 # push subrepos depth-first for coherent ordering
5805 # push subrepos depth-first for coherent ordering
5804 c = repo[b'.']
5806 c = repo[b'.']
5805 subs = c.substate # only repos that are committed
5807 subs = c.substate # only repos that are committed
5806 for s in sorted(subs):
5808 for s in sorted(subs):
5807 sub_result = c.sub(s).push(opts)
5809 sub_result = c.sub(s).push(opts)
5808 if sub_result == 0:
5810 if sub_result == 0:
5809 return 1
5811 return 1
5810 finally:
5812 finally:
5811 del repo._subtoppath
5813 del repo._subtoppath
5812
5814
5813 opargs = dict(
5815 opargs = dict(
5814 opts.get(b'opargs', {})
5816 opts.get(b'opargs', {})
5815 ) # copy opargs since we may mutate it
5817 ) # copy opargs since we may mutate it
5816 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5818 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5817
5819
5818 pushop = exchange.push(
5820 pushop = exchange.push(
5819 repo,
5821 repo,
5820 other,
5822 other,
5821 opts.get(b'force'),
5823 opts.get(b'force'),
5822 revs=revs,
5824 revs=revs,
5823 newbranch=opts.get(b'new_branch'),
5825 newbranch=opts.get(b'new_branch'),
5824 bookmarks=opts.get(b'bookmark', ()),
5826 bookmarks=opts.get(b'bookmark', ()),
5825 publish=opts.get(b'publish'),
5827 publish=opts.get(b'publish'),
5826 opargs=opargs,
5828 opargs=opargs,
5827 )
5829 )
5828
5830
5829 if pushop.cgresult == 0:
5831 if pushop.cgresult == 0:
5830 result = 1
5832 result = 1
5831 elif pushop.cgresult is not None:
5833 elif pushop.cgresult is not None:
5832 some_pushed = True
5834 some_pushed = True
5833
5835
5834 if pushop.bkresult is not None:
5836 if pushop.bkresult is not None:
5835 if pushop.bkresult == 2:
5837 if pushop.bkresult == 2:
5836 result = 2
5838 result = 2
5837 elif not result and pushop.bkresult:
5839 elif not result and pushop.bkresult:
5838 result = 2
5840 result = 2
5839
5841
5840 if result:
5842 if result:
5841 break
5843 break
5842
5844
5843 finally:
5845 finally:
5844 other.close()
5846 other.close()
5845 if result == 0 and not some_pushed:
5847 if result == 0 and not some_pushed:
5846 result = 1
5848 result = 1
5847 return result
5849 return result
5848
5850
5849
5851
5850 @command(
5852 @command(
5851 b'recover',
5853 b'recover',
5852 [
5854 [
5853 (b'', b'verify', False, b"run `hg verify` after successful recover"),
5855 (b'', b'verify', False, b"run `hg verify` after successful recover"),
5854 ],
5856 ],
5855 helpcategory=command.CATEGORY_MAINTENANCE,
5857 helpcategory=command.CATEGORY_MAINTENANCE,
5856 )
5858 )
5857 def recover(ui, repo, **opts):
5859 def recover(ui, repo, **opts):
5858 """roll back an interrupted transaction
5860 """roll back an interrupted transaction
5859
5861
5860 Recover from an interrupted commit or pull.
5862 Recover from an interrupted commit or pull.
5861
5863
5862 This command tries to fix the repository status after an
5864 This command tries to fix the repository status after an
5863 interrupted operation. It should only be necessary when Mercurial
5865 interrupted operation. It should only be necessary when Mercurial
5864 suggests it.
5866 suggests it.
5865
5867
5866 Returns 0 if successful, 1 if nothing to recover or verify fails.
5868 Returns 0 if successful, 1 if nothing to recover or verify fails.
5867 """
5869 """
5868 ret = repo.recover()
5870 ret = repo.recover()
5869 if ret:
5871 if ret:
5870 if opts['verify']:
5872 if opts['verify']:
5871 return hg.verify(repo)
5873 return hg.verify(repo)
5872 else:
5874 else:
5873 msg = _(
5875 msg = _(
5874 b"(verify step skipped, run `hg verify` to check your "
5876 b"(verify step skipped, run `hg verify` to check your "
5875 b"repository content)\n"
5877 b"repository content)\n"
5876 )
5878 )
5877 ui.warn(msg)
5879 ui.warn(msg)
5878 return 0
5880 return 0
5879 return 1
5881 return 1
5880
5882
5881
5883
5882 @command(
5884 @command(
5883 b'remove|rm',
5885 b'remove|rm',
5884 [
5886 [
5885 (b'A', b'after', None, _(b'record delete for missing files')),
5887 (b'A', b'after', None, _(b'record delete for missing files')),
5886 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5888 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5887 ]
5889 ]
5888 + subrepoopts
5890 + subrepoopts
5889 + walkopts
5891 + walkopts
5890 + dryrunopts,
5892 + dryrunopts,
5891 _(b'[OPTION]... FILE...'),
5893 _(b'[OPTION]... FILE...'),
5892 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5894 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5893 helpbasic=True,
5895 helpbasic=True,
5894 inferrepo=True,
5896 inferrepo=True,
5895 )
5897 )
5896 def remove(ui, repo, *pats, **opts):
5898 def remove(ui, repo, *pats, **opts):
5897 """remove the specified files on the next commit
5899 """remove the specified files on the next commit
5898
5900
5899 Schedule the indicated files for removal from the current branch.
5901 Schedule the indicated files for removal from the current branch.
5900
5902
5901 This command schedules the files to be removed at the next commit.
5903 This command schedules the files to be removed at the next commit.
5902 To undo a remove before that, see :hg:`revert`. To undo added
5904 To undo a remove before that, see :hg:`revert`. To undo added
5903 files, see :hg:`forget`.
5905 files, see :hg:`forget`.
5904
5906
5905 .. container:: verbose
5907 .. container:: verbose
5906
5908
5907 -A/--after can be used to remove only files that have already
5909 -A/--after can be used to remove only files that have already
5908 been deleted, -f/--force can be used to force deletion, and -Af
5910 been deleted, -f/--force can be used to force deletion, and -Af
5909 can be used to remove files from the next revision without
5911 can be used to remove files from the next revision without
5910 deleting them from the working directory.
5912 deleting them from the working directory.
5911
5913
5912 The following table details the behavior of remove for different
5914 The following table details the behavior of remove for different
5913 file states (columns) and option combinations (rows). The file
5915 file states (columns) and option combinations (rows). The file
5914 states are Added [A], Clean [C], Modified [M] and Missing [!]
5916 states are Added [A], Clean [C], Modified [M] and Missing [!]
5915 (as reported by :hg:`status`). The actions are Warn, Remove
5917 (as reported by :hg:`status`). The actions are Warn, Remove
5916 (from branch) and Delete (from disk):
5918 (from branch) and Delete (from disk):
5917
5919
5918 ========= == == == ==
5920 ========= == == == ==
5919 opt/state A C M !
5921 opt/state A C M !
5920 ========= == == == ==
5922 ========= == == == ==
5921 none W RD W R
5923 none W RD W R
5922 -f R RD RD R
5924 -f R RD RD R
5923 -A W W W R
5925 -A W W W R
5924 -Af R R R R
5926 -Af R R R R
5925 ========= == == == ==
5927 ========= == == == ==
5926
5928
5927 .. note::
5929 .. note::
5928
5930
5929 :hg:`remove` never deletes files in Added [A] state from the
5931 :hg:`remove` never deletes files in Added [A] state from the
5930 working directory, not even if ``--force`` is specified.
5932 working directory, not even if ``--force`` is specified.
5931
5933
5932 Returns 0 on success, 1 if any warnings encountered.
5934 Returns 0 on success, 1 if any warnings encountered.
5933 """
5935 """
5934
5936
5935 opts = pycompat.byteskwargs(opts)
5937 opts = pycompat.byteskwargs(opts)
5936 after, force = opts.get(b'after'), opts.get(b'force')
5938 after, force = opts.get(b'after'), opts.get(b'force')
5937 dryrun = opts.get(b'dry_run')
5939 dryrun = opts.get(b'dry_run')
5938 if not pats and not after:
5940 if not pats and not after:
5939 raise error.InputError(_(b'no files specified'))
5941 raise error.InputError(_(b'no files specified'))
5940
5942
5941 m = scmutil.match(repo[None], pats, opts)
5943 m = scmutil.match(repo[None], pats, opts)
5942 subrepos = opts.get(b'subrepos')
5944 subrepos = opts.get(b'subrepos')
5943 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5945 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5944 return cmdutil.remove(
5946 return cmdutil.remove(
5945 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5947 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5946 )
5948 )
5947
5949
5948
5950
5949 @command(
5951 @command(
5950 b'rename|move|mv',
5952 b'rename|move|mv',
5951 [
5953 [
5952 (b'', b'forget', None, _(b'unmark a destination file as renamed')),
5954 (b'', b'forget', None, _(b'unmark a destination file as renamed')),
5953 (b'A', b'after', None, _(b'record a rename that has already occurred')),
5955 (b'A', b'after', None, _(b'record a rename that has already occurred')),
5954 (
5956 (
5955 b'',
5957 b'',
5956 b'at-rev',
5958 b'at-rev',
5957 b'',
5959 b'',
5958 _(b'(un)mark renames in the given revision (EXPERIMENTAL)'),
5960 _(b'(un)mark renames in the given revision (EXPERIMENTAL)'),
5959 _(b'REV'),
5961 _(b'REV'),
5960 ),
5962 ),
5961 (
5963 (
5962 b'f',
5964 b'f',
5963 b'force',
5965 b'force',
5964 None,
5966 None,
5965 _(b'forcibly move over an existing managed file'),
5967 _(b'forcibly move over an existing managed file'),
5966 ),
5968 ),
5967 ]
5969 ]
5968 + walkopts
5970 + walkopts
5969 + dryrunopts,
5971 + dryrunopts,
5970 _(b'[OPTION]... SOURCE... DEST'),
5972 _(b'[OPTION]... SOURCE... DEST'),
5971 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5973 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5972 )
5974 )
5973 def rename(ui, repo, *pats, **opts):
5975 def rename(ui, repo, *pats, **opts):
5974 """rename files; equivalent of copy + remove
5976 """rename files; equivalent of copy + remove
5975
5977
5976 Mark dest as copies of sources; mark sources for deletion. If dest
5978 Mark dest as copies of sources; mark sources for deletion. If dest
5977 is a directory, copies are put in that directory. If dest is a
5979 is a directory, copies are put in that directory. If dest is a
5978 file, there can only be one source.
5980 file, there can only be one source.
5979
5981
5980 By default, this command copies the contents of files as they
5982 By default, this command copies the contents of files as they
5981 exist in the working directory. If invoked with -A/--after, the
5983 exist in the working directory. If invoked with -A/--after, the
5982 operation is recorded, but no copying is performed.
5984 operation is recorded, but no copying is performed.
5983
5985
5984 To undo marking a destination file as renamed, use --forget. With that
5986 To undo marking a destination file as renamed, use --forget. With that
5985 option, all given (positional) arguments are unmarked as renames. The
5987 option, all given (positional) arguments are unmarked as renames. The
5986 destination file(s) will be left in place (still tracked). The source
5988 destination file(s) will be left in place (still tracked). The source
5987 file(s) will not be restored. Note that :hg:`rename --forget` behaves
5989 file(s) will not be restored. Note that :hg:`rename --forget` behaves
5988 the same way as :hg:`copy --forget`.
5990 the same way as :hg:`copy --forget`.
5989
5991
5990 This command takes effect with the next commit by default.
5992 This command takes effect with the next commit by default.
5991
5993
5992 Returns 0 on success, 1 if errors are encountered.
5994 Returns 0 on success, 1 if errors are encountered.
5993 """
5995 """
5994 opts = pycompat.byteskwargs(opts)
5996 opts = pycompat.byteskwargs(opts)
5995 with repo.wlock():
5997 with repo.wlock():
5996 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5998 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5997
5999
5998
6000
5999 @command(
6001 @command(
6000 b'resolve',
6002 b'resolve',
6001 [
6003 [
6002 (b'a', b'all', None, _(b'select all unresolved files')),
6004 (b'a', b'all', None, _(b'select all unresolved files')),
6003 (b'l', b'list', None, _(b'list state of files needing merge')),
6005 (b'l', b'list', None, _(b'list state of files needing merge')),
6004 (b'm', b'mark', None, _(b'mark files as resolved')),
6006 (b'm', b'mark', None, _(b'mark files as resolved')),
6005 (b'u', b'unmark', None, _(b'mark files as unresolved')),
6007 (b'u', b'unmark', None, _(b'mark files as unresolved')),
6006 (b'n', b'no-status', None, _(b'hide status prefix')),
6008 (b'n', b'no-status', None, _(b'hide status prefix')),
6007 (b'', b're-merge', None, _(b're-merge files')),
6009 (b'', b're-merge', None, _(b're-merge files')),
6008 ]
6010 ]
6009 + mergetoolopts
6011 + mergetoolopts
6010 + walkopts
6012 + walkopts
6011 + formatteropts,
6013 + formatteropts,
6012 _(b'[OPTION]... [FILE]...'),
6014 _(b'[OPTION]... [FILE]...'),
6013 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6015 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6014 inferrepo=True,
6016 inferrepo=True,
6015 )
6017 )
6016 def resolve(ui, repo, *pats, **opts):
6018 def resolve(ui, repo, *pats, **opts):
6017 """redo merges or set/view the merge status of files
6019 """redo merges or set/view the merge status of files
6018
6020
6019 Merges with unresolved conflicts are often the result of
6021 Merges with unresolved conflicts are often the result of
6020 non-interactive merging using the ``internal:merge`` configuration
6022 non-interactive merging using the ``internal:merge`` configuration
6021 setting, or a command-line merge tool like ``diff3``. The resolve
6023 setting, or a command-line merge tool like ``diff3``. The resolve
6022 command is used to manage the files involved in a merge, after
6024 command is used to manage the files involved in a merge, after
6023 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
6025 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
6024 working directory must have two parents). See :hg:`help
6026 working directory must have two parents). See :hg:`help
6025 merge-tools` for information on configuring merge tools.
6027 merge-tools` for information on configuring merge tools.
6026
6028
6027 The resolve command can be used in the following ways:
6029 The resolve command can be used in the following ways:
6028
6030
6029 - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge
6031 - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge
6030 the specified files, discarding any previous merge attempts. Re-merging
6032 the specified files, discarding any previous merge attempts. Re-merging
6031 is not performed for files already marked as resolved. Use ``--all/-a``
6033 is not performed for files already marked as resolved. Use ``--all/-a``
6032 to select all unresolved files. ``--tool`` can be used to specify
6034 to select all unresolved files. ``--tool`` can be used to specify
6033 the merge tool used for the given files. It overrides the HGMERGE
6035 the merge tool used for the given files. It overrides the HGMERGE
6034 environment variable and your configuration files. Previous file
6036 environment variable and your configuration files. Previous file
6035 contents are saved with a ``.orig`` suffix.
6037 contents are saved with a ``.orig`` suffix.
6036
6038
6037 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
6039 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
6038 (e.g. after having manually fixed-up the files). The default is
6040 (e.g. after having manually fixed-up the files). The default is
6039 to mark all unresolved files.
6041 to mark all unresolved files.
6040
6042
6041 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
6043 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
6042 default is to mark all resolved files.
6044 default is to mark all resolved files.
6043
6045
6044 - :hg:`resolve -l`: list files which had or still have conflicts.
6046 - :hg:`resolve -l`: list files which had or still have conflicts.
6045 In the printed list, ``U`` = unresolved and ``R`` = resolved.
6047 In the printed list, ``U`` = unresolved and ``R`` = resolved.
6046 You can use ``set:unresolved()`` or ``set:resolved()`` to filter
6048 You can use ``set:unresolved()`` or ``set:resolved()`` to filter
6047 the list. See :hg:`help filesets` for details.
6049 the list. See :hg:`help filesets` for details.
6048
6050
6049 .. note::
6051 .. note::
6050
6052
6051 Mercurial will not let you commit files with unresolved merge
6053 Mercurial will not let you commit files with unresolved merge
6052 conflicts. You must use :hg:`resolve -m ...` before you can
6054 conflicts. You must use :hg:`resolve -m ...` before you can
6053 commit after a conflicting merge.
6055 commit after a conflicting merge.
6054
6056
6055 .. container:: verbose
6057 .. container:: verbose
6056
6058
6057 Template:
6059 Template:
6058
6060
6059 The following keywords are supported in addition to the common template
6061 The following keywords are supported in addition to the common template
6060 keywords and functions. See also :hg:`help templates`.
6062 keywords and functions. See also :hg:`help templates`.
6061
6063
6062 :mergestatus: String. Character denoting merge conflicts, ``U`` or ``R``.
6064 :mergestatus: String. Character denoting merge conflicts, ``U`` or ``R``.
6063 :path: String. Repository-absolute path of the file.
6065 :path: String. Repository-absolute path of the file.
6064
6066
6065 Returns 0 on success, 1 if any files fail a resolve attempt.
6067 Returns 0 on success, 1 if any files fail a resolve attempt.
6066 """
6068 """
6067
6069
6068 opts = pycompat.byteskwargs(opts)
6070 opts = pycompat.byteskwargs(opts)
6069 confirm = ui.configbool(b'commands', b'resolve.confirm')
6071 confirm = ui.configbool(b'commands', b'resolve.confirm')
6070 flaglist = b'all mark unmark list no_status re_merge'.split()
6072 flaglist = b'all mark unmark list no_status re_merge'.split()
6071 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
6073 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
6072
6074
6073 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
6075 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
6074 if actioncount > 1:
6076 if actioncount > 1:
6075 raise error.InputError(_(b"too many actions specified"))
6077 raise error.InputError(_(b"too many actions specified"))
6076 elif actioncount == 0 and ui.configbool(
6078 elif actioncount == 0 and ui.configbool(
6077 b'commands', b'resolve.explicit-re-merge'
6079 b'commands', b'resolve.explicit-re-merge'
6078 ):
6080 ):
6079 hint = _(b'use --mark, --unmark, --list or --re-merge')
6081 hint = _(b'use --mark, --unmark, --list or --re-merge')
6080 raise error.InputError(_(b'no action specified'), hint=hint)
6082 raise error.InputError(_(b'no action specified'), hint=hint)
6081 if pats and all:
6083 if pats and all:
6082 raise error.InputError(_(b"can't specify --all and patterns"))
6084 raise error.InputError(_(b"can't specify --all and patterns"))
6083 if not (all or pats or show or mark or unmark):
6085 if not (all or pats or show or mark or unmark):
6084 raise error.InputError(
6086 raise error.InputError(
6085 _(b'no files or directories specified'),
6087 _(b'no files or directories specified'),
6086 hint=b'use --all to re-merge all unresolved files',
6088 hint=b'use --all to re-merge all unresolved files',
6087 )
6089 )
6088
6090
6089 if confirm:
6091 if confirm:
6090 if all:
6092 if all:
6091 if ui.promptchoice(
6093 if ui.promptchoice(
6092 _(b're-merge all unresolved files (yn)?$$ &Yes $$ &No')
6094 _(b're-merge all unresolved files (yn)?$$ &Yes $$ &No')
6093 ):
6095 ):
6094 raise error.CanceledError(_(b'user quit'))
6096 raise error.CanceledError(_(b'user quit'))
6095 if mark and not pats:
6097 if mark and not pats:
6096 if ui.promptchoice(
6098 if ui.promptchoice(
6097 _(
6099 _(
6098 b'mark all unresolved files as resolved (yn)?'
6100 b'mark all unresolved files as resolved (yn)?'
6099 b'$$ &Yes $$ &No'
6101 b'$$ &Yes $$ &No'
6100 )
6102 )
6101 ):
6103 ):
6102 raise error.CanceledError(_(b'user quit'))
6104 raise error.CanceledError(_(b'user quit'))
6103 if unmark and not pats:
6105 if unmark and not pats:
6104 if ui.promptchoice(
6106 if ui.promptchoice(
6105 _(
6107 _(
6106 b'mark all resolved files as unresolved (yn)?'
6108 b'mark all resolved files as unresolved (yn)?'
6107 b'$$ &Yes $$ &No'
6109 b'$$ &Yes $$ &No'
6108 )
6110 )
6109 ):
6111 ):
6110 raise error.CanceledError(_(b'user quit'))
6112 raise error.CanceledError(_(b'user quit'))
6111
6113
6112 uipathfn = scmutil.getuipathfn(repo)
6114 uipathfn = scmutil.getuipathfn(repo)
6113
6115
6114 if show:
6116 if show:
6115 ui.pager(b'resolve')
6117 ui.pager(b'resolve')
6116 fm = ui.formatter(b'resolve', opts)
6118 fm = ui.formatter(b'resolve', opts)
6117 ms = mergestatemod.mergestate.read(repo)
6119 ms = mergestatemod.mergestate.read(repo)
6118 wctx = repo[None]
6120 wctx = repo[None]
6119 m = scmutil.match(wctx, pats, opts)
6121 m = scmutil.match(wctx, pats, opts)
6120
6122
6121 # Labels and keys based on merge state. Unresolved path conflicts show
6123 # Labels and keys based on merge state. Unresolved path conflicts show
6122 # as 'P'. Resolved path conflicts show as 'R', the same as normal
6124 # as 'P'. Resolved path conflicts show as 'R', the same as normal
6123 # resolved conflicts.
6125 # resolved conflicts.
6124 mergestateinfo = {
6126 mergestateinfo = {
6125 mergestatemod.MERGE_RECORD_UNRESOLVED: (
6127 mergestatemod.MERGE_RECORD_UNRESOLVED: (
6126 b'resolve.unresolved',
6128 b'resolve.unresolved',
6127 b'U',
6129 b'U',
6128 ),
6130 ),
6129 mergestatemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
6131 mergestatemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
6130 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH: (
6132 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH: (
6131 b'resolve.unresolved',
6133 b'resolve.unresolved',
6132 b'P',
6134 b'P',
6133 ),
6135 ),
6134 mergestatemod.MERGE_RECORD_RESOLVED_PATH: (
6136 mergestatemod.MERGE_RECORD_RESOLVED_PATH: (
6135 b'resolve.resolved',
6137 b'resolve.resolved',
6136 b'R',
6138 b'R',
6137 ),
6139 ),
6138 }
6140 }
6139
6141
6140 for f in ms:
6142 for f in ms:
6141 if not m(f):
6143 if not m(f):
6142 continue
6144 continue
6143
6145
6144 label, key = mergestateinfo[ms[f]]
6146 label, key = mergestateinfo[ms[f]]
6145 fm.startitem()
6147 fm.startitem()
6146 fm.context(ctx=wctx)
6148 fm.context(ctx=wctx)
6147 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
6149 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
6148 fm.data(path=f)
6150 fm.data(path=f)
6149 fm.plain(b'%s\n' % uipathfn(f), label=label)
6151 fm.plain(b'%s\n' % uipathfn(f), label=label)
6150 fm.end()
6152 fm.end()
6151 return 0
6153 return 0
6152
6154
6153 with repo.wlock():
6155 with repo.wlock():
6154 ms = mergestatemod.mergestate.read(repo)
6156 ms = mergestatemod.mergestate.read(repo)
6155
6157
6156 if not (ms.active() or repo.dirstate.p2() != repo.nullid):
6158 if not (ms.active() or repo.dirstate.p2() != repo.nullid):
6157 raise error.StateError(
6159 raise error.StateError(
6158 _(b'resolve command not applicable when not merging')
6160 _(b'resolve command not applicable when not merging')
6159 )
6161 )
6160
6162
6161 wctx = repo[None]
6163 wctx = repo[None]
6162 m = scmutil.match(wctx, pats, opts)
6164 m = scmutil.match(wctx, pats, opts)
6163 ret = 0
6165 ret = 0
6164 didwork = False
6166 didwork = False
6165
6167
6166 hasconflictmarkers = []
6168 hasconflictmarkers = []
6167 if mark:
6169 if mark:
6168 markcheck = ui.config(b'commands', b'resolve.mark-check')
6170 markcheck = ui.config(b'commands', b'resolve.mark-check')
6169 if markcheck not in [b'warn', b'abort']:
6171 if markcheck not in [b'warn', b'abort']:
6170 # Treat all invalid / unrecognized values as 'none'.
6172 # Treat all invalid / unrecognized values as 'none'.
6171 markcheck = False
6173 markcheck = False
6172 for f in ms:
6174 for f in ms:
6173 if not m(f):
6175 if not m(f):
6174 continue
6176 continue
6175
6177
6176 didwork = True
6178 didwork = True
6177
6179
6178 # path conflicts must be resolved manually
6180 # path conflicts must be resolved manually
6179 if ms[f] in (
6181 if ms[f] in (
6180 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH,
6182 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH,
6181 mergestatemod.MERGE_RECORD_RESOLVED_PATH,
6183 mergestatemod.MERGE_RECORD_RESOLVED_PATH,
6182 ):
6184 ):
6183 if mark:
6185 if mark:
6184 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED_PATH)
6186 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED_PATH)
6185 elif unmark:
6187 elif unmark:
6186 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED_PATH)
6188 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED_PATH)
6187 elif ms[f] == mergestatemod.MERGE_RECORD_UNRESOLVED_PATH:
6189 elif ms[f] == mergestatemod.MERGE_RECORD_UNRESOLVED_PATH:
6188 ui.warn(
6190 ui.warn(
6189 _(b'%s: path conflict must be resolved manually\n')
6191 _(b'%s: path conflict must be resolved manually\n')
6190 % uipathfn(f)
6192 % uipathfn(f)
6191 )
6193 )
6192 continue
6194 continue
6193
6195
6194 if mark:
6196 if mark:
6195 if markcheck:
6197 if markcheck:
6196 fdata = repo.wvfs.tryread(f)
6198 fdata = repo.wvfs.tryread(f)
6197 if (
6199 if (
6198 filemerge.hasconflictmarkers(fdata)
6200 filemerge.hasconflictmarkers(fdata)
6199 and ms[f] != mergestatemod.MERGE_RECORD_RESOLVED
6201 and ms[f] != mergestatemod.MERGE_RECORD_RESOLVED
6200 ):
6202 ):
6201 hasconflictmarkers.append(f)
6203 hasconflictmarkers.append(f)
6202 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED)
6204 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED)
6203 elif unmark:
6205 elif unmark:
6204 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED)
6206 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED)
6205 else:
6207 else:
6206 # backup pre-resolve (merge uses .orig for its own purposes)
6208 # backup pre-resolve (merge uses .orig for its own purposes)
6207 a = repo.wjoin(f)
6209 a = repo.wjoin(f)
6208 try:
6210 try:
6209 util.copyfile(a, a + b".resolve")
6211 util.copyfile(a, a + b".resolve")
6210 except FileNotFoundError:
6212 except FileNotFoundError:
6211 pass
6213 pass
6212
6214
6213 try:
6215 try:
6214 # preresolve file
6216 # preresolve file
6215 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
6217 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
6216 with ui.configoverride(overrides, b'resolve'):
6218 with ui.configoverride(overrides, b'resolve'):
6217 r = ms.resolve(f, wctx)
6219 r = ms.resolve(f, wctx)
6218 if r:
6220 if r:
6219 ret = 1
6221 ret = 1
6220 finally:
6222 finally:
6221 ms.commit()
6223 ms.commit()
6222
6224
6223 # replace filemerge's .orig file with our resolve file
6225 # replace filemerge's .orig file with our resolve file
6224 try:
6226 try:
6225 util.rename(
6227 util.rename(
6226 a + b".resolve", scmutil.backuppath(ui, repo, f)
6228 a + b".resolve", scmutil.backuppath(ui, repo, f)
6227 )
6229 )
6228 except FileNotFoundError:
6230 except FileNotFoundError:
6229 pass
6231 pass
6230
6232
6231 if hasconflictmarkers:
6233 if hasconflictmarkers:
6232 ui.warn(
6234 ui.warn(
6233 _(
6235 _(
6234 b'warning: the following files still have conflict '
6236 b'warning: the following files still have conflict '
6235 b'markers:\n'
6237 b'markers:\n'
6236 )
6238 )
6237 + b''.join(
6239 + b''.join(
6238 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6240 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6239 )
6241 )
6240 )
6242 )
6241 if markcheck == b'abort' and not all and not pats:
6243 if markcheck == b'abort' and not all and not pats:
6242 raise error.StateError(
6244 raise error.StateError(
6243 _(b'conflict markers detected'),
6245 _(b'conflict markers detected'),
6244 hint=_(b'use --all to mark anyway'),
6246 hint=_(b'use --all to mark anyway'),
6245 )
6247 )
6246
6248
6247 ms.commit()
6249 ms.commit()
6248 branchmerge = repo.dirstate.p2() != repo.nullid
6250 branchmerge = repo.dirstate.p2() != repo.nullid
6249 # resolve is not doing a parent change here, however, `record updates`
6251 # resolve is not doing a parent change here, however, `record updates`
6250 # will call some dirstate API that at intended for parent changes call.
6252 # will call some dirstate API that at intended for parent changes call.
6251 # Ideally we would not need this and could implement a lighter version
6253 # Ideally we would not need this and could implement a lighter version
6252 # of the recordupdateslogic that will not have to deal with the part
6254 # of the recordupdateslogic that will not have to deal with the part
6253 # related to parent changes. However this would requires that:
6255 # related to parent changes. However this would requires that:
6254 # - we are sure we passed around enough information at update/merge
6256 # - we are sure we passed around enough information at update/merge
6255 # time to no longer needs it at `hg resolve time`
6257 # time to no longer needs it at `hg resolve time`
6256 # - we are sure we store that information well enough to be able to reuse it
6258 # - we are sure we store that information well enough to be able to reuse it
6257 # - we are the necessary logic to reuse it right.
6259 # - we are the necessary logic to reuse it right.
6258 #
6260 #
6259 # All this should eventually happens, but in the mean time, we use this
6261 # All this should eventually happens, but in the mean time, we use this
6260 # context manager slightly out of the context it should be.
6262 # context manager slightly out of the context it should be.
6261 with repo.dirstate.parentchange():
6263 with repo.dirstate.parentchange():
6262 mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None)
6264 mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None)
6263
6265
6264 if not didwork and pats:
6266 if not didwork and pats:
6265 hint = None
6267 hint = None
6266 if not any([p for p in pats if p.find(b':') >= 0]):
6268 if not any([p for p in pats if p.find(b':') >= 0]):
6267 pats = [b'path:%s' % p for p in pats]
6269 pats = [b'path:%s' % p for p in pats]
6268 m = scmutil.match(wctx, pats, opts)
6270 m = scmutil.match(wctx, pats, opts)
6269 for f in ms:
6271 for f in ms:
6270 if not m(f):
6272 if not m(f):
6271 continue
6273 continue
6272
6274
6273 def flag(o):
6275 def flag(o):
6274 if o == b're_merge':
6276 if o == b're_merge':
6275 return b'--re-merge '
6277 return b'--re-merge '
6276 return b'-%s ' % o[0:1]
6278 return b'-%s ' % o[0:1]
6277
6279
6278 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
6280 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
6279 hint = _(b"(try: hg resolve %s%s)\n") % (
6281 hint = _(b"(try: hg resolve %s%s)\n") % (
6280 flags,
6282 flags,
6281 b' '.join(pats),
6283 b' '.join(pats),
6282 )
6284 )
6283 break
6285 break
6284 ui.warn(_(b"arguments do not match paths that need resolving\n"))
6286 ui.warn(_(b"arguments do not match paths that need resolving\n"))
6285 if hint:
6287 if hint:
6286 ui.warn(hint)
6288 ui.warn(hint)
6287
6289
6288 unresolvedf = ms.unresolvedcount()
6290 unresolvedf = ms.unresolvedcount()
6289 if not unresolvedf:
6291 if not unresolvedf:
6290 ui.status(_(b'(no more unresolved files)\n'))
6292 ui.status(_(b'(no more unresolved files)\n'))
6291 cmdutil.checkafterresolved(repo)
6293 cmdutil.checkafterresolved(repo)
6292
6294
6293 return ret
6295 return ret
6294
6296
6295
6297
6296 @command(
6298 @command(
6297 b'revert',
6299 b'revert',
6298 [
6300 [
6299 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6301 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6300 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6302 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6301 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6303 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6302 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6304 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6303 (b'i', b'interactive', None, _(b'interactively select the changes')),
6305 (b'i', b'interactive', None, _(b'interactively select the changes')),
6304 ]
6306 ]
6305 + walkopts
6307 + walkopts
6306 + dryrunopts,
6308 + dryrunopts,
6307 _(b'[OPTION]... [-r REV] [NAME]...'),
6309 _(b'[OPTION]... [-r REV] [NAME]...'),
6308 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6310 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6309 )
6311 )
6310 def revert(ui, repo, *pats, **opts):
6312 def revert(ui, repo, *pats, **opts):
6311 """restore files to their checkout state
6313 """restore files to their checkout state
6312
6314
6313 .. note::
6315 .. note::
6314
6316
6315 To check out earlier revisions, you should use :hg:`update REV`.
6317 To check out earlier revisions, you should use :hg:`update REV`.
6316 To cancel an uncommitted merge (and lose your changes),
6318 To cancel an uncommitted merge (and lose your changes),
6317 use :hg:`merge --abort`.
6319 use :hg:`merge --abort`.
6318
6320
6319 With no revision specified, revert the specified files or directories
6321 With no revision specified, revert the specified files or directories
6320 to the contents they had in the parent of the working directory.
6322 to the contents they had in the parent of the working directory.
6321 This restores the contents of files to an unmodified
6323 This restores the contents of files to an unmodified
6322 state and unschedules adds, removes, copies, and renames. If the
6324 state and unschedules adds, removes, copies, and renames. If the
6323 working directory has two parents, you must explicitly specify a
6325 working directory has two parents, you must explicitly specify a
6324 revision.
6326 revision.
6325
6327
6326 Using the -r/--rev or -d/--date options, revert the given files or
6328 Using the -r/--rev or -d/--date options, revert the given files or
6327 directories to their states as of a specific revision. Because
6329 directories to their states as of a specific revision. Because
6328 revert does not change the working directory parents, this will
6330 revert does not change the working directory parents, this will
6329 cause these files to appear modified. This can be helpful to "back
6331 cause these files to appear modified. This can be helpful to "back
6330 out" some or all of an earlier change. See :hg:`backout` for a
6332 out" some or all of an earlier change. See :hg:`backout` for a
6331 related method.
6333 related method.
6332
6334
6333 Modified files are saved with a .orig suffix before reverting.
6335 Modified files are saved with a .orig suffix before reverting.
6334 To disable these backups, use --no-backup. It is possible to store
6336 To disable these backups, use --no-backup. It is possible to store
6335 the backup files in a custom directory relative to the root of the
6337 the backup files in a custom directory relative to the root of the
6336 repository by setting the ``ui.origbackuppath`` configuration
6338 repository by setting the ``ui.origbackuppath`` configuration
6337 option.
6339 option.
6338
6340
6339 See :hg:`help dates` for a list of formats valid for -d/--date.
6341 See :hg:`help dates` for a list of formats valid for -d/--date.
6340
6342
6341 See :hg:`help backout` for a way to reverse the effect of an
6343 See :hg:`help backout` for a way to reverse the effect of an
6342 earlier changeset.
6344 earlier changeset.
6343
6345
6344 Returns 0 on success.
6346 Returns 0 on success.
6345 """
6347 """
6346
6348
6347 opts = pycompat.byteskwargs(opts)
6349 opts = pycompat.byteskwargs(opts)
6348 if opts.get(b"date"):
6350 if opts.get(b"date"):
6349 cmdutil.check_incompatible_arguments(opts, b'date', [b'rev'])
6351 cmdutil.check_incompatible_arguments(opts, b'date', [b'rev'])
6350 opts[b"rev"] = cmdutil.finddate(ui, repo, opts[b"date"])
6352 opts[b"rev"] = cmdutil.finddate(ui, repo, opts[b"date"])
6351
6353
6352 parent, p2 = repo.dirstate.parents()
6354 parent, p2 = repo.dirstate.parents()
6353 if not opts.get(b'rev') and p2 != repo.nullid:
6355 if not opts.get(b'rev') and p2 != repo.nullid:
6354 # revert after merge is a trap for new users (issue2915)
6356 # revert after merge is a trap for new users (issue2915)
6355 raise error.InputError(
6357 raise error.InputError(
6356 _(b'uncommitted merge with no revision specified'),
6358 _(b'uncommitted merge with no revision specified'),
6357 hint=_(b"use 'hg update' or see 'hg help revert'"),
6359 hint=_(b"use 'hg update' or see 'hg help revert'"),
6358 )
6360 )
6359
6361
6360 rev = opts.get(b'rev')
6362 rev = opts.get(b'rev')
6361 if rev:
6363 if rev:
6362 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6364 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6363 ctx = logcmdutil.revsingle(repo, rev)
6365 ctx = logcmdutil.revsingle(repo, rev)
6364
6366
6365 if not (
6367 if not (
6366 pats
6368 pats
6367 or opts.get(b'include')
6369 or opts.get(b'include')
6368 or opts.get(b'exclude')
6370 or opts.get(b'exclude')
6369 or opts.get(b'all')
6371 or opts.get(b'all')
6370 or opts.get(b'interactive')
6372 or opts.get(b'interactive')
6371 ):
6373 ):
6372 msg = _(b"no files or directories specified")
6374 msg = _(b"no files or directories specified")
6373 if p2 != repo.nullid:
6375 if p2 != repo.nullid:
6374 hint = _(
6376 hint = _(
6375 b"uncommitted merge, use --all to discard all changes,"
6377 b"uncommitted merge, use --all to discard all changes,"
6376 b" or 'hg update -C .' to abort the merge"
6378 b" or 'hg update -C .' to abort the merge"
6377 )
6379 )
6378 raise error.InputError(msg, hint=hint)
6380 raise error.InputError(msg, hint=hint)
6379 dirty = any(repo.status())
6381 dirty = any(repo.status())
6380 node = ctx.node()
6382 node = ctx.node()
6381 if node != parent:
6383 if node != parent:
6382 if dirty:
6384 if dirty:
6383 hint = (
6385 hint = (
6384 _(
6386 _(
6385 b"uncommitted changes, use --all to discard all"
6387 b"uncommitted changes, use --all to discard all"
6386 b" changes, or 'hg update %d' to update"
6388 b" changes, or 'hg update %d' to update"
6387 )
6389 )
6388 % ctx.rev()
6390 % ctx.rev()
6389 )
6391 )
6390 else:
6392 else:
6391 hint = (
6393 hint = (
6392 _(
6394 _(
6393 b"use --all to revert all files,"
6395 b"use --all to revert all files,"
6394 b" or 'hg update %d' to update"
6396 b" or 'hg update %d' to update"
6395 )
6397 )
6396 % ctx.rev()
6398 % ctx.rev()
6397 )
6399 )
6398 elif dirty:
6400 elif dirty:
6399 hint = _(b"uncommitted changes, use --all to discard all changes")
6401 hint = _(b"uncommitted changes, use --all to discard all changes")
6400 else:
6402 else:
6401 hint = _(b"use --all to revert all files")
6403 hint = _(b"use --all to revert all files")
6402 raise error.InputError(msg, hint=hint)
6404 raise error.InputError(msg, hint=hint)
6403
6405
6404 return cmdutil.revert(ui, repo, ctx, *pats, **pycompat.strkwargs(opts))
6406 return cmdutil.revert(ui, repo, ctx, *pats, **pycompat.strkwargs(opts))
6405
6407
6406
6408
6407 @command(
6409 @command(
6408 b'rollback',
6410 b'rollback',
6409 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6411 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6410 helpcategory=command.CATEGORY_MAINTENANCE,
6412 helpcategory=command.CATEGORY_MAINTENANCE,
6411 )
6413 )
6412 def rollback(ui, repo, **opts):
6414 def rollback(ui, repo, **opts):
6413 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6415 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6414
6416
6415 Please use :hg:`commit --amend` instead of rollback to correct
6417 Please use :hg:`commit --amend` instead of rollback to correct
6416 mistakes in the last commit.
6418 mistakes in the last commit.
6417
6419
6418 This command should be used with care. There is only one level of
6420 This command should be used with care. There is only one level of
6419 rollback, and there is no way to undo a rollback. It will also
6421 rollback, and there is no way to undo a rollback. It will also
6420 restore the dirstate at the time of the last transaction, losing
6422 restore the dirstate at the time of the last transaction, losing
6421 any dirstate changes since that time. This command does not alter
6423 any dirstate changes since that time. This command does not alter
6422 the working directory.
6424 the working directory.
6423
6425
6424 Transactions are used to encapsulate the effects of all commands
6426 Transactions are used to encapsulate the effects of all commands
6425 that create new changesets or propagate existing changesets into a
6427 that create new changesets or propagate existing changesets into a
6426 repository.
6428 repository.
6427
6429
6428 .. container:: verbose
6430 .. container:: verbose
6429
6431
6430 For example, the following commands are transactional, and their
6432 For example, the following commands are transactional, and their
6431 effects can be rolled back:
6433 effects can be rolled back:
6432
6434
6433 - commit
6435 - commit
6434 - import
6436 - import
6435 - pull
6437 - pull
6436 - push (with this repository as the destination)
6438 - push (with this repository as the destination)
6437 - unbundle
6439 - unbundle
6438
6440
6439 To avoid permanent data loss, rollback will refuse to rollback a
6441 To avoid permanent data loss, rollback will refuse to rollback a
6440 commit transaction if it isn't checked out. Use --force to
6442 commit transaction if it isn't checked out. Use --force to
6441 override this protection.
6443 override this protection.
6442
6444
6443 The rollback command can be entirely disabled by setting the
6445 The rollback command can be entirely disabled by setting the
6444 ``ui.rollback`` configuration setting to false. If you're here
6446 ``ui.rollback`` configuration setting to false. If you're here
6445 because you want to use rollback and it's disabled, you can
6447 because you want to use rollback and it's disabled, you can
6446 re-enable the command by setting ``ui.rollback`` to true.
6448 re-enable the command by setting ``ui.rollback`` to true.
6447
6449
6448 This command is not intended for use on public repositories. Once
6450 This command is not intended for use on public repositories. Once
6449 changes are visible for pull by other users, rolling a transaction
6451 changes are visible for pull by other users, rolling a transaction
6450 back locally is ineffective (someone else may already have pulled
6452 back locally is ineffective (someone else may already have pulled
6451 the changes). Furthermore, a race is possible with readers of the
6453 the changes). Furthermore, a race is possible with readers of the
6452 repository; for example an in-progress pull from the repository
6454 repository; for example an in-progress pull from the repository
6453 may fail if a rollback is performed.
6455 may fail if a rollback is performed.
6454
6456
6455 Returns 0 on success, 1 if no rollback data is available.
6457 Returns 0 on success, 1 if no rollback data is available.
6456 """
6458 """
6457 if not ui.configbool(b'ui', b'rollback'):
6459 if not ui.configbool(b'ui', b'rollback'):
6458 raise error.Abort(
6460 raise error.Abort(
6459 _(b'rollback is disabled because it is unsafe'),
6461 _(b'rollback is disabled because it is unsafe'),
6460 hint=b'see `hg help -v rollback` for information',
6462 hint=b'see `hg help -v rollback` for information',
6461 )
6463 )
6462 return repo.rollback(dryrun=opts.get('dry_run'), force=opts.get('force'))
6464 return repo.rollback(dryrun=opts.get('dry_run'), force=opts.get('force'))
6463
6465
6464
6466
6465 @command(
6467 @command(
6466 b'root',
6468 b'root',
6467 [] + formatteropts,
6469 [] + formatteropts,
6468 intents={INTENT_READONLY},
6470 intents={INTENT_READONLY},
6469 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6471 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6470 )
6472 )
6471 def root(ui, repo, **opts):
6473 def root(ui, repo, **opts):
6472 """print the root (top) of the current working directory
6474 """print the root (top) of the current working directory
6473
6475
6474 Print the root directory of the current repository.
6476 Print the root directory of the current repository.
6475
6477
6476 .. container:: verbose
6478 .. container:: verbose
6477
6479
6478 Template:
6480 Template:
6479
6481
6480 The following keywords are supported in addition to the common template
6482 The following keywords are supported in addition to the common template
6481 keywords and functions. See also :hg:`help templates`.
6483 keywords and functions. See also :hg:`help templates`.
6482
6484
6483 :hgpath: String. Path to the .hg directory.
6485 :hgpath: String. Path to the .hg directory.
6484 :storepath: String. Path to the directory holding versioned data.
6486 :storepath: String. Path to the directory holding versioned data.
6485
6487
6486 Returns 0 on success.
6488 Returns 0 on success.
6487 """
6489 """
6488 opts = pycompat.byteskwargs(opts)
6490 opts = pycompat.byteskwargs(opts)
6489 with ui.formatter(b'root', opts) as fm:
6491 with ui.formatter(b'root', opts) as fm:
6490 fm.startitem()
6492 fm.startitem()
6491 fm.write(b'reporoot', b'%s\n', repo.root)
6493 fm.write(b'reporoot', b'%s\n', repo.root)
6492 fm.data(hgpath=repo.path, storepath=repo.spath)
6494 fm.data(hgpath=repo.path, storepath=repo.spath)
6493
6495
6494
6496
6495 @command(
6497 @command(
6496 b'serve',
6498 b'serve',
6497 [
6499 [
6498 (
6500 (
6499 b'A',
6501 b'A',
6500 b'accesslog',
6502 b'accesslog',
6501 b'',
6503 b'',
6502 _(b'name of access log file to write to'),
6504 _(b'name of access log file to write to'),
6503 _(b'FILE'),
6505 _(b'FILE'),
6504 ),
6506 ),
6505 (b'd', b'daemon', None, _(b'run server in background')),
6507 (b'd', b'daemon', None, _(b'run server in background')),
6506 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6508 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6507 (
6509 (
6508 b'E',
6510 b'E',
6509 b'errorlog',
6511 b'errorlog',
6510 b'',
6512 b'',
6511 _(b'name of error log file to write to'),
6513 _(b'name of error log file to write to'),
6512 _(b'FILE'),
6514 _(b'FILE'),
6513 ),
6515 ),
6514 # use string type, then we can check if something was passed
6516 # use string type, then we can check if something was passed
6515 (
6517 (
6516 b'p',
6518 b'p',
6517 b'port',
6519 b'port',
6518 b'',
6520 b'',
6519 _(b'port to listen on (default: 8000)'),
6521 _(b'port to listen on (default: 8000)'),
6520 _(b'PORT'),
6522 _(b'PORT'),
6521 ),
6523 ),
6522 (
6524 (
6523 b'a',
6525 b'a',
6524 b'address',
6526 b'address',
6525 b'',
6527 b'',
6526 _(b'address to listen on (default: all interfaces)'),
6528 _(b'address to listen on (default: all interfaces)'),
6527 _(b'ADDR'),
6529 _(b'ADDR'),
6528 ),
6530 ),
6529 (
6531 (
6530 b'',
6532 b'',
6531 b'prefix',
6533 b'prefix',
6532 b'',
6534 b'',
6533 _(b'prefix path to serve from (default: server root)'),
6535 _(b'prefix path to serve from (default: server root)'),
6534 _(b'PREFIX'),
6536 _(b'PREFIX'),
6535 ),
6537 ),
6536 (
6538 (
6537 b'n',
6539 b'n',
6538 b'name',
6540 b'name',
6539 b'',
6541 b'',
6540 _(b'name to show in web pages (default: working directory)'),
6542 _(b'name to show in web pages (default: working directory)'),
6541 _(b'NAME'),
6543 _(b'NAME'),
6542 ),
6544 ),
6543 (
6545 (
6544 b'',
6546 b'',
6545 b'web-conf',
6547 b'web-conf',
6546 b'',
6548 b'',
6547 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6549 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6548 _(b'FILE'),
6550 _(b'FILE'),
6549 ),
6551 ),
6550 (
6552 (
6551 b'',
6553 b'',
6552 b'webdir-conf',
6554 b'webdir-conf',
6553 b'',
6555 b'',
6554 _(b'name of the hgweb config file (DEPRECATED)'),
6556 _(b'name of the hgweb config file (DEPRECATED)'),
6555 _(b'FILE'),
6557 _(b'FILE'),
6556 ),
6558 ),
6557 (
6559 (
6558 b'',
6560 b'',
6559 b'pid-file',
6561 b'pid-file',
6560 b'',
6562 b'',
6561 _(b'name of file to write process ID to'),
6563 _(b'name of file to write process ID to'),
6562 _(b'FILE'),
6564 _(b'FILE'),
6563 ),
6565 ),
6564 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6566 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6565 (
6567 (
6566 b'',
6568 b'',
6567 b'cmdserver',
6569 b'cmdserver',
6568 b'',
6570 b'',
6569 _(b'for remote clients (ADVANCED)'),
6571 _(b'for remote clients (ADVANCED)'),
6570 _(b'MODE'),
6572 _(b'MODE'),
6571 ),
6573 ),
6572 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6574 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6573 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6575 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6574 (b'6', b'ipv6', None, _(b'use IPv6 in addition to IPv4')),
6576 (b'6', b'ipv6', None, _(b'use IPv6 in addition to IPv4')),
6575 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6577 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6576 (b'', b'print-url', None, _(b'start and print only the URL')),
6578 (b'', b'print-url', None, _(b'start and print only the URL')),
6577 ]
6579 ]
6578 + subrepoopts,
6580 + subrepoopts,
6579 _(b'[OPTION]...'),
6581 _(b'[OPTION]...'),
6580 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6582 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6581 helpbasic=True,
6583 helpbasic=True,
6582 optionalrepo=True,
6584 optionalrepo=True,
6583 )
6585 )
6584 def serve(ui, repo, **opts):
6586 def serve(ui, repo, **opts):
6585 """start stand-alone webserver
6587 """start stand-alone webserver
6586
6588
6587 Start a local HTTP repository browser and pull server. You can use
6589 Start a local HTTP repository browser and pull server. You can use
6588 this for ad-hoc sharing and browsing of repositories. It is
6590 this for ad-hoc sharing and browsing of repositories. It is
6589 recommended to use a real web server to serve a repository for
6591 recommended to use a real web server to serve a repository for
6590 longer periods of time.
6592 longer periods of time.
6591
6593
6592 Please note that the server does not implement access control.
6594 Please note that the server does not implement access control.
6593 This means that, by default, anybody can read from the server and
6595 This means that, by default, anybody can read from the server and
6594 nobody can write to it by default. Set the ``web.allow-push``
6596 nobody can write to it by default. Set the ``web.allow-push``
6595 option to ``*`` to allow everybody to push to the server. You
6597 option to ``*`` to allow everybody to push to the server. You
6596 should use a real web server if you need to authenticate users.
6598 should use a real web server if you need to authenticate users.
6597
6599
6598 By default, the server logs accesses to stdout and errors to
6600 By default, the server logs accesses to stdout and errors to
6599 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
6601 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
6600 files.
6602 files.
6601
6603
6602 To have the server choose a free port number to listen on, specify
6604 To have the server choose a free port number to listen on, specify
6603 a port number of 0; in this case, the server will print the port
6605 a port number of 0; in this case, the server will print the port
6604 number it uses.
6606 number it uses.
6605
6607
6606 Returns 0 on success.
6608 Returns 0 on success.
6607 """
6609 """
6608
6610
6609 cmdutil.check_incompatible_arguments(opts, 'stdio', ['cmdserver'])
6611 cmdutil.check_incompatible_arguments(opts, 'stdio', ['cmdserver'])
6610 opts = pycompat.byteskwargs(opts)
6612 opts = pycompat.byteskwargs(opts)
6611 if opts[b"print_url"] and ui.verbose:
6613 if opts[b"print_url"] and ui.verbose:
6612 raise error.InputError(_(b"cannot use --print-url with --verbose"))
6614 raise error.InputError(_(b"cannot use --print-url with --verbose"))
6613
6615
6614 if opts[b"stdio"]:
6616 if opts[b"stdio"]:
6615 if repo is None:
6617 if repo is None:
6616 raise error.RepoError(
6618 raise error.RepoError(
6617 _(b"there is no Mercurial repository here (.hg not found)")
6619 _(b"there is no Mercurial repository here (.hg not found)")
6618 )
6620 )
6619 s = wireprotoserver.sshserver(ui, repo)
6621 s = wireprotoserver.sshserver(ui, repo)
6620 s.serve_forever()
6622 s.serve_forever()
6621 return
6623 return
6622
6624
6623 service = server.createservice(ui, repo, opts)
6625 service = server.createservice(ui, repo, opts)
6624 return server.runservice(opts, initfn=service.init, runfn=service.run)
6626 return server.runservice(opts, initfn=service.init, runfn=service.run)
6625
6627
6626
6628
6627 @command(
6629 @command(
6628 b'shelve',
6630 b'shelve',
6629 [
6631 [
6630 (
6632 (
6631 b'A',
6633 b'A',
6632 b'addremove',
6634 b'addremove',
6633 None,
6635 None,
6634 _(b'mark new/missing files as added/removed before shelving'),
6636 _(b'mark new/missing files as added/removed before shelving'),
6635 ),
6637 ),
6636 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6638 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6637 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6639 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6638 (
6640 (
6639 b'',
6641 b'',
6640 b'date',
6642 b'date',
6641 b'',
6643 b'',
6642 _(b'shelve with the specified commit date'),
6644 _(b'shelve with the specified commit date'),
6643 _(b'DATE'),
6645 _(b'DATE'),
6644 ),
6646 ),
6645 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6647 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6646 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6648 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6647 (
6649 (
6648 b'k',
6650 b'k',
6649 b'keep',
6651 b'keep',
6650 False,
6652 False,
6651 _(b'shelve, but keep changes in the working directory'),
6653 _(b'shelve, but keep changes in the working directory'),
6652 ),
6654 ),
6653 (b'l', b'list', None, _(b'list current shelves')),
6655 (b'l', b'list', None, _(b'list current shelves')),
6654 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6656 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6655 (
6657 (
6656 b'n',
6658 b'n',
6657 b'name',
6659 b'name',
6658 b'',
6660 b'',
6659 _(b'use the given name for the shelved commit'),
6661 _(b'use the given name for the shelved commit'),
6660 _(b'NAME'),
6662 _(b'NAME'),
6661 ),
6663 ),
6662 (
6664 (
6663 b'p',
6665 b'p',
6664 b'patch',
6666 b'patch',
6665 None,
6667 None,
6666 _(
6668 _(
6667 b'output patches for changes (provide the names of the shelved '
6669 b'output patches for changes (provide the names of the shelved '
6668 b'changes as positional arguments)'
6670 b'changes as positional arguments)'
6669 ),
6671 ),
6670 ),
6672 ),
6671 (b'i', b'interactive', None, _(b'interactive mode')),
6673 (b'i', b'interactive', None, _(b'interactive mode')),
6672 (
6674 (
6673 b'',
6675 b'',
6674 b'stat',
6676 b'stat',
6675 None,
6677 None,
6676 _(
6678 _(
6677 b'output diffstat-style summary of changes (provide the names of '
6679 b'output diffstat-style summary of changes (provide the names of '
6678 b'the shelved changes as positional arguments)'
6680 b'the shelved changes as positional arguments)'
6679 ),
6681 ),
6680 ),
6682 ),
6681 ]
6683 ]
6682 + cmdutil.walkopts,
6684 + cmdutil.walkopts,
6683 _(b'hg shelve [OPTION]... [FILE]...'),
6685 _(b'hg shelve [OPTION]... [FILE]...'),
6684 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6686 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6685 )
6687 )
6686 def shelve(ui, repo, *pats, **opts):
6688 def shelve(ui, repo, *pats, **opts):
6687 """save and set aside changes from the working directory
6689 """save and set aside changes from the working directory
6688
6690
6689 Shelving takes files that "hg status" reports as not clean, saves
6691 Shelving takes files that "hg status" reports as not clean, saves
6690 the modifications to a bundle (a shelved change), and reverts the
6692 the modifications to a bundle (a shelved change), and reverts the
6691 files so that their state in the working directory becomes clean.
6693 files so that their state in the working directory becomes clean.
6692
6694
6693 To restore these changes to the working directory, using "hg
6695 To restore these changes to the working directory, using "hg
6694 unshelve"; this will work even if you switch to a different
6696 unshelve"; this will work even if you switch to a different
6695 commit.
6697 commit.
6696
6698
6697 When no files are specified, "hg shelve" saves all not-clean
6699 When no files are specified, "hg shelve" saves all not-clean
6698 files. If specific files or directories are named, only changes to
6700 files. If specific files or directories are named, only changes to
6699 those files are shelved.
6701 those files are shelved.
6700
6702
6701 In bare shelve (when no files are specified, without interactive,
6703 In bare shelve (when no files are specified, without interactive,
6702 include and exclude option), shelving remembers information if the
6704 include and exclude option), shelving remembers information if the
6703 working directory was on newly created branch, in other words working
6705 working directory was on newly created branch, in other words working
6704 directory was on different branch than its first parent. In this
6706 directory was on different branch than its first parent. In this
6705 situation unshelving restores branch information to the working directory.
6707 situation unshelving restores branch information to the working directory.
6706
6708
6707 Each shelved change has a name that makes it easier to find later.
6709 Each shelved change has a name that makes it easier to find later.
6708 The name of a shelved change defaults to being based on the active
6710 The name of a shelved change defaults to being based on the active
6709 bookmark, or if there is no active bookmark, the current named
6711 bookmark, or if there is no active bookmark, the current named
6710 branch. To specify a different name, use ``--name``.
6712 branch. To specify a different name, use ``--name``.
6711
6713
6712 To see a list of existing shelved changes, use the ``--list``
6714 To see a list of existing shelved changes, use the ``--list``
6713 option. For each shelved change, this will print its name, age,
6715 option. For each shelved change, this will print its name, age,
6714 and description; use ``--patch`` or ``--stat`` for more details.
6716 and description; use ``--patch`` or ``--stat`` for more details.
6715
6717
6716 To delete specific shelved changes, use ``--delete``. To delete
6718 To delete specific shelved changes, use ``--delete``. To delete
6717 all shelved changes, use ``--cleanup``.
6719 all shelved changes, use ``--cleanup``.
6718 """
6720 """
6719 opts = pycompat.byteskwargs(opts)
6721 opts = pycompat.byteskwargs(opts)
6720 allowables = [
6722 allowables = [
6721 (b'addremove', {b'create'}), # 'create' is pseudo action
6723 (b'addremove', {b'create'}), # 'create' is pseudo action
6722 (b'unknown', {b'create'}),
6724 (b'unknown', {b'create'}),
6723 (b'cleanup', {b'cleanup'}),
6725 (b'cleanup', {b'cleanup'}),
6724 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6726 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6725 (b'delete', {b'delete'}),
6727 (b'delete', {b'delete'}),
6726 (b'edit', {b'create'}),
6728 (b'edit', {b'create'}),
6727 (b'keep', {b'create'}),
6729 (b'keep', {b'create'}),
6728 (b'list', {b'list'}),
6730 (b'list', {b'list'}),
6729 (b'message', {b'create'}),
6731 (b'message', {b'create'}),
6730 (b'name', {b'create'}),
6732 (b'name', {b'create'}),
6731 (b'patch', {b'patch', b'list'}),
6733 (b'patch', {b'patch', b'list'}),
6732 (b'stat', {b'stat', b'list'}),
6734 (b'stat', {b'stat', b'list'}),
6733 ]
6735 ]
6734
6736
6735 def checkopt(opt):
6737 def checkopt(opt):
6736 if opts.get(opt):
6738 if opts.get(opt):
6737 for i, allowable in allowables:
6739 for i, allowable in allowables:
6738 if opts[i] and opt not in allowable:
6740 if opts[i] and opt not in allowable:
6739 raise error.InputError(
6741 raise error.InputError(
6740 _(
6742 _(
6741 b"options '--%s' and '--%s' may not be "
6743 b"options '--%s' and '--%s' may not be "
6742 b"used together"
6744 b"used together"
6743 )
6745 )
6744 % (opt, i)
6746 % (opt, i)
6745 )
6747 )
6746 return True
6748 return True
6747
6749
6748 if checkopt(b'cleanup'):
6750 if checkopt(b'cleanup'):
6749 if pats:
6751 if pats:
6750 raise error.InputError(
6752 raise error.InputError(
6751 _(b"cannot specify names when using '--cleanup'")
6753 _(b"cannot specify names when using '--cleanup'")
6752 )
6754 )
6753 return shelvemod.cleanupcmd(ui, repo)
6755 return shelvemod.cleanupcmd(ui, repo)
6754 elif checkopt(b'delete'):
6756 elif checkopt(b'delete'):
6755 return shelvemod.deletecmd(ui, repo, pats)
6757 return shelvemod.deletecmd(ui, repo, pats)
6756 elif checkopt(b'list'):
6758 elif checkopt(b'list'):
6757 return shelvemod.listcmd(ui, repo, pats, opts)
6759 return shelvemod.listcmd(ui, repo, pats, opts)
6758 elif checkopt(b'patch') or checkopt(b'stat'):
6760 elif checkopt(b'patch') or checkopt(b'stat'):
6759 return shelvemod.patchcmds(ui, repo, pats, opts)
6761 return shelvemod.patchcmds(ui, repo, pats, opts)
6760 else:
6762 else:
6761 return shelvemod.createcmd(ui, repo, pats, opts)
6763 return shelvemod.createcmd(ui, repo, pats, opts)
6762
6764
6763
6765
6764 _NOTTERSE = b'nothing'
6766 _NOTTERSE = b'nothing'
6765
6767
6766
6768
6767 @command(
6769 @command(
6768 b'status|st',
6770 b'status|st',
6769 [
6771 [
6770 (b'A', b'all', None, _(b'show status of all files')),
6772 (b'A', b'all', None, _(b'show status of all files')),
6771 (b'm', b'modified', None, _(b'show only modified files')),
6773 (b'm', b'modified', None, _(b'show only modified files')),
6772 (b'a', b'added', None, _(b'show only added files')),
6774 (b'a', b'added', None, _(b'show only added files')),
6773 (b'r', b'removed', None, _(b'show only removed files')),
6775 (b'r', b'removed', None, _(b'show only removed files')),
6774 (b'd', b'deleted', None, _(b'show only missing files')),
6776 (b'd', b'deleted', None, _(b'show only missing files')),
6775 (b'c', b'clean', None, _(b'show only files without changes')),
6777 (b'c', b'clean', None, _(b'show only files without changes')),
6776 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6778 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6777 (b'i', b'ignored', None, _(b'show only ignored files')),
6779 (b'i', b'ignored', None, _(b'show only ignored files')),
6778 (b'n', b'no-status', None, _(b'hide status prefix')),
6780 (b'n', b'no-status', None, _(b'hide status prefix')),
6779 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6781 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6780 (
6782 (
6781 b'C',
6783 b'C',
6782 b'copies',
6784 b'copies',
6783 None,
6785 None,
6784 _(b'show source of copied files (DEFAULT: ui.statuscopies)'),
6786 _(b'show source of copied files (DEFAULT: ui.statuscopies)'),
6785 ),
6787 ),
6786 (
6788 (
6787 b'0',
6789 b'0',
6788 b'print0',
6790 b'print0',
6789 None,
6791 None,
6790 _(b'end filenames with NUL, for use with xargs'),
6792 _(b'end filenames with NUL, for use with xargs'),
6791 ),
6793 ),
6792 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6794 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6793 (
6795 (
6794 b'',
6796 b'',
6795 b'change',
6797 b'change',
6796 b'',
6798 b'',
6797 _(b'list the changed files of a revision'),
6799 _(b'list the changed files of a revision'),
6798 _(b'REV'),
6800 _(b'REV'),
6799 ),
6801 ),
6800 ]
6802 ]
6801 + walkopts
6803 + walkopts
6802 + subrepoopts
6804 + subrepoopts
6803 + formatteropts,
6805 + formatteropts,
6804 _(b'[OPTION]... [FILE]...'),
6806 _(b'[OPTION]... [FILE]...'),
6805 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6807 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6806 helpbasic=True,
6808 helpbasic=True,
6807 inferrepo=True,
6809 inferrepo=True,
6808 intents={INTENT_READONLY},
6810 intents={INTENT_READONLY},
6809 )
6811 )
6810 def status(ui, repo, *pats, **opts):
6812 def status(ui, repo, *pats, **opts):
6811 """show changed files in the working directory
6813 """show changed files in the working directory
6812
6814
6813 Show status of files in the repository. If names are given, only
6815 Show status of files in the repository. If names are given, only
6814 files that match are shown. Files that are clean or ignored or
6816 files that match are shown. Files that are clean or ignored or
6815 the source of a copy/move operation, are not listed unless
6817 the source of a copy/move operation, are not listed unless
6816 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
6818 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
6817 Unless options described with "show only ..." are given, the
6819 Unless options described with "show only ..." are given, the
6818 options -mardu are used.
6820 options -mardu are used.
6819
6821
6820 Option -q/--quiet hides untracked (unknown and ignored) files
6822 Option -q/--quiet hides untracked (unknown and ignored) files
6821 unless explicitly requested with -u/--unknown or -i/--ignored.
6823 unless explicitly requested with -u/--unknown or -i/--ignored.
6822
6824
6823 .. note::
6825 .. note::
6824
6826
6825 :hg:`status` may appear to disagree with diff if permissions have
6827 :hg:`status` may appear to disagree with diff if permissions have
6826 changed or a merge has occurred. The standard diff format does
6828 changed or a merge has occurred. The standard diff format does
6827 not report permission changes and diff only reports changes
6829 not report permission changes and diff only reports changes
6828 relative to one merge parent.
6830 relative to one merge parent.
6829
6831
6830 If one revision is given, it is used as the base revision.
6832 If one revision is given, it is used as the base revision.
6831 If two revisions are given, the differences between them are
6833 If two revisions are given, the differences between them are
6832 shown. The --change option can also be used as a shortcut to list
6834 shown. The --change option can also be used as a shortcut to list
6833 the changed files of a revision from its first parent.
6835 the changed files of a revision from its first parent.
6834
6836
6835 The codes used to show the status of files are::
6837 The codes used to show the status of files are::
6836
6838
6837 M = modified
6839 M = modified
6838 A = added
6840 A = added
6839 R = removed
6841 R = removed
6840 C = clean
6842 C = clean
6841 ! = missing (deleted by non-hg command, but still tracked)
6843 ! = missing (deleted by non-hg command, but still tracked)
6842 ? = not tracked
6844 ? = not tracked
6843 I = ignored
6845 I = ignored
6844 = origin of the previous file (with --copies)
6846 = origin of the previous file (with --copies)
6845
6847
6846 .. container:: verbose
6848 .. container:: verbose
6847
6849
6848 The -t/--terse option abbreviates the output by showing only the directory
6850 The -t/--terse option abbreviates the output by showing only the directory
6849 name if all the files in it share the same status. The option takes an
6851 name if all the files in it share the same status. The option takes an
6850 argument indicating the statuses to abbreviate: 'm' for 'modified', 'a'
6852 argument indicating the statuses to abbreviate: 'm' for 'modified', 'a'
6851 for 'added', 'r' for 'removed', 'd' for 'deleted', 'u' for 'unknown', 'i'
6853 for 'added', 'r' for 'removed', 'd' for 'deleted', 'u' for 'unknown', 'i'
6852 for 'ignored' and 'c' for clean.
6854 for 'ignored' and 'c' for clean.
6853
6855
6854 It abbreviates only those statuses which are passed. Note that clean and
6856 It abbreviates only those statuses which are passed. Note that clean and
6855 ignored files are not displayed with '--terse ic' unless the -c/--clean
6857 ignored files are not displayed with '--terse ic' unless the -c/--clean
6856 and -i/--ignored options are also used.
6858 and -i/--ignored options are also used.
6857
6859
6858 The -v/--verbose option shows information when the repository is in an
6860 The -v/--verbose option shows information when the repository is in an
6859 unfinished merge, shelve, rebase state etc. You can have this behavior
6861 unfinished merge, shelve, rebase state etc. You can have this behavior
6860 turned on by default by enabling the ``commands.status.verbose`` option.
6862 turned on by default by enabling the ``commands.status.verbose`` option.
6861
6863
6862 You can skip displaying some of these states by setting
6864 You can skip displaying some of these states by setting
6863 ``commands.status.skipstates`` to one or more of: 'bisect', 'graft',
6865 ``commands.status.skipstates`` to one or more of: 'bisect', 'graft',
6864 'histedit', 'merge', 'rebase', or 'unshelve'.
6866 'histedit', 'merge', 'rebase', or 'unshelve'.
6865
6867
6866 Template:
6868 Template:
6867
6869
6868 The following keywords are supported in addition to the common template
6870 The following keywords are supported in addition to the common template
6869 keywords and functions. See also :hg:`help templates`.
6871 keywords and functions. See also :hg:`help templates`.
6870
6872
6871 :path: String. Repository-absolute path of the file.
6873 :path: String. Repository-absolute path of the file.
6872 :source: String. Repository-absolute path of the file originated from.
6874 :source: String. Repository-absolute path of the file originated from.
6873 Available if ``--copies`` is specified.
6875 Available if ``--copies`` is specified.
6874 :status: String. Character denoting file's status.
6876 :status: String. Character denoting file's status.
6875
6877
6876 Examples:
6878 Examples:
6877
6879
6878 - show changes in the working directory relative to a
6880 - show changes in the working directory relative to a
6879 changeset::
6881 changeset::
6880
6882
6881 hg status --rev 9353
6883 hg status --rev 9353
6882
6884
6883 - show changes in the working directory relative to the
6885 - show changes in the working directory relative to the
6884 current directory (see :hg:`help patterns` for more information)::
6886 current directory (see :hg:`help patterns` for more information)::
6885
6887
6886 hg status re:
6888 hg status re:
6887
6889
6888 - show all changes including copies in an existing changeset::
6890 - show all changes including copies in an existing changeset::
6889
6891
6890 hg status --copies --change 9353
6892 hg status --copies --change 9353
6891
6893
6892 - get a NUL separated list of added files, suitable for xargs::
6894 - get a NUL separated list of added files, suitable for xargs::
6893
6895
6894 hg status -an0
6896 hg status -an0
6895
6897
6896 - show more information about the repository status, abbreviating
6898 - show more information about the repository status, abbreviating
6897 added, removed, modified, deleted, and untracked paths::
6899 added, removed, modified, deleted, and untracked paths::
6898
6900
6899 hg status -v -t mardu
6901 hg status -v -t mardu
6900
6902
6901 Returns 0 on success.
6903 Returns 0 on success.
6902
6904
6903 """
6905 """
6904
6906
6905 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
6907 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
6906 opts = pycompat.byteskwargs(opts)
6908 opts = pycompat.byteskwargs(opts)
6907 revs = opts.get(b'rev', [])
6909 revs = opts.get(b'rev', [])
6908 change = opts.get(b'change', b'')
6910 change = opts.get(b'change', b'')
6909 terse = opts.get(b'terse', _NOTTERSE)
6911 terse = opts.get(b'terse', _NOTTERSE)
6910 if terse is _NOTTERSE:
6912 if terse is _NOTTERSE:
6911 if revs:
6913 if revs:
6912 terse = b''
6914 terse = b''
6913 else:
6915 else:
6914 terse = ui.config(b'commands', b'status.terse')
6916 terse = ui.config(b'commands', b'status.terse')
6915
6917
6916 if revs and terse:
6918 if revs and terse:
6917 msg = _(b'cannot use --terse with --rev')
6919 msg = _(b'cannot use --terse with --rev')
6918 raise error.InputError(msg)
6920 raise error.InputError(msg)
6919 elif change:
6921 elif change:
6920 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6922 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6921 ctx2 = logcmdutil.revsingle(repo, change, None)
6923 ctx2 = logcmdutil.revsingle(repo, change, None)
6922 ctx1 = ctx2.p1()
6924 ctx1 = ctx2.p1()
6923 else:
6925 else:
6924 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
6926 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
6925 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
6927 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
6926
6928
6927 forcerelativevalue = None
6929 forcerelativevalue = None
6928 if ui.hasconfig(b'commands', b'status.relative'):
6930 if ui.hasconfig(b'commands', b'status.relative'):
6929 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
6931 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
6930 uipathfn = scmutil.getuipathfn(
6932 uipathfn = scmutil.getuipathfn(
6931 repo,
6933 repo,
6932 legacyrelativevalue=bool(pats),
6934 legacyrelativevalue=bool(pats),
6933 forcerelativevalue=forcerelativevalue,
6935 forcerelativevalue=forcerelativevalue,
6934 )
6936 )
6935
6937
6936 if opts.get(b'print0'):
6938 if opts.get(b'print0'):
6937 end = b'\0'
6939 end = b'\0'
6938 else:
6940 else:
6939 end = b'\n'
6941 end = b'\n'
6940 states = b'modified added removed deleted unknown ignored clean'.split()
6942 states = b'modified added removed deleted unknown ignored clean'.split()
6941 show = [k for k in states if opts.get(k)]
6943 show = [k for k in states if opts.get(k)]
6942 if opts.get(b'all'):
6944 if opts.get(b'all'):
6943 show += ui.quiet and (states[:4] + [b'clean']) or states
6945 show += ui.quiet and (states[:4] + [b'clean']) or states
6944
6946
6945 if not show:
6947 if not show:
6946 if ui.quiet:
6948 if ui.quiet:
6947 show = states[:4]
6949 show = states[:4]
6948 else:
6950 else:
6949 show = states[:5]
6951 show = states[:5]
6950
6952
6951 m = scmutil.match(ctx2, pats, opts)
6953 m = scmutil.match(ctx2, pats, opts)
6952 if terse:
6954 if terse:
6953 # we need to compute clean and unknown to terse
6955 # we need to compute clean and unknown to terse
6954 stat = repo.status(
6956 stat = repo.status(
6955 ctx1.node(),
6957 ctx1.node(),
6956 ctx2.node(),
6958 ctx2.node(),
6957 m,
6959 m,
6958 b'ignored' in show or b'i' in terse,
6960 b'ignored' in show or b'i' in terse,
6959 clean=True,
6961 clean=True,
6960 unknown=True,
6962 unknown=True,
6961 listsubrepos=opts.get(b'subrepos'),
6963 listsubrepos=opts.get(b'subrepos'),
6962 )
6964 )
6963
6965
6964 stat = cmdutil.tersedir(stat, terse)
6966 stat = cmdutil.tersedir(stat, terse)
6965 else:
6967 else:
6966 stat = repo.status(
6968 stat = repo.status(
6967 ctx1.node(),
6969 ctx1.node(),
6968 ctx2.node(),
6970 ctx2.node(),
6969 m,
6971 m,
6970 b'ignored' in show,
6972 b'ignored' in show,
6971 b'clean' in show,
6973 b'clean' in show,
6972 b'unknown' in show,
6974 b'unknown' in show,
6973 opts.get(b'subrepos'),
6975 opts.get(b'subrepos'),
6974 )
6976 )
6975
6977
6976 changestates = zip(
6978 changestates = zip(
6977 states,
6979 states,
6978 pycompat.iterbytestr(b'MAR!?IC'),
6980 pycompat.iterbytestr(b'MAR!?IC'),
6979 [getattr(stat, s.decode('utf8')) for s in states],
6981 [getattr(stat, s.decode('utf8')) for s in states],
6980 )
6982 )
6981
6983
6982 copy = {}
6984 copy = {}
6983 show_copies = ui.configbool(b'ui', b'statuscopies')
6985 show_copies = ui.configbool(b'ui', b'statuscopies')
6984 if opts.get(b'copies') is not None:
6986 if opts.get(b'copies') is not None:
6985 show_copies = opts.get(b'copies')
6987 show_copies = opts.get(b'copies')
6986 show_copies = (show_copies or opts.get(b'all')) and not opts.get(
6988 show_copies = (show_copies or opts.get(b'all')) and not opts.get(
6987 b'no_status'
6989 b'no_status'
6988 )
6990 )
6989 if show_copies:
6991 if show_copies:
6990 copy = copies.pathcopies(ctx1, ctx2, m)
6992 copy = copies.pathcopies(ctx1, ctx2, m)
6991
6993
6992 morestatus = None
6994 morestatus = None
6993 if (
6995 if (
6994 (ui.verbose or ui.configbool(b'commands', b'status.verbose'))
6996 (ui.verbose or ui.configbool(b'commands', b'status.verbose'))
6995 and not ui.plain()
6997 and not ui.plain()
6996 and not opts.get(b'print0')
6998 and not opts.get(b'print0')
6997 ):
6999 ):
6998 morestatus = cmdutil.readmorestatus(repo)
7000 morestatus = cmdutil.readmorestatus(repo)
6999
7001
7000 ui.pager(b'status')
7002 ui.pager(b'status')
7001 fm = ui.formatter(b'status', opts)
7003 fm = ui.formatter(b'status', opts)
7002 fmt = b'%s' + end
7004 fmt = b'%s' + end
7003 showchar = not opts.get(b'no_status')
7005 showchar = not opts.get(b'no_status')
7004
7006
7005 for state, char, files in changestates:
7007 for state, char, files in changestates:
7006 if state in show:
7008 if state in show:
7007 label = b'status.' + state
7009 label = b'status.' + state
7008 for f in files:
7010 for f in files:
7009 fm.startitem()
7011 fm.startitem()
7010 fm.context(ctx=ctx2)
7012 fm.context(ctx=ctx2)
7011 fm.data(itemtype=b'file', path=f)
7013 fm.data(itemtype=b'file', path=f)
7012 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
7014 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
7013 fm.plain(fmt % uipathfn(f), label=label)
7015 fm.plain(fmt % uipathfn(f), label=label)
7014 if f in copy:
7016 if f in copy:
7015 fm.data(source=copy[f])
7017 fm.data(source=copy[f])
7016 fm.plain(
7018 fm.plain(
7017 (b' %s' + end) % uipathfn(copy[f]),
7019 (b' %s' + end) % uipathfn(copy[f]),
7018 label=b'status.copied',
7020 label=b'status.copied',
7019 )
7021 )
7020 if morestatus:
7022 if morestatus:
7021 morestatus.formatfile(f, fm)
7023 morestatus.formatfile(f, fm)
7022
7024
7023 if morestatus:
7025 if morestatus:
7024 morestatus.formatfooter(fm)
7026 morestatus.formatfooter(fm)
7025 fm.end()
7027 fm.end()
7026
7028
7027
7029
7028 @command(
7030 @command(
7029 b'summary|sum',
7031 b'summary|sum',
7030 [(b'', b'remote', None, _(b'check for push and pull'))],
7032 [(b'', b'remote', None, _(b'check for push and pull'))],
7031 b'[--remote]',
7033 b'[--remote]',
7032 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7034 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7033 helpbasic=True,
7035 helpbasic=True,
7034 intents={INTENT_READONLY},
7036 intents={INTENT_READONLY},
7035 )
7037 )
7036 def summary(ui, repo, **opts):
7038 def summary(ui, repo, **opts):
7037 """summarize working directory state
7039 """summarize working directory state
7038
7040
7039 This generates a brief summary of the working directory state,
7041 This generates a brief summary of the working directory state,
7040 including parents, branch, commit status, phase and available updates.
7042 including parents, branch, commit status, phase and available updates.
7041
7043
7042 With the --remote option, this will check the default paths for
7044 With the --remote option, this will check the default paths for
7043 incoming and outgoing changes. This can be time-consuming.
7045 incoming and outgoing changes. This can be time-consuming.
7044
7046
7045 Returns 0 on success.
7047 Returns 0 on success.
7046 """
7048 """
7047
7049
7048 opts = pycompat.byteskwargs(opts)
7050 opts = pycompat.byteskwargs(opts)
7049 ui.pager(b'summary')
7051 ui.pager(b'summary')
7050 ctx = repo[None]
7052 ctx = repo[None]
7051 parents = ctx.parents()
7053 parents = ctx.parents()
7052 pnode = parents[0].node()
7054 pnode = parents[0].node()
7053 marks = []
7055 marks = []
7054
7056
7055 try:
7057 try:
7056 ms = mergestatemod.mergestate.read(repo)
7058 ms = mergestatemod.mergestate.read(repo)
7057 except error.UnsupportedMergeRecords as e:
7059 except error.UnsupportedMergeRecords as e:
7058 s = b' '.join(e.recordtypes)
7060 s = b' '.join(e.recordtypes)
7059 ui.warn(
7061 ui.warn(
7060 _(b'warning: merge state has unsupported record types: %s\n') % s
7062 _(b'warning: merge state has unsupported record types: %s\n') % s
7061 )
7063 )
7062 unresolved = []
7064 unresolved = []
7063 else:
7065 else:
7064 unresolved = list(ms.unresolved())
7066 unresolved = list(ms.unresolved())
7065
7067
7066 for p in parents:
7068 for p in parents:
7067 # label with log.changeset (instead of log.parent) since this
7069 # label with log.changeset (instead of log.parent) since this
7068 # shows a working directory parent *changeset*:
7070 # shows a working directory parent *changeset*:
7069 # i18n: column positioning for "hg summary"
7071 # i18n: column positioning for "hg summary"
7070 ui.write(
7072 ui.write(
7071 _(b'parent: %d:%s ') % (p.rev(), p),
7073 _(b'parent: %d:%s ') % (p.rev(), p),
7072 label=logcmdutil.changesetlabels(p),
7074 label=logcmdutil.changesetlabels(p),
7073 )
7075 )
7074 ui.write(b' '.join(p.tags()), label=b'log.tag')
7076 ui.write(b' '.join(p.tags()), label=b'log.tag')
7075 if p.bookmarks():
7077 if p.bookmarks():
7076 marks.extend(p.bookmarks())
7078 marks.extend(p.bookmarks())
7077 if p.rev() == -1:
7079 if p.rev() == -1:
7078 if not len(repo):
7080 if not len(repo):
7079 ui.write(_(b' (empty repository)'))
7081 ui.write(_(b' (empty repository)'))
7080 else:
7082 else:
7081 ui.write(_(b' (no revision checked out)'))
7083 ui.write(_(b' (no revision checked out)'))
7082 if p.obsolete():
7084 if p.obsolete():
7083 ui.write(_(b' (obsolete)'))
7085 ui.write(_(b' (obsolete)'))
7084 if p.isunstable():
7086 if p.isunstable():
7085 instabilities = (
7087 instabilities = (
7086 ui.label(instability, b'trouble.%s' % instability)
7088 ui.label(instability, b'trouble.%s' % instability)
7087 for instability in p.instabilities()
7089 for instability in p.instabilities()
7088 )
7090 )
7089 ui.write(b' (' + b', '.join(instabilities) + b')')
7091 ui.write(b' (' + b', '.join(instabilities) + b')')
7090 ui.write(b'\n')
7092 ui.write(b'\n')
7091 if p.description():
7093 if p.description():
7092 ui.status(
7094 ui.status(
7093 b' ' + p.description().splitlines()[0].strip() + b'\n',
7095 b' ' + p.description().splitlines()[0].strip() + b'\n',
7094 label=b'log.summary',
7096 label=b'log.summary',
7095 )
7097 )
7096
7098
7097 branch = ctx.branch()
7099 branch = ctx.branch()
7098 bheads = repo.branchheads(branch)
7100 bheads = repo.branchheads(branch)
7099 # i18n: column positioning for "hg summary"
7101 # i18n: column positioning for "hg summary"
7100 m = _(b'branch: %s\n') % branch
7102 m = _(b'branch: %s\n') % branch
7101 if branch != b'default':
7103 if branch != b'default':
7102 ui.write(m, label=b'log.branch')
7104 ui.write(m, label=b'log.branch')
7103 else:
7105 else:
7104 ui.status(m, label=b'log.branch')
7106 ui.status(m, label=b'log.branch')
7105
7107
7106 if marks:
7108 if marks:
7107 active = repo._activebookmark
7109 active = repo._activebookmark
7108 # i18n: column positioning for "hg summary"
7110 # i18n: column positioning for "hg summary"
7109 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
7111 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
7110 if active is not None:
7112 if active is not None:
7111 if active in marks:
7113 if active in marks:
7112 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
7114 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
7113 marks.remove(active)
7115 marks.remove(active)
7114 else:
7116 else:
7115 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
7117 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
7116 for m in marks:
7118 for m in marks:
7117 ui.write(b' ' + m, label=b'log.bookmark')
7119 ui.write(b' ' + m, label=b'log.bookmark')
7118 ui.write(b'\n', label=b'log.bookmark')
7120 ui.write(b'\n', label=b'log.bookmark')
7119
7121
7120 status = repo.status(unknown=True)
7122 status = repo.status(unknown=True)
7121
7123
7122 c = repo.dirstate.copies()
7124 c = repo.dirstate.copies()
7123 copied, renamed = [], []
7125 copied, renamed = [], []
7124 for d, s in c.items():
7126 for d, s in c.items():
7125 if s in status.removed:
7127 if s in status.removed:
7126 status.removed.remove(s)
7128 status.removed.remove(s)
7127 renamed.append(d)
7129 renamed.append(d)
7128 else:
7130 else:
7129 copied.append(d)
7131 copied.append(d)
7130 if d in status.added:
7132 if d in status.added:
7131 status.added.remove(d)
7133 status.added.remove(d)
7132
7134
7133 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
7135 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
7134
7136
7135 labels = [
7137 labels = [
7136 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
7138 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
7137 (ui.label(_(b'%d added'), b'status.added'), status.added),
7139 (ui.label(_(b'%d added'), b'status.added'), status.added),
7138 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
7140 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
7139 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
7141 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
7140 (ui.label(_(b'%d copied'), b'status.copied'), copied),
7142 (ui.label(_(b'%d copied'), b'status.copied'), copied),
7141 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
7143 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
7142 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
7144 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
7143 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
7145 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
7144 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
7146 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
7145 ]
7147 ]
7146 t = []
7148 t = []
7147 for l, s in labels:
7149 for l, s in labels:
7148 if s:
7150 if s:
7149 t.append(l % len(s))
7151 t.append(l % len(s))
7150
7152
7151 t = b', '.join(t)
7153 t = b', '.join(t)
7152 cleanworkdir = False
7154 cleanworkdir = False
7153
7155
7154 if repo.vfs.exists(b'graftstate'):
7156 if repo.vfs.exists(b'graftstate'):
7155 t += _(b' (graft in progress)')
7157 t += _(b' (graft in progress)')
7156 if repo.vfs.exists(b'updatestate'):
7158 if repo.vfs.exists(b'updatestate'):
7157 t += _(b' (interrupted update)')
7159 t += _(b' (interrupted update)')
7158 elif len(parents) > 1:
7160 elif len(parents) > 1:
7159 t += _(b' (merge)')
7161 t += _(b' (merge)')
7160 elif branch != parents[0].branch():
7162 elif branch != parents[0].branch():
7161 t += _(b' (new branch)')
7163 t += _(b' (new branch)')
7162 elif parents[0].closesbranch() and pnode in repo.branchheads(
7164 elif parents[0].closesbranch() and pnode in repo.branchheads(
7163 branch, closed=True
7165 branch, closed=True
7164 ):
7166 ):
7165 t += _(b' (head closed)')
7167 t += _(b' (head closed)')
7166 elif not (
7168 elif not (
7167 status.modified
7169 status.modified
7168 or status.added
7170 or status.added
7169 or status.removed
7171 or status.removed
7170 or renamed
7172 or renamed
7171 or copied
7173 or copied
7172 or subs
7174 or subs
7173 ):
7175 ):
7174 t += _(b' (clean)')
7176 t += _(b' (clean)')
7175 cleanworkdir = True
7177 cleanworkdir = True
7176 elif pnode not in bheads:
7178 elif pnode not in bheads:
7177 t += _(b' (new branch head)')
7179 t += _(b' (new branch head)')
7178
7180
7179 if parents:
7181 if parents:
7180 pendingphase = max(p.phase() for p in parents)
7182 pendingphase = max(p.phase() for p in parents)
7181 else:
7183 else:
7182 pendingphase = phases.public
7184 pendingphase = phases.public
7183
7185
7184 if pendingphase > phases.newcommitphase(ui):
7186 if pendingphase > phases.newcommitphase(ui):
7185 t += b' (%s)' % phases.phasenames[pendingphase]
7187 t += b' (%s)' % phases.phasenames[pendingphase]
7186
7188
7187 if cleanworkdir:
7189 if cleanworkdir:
7188 # i18n: column positioning for "hg summary"
7190 # i18n: column positioning for "hg summary"
7189 ui.status(_(b'commit: %s\n') % t.strip())
7191 ui.status(_(b'commit: %s\n') % t.strip())
7190 else:
7192 else:
7191 # i18n: column positioning for "hg summary"
7193 # i18n: column positioning for "hg summary"
7192 ui.write(_(b'commit: %s\n') % t.strip())
7194 ui.write(_(b'commit: %s\n') % t.strip())
7193
7195
7194 # all ancestors of branch heads - all ancestors of parent = new csets
7196 # all ancestors of branch heads - all ancestors of parent = new csets
7195 new = len(
7197 new = len(
7196 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
7198 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
7197 )
7199 )
7198
7200
7199 if new == 0:
7201 if new == 0:
7200 # i18n: column positioning for "hg summary"
7202 # i18n: column positioning for "hg summary"
7201 ui.status(_(b'update: (current)\n'))
7203 ui.status(_(b'update: (current)\n'))
7202 elif pnode not in bheads:
7204 elif pnode not in bheads:
7203 # i18n: column positioning for "hg summary"
7205 # i18n: column positioning for "hg summary"
7204 ui.write(_(b'update: %d new changesets (update)\n') % new)
7206 ui.write(_(b'update: %d new changesets (update)\n') % new)
7205 else:
7207 else:
7206 # i18n: column positioning for "hg summary"
7208 # i18n: column positioning for "hg summary"
7207 ui.write(
7209 ui.write(
7208 _(b'update: %d new changesets, %d branch heads (merge)\n')
7210 _(b'update: %d new changesets, %d branch heads (merge)\n')
7209 % (new, len(bheads))
7211 % (new, len(bheads))
7210 )
7212 )
7211
7213
7212 t = []
7214 t = []
7213 draft = len(repo.revs(b'draft()'))
7215 draft = len(repo.revs(b'draft()'))
7214 if draft:
7216 if draft:
7215 t.append(_(b'%d draft') % draft)
7217 t.append(_(b'%d draft') % draft)
7216 secret = len(repo.revs(b'secret()'))
7218 secret = len(repo.revs(b'secret()'))
7217 if secret:
7219 if secret:
7218 t.append(_(b'%d secret') % secret)
7220 t.append(_(b'%d secret') % secret)
7219
7221
7220 if draft or secret:
7222 if draft or secret:
7221 ui.status(_(b'phases: %s\n') % b', '.join(t))
7223 ui.status(_(b'phases: %s\n') % b', '.join(t))
7222
7224
7223 if obsolete.isenabled(repo, obsolete.createmarkersopt):
7225 if obsolete.isenabled(repo, obsolete.createmarkersopt):
7224 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
7226 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
7225 numtrouble = len(repo.revs(trouble + b"()"))
7227 numtrouble = len(repo.revs(trouble + b"()"))
7226 # We write all the possibilities to ease translation
7228 # We write all the possibilities to ease translation
7227 troublemsg = {
7229 troublemsg = {
7228 b"orphan": _(b"orphan: %d changesets"),
7230 b"orphan": _(b"orphan: %d changesets"),
7229 b"contentdivergent": _(b"content-divergent: %d changesets"),
7231 b"contentdivergent": _(b"content-divergent: %d changesets"),
7230 b"phasedivergent": _(b"phase-divergent: %d changesets"),
7232 b"phasedivergent": _(b"phase-divergent: %d changesets"),
7231 }
7233 }
7232 if numtrouble > 0:
7234 if numtrouble > 0:
7233 ui.status(troublemsg[trouble] % numtrouble + b"\n")
7235 ui.status(troublemsg[trouble] % numtrouble + b"\n")
7234
7236
7235 cmdutil.summaryhooks(ui, repo)
7237 cmdutil.summaryhooks(ui, repo)
7236
7238
7237 if opts.get(b'remote'):
7239 if opts.get(b'remote'):
7238 needsincoming, needsoutgoing = True, True
7240 needsincoming, needsoutgoing = True, True
7239 else:
7241 else:
7240 needsincoming, needsoutgoing = False, False
7242 needsincoming, needsoutgoing = False, False
7241 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
7243 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
7242 if i:
7244 if i:
7243 needsincoming = True
7245 needsincoming = True
7244 if o:
7246 if o:
7245 needsoutgoing = True
7247 needsoutgoing = True
7246 if not needsincoming and not needsoutgoing:
7248 if not needsincoming and not needsoutgoing:
7247 return
7249 return
7248
7250
7249 def getincoming():
7251 def getincoming():
7250 # XXX We should actually skip this if no default is specified, instead
7252 # XXX We should actually skip this if no default is specified, instead
7251 # of passing "default" which will resolve as "./default/" if no default
7253 # of passing "default" which will resolve as "./default/" if no default
7252 # path is defined.
7254 # path is defined.
7253 source, branches = urlutil.get_unique_pull_path(
7255 source, branches = urlutil.get_unique_pull_path(
7254 b'summary', repo, ui, b'default'
7256 b'summary', repo, ui, b'default'
7255 )
7257 )
7256 sbranch = branches[0]
7258 sbranch = branches[0]
7257 try:
7259 try:
7258 other = hg.peer(repo, {}, source)
7260 other = hg.peer(repo, {}, source)
7259 except error.RepoError:
7261 except error.RepoError:
7260 if opts.get(b'remote'):
7262 if opts.get(b'remote'):
7261 raise
7263 raise
7262 return source, sbranch, None, None, None
7264 return source, sbranch, None, None, None
7263 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
7265 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
7264 if revs:
7266 if revs:
7265 revs = [other.lookup(rev) for rev in revs]
7267 revs = [other.lookup(rev) for rev in revs]
7266 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(source))
7268 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(source))
7267 with repo.ui.silent():
7269 with repo.ui.silent():
7268 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
7270 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
7269 return source, sbranch, other, commoninc, commoninc[1]
7271 return source, sbranch, other, commoninc, commoninc[1]
7270
7272
7271 if needsincoming:
7273 if needsincoming:
7272 source, sbranch, sother, commoninc, incoming = getincoming()
7274 source, sbranch, sother, commoninc, incoming = getincoming()
7273 else:
7275 else:
7274 source = sbranch = sother = commoninc = incoming = None
7276 source = sbranch = sother = commoninc = incoming = None
7275
7277
7276 def getoutgoing():
7278 def getoutgoing():
7277 # XXX We should actually skip this if no default is specified, instead
7279 # XXX We should actually skip this if no default is specified, instead
7278 # of passing "default" which will resolve as "./default/" if no default
7280 # of passing "default" which will resolve as "./default/" if no default
7279 # path is defined.
7281 # path is defined.
7280 d = None
7282 d = None
7281 if b'default-push' in ui.paths:
7283 if b'default-push' in ui.paths:
7282 d = b'default-push'
7284 d = b'default-push'
7283 elif b'default' in ui.paths:
7285 elif b'default' in ui.paths:
7284 d = b'default'
7286 d = b'default'
7285 if d is not None:
7287 if d is not None:
7286 path = urlutil.get_unique_push_path(b'summary', repo, ui, d)
7288 path = urlutil.get_unique_push_path(b'summary', repo, ui, d)
7287 dest = path.pushloc or path.loc
7289 dest = path.pushloc or path.loc
7288 dbranch = path.branch
7290 dbranch = path.branch
7289 else:
7291 else:
7290 dest = b'default'
7292 dest = b'default'
7291 dbranch = None
7293 dbranch = None
7292 revs, checkout = hg.addbranchrevs(repo, repo, (dbranch, []), None)
7294 revs, checkout = hg.addbranchrevs(repo, repo, (dbranch, []), None)
7293 if source != dest:
7295 if source != dest:
7294 try:
7296 try:
7295 dother = hg.peer(repo, {}, dest)
7297 dother = hg.peer(repo, {}, dest)
7296 except error.RepoError:
7298 except error.RepoError:
7297 if opts.get(b'remote'):
7299 if opts.get(b'remote'):
7298 raise
7300 raise
7299 return dest, dbranch, None, None
7301 return dest, dbranch, None, None
7300 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(dest))
7302 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(dest))
7301 elif sother is None:
7303 elif sother is None:
7302 # there is no explicit destination peer, but source one is invalid
7304 # there is no explicit destination peer, but source one is invalid
7303 return dest, dbranch, None, None
7305 return dest, dbranch, None, None
7304 else:
7306 else:
7305 dother = sother
7307 dother = sother
7306 if source != dest or (sbranch is not None and sbranch != dbranch):
7308 if source != dest or (sbranch is not None and sbranch != dbranch):
7307 common = None
7309 common = None
7308 else:
7310 else:
7309 common = commoninc
7311 common = commoninc
7310 if revs:
7312 if revs:
7311 revs = [repo.lookup(rev) for rev in revs]
7313 revs = [repo.lookup(rev) for rev in revs]
7312 with repo.ui.silent():
7314 with repo.ui.silent():
7313 outgoing = discovery.findcommonoutgoing(
7315 outgoing = discovery.findcommonoutgoing(
7314 repo, dother, onlyheads=revs, commoninc=common
7316 repo, dother, onlyheads=revs, commoninc=common
7315 )
7317 )
7316 return dest, dbranch, dother, outgoing
7318 return dest, dbranch, dother, outgoing
7317
7319
7318 if needsoutgoing:
7320 if needsoutgoing:
7319 dest, dbranch, dother, outgoing = getoutgoing()
7321 dest, dbranch, dother, outgoing = getoutgoing()
7320 else:
7322 else:
7321 dest = dbranch = dother = outgoing = None
7323 dest = dbranch = dother = outgoing = None
7322
7324
7323 if opts.get(b'remote'):
7325 if opts.get(b'remote'):
7324 # Help pytype. --remote sets both `needsincoming` and `needsoutgoing`.
7326 # Help pytype. --remote sets both `needsincoming` and `needsoutgoing`.
7325 # The former always sets `sother` (or raises an exception if it can't);
7327 # The former always sets `sother` (or raises an exception if it can't);
7326 # the latter always sets `outgoing`.
7328 # the latter always sets `outgoing`.
7327 assert sother is not None
7329 assert sother is not None
7328 assert outgoing is not None
7330 assert outgoing is not None
7329
7331
7330 t = []
7332 t = []
7331 if incoming:
7333 if incoming:
7332 t.append(_(b'1 or more incoming'))
7334 t.append(_(b'1 or more incoming'))
7333 o = outgoing.missing
7335 o = outgoing.missing
7334 if o:
7336 if o:
7335 t.append(_(b'%d outgoing') % len(o))
7337 t.append(_(b'%d outgoing') % len(o))
7336 other = dother or sother
7338 other = dother or sother
7337 if b'bookmarks' in other.listkeys(b'namespaces'):
7339 if b'bookmarks' in other.listkeys(b'namespaces'):
7338 counts = bookmarks.summary(repo, other)
7340 counts = bookmarks.summary(repo, other)
7339 if counts[0] > 0:
7341 if counts[0] > 0:
7340 t.append(_(b'%d incoming bookmarks') % counts[0])
7342 t.append(_(b'%d incoming bookmarks') % counts[0])
7341 if counts[1] > 0:
7343 if counts[1] > 0:
7342 t.append(_(b'%d outgoing bookmarks') % counts[1])
7344 t.append(_(b'%d outgoing bookmarks') % counts[1])
7343
7345
7344 if t:
7346 if t:
7345 # i18n: column positioning for "hg summary"
7347 # i18n: column positioning for "hg summary"
7346 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
7348 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
7347 else:
7349 else:
7348 # i18n: column positioning for "hg summary"
7350 # i18n: column positioning for "hg summary"
7349 ui.status(_(b'remote: (synced)\n'))
7351 ui.status(_(b'remote: (synced)\n'))
7350
7352
7351 cmdutil.summaryremotehooks(
7353 cmdutil.summaryremotehooks(
7352 ui,
7354 ui,
7353 repo,
7355 repo,
7354 opts,
7356 opts,
7355 (
7357 (
7356 (source, sbranch, sother, commoninc),
7358 (source, sbranch, sother, commoninc),
7357 (dest, dbranch, dother, outgoing),
7359 (dest, dbranch, dother, outgoing),
7358 ),
7360 ),
7359 )
7361 )
7360
7362
7361
7363
7362 @command(
7364 @command(
7363 b'tag',
7365 b'tag',
7364 [
7366 [
7365 (b'f', b'force', None, _(b'force tag')),
7367 (b'f', b'force', None, _(b'force tag')),
7366 (b'l', b'local', None, _(b'make the tag local')),
7368 (b'l', b'local', None, _(b'make the tag local')),
7367 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7369 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7368 (b'', b'remove', None, _(b'remove a tag')),
7370 (b'', b'remove', None, _(b'remove a tag')),
7369 # -l/--local is already there, commitopts cannot be used
7371 # -l/--local is already there, commitopts cannot be used
7370 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7372 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7371 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7373 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7372 ]
7374 ]
7373 + commitopts2,
7375 + commitopts2,
7374 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7376 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7375 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7377 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7376 )
7378 )
7377 def tag(ui, repo, name1, *names, **opts):
7379 def tag(ui, repo, name1, *names, **opts):
7378 """add one or more tags for the current or given revision
7380 """add one or more tags for the current or given revision
7379
7381
7380 Name a particular revision using <name>.
7382 Name a particular revision using <name>.
7381
7383
7382 Tags are used to name particular revisions of the repository and are
7384 Tags are used to name particular revisions of the repository and are
7383 very useful to compare different revisions, to go back to significant
7385 very useful to compare different revisions, to go back to significant
7384 earlier versions or to mark branch points as releases, etc. Changing
7386 earlier versions or to mark branch points as releases, etc. Changing
7385 an existing tag is normally disallowed; use -f/--force to override.
7387 an existing tag is normally disallowed; use -f/--force to override.
7386
7388
7387 If no revision is given, the parent of the working directory is
7389 If no revision is given, the parent of the working directory is
7388 used.
7390 used.
7389
7391
7390 To facilitate version control, distribution, and merging of tags,
7392 To facilitate version control, distribution, and merging of tags,
7391 they are stored as a file named ".hgtags" which is managed similarly
7393 they are stored as a file named ".hgtags" which is managed similarly
7392 to other project files and can be hand-edited if necessary. This
7394 to other project files and can be hand-edited if necessary. This
7393 also means that tagging creates a new commit. The file
7395 also means that tagging creates a new commit. The file
7394 ".hg/localtags" is used for local tags (not shared among
7396 ".hg/localtags" is used for local tags (not shared among
7395 repositories).
7397 repositories).
7396
7398
7397 Tag commits are usually made at the head of a branch. If the parent
7399 Tag commits are usually made at the head of a branch. If the parent
7398 of the working directory is not a branch head, :hg:`tag` aborts; use
7400 of the working directory is not a branch head, :hg:`tag` aborts; use
7399 -f/--force to force the tag commit to be based on a non-head
7401 -f/--force to force the tag commit to be based on a non-head
7400 changeset.
7402 changeset.
7401
7403
7402 See :hg:`help dates` for a list of formats valid for -d/--date.
7404 See :hg:`help dates` for a list of formats valid for -d/--date.
7403
7405
7404 Since tag names have priority over branch names during revision
7406 Since tag names have priority over branch names during revision
7405 lookup, using an existing branch name as a tag name is discouraged.
7407 lookup, using an existing branch name as a tag name is discouraged.
7406
7408
7407 Returns 0 on success.
7409 Returns 0 on success.
7408 """
7410 """
7409 cmdutil.check_incompatible_arguments(opts, 'remove', ['rev'])
7411 cmdutil.check_incompatible_arguments(opts, 'remove', ['rev'])
7410 opts = pycompat.byteskwargs(opts)
7412 opts = pycompat.byteskwargs(opts)
7411 with repo.wlock(), repo.lock():
7413 with repo.wlock(), repo.lock():
7412 rev_ = b"."
7414 rev_ = b"."
7413 names = [t.strip() for t in (name1,) + names]
7415 names = [t.strip() for t in (name1,) + names]
7414 if len(names) != len(set(names)):
7416 if len(names) != len(set(names)):
7415 raise error.InputError(_(b'tag names must be unique'))
7417 raise error.InputError(_(b'tag names must be unique'))
7416 for n in names:
7418 for n in names:
7417 scmutil.checknewlabel(repo, n, b'tag')
7419 scmutil.checknewlabel(repo, n, b'tag')
7418 if not n:
7420 if not n:
7419 raise error.InputError(
7421 raise error.InputError(
7420 _(b'tag names cannot consist entirely of whitespace')
7422 _(b'tag names cannot consist entirely of whitespace')
7421 )
7423 )
7422 if opts.get(b'rev'):
7424 if opts.get(b'rev'):
7423 rev_ = opts[b'rev']
7425 rev_ = opts[b'rev']
7424 message = opts.get(b'message')
7426 message = opts.get(b'message')
7425 if opts.get(b'remove'):
7427 if opts.get(b'remove'):
7426 if opts.get(b'local'):
7428 if opts.get(b'local'):
7427 expectedtype = b'local'
7429 expectedtype = b'local'
7428 else:
7430 else:
7429 expectedtype = b'global'
7431 expectedtype = b'global'
7430
7432
7431 for n in names:
7433 for n in names:
7432 if repo.tagtype(n) == b'global':
7434 if repo.tagtype(n) == b'global':
7433 alltags = tagsmod.findglobaltags(ui, repo)
7435 alltags = tagsmod.findglobaltags(ui, repo)
7434 if alltags[n][0] == repo.nullid:
7436 if alltags[n][0] == repo.nullid:
7435 raise error.InputError(
7437 raise error.InputError(
7436 _(b"tag '%s' is already removed") % n
7438 _(b"tag '%s' is already removed") % n
7437 )
7439 )
7438 if not repo.tagtype(n):
7440 if not repo.tagtype(n):
7439 raise error.InputError(_(b"tag '%s' does not exist") % n)
7441 raise error.InputError(_(b"tag '%s' does not exist") % n)
7440 if repo.tagtype(n) != expectedtype:
7442 if repo.tagtype(n) != expectedtype:
7441 if expectedtype == b'global':
7443 if expectedtype == b'global':
7442 raise error.InputError(
7444 raise error.InputError(
7443 _(b"tag '%s' is not a global tag") % n
7445 _(b"tag '%s' is not a global tag") % n
7444 )
7446 )
7445 else:
7447 else:
7446 raise error.InputError(
7448 raise error.InputError(
7447 _(b"tag '%s' is not a local tag") % n
7449 _(b"tag '%s' is not a local tag") % n
7448 )
7450 )
7449 rev_ = b'null'
7451 rev_ = b'null'
7450 if not message:
7452 if not message:
7451 # we don't translate commit messages
7453 # we don't translate commit messages
7452 message = b'Removed tag %s' % b', '.join(names)
7454 message = b'Removed tag %s' % b', '.join(names)
7453 elif not opts.get(b'force'):
7455 elif not opts.get(b'force'):
7454 for n in names:
7456 for n in names:
7455 if n in repo.tags():
7457 if n in repo.tags():
7456 raise error.InputError(
7458 raise error.InputError(
7457 _(b"tag '%s' already exists (use -f to force)") % n
7459 _(b"tag '%s' already exists (use -f to force)") % n
7458 )
7460 )
7459 if not opts.get(b'local'):
7461 if not opts.get(b'local'):
7460 p1, p2 = repo.dirstate.parents()
7462 p1, p2 = repo.dirstate.parents()
7461 if p2 != repo.nullid:
7463 if p2 != repo.nullid:
7462 raise error.StateError(_(b'uncommitted merge'))
7464 raise error.StateError(_(b'uncommitted merge'))
7463 bheads = repo.branchheads()
7465 bheads = repo.branchheads()
7464 if not opts.get(b'force') and bheads and p1 not in bheads:
7466 if not opts.get(b'force') and bheads and p1 not in bheads:
7465 raise error.InputError(
7467 raise error.InputError(
7466 _(
7468 _(
7467 b'working directory is not at a branch head '
7469 b'working directory is not at a branch head '
7468 b'(use -f to force)'
7470 b'(use -f to force)'
7469 )
7471 )
7470 )
7472 )
7471 node = logcmdutil.revsingle(repo, rev_).node()
7473 node = logcmdutil.revsingle(repo, rev_).node()
7472
7474
7473 if not message:
7475 if not message:
7474 # we don't translate commit messages
7476 # we don't translate commit messages
7475 message = b'Added tag %s for changeset %s' % (
7477 message = b'Added tag %s for changeset %s' % (
7476 b', '.join(names),
7478 b', '.join(names),
7477 short(node),
7479 short(node),
7478 )
7480 )
7479
7481
7480 date = opts.get(b'date')
7482 date = opts.get(b'date')
7481 if date:
7483 if date:
7482 date = dateutil.parsedate(date)
7484 date = dateutil.parsedate(date)
7483
7485
7484 if opts.get(b'remove'):
7486 if opts.get(b'remove'):
7485 editform = b'tag.remove'
7487 editform = b'tag.remove'
7486 else:
7488 else:
7487 editform = b'tag.add'
7489 editform = b'tag.add'
7488 editor = cmdutil.getcommiteditor(
7490 editor = cmdutil.getcommiteditor(
7489 editform=editform, **pycompat.strkwargs(opts)
7491 editform=editform, **pycompat.strkwargs(opts)
7490 )
7492 )
7491
7493
7492 # don't allow tagging the null rev
7494 # don't allow tagging the null rev
7493 if (
7495 if (
7494 not opts.get(b'remove')
7496 not opts.get(b'remove')
7495 and logcmdutil.revsingle(repo, rev_).rev() == nullrev
7497 and logcmdutil.revsingle(repo, rev_).rev() == nullrev
7496 ):
7498 ):
7497 raise error.InputError(_(b"cannot tag null revision"))
7499 raise error.InputError(_(b"cannot tag null revision"))
7498
7500
7499 tagsmod.tag(
7501 tagsmod.tag(
7500 repo,
7502 repo,
7501 names,
7503 names,
7502 node,
7504 node,
7503 message,
7505 message,
7504 opts.get(b'local'),
7506 opts.get(b'local'),
7505 opts.get(b'user'),
7507 opts.get(b'user'),
7506 date,
7508 date,
7507 editor=editor,
7509 editor=editor,
7508 )
7510 )
7509
7511
7510
7512
7511 @command(
7513 @command(
7512 b'tags',
7514 b'tags',
7513 formatteropts,
7515 formatteropts,
7514 b'',
7516 b'',
7515 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7517 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7516 intents={INTENT_READONLY},
7518 intents={INTENT_READONLY},
7517 )
7519 )
7518 def tags(ui, repo, **opts):
7520 def tags(ui, repo, **opts):
7519 """list repository tags
7521 """list repository tags
7520
7522
7521 This lists both regular and local tags. When the -v/--verbose
7523 This lists both regular and local tags. When the -v/--verbose
7522 switch is used, a third column "local" is printed for local tags.
7524 switch is used, a third column "local" is printed for local tags.
7523 When the -q/--quiet switch is used, only the tag name is printed.
7525 When the -q/--quiet switch is used, only the tag name is printed.
7524
7526
7525 .. container:: verbose
7527 .. container:: verbose
7526
7528
7527 Template:
7529 Template:
7528
7530
7529 The following keywords are supported in addition to the common template
7531 The following keywords are supported in addition to the common template
7530 keywords and functions such as ``{tag}``. See also
7532 keywords and functions such as ``{tag}``. See also
7531 :hg:`help templates`.
7533 :hg:`help templates`.
7532
7534
7533 :type: String. ``local`` for local tags.
7535 :type: String. ``local`` for local tags.
7534
7536
7535 Returns 0 on success.
7537 Returns 0 on success.
7536 """
7538 """
7537
7539
7538 opts = pycompat.byteskwargs(opts)
7540 opts = pycompat.byteskwargs(opts)
7539 ui.pager(b'tags')
7541 ui.pager(b'tags')
7540 fm = ui.formatter(b'tags', opts)
7542 fm = ui.formatter(b'tags', opts)
7541 hexfunc = fm.hexfunc
7543 hexfunc = fm.hexfunc
7542
7544
7543 for t, n in reversed(repo.tagslist()):
7545 for t, n in reversed(repo.tagslist()):
7544 hn = hexfunc(n)
7546 hn = hexfunc(n)
7545 label = b'tags.normal'
7547 label = b'tags.normal'
7546 tagtype = repo.tagtype(t)
7548 tagtype = repo.tagtype(t)
7547 if not tagtype or tagtype == b'global':
7549 if not tagtype or tagtype == b'global':
7548 tagtype = b''
7550 tagtype = b''
7549 else:
7551 else:
7550 label = b'tags.' + tagtype
7552 label = b'tags.' + tagtype
7551
7553
7552 fm.startitem()
7554 fm.startitem()
7553 fm.context(repo=repo)
7555 fm.context(repo=repo)
7554 fm.write(b'tag', b'%s', t, label=label)
7556 fm.write(b'tag', b'%s', t, label=label)
7555 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7557 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7556 fm.condwrite(
7558 fm.condwrite(
7557 not ui.quiet,
7559 not ui.quiet,
7558 b'rev node',
7560 b'rev node',
7559 fmt,
7561 fmt,
7560 repo.changelog.rev(n),
7562 repo.changelog.rev(n),
7561 hn,
7563 hn,
7562 label=label,
7564 label=label,
7563 )
7565 )
7564 fm.condwrite(
7566 fm.condwrite(
7565 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7567 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7566 )
7568 )
7567 fm.plain(b'\n')
7569 fm.plain(b'\n')
7568 fm.end()
7570 fm.end()
7569
7571
7570
7572
7571 @command(
7573 @command(
7572 b'tip',
7574 b'tip',
7573 [
7575 [
7574 (b'p', b'patch', None, _(b'show patch')),
7576 (b'p', b'patch', None, _(b'show patch')),
7575 (b'g', b'git', None, _(b'use git extended diff format')),
7577 (b'g', b'git', None, _(b'use git extended diff format')),
7576 ]
7578 ]
7577 + templateopts,
7579 + templateopts,
7578 _(b'[-p] [-g]'),
7580 _(b'[-p] [-g]'),
7579 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7581 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7580 )
7582 )
7581 def tip(ui, repo, **opts):
7583 def tip(ui, repo, **opts):
7582 """show the tip revision (DEPRECATED)
7584 """show the tip revision (DEPRECATED)
7583
7585
7584 The tip revision (usually just called the tip) is the changeset
7586 The tip revision (usually just called the tip) is the changeset
7585 most recently added to the repository (and therefore the most
7587 most recently added to the repository (and therefore the most
7586 recently changed head).
7588 recently changed head).
7587
7589
7588 If you have just made a commit, that commit will be the tip. If
7590 If you have just made a commit, that commit will be the tip. If
7589 you have just pulled changes from another repository, the tip of
7591 you have just pulled changes from another repository, the tip of
7590 that repository becomes the current tip. The "tip" tag is special
7592 that repository becomes the current tip. The "tip" tag is special
7591 and cannot be renamed or assigned to a different changeset.
7593 and cannot be renamed or assigned to a different changeset.
7592
7594
7593 This command is deprecated, please use :hg:`heads` instead.
7595 This command is deprecated, please use :hg:`heads` instead.
7594
7596
7595 Returns 0 on success.
7597 Returns 0 on success.
7596 """
7598 """
7597 opts = pycompat.byteskwargs(opts)
7599 opts = pycompat.byteskwargs(opts)
7598 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7600 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7599 displayer.show(repo[b'tip'])
7601 displayer.show(repo[b'tip'])
7600 displayer.close()
7602 displayer.close()
7601
7603
7602
7604
7603 @command(
7605 @command(
7604 b'unbundle',
7606 b'unbundle',
7605 [
7607 [
7606 (
7608 (
7607 b'u',
7609 b'u',
7608 b'update',
7610 b'update',
7609 None,
7611 None,
7610 _(b'update to new branch head if changesets were unbundled'),
7612 _(b'update to new branch head if changesets were unbundled'),
7611 )
7613 )
7612 ],
7614 ],
7613 _(b'[-u] FILE...'),
7615 _(b'[-u] FILE...'),
7614 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7616 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7615 )
7617 )
7616 def unbundle(ui, repo, fname1, *fnames, **opts):
7618 def unbundle(ui, repo, fname1, *fnames, **opts):
7617 """apply one or more bundle files
7619 """apply one or more bundle files
7618
7620
7619 Apply one or more bundle files generated by :hg:`bundle`.
7621 Apply one or more bundle files generated by :hg:`bundle`.
7620
7622
7621 Returns 0 on success, 1 if an update has unresolved files.
7623 Returns 0 on success, 1 if an update has unresolved files.
7622 """
7624 """
7623 fnames = (fname1,) + fnames
7625 fnames = (fname1,) + fnames
7624
7626
7625 with repo.lock():
7627 with repo.lock():
7626 for fname in fnames:
7628 for fname in fnames:
7627 f = hg.openpath(ui, fname)
7629 f = hg.openpath(ui, fname)
7628 gen = exchange.readbundle(ui, f, fname)
7630 gen = exchange.readbundle(ui, f, fname)
7629 if isinstance(gen, streamclone.streamcloneapplier):
7631 if isinstance(gen, streamclone.streamcloneapplier):
7630 raise error.InputError(
7632 raise error.InputError(
7631 _(
7633 _(
7632 b'packed bundles cannot be applied with '
7634 b'packed bundles cannot be applied with '
7633 b'"hg unbundle"'
7635 b'"hg unbundle"'
7634 ),
7636 ),
7635 hint=_(b'use "hg debugapplystreamclonebundle"'),
7637 hint=_(b'use "hg debugapplystreamclonebundle"'),
7636 )
7638 )
7637 url = b'bundle:' + fname
7639 url = b'bundle:' + fname
7638 try:
7640 try:
7639 txnname = b'unbundle'
7641 txnname = b'unbundle'
7640 if not isinstance(gen, bundle2.unbundle20):
7642 if not isinstance(gen, bundle2.unbundle20):
7641 txnname = b'unbundle\n%s' % urlutil.hidepassword(url)
7643 txnname = b'unbundle\n%s' % urlutil.hidepassword(url)
7642 with repo.transaction(txnname) as tr:
7644 with repo.transaction(txnname) as tr:
7643 op = bundle2.applybundle(
7645 op = bundle2.applybundle(
7644 repo, gen, tr, source=b'unbundle', url=url
7646 repo, gen, tr, source=b'unbundle', url=url
7645 )
7647 )
7646 except error.BundleUnknownFeatureError as exc:
7648 except error.BundleUnknownFeatureError as exc:
7647 raise error.Abort(
7649 raise error.Abort(
7648 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7650 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7649 hint=_(
7651 hint=_(
7650 b"see https://mercurial-scm.org/"
7652 b"see https://mercurial-scm.org/"
7651 b"wiki/BundleFeature for more "
7653 b"wiki/BundleFeature for more "
7652 b"information"
7654 b"information"
7653 ),
7655 ),
7654 )
7656 )
7655 modheads = bundle2.combinechangegroupresults(op)
7657 modheads = bundle2.combinechangegroupresults(op)
7656
7658
7657 if postincoming(ui, repo, modheads, opts.get('update'), None, None):
7659 if postincoming(ui, repo, modheads, opts.get('update'), None, None):
7658 return 1
7660 return 1
7659 else:
7661 else:
7660 return 0
7662 return 0
7661
7663
7662
7664
7663 @command(
7665 @command(
7664 b'unshelve',
7666 b'unshelve',
7665 [
7667 [
7666 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7668 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7667 (
7669 (
7668 b'c',
7670 b'c',
7669 b'continue',
7671 b'continue',
7670 None,
7672 None,
7671 _(b'continue an incomplete unshelve operation'),
7673 _(b'continue an incomplete unshelve operation'),
7672 ),
7674 ),
7673 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7675 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7674 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7676 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7675 (
7677 (
7676 b'n',
7678 b'n',
7677 b'name',
7679 b'name',
7678 b'',
7680 b'',
7679 _(b'restore shelved change with given name'),
7681 _(b'restore shelved change with given name'),
7680 _(b'NAME'),
7682 _(b'NAME'),
7681 ),
7683 ),
7682 (b't', b'tool', b'', _(b'specify merge tool')),
7684 (b't', b'tool', b'', _(b'specify merge tool')),
7683 (
7685 (
7684 b'',
7686 b'',
7685 b'date',
7687 b'date',
7686 b'',
7688 b'',
7687 _(b'set date for temporary commits (DEPRECATED)'),
7689 _(b'set date for temporary commits (DEPRECATED)'),
7688 _(b'DATE'),
7690 _(b'DATE'),
7689 ),
7691 ),
7690 ],
7692 ],
7691 _(b'hg unshelve [OPTION]... [[-n] SHELVED]'),
7693 _(b'hg unshelve [OPTION]... [[-n] SHELVED]'),
7692 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7694 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7693 )
7695 )
7694 def unshelve(ui, repo, *shelved, **opts):
7696 def unshelve(ui, repo, *shelved, **opts):
7695 """restore a shelved change to the working directory
7697 """restore a shelved change to the working directory
7696
7698
7697 This command accepts an optional name of a shelved change to
7699 This command accepts an optional name of a shelved change to
7698 restore. If none is given, the most recent shelved change is used.
7700 restore. If none is given, the most recent shelved change is used.
7699
7701
7700 If a shelved change is applied successfully, the bundle that
7702 If a shelved change is applied successfully, the bundle that
7701 contains the shelved changes is moved to a backup location
7703 contains the shelved changes is moved to a backup location
7702 (.hg/shelve-backup).
7704 (.hg/shelve-backup).
7703
7705
7704 Since you can restore a shelved change on top of an arbitrary
7706 Since you can restore a shelved change on top of an arbitrary
7705 commit, it is possible that unshelving will result in a conflict
7707 commit, it is possible that unshelving will result in a conflict
7706 between your changes and the commits you are unshelving onto. If
7708 between your changes and the commits you are unshelving onto. If
7707 this occurs, you must resolve the conflict, then use
7709 this occurs, you must resolve the conflict, then use
7708 ``--continue`` to complete the unshelve operation. (The bundle
7710 ``--continue`` to complete the unshelve operation. (The bundle
7709 will not be moved until you successfully complete the unshelve.)
7711 will not be moved until you successfully complete the unshelve.)
7710
7712
7711 (Alternatively, you can use ``--abort`` to abandon an unshelve
7713 (Alternatively, you can use ``--abort`` to abandon an unshelve
7712 that causes a conflict. This reverts the unshelved changes, and
7714 that causes a conflict. This reverts the unshelved changes, and
7713 leaves the bundle in place.)
7715 leaves the bundle in place.)
7714
7716
7715 If bare shelved change (without interactive, include and exclude
7717 If bare shelved change (without interactive, include and exclude
7716 option) was done on newly created branch it would restore branch
7718 option) was done on newly created branch it would restore branch
7717 information to the working directory.
7719 information to the working directory.
7718
7720
7719 After a successful unshelve, the shelved changes are stored in a
7721 After a successful unshelve, the shelved changes are stored in a
7720 backup directory. Only the N most recent backups are kept. N
7722 backup directory. Only the N most recent backups are kept. N
7721 defaults to 10 but can be overridden using the ``shelve.maxbackups``
7723 defaults to 10 but can be overridden using the ``shelve.maxbackups``
7722 configuration option.
7724 configuration option.
7723
7725
7724 .. container:: verbose
7726 .. container:: verbose
7725
7727
7726 Timestamp in seconds is used to decide order of backups. More
7728 Timestamp in seconds is used to decide order of backups. More
7727 than ``maxbackups`` backups are kept, if same timestamp
7729 than ``maxbackups`` backups are kept, if same timestamp
7728 prevents from deciding exact order of them, for safety.
7730 prevents from deciding exact order of them, for safety.
7729
7731
7730 Selected changes can be unshelved with ``--interactive`` flag.
7732 Selected changes can be unshelved with ``--interactive`` flag.
7731 The working directory is updated with the selected changes, and
7733 The working directory is updated with the selected changes, and
7732 only the unselected changes remain shelved.
7734 only the unselected changes remain shelved.
7733 Note: The whole shelve is applied to working directory first before
7735 Note: The whole shelve is applied to working directory first before
7734 running interactively. So, this will bring up all the conflicts between
7736 running interactively. So, this will bring up all the conflicts between
7735 working directory and the shelve, irrespective of which changes will be
7737 working directory and the shelve, irrespective of which changes will be
7736 unshelved.
7738 unshelved.
7737 """
7739 """
7738 with repo.wlock():
7740 with repo.wlock():
7739 return shelvemod.unshelvecmd(ui, repo, *shelved, **opts)
7741 return shelvemod.unshelvecmd(ui, repo, *shelved, **opts)
7740
7742
7741
7743
7742 statemod.addunfinished(
7744 statemod.addunfinished(
7743 b'unshelve',
7745 b'unshelve',
7744 fname=b'shelvedstate',
7746 fname=b'shelvedstate',
7745 continueflag=True,
7747 continueflag=True,
7746 abortfunc=shelvemod.hgabortunshelve,
7748 abortfunc=shelvemod.hgabortunshelve,
7747 continuefunc=shelvemod.hgcontinueunshelve,
7749 continuefunc=shelvemod.hgcontinueunshelve,
7748 cmdmsg=_(b'unshelve already in progress'),
7750 cmdmsg=_(b'unshelve already in progress'),
7749 )
7751 )
7750
7752
7751
7753
7752 @command(
7754 @command(
7753 b'update|up|checkout|co',
7755 b'update|up|checkout|co',
7754 [
7756 [
7755 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7757 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7756 (b'c', b'check', None, _(b'require clean working directory')),
7758 (b'c', b'check', None, _(b'require clean working directory')),
7757 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7759 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7758 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7760 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7759 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7761 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7760 ]
7762 ]
7761 + mergetoolopts,
7763 + mergetoolopts,
7762 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7764 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7763 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7765 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7764 helpbasic=True,
7766 helpbasic=True,
7765 )
7767 )
7766 def update(ui, repo, node=None, **opts):
7768 def update(ui, repo, node=None, **opts):
7767 """update working directory (or switch revisions)
7769 """update working directory (or switch revisions)
7768
7770
7769 Update the repository's working directory to the specified
7771 Update the repository's working directory to the specified
7770 changeset. If no changeset is specified, update to the tip of the
7772 changeset. If no changeset is specified, update to the tip of the
7771 current named branch and move the active bookmark (see :hg:`help
7773 current named branch and move the active bookmark (see :hg:`help
7772 bookmarks`).
7774 bookmarks`).
7773
7775
7774 Update sets the working directory's parent revision to the specified
7776 Update sets the working directory's parent revision to the specified
7775 changeset (see :hg:`help parents`).
7777 changeset (see :hg:`help parents`).
7776
7778
7777 If the changeset is not a descendant or ancestor of the working
7779 If the changeset is not a descendant or ancestor of the working
7778 directory's parent and there are uncommitted changes, the update is
7780 directory's parent and there are uncommitted changes, the update is
7779 aborted. With the -c/--check option, the working directory is checked
7781 aborted. With the -c/--check option, the working directory is checked
7780 for uncommitted changes; if none are found, the working directory is
7782 for uncommitted changes; if none are found, the working directory is
7781 updated to the specified changeset.
7783 updated to the specified changeset.
7782
7784
7783 .. container:: verbose
7785 .. container:: verbose
7784
7786
7785 The -C/--clean, -c/--check, and -m/--merge options control what
7787 The -C/--clean, -c/--check, and -m/--merge options control what
7786 happens if the working directory contains uncommitted changes.
7788 happens if the working directory contains uncommitted changes.
7787 At most of one of them can be specified.
7789 At most of one of them can be specified.
7788
7790
7789 1. If no option is specified, and if
7791 1. If no option is specified, and if
7790 the requested changeset is an ancestor or descendant of
7792 the requested changeset is an ancestor or descendant of
7791 the working directory's parent, the uncommitted changes
7793 the working directory's parent, the uncommitted changes
7792 are merged into the requested changeset and the merged
7794 are merged into the requested changeset and the merged
7793 result is left uncommitted. If the requested changeset is
7795 result is left uncommitted. If the requested changeset is
7794 not an ancestor or descendant (that is, it is on another
7796 not an ancestor or descendant (that is, it is on another
7795 branch), the update is aborted and the uncommitted changes
7797 branch), the update is aborted and the uncommitted changes
7796 are preserved.
7798 are preserved.
7797
7799
7798 2. With the -m/--merge option, the update is allowed even if the
7800 2. With the -m/--merge option, the update is allowed even if the
7799 requested changeset is not an ancestor or descendant of
7801 requested changeset is not an ancestor or descendant of
7800 the working directory's parent.
7802 the working directory's parent.
7801
7803
7802 3. With the -c/--check option, the update is aborted and the
7804 3. With the -c/--check option, the update is aborted and the
7803 uncommitted changes are preserved.
7805 uncommitted changes are preserved.
7804
7806
7805 4. With the -C/--clean option, uncommitted changes are discarded and
7807 4. With the -C/--clean option, uncommitted changes are discarded and
7806 the working directory is updated to the requested changeset.
7808 the working directory is updated to the requested changeset.
7807
7809
7808 To cancel an uncommitted merge (and lose your changes), use
7810 To cancel an uncommitted merge (and lose your changes), use
7809 :hg:`merge --abort`.
7811 :hg:`merge --abort`.
7810
7812
7811 Use null as the changeset to remove the working directory (like
7813 Use null as the changeset to remove the working directory (like
7812 :hg:`clone -U`).
7814 :hg:`clone -U`).
7813
7815
7814 If you want to revert just one file to an older revision, use
7816 If you want to revert just one file to an older revision, use
7815 :hg:`revert [-r REV] NAME`.
7817 :hg:`revert [-r REV] NAME`.
7816
7818
7817 See :hg:`help dates` for a list of formats valid for -d/--date.
7819 See :hg:`help dates` for a list of formats valid for -d/--date.
7818
7820
7819 Returns 0 on success, 1 if there are unresolved files.
7821 Returns 0 on success, 1 if there are unresolved files.
7820 """
7822 """
7821 cmdutil.check_at_most_one_arg(opts, 'clean', 'check', 'merge')
7823 cmdutil.check_at_most_one_arg(opts, 'clean', 'check', 'merge')
7822 rev = opts.get('rev')
7824 rev = opts.get('rev')
7823 date = opts.get('date')
7825 date = opts.get('date')
7824 clean = opts.get('clean')
7826 clean = opts.get('clean')
7825 check = opts.get('check')
7827 check = opts.get('check')
7826 merge = opts.get('merge')
7828 merge = opts.get('merge')
7827 if rev and node:
7829 if rev and node:
7828 raise error.InputError(_(b"please specify just one revision"))
7830 raise error.InputError(_(b"please specify just one revision"))
7829
7831
7830 if ui.configbool(b'commands', b'update.requiredest'):
7832 if ui.configbool(b'commands', b'update.requiredest'):
7831 if not node and not rev and not date:
7833 if not node and not rev and not date:
7832 raise error.InputError(
7834 raise error.InputError(
7833 _(b'you must specify a destination'),
7835 _(b'you must specify a destination'),
7834 hint=_(b'for example: hg update ".::"'),
7836 hint=_(b'for example: hg update ".::"'),
7835 )
7837 )
7836
7838
7837 if rev is None or rev == b'':
7839 if rev is None or rev == b'':
7838 rev = node
7840 rev = node
7839
7841
7840 if date and rev is not None:
7842 if date and rev is not None:
7841 raise error.InputError(_(b"you can't specify a revision and a date"))
7843 raise error.InputError(_(b"you can't specify a revision and a date"))
7842
7844
7843 updatecheck = None
7845 updatecheck = None
7844 if check or merge is not None and not merge:
7846 if check or merge is not None and not merge:
7845 updatecheck = b'abort'
7847 updatecheck = b'abort'
7846 elif merge or check is not None and not check:
7848 elif merge or check is not None and not check:
7847 updatecheck = b'none'
7849 updatecheck = b'none'
7848
7850
7849 with repo.wlock():
7851 with repo.wlock():
7850 cmdutil.clearunfinished(repo)
7852 cmdutil.clearunfinished(repo)
7851 if date:
7853 if date:
7852 rev = cmdutil.finddate(ui, repo, date)
7854 rev = cmdutil.finddate(ui, repo, date)
7853
7855
7854 # if we defined a bookmark, we have to remember the original name
7856 # if we defined a bookmark, we have to remember the original name
7855 brev = rev
7857 brev = rev
7856 if rev:
7858 if rev:
7857 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7859 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7858 ctx = logcmdutil.revsingle(repo, rev, default=None)
7860 ctx = logcmdutil.revsingle(repo, rev, default=None)
7859 rev = ctx.rev()
7861 rev = ctx.rev()
7860 hidden = ctx.hidden()
7862 hidden = ctx.hidden()
7861 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
7863 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
7862 with ui.configoverride(overrides, b'update'):
7864 with ui.configoverride(overrides, b'update'):
7863 ret = hg.updatetotally(
7865 ret = hg.updatetotally(
7864 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7866 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7865 )
7867 )
7866 if hidden:
7868 if hidden:
7867 ctxstr = ctx.hex()[:12]
7869 ctxstr = ctx.hex()[:12]
7868 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7870 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7869
7871
7870 if ctx.obsolete():
7872 if ctx.obsolete():
7871 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7873 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7872 ui.warn(b"(%s)\n" % obsfatemsg)
7874 ui.warn(b"(%s)\n" % obsfatemsg)
7873 return ret
7875 return ret
7874
7876
7875
7877
7876 @command(
7878 @command(
7877 b'verify',
7879 b'verify',
7878 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7880 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7879 helpcategory=command.CATEGORY_MAINTENANCE,
7881 helpcategory=command.CATEGORY_MAINTENANCE,
7880 )
7882 )
7881 def verify(ui, repo, **opts):
7883 def verify(ui, repo, **opts):
7882 """verify the integrity of the repository
7884 """verify the integrity of the repository
7883
7885
7884 Verify the integrity of the current repository.
7886 Verify the integrity of the current repository.
7885
7887
7886 This will perform an extensive check of the repository's
7888 This will perform an extensive check of the repository's
7887 integrity, validating the hashes and checksums of each entry in
7889 integrity, validating the hashes and checksums of each entry in
7888 the changelog, manifest, and tracked files, as well as the
7890 the changelog, manifest, and tracked files, as well as the
7889 integrity of their crosslinks and indices.
7891 integrity of their crosslinks and indices.
7890
7892
7891 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
7893 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
7892 for more information about recovery from corruption of the
7894 for more information about recovery from corruption of the
7893 repository.
7895 repository.
7894
7896
7895 Returns 0 on success, 1 if errors are encountered.
7897 Returns 0 on success, 1 if errors are encountered.
7896 """
7898 """
7897 opts = pycompat.byteskwargs(opts)
7899 opts = pycompat.byteskwargs(opts)
7898
7900
7899 level = None
7901 level = None
7900 if opts[b'full']:
7902 if opts[b'full']:
7901 level = verifymod.VERIFY_FULL
7903 level = verifymod.VERIFY_FULL
7902 return hg.verify(repo, level)
7904 return hg.verify(repo, level)
7903
7905
7904
7906
7905 @command(
7907 @command(
7906 b'version',
7908 b'version',
7907 [] + formatteropts,
7909 [] + formatteropts,
7908 helpcategory=command.CATEGORY_HELP,
7910 helpcategory=command.CATEGORY_HELP,
7909 norepo=True,
7911 norepo=True,
7910 intents={INTENT_READONLY},
7912 intents={INTENT_READONLY},
7911 )
7913 )
7912 def version_(ui, **opts):
7914 def version_(ui, **opts):
7913 """output version and copyright information
7915 """output version and copyright information
7914
7916
7915 .. container:: verbose
7917 .. container:: verbose
7916
7918
7917 Template:
7919 Template:
7918
7920
7919 The following keywords are supported. See also :hg:`help templates`.
7921 The following keywords are supported. See also :hg:`help templates`.
7920
7922
7921 :extensions: List of extensions.
7923 :extensions: List of extensions.
7922 :ver: String. Version number.
7924 :ver: String. Version number.
7923
7925
7924 And each entry of ``{extensions}`` provides the following sub-keywords
7926 And each entry of ``{extensions}`` provides the following sub-keywords
7925 in addition to ``{ver}``.
7927 in addition to ``{ver}``.
7926
7928
7927 :bundled: Boolean. True if included in the release.
7929 :bundled: Boolean. True if included in the release.
7928 :name: String. Extension name.
7930 :name: String. Extension name.
7929 """
7931 """
7930 opts = pycompat.byteskwargs(opts)
7932 opts = pycompat.byteskwargs(opts)
7931 if ui.verbose:
7933 if ui.verbose:
7932 ui.pager(b'version')
7934 ui.pager(b'version')
7933 fm = ui.formatter(b"version", opts)
7935 fm = ui.formatter(b"version", opts)
7934 fm.startitem()
7936 fm.startitem()
7935 fm.write(
7937 fm.write(
7936 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
7938 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
7937 )
7939 )
7938 license = _(
7940 license = _(
7939 b"(see https://mercurial-scm.org for more information)\n"
7941 b"(see https://mercurial-scm.org for more information)\n"
7940 b"\nCopyright (C) 2005-2022 Olivia Mackall and others\n"
7942 b"\nCopyright (C) 2005-2022 Olivia Mackall and others\n"
7941 b"This is free software; see the source for copying conditions. "
7943 b"This is free software; see the source for copying conditions. "
7942 b"There is NO\nwarranty; "
7944 b"There is NO\nwarranty; "
7943 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
7945 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
7944 )
7946 )
7945 if not ui.quiet:
7947 if not ui.quiet:
7946 fm.plain(license)
7948 fm.plain(license)
7947
7949
7948 if ui.verbose:
7950 if ui.verbose:
7949 fm.plain(_(b"\nEnabled extensions:\n\n"))
7951 fm.plain(_(b"\nEnabled extensions:\n\n"))
7950 # format names and versions into columns
7952 # format names and versions into columns
7951 names = []
7953 names = []
7952 vers = []
7954 vers = []
7953 isinternals = []
7955 isinternals = []
7954 for name, module in sorted(extensions.extensions()):
7956 for name, module in sorted(extensions.extensions()):
7955 names.append(name)
7957 names.append(name)
7956 vers.append(extensions.moduleversion(module) or None)
7958 vers.append(extensions.moduleversion(module) or None)
7957 isinternals.append(extensions.ismoduleinternal(module))
7959 isinternals.append(extensions.ismoduleinternal(module))
7958 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
7960 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
7959 if names:
7961 if names:
7960 namefmt = b" %%-%ds " % max(len(n) for n in names)
7962 namefmt = b" %%-%ds " % max(len(n) for n in names)
7961 places = [_(b"external"), _(b"internal")]
7963 places = [_(b"external"), _(b"internal")]
7962 for n, v, p in zip(names, vers, isinternals):
7964 for n, v, p in zip(names, vers, isinternals):
7963 fn.startitem()
7965 fn.startitem()
7964 fn.condwrite(ui.verbose, b"name", namefmt, n)
7966 fn.condwrite(ui.verbose, b"name", namefmt, n)
7965 if ui.verbose:
7967 if ui.verbose:
7966 fn.plain(b"%s " % places[p])
7968 fn.plain(b"%s " % places[p])
7967 fn.data(bundled=p)
7969 fn.data(bundled=p)
7968 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
7970 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
7969 if ui.verbose:
7971 if ui.verbose:
7970 fn.plain(b"\n")
7972 fn.plain(b"\n")
7971 fn.end()
7973 fn.end()
7972 fm.end()
7974 fm.end()
7973
7975
7974
7976
7975 def loadcmdtable(ui, name, cmdtable):
7977 def loadcmdtable(ui, name, cmdtable):
7976 """Load command functions from specified cmdtable"""
7978 """Load command functions from specified cmdtable"""
7977 overrides = [cmd for cmd in cmdtable if cmd in table]
7979 overrides = [cmd for cmd in cmdtable if cmd in table]
7978 if overrides:
7980 if overrides:
7979 ui.warn(
7981 ui.warn(
7980 _(b"extension '%s' overrides commands: %s\n")
7982 _(b"extension '%s' overrides commands: %s\n")
7981 % (name, b" ".join(overrides))
7983 % (name, b" ".join(overrides))
7982 )
7984 )
7983 table.update(cmdtable)
7985 table.update(cmdtable)
@@ -1,688 +1,686 b''
1 # dirstatemap.py
1 # dirstatemap.py
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
6
7 from .i18n import _
7 from .i18n import _
8
8
9 from . import (
9 from . import (
10 error,
10 error,
11 pathutil,
11 pathutil,
12 policy,
12 policy,
13 txnutil,
13 txnutil,
14 util,
14 util,
15 )
15 )
16
16
17 from .dirstateutils import (
17 from .dirstateutils import (
18 docket as docketmod,
18 docket as docketmod,
19 v2,
19 v2,
20 )
20 )
21
21
22 parsers = policy.importmod('parsers')
22 parsers = policy.importmod('parsers')
23 rustmod = policy.importrust('dirstate')
23 rustmod = policy.importrust('dirstate')
24
24
25 propertycache = util.propertycache
25 propertycache = util.propertycache
26
26
27 if rustmod is None:
27 if rustmod is None:
28 DirstateItem = parsers.DirstateItem
28 DirstateItem = parsers.DirstateItem
29 else:
29 else:
30 DirstateItem = rustmod.DirstateItem
30 DirstateItem = rustmod.DirstateItem
31
31
32 rangemask = 0x7FFFFFFF
32 rangemask = 0x7FFFFFFF
33
33
34
34
35 class _dirstatemapcommon:
35 class _dirstatemapcommon:
36 """
36 """
37 Methods that are identical for both implementations of the dirstatemap
37 Methods that are identical for both implementations of the dirstatemap
38 class, with and without Rust extensions enabled.
38 class, with and without Rust extensions enabled.
39 """
39 """
40
40
41 # please pytype
41 # please pytype
42
42
43 _map = None
43 _map = None
44 copymap = None
44 copymap = None
45
45
46 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
46 def __init__(self, ui, opener, root, nodeconstants, use_dirstate_v2):
47 self._use_dirstate_v2 = use_dirstate_v2
47 self._use_dirstate_v2 = use_dirstate_v2
48 self._nodeconstants = nodeconstants
48 self._nodeconstants = nodeconstants
49 self._ui = ui
49 self._ui = ui
50 self._opener = opener
50 self._opener = opener
51 self._root = root
51 self._root = root
52 self._filename = b'dirstate'
52 self._filename = b'dirstate'
53 self._nodelen = 20 # Also update Rust code when changing this!
53 self._nodelen = 20 # Also update Rust code when changing this!
54 self._parents = None
54 self._parents = None
55 self._dirtyparents = False
55 self._dirtyparents = False
56 self._docket = None
56 self._docket = None
57
57
58 # for consistent view between _pl() and _read() invocations
58 # for consistent view between _pl() and _read() invocations
59 self._pendingmode = None
59 self._pendingmode = None
60
60
61 def preload(self):
61 def preload(self):
62 """Loads the underlying data, if it's not already loaded"""
62 """Loads the underlying data, if it's not already loaded"""
63 self._map
63 self._map
64
64
65 def get(self, key, default=None):
65 def get(self, key, default=None):
66 return self._map.get(key, default)
66 return self._map.get(key, default)
67
67
68 def __len__(self):
68 def __len__(self):
69 return len(self._map)
69 return len(self._map)
70
70
71 def __iter__(self):
71 def __iter__(self):
72 return iter(self._map)
72 return iter(self._map)
73
73
74 def __contains__(self, key):
74 def __contains__(self, key):
75 return key in self._map
75 return key in self._map
76
76
77 def __getitem__(self, item):
77 def __getitem__(self, item):
78 return self._map[item]
78 return self._map[item]
79
79
80 ### disk interaction
80 ### disk interaction
81
81
82 def _opendirstatefile(self):
82 def _opendirstatefile(self):
83 fp, mode = txnutil.trypending(self._root, self._opener, self._filename)
83 fp, mode = txnutil.trypending(self._root, self._opener, self._filename)
84 if self._pendingmode is not None and self._pendingmode != mode:
84 if self._pendingmode is not None and self._pendingmode != mode:
85 fp.close()
85 fp.close()
86 raise error.Abort(
86 raise error.Abort(
87 _(b'working directory state may be changed parallelly')
87 _(b'working directory state may be changed parallelly')
88 )
88 )
89 self._pendingmode = mode
89 self._pendingmode = mode
90 return fp
90 return fp
91
91
92 def _readdirstatefile(self, size=-1):
92 def _readdirstatefile(self, size=-1):
93 try:
93 try:
94 with self._opendirstatefile() as fp:
94 with self._opendirstatefile() as fp:
95 return fp.read(size)
95 return fp.read(size)
96 except FileNotFoundError:
96 except FileNotFoundError:
97 # File doesn't exist, so the current state is empty
97 # File doesn't exist, so the current state is empty
98 return b''
98 return b''
99
99
100 @property
100 @property
101 def docket(self):
101 def docket(self):
102 if not self._docket:
102 if not self._docket:
103 if not self._use_dirstate_v2:
103 if not self._use_dirstate_v2:
104 raise error.ProgrammingError(
104 raise error.ProgrammingError(
105 b'dirstate only has a docket in v2 format'
105 b'dirstate only has a docket in v2 format'
106 )
106 )
107 self._docket = docketmod.DirstateDocket.parse(
107 self._docket = docketmod.DirstateDocket.parse(
108 self._readdirstatefile(), self._nodeconstants
108 self._readdirstatefile(), self._nodeconstants
109 )
109 )
110 return self._docket
110 return self._docket
111
111
112 def write_v2_no_append(self, tr, st, meta, packed):
112 def write_v2_no_append(self, tr, st, meta, packed):
113 old_docket = self.docket
113 old_docket = self.docket
114 new_docket = docketmod.DirstateDocket.with_new_uuid(
114 new_docket = docketmod.DirstateDocket.with_new_uuid(
115 self.parents(), len(packed), meta
115 self.parents(), len(packed), meta
116 )
116 )
117 data_filename = new_docket.data_filename()
117 data_filename = new_docket.data_filename()
118 self._opener.write(data_filename, packed)
118 self._opener.write(data_filename, packed)
119 # Write the new docket after the new data file has been
119 # Write the new docket after the new data file has been
120 # written. Because `st` was opened with `atomictemp=True`,
120 # written. Because `st` was opened with `atomictemp=True`,
121 # the actual `.hg/dirstate` file is only affected on close.
121 # the actual `.hg/dirstate` file is only affected on close.
122 st.write(new_docket.serialize())
122 st.write(new_docket.serialize())
123 st.close()
123 st.close()
124 # Remove the old data file after the new docket pointing to
124 # Remove the old data file after the new docket pointing to
125 # the new data file was written.
125 # the new data file was written.
126 if old_docket.uuid:
126 if old_docket.uuid:
127 data_filename = old_docket.data_filename()
127 data_filename = old_docket.data_filename()
128 unlink = lambda _tr=None: self._opener.unlink(data_filename)
128 unlink = lambda _tr=None: self._opener.unlink(data_filename)
129 if tr:
129 if tr:
130 category = b"dirstate-v2-clean-" + old_docket.uuid
130 category = b"dirstate-v2-clean-" + old_docket.uuid
131 tr.addpostclose(category, unlink)
131 tr.addpostclose(category, unlink)
132 else:
132 else:
133 unlink()
133 unlink()
134 self._docket = new_docket
134 self._docket = new_docket
135
135
136 ### reading/setting parents
136 ### reading/setting parents
137
137
138 def parents(self):
138 def parents(self):
139 if not self._parents:
139 if not self._parents:
140 if self._use_dirstate_v2:
140 if self._use_dirstate_v2:
141 self._parents = self.docket.parents
141 self._parents = self.docket.parents
142 else:
142 else:
143 read_len = self._nodelen * 2
143 read_len = self._nodelen * 2
144 st = self._readdirstatefile(read_len)
144 st = self._readdirstatefile(read_len)
145 l = len(st)
145 l = len(st)
146 if l == read_len:
146 if l == read_len:
147 self._parents = (
147 self._parents = (
148 st[: self._nodelen],
148 st[: self._nodelen],
149 st[self._nodelen : 2 * self._nodelen],
149 st[self._nodelen : 2 * self._nodelen],
150 )
150 )
151 elif l == 0:
151 elif l == 0:
152 self._parents = (
152 self._parents = (
153 self._nodeconstants.nullid,
153 self._nodeconstants.nullid,
154 self._nodeconstants.nullid,
154 self._nodeconstants.nullid,
155 )
155 )
156 else:
156 else:
157 raise error.Abort(
157 raise error.Abort(
158 _(b'working directory state appears damaged!')
158 _(b'working directory state appears damaged!')
159 )
159 )
160
160
161 return self._parents
161 return self._parents
162
162
163
163
164 class dirstatemap(_dirstatemapcommon):
164 class dirstatemap(_dirstatemapcommon):
165 """Map encapsulating the dirstate's contents.
165 """Map encapsulating the dirstate's contents.
166
166
167 The dirstate contains the following state:
167 The dirstate contains the following state:
168
168
169 - `identity` is the identity of the dirstate file, which can be used to
169 - `identity` is the identity of the dirstate file, which can be used to
170 detect when changes have occurred to the dirstate file.
170 detect when changes have occurred to the dirstate file.
171
171
172 - `parents` is a pair containing the parents of the working copy. The
172 - `parents` is a pair containing the parents of the working copy. The
173 parents are updated by calling `setparents`.
173 parents are updated by calling `setparents`.
174
174
175 - the state map maps filenames to tuples of (state, mode, size, mtime),
175 - the state map maps filenames to tuples of (state, mode, size, mtime),
176 where state is a single character representing 'normal', 'added',
176 where state is a single character representing 'normal', 'added',
177 'removed', or 'merged'. It is read by treating the dirstate as a
177 'removed', or 'merged'. It is read by treating the dirstate as a
178 dict. File state is updated by calling various methods (see each
178 dict. File state is updated by calling various methods (see each
179 documentation for details):
179 documentation for details):
180
180
181 - `reset_state`,
181 - `reset_state`,
182 - `set_tracked`
182 - `set_tracked`
183 - `set_untracked`
183 - `set_untracked`
184 - `set_clean`
184 - `set_clean`
185 - `set_possibly_dirty`
185 - `set_possibly_dirty`
186
186
187 - `copymap` maps destination filenames to their source filename.
187 - `copymap` maps destination filenames to their source filename.
188
188
189 The dirstate also provides the following views onto the state:
189 The dirstate also provides the following views onto the state:
190
190
191 - `filefoldmap` is a dict mapping normalized filenames to the denormalized
191 - `filefoldmap` is a dict mapping normalized filenames to the denormalized
192 form that they appear as in the dirstate.
192 form that they appear as in the dirstate.
193
193
194 - `dirfoldmap` is a dict mapping normalized directory names to the
194 - `dirfoldmap` is a dict mapping normalized directory names to the
195 denormalized form that they appear as in the dirstate.
195 denormalized form that they appear as in the dirstate.
196 """
196 """
197
197
198 ### Core data storage and access
198 ### Core data storage and access
199
199
200 @propertycache
200 @propertycache
201 def _map(self):
201 def _map(self):
202 self._map = {}
202 self._map = {}
203 self.read()
203 self.read()
204 return self._map
204 return self._map
205
205
206 @propertycache
206 @propertycache
207 def copymap(self):
207 def copymap(self):
208 self.copymap = {}
208 self.copymap = {}
209 self._map
209 self._map
210 return self.copymap
210 return self.copymap
211
211
212 def clear(self):
212 def clear(self):
213 self._map.clear()
213 self._map.clear()
214 self.copymap.clear()
214 self.copymap.clear()
215 self.setparents(self._nodeconstants.nullid, self._nodeconstants.nullid)
215 self.setparents(self._nodeconstants.nullid, self._nodeconstants.nullid)
216 util.clearcachedproperty(self, b"_dirs")
216 util.clearcachedproperty(self, b"_dirs")
217 util.clearcachedproperty(self, b"_alldirs")
217 util.clearcachedproperty(self, b"_alldirs")
218 util.clearcachedproperty(self, b"filefoldmap")
218 util.clearcachedproperty(self, b"filefoldmap")
219 util.clearcachedproperty(self, b"dirfoldmap")
219 util.clearcachedproperty(self, b"dirfoldmap")
220
220
221 def items(self):
221 def items(self):
222 return self._map.items()
222 return self._map.items()
223
223
224 # forward for python2,3 compat
224 # forward for python2,3 compat
225 iteritems = items
225 iteritems = items
226
226
227 def debug_iter(self, all):
227 def debug_iter(self, all):
228 """
228 """
229 Return an iterator of (filename, state, mode, size, mtime) tuples
229 Return an iterator of (filename, state, mode, size, mtime) tuples
230
230
231 `all` is unused when Rust is not enabled
231 `all` is unused when Rust is not enabled
232 """
232 """
233 for (filename, item) in self.items():
233 for (filename, item) in self.items():
234 yield (filename, item.state, item.mode, item.size, item.mtime)
234 yield (filename, item.state, item.mode, item.size, item.mtime)
235
235
236 def keys(self):
236 def keys(self):
237 return self._map.keys()
237 return self._map.keys()
238
238
239 ### reading/setting parents
239 ### reading/setting parents
240
240
241 def setparents(self, p1, p2, fold_p2=False):
241 def setparents(self, p1, p2, fold_p2=False):
242 self._parents = (p1, p2)
242 self._parents = (p1, p2)
243 self._dirtyparents = True
243 self._dirtyparents = True
244 copies = {}
244 copies = {}
245 if fold_p2:
245 if fold_p2:
246 for f, s in self._map.items():
246 for f, s in self._map.items():
247 # Discard "merged" markers when moving away from a merge state
247 # Discard "merged" markers when moving away from a merge state
248 if s.p2_info:
248 if s.p2_info:
249 source = self.copymap.pop(f, None)
249 source = self.copymap.pop(f, None)
250 if source:
250 if source:
251 copies[f] = source
251 copies[f] = source
252 s.drop_merge_data()
252 s.drop_merge_data()
253 return copies
253 return copies
254
254
255 ### disk interaction
255 ### disk interaction
256
256
257 def read(self):
257 def read(self):
258 # ignore HG_PENDING because identity is used only for writing
258 # ignore HG_PENDING because identity is used only for writing
259 self.identity = util.filestat.frompath(
259 self.identity = util.filestat.frompath(
260 self._opener.join(self._filename)
260 self._opener.join(self._filename)
261 )
261 )
262
262
263 if self._use_dirstate_v2:
263 if self._use_dirstate_v2:
264 if not self.docket.uuid:
264 if not self.docket.uuid:
265 return
265 return
266 st = self._opener.read(self.docket.data_filename())
266 st = self._opener.read(self.docket.data_filename())
267 else:
267 else:
268 st = self._readdirstatefile()
268 st = self._readdirstatefile()
269
269
270 if not st:
270 if not st:
271 return
271 return
272
272
273 # TODO: adjust this estimate for dirstate-v2
273 # TODO: adjust this estimate for dirstate-v2
274 if util.safehasattr(parsers, b'dict_new_presized'):
274 if util.safehasattr(parsers, b'dict_new_presized'):
275 # Make an estimate of the number of files in the dirstate based on
275 # Make an estimate of the number of files in the dirstate based on
276 # its size. This trades wasting some memory for avoiding costly
276 # its size. This trades wasting some memory for avoiding costly
277 # resizes. Each entry have a prefix of 17 bytes followed by one or
277 # resizes. Each entry have a prefix of 17 bytes followed by one or
278 # two path names. Studies on various large-scale real-world repositories
278 # two path names. Studies on various large-scale real-world repositories
279 # found 54 bytes a reasonable upper limit for the average path names.
279 # found 54 bytes a reasonable upper limit for the average path names.
280 # Copy entries are ignored for the sake of this estimate.
280 # Copy entries are ignored for the sake of this estimate.
281 self._map = parsers.dict_new_presized(len(st) // 71)
281 self._map = parsers.dict_new_presized(len(st) // 71)
282
282
283 # Python's garbage collector triggers a GC each time a certain number
283 # Python's garbage collector triggers a GC each time a certain number
284 # of container objects (the number being defined by
284 # of container objects (the number being defined by
285 # gc.get_threshold()) are allocated. parse_dirstate creates a tuple
285 # gc.get_threshold()) are allocated. parse_dirstate creates a tuple
286 # for each file in the dirstate. The C version then immediately marks
286 # for each file in the dirstate. The C version then immediately marks
287 # them as not to be tracked by the collector. However, this has no
287 # them as not to be tracked by the collector. However, this has no
288 # effect on when GCs are triggered, only on what objects the GC looks
288 # effect on when GCs are triggered, only on what objects the GC looks
289 # into. This means that O(number of files) GCs are unavoidable.
289 # into. This means that O(number of files) GCs are unavoidable.
290 # Depending on when in the process's lifetime the dirstate is parsed,
290 # Depending on when in the process's lifetime the dirstate is parsed,
291 # this can get very expensive. As a workaround, disable GC while
291 # this can get very expensive. As a workaround, disable GC while
292 # parsing the dirstate.
292 # parsing the dirstate.
293 #
293 #
294 # (we cannot decorate the function directly since it is in a C module)
294 # (we cannot decorate the function directly since it is in a C module)
295 if self._use_dirstate_v2:
295 if self._use_dirstate_v2:
296 p = self.docket.parents
296 p = self.docket.parents
297 meta = self.docket.tree_metadata
297 meta = self.docket.tree_metadata
298 parse_dirstate = util.nogc(v2.parse_dirstate)
298 parse_dirstate = util.nogc(v2.parse_dirstate)
299 parse_dirstate(self._map, self.copymap, st, meta)
299 parse_dirstate(self._map, self.copymap, st, meta)
300 else:
300 else:
301 parse_dirstate = util.nogc(parsers.parse_dirstate)
301 parse_dirstate = util.nogc(parsers.parse_dirstate)
302 p = parse_dirstate(self._map, self.copymap, st)
302 p = parse_dirstate(self._map, self.copymap, st)
303 if not self._dirtyparents:
303 if not self._dirtyparents:
304 self.setparents(*p)
304 self.setparents(*p)
305
305
306 # Avoid excess attribute lookups by fast pathing certain checks
306 # Avoid excess attribute lookups by fast pathing certain checks
307 self.__contains__ = self._map.__contains__
307 self.__contains__ = self._map.__contains__
308 self.__getitem__ = self._map.__getitem__
308 self.__getitem__ = self._map.__getitem__
309 self.get = self._map.get
309 self.get = self._map.get
310
310
311 def write(self, tr, st):
311 def write(self, tr, st):
312 if self._use_dirstate_v2:
312 if self._use_dirstate_v2:
313 packed, meta = v2.pack_dirstate(self._map, self.copymap)
313 packed, meta = v2.pack_dirstate(self._map, self.copymap)
314 self.write_v2_no_append(tr, st, meta, packed)
314 self.write_v2_no_append(tr, st, meta, packed)
315 else:
315 else:
316 packed = parsers.pack_dirstate(
316 packed = parsers.pack_dirstate(
317 self._map, self.copymap, self.parents()
317 self._map, self.copymap, self.parents()
318 )
318 )
319 st.write(packed)
319 st.write(packed)
320 st.close()
320 st.close()
321 self._dirtyparents = False
321 self._dirtyparents = False
322
322
323 @propertycache
323 @propertycache
324 def identity(self):
324 def identity(self):
325 self._map
325 self._map
326 return self.identity
326 return self.identity
327
327
328 ### code related to maintaining and accessing "extra" property
328 ### code related to maintaining and accessing "extra" property
329 # (e.g. "has_dir")
329 # (e.g. "has_dir")
330
330
331 def _dirs_incr(self, filename, old_entry=None):
331 def _dirs_incr(self, filename, old_entry=None):
332 """increment the dirstate counter if applicable"""
332 """increment the dirstate counter if applicable"""
333 if (
333 if (
334 old_entry is None or old_entry.removed
334 old_entry is None or old_entry.removed
335 ) and "_dirs" in self.__dict__:
335 ) and "_dirs" in self.__dict__:
336 self._dirs.addpath(filename)
336 self._dirs.addpath(filename)
337 if old_entry is None and "_alldirs" in self.__dict__:
337 if old_entry is None and "_alldirs" in self.__dict__:
338 self._alldirs.addpath(filename)
338 self._alldirs.addpath(filename)
339
339
340 def _dirs_decr(self, filename, old_entry=None, remove_variant=False):
340 def _dirs_decr(self, filename, old_entry=None, remove_variant=False):
341 """decrement the dirstate counter if applicable"""
341 """decrement the dirstate counter if applicable"""
342 if old_entry is not None:
342 if old_entry is not None:
343 if "_dirs" in self.__dict__ and not old_entry.removed:
343 if "_dirs" in self.__dict__ and not old_entry.removed:
344 self._dirs.delpath(filename)
344 self._dirs.delpath(filename)
345 if "_alldirs" in self.__dict__ and not remove_variant:
345 if "_alldirs" in self.__dict__ and not remove_variant:
346 self._alldirs.delpath(filename)
346 self._alldirs.delpath(filename)
347 elif remove_variant and "_alldirs" in self.__dict__:
347 elif remove_variant and "_alldirs" in self.__dict__:
348 self._alldirs.addpath(filename)
348 self._alldirs.addpath(filename)
349 if "filefoldmap" in self.__dict__:
349 if "filefoldmap" in self.__dict__:
350 normed = util.normcase(filename)
350 normed = util.normcase(filename)
351 self.filefoldmap.pop(normed, None)
351 self.filefoldmap.pop(normed, None)
352
352
353 @propertycache
353 @propertycache
354 def filefoldmap(self):
354 def filefoldmap(self):
355 """Returns a dictionary mapping normalized case paths to their
355 """Returns a dictionary mapping normalized case paths to their
356 non-normalized versions.
356 non-normalized versions.
357 """
357 """
358 try:
358 try:
359 makefilefoldmap = parsers.make_file_foldmap
359 makefilefoldmap = parsers.make_file_foldmap
360 except AttributeError:
360 except AttributeError:
361 pass
361 pass
362 else:
362 else:
363 return makefilefoldmap(
363 return makefilefoldmap(
364 self._map, util.normcasespec, util.normcasefallback
364 self._map, util.normcasespec, util.normcasefallback
365 )
365 )
366
366
367 f = {}
367 f = {}
368 normcase = util.normcase
368 normcase = util.normcase
369 for name, s in self._map.items():
369 for name, s in self._map.items():
370 if not s.removed:
370 if not s.removed:
371 f[normcase(name)] = name
371 f[normcase(name)] = name
372 f[b'.'] = b'.' # prevents useless util.fspath() invocation
372 f[b'.'] = b'.' # prevents useless util.fspath() invocation
373 return f
373 return f
374
374
375 @propertycache
375 @propertycache
376 def dirfoldmap(self):
376 def dirfoldmap(self):
377 f = {}
377 f = {}
378 normcase = util.normcase
378 normcase = util.normcase
379 for name in self._dirs:
379 for name in self._dirs:
380 f[normcase(name)] = name
380 f[normcase(name)] = name
381 return f
381 return f
382
382
383 def hastrackeddir(self, d):
383 def hastrackeddir(self, d):
384 """
384 """
385 Returns True if the dirstate contains a tracked (not removed) file
385 Returns True if the dirstate contains a tracked (not removed) file
386 in this directory.
386 in this directory.
387 """
387 """
388 return d in self._dirs
388 return d in self._dirs
389
389
390 def hasdir(self, d):
390 def hasdir(self, d):
391 """
391 """
392 Returns True if the dirstate contains a file (tracked or removed)
392 Returns True if the dirstate contains a file (tracked or removed)
393 in this directory.
393 in this directory.
394 """
394 """
395 return d in self._alldirs
395 return d in self._alldirs
396
396
397 @propertycache
397 @propertycache
398 def _dirs(self):
398 def _dirs(self):
399 return pathutil.dirs(self._map, only_tracked=True)
399 return pathutil.dirs(self._map, only_tracked=True)
400
400
401 @propertycache
401 @propertycache
402 def _alldirs(self):
402 def _alldirs(self):
403 return pathutil.dirs(self._map)
403 return pathutil.dirs(self._map)
404
404
405 ### code related to manipulation of entries and copy-sources
405 ### code related to manipulation of entries and copy-sources
406
406
407 def reset_state(
407 def reset_state(
408 self,
408 self,
409 filename,
409 filename,
410 wc_tracked=False,
410 wc_tracked=False,
411 p1_tracked=False,
411 p1_tracked=False,
412 p2_info=False,
412 p2_info=False,
413 has_meaningful_mtime=True,
413 has_meaningful_mtime=True,
414 parentfiledata=None,
414 parentfiledata=None,
415 ):
415 ):
416 """Set a entry to a given state, diregarding all previous state
416 """Set a entry to a given state, diregarding all previous state
417
417
418 This is to be used by the part of the dirstate API dedicated to
418 This is to be used by the part of the dirstate API dedicated to
419 adjusting the dirstate after a update/merge.
419 adjusting the dirstate after a update/merge.
420
420
421 note: calling this might result to no entry existing at all if the
421 note: calling this might result to no entry existing at all if the
422 dirstate map does not see any point at having one for this file
422 dirstate map does not see any point at having one for this file
423 anymore.
423 anymore.
424 """
424 """
425 # copy information are now outdated
425 # copy information are now outdated
426 # (maybe new information should be in directly passed to this function)
426 # (maybe new information should be in directly passed to this function)
427 self.copymap.pop(filename, None)
427 self.copymap.pop(filename, None)
428
428
429 if not (p1_tracked or p2_info or wc_tracked):
429 if not (p1_tracked or p2_info or wc_tracked):
430 old_entry = self._map.get(filename)
430 old_entry = self._map.get(filename)
431 self._drop_entry(filename)
431 self._drop_entry(filename)
432 self._dirs_decr(filename, old_entry=old_entry)
432 self._dirs_decr(filename, old_entry=old_entry)
433 return
433 return
434
434
435 old_entry = self._map.get(filename)
435 old_entry = self._map.get(filename)
436 self._dirs_incr(filename, old_entry)
436 self._dirs_incr(filename, old_entry)
437 entry = DirstateItem(
437 entry = DirstateItem(
438 wc_tracked=wc_tracked,
438 wc_tracked=wc_tracked,
439 p1_tracked=p1_tracked,
439 p1_tracked=p1_tracked,
440 p2_info=p2_info,
440 p2_info=p2_info,
441 has_meaningful_mtime=has_meaningful_mtime,
441 has_meaningful_mtime=has_meaningful_mtime,
442 parentfiledata=parentfiledata,
442 parentfiledata=parentfiledata,
443 )
443 )
444 self._map[filename] = entry
444 self._map[filename] = entry
445
445
446 def set_tracked(self, filename):
446 def set_tracked(self, filename):
447 new = False
447 new = False
448 entry = self.get(filename)
448 entry = self.get(filename)
449 if entry is None:
449 if entry is None:
450 self._dirs_incr(filename)
450 self._dirs_incr(filename)
451 entry = DirstateItem(
451 entry = DirstateItem(
452 wc_tracked=True,
452 wc_tracked=True,
453 )
453 )
454
454
455 self._map[filename] = entry
455 self._map[filename] = entry
456 new = True
456 new = True
457 elif not entry.tracked:
457 elif not entry.tracked:
458 self._dirs_incr(filename, entry)
458 self._dirs_incr(filename, entry)
459 entry.set_tracked()
459 entry.set_tracked()
460 self._refresh_entry(filename, entry)
460 self._refresh_entry(filename, entry)
461 new = True
461 new = True
462 else:
462 else:
463 # XXX This is probably overkill for more case, but we need this to
463 # XXX This is probably overkill for more case, but we need this to
464 # fully replace the `normallookup` call with `set_tracked` one.
464 # fully replace the `normallookup` call with `set_tracked` one.
465 # Consider smoothing this in the future.
465 # Consider smoothing this in the future.
466 entry.set_possibly_dirty()
466 entry.set_possibly_dirty()
467 self._refresh_entry(filename, entry)
467 self._refresh_entry(filename, entry)
468 return new
468 return new
469
469
470 def set_untracked(self, f):
470 def set_untracked(self, f):
471 """Mark a file as no longer tracked in the dirstate map"""
471 """Mark a file as no longer tracked in the dirstate map"""
472 entry = self.get(f)
472 entry = self.get(f)
473 if entry is None:
473 if entry is None:
474 return False
474 return False
475 else:
475 else:
476 self._dirs_decr(f, old_entry=entry, remove_variant=not entry.added)
476 self._dirs_decr(f, old_entry=entry, remove_variant=not entry.added)
477 if not entry.p2_info:
477 if not entry.p2_info:
478 self.copymap.pop(f, None)
478 self.copymap.pop(f, None)
479 entry.set_untracked()
479 entry.set_untracked()
480 self._refresh_entry(f, entry)
480 self._refresh_entry(f, entry)
481 return True
481 return True
482
482
483 def set_clean(self, filename, mode, size, mtime):
483 def set_clean(self, filename, mode, size, mtime):
484 """mark a file as back to a clean state"""
484 """mark a file as back to a clean state"""
485 entry = self[filename]
485 entry = self[filename]
486 size = size & rangemask
486 size = size & rangemask
487 entry.set_clean(mode, size, mtime)
487 entry.set_clean(mode, size, mtime)
488 self._refresh_entry(filename, entry)
488 self._refresh_entry(filename, entry)
489 self.copymap.pop(filename, None)
489 self.copymap.pop(filename, None)
490
490
491 def set_possibly_dirty(self, filename):
491 def set_possibly_dirty(self, filename):
492 """record that the current state of the file on disk is unknown"""
492 """record that the current state of the file on disk is unknown"""
493 entry = self[filename]
493 entry = self[filename]
494 entry.set_possibly_dirty()
494 entry.set_possibly_dirty()
495 self._refresh_entry(filename, entry)
495 self._refresh_entry(filename, entry)
496
496
497 def _refresh_entry(self, f, entry):
497 def _refresh_entry(self, f, entry):
498 """record updated state of an entry"""
498 """record updated state of an entry"""
499 if not entry.any_tracked:
499 if not entry.any_tracked:
500 self._map.pop(f, None)
500 self._map.pop(f, None)
501
501
502 def _drop_entry(self, f):
502 def _drop_entry(self, f):
503 """remove any entry for file f
503 """remove any entry for file f
504
504
505 This should also drop associated copy information
505 This should also drop associated copy information
506
506
507 The fact we actually need to drop it is the responsability of the caller"""
507 The fact we actually need to drop it is the responsability of the caller"""
508 self._map.pop(f, None)
508 self._map.pop(f, None)
509 self.copymap.pop(f, None)
509 self.copymap.pop(f, None)
510
510
511
511
512 if rustmod is not None:
512 if rustmod is not None:
513
513
514 class dirstatemap(_dirstatemapcommon):
514 class dirstatemap(_dirstatemapcommon):
515
515
516 ### Core data storage and access
516 ### Core data storage and access
517
517
518 @propertycache
518 @propertycache
519 def _map(self):
519 def _map(self):
520 """
520 """
521 Fills the Dirstatemap when called.
521 Fills the Dirstatemap when called.
522 """
522 """
523 # ignore HG_PENDING because identity is used only for writing
523 # ignore HG_PENDING because identity is used only for writing
524 self.identity = util.filestat.frompath(
524 self.identity = util.filestat.frompath(
525 self._opener.join(self._filename)
525 self._opener.join(self._filename)
526 )
526 )
527
527
528 if self._use_dirstate_v2:
528 if self._use_dirstate_v2:
529 if self.docket.uuid:
529 if self.docket.uuid:
530 # TODO: use mmap when possible
530 # TODO: use mmap when possible
531 data = self._opener.read(self.docket.data_filename())
531 data = self._opener.read(self.docket.data_filename())
532 else:
532 else:
533 data = b''
533 data = b''
534 self._map = rustmod.DirstateMap.new_v2(
534 self._map = rustmod.DirstateMap.new_v2(
535 data, self.docket.data_size, self.docket.tree_metadata
535 data, self.docket.data_size, self.docket.tree_metadata
536 )
536 )
537 parents = self.docket.parents
537 parents = self.docket.parents
538 else:
538 else:
539 self._map, parents = rustmod.DirstateMap.new_v1(
539 self._map, parents = rustmod.DirstateMap.new_v1(
540 self._readdirstatefile()
540 self._readdirstatefile()
541 )
541 )
542
542
543 if parents and not self._dirtyparents:
543 if parents and not self._dirtyparents:
544 self.setparents(*parents)
544 self.setparents(*parents)
545
545
546 self.__contains__ = self._map.__contains__
546 self.__contains__ = self._map.__contains__
547 self.__getitem__ = self._map.__getitem__
547 self.__getitem__ = self._map.__getitem__
548 self.get = self._map.get
548 self.get = self._map.get
549 return self._map
549 return self._map
550
550
551 @property
551 @property
552 def copymap(self):
552 def copymap(self):
553 return self._map.copymap()
553 return self._map.copymap()
554
554
555 def debug_iter(self, all):
555 def debug_iter(self, all):
556 """
556 """
557 Return an iterator of (filename, state, mode, size, mtime) tuples
557 Return an iterator of (filename, state, mode, size, mtime) tuples
558
558
559 `all`: also include with `state == b' '` dirstate tree nodes that
559 `all`: also include with `state == b' '` dirstate tree nodes that
560 don't have an associated `DirstateItem`.
560 don't have an associated `DirstateItem`.
561
561
562 """
562 """
563 return self._map.debug_iter(all)
563 return self._map.debug_iter(all)
564
564
565 def clear(self):
565 def clear(self):
566 self._map.clear()
566 self._map.clear()
567 self.setparents(
567 self.setparents(
568 self._nodeconstants.nullid, self._nodeconstants.nullid
568 self._nodeconstants.nullid, self._nodeconstants.nullid
569 )
569 )
570 util.clearcachedproperty(self, b"_dirs")
570 util.clearcachedproperty(self, b"_dirs")
571 util.clearcachedproperty(self, b"_alldirs")
571 util.clearcachedproperty(self, b"_alldirs")
572 util.clearcachedproperty(self, b"dirfoldmap")
572 util.clearcachedproperty(self, b"dirfoldmap")
573
573
574 def items(self):
574 def items(self):
575 return self._map.items()
575 return self._map.items()
576
576
577 # forward for python2,3 compat
577 # forward for python2,3 compat
578 iteritems = items
578 iteritems = items
579
579
580 def keys(self):
580 def keys(self):
581 return iter(self._map)
581 return iter(self._map)
582
582
583 ### reading/setting parents
583 ### reading/setting parents
584
584
585 def setparents(self, p1, p2, fold_p2=False):
585 def setparents(self, p1, p2, fold_p2=False):
586 self._parents = (p1, p2)
586 self._parents = (p1, p2)
587 self._dirtyparents = True
587 self._dirtyparents = True
588 copies = {}
588 copies = {}
589 if fold_p2:
589 if fold_p2:
590 copies = self._map.setparents_fixup()
590 copies = self._map.setparents_fixup()
591 return copies
591 return copies
592
592
593 ### disk interaction
593 ### disk interaction
594
594
595 @propertycache
595 @propertycache
596 def identity(self):
596 def identity(self):
597 self._map
597 self._map
598 return self.identity
598 return self.identity
599
599
600 def write(self, tr, st):
600 def write(self, tr, st):
601 if not self._use_dirstate_v2:
601 if not self._use_dirstate_v2:
602 p1, p2 = self.parents()
602 p1, p2 = self.parents()
603 packed = self._map.write_v1(p1, p2)
603 packed = self._map.write_v1(p1, p2)
604 st.write(packed)
604 st.write(packed)
605 st.close()
605 st.close()
606 self._dirtyparents = False
606 self._dirtyparents = False
607 return
607 return
608
608
609 # We can only append to an existing data file if there is one
609 # We can only append to an existing data file if there is one
610 can_append = self.docket.uuid is not None
610 can_append = self.docket.uuid is not None
611 packed, meta, append = self._map.write_v2(can_append)
611 packed, meta, append = self._map.write_v2(can_append)
612 if append:
612 if append:
613 docket = self.docket
613 docket = self.docket
614 data_filename = docket.data_filename()
614 data_filename = docket.data_filename()
615 if tr:
616 tr.add(data_filename, docket.data_size)
617 with self._opener(data_filename, b'r+b') as fp:
615 with self._opener(data_filename, b'r+b') as fp:
618 fp.seek(docket.data_size)
616 fp.seek(docket.data_size)
619 assert fp.tell() == docket.data_size
617 assert fp.tell() == docket.data_size
620 written = fp.write(packed)
618 written = fp.write(packed)
621 if written is not None: # py2 may return None
619 if written is not None: # py2 may return None
622 assert written == len(packed), (written, len(packed))
620 assert written == len(packed), (written, len(packed))
623 docket.data_size += len(packed)
621 docket.data_size += len(packed)
624 docket.parents = self.parents()
622 docket.parents = self.parents()
625 docket.tree_metadata = meta
623 docket.tree_metadata = meta
626 st.write(docket.serialize())
624 st.write(docket.serialize())
627 st.close()
625 st.close()
628 else:
626 else:
629 self.write_v2_no_append(tr, st, meta, packed)
627 self.write_v2_no_append(tr, st, meta, packed)
630 # Reload from the newly-written file
628 # Reload from the newly-written file
631 util.clearcachedproperty(self, b"_map")
629 util.clearcachedproperty(self, b"_map")
632 self._dirtyparents = False
630 self._dirtyparents = False
633
631
634 ### code related to maintaining and accessing "extra" property
632 ### code related to maintaining and accessing "extra" property
635 # (e.g. "has_dir")
633 # (e.g. "has_dir")
636
634
637 @propertycache
635 @propertycache
638 def filefoldmap(self):
636 def filefoldmap(self):
639 """Returns a dictionary mapping normalized case paths to their
637 """Returns a dictionary mapping normalized case paths to their
640 non-normalized versions.
638 non-normalized versions.
641 """
639 """
642 return self._map.filefoldmapasdict()
640 return self._map.filefoldmapasdict()
643
641
644 def hastrackeddir(self, d):
642 def hastrackeddir(self, d):
645 return self._map.hastrackeddir(d)
643 return self._map.hastrackeddir(d)
646
644
647 def hasdir(self, d):
645 def hasdir(self, d):
648 return self._map.hasdir(d)
646 return self._map.hasdir(d)
649
647
650 @propertycache
648 @propertycache
651 def dirfoldmap(self):
649 def dirfoldmap(self):
652 f = {}
650 f = {}
653 normcase = util.normcase
651 normcase = util.normcase
654 for name in self._map.tracked_dirs():
652 for name in self._map.tracked_dirs():
655 f[normcase(name)] = name
653 f[normcase(name)] = name
656 return f
654 return f
657
655
658 ### code related to manipulation of entries and copy-sources
656 ### code related to manipulation of entries and copy-sources
659
657
660 def set_tracked(self, f):
658 def set_tracked(self, f):
661 return self._map.set_tracked(f)
659 return self._map.set_tracked(f)
662
660
663 def set_untracked(self, f):
661 def set_untracked(self, f):
664 return self._map.set_untracked(f)
662 return self._map.set_untracked(f)
665
663
666 def set_clean(self, filename, mode, size, mtime):
664 def set_clean(self, filename, mode, size, mtime):
667 self._map.set_clean(filename, mode, size, mtime)
665 self._map.set_clean(filename, mode, size, mtime)
668
666
669 def set_possibly_dirty(self, f):
667 def set_possibly_dirty(self, f):
670 self._map.set_possibly_dirty(f)
668 self._map.set_possibly_dirty(f)
671
669
672 def reset_state(
670 def reset_state(
673 self,
671 self,
674 filename,
672 filename,
675 wc_tracked=False,
673 wc_tracked=False,
676 p1_tracked=False,
674 p1_tracked=False,
677 p2_info=False,
675 p2_info=False,
678 has_meaningful_mtime=True,
676 has_meaningful_mtime=True,
679 parentfiledata=None,
677 parentfiledata=None,
680 ):
678 ):
681 return self._map.reset_state(
679 return self._map.reset_state(
682 filename,
680 filename,
683 wc_tracked,
681 wc_tracked,
684 p1_tracked,
682 p1_tracked,
685 p2_info,
683 p2_info,
686 has_meaningful_mtime,
684 has_meaningful_mtime,
687 parentfiledata,
685 parentfiledata,
688 )
686 )
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now