##// END OF EJS Templates
merge: with stable
Augie Fackler -
r47433:6f4a481f merge default
parent child Browse files
Show More

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

@@ -1,209 +1,210 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,222 +1,223 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
@@ -1,293 +1,291 b''
1 # filelog.py - file history class for mercurial
1 # filelog.py - file history class for mercurial
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@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 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 from .i18n import _
10 from .i18n import _
11 from .node import (
11 from .node import (
12 nullid,
12 nullid,
13 nullrev,
13 nullrev,
14 )
14 )
15 from . import (
15 from . import (
16 error,
16 error,
17 revlog,
17 revlog,
18 )
18 )
19 from .interfaces import (
19 from .interfaces import (
20 repository,
20 repository,
21 util as interfaceutil,
21 util as interfaceutil,
22 )
22 )
23 from .utils import storageutil
23 from .utils import storageutil
24
24
25
25
26 @interfaceutil.implementer(repository.ifilestorage)
26 @interfaceutil.implementer(repository.ifilestorage)
27 class filelog(object):
27 class filelog(object):
28 def __init__(self, opener, path):
28 def __init__(self, opener, path):
29 self._revlog = revlog.revlog(
29 self._revlog = revlog.revlog(
30 opener, b'/'.join((b'data', path + b'.i')), censorable=True
30 opener, b'/'.join((b'data', path + b'.i')), censorable=True
31 )
31 )
32 # Full name of the user visible file, relative to the repository root.
32 # Full name of the user visible file, relative to the repository root.
33 # Used by LFS.
33 # Used by LFS.
34 self._revlog.filename = path
34 self._revlog.filename = path
35
35
36 def __len__(self):
36 def __len__(self):
37 return len(self._revlog)
37 return len(self._revlog)
38
38
39 def __iter__(self):
39 def __iter__(self):
40 return self._revlog.__iter__()
40 return self._revlog.__iter__()
41
41
42 def hasnode(self, node):
42 def hasnode(self, node):
43 if node in (nullid, nullrev):
43 if node in (nullid, nullrev):
44 return False
44 return False
45
45
46 try:
46 try:
47 self._revlog.rev(node)
47 self._revlog.rev(node)
48 return True
48 return True
49 except (TypeError, ValueError, IndexError, error.LookupError):
49 except (TypeError, ValueError, IndexError, error.LookupError):
50 return False
50 return False
51
51
52 def revs(self, start=0, stop=None):
52 def revs(self, start=0, stop=None):
53 return self._revlog.revs(start=start, stop=stop)
53 return self._revlog.revs(start=start, stop=stop)
54
54
55 def parents(self, node):
55 def parents(self, node):
56 return self._revlog.parents(node)
56 return self._revlog.parents(node)
57
57
58 def parentrevs(self, rev):
58 def parentrevs(self, rev):
59 return self._revlog.parentrevs(rev)
59 return self._revlog.parentrevs(rev)
60
60
61 def rev(self, node):
61 def rev(self, node):
62 return self._revlog.rev(node)
62 return self._revlog.rev(node)
63
63
64 def node(self, rev):
64 def node(self, rev):
65 return self._revlog.node(rev)
65 return self._revlog.node(rev)
66
66
67 def lookup(self, node):
67 def lookup(self, node):
68 return storageutil.fileidlookup(
68 return storageutil.fileidlookup(
69 self._revlog, node, self._revlog.indexfile
69 self._revlog, node, self._revlog.indexfile
70 )
70 )
71
71
72 def linkrev(self, rev):
72 def linkrev(self, rev):
73 return self._revlog.linkrev(rev)
73 return self._revlog.linkrev(rev)
74
74
75 def commonancestorsheads(self, node1, node2):
75 def commonancestorsheads(self, node1, node2):
76 return self._revlog.commonancestorsheads(node1, node2)
76 return self._revlog.commonancestorsheads(node1, node2)
77
77
78 # Used by dagop.blockdescendants().
78 # Used by dagop.blockdescendants().
79 def descendants(self, revs):
79 def descendants(self, revs):
80 return self._revlog.descendants(revs)
80 return self._revlog.descendants(revs)
81
81
82 def heads(self, start=None, stop=None):
82 def heads(self, start=None, stop=None):
83 return self._revlog.heads(start, stop)
83 return self._revlog.heads(start, stop)
84
84
85 # Used by hgweb, children extension.
85 # Used by hgweb, children extension.
86 def children(self, node):
86 def children(self, node):
87 return self._revlog.children(node)
87 return self._revlog.children(node)
88
88
89 def iscensored(self, rev):
89 def iscensored(self, rev):
90 return self._revlog.iscensored(rev)
90 return self._revlog.iscensored(rev)
91
91
92 def revision(self, node, _df=None, raw=False):
92 def revision(self, node, _df=None, raw=False):
93 return self._revlog.revision(node, _df=_df, raw=raw)
93 return self._revlog.revision(node, _df=_df, raw=raw)
94
94
95 def rawdata(self, node, _df=None):
95 def rawdata(self, node, _df=None):
96 return self._revlog.rawdata(node, _df=_df)
96 return self._revlog.rawdata(node, _df=_df)
97
97
98 def emitrevisions(
98 def emitrevisions(
99 self,
99 self,
100 nodes,
100 nodes,
101 nodesorder=None,
101 nodesorder=None,
102 revisiondata=False,
102 revisiondata=False,
103 assumehaveparentrevisions=False,
103 assumehaveparentrevisions=False,
104 deltamode=repository.CG_DELTAMODE_STD,
104 deltamode=repository.CG_DELTAMODE_STD,
105 ):
105 ):
106 return self._revlog.emitrevisions(
106 return self._revlog.emitrevisions(
107 nodes,
107 nodes,
108 nodesorder=nodesorder,
108 nodesorder=nodesorder,
109 revisiondata=revisiondata,
109 revisiondata=revisiondata,
110 assumehaveparentrevisions=assumehaveparentrevisions,
110 assumehaveparentrevisions=assumehaveparentrevisions,
111 deltamode=deltamode,
111 deltamode=deltamode,
112 )
112 )
113
113
114 def addrevision(
114 def addrevision(
115 self,
115 self,
116 revisiondata,
116 revisiondata,
117 transaction,
117 transaction,
118 linkrev,
118 linkrev,
119 p1,
119 p1,
120 p2,
120 p2,
121 node=None,
121 node=None,
122 flags=revlog.REVIDX_DEFAULT_FLAGS,
122 flags=revlog.REVIDX_DEFAULT_FLAGS,
123 cachedelta=None,
123 cachedelta=None,
124 ):
124 ):
125 return self._revlog.addrevision(
125 return self._revlog.addrevision(
126 revisiondata,
126 revisiondata,
127 transaction,
127 transaction,
128 linkrev,
128 linkrev,
129 p1,
129 p1,
130 p2,
130 p2,
131 node=node,
131 node=node,
132 flags=flags,
132 flags=flags,
133 cachedelta=cachedelta,
133 cachedelta=cachedelta,
134 )
134 )
135
135
136 def addgroup(
136 def addgroup(
137 self,
137 self,
138 deltas,
138 deltas,
139 linkmapper,
139 linkmapper,
140 transaction,
140 transaction,
141 addrevisioncb=None,
141 addrevisioncb=None,
142 duplicaterevisioncb=None,
142 duplicaterevisioncb=None,
143 maybemissingparents=False,
143 maybemissingparents=False,
144 ):
144 ):
145 if maybemissingparents:
145 if maybemissingparents:
146 raise error.Abort(
146 raise error.Abort(
147 _(
147 _(
148 b'revlog storage does not support missing '
148 b'revlog storage does not support missing '
149 b'parents write mode'
149 b'parents write mode'
150 )
150 )
151 )
151 )
152
152
153 return self._revlog.addgroup(
153 return self._revlog.addgroup(
154 deltas,
154 deltas,
155 linkmapper,
155 linkmapper,
156 transaction,
156 transaction,
157 addrevisioncb=addrevisioncb,
157 addrevisioncb=addrevisioncb,
158 duplicaterevisioncb=duplicaterevisioncb,
158 duplicaterevisioncb=duplicaterevisioncb,
159 )
159 )
160
160
161 def getstrippoint(self, minlink):
161 def getstrippoint(self, minlink):
162 return self._revlog.getstrippoint(minlink)
162 return self._revlog.getstrippoint(minlink)
163
163
164 def strip(self, minlink, transaction):
164 def strip(self, minlink, transaction):
165 return self._revlog.strip(minlink, transaction)
165 return self._revlog.strip(minlink, transaction)
166
166
167 def censorrevision(self, tr, node, tombstone=b''):
167 def censorrevision(self, tr, node, tombstone=b''):
168 return self._revlog.censorrevision(tr, node, tombstone=tombstone)
168 return self._revlog.censorrevision(tr, node, tombstone=tombstone)
169
169
170 def files(self):
170 def files(self):
171 return self._revlog.files()
171 return self._revlog.files()
172
172
173 def read(self, node):
173 def read(self, node):
174 return storageutil.filtermetadata(self.revision(node))
174 return storageutil.filtermetadata(self.revision(node))
175
175
176 def add(self, text, meta, transaction, link, p1=None, p2=None):
176 def add(self, text, meta, transaction, link, p1=None, p2=None):
177 if meta or text.startswith(b'\1\n'):
177 if meta or text.startswith(b'\1\n'):
178 text = storageutil.packmeta(meta, text)
178 text = storageutil.packmeta(meta, text)
179 rev = self.addrevision(text, transaction, link, p1, p2)
179 rev = self.addrevision(text, transaction, link, p1, p2)
180 return self.node(rev)
180 return self.node(rev)
181
181
182 def renamed(self, node):
182 def renamed(self, node):
183 return storageutil.filerevisioncopied(self, node)
183 return storageutil.filerevisioncopied(self, node)
184
184
185 def size(self, rev):
185 def size(self, rev):
186 """return the size of a given revision"""
186 """return the size of a given revision"""
187
187
188 # for revisions with renames, we have to go the slow way
188 # for revisions with renames, we have to go the slow way
189 node = self.node(rev)
189 node = self.node(rev)
190 if self.renamed(node):
190 if self.renamed(node):
191 return len(self.read(node))
191 return len(self.read(node))
192 if self.iscensored(rev):
192 if self.iscensored(rev):
193 return 0
193 return 0
194
194
195 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
195 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
196 return self._revlog.size(rev)
196 return self._revlog.size(rev)
197
197
198 def cmp(self, node, text):
198 def cmp(self, node, text):
199 """compare text with a given file revision
199 """compare text with a given file revision
200
200
201 returns True if text is different than what is stored.
201 returns True if text is different than what is stored.
202 """
202 """
203 return not storageutil.filedataequivalent(self, node, text)
203 return not storageutil.filedataequivalent(self, node, text)
204
204
205 def verifyintegrity(self, state):
205 def verifyintegrity(self, state):
206 return self._revlog.verifyintegrity(state)
206 return self._revlog.verifyintegrity(state)
207
207
208 def storageinfo(
208 def storageinfo(
209 self,
209 self,
210 exclusivefiles=False,
210 exclusivefiles=False,
211 sharedfiles=False,
211 sharedfiles=False,
212 revisionscount=False,
212 revisionscount=False,
213 trackedsize=False,
213 trackedsize=False,
214 storedsize=False,
214 storedsize=False,
215 ):
215 ):
216 return self._revlog.storageinfo(
216 return self._revlog.storageinfo(
217 exclusivefiles=exclusivefiles,
217 exclusivefiles=exclusivefiles,
218 sharedfiles=sharedfiles,
218 sharedfiles=sharedfiles,
219 revisionscount=revisionscount,
219 revisionscount=revisionscount,
220 trackedsize=trackedsize,
220 trackedsize=trackedsize,
221 storedsize=storedsize,
221 storedsize=storedsize,
222 )
222 )
223
223
224 # TODO these aren't part of the interface and aren't internal methods.
224 # TODO these aren't part of the interface and aren't internal methods.
225 # Callers should be fixed to not use them.
225 # Callers should be fixed to not use them.
226
226
227 # Used by bundlefilelog, unionfilelog.
227 # Used by bundlefilelog, unionfilelog.
228 @property
228 @property
229 def indexfile(self):
229 def indexfile(self):
230 return self._revlog.indexfile
230 return self._revlog.indexfile
231
231
232 @indexfile.setter
232 @indexfile.setter
233 def indexfile(self, value):
233 def indexfile(self, value):
234 self._revlog.indexfile = value
234 self._revlog.indexfile = value
235
235
236 # Used by repo upgrade.
236 # Used by repo upgrade.
237 def clone(self, tr, destrevlog, **kwargs):
237 def clone(self, tr, destrevlog, **kwargs):
238 if not isinstance(destrevlog, filelog):
238 if not isinstance(destrevlog, filelog):
239 raise error.ProgrammingError(b'expected filelog to clone()')
239 raise error.ProgrammingError(b'expected filelog to clone()')
240
240
241 return self._revlog.clone(tr, destrevlog._revlog, **kwargs)
241 return self._revlog.clone(tr, destrevlog._revlog, **kwargs)
242
242
243
243
244 class narrowfilelog(filelog):
244 class narrowfilelog(filelog):
245 """Filelog variation to be used with narrow stores."""
245 """Filelog variation to be used with narrow stores."""
246
246
247 def __init__(self, opener, path, narrowmatch):
247 def __init__(self, opener, path, narrowmatch):
248 super(narrowfilelog, self).__init__(opener, path)
248 super(narrowfilelog, self).__init__(opener, path)
249 self._narrowmatch = narrowmatch
249 self._narrowmatch = narrowmatch
250
250
251 def renamed(self, node):
251 def renamed(self, node):
252 res = super(narrowfilelog, self).renamed(node)
252 res = super(narrowfilelog, self).renamed(node)
253
253
254 # Renames that come from outside the narrowspec are problematic
254 # Renames that come from outside the narrowspec are problematic
255 # because we may lack the base text for the rename. This can result
255 # because we may lack the base text for the rename. This can result
256 # in code attempting to walk the ancestry or compute a diff
256 # in code attempting to walk the ancestry or compute a diff
257 # encountering a missing revision. We address this by silently
257 # encountering a missing revision. We address this by silently
258 # removing rename metadata if the source file is outside the
258 # removing rename metadata if the source file is outside the
259 # narrow spec.
259 # narrow spec.
260 #
260 #
261 # A better solution would be to see if the base revision is available,
261 # A better solution would be to see if the base revision is available,
262 # rather than assuming it isn't.
262 # rather than assuming it isn't.
263 #
263 #
264 # An even better solution would be to teach all consumers of rename
264 # An even better solution would be to teach all consumers of rename
265 # metadata that the base revision may not be available.
265 # metadata that the base revision may not be available.
266 #
266 #
267 # TODO consider better ways of doing this.
267 # TODO consider better ways of doing this.
268 if res and not self._narrowmatch(res[0]):
268 if res and not self._narrowmatch(res[0]):
269 return None
269 return None
270
270
271 return res
271 return res
272
272
273 def size(self, rev):
273 def size(self, rev):
274 # Because we have a custom renamed() that may lie, we need to call
274 # Because we have a custom renamed() that may lie, we need to call
275 # the base renamed() to report accurate results.
275 # the base renamed() to report accurate results.
276 node = self.node(rev)
276 node = self.node(rev)
277 if super(narrowfilelog, self).renamed(node):
277 if super(narrowfilelog, self).renamed(node):
278 return len(self.read(node))
278 return len(self.read(node))
279 else:
279 else:
280 return super(narrowfilelog, self).size(rev)
280 return super(narrowfilelog, self).size(rev)
281
281
282 def cmp(self, node, text):
282 def cmp(self, node, text):
283 different = super(narrowfilelog, self).cmp(node, text)
283 # We don't call `super` because narrow parents can be buggy in case of a
284 # ambiguous dirstate. Always take the slow path until there is a better
285 # fix, see issue6150.
284
286
285 # Because renamed() may lie, we may get false positives for
287 # Censored files compare against the empty file.
286 # different content. Check for this by comparing against the original
288 if self.iscensored(self.rev(node)):
287 # renamed() implementation.
289 return text != b''
288 if different:
289 if super(narrowfilelog, self).renamed(node):
290 t2 = self.read(node)
291 return t2 != text
292
290
293 return different
291 return self.read(node) != text
@@ -1,3073 +1,3073 b''
1 The Mercurial system uses a set of configuration files to control
1 The Mercurial system uses a set of configuration files to control
2 aspects of its behavior.
2 aspects of its behavior.
3
3
4 Troubleshooting
4 Troubleshooting
5 ===============
5 ===============
6
6
7 If you're having problems with your configuration,
7 If you're having problems with your configuration,
8 :hg:`config --debug` can help you understand what is introducing
8 :hg:`config --debug` can help you understand what is introducing
9 a setting into your environment.
9 a setting into your environment.
10
10
11 See :hg:`help config.syntax` and :hg:`help config.files`
11 See :hg:`help config.syntax` and :hg:`help config.files`
12 for information about how and where to override things.
12 for information about how and where to override things.
13
13
14 Structure
14 Structure
15 =========
15 =========
16
16
17 The configuration files use a simple ini-file format. A configuration
17 The configuration files use a simple ini-file format. A configuration
18 file consists of sections, led by a ``[section]`` header and followed
18 file consists of sections, led by a ``[section]`` header and followed
19 by ``name = value`` entries::
19 by ``name = value`` entries::
20
20
21 [ui]
21 [ui]
22 username = Firstname Lastname <firstname.lastname@example.net>
22 username = Firstname Lastname <firstname.lastname@example.net>
23 verbose = True
23 verbose = True
24
24
25 The above entries will be referred to as ``ui.username`` and
25 The above entries will be referred to as ``ui.username`` and
26 ``ui.verbose``, respectively. See :hg:`help config.syntax`.
26 ``ui.verbose``, respectively. See :hg:`help config.syntax`.
27
27
28 Files
28 Files
29 =====
29 =====
30
30
31 Mercurial reads configuration data from several files, if they exist.
31 Mercurial reads configuration data from several files, if they exist.
32 These files do not exist by default and you will have to create the
32 These files do not exist by default and you will have to create the
33 appropriate configuration files yourself:
33 appropriate configuration files yourself:
34
34
35 Local configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
35 Local configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
36
36
37 Global configuration like the username setting is typically put into:
37 Global configuration like the username setting is typically put into:
38
38
39 .. container:: windows
39 .. container:: windows
40
40
41 - ``%USERPROFILE%\mercurial.ini`` (on Windows)
41 - ``%USERPROFILE%\mercurial.ini`` (on Windows)
42
42
43 .. container:: unix.plan9
43 .. container:: unix.plan9
44
44
45 - ``$HOME/.hgrc`` (on Unix, Plan9)
45 - ``$HOME/.hgrc`` (on Unix, Plan9)
46
46
47 The names of these files depend on the system on which Mercurial is
47 The names of these files depend on the system on which Mercurial is
48 installed. ``*.rc`` files from a single directory are read in
48 installed. ``*.rc`` files from a single directory are read in
49 alphabetical order, later ones overriding earlier ones. Where multiple
49 alphabetical order, later ones overriding earlier ones. Where multiple
50 paths are given below, settings from earlier paths override later
50 paths are given below, settings from earlier paths override later
51 ones.
51 ones.
52
52
53 .. container:: verbose.unix
53 .. container:: verbose.unix
54
54
55 On Unix, the following files are consulted:
55 On Unix, the following files are consulted:
56
56
57 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
57 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
58 - ``<repo>/.hg/hgrc`` (per-repository)
58 - ``<repo>/.hg/hgrc`` (per-repository)
59 - ``$HOME/.hgrc`` (per-user)
59 - ``$HOME/.hgrc`` (per-user)
60 - ``${XDG_CONFIG_HOME:-$HOME/.config}/hg/hgrc`` (per-user)
60 - ``${XDG_CONFIG_HOME:-$HOME/.config}/hg/hgrc`` (per-user)
61 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
61 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
62 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
62 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
63 - ``/etc/mercurial/hgrc`` (per-system)
63 - ``/etc/mercurial/hgrc`` (per-system)
64 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
64 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
65 - ``<internal>/*.rc`` (defaults)
65 - ``<internal>/*.rc`` (defaults)
66
66
67 .. container:: verbose.windows
67 .. container:: verbose.windows
68
68
69 On Windows, the following files are consulted:
69 On Windows, the following files are consulted:
70
70
71 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
71 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
72 - ``<repo>/.hg/hgrc`` (per-repository)
72 - ``<repo>/.hg/hgrc`` (per-repository)
73 - ``%USERPROFILE%\.hgrc`` (per-user)
73 - ``%USERPROFILE%\.hgrc`` (per-user)
74 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
74 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
75 - ``%HOME%\.hgrc`` (per-user)
75 - ``%HOME%\.hgrc`` (per-user)
76 - ``%HOME%\Mercurial.ini`` (per-user)
76 - ``%HOME%\Mercurial.ini`` (per-user)
77 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-system)
77 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-system)
78 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
78 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
79 - ``<install-dir>\Mercurial.ini`` (per-installation)
79 - ``<install-dir>\Mercurial.ini`` (per-installation)
80 - ``%PROGRAMDATA%\Mercurial\hgrc`` (per-system)
80 - ``%PROGRAMDATA%\Mercurial\hgrc`` (per-system)
81 - ``%PROGRAMDATA%\Mercurial\Mercurial.ini`` (per-system)
81 - ``%PROGRAMDATA%\Mercurial\Mercurial.ini`` (per-system)
82 - ``%PROGRAMDATA%\Mercurial\hgrc.d\*.rc`` (per-system)
82 - ``%PROGRAMDATA%\Mercurial\hgrc.d\*.rc`` (per-system)
83 - ``<internal>/*.rc`` (defaults)
83 - ``<internal>/*.rc`` (defaults)
84
84
85 .. note::
85 .. note::
86
86
87 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
87 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
88 is used when running 32-bit Python on 64-bit Windows.
88 is used when running 32-bit Python on 64-bit Windows.
89
89
90 .. container:: verbose.plan9
90 .. container:: verbose.plan9
91
91
92 On Plan9, the following files are consulted:
92 On Plan9, the following files are consulted:
93
93
94 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
94 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
95 - ``<repo>/.hg/hgrc`` (per-repository)
95 - ``<repo>/.hg/hgrc`` (per-repository)
96 - ``$home/lib/hgrc`` (per-user)
96 - ``$home/lib/hgrc`` (per-user)
97 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
97 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
98 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
98 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
99 - ``/lib/mercurial/hgrc`` (per-system)
99 - ``/lib/mercurial/hgrc`` (per-system)
100 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
100 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
101 - ``<internal>/*.rc`` (defaults)
101 - ``<internal>/*.rc`` (defaults)
102
102
103 Per-repository configuration options only apply in a
103 Per-repository configuration options only apply in a
104 particular repository. This file is not version-controlled, and
104 particular repository. This file is not version-controlled, and
105 will not get transferred during a "clone" operation. Options in
105 will not get transferred during a "clone" operation. Options in
106 this file override options in all other configuration files.
106 this file override options in all other configuration files.
107
107
108 .. container:: unix.plan9
108 .. container:: unix.plan9
109
109
110 On Plan 9 and Unix, most of this file will be ignored if it doesn't
110 On Plan 9 and Unix, most of this file will be ignored if it doesn't
111 belong to a trusted user or to a trusted group. See
111 belong to a trusted user or to a trusted group. See
112 :hg:`help config.trusted` for more details.
112 :hg:`help config.trusted` for more details.
113
113
114 Per-user configuration file(s) are for the user running Mercurial. Options
114 Per-user configuration file(s) are for the user running Mercurial. Options
115 in these files apply to all Mercurial commands executed by this user in any
115 in these files apply to all Mercurial commands executed by this user in any
116 directory. Options in these files override per-system and per-installation
116 directory. Options in these files override per-system and per-installation
117 options.
117 options.
118
118
119 Per-installation configuration files are searched for in the
119 Per-installation configuration files are searched for in the
120 directory where Mercurial is installed. ``<install-root>`` is the
120 directory where Mercurial is installed. ``<install-root>`` is the
121 parent directory of the **hg** executable (or symlink) being run.
121 parent directory of the **hg** executable (or symlink) being run.
122
122
123 .. container:: unix.plan9
123 .. container:: unix.plan9
124
124
125 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
125 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
126 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
126 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
127 files apply to all Mercurial commands executed by any user in any
127 files apply to all Mercurial commands executed by any user in any
128 directory.
128 directory.
129
129
130 Per-installation configuration files are for the system on
130 Per-installation configuration files are for the system on
131 which Mercurial is running. Options in these files apply to all
131 which Mercurial is running. Options in these files apply to all
132 Mercurial commands executed by any user in any directory. Registry
132 Mercurial commands executed by any user in any directory. Registry
133 keys contain PATH-like strings, every part of which must reference
133 keys contain PATH-like strings, every part of which must reference
134 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
134 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
135 be read. Mercurial checks each of these locations in the specified
135 be read. Mercurial checks each of these locations in the specified
136 order until one or more configuration files are detected.
136 order until one or more configuration files are detected.
137
137
138 Per-system configuration files are for the system on which Mercurial
138 Per-system configuration files are for the system on which Mercurial
139 is running. Options in these files apply to all Mercurial commands
139 is running. Options in these files apply to all Mercurial commands
140 executed by any user in any directory. Options in these files
140 executed by any user in any directory. Options in these files
141 override per-installation options.
141 override per-installation options.
142
142
143 Mercurial comes with some default configuration. The default configuration
143 Mercurial comes with some default configuration. The default configuration
144 files are installed with Mercurial and will be overwritten on upgrades. Default
144 files are installed with Mercurial and will be overwritten on upgrades. Default
145 configuration files should never be edited by users or administrators but can
145 configuration files should never be edited by users or administrators but can
146 be overridden in other configuration files. So far the directory only contains
146 be overridden in other configuration files. So far the directory only contains
147 merge tool configuration but packagers can also put other default configuration
147 merge tool configuration but packagers can also put other default configuration
148 there.
148 there.
149
149
150 On versions 5.7 and later, if share-safe functionality is enabled,
150 On versions 5.7 and later, if share-safe functionality is enabled,
151 shares will read config file of share source too.
151 shares will read config file of share source too.
152 `<share-source/.hg/hgrc>` is read before reading `<repo/.hg/hgrc>`.
152 `<share-source/.hg/hgrc>` is read before reading `<repo/.hg/hgrc>`.
153
153
154 For configs which should not be shared, `<repo/.hg/hgrc-not-shared>`
154 For configs which should not be shared, `<repo/.hg/hgrc-not-shared>`
155 should be used.
155 should be used.
156
156
157 Syntax
157 Syntax
158 ======
158 ======
159
159
160 A configuration file consists of sections, led by a ``[section]`` header
160 A configuration file consists of sections, led by a ``[section]`` header
161 and followed by ``name = value`` entries (sometimes called
161 and followed by ``name = value`` entries (sometimes called
162 ``configuration keys``)::
162 ``configuration keys``)::
163
163
164 [spam]
164 [spam]
165 eggs=ham
165 eggs=ham
166 green=
166 green=
167 eggs
167 eggs
168
168
169 Each line contains one entry. If the lines that follow are indented,
169 Each line contains one entry. If the lines that follow are indented,
170 they are treated as continuations of that entry. Leading whitespace is
170 they are treated as continuations of that entry. Leading whitespace is
171 removed from values. Empty lines are skipped. Lines beginning with
171 removed from values. Empty lines are skipped. Lines beginning with
172 ``#`` or ``;`` are ignored and may be used to provide comments.
172 ``#`` or ``;`` are ignored and may be used to provide comments.
173
173
174 Configuration keys can be set multiple times, in which case Mercurial
174 Configuration keys can be set multiple times, in which case Mercurial
175 will use the value that was configured last. As an example::
175 will use the value that was configured last. As an example::
176
176
177 [spam]
177 [spam]
178 eggs=large
178 eggs=large
179 ham=serrano
179 ham=serrano
180 eggs=small
180 eggs=small
181
181
182 This would set the configuration key named ``eggs`` to ``small``.
182 This would set the configuration key named ``eggs`` to ``small``.
183
183
184 It is also possible to define a section multiple times. A section can
184 It is also possible to define a section multiple times. A section can
185 be redefined on the same and/or on different configuration files. For
185 be redefined on the same and/or on different configuration files. For
186 example::
186 example::
187
187
188 [foo]
188 [foo]
189 eggs=large
189 eggs=large
190 ham=serrano
190 ham=serrano
191 eggs=small
191 eggs=small
192
192
193 [bar]
193 [bar]
194 eggs=ham
194 eggs=ham
195 green=
195 green=
196 eggs
196 eggs
197
197
198 [foo]
198 [foo]
199 ham=prosciutto
199 ham=prosciutto
200 eggs=medium
200 eggs=medium
201 bread=toasted
201 bread=toasted
202
202
203 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
203 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
204 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
204 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
205 respectively. As you can see there only thing that matters is the last
205 respectively. As you can see there only thing that matters is the last
206 value that was set for each of the configuration keys.
206 value that was set for each of the configuration keys.
207
207
208 If a configuration key is set multiple times in different
208 If a configuration key is set multiple times in different
209 configuration files the final value will depend on the order in which
209 configuration files the final value will depend on the order in which
210 the different configuration files are read, with settings from earlier
210 the different configuration files are read, with settings from earlier
211 paths overriding later ones as described on the ``Files`` section
211 paths overriding later ones as described on the ``Files`` section
212 above.
212 above.
213
213
214 A line of the form ``%include file`` will include ``file`` into the
214 A line of the form ``%include file`` will include ``file`` into the
215 current configuration file. The inclusion is recursive, which means
215 current configuration file. The inclusion is recursive, which means
216 that included files can include other files. Filenames are relative to
216 that included files can include other files. Filenames are relative to
217 the configuration file in which the ``%include`` directive is found.
217 the configuration file in which the ``%include`` directive is found.
218 Environment variables and ``~user`` constructs are expanded in
218 Environment variables and ``~user`` constructs are expanded in
219 ``file``. This lets you do something like::
219 ``file``. This lets you do something like::
220
220
221 %include ~/.hgrc.d/$HOST.rc
221 %include ~/.hgrc.d/$HOST.rc
222
222
223 to include a different configuration file on each computer you use.
223 to include a different configuration file on each computer you use.
224
224
225 A line with ``%unset name`` will remove ``name`` from the current
225 A line with ``%unset name`` will remove ``name`` from the current
226 section, if it has been set previously.
226 section, if it has been set previously.
227
227
228 The values are either free-form text strings, lists of text strings,
228 The values are either free-form text strings, lists of text strings,
229 or Boolean values. Boolean values can be set to true using any of "1",
229 or Boolean values. Boolean values can be set to true using any of "1",
230 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
230 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
231 (all case insensitive).
231 (all case insensitive).
232
232
233 List values are separated by whitespace or comma, except when values are
233 List values are separated by whitespace or comma, except when values are
234 placed in double quotation marks::
234 placed in double quotation marks::
235
235
236 allow_read = "John Doe, PhD", brian, betty
236 allow_read = "John Doe, PhD", brian, betty
237
237
238 Quotation marks can be escaped by prefixing them with a backslash. Only
238 Quotation marks can be escaped by prefixing them with a backslash. Only
239 quotation marks at the beginning of a word is counted as a quotation
239 quotation marks at the beginning of a word is counted as a quotation
240 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
240 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
241
241
242 Sections
242 Sections
243 ========
243 ========
244
244
245 This section describes the different sections that may appear in a
245 This section describes the different sections that may appear in a
246 Mercurial configuration file, the purpose of each section, its possible
246 Mercurial configuration file, the purpose of each section, its possible
247 keys, and their possible values.
247 keys, and their possible values.
248
248
249 ``alias``
249 ``alias``
250 ---------
250 ---------
251
251
252 Defines command aliases.
252 Defines command aliases.
253
253
254 Aliases allow you to define your own commands in terms of other
254 Aliases allow you to define your own commands in terms of other
255 commands (or aliases), optionally including arguments. Positional
255 commands (or aliases), optionally including arguments. Positional
256 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
256 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
257 are expanded by Mercurial before execution. Positional arguments not
257 are expanded by Mercurial before execution. Positional arguments not
258 already used by ``$N`` in the definition are put at the end of the
258 already used by ``$N`` in the definition are put at the end of the
259 command to be executed.
259 command to be executed.
260
260
261 Alias definitions consist of lines of the form::
261 Alias definitions consist of lines of the form::
262
262
263 <alias> = <command> [<argument>]...
263 <alias> = <command> [<argument>]...
264
264
265 For example, this definition::
265 For example, this definition::
266
266
267 latest = log --limit 5
267 latest = log --limit 5
268
268
269 creates a new command ``latest`` that shows only the five most recent
269 creates a new command ``latest`` that shows only the five most recent
270 changesets. You can define subsequent aliases using earlier ones::
270 changesets. You can define subsequent aliases using earlier ones::
271
271
272 stable5 = latest -b stable
272 stable5 = latest -b stable
273
273
274 .. note::
274 .. note::
275
275
276 It is possible to create aliases with the same names as
276 It is possible to create aliases with the same names as
277 existing commands, which will then override the original
277 existing commands, which will then override the original
278 definitions. This is almost always a bad idea!
278 definitions. This is almost always a bad idea!
279
279
280 An alias can start with an exclamation point (``!``) to make it a
280 An alias can start with an exclamation point (``!``) to make it a
281 shell alias. A shell alias is executed with the shell and will let you
281 shell alias. A shell alias is executed with the shell and will let you
282 run arbitrary commands. As an example, ::
282 run arbitrary commands. As an example, ::
283
283
284 echo = !echo $@
284 echo = !echo $@
285
285
286 will let you do ``hg echo foo`` to have ``foo`` printed in your
286 will let you do ``hg echo foo`` to have ``foo`` printed in your
287 terminal. A better example might be::
287 terminal. A better example might be::
288
288
289 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm -f
289 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm -f
290
290
291 which will make ``hg purge`` delete all unknown files in the
291 which will make ``hg purge`` delete all unknown files in the
292 repository in the same manner as the purge extension.
292 repository in the same manner as the purge extension.
293
293
294 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
294 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
295 expand to the command arguments. Unmatched arguments are
295 expand to the command arguments. Unmatched arguments are
296 removed. ``$0`` expands to the alias name and ``$@`` expands to all
296 removed. ``$0`` expands to the alias name and ``$@`` expands to all
297 arguments separated by a space. ``"$@"`` (with quotes) expands to all
297 arguments separated by a space. ``"$@"`` (with quotes) expands to all
298 arguments quoted individually and separated by a space. These expansions
298 arguments quoted individually and separated by a space. These expansions
299 happen before the command is passed to the shell.
299 happen before the command is passed to the shell.
300
300
301 Shell aliases are executed in an environment where ``$HG`` expands to
301 Shell aliases are executed in an environment where ``$HG`` expands to
302 the path of the Mercurial that was used to execute the alias. This is
302 the path of the Mercurial that was used to execute the alias. This is
303 useful when you want to call further Mercurial commands in a shell
303 useful when you want to call further Mercurial commands in a shell
304 alias, as was done above for the purge alias. In addition,
304 alias, as was done above for the purge alias. In addition,
305 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
305 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
306 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
306 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
307
307
308 .. note::
308 .. note::
309
309
310 Some global configuration options such as ``-R`` are
310 Some global configuration options such as ``-R`` are
311 processed before shell aliases and will thus not be passed to
311 processed before shell aliases and will thus not be passed to
312 aliases.
312 aliases.
313
313
314
314
315 ``annotate``
315 ``annotate``
316 ------------
316 ------------
317
317
318 Settings used when displaying file annotations. All values are
318 Settings used when displaying file annotations. All values are
319 Booleans and default to False. See :hg:`help config.diff` for
319 Booleans and default to False. See :hg:`help config.diff` for
320 related options for the diff command.
320 related options for the diff command.
321
321
322 ``ignorews``
322 ``ignorews``
323 Ignore white space when comparing lines.
323 Ignore white space when comparing lines.
324
324
325 ``ignorewseol``
325 ``ignorewseol``
326 Ignore white space at the end of a line when comparing lines.
326 Ignore white space at the end of a line when comparing lines.
327
327
328 ``ignorewsamount``
328 ``ignorewsamount``
329 Ignore changes in the amount of white space.
329 Ignore changes in the amount of white space.
330
330
331 ``ignoreblanklines``
331 ``ignoreblanklines``
332 Ignore changes whose lines are all blank.
332 Ignore changes whose lines are all blank.
333
333
334
334
335 ``auth``
335 ``auth``
336 --------
336 --------
337
337
338 Authentication credentials and other authentication-like configuration
338 Authentication credentials and other authentication-like configuration
339 for HTTP connections. This section allows you to store usernames and
339 for HTTP connections. This section allows you to store usernames and
340 passwords for use when logging *into* HTTP servers. See
340 passwords for use when logging *into* HTTP servers. See
341 :hg:`help config.web` if you want to configure *who* can login to
341 :hg:`help config.web` if you want to configure *who* can login to
342 your HTTP server.
342 your HTTP server.
343
343
344 The following options apply to all hosts.
344 The following options apply to all hosts.
345
345
346 ``cookiefile``
346 ``cookiefile``
347 Path to a file containing HTTP cookie lines. Cookies matching a
347 Path to a file containing HTTP cookie lines. Cookies matching a
348 host will be sent automatically.
348 host will be sent automatically.
349
349
350 The file format uses the Mozilla cookies.txt format, which defines cookies
350 The file format uses the Mozilla cookies.txt format, which defines cookies
351 on their own lines. Each line contains 7 fields delimited by the tab
351 on their own lines. Each line contains 7 fields delimited by the tab
352 character (domain, is_domain_cookie, path, is_secure, expires, name,
352 character (domain, is_domain_cookie, path, is_secure, expires, name,
353 value). For more info, do an Internet search for "Netscape cookies.txt
353 value). For more info, do an Internet search for "Netscape cookies.txt
354 format."
354 format."
355
355
356 Note: the cookies parser does not handle port numbers on domains. You
356 Note: the cookies parser does not handle port numbers on domains. You
357 will need to remove ports from the domain for the cookie to be recognized.
357 will need to remove ports from the domain for the cookie to be recognized.
358 This could result in a cookie being disclosed to an unwanted server.
358 This could result in a cookie being disclosed to an unwanted server.
359
359
360 The cookies file is read-only.
360 The cookies file is read-only.
361
361
362 Other options in this section are grouped by name and have the following
362 Other options in this section are grouped by name and have the following
363 format::
363 format::
364
364
365 <name>.<argument> = <value>
365 <name>.<argument> = <value>
366
366
367 where ``<name>`` is used to group arguments into authentication
367 where ``<name>`` is used to group arguments into authentication
368 entries. Example::
368 entries. Example::
369
369
370 foo.prefix = hg.intevation.de/mercurial
370 foo.prefix = hg.intevation.de/mercurial
371 foo.username = foo
371 foo.username = foo
372 foo.password = bar
372 foo.password = bar
373 foo.schemes = http https
373 foo.schemes = http https
374
374
375 bar.prefix = secure.example.org
375 bar.prefix = secure.example.org
376 bar.key = path/to/file.key
376 bar.key = path/to/file.key
377 bar.cert = path/to/file.cert
377 bar.cert = path/to/file.cert
378 bar.schemes = https
378 bar.schemes = https
379
379
380 Supported arguments:
380 Supported arguments:
381
381
382 ``prefix``
382 ``prefix``
383 Either ``*`` or a URI prefix with or without the scheme part.
383 Either ``*`` or a URI prefix with or without the scheme part.
384 The authentication entry with the longest matching prefix is used
384 The authentication entry with the longest matching prefix is used
385 (where ``*`` matches everything and counts as a match of length
385 (where ``*`` matches everything and counts as a match of length
386 1). If the prefix doesn't include a scheme, the match is performed
386 1). If the prefix doesn't include a scheme, the match is performed
387 against the URI with its scheme stripped as well, and the schemes
387 against the URI with its scheme stripped as well, and the schemes
388 argument, q.v., is then subsequently consulted.
388 argument, q.v., is then subsequently consulted.
389
389
390 ``username``
390 ``username``
391 Optional. Username to authenticate with. If not given, and the
391 Optional. Username to authenticate with. If not given, and the
392 remote site requires basic or digest authentication, the user will
392 remote site requires basic or digest authentication, the user will
393 be prompted for it. Environment variables are expanded in the
393 be prompted for it. Environment variables are expanded in the
394 username letting you do ``foo.username = $USER``. If the URI
394 username letting you do ``foo.username = $USER``. If the URI
395 includes a username, only ``[auth]`` entries with a matching
395 includes a username, only ``[auth]`` entries with a matching
396 username or without a username will be considered.
396 username or without a username will be considered.
397
397
398 ``password``
398 ``password``
399 Optional. Password to authenticate with. If not given, and the
399 Optional. Password to authenticate with. If not given, and the
400 remote site requires basic or digest authentication, the user
400 remote site requires basic or digest authentication, the user
401 will be prompted for it.
401 will be prompted for it.
402
402
403 ``key``
403 ``key``
404 Optional. PEM encoded client certificate key file. Environment
404 Optional. PEM encoded client certificate key file. Environment
405 variables are expanded in the filename.
405 variables are expanded in the filename.
406
406
407 ``cert``
407 ``cert``
408 Optional. PEM encoded client certificate chain file. Environment
408 Optional. PEM encoded client certificate chain file. Environment
409 variables are expanded in the filename.
409 variables are expanded in the filename.
410
410
411 ``schemes``
411 ``schemes``
412 Optional. Space separated list of URI schemes to use this
412 Optional. Space separated list of URI schemes to use this
413 authentication entry with. Only used if the prefix doesn't include
413 authentication entry with. Only used if the prefix doesn't include
414 a scheme. Supported schemes are http and https. They will match
414 a scheme. Supported schemes are http and https. They will match
415 static-http and static-https respectively, as well.
415 static-http and static-https respectively, as well.
416 (default: https)
416 (default: https)
417
417
418 If no suitable authentication entry is found, the user is prompted
418 If no suitable authentication entry is found, the user is prompted
419 for credentials as usual if required by the remote.
419 for credentials as usual if required by the remote.
420
420
421 ``cmdserver``
421 ``cmdserver``
422 -------------
422 -------------
423
423
424 Controls command server settings. (ADVANCED)
424 Controls command server settings. (ADVANCED)
425
425
426 ``message-encodings``
426 ``message-encodings``
427 List of encodings for the ``m`` (message) channel. The first encoding
427 List of encodings for the ``m`` (message) channel. The first encoding
428 supported by the server will be selected and advertised in the hello
428 supported by the server will be selected and advertised in the hello
429 message. This is useful only when ``ui.message-output`` is set to
429 message. This is useful only when ``ui.message-output`` is set to
430 ``channel``. Supported encodings are ``cbor``.
430 ``channel``. Supported encodings are ``cbor``.
431
431
432 ``shutdown-on-interrupt``
432 ``shutdown-on-interrupt``
433 If set to false, the server's main loop will continue running after
433 If set to false, the server's main loop will continue running after
434 SIGINT received. ``runcommand`` requests can still be interrupted by
434 SIGINT received. ``runcommand`` requests can still be interrupted by
435 SIGINT. Close the write end of the pipe to shut down the server
435 SIGINT. Close the write end of the pipe to shut down the server
436 process gracefully.
436 process gracefully.
437 (default: True)
437 (default: True)
438
438
439 ``color``
439 ``color``
440 ---------
440 ---------
441
441
442 Configure the Mercurial color mode. For details about how to define your custom
442 Configure the Mercurial color mode. For details about how to define your custom
443 effect and style see :hg:`help color`.
443 effect and style see :hg:`help color`.
444
444
445 ``mode``
445 ``mode``
446 String: control the method used to output color. One of ``auto``, ``ansi``,
446 String: control the method used to output color. One of ``auto``, ``ansi``,
447 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
447 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
448 use ANSI mode by default (or win32 mode prior to Windows 10) if it detects a
448 use ANSI mode by default (or win32 mode prior to Windows 10) if it detects a
449 terminal. Any invalid value will disable color.
449 terminal. Any invalid value will disable color.
450
450
451 ``pagermode``
451 ``pagermode``
452 String: optional override of ``color.mode`` used with pager.
452 String: optional override of ``color.mode`` used with pager.
453
453
454 On some systems, terminfo mode may cause problems when using
454 On some systems, terminfo mode may cause problems when using
455 color with ``less -R`` as a pager program. less with the -R option
455 color with ``less -R`` as a pager program. less with the -R option
456 will only display ECMA-48 color codes, and terminfo mode may sometimes
456 will only display ECMA-48 color codes, and terminfo mode may sometimes
457 emit codes that less doesn't understand. You can work around this by
457 emit codes that less doesn't understand. You can work around this by
458 either using ansi mode (or auto mode), or by using less -r (which will
458 either using ansi mode (or auto mode), or by using less -r (which will
459 pass through all terminal control codes, not just color control
459 pass through all terminal control codes, not just color control
460 codes).
460 codes).
461
461
462 On some systems (such as MSYS in Windows), the terminal may support
462 On some systems (such as MSYS in Windows), the terminal may support
463 a different color mode than the pager program.
463 a different color mode than the pager program.
464
464
465 ``commands``
465 ``commands``
466 ------------
466 ------------
467
467
468 ``commit.post-status``
468 ``commit.post-status``
469 Show status of files in the working directory after successful commit.
469 Show status of files in the working directory after successful commit.
470 (default: False)
470 (default: False)
471
471
472 ``merge.require-rev``
472 ``merge.require-rev``
473 Require that the revision to merge the current commit with be specified on
473 Require that the revision to merge the current commit with be specified on
474 the command line. If this is enabled and a revision is not specified, the
474 the command line. If this is enabled and a revision is not specified, the
475 command aborts.
475 command aborts.
476 (default: False)
476 (default: False)
477
477
478 ``push.require-revs``
478 ``push.require-revs``
479 Require revisions to push be specified using one or more mechanisms such as
479 Require revisions to push be specified using one or more mechanisms such as
480 specifying them positionally on the command line, using ``-r``, ``-b``,
480 specifying them positionally on the command line, using ``-r``, ``-b``,
481 and/or ``-B`` on the command line, or using ``paths.<path>:pushrev`` in the
481 and/or ``-B`` on the command line, or using ``paths.<path>:pushrev`` in the
482 configuration. If this is enabled and revisions are not specified, the
482 configuration. If this is enabled and revisions are not specified, the
483 command aborts.
483 command aborts.
484 (default: False)
484 (default: False)
485
485
486 ``resolve.confirm``
486 ``resolve.confirm``
487 Confirm before performing action if no filename is passed.
487 Confirm before performing action if no filename is passed.
488 (default: False)
488 (default: False)
489
489
490 ``resolve.explicit-re-merge``
490 ``resolve.explicit-re-merge``
491 Require uses of ``hg resolve`` to specify which action it should perform,
491 Require uses of ``hg resolve`` to specify which action it should perform,
492 instead of re-merging files by default.
492 instead of re-merging files by default.
493 (default: False)
493 (default: False)
494
494
495 ``resolve.mark-check``
495 ``resolve.mark-check``
496 Determines what level of checking :hg:`resolve --mark` will perform before
496 Determines what level of checking :hg:`resolve --mark` will perform before
497 marking files as resolved. Valid values are ``none`, ``warn``, and
497 marking files as resolved. Valid values are ``none`, ``warn``, and
498 ``abort``. ``warn`` will output a warning listing the file(s) that still
498 ``abort``. ``warn`` will output a warning listing the file(s) that still
499 have conflict markers in them, but will still mark everything resolved.
499 have conflict markers in them, but will still mark everything resolved.
500 ``abort`` will output the same warning but will not mark things as resolved.
500 ``abort`` will output the same warning but will not mark things as resolved.
501 If --all is passed and this is set to ``abort``, only a warning will be
501 If --all is passed and this is set to ``abort``, only a warning will be
502 shown (an error will not be raised).
502 shown (an error will not be raised).
503 (default: ``none``)
503 (default: ``none``)
504
504
505 ``status.relative``
505 ``status.relative``
506 Make paths in :hg:`status` output relative to the current directory.
506 Make paths in :hg:`status` output relative to the current directory.
507 (default: False)
507 (default: False)
508
508
509 ``status.terse``
509 ``status.terse``
510 Default value for the --terse flag, which condenses status output.
510 Default value for the --terse flag, which condenses status output.
511 (default: empty)
511 (default: empty)
512
512
513 ``update.check``
513 ``update.check``
514 Determines what level of checking :hg:`update` will perform before moving
514 Determines what level of checking :hg:`update` will perform before moving
515 to a destination revision. Valid values are ``abort``, ``none``,
515 to a destination revision. Valid values are ``abort``, ``none``,
516 ``linear``, and ``noconflict``. ``abort`` always fails if the working
516 ``linear``, and ``noconflict``. ``abort`` always fails if the working
517 directory has uncommitted changes. ``none`` performs no checking, and may
517 directory has uncommitted changes. ``none`` performs no checking, and may
518 result in a merge with uncommitted changes. ``linear`` allows any update
518 result in a merge with uncommitted changes. ``linear`` allows any update
519 as long as it follows a straight line in the revision history, and may
519 as long as it follows a straight line in the revision history, and may
520 trigger a merge with uncommitted changes. ``noconflict`` will allow any
520 trigger a merge with uncommitted changes. ``noconflict`` will allow any
521 update which would not trigger a merge with uncommitted changes, if any
521 update which would not trigger a merge with uncommitted changes, if any
522 are present.
522 are present.
523 (default: ``linear``)
523 (default: ``linear``)
524
524
525 ``update.requiredest``
525 ``update.requiredest``
526 Require that the user pass a destination when running :hg:`update`.
526 Require that the user pass a destination when running :hg:`update`.
527 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
527 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
528 will be disallowed.
528 will be disallowed.
529 (default: False)
529 (default: False)
530
530
531 ``committemplate``
531 ``committemplate``
532 ------------------
532 ------------------
533
533
534 ``changeset``
534 ``changeset``
535 String: configuration in this section is used as the template to
535 String: configuration in this section is used as the template to
536 customize the text shown in the editor when committing.
536 customize the text shown in the editor when committing.
537
537
538 In addition to pre-defined template keywords, commit log specific one
538 In addition to pre-defined template keywords, commit log specific one
539 below can be used for customization:
539 below can be used for customization:
540
540
541 ``extramsg``
541 ``extramsg``
542 String: Extra message (typically 'Leave message empty to abort
542 String: Extra message (typically 'Leave message empty to abort
543 commit.'). This may be changed by some commands or extensions.
543 commit.'). This may be changed by some commands or extensions.
544
544
545 For example, the template configuration below shows as same text as
545 For example, the template configuration below shows as same text as
546 one shown by default::
546 one shown by default::
547
547
548 [committemplate]
548 [committemplate]
549 changeset = {desc}\n\n
549 changeset = {desc}\n\n
550 HG: Enter commit message. Lines beginning with 'HG:' are removed.
550 HG: Enter commit message. Lines beginning with 'HG:' are removed.
551 HG: {extramsg}
551 HG: {extramsg}
552 HG: --
552 HG: --
553 HG: user: {author}\n{ifeq(p2rev, "-1", "",
553 HG: user: {author}\n{ifeq(p2rev, "-1", "",
554 "HG: branch merge\n")
554 "HG: branch merge\n")
555 }HG: branch '{branch}'\n{if(activebookmark,
555 }HG: branch '{branch}'\n{if(activebookmark,
556 "HG: bookmark '{activebookmark}'\n") }{subrepos %
556 "HG: bookmark '{activebookmark}'\n") }{subrepos %
557 "HG: subrepo {subrepo}\n" }{file_adds %
557 "HG: subrepo {subrepo}\n" }{file_adds %
558 "HG: added {file}\n" }{file_mods %
558 "HG: added {file}\n" }{file_mods %
559 "HG: changed {file}\n" }{file_dels %
559 "HG: changed {file}\n" }{file_dels %
560 "HG: removed {file}\n" }{if(files, "",
560 "HG: removed {file}\n" }{if(files, "",
561 "HG: no files changed\n")}
561 "HG: no files changed\n")}
562
562
563 ``diff()``
563 ``diff()``
564 String: show the diff (see :hg:`help templates` for detail)
564 String: show the diff (see :hg:`help templates` for detail)
565
565
566 Sometimes it is helpful to show the diff of the changeset in the editor without
566 Sometimes it is helpful to show the diff of the changeset in the editor without
567 having to prefix 'HG: ' to each line so that highlighting works correctly. For
567 having to prefix 'HG: ' to each line so that highlighting works correctly. For
568 this, Mercurial provides a special string which will ignore everything below
568 this, Mercurial provides a special string which will ignore everything below
569 it::
569 it::
570
570
571 HG: ------------------------ >8 ------------------------
571 HG: ------------------------ >8 ------------------------
572
572
573 For example, the template configuration below will show the diff below the
573 For example, the template configuration below will show the diff below the
574 extra message::
574 extra message::
575
575
576 [committemplate]
576 [committemplate]
577 changeset = {desc}\n\n
577 changeset = {desc}\n\n
578 HG: Enter commit message. Lines beginning with 'HG:' are removed.
578 HG: Enter commit message. Lines beginning with 'HG:' are removed.
579 HG: {extramsg}
579 HG: {extramsg}
580 HG: ------------------------ >8 ------------------------
580 HG: ------------------------ >8 ------------------------
581 HG: Do not touch the line above.
581 HG: Do not touch the line above.
582 HG: Everything below will be removed.
582 HG: Everything below will be removed.
583 {diff()}
583 {diff()}
584
584
585 .. note::
585 .. note::
586
586
587 For some problematic encodings (see :hg:`help win32mbcs` for
587 For some problematic encodings (see :hg:`help win32mbcs` for
588 detail), this customization should be configured carefully, to
588 detail), this customization should be configured carefully, to
589 avoid showing broken characters.
589 avoid showing broken characters.
590
590
591 For example, if a multibyte character ending with backslash (0x5c) is
591 For example, if a multibyte character ending with backslash (0x5c) is
592 followed by the ASCII character 'n' in the customized template,
592 followed by the ASCII character 'n' in the customized template,
593 the sequence of backslash and 'n' is treated as line-feed unexpectedly
593 the sequence of backslash and 'n' is treated as line-feed unexpectedly
594 (and the multibyte character is broken, too).
594 (and the multibyte character is broken, too).
595
595
596 Customized template is used for commands below (``--edit`` may be
596 Customized template is used for commands below (``--edit`` may be
597 required):
597 required):
598
598
599 - :hg:`backout`
599 - :hg:`backout`
600 - :hg:`commit`
600 - :hg:`commit`
601 - :hg:`fetch` (for merge commit only)
601 - :hg:`fetch` (for merge commit only)
602 - :hg:`graft`
602 - :hg:`graft`
603 - :hg:`histedit`
603 - :hg:`histedit`
604 - :hg:`import`
604 - :hg:`import`
605 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
605 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
606 - :hg:`rebase`
606 - :hg:`rebase`
607 - :hg:`shelve`
607 - :hg:`shelve`
608 - :hg:`sign`
608 - :hg:`sign`
609 - :hg:`tag`
609 - :hg:`tag`
610 - :hg:`transplant`
610 - :hg:`transplant`
611
611
612 Configuring items below instead of ``changeset`` allows showing
612 Configuring items below instead of ``changeset`` allows showing
613 customized message only for specific actions, or showing different
613 customized message only for specific actions, or showing different
614 messages for each action.
614 messages for each action.
615
615
616 - ``changeset.backout`` for :hg:`backout`
616 - ``changeset.backout`` for :hg:`backout`
617 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
617 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
618 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
618 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
619 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
619 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
620 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
620 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
621 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
621 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
622 - ``changeset.gpg.sign`` for :hg:`sign`
622 - ``changeset.gpg.sign`` for :hg:`sign`
623 - ``changeset.graft`` for :hg:`graft`
623 - ``changeset.graft`` for :hg:`graft`
624 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
624 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
625 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
625 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
626 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
626 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
627 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
627 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
628 - ``changeset.import.bypass`` for :hg:`import --bypass`
628 - ``changeset.import.bypass`` for :hg:`import --bypass`
629 - ``changeset.import.normal.merge`` for :hg:`import` on merges
629 - ``changeset.import.normal.merge`` for :hg:`import` on merges
630 - ``changeset.import.normal.normal`` for :hg:`import` on other
630 - ``changeset.import.normal.normal`` for :hg:`import` on other
631 - ``changeset.mq.qnew`` for :hg:`qnew`
631 - ``changeset.mq.qnew`` for :hg:`qnew`
632 - ``changeset.mq.qfold`` for :hg:`qfold`
632 - ``changeset.mq.qfold`` for :hg:`qfold`
633 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
633 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
634 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
634 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
635 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
635 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
636 - ``changeset.rebase.normal`` for :hg:`rebase` on other
636 - ``changeset.rebase.normal`` for :hg:`rebase` on other
637 - ``changeset.shelve.shelve`` for :hg:`shelve`
637 - ``changeset.shelve.shelve`` for :hg:`shelve`
638 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
638 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
639 - ``changeset.tag.remove`` for :hg:`tag --remove`
639 - ``changeset.tag.remove`` for :hg:`tag --remove`
640 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
640 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
641 - ``changeset.transplant.normal`` for :hg:`transplant` on other
641 - ``changeset.transplant.normal`` for :hg:`transplant` on other
642
642
643 These dot-separated lists of names are treated as hierarchical ones.
643 These dot-separated lists of names are treated as hierarchical ones.
644 For example, ``changeset.tag.remove`` customizes the commit message
644 For example, ``changeset.tag.remove`` customizes the commit message
645 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
645 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
646 commit message for :hg:`tag` regardless of ``--remove`` option.
646 commit message for :hg:`tag` regardless of ``--remove`` option.
647
647
648 When the external editor is invoked for a commit, the corresponding
648 When the external editor is invoked for a commit, the corresponding
649 dot-separated list of names without the ``changeset.`` prefix
649 dot-separated list of names without the ``changeset.`` prefix
650 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
650 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
651 variable.
651 variable.
652
652
653 In this section, items other than ``changeset`` can be referred from
653 In this section, items other than ``changeset`` can be referred from
654 others. For example, the configuration to list committed files up
654 others. For example, the configuration to list committed files up
655 below can be referred as ``{listupfiles}``::
655 below can be referred as ``{listupfiles}``::
656
656
657 [committemplate]
657 [committemplate]
658 listupfiles = {file_adds %
658 listupfiles = {file_adds %
659 "HG: added {file}\n" }{file_mods %
659 "HG: added {file}\n" }{file_mods %
660 "HG: changed {file}\n" }{file_dels %
660 "HG: changed {file}\n" }{file_dels %
661 "HG: removed {file}\n" }{if(files, "",
661 "HG: removed {file}\n" }{if(files, "",
662 "HG: no files changed\n")}
662 "HG: no files changed\n")}
663
663
664 ``decode/encode``
664 ``decode/encode``
665 -----------------
665 -----------------
666
666
667 Filters for transforming files on checkout/checkin. This would
667 Filters for transforming files on checkout/checkin. This would
668 typically be used for newline processing or other
668 typically be used for newline processing or other
669 localization/canonicalization of files.
669 localization/canonicalization of files.
670
670
671 Filters consist of a filter pattern followed by a filter command.
671 Filters consist of a filter pattern followed by a filter command.
672 Filter patterns are globs by default, rooted at the repository root.
672 Filter patterns are globs by default, rooted at the repository root.
673 For example, to match any file ending in ``.txt`` in the root
673 For example, to match any file ending in ``.txt`` in the root
674 directory only, use the pattern ``*.txt``. To match any file ending
674 directory only, use the pattern ``*.txt``. To match any file ending
675 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
675 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
676 For each file only the first matching filter applies.
676 For each file only the first matching filter applies.
677
677
678 The filter command can start with a specifier, either ``pipe:`` or
678 The filter command can start with a specifier, either ``pipe:`` or
679 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
679 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
680
680
681 A ``pipe:`` command must accept data on stdin and return the transformed
681 A ``pipe:`` command must accept data on stdin and return the transformed
682 data on stdout.
682 data on stdout.
683
683
684 Pipe example::
684 Pipe example::
685
685
686 [encode]
686 [encode]
687 # uncompress gzip files on checkin to improve delta compression
687 # uncompress gzip files on checkin to improve delta compression
688 # note: not necessarily a good idea, just an example
688 # note: not necessarily a good idea, just an example
689 *.gz = pipe: gunzip
689 *.gz = pipe: gunzip
690
690
691 [decode]
691 [decode]
692 # recompress gzip files when writing them to the working dir (we
692 # recompress gzip files when writing them to the working dir (we
693 # can safely omit "pipe:", because it's the default)
693 # can safely omit "pipe:", because it's the default)
694 *.gz = gzip
694 *.gz = gzip
695
695
696 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
696 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
697 with the name of a temporary file that contains the data to be
697 with the name of a temporary file that contains the data to be
698 filtered by the command. The string ``OUTFILE`` is replaced with the name
698 filtered by the command. The string ``OUTFILE`` is replaced with the name
699 of an empty temporary file, where the filtered data must be written by
699 of an empty temporary file, where the filtered data must be written by
700 the command.
700 the command.
701
701
702 .. container:: windows
702 .. container:: windows
703
703
704 .. note::
704 .. note::
705
705
706 The tempfile mechanism is recommended for Windows systems,
706 The tempfile mechanism is recommended for Windows systems,
707 where the standard shell I/O redirection operators often have
707 where the standard shell I/O redirection operators often have
708 strange effects and may corrupt the contents of your files.
708 strange effects and may corrupt the contents of your files.
709
709
710 This filter mechanism is used internally by the ``eol`` extension to
710 This filter mechanism is used internally by the ``eol`` extension to
711 translate line ending characters between Windows (CRLF) and Unix (LF)
711 translate line ending characters between Windows (CRLF) and Unix (LF)
712 format. We suggest you use the ``eol`` extension for convenience.
712 format. We suggest you use the ``eol`` extension for convenience.
713
713
714
714
715 ``defaults``
715 ``defaults``
716 ------------
716 ------------
717
717
718 (defaults are deprecated. Don't use them. Use aliases instead.)
718 (defaults are deprecated. Don't use them. Use aliases instead.)
719
719
720 Use the ``[defaults]`` section to define command defaults, i.e. the
720 Use the ``[defaults]`` section to define command defaults, i.e. the
721 default options/arguments to pass to the specified commands.
721 default options/arguments to pass to the specified commands.
722
722
723 The following example makes :hg:`log` run in verbose mode, and
723 The following example makes :hg:`log` run in verbose mode, and
724 :hg:`status` show only the modified files, by default::
724 :hg:`status` show only the modified files, by default::
725
725
726 [defaults]
726 [defaults]
727 log = -v
727 log = -v
728 status = -m
728 status = -m
729
729
730 The actual commands, instead of their aliases, must be used when
730 The actual commands, instead of their aliases, must be used when
731 defining command defaults. The command defaults will also be applied
731 defining command defaults. The command defaults will also be applied
732 to the aliases of the commands defined.
732 to the aliases of the commands defined.
733
733
734
734
735 ``diff``
735 ``diff``
736 --------
736 --------
737
737
738 Settings used when displaying diffs. Everything except for ``unified``
738 Settings used when displaying diffs. Everything except for ``unified``
739 is a Boolean and defaults to False. See :hg:`help config.annotate`
739 is a Boolean and defaults to False. See :hg:`help config.annotate`
740 for related options for the annotate command.
740 for related options for the annotate command.
741
741
742 ``git``
742 ``git``
743 Use git extended diff format.
743 Use git extended diff format.
744
744
745 ``nobinary``
745 ``nobinary``
746 Omit git binary patches.
746 Omit git binary patches.
747
747
748 ``nodates``
748 ``nodates``
749 Don't include dates in diff headers.
749 Don't include dates in diff headers.
750
750
751 ``noprefix``
751 ``noprefix``
752 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
752 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
753
753
754 ``showfunc``
754 ``showfunc``
755 Show which function each change is in.
755 Show which function each change is in.
756
756
757 ``ignorews``
757 ``ignorews``
758 Ignore white space when comparing lines.
758 Ignore white space when comparing lines.
759
759
760 ``ignorewsamount``
760 ``ignorewsamount``
761 Ignore changes in the amount of white space.
761 Ignore changes in the amount of white space.
762
762
763 ``ignoreblanklines``
763 ``ignoreblanklines``
764 Ignore changes whose lines are all blank.
764 Ignore changes whose lines are all blank.
765
765
766 ``unified``
766 ``unified``
767 Number of lines of context to show.
767 Number of lines of context to show.
768
768
769 ``word-diff``
769 ``word-diff``
770 Highlight changed words.
770 Highlight changed words.
771
771
772 ``email``
772 ``email``
773 ---------
773 ---------
774
774
775 Settings for extensions that send email messages.
775 Settings for extensions that send email messages.
776
776
777 ``from``
777 ``from``
778 Optional. Email address to use in "From" header and SMTP envelope
778 Optional. Email address to use in "From" header and SMTP envelope
779 of outgoing messages.
779 of outgoing messages.
780
780
781 ``to``
781 ``to``
782 Optional. Comma-separated list of recipients' email addresses.
782 Optional. Comma-separated list of recipients' email addresses.
783
783
784 ``cc``
784 ``cc``
785 Optional. Comma-separated list of carbon copy recipients'
785 Optional. Comma-separated list of carbon copy recipients'
786 email addresses.
786 email addresses.
787
787
788 ``bcc``
788 ``bcc``
789 Optional. Comma-separated list of blind carbon copy recipients'
789 Optional. Comma-separated list of blind carbon copy recipients'
790 email addresses.
790 email addresses.
791
791
792 ``method``
792 ``method``
793 Optional. Method to use to send email messages. If value is ``smtp``
793 Optional. Method to use to send email messages. If value is ``smtp``
794 (default), use SMTP (see the ``[smtp]`` section for configuration).
794 (default), use SMTP (see the ``[smtp]`` section for configuration).
795 Otherwise, use as name of program to run that acts like sendmail
795 Otherwise, use as name of program to run that acts like sendmail
796 (takes ``-f`` option for sender, list of recipients on command line,
796 (takes ``-f`` option for sender, list of recipients on command line,
797 message on stdin). Normally, setting this to ``sendmail`` or
797 message on stdin). Normally, setting this to ``sendmail`` or
798 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
798 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
799
799
800 ``charsets``
800 ``charsets``
801 Optional. Comma-separated list of character sets considered
801 Optional. Comma-separated list of character sets considered
802 convenient for recipients. Addresses, headers, and parts not
802 convenient for recipients. Addresses, headers, and parts not
803 containing patches of outgoing messages will be encoded in the
803 containing patches of outgoing messages will be encoded in the
804 first character set to which conversion from local encoding
804 first character set to which conversion from local encoding
805 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
805 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
806 conversion fails, the text in question is sent as is.
806 conversion fails, the text in question is sent as is.
807 (default: '')
807 (default: '')
808
808
809 Order of outgoing email character sets:
809 Order of outgoing email character sets:
810
810
811 1. ``us-ascii``: always first, regardless of settings
811 1. ``us-ascii``: always first, regardless of settings
812 2. ``email.charsets``: in order given by user
812 2. ``email.charsets``: in order given by user
813 3. ``ui.fallbackencoding``: if not in email.charsets
813 3. ``ui.fallbackencoding``: if not in email.charsets
814 4. ``$HGENCODING``: if not in email.charsets
814 4. ``$HGENCODING``: if not in email.charsets
815 5. ``utf-8``: always last, regardless of settings
815 5. ``utf-8``: always last, regardless of settings
816
816
817 Email example::
817 Email example::
818
818
819 [email]
819 [email]
820 from = Joseph User <joe.user@example.com>
820 from = Joseph User <joe.user@example.com>
821 method = /usr/sbin/sendmail
821 method = /usr/sbin/sendmail
822 # charsets for western Europeans
822 # charsets for western Europeans
823 # us-ascii, utf-8 omitted, as they are tried first and last
823 # us-ascii, utf-8 omitted, as they are tried first and last
824 charsets = iso-8859-1, iso-8859-15, windows-1252
824 charsets = iso-8859-1, iso-8859-15, windows-1252
825
825
826
826
827 ``extensions``
827 ``extensions``
828 --------------
828 --------------
829
829
830 Mercurial has an extension mechanism for adding new features. To
830 Mercurial has an extension mechanism for adding new features. To
831 enable an extension, create an entry for it in this section.
831 enable an extension, create an entry for it in this section.
832
832
833 If you know that the extension is already in Python's search path,
833 If you know that the extension is already in Python's search path,
834 you can give the name of the module, followed by ``=``, with nothing
834 you can give the name of the module, followed by ``=``, with nothing
835 after the ``=``.
835 after the ``=``.
836
836
837 Otherwise, give a name that you choose, followed by ``=``, followed by
837 Otherwise, give a name that you choose, followed by ``=``, followed by
838 the path to the ``.py`` file (including the file name extension) that
838 the path to the ``.py`` file (including the file name extension) that
839 defines the extension.
839 defines the extension.
840
840
841 To explicitly disable an extension that is enabled in an hgrc of
841 To explicitly disable an extension that is enabled in an hgrc of
842 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
842 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
843 or ``foo = !`` when path is not supplied.
843 or ``foo = !`` when path is not supplied.
844
844
845 Example for ``~/.hgrc``::
845 Example for ``~/.hgrc``::
846
846
847 [extensions]
847 [extensions]
848 # (the churn extension will get loaded from Mercurial's path)
848 # (the churn extension will get loaded from Mercurial's path)
849 churn =
849 churn =
850 # (this extension will get loaded from the file specified)
850 # (this extension will get loaded from the file specified)
851 myfeature = ~/.hgext/myfeature.py
851 myfeature = ~/.hgext/myfeature.py
852
852
853
853
854 ``format``
854 ``format``
855 ----------
855 ----------
856
856
857 Configuration that controls the repository format. Newer format options are more
857 Configuration that controls the repository format. Newer format options are more
858 powerful, but incompatible with some older versions of Mercurial. Format options
858 powerful, but incompatible with some older versions of Mercurial. Format options
859 are considered at repository initialization only. You need to make a new clone
859 are considered at repository initialization only. You need to make a new clone
860 for config changes to be taken into account.
860 for config changes to be taken into account.
861
861
862 For more details about repository format and version compatibility, see
862 For more details about repository format and version compatibility, see
863 https://www.mercurial-scm.org/wiki/MissingRequirement
863 https://www.mercurial-scm.org/wiki/MissingRequirement
864
864
865 ``usegeneraldelta``
865 ``usegeneraldelta``
866 Enable or disable the "generaldelta" repository format which improves
866 Enable or disable the "generaldelta" repository format which improves
867 repository compression by allowing "revlog" to store deltas against
867 repository compression by allowing "revlog" to store deltas against
868 arbitrary revisions instead of the previously stored one. This provides
868 arbitrary revisions instead of the previously stored one. This provides
869 significant improvement for repositories with branches.
869 significant improvement for repositories with branches.
870
870
871 Repositories with this on-disk format require Mercurial version 1.9.
871 Repositories with this on-disk format require Mercurial version 1.9.
872
872
873 Enabled by default.
873 Enabled by default.
874
874
875 ``dotencode``
875 ``dotencode``
876 Enable or disable the "dotencode" repository format which enhances
876 Enable or disable the "dotencode" repository format which enhances
877 the "fncache" repository format (which has to be enabled to use
877 the "fncache" repository format (which has to be enabled to use
878 dotencode) to avoid issues with filenames starting with "._" on
878 dotencode) to avoid issues with filenames starting with "._" on
879 Mac OS X and spaces on Windows.
879 Mac OS X and spaces on Windows.
880
880
881 Repositories with this on-disk format require Mercurial version 1.7.
881 Repositories with this on-disk format require Mercurial version 1.7.
882
882
883 Enabled by default.
883 Enabled by default.
884
884
885 ``usefncache``
885 ``usefncache``
886 Enable or disable the "fncache" repository format which enhances
886 Enable or disable the "fncache" repository format which enhances
887 the "store" repository format (which has to be enabled to use
887 the "store" repository format (which has to be enabled to use
888 fncache) to allow longer filenames and avoids using Windows
888 fncache) to allow longer filenames and avoids using Windows
889 reserved names, e.g. "nul".
889 reserved names, e.g. "nul".
890
890
891 Repositories with this on-disk format require Mercurial version 1.1.
891 Repositories with this on-disk format require Mercurial version 1.1.
892
892
893 Enabled by default.
893 Enabled by default.
894
894
895 ``use-persistent-nodemap``
895 ``use-persistent-nodemap``
896 Enable or disable the "persistent-nodemap" feature which improves
896 Enable or disable the "persistent-nodemap" feature which improves
897 performance if the rust extensions are available.
897 performance if the rust extensions are available.
898
898
899 The "persistence-nodemap" persist the "node -> rev" on disk removing the
899 The "persistence-nodemap" persist the "node -> rev" on disk removing the
900 need to dynamically build that mapping for each Mercurial invocation. This
900 need to dynamically build that mapping for each Mercurial invocation. This
901 significantly reduce the startup cost of various local and server-side
901 significantly reduce the startup cost of various local and server-side
902 operation for larger repository.
902 operation for larger repository.
903
903
904 The performance improving version of this feature is currently only
904 The performance improving version of this feature is currently only
905 implemented in Rust, so people not using a version of Mercurial compiled
905 implemented in Rust, so people not using a version of Mercurial compiled
906 with the Rust part might actually suffer some slowdown. For this reason,
906 with the Rust part might actually suffer some slowdown. For this reason,
907 Such version will by default refuse to access such repositories. That
907 Such version will by default refuse to access such repositories. That
908 behavior can be controlled by configuration. Check
908 behavior can be controlled by configuration. Check
909 :hg:`help config.storage.revlog.persistent-nodemap.slowpath` for details.
909 :hg:`help config.storage.revlog.persistent-nodemap.slowpath` for details.
910
910
911 Repository with this on-disk format require Mercurial version 5.4 or above.
911 Repository with this on-disk format require Mercurial version 5.4 or above.
912
912
913 Disabled by default.
913 Disabled by default.
914
914
915 ``use-share-safe``
915 ``use-share-safe``
916 Enforce "safe" behaviors for all "shares" that access this repository.
916 Enforce "safe" behaviors for all "shares" that access this repository.
917
917
918 With this feature, "shares" using this repository as a source will:
918 With this feature, "shares" using this repository as a source will:
919
919
920 * read the source repository's configuration (`<source>/.hg/hgrc`).
920 * read the source repository's configuration (`<source>/.hg/hgrc`).
921 * read and use the source repository's "requirements"
921 * read and use the source repository's "requirements"
922 (except the working copy specific one).
922 (except the working copy specific one).
923
923
924 Without this feature, "shares" using this repository as a source will:
924 Without this feature, "shares" using this repository as a source will:
925
925
926 * keep tracking the repository "requirements" in the share only, ignoring
926 * keep tracking the repository "requirements" in the share only, ignoring
927 the source "requirements", possibly diverging from them.
927 the source "requirements", possibly diverging from them.
928 * ignore source repository config. This can create problems, like silently
928 * ignore source repository config. This can create problems, like silently
929 ignoring important hooks.
929 ignoring important hooks.
930
930
931 Beware that existing shares will not be upgraded/downgraded, and by
931 Beware that existing shares will not be upgraded/downgraded, and by
932 default, Mercurial will refuse to interact with them until the mismatch
932 default, Mercurial will refuse to interact with them until the mismatch
933 is resolved. See :hg:`help config share.safe-mismatch.source-safe` and
933 is resolved. See :hg:`help config share.safe-mismatch.source-safe` and
934 :hg:`help config share.safe-mismatch.source-not-safe` for details.
934 :hg:`help config share.safe-mismatch.source-not-safe` for details.
935
935
936 Introduced in Mercurial 5.7.
936 Introduced in Mercurial 5.7.
937
937
938 Disabled by default.
938 Disabled by default.
939
939
940 ``usestore``
940 ``usestore``
941 Enable or disable the "store" repository format which improves
941 Enable or disable the "store" repository format which improves
942 compatibility with systems that fold case or otherwise mangle
942 compatibility with systems that fold case or otherwise mangle
943 filenames. Disabling this option will allow you to store longer filenames
943 filenames. Disabling this option will allow you to store longer filenames
944 in some situations at the expense of compatibility.
944 in some situations at the expense of compatibility.
945
945
946 Repositories with this on-disk format require Mercurial version 0.9.4.
946 Repositories with this on-disk format require Mercurial version 0.9.4.
947
947
948 Enabled by default.
948 Enabled by default.
949
949
950 ``sparse-revlog``
950 ``sparse-revlog``
951 Enable or disable the ``sparse-revlog`` delta strategy. This format improves
951 Enable or disable the ``sparse-revlog`` delta strategy. This format improves
952 delta re-use inside revlog. For very branchy repositories, it results in a
952 delta re-use inside revlog. For very branchy repositories, it results in a
953 smaller store. For repositories with many revisions, it also helps
953 smaller store. For repositories with many revisions, it also helps
954 performance (by using shortened delta chains.)
954 performance (by using shortened delta chains.)
955
955
956 Repositories with this on-disk format require Mercurial version 4.7
956 Repositories with this on-disk format require Mercurial version 4.7
957
957
958 Enabled by default.
958 Enabled by default.
959
959
960 ``revlog-compression``
960 ``revlog-compression``
961 Compression algorithm used by revlog. Supported values are `zlib` and
961 Compression algorithm used by revlog. Supported values are `zlib` and
962 `zstd`. The `zlib` engine is the historical default of Mercurial. `zstd` is
962 `zstd`. The `zlib` engine is the historical default of Mercurial. `zstd` is
963 a newer format that is usually a net win over `zlib`, operating faster at
963 a newer format that is usually a net win over `zlib`, operating faster at
964 better compression rates. Use `zstd` to reduce CPU usage. Multiple values
964 better compression rates. Use `zstd` to reduce CPU usage. Multiple values
965 can be specified, the first available one will be used.
965 can be specified, the first available one will be used.
966
966
967 On some systems, the Mercurial installation may lack `zstd` support.
967 On some systems, the Mercurial installation may lack `zstd` support.
968
968
969 Default is `zlib`.
969 Default is `zlib`.
970
970
971 ``bookmarks-in-store``
971 ``bookmarks-in-store``
972 Store bookmarks in .hg/store/. This means that bookmarks are shared when
972 Store bookmarks in .hg/store/. This means that bookmarks are shared when
973 using `hg share` regardless of the `-B` option.
973 using `hg share` regardless of the `-B` option.
974
974
975 Repositories with this on-disk format require Mercurial version 5.1.
975 Repositories with this on-disk format require Mercurial version 5.1.
976
976
977 Disabled by default.
977 Disabled by default.
978
978
979
979
980 ``graph``
980 ``graph``
981 ---------
981 ---------
982
982
983 Web graph view configuration. This section let you change graph
983 Web graph view configuration. This section let you change graph
984 elements display properties by branches, for instance to make the
984 elements display properties by branches, for instance to make the
985 ``default`` branch stand out.
985 ``default`` branch stand out.
986
986
987 Each line has the following format::
987 Each line has the following format::
988
988
989 <branch>.<argument> = <value>
989 <branch>.<argument> = <value>
990
990
991 where ``<branch>`` is the name of the branch being
991 where ``<branch>`` is the name of the branch being
992 customized. Example::
992 customized. Example::
993
993
994 [graph]
994 [graph]
995 # 2px width
995 # 2px width
996 default.width = 2
996 default.width = 2
997 # red color
997 # red color
998 default.color = FF0000
998 default.color = FF0000
999
999
1000 Supported arguments:
1000 Supported arguments:
1001
1001
1002 ``width``
1002 ``width``
1003 Set branch edges width in pixels.
1003 Set branch edges width in pixels.
1004
1004
1005 ``color``
1005 ``color``
1006 Set branch edges color in hexadecimal RGB notation.
1006 Set branch edges color in hexadecimal RGB notation.
1007
1007
1008 ``hooks``
1008 ``hooks``
1009 ---------
1009 ---------
1010
1010
1011 Commands or Python functions that get automatically executed by
1011 Commands or Python functions that get automatically executed by
1012 various actions such as starting or finishing a commit. Multiple
1012 various actions such as starting or finishing a commit. Multiple
1013 hooks can be run for the same action by appending a suffix to the
1013 hooks can be run for the same action by appending a suffix to the
1014 action. Overriding a site-wide hook can be done by changing its
1014 action. Overriding a site-wide hook can be done by changing its
1015 value or setting it to an empty string. Hooks can be prioritized
1015 value or setting it to an empty string. Hooks can be prioritized
1016 by adding a prefix of ``priority.`` to the hook name on a new line
1016 by adding a prefix of ``priority.`` to the hook name on a new line
1017 and setting the priority. The default priority is 0.
1017 and setting the priority. The default priority is 0.
1018
1018
1019 Example ``.hg/hgrc``::
1019 Example ``.hg/hgrc``::
1020
1020
1021 [hooks]
1021 [hooks]
1022 # update working directory after adding changesets
1022 # update working directory after adding changesets
1023 changegroup.update = hg update
1023 changegroup.update = hg update
1024 # do not use the site-wide hook
1024 # do not use the site-wide hook
1025 incoming =
1025 incoming =
1026 incoming.email = /my/email/hook
1026 incoming.email = /my/email/hook
1027 incoming.autobuild = /my/build/hook
1027 incoming.autobuild = /my/build/hook
1028 # force autobuild hook to run before other incoming hooks
1028 # force autobuild hook to run before other incoming hooks
1029 priority.incoming.autobuild = 1
1029 priority.incoming.autobuild = 1
1030 ### control HGPLAIN setting when running autobuild hook
1030 ### control HGPLAIN setting when running autobuild hook
1031 # HGPLAIN always set (default from Mercurial 5.7)
1031 # HGPLAIN always set (default from Mercurial 5.7)
1032 incoming.autobuild:run-with-plain = yes
1032 incoming.autobuild:run-with-plain = yes
1033 # HGPLAIN never set
1033 # HGPLAIN never set
1034 incoming.autobuild:run-with-plain = no
1034 incoming.autobuild:run-with-plain = no
1035 # HGPLAIN inherited from environment (default before Mercurila 5.7)
1035 # HGPLAIN inherited from environment (default before Mercurial 5.7)
1036 incoming.autobuild:run-with-plain = auto
1036 incoming.autobuild:run-with-plain = auto
1037
1037
1038 Most hooks are run with environment variables set that give useful
1038 Most hooks are run with environment variables set that give useful
1039 additional information. For each hook below, the environment variables
1039 additional information. For each hook below, the environment variables
1040 it is passed are listed with names in the form ``$HG_foo``. The
1040 it is passed are listed with names in the form ``$HG_foo``. The
1041 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
1041 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
1042 They contain the type of hook which triggered the run and the full name
1042 They contain the type of hook which triggered the run and the full name
1043 of the hook in the config, respectively. In the example above, this will
1043 of the hook in the config, respectively. In the example above, this will
1044 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
1044 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
1045
1045
1046 .. container:: windows
1046 .. container:: windows
1047
1047
1048 Some basic Unix syntax can be enabled for portability, including ``$VAR``
1048 Some basic Unix syntax can be enabled for portability, including ``$VAR``
1049 and ``${VAR}`` style variables. A ``~`` followed by ``\`` or ``/`` will
1049 and ``${VAR}`` style variables. A ``~`` followed by ``\`` or ``/`` will
1050 be expanded to ``%USERPROFILE%`` to simulate a subset of tilde expansion
1050 be expanded to ``%USERPROFILE%`` to simulate a subset of tilde expansion
1051 on Unix. To use a literal ``$`` or ``~``, it must be escaped with a back
1051 on Unix. To use a literal ``$`` or ``~``, it must be escaped with a back
1052 slash or inside of a strong quote. Strong quotes will be replaced by
1052 slash or inside of a strong quote. Strong quotes will be replaced by
1053 double quotes after processing.
1053 double quotes after processing.
1054
1054
1055 This feature is enabled by adding a prefix of ``tonative.`` to the hook
1055 This feature is enabled by adding a prefix of ``tonative.`` to the hook
1056 name on a new line, and setting it to ``True``. For example::
1056 name on a new line, and setting it to ``True``. For example::
1057
1057
1058 [hooks]
1058 [hooks]
1059 incoming.autobuild = /my/build/hook
1059 incoming.autobuild = /my/build/hook
1060 # enable translation to cmd.exe syntax for autobuild hook
1060 # enable translation to cmd.exe syntax for autobuild hook
1061 tonative.incoming.autobuild = True
1061 tonative.incoming.autobuild = True
1062
1062
1063 ``changegroup``
1063 ``changegroup``
1064 Run after a changegroup has been added via push, pull or unbundle. The ID of
1064 Run after a changegroup has been added via push, pull or unbundle. The ID of
1065 the first new changeset is in ``$HG_NODE`` and last is in ``$HG_NODE_LAST``.
1065 the first new changeset is in ``$HG_NODE`` and last is in ``$HG_NODE_LAST``.
1066 The URL from which changes came is in ``$HG_URL``.
1066 The URL from which changes came is in ``$HG_URL``.
1067
1067
1068 ``commit``
1068 ``commit``
1069 Run after a changeset has been created in the local repository. The ID
1069 Run after a changeset has been created in the local repository. The ID
1070 of the newly created changeset is in ``$HG_NODE``. Parent changeset
1070 of the newly created changeset is in ``$HG_NODE``. Parent changeset
1071 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1071 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1072
1072
1073 ``incoming``
1073 ``incoming``
1074 Run after a changeset has been pulled, pushed, or unbundled into
1074 Run after a changeset has been pulled, pushed, or unbundled into
1075 the local repository. The ID of the newly arrived changeset is in
1075 the local repository. The ID of the newly arrived changeset is in
1076 ``$HG_NODE``. The URL that was source of the changes is in ``$HG_URL``.
1076 ``$HG_NODE``. The URL that was source of the changes is in ``$HG_URL``.
1077
1077
1078 ``outgoing``
1078 ``outgoing``
1079 Run after sending changes from the local repository to another. The ID of
1079 Run after sending changes from the local repository to another. The ID of
1080 first changeset sent is in ``$HG_NODE``. The source of operation is in
1080 first changeset sent is in ``$HG_NODE``. The source of operation is in
1081 ``$HG_SOURCE``. Also see :hg:`help config.hooks.preoutgoing`.
1081 ``$HG_SOURCE``. Also see :hg:`help config.hooks.preoutgoing`.
1082
1082
1083 ``post-<command>``
1083 ``post-<command>``
1084 Run after successful invocations of the associated command. The
1084 Run after successful invocations of the associated command. The
1085 contents of the command line are passed as ``$HG_ARGS`` and the result
1085 contents of the command line are passed as ``$HG_ARGS`` and the result
1086 code in ``$HG_RESULT``. Parsed command line arguments are passed as
1086 code in ``$HG_RESULT``. Parsed command line arguments are passed as
1087 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
1087 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
1088 the python data internally passed to <command>. ``$HG_OPTS`` is a
1088 the python data internally passed to <command>. ``$HG_OPTS`` is a
1089 dictionary of options (with unspecified options set to their defaults).
1089 dictionary of options (with unspecified options set to their defaults).
1090 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
1090 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
1091
1091
1092 ``fail-<command>``
1092 ``fail-<command>``
1093 Run after a failed invocation of an associated command. The contents
1093 Run after a failed invocation of an associated command. The contents
1094 of the command line are passed as ``$HG_ARGS``. Parsed command line
1094 of the command line are passed as ``$HG_ARGS``. Parsed command line
1095 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
1095 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
1096 string representations of the python data internally passed to
1096 string representations of the python data internally passed to
1097 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
1097 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
1098 options set to their defaults). ``$HG_PATS`` is a list of arguments.
1098 options set to their defaults). ``$HG_PATS`` is a list of arguments.
1099 Hook failure is ignored.
1099 Hook failure is ignored.
1100
1100
1101 ``pre-<command>``
1101 ``pre-<command>``
1102 Run before executing the associated command. The contents of the
1102 Run before executing the associated command. The contents of the
1103 command line are passed as ``$HG_ARGS``. Parsed command line arguments
1103 command line are passed as ``$HG_ARGS``. Parsed command line arguments
1104 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
1104 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
1105 representations of the data internally passed to <command>. ``$HG_OPTS``
1105 representations of the data internally passed to <command>. ``$HG_OPTS``
1106 is a dictionary of options (with unspecified options set to their
1106 is a dictionary of options (with unspecified options set to their
1107 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
1107 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
1108 failure, the command doesn't execute and Mercurial returns the failure
1108 failure, the command doesn't execute and Mercurial returns the failure
1109 code.
1109 code.
1110
1110
1111 ``prechangegroup``
1111 ``prechangegroup``
1112 Run before a changegroup is added via push, pull or unbundle. Exit
1112 Run before a changegroup is added via push, pull or unbundle. Exit
1113 status 0 allows the changegroup to proceed. A non-zero status will
1113 status 0 allows the changegroup to proceed. A non-zero status will
1114 cause the push, pull or unbundle to fail. The URL from which changes
1114 cause the push, pull or unbundle to fail. The URL from which changes
1115 will come is in ``$HG_URL``.
1115 will come is in ``$HG_URL``.
1116
1116
1117 ``precommit``
1117 ``precommit``
1118 Run before starting a local commit. Exit status 0 allows the
1118 Run before starting a local commit. Exit status 0 allows the
1119 commit to proceed. A non-zero status will cause the commit to fail.
1119 commit to proceed. A non-zero status will cause the commit to fail.
1120 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1120 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1121
1121
1122 ``prelistkeys``
1122 ``prelistkeys``
1123 Run before listing pushkeys (like bookmarks) in the
1123 Run before listing pushkeys (like bookmarks) in the
1124 repository. A non-zero status will cause failure. The key namespace is
1124 repository. A non-zero status will cause failure. The key namespace is
1125 in ``$HG_NAMESPACE``.
1125 in ``$HG_NAMESPACE``.
1126
1126
1127 ``preoutgoing``
1127 ``preoutgoing``
1128 Run before collecting changes to send from the local repository to
1128 Run before collecting changes to send from the local repository to
1129 another. A non-zero status will cause failure. This lets you prevent
1129 another. A non-zero status will cause failure. This lets you prevent
1130 pull over HTTP or SSH. It can also prevent propagating commits (via
1130 pull over HTTP or SSH. It can also prevent propagating commits (via
1131 local pull, push (outbound) or bundle commands), but not completely,
1131 local pull, push (outbound) or bundle commands), but not completely,
1132 since you can just copy files instead. The source of operation is in
1132 since you can just copy files instead. The source of operation is in
1133 ``$HG_SOURCE``. If "serve", the operation is happening on behalf of a remote
1133 ``$HG_SOURCE``. If "serve", the operation is happening on behalf of a remote
1134 SSH or HTTP repository. If "push", "pull" or "bundle", the operation
1134 SSH or HTTP repository. If "push", "pull" or "bundle", the operation
1135 is happening on behalf of a repository on same system.
1135 is happening on behalf of a repository on same system.
1136
1136
1137 ``prepushkey``
1137 ``prepushkey``
1138 Run before a pushkey (like a bookmark) is added to the
1138 Run before a pushkey (like a bookmark) is added to the
1139 repository. A non-zero status will cause the key to be rejected. The
1139 repository. A non-zero status will cause the key to be rejected. The
1140 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
1140 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
1141 the old value (if any) is in ``$HG_OLD``, and the new value is in
1141 the old value (if any) is in ``$HG_OLD``, and the new value is in
1142 ``$HG_NEW``.
1142 ``$HG_NEW``.
1143
1143
1144 ``pretag``
1144 ``pretag``
1145 Run before creating a tag. Exit status 0 allows the tag to be
1145 Run before creating a tag. Exit status 0 allows the tag to be
1146 created. A non-zero status will cause the tag to fail. The ID of the
1146 created. A non-zero status will cause the tag to fail. The ID of the
1147 changeset to tag is in ``$HG_NODE``. The name of tag is in ``$HG_TAG``. The
1147 changeset to tag is in ``$HG_NODE``. The name of tag is in ``$HG_TAG``. The
1148 tag is local if ``$HG_LOCAL=1``, or in the repository if ``$HG_LOCAL=0``.
1148 tag is local if ``$HG_LOCAL=1``, or in the repository if ``$HG_LOCAL=0``.
1149
1149
1150 ``pretxnopen``
1150 ``pretxnopen``
1151 Run before any new repository transaction is open. The reason for the
1151 Run before any new repository transaction is open. The reason for the
1152 transaction will be in ``$HG_TXNNAME``, and a unique identifier for the
1152 transaction will be in ``$HG_TXNNAME``, and a unique identifier for the
1153 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
1153 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
1154 transaction from being opened.
1154 transaction from being opened.
1155
1155
1156 ``pretxnclose``
1156 ``pretxnclose``
1157 Run right before the transaction is actually finalized. Any repository change
1157 Run right before the transaction is actually finalized. Any repository change
1158 will be visible to the hook program. This lets you validate the transaction
1158 will be visible to the hook program. This lets you validate the transaction
1159 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1159 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1160 status will cause the transaction to be rolled back. The reason for the
1160 status will cause the transaction to be rolled back. The reason for the
1161 transaction opening will be in ``$HG_TXNNAME``, and a unique identifier for
1161 transaction opening will be in ``$HG_TXNNAME``, and a unique identifier for
1162 the transaction will be in ``HG_TXNID``. The rest of the available data will
1162 the transaction will be in ``HG_TXNID``. The rest of the available data will
1163 vary according the transaction type. New changesets will add ``$HG_NODE``
1163 vary according the transaction type. New changesets will add ``$HG_NODE``
1164 (the ID of the first added changeset), ``$HG_NODE_LAST`` (the ID of the last
1164 (the ID of the first added changeset), ``$HG_NODE_LAST`` (the ID of the last
1165 added changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables. Bookmark and
1165 added changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables. Bookmark and
1166 phase changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``
1166 phase changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``
1167 respectively, etc.
1167 respectively, etc.
1168
1168
1169 ``pretxnclose-bookmark``
1169 ``pretxnclose-bookmark``
1170 Run right before a bookmark change is actually finalized. Any repository
1170 Run right before a bookmark change is actually finalized. Any repository
1171 change will be visible to the hook program. This lets you validate the
1171 change will be visible to the hook program. This lets you validate the
1172 transaction content or change it. Exit status 0 allows the commit to
1172 transaction content or change it. Exit status 0 allows the commit to
1173 proceed. A non-zero status will cause the transaction to be rolled back.
1173 proceed. A non-zero status will cause the transaction to be rolled back.
1174 The name of the bookmark will be available in ``$HG_BOOKMARK``, the new
1174 The name of the bookmark will be available in ``$HG_BOOKMARK``, the new
1175 bookmark location will be available in ``$HG_NODE`` while the previous
1175 bookmark location will be available in ``$HG_NODE`` while the previous
1176 location will be available in ``$HG_OLDNODE``. In case of a bookmark
1176 location will be available in ``$HG_OLDNODE``. In case of a bookmark
1177 creation ``$HG_OLDNODE`` will be empty. In case of deletion ``$HG_NODE``
1177 creation ``$HG_OLDNODE`` will be empty. In case of deletion ``$HG_NODE``
1178 will be empty.
1178 will be empty.
1179 In addition, the reason for the transaction opening will be in
1179 In addition, the reason for the transaction opening will be in
1180 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1180 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1181 ``HG_TXNID``.
1181 ``HG_TXNID``.
1182
1182
1183 ``pretxnclose-phase``
1183 ``pretxnclose-phase``
1184 Run right before a phase change is actually finalized. Any repository change
1184 Run right before a phase change is actually finalized. Any repository change
1185 will be visible to the hook program. This lets you validate the transaction
1185 will be visible to the hook program. This lets you validate the transaction
1186 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1186 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1187 status will cause the transaction to be rolled back. The hook is called
1187 status will cause the transaction to be rolled back. The hook is called
1188 multiple times, once for each revision affected by a phase change.
1188 multiple times, once for each revision affected by a phase change.
1189 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1189 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1190 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1190 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1191 will be empty. In addition, the reason for the transaction opening will be in
1191 will be empty. In addition, the reason for the transaction opening will be in
1192 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1192 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1193 ``HG_TXNID``. The hook is also run for newly added revisions. In this case
1193 ``HG_TXNID``. The hook is also run for newly added revisions. In this case
1194 the ``$HG_OLDPHASE`` entry will be empty.
1194 the ``$HG_OLDPHASE`` entry will be empty.
1195
1195
1196 ``txnclose``
1196 ``txnclose``
1197 Run after any repository transaction has been committed. At this
1197 Run after any repository transaction has been committed. At this
1198 point, the transaction can no longer be rolled back. The hook will run
1198 point, the transaction can no longer be rolled back. The hook will run
1199 after the lock is released. See :hg:`help config.hooks.pretxnclose` for
1199 after the lock is released. See :hg:`help config.hooks.pretxnclose` for
1200 details about available variables.
1200 details about available variables.
1201
1201
1202 ``txnclose-bookmark``
1202 ``txnclose-bookmark``
1203 Run after any bookmark change has been committed. At this point, the
1203 Run after any bookmark change has been committed. At this point, the
1204 transaction can no longer be rolled back. The hook will run after the lock
1204 transaction can no longer be rolled back. The hook will run after the lock
1205 is released. See :hg:`help config.hooks.pretxnclose-bookmark` for details
1205 is released. See :hg:`help config.hooks.pretxnclose-bookmark` for details
1206 about available variables.
1206 about available variables.
1207
1207
1208 ``txnclose-phase``
1208 ``txnclose-phase``
1209 Run after any phase change has been committed. At this point, the
1209 Run after any phase change has been committed. At this point, the
1210 transaction can no longer be rolled back. The hook will run after the lock
1210 transaction can no longer be rolled back. The hook will run after the lock
1211 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1211 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1212 available variables.
1212 available variables.
1213
1213
1214 ``txnabort``
1214 ``txnabort``
1215 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
1215 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
1216 for details about available variables.
1216 for details about available variables.
1217
1217
1218 ``pretxnchangegroup``
1218 ``pretxnchangegroup``
1219 Run after a changegroup has been added via push, pull or unbundle, but before
1219 Run after a changegroup has been added via push, pull or unbundle, but before
1220 the transaction has been committed. The changegroup is visible to the hook
1220 the transaction has been committed. The changegroup is visible to the hook
1221 program. This allows validation of incoming changes before accepting them.
1221 program. This allows validation of incoming changes before accepting them.
1222 The ID of the first new changeset is in ``$HG_NODE`` and last is in
1222 The ID of the first new changeset is in ``$HG_NODE`` and last is in
1223 ``$HG_NODE_LAST``. Exit status 0 allows the transaction to commit. A non-zero
1223 ``$HG_NODE_LAST``. Exit status 0 allows the transaction to commit. A non-zero
1224 status will cause the transaction to be rolled back, and the push, pull or
1224 status will cause the transaction to be rolled back, and the push, pull or
1225 unbundle will fail. The URL that was the source of changes is in ``$HG_URL``.
1225 unbundle will fail. The URL that was the source of changes is in ``$HG_URL``.
1226
1226
1227 ``pretxncommit``
1227 ``pretxncommit``
1228 Run after a changeset has been created, but before the transaction is
1228 Run after a changeset has been created, but before the transaction is
1229 committed. The changeset is visible to the hook program. This allows
1229 committed. The changeset is visible to the hook program. This allows
1230 validation of the commit message and changes. Exit status 0 allows the
1230 validation of the commit message and changes. Exit status 0 allows the
1231 commit to proceed. A non-zero status will cause the transaction to
1231 commit to proceed. A non-zero status will cause the transaction to
1232 be rolled back. The ID of the new changeset is in ``$HG_NODE``. The parent
1232 be rolled back. The ID of the new changeset is in ``$HG_NODE``. The parent
1233 changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1233 changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1234
1234
1235 ``preupdate``
1235 ``preupdate``
1236 Run before updating the working directory. Exit status 0 allows
1236 Run before updating the working directory. Exit status 0 allows
1237 the update to proceed. A non-zero status will prevent the update.
1237 the update to proceed. A non-zero status will prevent the update.
1238 The changeset ID of first new parent is in ``$HG_PARENT1``. If updating to a
1238 The changeset ID of first new parent is in ``$HG_PARENT1``. If updating to a
1239 merge, the ID of second new parent is in ``$HG_PARENT2``.
1239 merge, the ID of second new parent is in ``$HG_PARENT2``.
1240
1240
1241 ``listkeys``
1241 ``listkeys``
1242 Run after listing pushkeys (like bookmarks) in the repository. The
1242 Run after listing pushkeys (like bookmarks) in the repository. The
1243 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1243 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1244 dictionary containing the keys and values.
1244 dictionary containing the keys and values.
1245
1245
1246 ``pushkey``
1246 ``pushkey``
1247 Run after a pushkey (like a bookmark) is added to the
1247 Run after a pushkey (like a bookmark) is added to the
1248 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1248 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1249 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1249 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1250 value is in ``$HG_NEW``.
1250 value is in ``$HG_NEW``.
1251
1251
1252 ``tag``
1252 ``tag``
1253 Run after a tag is created. The ID of the tagged changeset is in ``$HG_NODE``.
1253 Run after a tag is created. The ID of the tagged changeset is in ``$HG_NODE``.
1254 The name of tag is in ``$HG_TAG``. The tag is local if ``$HG_LOCAL=1``, or in
1254 The name of tag is in ``$HG_TAG``. The tag is local if ``$HG_LOCAL=1``, or in
1255 the repository if ``$HG_LOCAL=0``.
1255 the repository if ``$HG_LOCAL=0``.
1256
1256
1257 ``update``
1257 ``update``
1258 Run after updating the working directory. The changeset ID of first
1258 Run after updating the working directory. The changeset ID of first
1259 new parent is in ``$HG_PARENT1``. If updating to a merge, the ID of second new
1259 new parent is in ``$HG_PARENT1``. If updating to a merge, the ID of second new
1260 parent is in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1260 parent is in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1261 update failed (e.g. because conflicts were not resolved), ``$HG_ERROR=1``.
1261 update failed (e.g. because conflicts were not resolved), ``$HG_ERROR=1``.
1262
1262
1263 .. note::
1263 .. note::
1264
1264
1265 It is generally better to use standard hooks rather than the
1265 It is generally better to use standard hooks rather than the
1266 generic pre- and post- command hooks, as they are guaranteed to be
1266 generic pre- and post- command hooks, as they are guaranteed to be
1267 called in the appropriate contexts for influencing transactions.
1267 called in the appropriate contexts for influencing transactions.
1268 Also, hooks like "commit" will be called in all contexts that
1268 Also, hooks like "commit" will be called in all contexts that
1269 generate a commit (e.g. tag) and not just the commit command.
1269 generate a commit (e.g. tag) and not just the commit command.
1270
1270
1271 .. note::
1271 .. note::
1272
1272
1273 Environment variables with empty values may not be passed to
1273 Environment variables with empty values may not be passed to
1274 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1274 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1275 will have an empty value under Unix-like platforms for non-merge
1275 will have an empty value under Unix-like platforms for non-merge
1276 changesets, while it will not be available at all under Windows.
1276 changesets, while it will not be available at all under Windows.
1277
1277
1278 The syntax for Python hooks is as follows::
1278 The syntax for Python hooks is as follows::
1279
1279
1280 hookname = python:modulename.submodule.callable
1280 hookname = python:modulename.submodule.callable
1281 hookname = python:/path/to/python/module.py:callable
1281 hookname = python:/path/to/python/module.py:callable
1282
1282
1283 Python hooks are run within the Mercurial process. Each hook is
1283 Python hooks are run within the Mercurial process. Each hook is
1284 called with at least three keyword arguments: a ui object (keyword
1284 called with at least three keyword arguments: a ui object (keyword
1285 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1285 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1286 keyword that tells what kind of hook is used. Arguments listed as
1286 keyword that tells what kind of hook is used. Arguments listed as
1287 environment variables above are passed as keyword arguments, with no
1287 environment variables above are passed as keyword arguments, with no
1288 ``HG_`` prefix, and names in lower case.
1288 ``HG_`` prefix, and names in lower case.
1289
1289
1290 If a Python hook returns a "true" value or raises an exception, this
1290 If a Python hook returns a "true" value or raises an exception, this
1291 is treated as a failure.
1291 is treated as a failure.
1292
1292
1293
1293
1294 ``hostfingerprints``
1294 ``hostfingerprints``
1295 --------------------
1295 --------------------
1296
1296
1297 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1297 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1298
1298
1299 Fingerprints of the certificates of known HTTPS servers.
1299 Fingerprints of the certificates of known HTTPS servers.
1300
1300
1301 A HTTPS connection to a server with a fingerprint configured here will
1301 A HTTPS connection to a server with a fingerprint configured here will
1302 only succeed if the servers certificate matches the fingerprint.
1302 only succeed if the servers certificate matches the fingerprint.
1303 This is very similar to how ssh known hosts works.
1303 This is very similar to how ssh known hosts works.
1304
1304
1305 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1305 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1306 Multiple values can be specified (separated by spaces or commas). This can
1306 Multiple values can be specified (separated by spaces or commas). This can
1307 be used to define both old and new fingerprints while a host transitions
1307 be used to define both old and new fingerprints while a host transitions
1308 to a new certificate.
1308 to a new certificate.
1309
1309
1310 The CA chain and web.cacerts is not used for servers with a fingerprint.
1310 The CA chain and web.cacerts is not used for servers with a fingerprint.
1311
1311
1312 For example::
1312 For example::
1313
1313
1314 [hostfingerprints]
1314 [hostfingerprints]
1315 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1315 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1316 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1316 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1317
1317
1318 ``hostsecurity``
1318 ``hostsecurity``
1319 ----------------
1319 ----------------
1320
1320
1321 Used to specify global and per-host security settings for connecting to
1321 Used to specify global and per-host security settings for connecting to
1322 other machines.
1322 other machines.
1323
1323
1324 The following options control default behavior for all hosts.
1324 The following options control default behavior for all hosts.
1325
1325
1326 ``ciphers``
1326 ``ciphers``
1327 Defines the cryptographic ciphers to use for connections.
1327 Defines the cryptographic ciphers to use for connections.
1328
1328
1329 Value must be a valid OpenSSL Cipher List Format as documented at
1329 Value must be a valid OpenSSL Cipher List Format as documented at
1330 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1330 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1331
1331
1332 This setting is for advanced users only. Setting to incorrect values
1332 This setting is for advanced users only. Setting to incorrect values
1333 can significantly lower connection security or decrease performance.
1333 can significantly lower connection security or decrease performance.
1334 You have been warned.
1334 You have been warned.
1335
1335
1336 This option requires Python 2.7.
1336 This option requires Python 2.7.
1337
1337
1338 ``minimumprotocol``
1338 ``minimumprotocol``
1339 Defines the minimum channel encryption protocol to use.
1339 Defines the minimum channel encryption protocol to use.
1340
1340
1341 By default, the highest version of TLS supported by both client and server
1341 By default, the highest version of TLS supported by both client and server
1342 is used.
1342 is used.
1343
1343
1344 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1344 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1345
1345
1346 When running on an old Python version, only ``tls1.0`` is allowed since
1346 When running on an old Python version, only ``tls1.0`` is allowed since
1347 old versions of Python only support up to TLS 1.0.
1347 old versions of Python only support up to TLS 1.0.
1348
1348
1349 When running a Python that supports modern TLS versions, the default is
1349 When running a Python that supports modern TLS versions, the default is
1350 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1350 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1351 weakens security and should only be used as a feature of last resort if
1351 weakens security and should only be used as a feature of last resort if
1352 a server does not support TLS 1.1+.
1352 a server does not support TLS 1.1+.
1353
1353
1354 Options in the ``[hostsecurity]`` section can have the form
1354 Options in the ``[hostsecurity]`` section can have the form
1355 ``hostname``:``setting``. This allows multiple settings to be defined on a
1355 ``hostname``:``setting``. This allows multiple settings to be defined on a
1356 per-host basis.
1356 per-host basis.
1357
1357
1358 The following per-host settings can be defined.
1358 The following per-host settings can be defined.
1359
1359
1360 ``ciphers``
1360 ``ciphers``
1361 This behaves like ``ciphers`` as described above except it only applies
1361 This behaves like ``ciphers`` as described above except it only applies
1362 to the host on which it is defined.
1362 to the host on which it is defined.
1363
1363
1364 ``fingerprints``
1364 ``fingerprints``
1365 A list of hashes of the DER encoded peer/remote certificate. Values have
1365 A list of hashes of the DER encoded peer/remote certificate. Values have
1366 the form ``algorithm``:``fingerprint``. e.g.
1366 the form ``algorithm``:``fingerprint``. e.g.
1367 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1367 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1368 In addition, colons (``:``) can appear in the fingerprint part.
1368 In addition, colons (``:``) can appear in the fingerprint part.
1369
1369
1370 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1370 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1371 ``sha512``.
1371 ``sha512``.
1372
1372
1373 Use of ``sha256`` or ``sha512`` is preferred.
1373 Use of ``sha256`` or ``sha512`` is preferred.
1374
1374
1375 If a fingerprint is specified, the CA chain is not validated for this
1375 If a fingerprint is specified, the CA chain is not validated for this
1376 host and Mercurial will require the remote certificate to match one
1376 host and Mercurial will require the remote certificate to match one
1377 of the fingerprints specified. This means if the server updates its
1377 of the fingerprints specified. This means if the server updates its
1378 certificate, Mercurial will abort until a new fingerprint is defined.
1378 certificate, Mercurial will abort until a new fingerprint is defined.
1379 This can provide stronger security than traditional CA-based validation
1379 This can provide stronger security than traditional CA-based validation
1380 at the expense of convenience.
1380 at the expense of convenience.
1381
1381
1382 This option takes precedence over ``verifycertsfile``.
1382 This option takes precedence over ``verifycertsfile``.
1383
1383
1384 ``minimumprotocol``
1384 ``minimumprotocol``
1385 This behaves like ``minimumprotocol`` as described above except it
1385 This behaves like ``minimumprotocol`` as described above except it
1386 only applies to the host on which it is defined.
1386 only applies to the host on which it is defined.
1387
1387
1388 ``verifycertsfile``
1388 ``verifycertsfile``
1389 Path to file a containing a list of PEM encoded certificates used to
1389 Path to file a containing a list of PEM encoded certificates used to
1390 verify the server certificate. Environment variables and ``~user``
1390 verify the server certificate. Environment variables and ``~user``
1391 constructs are expanded in the filename.
1391 constructs are expanded in the filename.
1392
1392
1393 The server certificate or the certificate's certificate authority (CA)
1393 The server certificate or the certificate's certificate authority (CA)
1394 must match a certificate from this file or certificate verification
1394 must match a certificate from this file or certificate verification
1395 will fail and connections to the server will be refused.
1395 will fail and connections to the server will be refused.
1396
1396
1397 If defined, only certificates provided by this file will be used:
1397 If defined, only certificates provided by this file will be used:
1398 ``web.cacerts`` and any system/default certificates will not be
1398 ``web.cacerts`` and any system/default certificates will not be
1399 used.
1399 used.
1400
1400
1401 This option has no effect if the per-host ``fingerprints`` option
1401 This option has no effect if the per-host ``fingerprints`` option
1402 is set.
1402 is set.
1403
1403
1404 The format of the file is as follows::
1404 The format of the file is as follows::
1405
1405
1406 -----BEGIN CERTIFICATE-----
1406 -----BEGIN CERTIFICATE-----
1407 ... (certificate in base64 PEM encoding) ...
1407 ... (certificate in base64 PEM encoding) ...
1408 -----END CERTIFICATE-----
1408 -----END CERTIFICATE-----
1409 -----BEGIN CERTIFICATE-----
1409 -----BEGIN CERTIFICATE-----
1410 ... (certificate in base64 PEM encoding) ...
1410 ... (certificate in base64 PEM encoding) ...
1411 -----END CERTIFICATE-----
1411 -----END CERTIFICATE-----
1412
1412
1413 For example::
1413 For example::
1414
1414
1415 [hostsecurity]
1415 [hostsecurity]
1416 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1416 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1417 hg2.example.com:fingerprints = sha1:914f1aff87249c09b6859b88b1906d30756491ca, sha1:fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1417 hg2.example.com:fingerprints = sha1:914f1aff87249c09b6859b88b1906d30756491ca, sha1:fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1418 hg3.example.com:fingerprints = sha256:9a:b0:dc:e2:75:ad:8a:b7:84:58:e5:1f:07:32:f1:87:e6:bd:24:22:af:b7:ce:8e:9c:b4:10:cf:b9:f4:0e:d2
1418 hg3.example.com:fingerprints = sha256:9a:b0:dc:e2:75:ad:8a:b7:84:58:e5:1f:07:32:f1:87:e6:bd:24:22:af:b7:ce:8e:9c:b4:10:cf:b9:f4:0e:d2
1419 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1419 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1420
1420
1421 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1421 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1422 when connecting to ``hg.example.com``::
1422 when connecting to ``hg.example.com``::
1423
1423
1424 [hostsecurity]
1424 [hostsecurity]
1425 minimumprotocol = tls1.2
1425 minimumprotocol = tls1.2
1426 hg.example.com:minimumprotocol = tls1.1
1426 hg.example.com:minimumprotocol = tls1.1
1427
1427
1428 ``http_proxy``
1428 ``http_proxy``
1429 --------------
1429 --------------
1430
1430
1431 Used to access web-based Mercurial repositories through a HTTP
1431 Used to access web-based Mercurial repositories through a HTTP
1432 proxy.
1432 proxy.
1433
1433
1434 ``host``
1434 ``host``
1435 Host name and (optional) port of the proxy server, for example
1435 Host name and (optional) port of the proxy server, for example
1436 "myproxy:8000".
1436 "myproxy:8000".
1437
1437
1438 ``no``
1438 ``no``
1439 Optional. Comma-separated list of host names that should bypass
1439 Optional. Comma-separated list of host names that should bypass
1440 the proxy.
1440 the proxy.
1441
1441
1442 ``passwd``
1442 ``passwd``
1443 Optional. Password to authenticate with at the proxy server.
1443 Optional. Password to authenticate with at the proxy server.
1444
1444
1445 ``user``
1445 ``user``
1446 Optional. User name to authenticate with at the proxy server.
1446 Optional. User name to authenticate with at the proxy server.
1447
1447
1448 ``always``
1448 ``always``
1449 Optional. Always use the proxy, even for localhost and any entries
1449 Optional. Always use the proxy, even for localhost and any entries
1450 in ``http_proxy.no``. (default: False)
1450 in ``http_proxy.no``. (default: False)
1451
1451
1452 ``http``
1452 ``http``
1453 ----------
1453 ----------
1454
1454
1455 Used to configure access to Mercurial repositories via HTTP.
1455 Used to configure access to Mercurial repositories via HTTP.
1456
1456
1457 ``timeout``
1457 ``timeout``
1458 If set, blocking operations will timeout after that many seconds.
1458 If set, blocking operations will timeout after that many seconds.
1459 (default: None)
1459 (default: None)
1460
1460
1461 ``merge``
1461 ``merge``
1462 ---------
1462 ---------
1463
1463
1464 This section specifies behavior during merges and updates.
1464 This section specifies behavior during merges and updates.
1465
1465
1466 ``checkignored``
1466 ``checkignored``
1467 Controls behavior when an ignored file on disk has the same name as a tracked
1467 Controls behavior when an ignored file on disk has the same name as a tracked
1468 file in the changeset being merged or updated to, and has different
1468 file in the changeset being merged or updated to, and has different
1469 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1469 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1470 abort on such files. With ``warn``, warn on such files and back them up as
1470 abort on such files. With ``warn``, warn on such files and back them up as
1471 ``.orig``. With ``ignore``, don't print a warning and back them up as
1471 ``.orig``. With ``ignore``, don't print a warning and back them up as
1472 ``.orig``. (default: ``abort``)
1472 ``.orig``. (default: ``abort``)
1473
1473
1474 ``checkunknown``
1474 ``checkunknown``
1475 Controls behavior when an unknown file that isn't ignored has the same name
1475 Controls behavior when an unknown file that isn't ignored has the same name
1476 as a tracked file in the changeset being merged or updated to, and has
1476 as a tracked file in the changeset being merged or updated to, and has
1477 different contents. Similar to ``merge.checkignored``, except for files that
1477 different contents. Similar to ``merge.checkignored``, except for files that
1478 are not ignored. (default: ``abort``)
1478 are not ignored. (default: ``abort``)
1479
1479
1480 ``on-failure``
1480 ``on-failure``
1481 When set to ``continue`` (the default), the merge process attempts to
1481 When set to ``continue`` (the default), the merge process attempts to
1482 merge all unresolved files using the merge chosen tool, regardless of
1482 merge all unresolved files using the merge chosen tool, regardless of
1483 whether previous file merge attempts during the process succeeded or not.
1483 whether previous file merge attempts during the process succeeded or not.
1484 Setting this to ``prompt`` will prompt after any merge failure continue
1484 Setting this to ``prompt`` will prompt after any merge failure continue
1485 or halt the merge process. Setting this to ``halt`` will automatically
1485 or halt the merge process. Setting this to ``halt`` will automatically
1486 halt the merge process on any merge tool failure. The merge process
1486 halt the merge process on any merge tool failure. The merge process
1487 can be restarted by using the ``resolve`` command. When a merge is
1487 can be restarted by using the ``resolve`` command. When a merge is
1488 halted, the repository is left in a normal ``unresolved`` merge state.
1488 halted, the repository is left in a normal ``unresolved`` merge state.
1489 (default: ``continue``)
1489 (default: ``continue``)
1490
1490
1491 ``strict-capability-check``
1491 ``strict-capability-check``
1492 Whether capabilities of internal merge tools are checked strictly
1492 Whether capabilities of internal merge tools are checked strictly
1493 or not, while examining rules to decide merge tool to be used.
1493 or not, while examining rules to decide merge tool to be used.
1494 (default: False)
1494 (default: False)
1495
1495
1496 ``merge-patterns``
1496 ``merge-patterns``
1497 ------------------
1497 ------------------
1498
1498
1499 This section specifies merge tools to associate with particular file
1499 This section specifies merge tools to associate with particular file
1500 patterns. Tools matched here will take precedence over the default
1500 patterns. Tools matched here will take precedence over the default
1501 merge tool. Patterns are globs by default, rooted at the repository
1501 merge tool. Patterns are globs by default, rooted at the repository
1502 root.
1502 root.
1503
1503
1504 Example::
1504 Example::
1505
1505
1506 [merge-patterns]
1506 [merge-patterns]
1507 **.c = kdiff3
1507 **.c = kdiff3
1508 **.jpg = myimgmerge
1508 **.jpg = myimgmerge
1509
1509
1510 ``merge-tools``
1510 ``merge-tools``
1511 ---------------
1511 ---------------
1512
1512
1513 This section configures external merge tools to use for file-level
1513 This section configures external merge tools to use for file-level
1514 merges. This section has likely been preconfigured at install time.
1514 merges. This section has likely been preconfigured at install time.
1515 Use :hg:`config merge-tools` to check the existing configuration.
1515 Use :hg:`config merge-tools` to check the existing configuration.
1516 Also see :hg:`help merge-tools` for more details.
1516 Also see :hg:`help merge-tools` for more details.
1517
1517
1518 Example ``~/.hgrc``::
1518 Example ``~/.hgrc``::
1519
1519
1520 [merge-tools]
1520 [merge-tools]
1521 # Override stock tool location
1521 # Override stock tool location
1522 kdiff3.executable = ~/bin/kdiff3
1522 kdiff3.executable = ~/bin/kdiff3
1523 # Specify command line
1523 # Specify command line
1524 kdiff3.args = $base $local $other -o $output
1524 kdiff3.args = $base $local $other -o $output
1525 # Give higher priority
1525 # Give higher priority
1526 kdiff3.priority = 1
1526 kdiff3.priority = 1
1527
1527
1528 # Changing the priority of preconfigured tool
1528 # Changing the priority of preconfigured tool
1529 meld.priority = 0
1529 meld.priority = 0
1530
1530
1531 # Disable a preconfigured tool
1531 # Disable a preconfigured tool
1532 vimdiff.disabled = yes
1532 vimdiff.disabled = yes
1533
1533
1534 # Define new tool
1534 # Define new tool
1535 myHtmlTool.args = -m $local $other $base $output
1535 myHtmlTool.args = -m $local $other $base $output
1536 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1536 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1537 myHtmlTool.priority = 1
1537 myHtmlTool.priority = 1
1538
1538
1539 Supported arguments:
1539 Supported arguments:
1540
1540
1541 ``priority``
1541 ``priority``
1542 The priority in which to evaluate this tool.
1542 The priority in which to evaluate this tool.
1543 (default: 0)
1543 (default: 0)
1544
1544
1545 ``executable``
1545 ``executable``
1546 Either just the name of the executable or its pathname.
1546 Either just the name of the executable or its pathname.
1547
1547
1548 .. container:: windows
1548 .. container:: windows
1549
1549
1550 On Windows, the path can use environment variables with ${ProgramFiles}
1550 On Windows, the path can use environment variables with ${ProgramFiles}
1551 syntax.
1551 syntax.
1552
1552
1553 (default: the tool name)
1553 (default: the tool name)
1554
1554
1555 ``args``
1555 ``args``
1556 The arguments to pass to the tool executable. You can refer to the
1556 The arguments to pass to the tool executable. You can refer to the
1557 files being merged as well as the output file through these
1557 files being merged as well as the output file through these
1558 variables: ``$base``, ``$local``, ``$other``, ``$output``.
1558 variables: ``$base``, ``$local``, ``$other``, ``$output``.
1559
1559
1560 The meaning of ``$local`` and ``$other`` can vary depending on which action is
1560 The meaning of ``$local`` and ``$other`` can vary depending on which action is
1561 being performed. During an update or merge, ``$local`` represents the original
1561 being performed. During an update or merge, ``$local`` represents the original
1562 state of the file, while ``$other`` represents the commit you are updating to or
1562 state of the file, while ``$other`` represents the commit you are updating to or
1563 the commit you are merging with. During a rebase, ``$local`` represents the
1563 the commit you are merging with. During a rebase, ``$local`` represents the
1564 destination of the rebase, and ``$other`` represents the commit being rebased.
1564 destination of the rebase, and ``$other`` represents the commit being rebased.
1565
1565
1566 Some operations define custom labels to assist with identifying the revisions,
1566 Some operations define custom labels to assist with identifying the revisions,
1567 accessible via ``$labellocal``, ``$labelother``, and ``$labelbase``. If custom
1567 accessible via ``$labellocal``, ``$labelother``, and ``$labelbase``. If custom
1568 labels are not available, these will be ``local``, ``other``, and ``base``,
1568 labels are not available, these will be ``local``, ``other``, and ``base``,
1569 respectively.
1569 respectively.
1570 (default: ``$local $base $other``)
1570 (default: ``$local $base $other``)
1571
1571
1572 ``premerge``
1572 ``premerge``
1573 Attempt to run internal non-interactive 3-way merge tool before
1573 Attempt to run internal non-interactive 3-way merge tool before
1574 launching external tool. Options are ``true``, ``false``, ``keep``,
1574 launching external tool. Options are ``true``, ``false``, ``keep``,
1575 ``keep-merge3``, or ``keep-mergediff`` (experimental). The ``keep`` option
1575 ``keep-merge3``, or ``keep-mergediff`` (experimental). The ``keep`` option
1576 will leave markers in the file if the premerge fails. The ``keep-merge3``
1576 will leave markers in the file if the premerge fails. The ``keep-merge3``
1577 will do the same but include information about the base of the merge in the
1577 will do the same but include information about the base of the merge in the
1578 marker (see internal :merge3 in :hg:`help merge-tools`). The
1578 marker (see internal :merge3 in :hg:`help merge-tools`). The
1579 ``keep-mergediff`` option is similar but uses a different marker style
1579 ``keep-mergediff`` option is similar but uses a different marker style
1580 (see internal :merge3 in :hg:`help merge-tools`). (default: True)
1580 (see internal :merge3 in :hg:`help merge-tools`). (default: True)
1581
1581
1582 ``binary``
1582 ``binary``
1583 This tool can merge binary files. (default: False, unless tool
1583 This tool can merge binary files. (default: False, unless tool
1584 was selected by file pattern match)
1584 was selected by file pattern match)
1585
1585
1586 ``symlink``
1586 ``symlink``
1587 This tool can merge symlinks. (default: False)
1587 This tool can merge symlinks. (default: False)
1588
1588
1589 ``check``
1589 ``check``
1590 A list of merge success-checking options:
1590 A list of merge success-checking options:
1591
1591
1592 ``changed``
1592 ``changed``
1593 Ask whether merge was successful when the merged file shows no changes.
1593 Ask whether merge was successful when the merged file shows no changes.
1594 ``conflicts``
1594 ``conflicts``
1595 Check whether there are conflicts even though the tool reported success.
1595 Check whether there are conflicts even though the tool reported success.
1596 ``prompt``
1596 ``prompt``
1597 Always prompt for merge success, regardless of success reported by tool.
1597 Always prompt for merge success, regardless of success reported by tool.
1598
1598
1599 ``fixeol``
1599 ``fixeol``
1600 Attempt to fix up EOL changes caused by the merge tool.
1600 Attempt to fix up EOL changes caused by the merge tool.
1601 (default: False)
1601 (default: False)
1602
1602
1603 ``gui``
1603 ``gui``
1604 This tool requires a graphical interface to run. (default: False)
1604 This tool requires a graphical interface to run. (default: False)
1605
1605
1606 ``mergemarkers``
1606 ``mergemarkers``
1607 Controls whether the labels passed via ``$labellocal``, ``$labelother``, and
1607 Controls whether the labels passed via ``$labellocal``, ``$labelother``, and
1608 ``$labelbase`` are ``detailed`` (respecting ``mergemarkertemplate``) or
1608 ``$labelbase`` are ``detailed`` (respecting ``mergemarkertemplate``) or
1609 ``basic``. If ``premerge`` is ``keep`` or ``keep-merge3``, the conflict
1609 ``basic``. If ``premerge`` is ``keep`` or ``keep-merge3``, the conflict
1610 markers generated during premerge will be ``detailed`` if either this option or
1610 markers generated during premerge will be ``detailed`` if either this option or
1611 the corresponding option in the ``[ui]`` section is ``detailed``.
1611 the corresponding option in the ``[ui]`` section is ``detailed``.
1612 (default: ``basic``)
1612 (default: ``basic``)
1613
1613
1614 ``mergemarkertemplate``
1614 ``mergemarkertemplate``
1615 This setting can be used to override ``mergemarker`` from the
1615 This setting can be used to override ``mergemarker`` from the
1616 ``[command-templates]`` section on a per-tool basis; this applies to the
1616 ``[command-templates]`` section on a per-tool basis; this applies to the
1617 ``$label``-prefixed variables and to the conflict markers that are generated
1617 ``$label``-prefixed variables and to the conflict markers that are generated
1618 if ``premerge`` is ``keep` or ``keep-merge3``. See the corresponding variable
1618 if ``premerge`` is ``keep` or ``keep-merge3``. See the corresponding variable
1619 in ``[ui]`` for more information.
1619 in ``[ui]`` for more information.
1620
1620
1621 .. container:: windows
1621 .. container:: windows
1622
1622
1623 ``regkey``
1623 ``regkey``
1624 Windows registry key which describes install location of this
1624 Windows registry key which describes install location of this
1625 tool. Mercurial will search for this key first under
1625 tool. Mercurial will search for this key first under
1626 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1626 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1627 (default: None)
1627 (default: None)
1628
1628
1629 ``regkeyalt``
1629 ``regkeyalt``
1630 An alternate Windows registry key to try if the first key is not
1630 An alternate Windows registry key to try if the first key is not
1631 found. The alternate key uses the same ``regname`` and ``regappend``
1631 found. The alternate key uses the same ``regname`` and ``regappend``
1632 semantics of the primary key. The most common use for this key
1632 semantics of the primary key. The most common use for this key
1633 is to search for 32bit applications on 64bit operating systems.
1633 is to search for 32bit applications on 64bit operating systems.
1634 (default: None)
1634 (default: None)
1635
1635
1636 ``regname``
1636 ``regname``
1637 Name of value to read from specified registry key.
1637 Name of value to read from specified registry key.
1638 (default: the unnamed (default) value)
1638 (default: the unnamed (default) value)
1639
1639
1640 ``regappend``
1640 ``regappend``
1641 String to append to the value read from the registry, typically
1641 String to append to the value read from the registry, typically
1642 the executable name of the tool.
1642 the executable name of the tool.
1643 (default: None)
1643 (default: None)
1644
1644
1645 ``pager``
1645 ``pager``
1646 ---------
1646 ---------
1647
1647
1648 Setting used to control when to paginate and with what external tool. See
1648 Setting used to control when to paginate and with what external tool. See
1649 :hg:`help pager` for details.
1649 :hg:`help pager` for details.
1650
1650
1651 ``pager``
1651 ``pager``
1652 Define the external tool used as pager.
1652 Define the external tool used as pager.
1653
1653
1654 If no pager is set, Mercurial uses the environment variable $PAGER.
1654 If no pager is set, Mercurial uses the environment variable $PAGER.
1655 If neither pager.pager, nor $PAGER is set, a default pager will be
1655 If neither pager.pager, nor $PAGER is set, a default pager will be
1656 used, typically `less` on Unix and `more` on Windows. Example::
1656 used, typically `less` on Unix and `more` on Windows. Example::
1657
1657
1658 [pager]
1658 [pager]
1659 pager = less -FRX
1659 pager = less -FRX
1660
1660
1661 ``ignore``
1661 ``ignore``
1662 List of commands to disable the pager for. Example::
1662 List of commands to disable the pager for. Example::
1663
1663
1664 [pager]
1664 [pager]
1665 ignore = version, help, update
1665 ignore = version, help, update
1666
1666
1667 ``patch``
1667 ``patch``
1668 ---------
1668 ---------
1669
1669
1670 Settings used when applying patches, for instance through the 'import'
1670 Settings used when applying patches, for instance through the 'import'
1671 command or with Mercurial Queues extension.
1671 command or with Mercurial Queues extension.
1672
1672
1673 ``eol``
1673 ``eol``
1674 When set to 'strict' patch content and patched files end of lines
1674 When set to 'strict' patch content and patched files end of lines
1675 are preserved. When set to ``lf`` or ``crlf``, both files end of
1675 are preserved. When set to ``lf`` or ``crlf``, both files end of
1676 lines are ignored when patching and the result line endings are
1676 lines are ignored when patching and the result line endings are
1677 normalized to either LF (Unix) or CRLF (Windows). When set to
1677 normalized to either LF (Unix) or CRLF (Windows). When set to
1678 ``auto``, end of lines are again ignored while patching but line
1678 ``auto``, end of lines are again ignored while patching but line
1679 endings in patched files are normalized to their original setting
1679 endings in patched files are normalized to their original setting
1680 on a per-file basis. If target file does not exist or has no end
1680 on a per-file basis. If target file does not exist or has no end
1681 of line, patch line endings are preserved.
1681 of line, patch line endings are preserved.
1682 (default: strict)
1682 (default: strict)
1683
1683
1684 ``fuzz``
1684 ``fuzz``
1685 The number of lines of 'fuzz' to allow when applying patches. This
1685 The number of lines of 'fuzz' to allow when applying patches. This
1686 controls how much context the patcher is allowed to ignore when
1686 controls how much context the patcher is allowed to ignore when
1687 trying to apply a patch.
1687 trying to apply a patch.
1688 (default: 2)
1688 (default: 2)
1689
1689
1690 ``paths``
1690 ``paths``
1691 ---------
1691 ---------
1692
1692
1693 Assigns symbolic names and behavior to repositories.
1693 Assigns symbolic names and behavior to repositories.
1694
1694
1695 Options are symbolic names defining the URL or directory that is the
1695 Options are symbolic names defining the URL or directory that is the
1696 location of the repository. Example::
1696 location of the repository. Example::
1697
1697
1698 [paths]
1698 [paths]
1699 my_server = https://example.com/my_repo
1699 my_server = https://example.com/my_repo
1700 local_path = /home/me/repo
1700 local_path = /home/me/repo
1701
1701
1702 These symbolic names can be used from the command line. To pull
1702 These symbolic names can be used from the command line. To pull
1703 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1703 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1704 :hg:`push local_path`.
1704 :hg:`push local_path`.
1705
1705
1706 Options containing colons (``:``) denote sub-options that can influence
1706 Options containing colons (``:``) denote sub-options that can influence
1707 behavior for that specific path. Example::
1707 behavior for that specific path. Example::
1708
1708
1709 [paths]
1709 [paths]
1710 my_server = https://example.com/my_path
1710 my_server = https://example.com/my_path
1711 my_server:pushurl = ssh://example.com/my_path
1711 my_server:pushurl = ssh://example.com/my_path
1712
1712
1713 The following sub-options can be defined:
1713 The following sub-options can be defined:
1714
1714
1715 ``pushurl``
1715 ``pushurl``
1716 The URL to use for push operations. If not defined, the location
1716 The URL to use for push operations. If not defined, the location
1717 defined by the path's main entry is used.
1717 defined by the path's main entry is used.
1718
1718
1719 ``pushrev``
1719 ``pushrev``
1720 A revset defining which revisions to push by default.
1720 A revset defining which revisions to push by default.
1721
1721
1722 When :hg:`push` is executed without a ``-r`` argument, the revset
1722 When :hg:`push` is executed without a ``-r`` argument, the revset
1723 defined by this sub-option is evaluated to determine what to push.
1723 defined by this sub-option is evaluated to determine what to push.
1724
1724
1725 For example, a value of ``.`` will push the working directory's
1725 For example, a value of ``.`` will push the working directory's
1726 revision by default.
1726 revision by default.
1727
1727
1728 Revsets specifying bookmarks will not result in the bookmark being
1728 Revsets specifying bookmarks will not result in the bookmark being
1729 pushed.
1729 pushed.
1730
1730
1731 The following special named paths exist:
1731 The following special named paths exist:
1732
1732
1733 ``default``
1733 ``default``
1734 The URL or directory to use when no source or remote is specified.
1734 The URL or directory to use when no source or remote is specified.
1735
1735
1736 :hg:`clone` will automatically define this path to the location the
1736 :hg:`clone` will automatically define this path to the location the
1737 repository was cloned from.
1737 repository was cloned from.
1738
1738
1739 ``default-push``
1739 ``default-push``
1740 (deprecated) The URL or directory for the default :hg:`push` location.
1740 (deprecated) The URL or directory for the default :hg:`push` location.
1741 ``default:pushurl`` should be used instead.
1741 ``default:pushurl`` should be used instead.
1742
1742
1743 ``phases``
1743 ``phases``
1744 ----------
1744 ----------
1745
1745
1746 Specifies default handling of phases. See :hg:`help phases` for more
1746 Specifies default handling of phases. See :hg:`help phases` for more
1747 information about working with phases.
1747 information about working with phases.
1748
1748
1749 ``publish``
1749 ``publish``
1750 Controls draft phase behavior when working as a server. When true,
1750 Controls draft phase behavior when working as a server. When true,
1751 pushed changesets are set to public in both client and server and
1751 pushed changesets are set to public in both client and server and
1752 pulled or cloned changesets are set to public in the client.
1752 pulled or cloned changesets are set to public in the client.
1753 (default: True)
1753 (default: True)
1754
1754
1755 ``new-commit``
1755 ``new-commit``
1756 Phase of newly-created commits.
1756 Phase of newly-created commits.
1757 (default: draft)
1757 (default: draft)
1758
1758
1759 ``checksubrepos``
1759 ``checksubrepos``
1760 Check the phase of the current revision of each subrepository. Allowed
1760 Check the phase of the current revision of each subrepository. Allowed
1761 values are "ignore", "follow" and "abort". For settings other than
1761 values are "ignore", "follow" and "abort". For settings other than
1762 "ignore", the phase of the current revision of each subrepository is
1762 "ignore", the phase of the current revision of each subrepository is
1763 checked before committing the parent repository. If any of those phases is
1763 checked before committing the parent repository. If any of those phases is
1764 greater than the phase of the parent repository (e.g. if a subrepo is in a
1764 greater than the phase of the parent repository (e.g. if a subrepo is in a
1765 "secret" phase while the parent repo is in "draft" phase), the commit is
1765 "secret" phase while the parent repo is in "draft" phase), the commit is
1766 either aborted (if checksubrepos is set to "abort") or the higher phase is
1766 either aborted (if checksubrepos is set to "abort") or the higher phase is
1767 used for the parent repository commit (if set to "follow").
1767 used for the parent repository commit (if set to "follow").
1768 (default: follow)
1768 (default: follow)
1769
1769
1770
1770
1771 ``profiling``
1771 ``profiling``
1772 -------------
1772 -------------
1773
1773
1774 Specifies profiling type, format, and file output. Two profilers are
1774 Specifies profiling type, format, and file output. Two profilers are
1775 supported: an instrumenting profiler (named ``ls``), and a sampling
1775 supported: an instrumenting profiler (named ``ls``), and a sampling
1776 profiler (named ``stat``).
1776 profiler (named ``stat``).
1777
1777
1778 In this section description, 'profiling data' stands for the raw data
1778 In this section description, 'profiling data' stands for the raw data
1779 collected during profiling, while 'profiling report' stands for a
1779 collected during profiling, while 'profiling report' stands for a
1780 statistical text report generated from the profiling data.
1780 statistical text report generated from the profiling data.
1781
1781
1782 ``enabled``
1782 ``enabled``
1783 Enable the profiler.
1783 Enable the profiler.
1784 (default: false)
1784 (default: false)
1785
1785
1786 This is equivalent to passing ``--profile`` on the command line.
1786 This is equivalent to passing ``--profile`` on the command line.
1787
1787
1788 ``type``
1788 ``type``
1789 The type of profiler to use.
1789 The type of profiler to use.
1790 (default: stat)
1790 (default: stat)
1791
1791
1792 ``ls``
1792 ``ls``
1793 Use Python's built-in instrumenting profiler. This profiler
1793 Use Python's built-in instrumenting profiler. This profiler
1794 works on all platforms, but each line number it reports is the
1794 works on all platforms, but each line number it reports is the
1795 first line of a function. This restriction makes it difficult to
1795 first line of a function. This restriction makes it difficult to
1796 identify the expensive parts of a non-trivial function.
1796 identify the expensive parts of a non-trivial function.
1797 ``stat``
1797 ``stat``
1798 Use a statistical profiler, statprof. This profiler is most
1798 Use a statistical profiler, statprof. This profiler is most
1799 useful for profiling commands that run for longer than about 0.1
1799 useful for profiling commands that run for longer than about 0.1
1800 seconds.
1800 seconds.
1801
1801
1802 ``format``
1802 ``format``
1803 Profiling format. Specific to the ``ls`` instrumenting profiler.
1803 Profiling format. Specific to the ``ls`` instrumenting profiler.
1804 (default: text)
1804 (default: text)
1805
1805
1806 ``text``
1806 ``text``
1807 Generate a profiling report. When saving to a file, it should be
1807 Generate a profiling report. When saving to a file, it should be
1808 noted that only the report is saved, and the profiling data is
1808 noted that only the report is saved, and the profiling data is
1809 not kept.
1809 not kept.
1810 ``kcachegrind``
1810 ``kcachegrind``
1811 Format profiling data for kcachegrind use: when saving to a
1811 Format profiling data for kcachegrind use: when saving to a
1812 file, the generated file can directly be loaded into
1812 file, the generated file can directly be loaded into
1813 kcachegrind.
1813 kcachegrind.
1814
1814
1815 ``statformat``
1815 ``statformat``
1816 Profiling format for the ``stat`` profiler.
1816 Profiling format for the ``stat`` profiler.
1817 (default: hotpath)
1817 (default: hotpath)
1818
1818
1819 ``hotpath``
1819 ``hotpath``
1820 Show a tree-based display containing the hot path of execution (where
1820 Show a tree-based display containing the hot path of execution (where
1821 most time was spent).
1821 most time was spent).
1822 ``bymethod``
1822 ``bymethod``
1823 Show a table of methods ordered by how frequently they are active.
1823 Show a table of methods ordered by how frequently they are active.
1824 ``byline``
1824 ``byline``
1825 Show a table of lines in files ordered by how frequently they are active.
1825 Show a table of lines in files ordered by how frequently they are active.
1826 ``json``
1826 ``json``
1827 Render profiling data as JSON.
1827 Render profiling data as JSON.
1828
1828
1829 ``frequency``
1829 ``frequency``
1830 Sampling frequency. Specific to the ``stat`` sampling profiler.
1830 Sampling frequency. Specific to the ``stat`` sampling profiler.
1831 (default: 1000)
1831 (default: 1000)
1832
1832
1833 ``output``
1833 ``output``
1834 File path where profiling data or report should be saved. If the
1834 File path where profiling data or report should be saved. If the
1835 file exists, it is replaced. (default: None, data is printed on
1835 file exists, it is replaced. (default: None, data is printed on
1836 stderr)
1836 stderr)
1837
1837
1838 ``sort``
1838 ``sort``
1839 Sort field. Specific to the ``ls`` instrumenting profiler.
1839 Sort field. Specific to the ``ls`` instrumenting profiler.
1840 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1840 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1841 ``inlinetime``.
1841 ``inlinetime``.
1842 (default: inlinetime)
1842 (default: inlinetime)
1843
1843
1844 ``time-track``
1844 ``time-track``
1845 Control if the stat profiler track ``cpu`` or ``real`` time.
1845 Control if the stat profiler track ``cpu`` or ``real`` time.
1846 (default: ``cpu`` on Windows, otherwise ``real``)
1846 (default: ``cpu`` on Windows, otherwise ``real``)
1847
1847
1848 ``limit``
1848 ``limit``
1849 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1849 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1850 (default: 30)
1850 (default: 30)
1851
1851
1852 ``nested``
1852 ``nested``
1853 Show at most this number of lines of drill-down info after each main entry.
1853 Show at most this number of lines of drill-down info after each main entry.
1854 This can help explain the difference between Total and Inline.
1854 This can help explain the difference between Total and Inline.
1855 Specific to the ``ls`` instrumenting profiler.
1855 Specific to the ``ls`` instrumenting profiler.
1856 (default: 0)
1856 (default: 0)
1857
1857
1858 ``showmin``
1858 ``showmin``
1859 Minimum fraction of samples an entry must have for it to be displayed.
1859 Minimum fraction of samples an entry must have for it to be displayed.
1860 Can be specified as a float between ``0.0`` and ``1.0`` or can have a
1860 Can be specified as a float between ``0.0`` and ``1.0`` or can have a
1861 ``%`` afterwards to allow values up to ``100``. e.g. ``5%``.
1861 ``%`` afterwards to allow values up to ``100``. e.g. ``5%``.
1862
1862
1863 Only used by the ``stat`` profiler.
1863 Only used by the ``stat`` profiler.
1864
1864
1865 For the ``hotpath`` format, default is ``0.05``.
1865 For the ``hotpath`` format, default is ``0.05``.
1866 For the ``chrome`` format, default is ``0.005``.
1866 For the ``chrome`` format, default is ``0.005``.
1867
1867
1868 The option is unused on other formats.
1868 The option is unused on other formats.
1869
1869
1870 ``showmax``
1870 ``showmax``
1871 Maximum fraction of samples an entry can have before it is ignored in
1871 Maximum fraction of samples an entry can have before it is ignored in
1872 display. Values format is the same as ``showmin``.
1872 display. Values format is the same as ``showmin``.
1873
1873
1874 Only used by the ``stat`` profiler.
1874 Only used by the ``stat`` profiler.
1875
1875
1876 For the ``chrome`` format, default is ``0.999``.
1876 For the ``chrome`` format, default is ``0.999``.
1877
1877
1878 The option is unused on other formats.
1878 The option is unused on other formats.
1879
1879
1880 ``showtime``
1880 ``showtime``
1881 Show time taken as absolute durations, in addition to percentages.
1881 Show time taken as absolute durations, in addition to percentages.
1882 Only used by the ``hotpath`` format.
1882 Only used by the ``hotpath`` format.
1883 (default: true)
1883 (default: true)
1884
1884
1885 ``progress``
1885 ``progress``
1886 ------------
1886 ------------
1887
1887
1888 Mercurial commands can draw progress bars that are as informative as
1888 Mercurial commands can draw progress bars that are as informative as
1889 possible. Some progress bars only offer indeterminate information, while others
1889 possible. Some progress bars only offer indeterminate information, while others
1890 have a definite end point.
1890 have a definite end point.
1891
1891
1892 ``debug``
1892 ``debug``
1893 Whether to print debug info when updating the progress bar. (default: False)
1893 Whether to print debug info when updating the progress bar. (default: False)
1894
1894
1895 ``delay``
1895 ``delay``
1896 Number of seconds (float) before showing the progress bar. (default: 3)
1896 Number of seconds (float) before showing the progress bar. (default: 3)
1897
1897
1898 ``changedelay``
1898 ``changedelay``
1899 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1899 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1900 that value will be used instead. (default: 1)
1900 that value will be used instead. (default: 1)
1901
1901
1902 ``estimateinterval``
1902 ``estimateinterval``
1903 Maximum sampling interval in seconds for speed and estimated time
1903 Maximum sampling interval in seconds for speed and estimated time
1904 calculation. (default: 60)
1904 calculation. (default: 60)
1905
1905
1906 ``refresh``
1906 ``refresh``
1907 Time in seconds between refreshes of the progress bar. (default: 0.1)
1907 Time in seconds between refreshes of the progress bar. (default: 0.1)
1908
1908
1909 ``format``
1909 ``format``
1910 Format of the progress bar.
1910 Format of the progress bar.
1911
1911
1912 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1912 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1913 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1913 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1914 last 20 characters of the item, but this can be changed by adding either
1914 last 20 characters of the item, but this can be changed by adding either
1915 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1915 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1916 first num characters.
1916 first num characters.
1917
1917
1918 (default: topic bar number estimate)
1918 (default: topic bar number estimate)
1919
1919
1920 ``width``
1920 ``width``
1921 If set, the maximum width of the progress information (that is, min(width,
1921 If set, the maximum width of the progress information (that is, min(width,
1922 term width) will be used).
1922 term width) will be used).
1923
1923
1924 ``clear-complete``
1924 ``clear-complete``
1925 Clear the progress bar after it's done. (default: True)
1925 Clear the progress bar after it's done. (default: True)
1926
1926
1927 ``disable``
1927 ``disable``
1928 If true, don't show a progress bar.
1928 If true, don't show a progress bar.
1929
1929
1930 ``assume-tty``
1930 ``assume-tty``
1931 If true, ALWAYS show a progress bar, unless disable is given.
1931 If true, ALWAYS show a progress bar, unless disable is given.
1932
1932
1933 ``rebase``
1933 ``rebase``
1934 ----------
1934 ----------
1935
1935
1936 ``evolution.allowdivergence``
1936 ``evolution.allowdivergence``
1937 Default to False, when True allow creating divergence when performing
1937 Default to False, when True allow creating divergence when performing
1938 rebase of obsolete changesets.
1938 rebase of obsolete changesets.
1939
1939
1940 ``revsetalias``
1940 ``revsetalias``
1941 ---------------
1941 ---------------
1942
1942
1943 Alias definitions for revsets. See :hg:`help revsets` for details.
1943 Alias definitions for revsets. See :hg:`help revsets` for details.
1944
1944
1945 ``rewrite``
1945 ``rewrite``
1946 -----------
1946 -----------
1947
1947
1948 ``backup-bundle``
1948 ``backup-bundle``
1949 Whether to save stripped changesets to a bundle file. (default: True)
1949 Whether to save stripped changesets to a bundle file. (default: True)
1950
1950
1951 ``update-timestamp``
1951 ``update-timestamp``
1952 If true, updates the date and time of the changeset to current. It is only
1952 If true, updates the date and time of the changeset to current. It is only
1953 applicable for `hg amend`, `hg commit --amend` and `hg uncommit` in the
1953 applicable for `hg amend`, `hg commit --amend` and `hg uncommit` in the
1954 current version.
1954 current version.
1955
1955
1956 ``empty-successor``
1956 ``empty-successor``
1957
1957
1958 Control what happens with empty successors that are the result of rewrite
1958 Control what happens with empty successors that are the result of rewrite
1959 operations. If set to ``skip``, the successor is not created. If set to
1959 operations. If set to ``skip``, the successor is not created. If set to
1960 ``keep``, the empty successor is created and kept.
1960 ``keep``, the empty successor is created and kept.
1961
1961
1962 Currently, only the rebase and absorb commands consider this configuration.
1962 Currently, only the rebase and absorb commands consider this configuration.
1963 (EXPERIMENTAL)
1963 (EXPERIMENTAL)
1964
1964
1965 ``share``
1965 ``share``
1966 ---------
1966 ---------
1967
1967
1968 ``safe-mismatch.source-safe``
1968 ``safe-mismatch.source-safe``
1969
1969
1970 Controls what happens when the shared repository does not use the
1970 Controls what happens when the shared repository does not use the
1971 share-safe mechanism but its source repository does.
1971 share-safe mechanism but its source repository does.
1972
1972
1973 Possible values are `abort` (default), `allow`, `upgrade-abort` and
1973 Possible values are `abort` (default), `allow`, `upgrade-abort` and
1974 `upgrade-abort`.
1974 `upgrade-abort`.
1975
1975
1976 ``abort``
1976 ``abort``
1977 Disallows running any command and aborts
1977 Disallows running any command and aborts
1978 ``allow``
1978 ``allow``
1979 Respects the feature presence in the share source
1979 Respects the feature presence in the share source
1980 ``upgrade-abort``
1980 ``upgrade-abort``
1981 tries to upgrade the share to use share-safe; if it fails, aborts
1981 tries to upgrade the share to use share-safe; if it fails, aborts
1982 ``upgrade-allow``
1982 ``upgrade-allow``
1983 tries to upgrade the share; if it fails, continue by
1983 tries to upgrade the share; if it fails, continue by
1984 respecting the share source setting
1984 respecting the share source setting
1985
1985
1986 Check :hg:`help config format.use-share-safe` for details about the
1986 Check :hg:`help config format.use-share-safe` for details about the
1987 share-safe feature.
1987 share-safe feature.
1988
1988
1989 ``safe-mismatch.source-safe.warn``
1989 ``safe-mismatch.source-safe.warn``
1990 Shows a warning on operations if the shared repository does not use
1990 Shows a warning on operations if the shared repository does not use
1991 share-safe, but the source repository does.
1991 share-safe, but the source repository does.
1992 (default: True)
1992 (default: True)
1993
1993
1994 ``safe-mismatch.source-not-safe``
1994 ``safe-mismatch.source-not-safe``
1995
1995
1996 Controls what happens when the shared repository uses the share-safe
1996 Controls what happens when the shared repository uses the share-safe
1997 mechanism but its source does not.
1997 mechanism but its source does not.
1998
1998
1999 Possible values are `abort` (default), `allow`, `downgrade-abort` and
1999 Possible values are `abort` (default), `allow`, `downgrade-abort` and
2000 `downgrade-abort`.
2000 `downgrade-abort`.
2001
2001
2002 ``abort``
2002 ``abort``
2003 Disallows running any command and aborts
2003 Disallows running any command and aborts
2004 ``allow``
2004 ``allow``
2005 Respects the feature presence in the share source
2005 Respects the feature presence in the share source
2006 ``downgrade-abort``
2006 ``downgrade-abort``
2007 tries to downgrade the share to not use share-safe; if it fails, aborts
2007 tries to downgrade the share to not use share-safe; if it fails, aborts
2008 ``downgrade-allow``
2008 ``downgrade-allow``
2009 tries to downgrade the share to not use share-safe;
2009 tries to downgrade the share to not use share-safe;
2010 if it fails, continue by respecting the shared source setting
2010 if it fails, continue by respecting the shared source setting
2011
2011
2012 Check :hg:`help config format.use-share-safe` for details about the
2012 Check :hg:`help config format.use-share-safe` for details about the
2013 share-safe feature.
2013 share-safe feature.
2014
2014
2015 ``safe-mismatch.source-not-safe.warn``
2015 ``safe-mismatch.source-not-safe.warn``
2016 Shows a warning on operations if the shared repository uses share-safe,
2016 Shows a warning on operations if the shared repository uses share-safe,
2017 but the source repository does not.
2017 but the source repository does not.
2018 (default: True)
2018 (default: True)
2019
2019
2020 ``storage``
2020 ``storage``
2021 -----------
2021 -----------
2022
2022
2023 Control the strategy Mercurial uses internally to store history. Options in this
2023 Control the strategy Mercurial uses internally to store history. Options in this
2024 category impact performance and repository size.
2024 category impact performance and repository size.
2025
2025
2026 ``revlog.optimize-delta-parent-choice``
2026 ``revlog.optimize-delta-parent-choice``
2027 When storing a merge revision, both parents will be equally considered as
2027 When storing a merge revision, both parents will be equally considered as
2028 a possible delta base. This results in better delta selection and improved
2028 a possible delta base. This results in better delta selection and improved
2029 revlog compression. This option is enabled by default.
2029 revlog compression. This option is enabled by default.
2030
2030
2031 Turning this option off can result in large increase of repository size for
2031 Turning this option off can result in large increase of repository size for
2032 repository with many merges.
2032 repository with many merges.
2033
2033
2034 ``revlog.persistent-nodemap.mmap``
2034 ``revlog.persistent-nodemap.mmap``
2035 Whether to use the Operating System "memory mapping" feature (when
2035 Whether to use the Operating System "memory mapping" feature (when
2036 possible) to access the persistent nodemap data. This improve performance
2036 possible) to access the persistent nodemap data. This improve performance
2037 and reduce memory pressure.
2037 and reduce memory pressure.
2038
2038
2039 Default to True.
2039 Default to True.
2040
2040
2041 For details on the "persistent-nodemap" feature, see:
2041 For details on the "persistent-nodemap" feature, see:
2042 :hg:`help config format.use-persistent-nodemap`.
2042 :hg:`help config format.use-persistent-nodemap`.
2043
2043
2044 ``revlog.persistent-nodemap.slow-path``
2044 ``revlog.persistent-nodemap.slow-path``
2045 Control the behavior of Merucrial when using a repository with "persistent"
2045 Control the behavior of Merucrial when using a repository with "persistent"
2046 nodemap with an installation of Mercurial without a fast implementation for
2046 nodemap with an installation of Mercurial without a fast implementation for
2047 the feature:
2047 the feature:
2048
2048
2049 ``allow``: Silently use the slower implementation to access the repository.
2049 ``allow``: Silently use the slower implementation to access the repository.
2050 ``warn``: Warn, but use the slower implementation to access the repository.
2050 ``warn``: Warn, but use the slower implementation to access the repository.
2051 ``abort``: Prevent access to such repositories. (This is the default)
2051 ``abort``: Prevent access to such repositories. (This is the default)
2052
2052
2053 For details on the "persistent-nodemap" feature, see:
2053 For details on the "persistent-nodemap" feature, see:
2054 :hg:`help config format.use-persistent-nodemap`.
2054 :hg:`help config format.use-persistent-nodemap`.
2055
2055
2056 ``revlog.reuse-external-delta-parent``
2056 ``revlog.reuse-external-delta-parent``
2057 Control the order in which delta parents are considered when adding new
2057 Control the order in which delta parents are considered when adding new
2058 revisions from an external source.
2058 revisions from an external source.
2059 (typically: apply bundle from `hg pull` or `hg push`).
2059 (typically: apply bundle from `hg pull` or `hg push`).
2060
2060
2061 New revisions are usually provided as a delta against other revisions. By
2061 New revisions are usually provided as a delta against other revisions. By
2062 default, Mercurial will try to reuse this delta first, therefore using the
2062 default, Mercurial will try to reuse this delta first, therefore using the
2063 same "delta parent" as the source. Directly using delta's from the source
2063 same "delta parent" as the source. Directly using delta's from the source
2064 reduces CPU usage and usually speeds up operation. However, in some case,
2064 reduces CPU usage and usually speeds up operation. However, in some case,
2065 the source might have sub-optimal delta bases and forcing their reevaluation
2065 the source might have sub-optimal delta bases and forcing their reevaluation
2066 is useful. For example, pushes from an old client could have sub-optimal
2066 is useful. For example, pushes from an old client could have sub-optimal
2067 delta's parent that the server want to optimize. (lack of general delta, bad
2067 delta's parent that the server want to optimize. (lack of general delta, bad
2068 parents, choice, lack of sparse-revlog, etc).
2068 parents, choice, lack of sparse-revlog, etc).
2069
2069
2070 This option is enabled by default. Turning it off will ensure bad delta
2070 This option is enabled by default. Turning it off will ensure bad delta
2071 parent choices from older client do not propagate to this repository, at
2071 parent choices from older client do not propagate to this repository, at
2072 the cost of a small increase in CPU consumption.
2072 the cost of a small increase in CPU consumption.
2073
2073
2074 Note: this option only control the order in which delta parents are
2074 Note: this option only control the order in which delta parents are
2075 considered. Even when disabled, the existing delta from the source will be
2075 considered. Even when disabled, the existing delta from the source will be
2076 reused if the same delta parent is selected.
2076 reused if the same delta parent is selected.
2077
2077
2078 ``revlog.reuse-external-delta``
2078 ``revlog.reuse-external-delta``
2079 Control the reuse of delta from external source.
2079 Control the reuse of delta from external source.
2080 (typically: apply bundle from `hg pull` or `hg push`).
2080 (typically: apply bundle from `hg pull` or `hg push`).
2081
2081
2082 New revisions are usually provided as a delta against another revision. By
2082 New revisions are usually provided as a delta against another revision. By
2083 default, Mercurial will not recompute the same delta again, trusting
2083 default, Mercurial will not recompute the same delta again, trusting
2084 externally provided deltas. There have been rare cases of small adjustment
2084 externally provided deltas. There have been rare cases of small adjustment
2085 to the diffing algorithm in the past. So in some rare case, recomputing
2085 to the diffing algorithm in the past. So in some rare case, recomputing
2086 delta provided by ancient clients can provides better results. Disabling
2086 delta provided by ancient clients can provides better results. Disabling
2087 this option means going through a full delta recomputation for all incoming
2087 this option means going through a full delta recomputation for all incoming
2088 revisions. It means a large increase in CPU usage and will slow operations
2088 revisions. It means a large increase in CPU usage and will slow operations
2089 down.
2089 down.
2090
2090
2091 This option is enabled by default. When disabled, it also disables the
2091 This option is enabled by default. When disabled, it also disables the
2092 related ``storage.revlog.reuse-external-delta-parent`` option.
2092 related ``storage.revlog.reuse-external-delta-parent`` option.
2093
2093
2094 ``revlog.zlib.level``
2094 ``revlog.zlib.level``
2095 Zlib compression level used when storing data into the repository. Accepted
2095 Zlib compression level used when storing data into the repository. Accepted
2096 Value range from 1 (lowest compression) to 9 (highest compression). Zlib
2096 Value range from 1 (lowest compression) to 9 (highest compression). Zlib
2097 default value is 6.
2097 default value is 6.
2098
2098
2099
2099
2100 ``revlog.zstd.level``
2100 ``revlog.zstd.level``
2101 zstd compression level used when storing data into the repository. Accepted
2101 zstd compression level used when storing data into the repository. Accepted
2102 Value range from 1 (lowest compression) to 22 (highest compression).
2102 Value range from 1 (lowest compression) to 22 (highest compression).
2103 (default 3)
2103 (default 3)
2104
2104
2105 ``server``
2105 ``server``
2106 ----------
2106 ----------
2107
2107
2108 Controls generic server settings.
2108 Controls generic server settings.
2109
2109
2110 ``bookmarks-pushkey-compat``
2110 ``bookmarks-pushkey-compat``
2111 Trigger pushkey hook when being pushed bookmark updates. This config exist
2111 Trigger pushkey hook when being pushed bookmark updates. This config exist
2112 for compatibility purpose (default to True)
2112 for compatibility purpose (default to True)
2113
2113
2114 If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark
2114 If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark
2115 movement we recommend you migrate them to ``txnclose-bookmark`` and
2115 movement we recommend you migrate them to ``txnclose-bookmark`` and
2116 ``pretxnclose-bookmark``.
2116 ``pretxnclose-bookmark``.
2117
2117
2118 ``compressionengines``
2118 ``compressionengines``
2119 List of compression engines and their relative priority to advertise
2119 List of compression engines and their relative priority to advertise
2120 to clients.
2120 to clients.
2121
2121
2122 The order of compression engines determines their priority, the first
2122 The order of compression engines determines their priority, the first
2123 having the highest priority. If a compression engine is not listed
2123 having the highest priority. If a compression engine is not listed
2124 here, it won't be advertised to clients.
2124 here, it won't be advertised to clients.
2125
2125
2126 If not set (the default), built-in defaults are used. Run
2126 If not set (the default), built-in defaults are used. Run
2127 :hg:`debuginstall` to list available compression engines and their
2127 :hg:`debuginstall` to list available compression engines and their
2128 default wire protocol priority.
2128 default wire protocol priority.
2129
2129
2130 Older Mercurial clients only support zlib compression and this setting
2130 Older Mercurial clients only support zlib compression and this setting
2131 has no effect for legacy clients.
2131 has no effect for legacy clients.
2132
2132
2133 ``uncompressed``
2133 ``uncompressed``
2134 Whether to allow clients to clone a repository using the
2134 Whether to allow clients to clone a repository using the
2135 uncompressed streaming protocol. This transfers about 40% more
2135 uncompressed streaming protocol. This transfers about 40% more
2136 data than a regular clone, but uses less memory and CPU on both
2136 data than a regular clone, but uses less memory and CPU on both
2137 server and client. Over a LAN (100 Mbps or better) or a very fast
2137 server and client. Over a LAN (100 Mbps or better) or a very fast
2138 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
2138 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
2139 regular clone. Over most WAN connections (anything slower than
2139 regular clone. Over most WAN connections (anything slower than
2140 about 6 Mbps), uncompressed streaming is slower, because of the
2140 about 6 Mbps), uncompressed streaming is slower, because of the
2141 extra data transfer overhead. This mode will also temporarily hold
2141 extra data transfer overhead. This mode will also temporarily hold
2142 the write lock while determining what data to transfer.
2142 the write lock while determining what data to transfer.
2143 (default: True)
2143 (default: True)
2144
2144
2145 ``uncompressedallowsecret``
2145 ``uncompressedallowsecret``
2146 Whether to allow stream clones when the repository contains secret
2146 Whether to allow stream clones when the repository contains secret
2147 changesets. (default: False)
2147 changesets. (default: False)
2148
2148
2149 ``preferuncompressed``
2149 ``preferuncompressed``
2150 When set, clients will try to use the uncompressed streaming
2150 When set, clients will try to use the uncompressed streaming
2151 protocol. (default: False)
2151 protocol. (default: False)
2152
2152
2153 ``disablefullbundle``
2153 ``disablefullbundle``
2154 When set, servers will refuse attempts to do pull-based clones.
2154 When set, servers will refuse attempts to do pull-based clones.
2155 If this option is set, ``preferuncompressed`` and/or clone bundles
2155 If this option is set, ``preferuncompressed`` and/or clone bundles
2156 are highly recommended. Partial clones will still be allowed.
2156 are highly recommended. Partial clones will still be allowed.
2157 (default: False)
2157 (default: False)
2158
2158
2159 ``streamunbundle``
2159 ``streamunbundle``
2160 When set, servers will apply data sent from the client directly,
2160 When set, servers will apply data sent from the client directly,
2161 otherwise it will be written to a temporary file first. This option
2161 otherwise it will be written to a temporary file first. This option
2162 effectively prevents concurrent pushes.
2162 effectively prevents concurrent pushes.
2163
2163
2164 ``pullbundle``
2164 ``pullbundle``
2165 When set, the server will check pullbundle.manifest for bundles
2165 When set, the server will check pullbundle.manifest for bundles
2166 covering the requested heads and common nodes. The first matching
2166 covering the requested heads and common nodes. The first matching
2167 entry will be streamed to the client.
2167 entry will be streamed to the client.
2168
2168
2169 For HTTP transport, the stream will still use zlib compression
2169 For HTTP transport, the stream will still use zlib compression
2170 for older clients.
2170 for older clients.
2171
2171
2172 ``concurrent-push-mode``
2172 ``concurrent-push-mode``
2173 Level of allowed race condition between two pushing clients.
2173 Level of allowed race condition between two pushing clients.
2174
2174
2175 - 'strict': push is abort if another client touched the repository
2175 - 'strict': push is abort if another client touched the repository
2176 while the push was preparing.
2176 while the push was preparing.
2177 - 'check-related': push is only aborted if it affects head that got also
2177 - 'check-related': push is only aborted if it affects head that got also
2178 affected while the push was preparing. (default since 5.4)
2178 affected while the push was preparing. (default since 5.4)
2179
2179
2180 'check-related' only takes effect for compatible clients (version
2180 'check-related' only takes effect for compatible clients (version
2181 4.3 and later). Older clients will use 'strict'.
2181 4.3 and later). Older clients will use 'strict'.
2182
2182
2183 ``validate``
2183 ``validate``
2184 Whether to validate the completeness of pushed changesets by
2184 Whether to validate the completeness of pushed changesets by
2185 checking that all new file revisions specified in manifests are
2185 checking that all new file revisions specified in manifests are
2186 present. (default: False)
2186 present. (default: False)
2187
2187
2188 ``maxhttpheaderlen``
2188 ``maxhttpheaderlen``
2189 Instruct HTTP clients not to send request headers longer than this
2189 Instruct HTTP clients not to send request headers longer than this
2190 many bytes. (default: 1024)
2190 many bytes. (default: 1024)
2191
2191
2192 ``bundle1``
2192 ``bundle1``
2193 Whether to allow clients to push and pull using the legacy bundle1
2193 Whether to allow clients to push and pull using the legacy bundle1
2194 exchange format. (default: True)
2194 exchange format. (default: True)
2195
2195
2196 ``bundle1gd``
2196 ``bundle1gd``
2197 Like ``bundle1`` but only used if the repository is using the
2197 Like ``bundle1`` but only used if the repository is using the
2198 *generaldelta* storage format. (default: True)
2198 *generaldelta* storage format. (default: True)
2199
2199
2200 ``bundle1.push``
2200 ``bundle1.push``
2201 Whether to allow clients to push using the legacy bundle1 exchange
2201 Whether to allow clients to push using the legacy bundle1 exchange
2202 format. (default: True)
2202 format. (default: True)
2203
2203
2204 ``bundle1gd.push``
2204 ``bundle1gd.push``
2205 Like ``bundle1.push`` but only used if the repository is using the
2205 Like ``bundle1.push`` but only used if the repository is using the
2206 *generaldelta* storage format. (default: True)
2206 *generaldelta* storage format. (default: True)
2207
2207
2208 ``bundle1.pull``
2208 ``bundle1.pull``
2209 Whether to allow clients to pull using the legacy bundle1 exchange
2209 Whether to allow clients to pull using the legacy bundle1 exchange
2210 format. (default: True)
2210 format. (default: True)
2211
2211
2212 ``bundle1gd.pull``
2212 ``bundle1gd.pull``
2213 Like ``bundle1.pull`` but only used if the repository is using the
2213 Like ``bundle1.pull`` but only used if the repository is using the
2214 *generaldelta* storage format. (default: True)
2214 *generaldelta* storage format. (default: True)
2215
2215
2216 Large repositories using the *generaldelta* storage format should
2216 Large repositories using the *generaldelta* storage format should
2217 consider setting this option because converting *generaldelta*
2217 consider setting this option because converting *generaldelta*
2218 repositories to the exchange format required by the bundle1 data
2218 repositories to the exchange format required by the bundle1 data
2219 format can consume a lot of CPU.
2219 format can consume a lot of CPU.
2220
2220
2221 ``bundle2.stream``
2221 ``bundle2.stream``
2222 Whether to allow clients to pull using the bundle2 streaming protocol.
2222 Whether to allow clients to pull using the bundle2 streaming protocol.
2223 (default: True)
2223 (default: True)
2224
2224
2225 ``zliblevel``
2225 ``zliblevel``
2226 Integer between ``-1`` and ``9`` that controls the zlib compression level
2226 Integer between ``-1`` and ``9`` that controls the zlib compression level
2227 for wire protocol commands that send zlib compressed output (notably the
2227 for wire protocol commands that send zlib compressed output (notably the
2228 commands that send repository history data).
2228 commands that send repository history data).
2229
2229
2230 The default (``-1``) uses the default zlib compression level, which is
2230 The default (``-1``) uses the default zlib compression level, which is
2231 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
2231 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
2232 maximum compression.
2232 maximum compression.
2233
2233
2234 Setting this option allows server operators to make trade-offs between
2234 Setting this option allows server operators to make trade-offs between
2235 bandwidth and CPU used. Lowering the compression lowers CPU utilization
2235 bandwidth and CPU used. Lowering the compression lowers CPU utilization
2236 but sends more bytes to clients.
2236 but sends more bytes to clients.
2237
2237
2238 This option only impacts the HTTP server.
2238 This option only impacts the HTTP server.
2239
2239
2240 ``zstdlevel``
2240 ``zstdlevel``
2241 Integer between ``1`` and ``22`` that controls the zstd compression level
2241 Integer between ``1`` and ``22`` that controls the zstd compression level
2242 for wire protocol commands. ``1`` is the minimal amount of compression and
2242 for wire protocol commands. ``1`` is the minimal amount of compression and
2243 ``22`` is the highest amount of compression.
2243 ``22`` is the highest amount of compression.
2244
2244
2245 The default (``3``) should be significantly faster than zlib while likely
2245 The default (``3``) should be significantly faster than zlib while likely
2246 delivering better compression ratios.
2246 delivering better compression ratios.
2247
2247
2248 This option only impacts the HTTP server.
2248 This option only impacts the HTTP server.
2249
2249
2250 See also ``server.zliblevel``.
2250 See also ``server.zliblevel``.
2251
2251
2252 ``view``
2252 ``view``
2253 Repository filter used when exchanging revisions with the peer.
2253 Repository filter used when exchanging revisions with the peer.
2254
2254
2255 The default view (``served``) excludes secret and hidden changesets.
2255 The default view (``served``) excludes secret and hidden changesets.
2256 Another useful value is ``immutable`` (no draft, secret or hidden
2256 Another useful value is ``immutable`` (no draft, secret or hidden
2257 changesets). (EXPERIMENTAL)
2257 changesets). (EXPERIMENTAL)
2258
2258
2259 ``smtp``
2259 ``smtp``
2260 --------
2260 --------
2261
2261
2262 Configuration for extensions that need to send email messages.
2262 Configuration for extensions that need to send email messages.
2263
2263
2264 ``host``
2264 ``host``
2265 Host name of mail server, e.g. "mail.example.com".
2265 Host name of mail server, e.g. "mail.example.com".
2266
2266
2267 ``port``
2267 ``port``
2268 Optional. Port to connect to on mail server. (default: 465 if
2268 Optional. Port to connect to on mail server. (default: 465 if
2269 ``tls`` is smtps; 25 otherwise)
2269 ``tls`` is smtps; 25 otherwise)
2270
2270
2271 ``tls``
2271 ``tls``
2272 Optional. Method to enable TLS when connecting to mail server: starttls,
2272 Optional. Method to enable TLS when connecting to mail server: starttls,
2273 smtps or none. (default: none)
2273 smtps or none. (default: none)
2274
2274
2275 ``username``
2275 ``username``
2276 Optional. User name for authenticating with the SMTP server.
2276 Optional. User name for authenticating with the SMTP server.
2277 (default: None)
2277 (default: None)
2278
2278
2279 ``password``
2279 ``password``
2280 Optional. Password for authenticating with the SMTP server. If not
2280 Optional. Password for authenticating with the SMTP server. If not
2281 specified, interactive sessions will prompt the user for a
2281 specified, interactive sessions will prompt the user for a
2282 password; non-interactive sessions will fail. (default: None)
2282 password; non-interactive sessions will fail. (default: None)
2283
2283
2284 ``local_hostname``
2284 ``local_hostname``
2285 Optional. The hostname that the sender can use to identify
2285 Optional. The hostname that the sender can use to identify
2286 itself to the MTA.
2286 itself to the MTA.
2287
2287
2288
2288
2289 ``subpaths``
2289 ``subpaths``
2290 ------------
2290 ------------
2291
2291
2292 Subrepository source URLs can go stale if a remote server changes name
2292 Subrepository source URLs can go stale if a remote server changes name
2293 or becomes temporarily unavailable. This section lets you define
2293 or becomes temporarily unavailable. This section lets you define
2294 rewrite rules of the form::
2294 rewrite rules of the form::
2295
2295
2296 <pattern> = <replacement>
2296 <pattern> = <replacement>
2297
2297
2298 where ``pattern`` is a regular expression matching a subrepository
2298 where ``pattern`` is a regular expression matching a subrepository
2299 source URL and ``replacement`` is the replacement string used to
2299 source URL and ``replacement`` is the replacement string used to
2300 rewrite it. Groups can be matched in ``pattern`` and referenced in
2300 rewrite it. Groups can be matched in ``pattern`` and referenced in
2301 ``replacements``. For instance::
2301 ``replacements``. For instance::
2302
2302
2303 http://server/(.*)-hg/ = http://hg.server/\1/
2303 http://server/(.*)-hg/ = http://hg.server/\1/
2304
2304
2305 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
2305 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
2306
2306
2307 Relative subrepository paths are first made absolute, and the
2307 Relative subrepository paths are first made absolute, and the
2308 rewrite rules are then applied on the full (absolute) path. If ``pattern``
2308 rewrite rules are then applied on the full (absolute) path. If ``pattern``
2309 doesn't match the full path, an attempt is made to apply it on the
2309 doesn't match the full path, an attempt is made to apply it on the
2310 relative path alone. The rules are applied in definition order.
2310 relative path alone. The rules are applied in definition order.
2311
2311
2312 ``subrepos``
2312 ``subrepos``
2313 ------------
2313 ------------
2314
2314
2315 This section contains options that control the behavior of the
2315 This section contains options that control the behavior of the
2316 subrepositories feature. See also :hg:`help subrepos`.
2316 subrepositories feature. See also :hg:`help subrepos`.
2317
2317
2318 Security note: auditing in Mercurial is known to be insufficient to
2318 Security note: auditing in Mercurial is known to be insufficient to
2319 prevent clone-time code execution with carefully constructed Git
2319 prevent clone-time code execution with carefully constructed Git
2320 subrepos. It is unknown if a similar detect is present in Subversion
2320 subrepos. It is unknown if a similar detect is present in Subversion
2321 subrepos. Both Git and Subversion subrepos are disabled by default
2321 subrepos. Both Git and Subversion subrepos are disabled by default
2322 out of security concerns. These subrepo types can be enabled using
2322 out of security concerns. These subrepo types can be enabled using
2323 the respective options below.
2323 the respective options below.
2324
2324
2325 ``allowed``
2325 ``allowed``
2326 Whether subrepositories are allowed in the working directory.
2326 Whether subrepositories are allowed in the working directory.
2327
2327
2328 When false, commands involving subrepositories (like :hg:`update`)
2328 When false, commands involving subrepositories (like :hg:`update`)
2329 will fail for all subrepository types.
2329 will fail for all subrepository types.
2330 (default: true)
2330 (default: true)
2331
2331
2332 ``hg:allowed``
2332 ``hg:allowed``
2333 Whether Mercurial subrepositories are allowed in the working
2333 Whether Mercurial subrepositories are allowed in the working
2334 directory. This option only has an effect if ``subrepos.allowed``
2334 directory. This option only has an effect if ``subrepos.allowed``
2335 is true.
2335 is true.
2336 (default: true)
2336 (default: true)
2337
2337
2338 ``git:allowed``
2338 ``git:allowed``
2339 Whether Git subrepositories are allowed in the working directory.
2339 Whether Git subrepositories are allowed in the working directory.
2340 This option only has an effect if ``subrepos.allowed`` is true.
2340 This option only has an effect if ``subrepos.allowed`` is true.
2341
2341
2342 See the security note above before enabling Git subrepos.
2342 See the security note above before enabling Git subrepos.
2343 (default: false)
2343 (default: false)
2344
2344
2345 ``svn:allowed``
2345 ``svn:allowed``
2346 Whether Subversion subrepositories are allowed in the working
2346 Whether Subversion subrepositories are allowed in the working
2347 directory. This option only has an effect if ``subrepos.allowed``
2347 directory. This option only has an effect if ``subrepos.allowed``
2348 is true.
2348 is true.
2349
2349
2350 See the security note above before enabling Subversion subrepos.
2350 See the security note above before enabling Subversion subrepos.
2351 (default: false)
2351 (default: false)
2352
2352
2353 ``templatealias``
2353 ``templatealias``
2354 -----------------
2354 -----------------
2355
2355
2356 Alias definitions for templates. See :hg:`help templates` for details.
2356 Alias definitions for templates. See :hg:`help templates` for details.
2357
2357
2358 ``templates``
2358 ``templates``
2359 -------------
2359 -------------
2360
2360
2361 Use the ``[templates]`` section to define template strings.
2361 Use the ``[templates]`` section to define template strings.
2362 See :hg:`help templates` for details.
2362 See :hg:`help templates` for details.
2363
2363
2364 ``trusted``
2364 ``trusted``
2365 -----------
2365 -----------
2366
2366
2367 Mercurial will not use the settings in the
2367 Mercurial will not use the settings in the
2368 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
2368 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
2369 user or to a trusted group, as various hgrc features allow arbitrary
2369 user or to a trusted group, as various hgrc features allow arbitrary
2370 commands to be run. This issue is often encountered when configuring
2370 commands to be run. This issue is often encountered when configuring
2371 hooks or extensions for shared repositories or servers. However,
2371 hooks or extensions for shared repositories or servers. However,
2372 the web interface will use some safe settings from the ``[web]``
2372 the web interface will use some safe settings from the ``[web]``
2373 section.
2373 section.
2374
2374
2375 This section specifies what users and groups are trusted. The
2375 This section specifies what users and groups are trusted. The
2376 current user is always trusted. To trust everybody, list a user or a
2376 current user is always trusted. To trust everybody, list a user or a
2377 group with name ``*``. These settings must be placed in an
2377 group with name ``*``. These settings must be placed in an
2378 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
2378 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
2379 user or service running Mercurial.
2379 user or service running Mercurial.
2380
2380
2381 ``users``
2381 ``users``
2382 Comma-separated list of trusted users.
2382 Comma-separated list of trusted users.
2383
2383
2384 ``groups``
2384 ``groups``
2385 Comma-separated list of trusted groups.
2385 Comma-separated list of trusted groups.
2386
2386
2387
2387
2388 ``ui``
2388 ``ui``
2389 ------
2389 ------
2390
2390
2391 User interface controls.
2391 User interface controls.
2392
2392
2393 ``archivemeta``
2393 ``archivemeta``
2394 Whether to include the .hg_archival.txt file containing meta data
2394 Whether to include the .hg_archival.txt file containing meta data
2395 (hashes for the repository base and for tip) in archives created
2395 (hashes for the repository base and for tip) in archives created
2396 by the :hg:`archive` command or downloaded via hgweb.
2396 by the :hg:`archive` command or downloaded via hgweb.
2397 (default: True)
2397 (default: True)
2398
2398
2399 ``askusername``
2399 ``askusername``
2400 Whether to prompt for a username when committing. If True, and
2400 Whether to prompt for a username when committing. If True, and
2401 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
2401 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
2402 be prompted to enter a username. If no username is entered, the
2402 be prompted to enter a username. If no username is entered, the
2403 default ``USER@HOST`` is used instead.
2403 default ``USER@HOST`` is used instead.
2404 (default: False)
2404 (default: False)
2405
2405
2406 ``clonebundles``
2406 ``clonebundles``
2407 Whether the "clone bundles" feature is enabled.
2407 Whether the "clone bundles" feature is enabled.
2408
2408
2409 When enabled, :hg:`clone` may download and apply a server-advertised
2409 When enabled, :hg:`clone` may download and apply a server-advertised
2410 bundle file from a URL instead of using the normal exchange mechanism.
2410 bundle file from a URL instead of using the normal exchange mechanism.
2411
2411
2412 This can likely result in faster and more reliable clones.
2412 This can likely result in faster and more reliable clones.
2413
2413
2414 (default: True)
2414 (default: True)
2415
2415
2416 ``clonebundlefallback``
2416 ``clonebundlefallback``
2417 Whether failure to apply an advertised "clone bundle" from a server
2417 Whether failure to apply an advertised "clone bundle" from a server
2418 should result in fallback to a regular clone.
2418 should result in fallback to a regular clone.
2419
2419
2420 This is disabled by default because servers advertising "clone
2420 This is disabled by default because servers advertising "clone
2421 bundles" often do so to reduce server load. If advertised bundles
2421 bundles" often do so to reduce server load. If advertised bundles
2422 start mass failing and clients automatically fall back to a regular
2422 start mass failing and clients automatically fall back to a regular
2423 clone, this would add significant and unexpected load to the server
2423 clone, this would add significant and unexpected load to the server
2424 since the server is expecting clone operations to be offloaded to
2424 since the server is expecting clone operations to be offloaded to
2425 pre-generated bundles. Failing fast (the default behavior) ensures
2425 pre-generated bundles. Failing fast (the default behavior) ensures
2426 clients don't overwhelm the server when "clone bundle" application
2426 clients don't overwhelm the server when "clone bundle" application
2427 fails.
2427 fails.
2428
2428
2429 (default: False)
2429 (default: False)
2430
2430
2431 ``clonebundleprefers``
2431 ``clonebundleprefers``
2432 Defines preferences for which "clone bundles" to use.
2432 Defines preferences for which "clone bundles" to use.
2433
2433
2434 Servers advertising "clone bundles" may advertise multiple available
2434 Servers advertising "clone bundles" may advertise multiple available
2435 bundles. Each bundle may have different attributes, such as the bundle
2435 bundles. Each bundle may have different attributes, such as the bundle
2436 type and compression format. This option is used to prefer a particular
2436 type and compression format. This option is used to prefer a particular
2437 bundle over another.
2437 bundle over another.
2438
2438
2439 The following keys are defined by Mercurial:
2439 The following keys are defined by Mercurial:
2440
2440
2441 BUNDLESPEC
2441 BUNDLESPEC
2442 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
2442 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
2443 e.g. ``gzip-v2`` or ``bzip2-v1``.
2443 e.g. ``gzip-v2`` or ``bzip2-v1``.
2444
2444
2445 COMPRESSION
2445 COMPRESSION
2446 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
2446 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
2447
2447
2448 Server operators may define custom keys.
2448 Server operators may define custom keys.
2449
2449
2450 Example values: ``COMPRESSION=bzip2``,
2450 Example values: ``COMPRESSION=bzip2``,
2451 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
2451 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
2452
2452
2453 By default, the first bundle advertised by the server is used.
2453 By default, the first bundle advertised by the server is used.
2454
2454
2455 ``color``
2455 ``color``
2456 When to colorize output. Possible value are Boolean ("yes" or "no"), or
2456 When to colorize output. Possible value are Boolean ("yes" or "no"), or
2457 "debug", or "always". (default: "yes"). "yes" will use color whenever it
2457 "debug", or "always". (default: "yes"). "yes" will use color whenever it
2458 seems possible. See :hg:`help color` for details.
2458 seems possible. See :hg:`help color` for details.
2459
2459
2460 ``commitsubrepos``
2460 ``commitsubrepos``
2461 Whether to commit modified subrepositories when committing the
2461 Whether to commit modified subrepositories when committing the
2462 parent repository. If False and one subrepository has uncommitted
2462 parent repository. If False and one subrepository has uncommitted
2463 changes, abort the commit.
2463 changes, abort the commit.
2464 (default: False)
2464 (default: False)
2465
2465
2466 ``debug``
2466 ``debug``
2467 Print debugging information. (default: False)
2467 Print debugging information. (default: False)
2468
2468
2469 ``editor``
2469 ``editor``
2470 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
2470 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
2471
2471
2472 ``fallbackencoding``
2472 ``fallbackencoding``
2473 Encoding to try if it's not possible to decode the changelog using
2473 Encoding to try if it's not possible to decode the changelog using
2474 UTF-8. (default: ISO-8859-1)
2474 UTF-8. (default: ISO-8859-1)
2475
2475
2476 ``graphnodetemplate``
2476 ``graphnodetemplate``
2477 (DEPRECATED) Use ``command-templates.graphnode`` instead.
2477 (DEPRECATED) Use ``command-templates.graphnode`` instead.
2478
2478
2479 ``ignore``
2479 ``ignore``
2480 A file to read per-user ignore patterns from. This file should be
2480 A file to read per-user ignore patterns from. This file should be
2481 in the same format as a repository-wide .hgignore file. Filenames
2481 in the same format as a repository-wide .hgignore file. Filenames
2482 are relative to the repository root. This option supports hook syntax,
2482 are relative to the repository root. This option supports hook syntax,
2483 so if you want to specify multiple ignore files, you can do so by
2483 so if you want to specify multiple ignore files, you can do so by
2484 setting something like ``ignore.other = ~/.hgignore2``. For details
2484 setting something like ``ignore.other = ~/.hgignore2``. For details
2485 of the ignore file format, see the ``hgignore(5)`` man page.
2485 of the ignore file format, see the ``hgignore(5)`` man page.
2486
2486
2487 ``interactive``
2487 ``interactive``
2488 Allow to prompt the user. (default: True)
2488 Allow to prompt the user. (default: True)
2489
2489
2490 ``interface``
2490 ``interface``
2491 Select the default interface for interactive features (default: text).
2491 Select the default interface for interactive features (default: text).
2492 Possible values are 'text' and 'curses'.
2492 Possible values are 'text' and 'curses'.
2493
2493
2494 ``interface.chunkselector``
2494 ``interface.chunkselector``
2495 Select the interface for change recording (e.g. :hg:`commit -i`).
2495 Select the interface for change recording (e.g. :hg:`commit -i`).
2496 Possible values are 'text' and 'curses'.
2496 Possible values are 'text' and 'curses'.
2497 This config overrides the interface specified by ui.interface.
2497 This config overrides the interface specified by ui.interface.
2498
2498
2499 ``large-file-limit``
2499 ``large-file-limit``
2500 Largest file size that gives no memory use warning.
2500 Largest file size that gives no memory use warning.
2501 Possible values are integers or 0 to disable the check.
2501 Possible values are integers or 0 to disable the check.
2502 (default: 10000000)
2502 (default: 10000000)
2503
2503
2504 ``logtemplate``
2504 ``logtemplate``
2505 (DEPRECATED) Use ``command-templates.log`` instead.
2505 (DEPRECATED) Use ``command-templates.log`` instead.
2506
2506
2507 ``merge``
2507 ``merge``
2508 The conflict resolution program to use during a manual merge.
2508 The conflict resolution program to use during a manual merge.
2509 For more information on merge tools see :hg:`help merge-tools`.
2509 For more information on merge tools see :hg:`help merge-tools`.
2510 For configuring merge tools see the ``[merge-tools]`` section.
2510 For configuring merge tools see the ``[merge-tools]`` section.
2511
2511
2512 ``mergemarkers``
2512 ``mergemarkers``
2513 Sets the merge conflict marker label styling. The ``detailed`` style
2513 Sets the merge conflict marker label styling. The ``detailed`` style
2514 uses the ``command-templates.mergemarker`` setting to style the labels.
2514 uses the ``command-templates.mergemarker`` setting to style the labels.
2515 The ``basic`` style just uses 'local' and 'other' as the marker label.
2515 The ``basic`` style just uses 'local' and 'other' as the marker label.
2516 One of ``basic`` or ``detailed``.
2516 One of ``basic`` or ``detailed``.
2517 (default: ``basic``)
2517 (default: ``basic``)
2518
2518
2519 ``mergemarkertemplate``
2519 ``mergemarkertemplate``
2520 (DEPRECATED) Use ``command-templates.mergemarker`` instead.
2520 (DEPRECATED) Use ``command-templates.mergemarker`` instead.
2521
2521
2522 ``message-output``
2522 ``message-output``
2523 Where to write status and error messages. (default: ``stdio``)
2523 Where to write status and error messages. (default: ``stdio``)
2524
2524
2525 ``channel``
2525 ``channel``
2526 Use separate channel for structured output. (Command-server only)
2526 Use separate channel for structured output. (Command-server only)
2527 ``stderr``
2527 ``stderr``
2528 Everything to stderr.
2528 Everything to stderr.
2529 ``stdio``
2529 ``stdio``
2530 Status to stdout, and error to stderr.
2530 Status to stdout, and error to stderr.
2531
2531
2532 ``origbackuppath``
2532 ``origbackuppath``
2533 The path to a directory used to store generated .orig files. If the path is
2533 The path to a directory used to store generated .orig files. If the path is
2534 not a directory, one will be created. If set, files stored in this
2534 not a directory, one will be created. If set, files stored in this
2535 directory have the same name as the original file and do not have a .orig
2535 directory have the same name as the original file and do not have a .orig
2536 suffix.
2536 suffix.
2537
2537
2538 ``paginate``
2538 ``paginate``
2539 Control the pagination of command output (default: True). See :hg:`help pager`
2539 Control the pagination of command output (default: True). See :hg:`help pager`
2540 for details.
2540 for details.
2541
2541
2542 ``patch``
2542 ``patch``
2543 An optional external tool that ``hg import`` and some extensions
2543 An optional external tool that ``hg import`` and some extensions
2544 will use for applying patches. By default Mercurial uses an
2544 will use for applying patches. By default Mercurial uses an
2545 internal patch utility. The external tool must work as the common
2545 internal patch utility. The external tool must work as the common
2546 Unix ``patch`` program. In particular, it must accept a ``-p``
2546 Unix ``patch`` program. In particular, it must accept a ``-p``
2547 argument to strip patch headers, a ``-d`` argument to specify the
2547 argument to strip patch headers, a ``-d`` argument to specify the
2548 current directory, a file name to patch, and a patch file to take
2548 current directory, a file name to patch, and a patch file to take
2549 from stdin.
2549 from stdin.
2550
2550
2551 It is possible to specify a patch tool together with extra
2551 It is possible to specify a patch tool together with extra
2552 arguments. For example, setting this option to ``patch --merge``
2552 arguments. For example, setting this option to ``patch --merge``
2553 will use the ``patch`` program with its 2-way merge option.
2553 will use the ``patch`` program with its 2-way merge option.
2554
2554
2555 ``portablefilenames``
2555 ``portablefilenames``
2556 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
2556 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
2557 (default: ``warn``)
2557 (default: ``warn``)
2558
2558
2559 ``warn``
2559 ``warn``
2560 Print a warning message on POSIX platforms, if a file with a non-portable
2560 Print a warning message on POSIX platforms, if a file with a non-portable
2561 filename is added (e.g. a file with a name that can't be created on
2561 filename is added (e.g. a file with a name that can't be created on
2562 Windows because it contains reserved parts like ``AUX``, reserved
2562 Windows because it contains reserved parts like ``AUX``, reserved
2563 characters like ``:``, or would cause a case collision with an existing
2563 characters like ``:``, or would cause a case collision with an existing
2564 file).
2564 file).
2565
2565
2566 ``ignore``
2566 ``ignore``
2567 Don't print a warning.
2567 Don't print a warning.
2568
2568
2569 ``abort``
2569 ``abort``
2570 The command is aborted.
2570 The command is aborted.
2571
2571
2572 ``true``
2572 ``true``
2573 Alias for ``warn``.
2573 Alias for ``warn``.
2574
2574
2575 ``false``
2575 ``false``
2576 Alias for ``ignore``.
2576 Alias for ``ignore``.
2577
2577
2578 .. container:: windows
2578 .. container:: windows
2579
2579
2580 On Windows, this configuration option is ignored and the command aborted.
2580 On Windows, this configuration option is ignored and the command aborted.
2581
2581
2582 ``pre-merge-tool-output-template``
2582 ``pre-merge-tool-output-template``
2583 (DEPRECATED) Use ``command-template.pre-merge-tool-output`` instead.
2583 (DEPRECATED) Use ``command-template.pre-merge-tool-output`` instead.
2584
2584
2585 ``quiet``
2585 ``quiet``
2586 Reduce the amount of output printed.
2586 Reduce the amount of output printed.
2587 (default: False)
2587 (default: False)
2588
2588
2589 ``relative-paths``
2589 ``relative-paths``
2590 Prefer relative paths in the UI.
2590 Prefer relative paths in the UI.
2591
2591
2592 ``remotecmd``
2592 ``remotecmd``
2593 Remote command to use for clone/push/pull operations.
2593 Remote command to use for clone/push/pull operations.
2594 (default: ``hg``)
2594 (default: ``hg``)
2595
2595
2596 ``report_untrusted``
2596 ``report_untrusted``
2597 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2597 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2598 trusted user or group.
2598 trusted user or group.
2599 (default: True)
2599 (default: True)
2600
2600
2601 ``slash``
2601 ``slash``
2602 (Deprecated. Use ``slashpath`` template filter instead.)
2602 (Deprecated. Use ``slashpath`` template filter instead.)
2603
2603
2604 Display paths using a slash (``/``) as the path separator. This
2604 Display paths using a slash (``/``) as the path separator. This
2605 only makes a difference on systems where the default path
2605 only makes a difference on systems where the default path
2606 separator is not the slash character (e.g. Windows uses the
2606 separator is not the slash character (e.g. Windows uses the
2607 backslash character (``\``)).
2607 backslash character (``\``)).
2608 (default: False)
2608 (default: False)
2609
2609
2610 ``statuscopies``
2610 ``statuscopies``
2611 Display copies in the status command.
2611 Display copies in the status command.
2612
2612
2613 ``ssh``
2613 ``ssh``
2614 Command to use for SSH connections. (default: ``ssh``)
2614 Command to use for SSH connections. (default: ``ssh``)
2615
2615
2616 ``ssherrorhint``
2616 ``ssherrorhint``
2617 A hint shown to the user in the case of SSH error (e.g.
2617 A hint shown to the user in the case of SSH error (e.g.
2618 ``Please see http://company/internalwiki/ssh.html``)
2618 ``Please see http://company/internalwiki/ssh.html``)
2619
2619
2620 ``strict``
2620 ``strict``
2621 Require exact command names, instead of allowing unambiguous
2621 Require exact command names, instead of allowing unambiguous
2622 abbreviations. (default: False)
2622 abbreviations. (default: False)
2623
2623
2624 ``style``
2624 ``style``
2625 Name of style to use for command output.
2625 Name of style to use for command output.
2626
2626
2627 ``supportcontact``
2627 ``supportcontact``
2628 A URL where users should report a Mercurial traceback. Use this if you are a
2628 A URL where users should report a Mercurial traceback. Use this if you are a
2629 large organisation with its own Mercurial deployment process and crash
2629 large organisation with its own Mercurial deployment process and crash
2630 reports should be addressed to your internal support.
2630 reports should be addressed to your internal support.
2631
2631
2632 ``textwidth``
2632 ``textwidth``
2633 Maximum width of help text. A longer line generated by ``hg help`` or
2633 Maximum width of help text. A longer line generated by ``hg help`` or
2634 ``hg subcommand --help`` will be broken after white space to get this
2634 ``hg subcommand --help`` will be broken after white space to get this
2635 width or the terminal width, whichever comes first.
2635 width or the terminal width, whichever comes first.
2636 A non-positive value will disable this and the terminal width will be
2636 A non-positive value will disable this and the terminal width will be
2637 used. (default: 78)
2637 used. (default: 78)
2638
2638
2639 ``timeout``
2639 ``timeout``
2640 The timeout used when a lock is held (in seconds), a negative value
2640 The timeout used when a lock is held (in seconds), a negative value
2641 means no timeout. (default: 600)
2641 means no timeout. (default: 600)
2642
2642
2643 ``timeout.warn``
2643 ``timeout.warn``
2644 Time (in seconds) before a warning is printed about held lock. A negative
2644 Time (in seconds) before a warning is printed about held lock. A negative
2645 value means no warning. (default: 0)
2645 value means no warning. (default: 0)
2646
2646
2647 ``traceback``
2647 ``traceback``
2648 Mercurial always prints a traceback when an unknown exception
2648 Mercurial always prints a traceback when an unknown exception
2649 occurs. Setting this to True will make Mercurial print a traceback
2649 occurs. Setting this to True will make Mercurial print a traceback
2650 on all exceptions, even those recognized by Mercurial (such as
2650 on all exceptions, even those recognized by Mercurial (such as
2651 IOError or MemoryError). (default: False)
2651 IOError or MemoryError). (default: False)
2652
2652
2653 ``tweakdefaults``
2653 ``tweakdefaults``
2654
2654
2655 By default Mercurial's behavior changes very little from release
2655 By default Mercurial's behavior changes very little from release
2656 to release, but over time the recommended config settings
2656 to release, but over time the recommended config settings
2657 shift. Enable this config to opt in to get automatic tweaks to
2657 shift. Enable this config to opt in to get automatic tweaks to
2658 Mercurial's behavior over time. This config setting will have no
2658 Mercurial's behavior over time. This config setting will have no
2659 effect if ``HGPLAIN`` is set or ``HGPLAINEXCEPT`` is set and does
2659 effect if ``HGPLAIN`` is set or ``HGPLAINEXCEPT`` is set and does
2660 not include ``tweakdefaults``. (default: False)
2660 not include ``tweakdefaults``. (default: False)
2661
2661
2662 It currently means::
2662 It currently means::
2663
2663
2664 .. tweakdefaultsmarker
2664 .. tweakdefaultsmarker
2665
2665
2666 ``username``
2666 ``username``
2667 The committer of a changeset created when running "commit".
2667 The committer of a changeset created when running "commit".
2668 Typically a person's name and email address, e.g. ``Fred Widget
2668 Typically a person's name and email address, e.g. ``Fred Widget
2669 <fred@example.com>``. Environment variables in the
2669 <fred@example.com>``. Environment variables in the
2670 username are expanded.
2670 username are expanded.
2671
2671
2672 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2672 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2673 hgrc is empty, e.g. if the system admin set ``username =`` in the
2673 hgrc is empty, e.g. if the system admin set ``username =`` in the
2674 system hgrc, it has to be specified manually or in a different
2674 system hgrc, it has to be specified manually or in a different
2675 hgrc file)
2675 hgrc file)
2676
2676
2677 ``verbose``
2677 ``verbose``
2678 Increase the amount of output printed. (default: False)
2678 Increase the amount of output printed. (default: False)
2679
2679
2680
2680
2681 ``command-templates``
2681 ``command-templates``
2682 ---------------------
2682 ---------------------
2683
2683
2684 Templates used for customizing the output of commands.
2684 Templates used for customizing the output of commands.
2685
2685
2686 ``graphnode``
2686 ``graphnode``
2687 The template used to print changeset nodes in an ASCII revision graph.
2687 The template used to print changeset nodes in an ASCII revision graph.
2688 (default: ``{graphnode}``)
2688 (default: ``{graphnode}``)
2689
2689
2690 ``log``
2690 ``log``
2691 Template string for commands that print changesets.
2691 Template string for commands that print changesets.
2692
2692
2693 ``mergemarker``
2693 ``mergemarker``
2694 The template used to print the commit description next to each conflict
2694 The template used to print the commit description next to each conflict
2695 marker during merge conflicts. See :hg:`help templates` for the template
2695 marker during merge conflicts. See :hg:`help templates` for the template
2696 format.
2696 format.
2697
2697
2698 Defaults to showing the hash, tags, branches, bookmarks, author, and
2698 Defaults to showing the hash, tags, branches, bookmarks, author, and
2699 the first line of the commit description.
2699 the first line of the commit description.
2700
2700
2701 If you use non-ASCII characters in names for tags, branches, bookmarks,
2701 If you use non-ASCII characters in names for tags, branches, bookmarks,
2702 authors, and/or commit descriptions, you must pay attention to encodings of
2702 authors, and/or commit descriptions, you must pay attention to encodings of
2703 managed files. At template expansion, non-ASCII characters use the encoding
2703 managed files. At template expansion, non-ASCII characters use the encoding
2704 specified by the ``--encoding`` global option, ``HGENCODING`` or other
2704 specified by the ``--encoding`` global option, ``HGENCODING`` or other
2705 environment variables that govern your locale. If the encoding of the merge
2705 environment variables that govern your locale. If the encoding of the merge
2706 markers is different from the encoding of the merged files,
2706 markers is different from the encoding of the merged files,
2707 serious problems may occur.
2707 serious problems may occur.
2708
2708
2709 Can be overridden per-merge-tool, see the ``[merge-tools]`` section.
2709 Can be overridden per-merge-tool, see the ``[merge-tools]`` section.
2710
2710
2711 ``oneline-summary``
2711 ``oneline-summary``
2712 A template used by `hg rebase` and other commands for showing a one-line
2712 A template used by `hg rebase` and other commands for showing a one-line
2713 summary of a commit. If the template configured here is longer than one
2713 summary of a commit. If the template configured here is longer than one
2714 line, then only the first line is used.
2714 line, then only the first line is used.
2715
2715
2716 The template can be overridden per command by defining a template in
2716 The template can be overridden per command by defining a template in
2717 `oneline-summary.<command>`, where `<command>` can be e.g. "rebase".
2717 `oneline-summary.<command>`, where `<command>` can be e.g. "rebase".
2718
2718
2719 ``pre-merge-tool-output``
2719 ``pre-merge-tool-output``
2720 A template that is printed before executing an external merge tool. This can
2720 A template that is printed before executing an external merge tool. This can
2721 be used to print out additional context that might be useful to have during
2721 be used to print out additional context that might be useful to have during
2722 the conflict resolution, such as the description of the various commits
2722 the conflict resolution, such as the description of the various commits
2723 involved or bookmarks/tags.
2723 involved or bookmarks/tags.
2724
2724
2725 Additional information is available in the ``local`, ``base``, and ``other``
2725 Additional information is available in the ``local`, ``base``, and ``other``
2726 dicts. For example: ``{local.label}``, ``{base.name}``, or
2726 dicts. For example: ``{local.label}``, ``{base.name}``, or
2727 ``{other.islink}``.
2727 ``{other.islink}``.
2728
2728
2729
2729
2730 ``web``
2730 ``web``
2731 -------
2731 -------
2732
2732
2733 Web interface configuration. The settings in this section apply to
2733 Web interface configuration. The settings in this section apply to
2734 both the builtin webserver (started by :hg:`serve`) and the script you
2734 both the builtin webserver (started by :hg:`serve`) and the script you
2735 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2735 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2736 and WSGI).
2736 and WSGI).
2737
2737
2738 The Mercurial webserver does no authentication (it does not prompt for
2738 The Mercurial webserver does no authentication (it does not prompt for
2739 usernames and passwords to validate *who* users are), but it does do
2739 usernames and passwords to validate *who* users are), but it does do
2740 authorization (it grants or denies access for *authenticated users*
2740 authorization (it grants or denies access for *authenticated users*
2741 based on settings in this section). You must either configure your
2741 based on settings in this section). You must either configure your
2742 webserver to do authentication for you, or disable the authorization
2742 webserver to do authentication for you, or disable the authorization
2743 checks.
2743 checks.
2744
2744
2745 For a quick setup in a trusted environment, e.g., a private LAN, where
2745 For a quick setup in a trusted environment, e.g., a private LAN, where
2746 you want it to accept pushes from anybody, you can use the following
2746 you want it to accept pushes from anybody, you can use the following
2747 command line::
2747 command line::
2748
2748
2749 $ hg --config web.allow-push=* --config web.push_ssl=False serve
2749 $ hg --config web.allow-push=* --config web.push_ssl=False serve
2750
2750
2751 Note that this will allow anybody to push anything to the server and
2751 Note that this will allow anybody to push anything to the server and
2752 that this should not be used for public servers.
2752 that this should not be used for public servers.
2753
2753
2754 The full set of options is:
2754 The full set of options is:
2755
2755
2756 ``accesslog``
2756 ``accesslog``
2757 Where to output the access log. (default: stdout)
2757 Where to output the access log. (default: stdout)
2758
2758
2759 ``address``
2759 ``address``
2760 Interface address to bind to. (default: all)
2760 Interface address to bind to. (default: all)
2761
2761
2762 ``allow-archive``
2762 ``allow-archive``
2763 List of archive format (bz2, gz, zip) allowed for downloading.
2763 List of archive format (bz2, gz, zip) allowed for downloading.
2764 (default: empty)
2764 (default: empty)
2765
2765
2766 ``allowbz2``
2766 ``allowbz2``
2767 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2767 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2768 revisions.
2768 revisions.
2769 (default: False)
2769 (default: False)
2770
2770
2771 ``allowgz``
2771 ``allowgz``
2772 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2772 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2773 revisions.
2773 revisions.
2774 (default: False)
2774 (default: False)
2775
2775
2776 ``allow-pull``
2776 ``allow-pull``
2777 Whether to allow pulling from the repository. (default: True)
2777 Whether to allow pulling from the repository. (default: True)
2778
2778
2779 ``allow-push``
2779 ``allow-push``
2780 Whether to allow pushing to the repository. If empty or not set,
2780 Whether to allow pushing to the repository. If empty or not set,
2781 pushing is not allowed. If the special value ``*``, any remote
2781 pushing is not allowed. If the special value ``*``, any remote
2782 user can push, including unauthenticated users. Otherwise, the
2782 user can push, including unauthenticated users. Otherwise, the
2783 remote user must have been authenticated, and the authenticated
2783 remote user must have been authenticated, and the authenticated
2784 user name must be present in this list. The contents of the
2784 user name must be present in this list. The contents of the
2785 allow-push list are examined after the deny_push list.
2785 allow-push list are examined after the deny_push list.
2786
2786
2787 ``allow_read``
2787 ``allow_read``
2788 If the user has not already been denied repository access due to
2788 If the user has not already been denied repository access due to
2789 the contents of deny_read, this list determines whether to grant
2789 the contents of deny_read, this list determines whether to grant
2790 repository access to the user. If this list is not empty, and the
2790 repository access to the user. If this list is not empty, and the
2791 user is unauthenticated or not present in the list, then access is
2791 user is unauthenticated or not present in the list, then access is
2792 denied for the user. If the list is empty or not set, then access
2792 denied for the user. If the list is empty or not set, then access
2793 is permitted to all users by default. Setting allow_read to the
2793 is permitted to all users by default. Setting allow_read to the
2794 special value ``*`` is equivalent to it not being set (i.e. access
2794 special value ``*`` is equivalent to it not being set (i.e. access
2795 is permitted to all users). The contents of the allow_read list are
2795 is permitted to all users). The contents of the allow_read list are
2796 examined after the deny_read list.
2796 examined after the deny_read list.
2797
2797
2798 ``allowzip``
2798 ``allowzip``
2799 (DEPRECATED) Whether to allow .zip downloading of repository
2799 (DEPRECATED) Whether to allow .zip downloading of repository
2800 revisions. This feature creates temporary files.
2800 revisions. This feature creates temporary files.
2801 (default: False)
2801 (default: False)
2802
2802
2803 ``archivesubrepos``
2803 ``archivesubrepos``
2804 Whether to recurse into subrepositories when archiving.
2804 Whether to recurse into subrepositories when archiving.
2805 (default: False)
2805 (default: False)
2806
2806
2807 ``baseurl``
2807 ``baseurl``
2808 Base URL to use when publishing URLs in other locations, so
2808 Base URL to use when publishing URLs in other locations, so
2809 third-party tools like email notification hooks can construct
2809 third-party tools like email notification hooks can construct
2810 URLs. Example: ``http://hgserver/repos/``.
2810 URLs. Example: ``http://hgserver/repos/``.
2811
2811
2812 ``cacerts``
2812 ``cacerts``
2813 Path to file containing a list of PEM encoded certificate
2813 Path to file containing a list of PEM encoded certificate
2814 authority certificates. Environment variables and ``~user``
2814 authority certificates. Environment variables and ``~user``
2815 constructs are expanded in the filename. If specified on the
2815 constructs are expanded in the filename. If specified on the
2816 client, then it will verify the identity of remote HTTPS servers
2816 client, then it will verify the identity of remote HTTPS servers
2817 with these certificates.
2817 with these certificates.
2818
2818
2819 To disable SSL verification temporarily, specify ``--insecure`` from
2819 To disable SSL verification temporarily, specify ``--insecure`` from
2820 command line.
2820 command line.
2821
2821
2822 You can use OpenSSL's CA certificate file if your platform has
2822 You can use OpenSSL's CA certificate file if your platform has
2823 one. On most Linux systems this will be
2823 one. On most Linux systems this will be
2824 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2824 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2825 generate this file manually. The form must be as follows::
2825 generate this file manually. The form must be as follows::
2826
2826
2827 -----BEGIN CERTIFICATE-----
2827 -----BEGIN CERTIFICATE-----
2828 ... (certificate in base64 PEM encoding) ...
2828 ... (certificate in base64 PEM encoding) ...
2829 -----END CERTIFICATE-----
2829 -----END CERTIFICATE-----
2830 -----BEGIN CERTIFICATE-----
2830 -----BEGIN CERTIFICATE-----
2831 ... (certificate in base64 PEM encoding) ...
2831 ... (certificate in base64 PEM encoding) ...
2832 -----END CERTIFICATE-----
2832 -----END CERTIFICATE-----
2833
2833
2834 ``cache``
2834 ``cache``
2835 Whether to support caching in hgweb. (default: True)
2835 Whether to support caching in hgweb. (default: True)
2836
2836
2837 ``certificate``
2837 ``certificate``
2838 Certificate to use when running :hg:`serve`.
2838 Certificate to use when running :hg:`serve`.
2839
2839
2840 ``collapse``
2840 ``collapse``
2841 With ``descend`` enabled, repositories in subdirectories are shown at
2841 With ``descend`` enabled, repositories in subdirectories are shown at
2842 a single level alongside repositories in the current path. With
2842 a single level alongside repositories in the current path. With
2843 ``collapse`` also enabled, repositories residing at a deeper level than
2843 ``collapse`` also enabled, repositories residing at a deeper level than
2844 the current path are grouped behind navigable directory entries that
2844 the current path are grouped behind navigable directory entries that
2845 lead to the locations of these repositories. In effect, this setting
2845 lead to the locations of these repositories. In effect, this setting
2846 collapses each collection of repositories found within a subdirectory
2846 collapses each collection of repositories found within a subdirectory
2847 into a single entry for that subdirectory. (default: False)
2847 into a single entry for that subdirectory. (default: False)
2848
2848
2849 ``comparisoncontext``
2849 ``comparisoncontext``
2850 Number of lines of context to show in side-by-side file comparison. If
2850 Number of lines of context to show in side-by-side file comparison. If
2851 negative or the value ``full``, whole files are shown. (default: 5)
2851 negative or the value ``full``, whole files are shown. (default: 5)
2852
2852
2853 This setting can be overridden by a ``context`` request parameter to the
2853 This setting can be overridden by a ``context`` request parameter to the
2854 ``comparison`` command, taking the same values.
2854 ``comparison`` command, taking the same values.
2855
2855
2856 ``contact``
2856 ``contact``
2857 Name or email address of the person in charge of the repository.
2857 Name or email address of the person in charge of the repository.
2858 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2858 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2859
2859
2860 ``csp``
2860 ``csp``
2861 Send a ``Content-Security-Policy`` HTTP header with this value.
2861 Send a ``Content-Security-Policy`` HTTP header with this value.
2862
2862
2863 The value may contain a special string ``%nonce%``, which will be replaced
2863 The value may contain a special string ``%nonce%``, which will be replaced
2864 by a randomly-generated one-time use value. If the value contains
2864 by a randomly-generated one-time use value. If the value contains
2865 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2865 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2866 one-time property of the nonce. This nonce will also be inserted into
2866 one-time property of the nonce. This nonce will also be inserted into
2867 ``<script>`` elements containing inline JavaScript.
2867 ``<script>`` elements containing inline JavaScript.
2868
2868
2869 Note: lots of HTML content sent by the server is derived from repository
2869 Note: lots of HTML content sent by the server is derived from repository
2870 data. Please consider the potential for malicious repository data to
2870 data. Please consider the potential for malicious repository data to
2871 "inject" itself into generated HTML content as part of your security
2871 "inject" itself into generated HTML content as part of your security
2872 threat model.
2872 threat model.
2873
2873
2874 ``deny_push``
2874 ``deny_push``
2875 Whether to deny pushing to the repository. If empty or not set,
2875 Whether to deny pushing to the repository. If empty or not set,
2876 push is not denied. If the special value ``*``, all remote users are
2876 push is not denied. If the special value ``*``, all remote users are
2877 denied push. Otherwise, unauthenticated users are all denied, and
2877 denied push. Otherwise, unauthenticated users are all denied, and
2878 any authenticated user name present in this list is also denied. The
2878 any authenticated user name present in this list is also denied. The
2879 contents of the deny_push list are examined before the allow-push list.
2879 contents of the deny_push list are examined before the allow-push list.
2880
2880
2881 ``deny_read``
2881 ``deny_read``
2882 Whether to deny reading/viewing of the repository. If this list is
2882 Whether to deny reading/viewing of the repository. If this list is
2883 not empty, unauthenticated users are all denied, and any
2883 not empty, unauthenticated users are all denied, and any
2884 authenticated user name present in this list is also denied access to
2884 authenticated user name present in this list is also denied access to
2885 the repository. If set to the special value ``*``, all remote users
2885 the repository. If set to the special value ``*``, all remote users
2886 are denied access (rarely needed ;). If deny_read is empty or not set,
2886 are denied access (rarely needed ;). If deny_read is empty or not set,
2887 the determination of repository access depends on the presence and
2887 the determination of repository access depends on the presence and
2888 content of the allow_read list (see description). If both
2888 content of the allow_read list (see description). If both
2889 deny_read and allow_read are empty or not set, then access is
2889 deny_read and allow_read are empty or not set, then access is
2890 permitted to all users by default. If the repository is being
2890 permitted to all users by default. If the repository is being
2891 served via hgwebdir, denied users will not be able to see it in
2891 served via hgwebdir, denied users will not be able to see it in
2892 the list of repositories. The contents of the deny_read list have
2892 the list of repositories. The contents of the deny_read list have
2893 priority over (are examined before) the contents of the allow_read
2893 priority over (are examined before) the contents of the allow_read
2894 list.
2894 list.
2895
2895
2896 ``descend``
2896 ``descend``
2897 hgwebdir indexes will not descend into subdirectories. Only repositories
2897 hgwebdir indexes will not descend into subdirectories. Only repositories
2898 directly in the current path will be shown (other repositories are still
2898 directly in the current path will be shown (other repositories are still
2899 available from the index corresponding to their containing path).
2899 available from the index corresponding to their containing path).
2900
2900
2901 ``description``
2901 ``description``
2902 Textual description of the repository's purpose or contents.
2902 Textual description of the repository's purpose or contents.
2903 (default: "unknown")
2903 (default: "unknown")
2904
2904
2905 ``encoding``
2905 ``encoding``
2906 Character encoding name. (default: the current locale charset)
2906 Character encoding name. (default: the current locale charset)
2907 Example: "UTF-8".
2907 Example: "UTF-8".
2908
2908
2909 ``errorlog``
2909 ``errorlog``
2910 Where to output the error log. (default: stderr)
2910 Where to output the error log. (default: stderr)
2911
2911
2912 ``guessmime``
2912 ``guessmime``
2913 Control MIME types for raw download of file content.
2913 Control MIME types for raw download of file content.
2914 Set to True to let hgweb guess the content type from the file
2914 Set to True to let hgweb guess the content type from the file
2915 extension. This will serve HTML files as ``text/html`` and might
2915 extension. This will serve HTML files as ``text/html`` and might
2916 allow cross-site scripting attacks when serving untrusted
2916 allow cross-site scripting attacks when serving untrusted
2917 repositories. (default: False)
2917 repositories. (default: False)
2918
2918
2919 ``hidden``
2919 ``hidden``
2920 Whether to hide the repository in the hgwebdir index.
2920 Whether to hide the repository in the hgwebdir index.
2921 (default: False)
2921 (default: False)
2922
2922
2923 ``ipv6``
2923 ``ipv6``
2924 Whether to use IPv6. (default: False)
2924 Whether to use IPv6. (default: False)
2925
2925
2926 ``labels``
2926 ``labels``
2927 List of string *labels* associated with the repository.
2927 List of string *labels* associated with the repository.
2928
2928
2929 Labels are exposed as a template keyword and can be used to customize
2929 Labels are exposed as a template keyword and can be used to customize
2930 output. e.g. the ``index`` template can group or filter repositories
2930 output. e.g. the ``index`` template can group or filter repositories
2931 by labels and the ``summary`` template can display additional content
2931 by labels and the ``summary`` template can display additional content
2932 if a specific label is present.
2932 if a specific label is present.
2933
2933
2934 ``logoimg``
2934 ``logoimg``
2935 File name of the logo image that some templates display on each page.
2935 File name of the logo image that some templates display on each page.
2936 The file name is relative to ``staticurl``. That is, the full path to
2936 The file name is relative to ``staticurl``. That is, the full path to
2937 the logo image is "staticurl/logoimg".
2937 the logo image is "staticurl/logoimg".
2938 If unset, ``hglogo.png`` will be used.
2938 If unset, ``hglogo.png`` will be used.
2939
2939
2940 ``logourl``
2940 ``logourl``
2941 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2941 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2942 will be used.
2942 will be used.
2943
2943
2944 ``maxchanges``
2944 ``maxchanges``
2945 Maximum number of changes to list on the changelog. (default: 10)
2945 Maximum number of changes to list on the changelog. (default: 10)
2946
2946
2947 ``maxfiles``
2947 ``maxfiles``
2948 Maximum number of files to list per changeset. (default: 10)
2948 Maximum number of files to list per changeset. (default: 10)
2949
2949
2950 ``maxshortchanges``
2950 ``maxshortchanges``
2951 Maximum number of changes to list on the shortlog, graph or filelog
2951 Maximum number of changes to list on the shortlog, graph or filelog
2952 pages. (default: 60)
2952 pages. (default: 60)
2953
2953
2954 ``name``
2954 ``name``
2955 Repository name to use in the web interface.
2955 Repository name to use in the web interface.
2956 (default: current working directory)
2956 (default: current working directory)
2957
2957
2958 ``port``
2958 ``port``
2959 Port to listen on. (default: 8000)
2959 Port to listen on. (default: 8000)
2960
2960
2961 ``prefix``
2961 ``prefix``
2962 Prefix path to serve from. (default: '' (server root))
2962 Prefix path to serve from. (default: '' (server root))
2963
2963
2964 ``push_ssl``
2964 ``push_ssl``
2965 Whether to require that inbound pushes be transported over SSL to
2965 Whether to require that inbound pushes be transported over SSL to
2966 prevent password sniffing. (default: True)
2966 prevent password sniffing. (default: True)
2967
2967
2968 ``refreshinterval``
2968 ``refreshinterval``
2969 How frequently directory listings re-scan the filesystem for new
2969 How frequently directory listings re-scan the filesystem for new
2970 repositories, in seconds. This is relevant when wildcards are used
2970 repositories, in seconds. This is relevant when wildcards are used
2971 to define paths. Depending on how much filesystem traversal is
2971 to define paths. Depending on how much filesystem traversal is
2972 required, refreshing may negatively impact performance.
2972 required, refreshing may negatively impact performance.
2973
2973
2974 Values less than or equal to 0 always refresh.
2974 Values less than or equal to 0 always refresh.
2975 (default: 20)
2975 (default: 20)
2976
2976
2977 ``server-header``
2977 ``server-header``
2978 Value for HTTP ``Server`` response header.
2978 Value for HTTP ``Server`` response header.
2979
2979
2980 ``static``
2980 ``static``
2981 Directory where static files are served from.
2981 Directory where static files are served from.
2982
2982
2983 ``staticurl``
2983 ``staticurl``
2984 Base URL to use for static files. If unset, static files (e.g. the
2984 Base URL to use for static files. If unset, static files (e.g. the
2985 hgicon.png favicon) will be served by the CGI script itself. Use
2985 hgicon.png favicon) will be served by the CGI script itself. Use
2986 this setting to serve them directly with the HTTP server.
2986 this setting to serve them directly with the HTTP server.
2987 Example: ``http://hgserver/static/``.
2987 Example: ``http://hgserver/static/``.
2988
2988
2989 ``stripes``
2989 ``stripes``
2990 How many lines a "zebra stripe" should span in multi-line output.
2990 How many lines a "zebra stripe" should span in multi-line output.
2991 Set to 0 to disable. (default: 1)
2991 Set to 0 to disable. (default: 1)
2992
2992
2993 ``style``
2993 ``style``
2994 Which template map style to use. The available options are the names of
2994 Which template map style to use. The available options are the names of
2995 subdirectories in the HTML templates path. (default: ``paper``)
2995 subdirectories in the HTML templates path. (default: ``paper``)
2996 Example: ``monoblue``.
2996 Example: ``monoblue``.
2997
2997
2998 ``templates``
2998 ``templates``
2999 Where to find the HTML templates. The default path to the HTML templates
2999 Where to find the HTML templates. The default path to the HTML templates
3000 can be obtained from ``hg debuginstall``.
3000 can be obtained from ``hg debuginstall``.
3001
3001
3002 ``websub``
3002 ``websub``
3003 ----------
3003 ----------
3004
3004
3005 Web substitution filter definition. You can use this section to
3005 Web substitution filter definition. You can use this section to
3006 define a set of regular expression substitution patterns which
3006 define a set of regular expression substitution patterns which
3007 let you automatically modify the hgweb server output.
3007 let you automatically modify the hgweb server output.
3008
3008
3009 The default hgweb templates only apply these substitution patterns
3009 The default hgweb templates only apply these substitution patterns
3010 on the revision description fields. You can apply them anywhere
3010 on the revision description fields. You can apply them anywhere
3011 you want when you create your own templates by adding calls to the
3011 you want when you create your own templates by adding calls to the
3012 "websub" filter (usually after calling the "escape" filter).
3012 "websub" filter (usually after calling the "escape" filter).
3013
3013
3014 This can be used, for example, to convert issue references to links
3014 This can be used, for example, to convert issue references to links
3015 to your issue tracker, or to convert "markdown-like" syntax into
3015 to your issue tracker, or to convert "markdown-like" syntax into
3016 HTML (see the examples below).
3016 HTML (see the examples below).
3017
3017
3018 Each entry in this section names a substitution filter.
3018 Each entry in this section names a substitution filter.
3019 The value of each entry defines the substitution expression itself.
3019 The value of each entry defines the substitution expression itself.
3020 The websub expressions follow the old interhg extension syntax,
3020 The websub expressions follow the old interhg extension syntax,
3021 which in turn imitates the Unix sed replacement syntax::
3021 which in turn imitates the Unix sed replacement syntax::
3022
3022
3023 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
3023 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
3024
3024
3025 You can use any separator other than "/". The final "i" is optional
3025 You can use any separator other than "/". The final "i" is optional
3026 and indicates that the search must be case insensitive.
3026 and indicates that the search must be case insensitive.
3027
3027
3028 Examples::
3028 Examples::
3029
3029
3030 [websub]
3030 [websub]
3031 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
3031 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
3032 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
3032 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
3033 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
3033 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
3034
3034
3035 ``worker``
3035 ``worker``
3036 ----------
3036 ----------
3037
3037
3038 Parallel master/worker configuration. We currently perform working
3038 Parallel master/worker configuration. We currently perform working
3039 directory updates in parallel on Unix-like systems, which greatly
3039 directory updates in parallel on Unix-like systems, which greatly
3040 helps performance.
3040 helps performance.
3041
3041
3042 ``enabled``
3042 ``enabled``
3043 Whether to enable workers code to be used.
3043 Whether to enable workers code to be used.
3044 (default: true)
3044 (default: true)
3045
3045
3046 ``numcpus``
3046 ``numcpus``
3047 Number of CPUs to use for parallel operations. A zero or
3047 Number of CPUs to use for parallel operations. A zero or
3048 negative value is treated as ``use the default``.
3048 negative value is treated as ``use the default``.
3049 (default: 4 or the number of CPUs on the system, whichever is larger)
3049 (default: 4 or the number of CPUs on the system, whichever is larger)
3050
3050
3051 ``backgroundclose``
3051 ``backgroundclose``
3052 Whether to enable closing file handles on background threads during certain
3052 Whether to enable closing file handles on background threads during certain
3053 operations. Some platforms aren't very efficient at closing file
3053 operations. Some platforms aren't very efficient at closing file
3054 handles that have been written or appended to. By performing file closing
3054 handles that have been written or appended to. By performing file closing
3055 on background threads, file write rate can increase substantially.
3055 on background threads, file write rate can increase substantially.
3056 (default: true on Windows, false elsewhere)
3056 (default: true on Windows, false elsewhere)
3057
3057
3058 ``backgroundcloseminfilecount``
3058 ``backgroundcloseminfilecount``
3059 Minimum number of files required to trigger background file closing.
3059 Minimum number of files required to trigger background file closing.
3060 Operations not writing this many files won't start background close
3060 Operations not writing this many files won't start background close
3061 threads.
3061 threads.
3062 (default: 2048)
3062 (default: 2048)
3063
3063
3064 ``backgroundclosemaxqueue``
3064 ``backgroundclosemaxqueue``
3065 The maximum number of opened file handles waiting to be closed in the
3065 The maximum number of opened file handles waiting to be closed in the
3066 background. This option only has an effect if ``backgroundclose`` is
3066 background. This option only has an effect if ``backgroundclose`` is
3067 enabled.
3067 enabled.
3068 (default: 384)
3068 (default: 384)
3069
3069
3070 ``backgroundclosethreadcount``
3070 ``backgroundclosethreadcount``
3071 Number of threads to process background file closes. Only relevant if
3071 Number of threads to process background file closes. Only relevant if
3072 ``backgroundclose`` is enabled.
3072 ``backgroundclose`` is enabled.
3073 (default: 4)
3073 (default: 4)
@@ -1,3698 +1,3698 b''
1 # localrepo.py - read/write repository class for mercurial
1 # localrepo.py - read/write repository class for mercurial
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@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 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import errno
10 import errno
11 import functools
11 import functools
12 import os
12 import os
13 import random
13 import random
14 import sys
14 import sys
15 import time
15 import time
16 import weakref
16 import weakref
17
17
18 from .i18n import _
18 from .i18n import _
19 from .node import (
19 from .node import (
20 bin,
20 bin,
21 hex,
21 hex,
22 nullid,
22 nullid,
23 nullrev,
23 nullrev,
24 short,
24 short,
25 )
25 )
26 from .pycompat import (
26 from .pycompat import (
27 delattr,
27 delattr,
28 getattr,
28 getattr,
29 )
29 )
30 from . import (
30 from . import (
31 bookmarks,
31 bookmarks,
32 branchmap,
32 branchmap,
33 bundle2,
33 bundle2,
34 bundlecaches,
34 bundlecaches,
35 changegroup,
35 changegroup,
36 color,
36 color,
37 commit,
37 commit,
38 context,
38 context,
39 dirstate,
39 dirstate,
40 dirstateguard,
40 dirstateguard,
41 discovery,
41 discovery,
42 encoding,
42 encoding,
43 error,
43 error,
44 exchange,
44 exchange,
45 extensions,
45 extensions,
46 filelog,
46 filelog,
47 hook,
47 hook,
48 lock as lockmod,
48 lock as lockmod,
49 match as matchmod,
49 match as matchmod,
50 mergestate as mergestatemod,
50 mergestate as mergestatemod,
51 mergeutil,
51 mergeutil,
52 namespaces,
52 namespaces,
53 narrowspec,
53 narrowspec,
54 obsolete,
54 obsolete,
55 pathutil,
55 pathutil,
56 phases,
56 phases,
57 pushkey,
57 pushkey,
58 pycompat,
58 pycompat,
59 rcutil,
59 rcutil,
60 repoview,
60 repoview,
61 requirements as requirementsmod,
61 requirements as requirementsmod,
62 revlog,
62 revlog,
63 revset,
63 revset,
64 revsetlang,
64 revsetlang,
65 scmutil,
65 scmutil,
66 sparse,
66 sparse,
67 store as storemod,
67 store as storemod,
68 subrepoutil,
68 subrepoutil,
69 tags as tagsmod,
69 tags as tagsmod,
70 transaction,
70 transaction,
71 txnutil,
71 txnutil,
72 util,
72 util,
73 vfs as vfsmod,
73 vfs as vfsmod,
74 )
74 )
75
75
76 from .interfaces import (
76 from .interfaces import (
77 repository,
77 repository,
78 util as interfaceutil,
78 util as interfaceutil,
79 )
79 )
80
80
81 from .utils import (
81 from .utils import (
82 hashutil,
82 hashutil,
83 procutil,
83 procutil,
84 stringutil,
84 stringutil,
85 )
85 )
86
86
87 from .revlogutils import (
87 from .revlogutils import (
88 concurrency_checker as revlogchecker,
88 concurrency_checker as revlogchecker,
89 constants as revlogconst,
89 constants as revlogconst,
90 )
90 )
91
91
92 release = lockmod.release
92 release = lockmod.release
93 urlerr = util.urlerr
93 urlerr = util.urlerr
94 urlreq = util.urlreq
94 urlreq = util.urlreq
95
95
96 # set of (path, vfs-location) tuples. vfs-location is:
96 # set of (path, vfs-location) tuples. vfs-location is:
97 # - 'plain for vfs relative paths
97 # - 'plain for vfs relative paths
98 # - '' for svfs relative paths
98 # - '' for svfs relative paths
99 _cachedfiles = set()
99 _cachedfiles = set()
100
100
101
101
102 class _basefilecache(scmutil.filecache):
102 class _basefilecache(scmutil.filecache):
103 """All filecache usage on repo are done for logic that should be unfiltered"""
103 """All filecache usage on repo are done for logic that should be unfiltered"""
104
104
105 def __get__(self, repo, type=None):
105 def __get__(self, repo, type=None):
106 if repo is None:
106 if repo is None:
107 return self
107 return self
108 # proxy to unfiltered __dict__ since filtered repo has no entry
108 # proxy to unfiltered __dict__ since filtered repo has no entry
109 unfi = repo.unfiltered()
109 unfi = repo.unfiltered()
110 try:
110 try:
111 return unfi.__dict__[self.sname]
111 return unfi.__dict__[self.sname]
112 except KeyError:
112 except KeyError:
113 pass
113 pass
114 return super(_basefilecache, self).__get__(unfi, type)
114 return super(_basefilecache, self).__get__(unfi, type)
115
115
116 def set(self, repo, value):
116 def set(self, repo, value):
117 return super(_basefilecache, self).set(repo.unfiltered(), value)
117 return super(_basefilecache, self).set(repo.unfiltered(), value)
118
118
119
119
120 class repofilecache(_basefilecache):
120 class repofilecache(_basefilecache):
121 """filecache for files in .hg but outside of .hg/store"""
121 """filecache for files in .hg but outside of .hg/store"""
122
122
123 def __init__(self, *paths):
123 def __init__(self, *paths):
124 super(repofilecache, self).__init__(*paths)
124 super(repofilecache, self).__init__(*paths)
125 for path in paths:
125 for path in paths:
126 _cachedfiles.add((path, b'plain'))
126 _cachedfiles.add((path, b'plain'))
127
127
128 def join(self, obj, fname):
128 def join(self, obj, fname):
129 return obj.vfs.join(fname)
129 return obj.vfs.join(fname)
130
130
131
131
132 class storecache(_basefilecache):
132 class storecache(_basefilecache):
133 """filecache for files in the store"""
133 """filecache for files in the store"""
134
134
135 def __init__(self, *paths):
135 def __init__(self, *paths):
136 super(storecache, self).__init__(*paths)
136 super(storecache, self).__init__(*paths)
137 for path in paths:
137 for path in paths:
138 _cachedfiles.add((path, b''))
138 _cachedfiles.add((path, b''))
139
139
140 def join(self, obj, fname):
140 def join(self, obj, fname):
141 return obj.sjoin(fname)
141 return obj.sjoin(fname)
142
142
143
143
144 class mixedrepostorecache(_basefilecache):
144 class mixedrepostorecache(_basefilecache):
145 """filecache for a mix files in .hg/store and outside"""
145 """filecache for a mix files in .hg/store and outside"""
146
146
147 def __init__(self, *pathsandlocations):
147 def __init__(self, *pathsandlocations):
148 # scmutil.filecache only uses the path for passing back into our
148 # scmutil.filecache only uses the path for passing back into our
149 # join(), so we can safely pass a list of paths and locations
149 # join(), so we can safely pass a list of paths and locations
150 super(mixedrepostorecache, self).__init__(*pathsandlocations)
150 super(mixedrepostorecache, self).__init__(*pathsandlocations)
151 _cachedfiles.update(pathsandlocations)
151 _cachedfiles.update(pathsandlocations)
152
152
153 def join(self, obj, fnameandlocation):
153 def join(self, obj, fnameandlocation):
154 fname, location = fnameandlocation
154 fname, location = fnameandlocation
155 if location == b'plain':
155 if location == b'plain':
156 return obj.vfs.join(fname)
156 return obj.vfs.join(fname)
157 else:
157 else:
158 if location != b'':
158 if location != b'':
159 raise error.ProgrammingError(
159 raise error.ProgrammingError(
160 b'unexpected location: %s' % location
160 b'unexpected location: %s' % location
161 )
161 )
162 return obj.sjoin(fname)
162 return obj.sjoin(fname)
163
163
164
164
165 def isfilecached(repo, name):
165 def isfilecached(repo, name):
166 """check if a repo has already cached "name" filecache-ed property
166 """check if a repo has already cached "name" filecache-ed property
167
167
168 This returns (cachedobj-or-None, iscached) tuple.
168 This returns (cachedobj-or-None, iscached) tuple.
169 """
169 """
170 cacheentry = repo.unfiltered()._filecache.get(name, None)
170 cacheentry = repo.unfiltered()._filecache.get(name, None)
171 if not cacheentry:
171 if not cacheentry:
172 return None, False
172 return None, False
173 return cacheentry.obj, True
173 return cacheentry.obj, True
174
174
175
175
176 class unfilteredpropertycache(util.propertycache):
176 class unfilteredpropertycache(util.propertycache):
177 """propertycache that apply to unfiltered repo only"""
177 """propertycache that apply to unfiltered repo only"""
178
178
179 def __get__(self, repo, type=None):
179 def __get__(self, repo, type=None):
180 unfi = repo.unfiltered()
180 unfi = repo.unfiltered()
181 if unfi is repo:
181 if unfi is repo:
182 return super(unfilteredpropertycache, self).__get__(unfi)
182 return super(unfilteredpropertycache, self).__get__(unfi)
183 return getattr(unfi, self.name)
183 return getattr(unfi, self.name)
184
184
185
185
186 class filteredpropertycache(util.propertycache):
186 class filteredpropertycache(util.propertycache):
187 """propertycache that must take filtering in account"""
187 """propertycache that must take filtering in account"""
188
188
189 def cachevalue(self, obj, value):
189 def cachevalue(self, obj, value):
190 object.__setattr__(obj, self.name, value)
190 object.__setattr__(obj, self.name, value)
191
191
192
192
193 def hasunfilteredcache(repo, name):
193 def hasunfilteredcache(repo, name):
194 """check if a repo has an unfilteredpropertycache value for <name>"""
194 """check if a repo has an unfilteredpropertycache value for <name>"""
195 return name in vars(repo.unfiltered())
195 return name in vars(repo.unfiltered())
196
196
197
197
198 def unfilteredmethod(orig):
198 def unfilteredmethod(orig):
199 """decorate method that always need to be run on unfiltered version"""
199 """decorate method that always need to be run on unfiltered version"""
200
200
201 @functools.wraps(orig)
201 @functools.wraps(orig)
202 def wrapper(repo, *args, **kwargs):
202 def wrapper(repo, *args, **kwargs):
203 return orig(repo.unfiltered(), *args, **kwargs)
203 return orig(repo.unfiltered(), *args, **kwargs)
204
204
205 return wrapper
205 return wrapper
206
206
207
207
208 moderncaps = {
208 moderncaps = {
209 b'lookup',
209 b'lookup',
210 b'branchmap',
210 b'branchmap',
211 b'pushkey',
211 b'pushkey',
212 b'known',
212 b'known',
213 b'getbundle',
213 b'getbundle',
214 b'unbundle',
214 b'unbundle',
215 }
215 }
216 legacycaps = moderncaps.union({b'changegroupsubset'})
216 legacycaps = moderncaps.union({b'changegroupsubset'})
217
217
218
218
219 @interfaceutil.implementer(repository.ipeercommandexecutor)
219 @interfaceutil.implementer(repository.ipeercommandexecutor)
220 class localcommandexecutor(object):
220 class localcommandexecutor(object):
221 def __init__(self, peer):
221 def __init__(self, peer):
222 self._peer = peer
222 self._peer = peer
223 self._sent = False
223 self._sent = False
224 self._closed = False
224 self._closed = False
225
225
226 def __enter__(self):
226 def __enter__(self):
227 return self
227 return self
228
228
229 def __exit__(self, exctype, excvalue, exctb):
229 def __exit__(self, exctype, excvalue, exctb):
230 self.close()
230 self.close()
231
231
232 def callcommand(self, command, args):
232 def callcommand(self, command, args):
233 if self._sent:
233 if self._sent:
234 raise error.ProgrammingError(
234 raise error.ProgrammingError(
235 b'callcommand() cannot be used after sendcommands()'
235 b'callcommand() cannot be used after sendcommands()'
236 )
236 )
237
237
238 if self._closed:
238 if self._closed:
239 raise error.ProgrammingError(
239 raise error.ProgrammingError(
240 b'callcommand() cannot be used after close()'
240 b'callcommand() cannot be used after close()'
241 )
241 )
242
242
243 # We don't need to support anything fancy. Just call the named
243 # We don't need to support anything fancy. Just call the named
244 # method on the peer and return a resolved future.
244 # method on the peer and return a resolved future.
245 fn = getattr(self._peer, pycompat.sysstr(command))
245 fn = getattr(self._peer, pycompat.sysstr(command))
246
246
247 f = pycompat.futures.Future()
247 f = pycompat.futures.Future()
248
248
249 try:
249 try:
250 result = fn(**pycompat.strkwargs(args))
250 result = fn(**pycompat.strkwargs(args))
251 except Exception:
251 except Exception:
252 pycompat.future_set_exception_info(f, sys.exc_info()[1:])
252 pycompat.future_set_exception_info(f, sys.exc_info()[1:])
253 else:
253 else:
254 f.set_result(result)
254 f.set_result(result)
255
255
256 return f
256 return f
257
257
258 def sendcommands(self):
258 def sendcommands(self):
259 self._sent = True
259 self._sent = True
260
260
261 def close(self):
261 def close(self):
262 self._closed = True
262 self._closed = True
263
263
264
264
265 @interfaceutil.implementer(repository.ipeercommands)
265 @interfaceutil.implementer(repository.ipeercommands)
266 class localpeer(repository.peer):
266 class localpeer(repository.peer):
267 '''peer for a local repo; reflects only the most recent API'''
267 '''peer for a local repo; reflects only the most recent API'''
268
268
269 def __init__(self, repo, caps=None):
269 def __init__(self, repo, caps=None):
270 super(localpeer, self).__init__()
270 super(localpeer, self).__init__()
271
271
272 if caps is None:
272 if caps is None:
273 caps = moderncaps.copy()
273 caps = moderncaps.copy()
274 self._repo = repo.filtered(b'served')
274 self._repo = repo.filtered(b'served')
275 self.ui = repo.ui
275 self.ui = repo.ui
276 self._caps = repo._restrictcapabilities(caps)
276 self._caps = repo._restrictcapabilities(caps)
277
277
278 # Begin of _basepeer interface.
278 # Begin of _basepeer interface.
279
279
280 def url(self):
280 def url(self):
281 return self._repo.url()
281 return self._repo.url()
282
282
283 def local(self):
283 def local(self):
284 return self._repo
284 return self._repo
285
285
286 def peer(self):
286 def peer(self):
287 return self
287 return self
288
288
289 def canpush(self):
289 def canpush(self):
290 return True
290 return True
291
291
292 def close(self):
292 def close(self):
293 self._repo.close()
293 self._repo.close()
294
294
295 # End of _basepeer interface.
295 # End of _basepeer interface.
296
296
297 # Begin of _basewirecommands interface.
297 # Begin of _basewirecommands interface.
298
298
299 def branchmap(self):
299 def branchmap(self):
300 return self._repo.branchmap()
300 return self._repo.branchmap()
301
301
302 def capabilities(self):
302 def capabilities(self):
303 return self._caps
303 return self._caps
304
304
305 def clonebundles(self):
305 def clonebundles(self):
306 return self._repo.tryread(bundlecaches.CB_MANIFEST_FILE)
306 return self._repo.tryread(bundlecaches.CB_MANIFEST_FILE)
307
307
308 def debugwireargs(self, one, two, three=None, four=None, five=None):
308 def debugwireargs(self, one, two, three=None, four=None, five=None):
309 """Used to test argument passing over the wire"""
309 """Used to test argument passing over the wire"""
310 return b"%s %s %s %s %s" % (
310 return b"%s %s %s %s %s" % (
311 one,
311 one,
312 two,
312 two,
313 pycompat.bytestr(three),
313 pycompat.bytestr(three),
314 pycompat.bytestr(four),
314 pycompat.bytestr(four),
315 pycompat.bytestr(five),
315 pycompat.bytestr(five),
316 )
316 )
317
317
318 def getbundle(
318 def getbundle(
319 self, source, heads=None, common=None, bundlecaps=None, **kwargs
319 self, source, heads=None, common=None, bundlecaps=None, **kwargs
320 ):
320 ):
321 chunks = exchange.getbundlechunks(
321 chunks = exchange.getbundlechunks(
322 self._repo,
322 self._repo,
323 source,
323 source,
324 heads=heads,
324 heads=heads,
325 common=common,
325 common=common,
326 bundlecaps=bundlecaps,
326 bundlecaps=bundlecaps,
327 **kwargs
327 **kwargs
328 )[1]
328 )[1]
329 cb = util.chunkbuffer(chunks)
329 cb = util.chunkbuffer(chunks)
330
330
331 if exchange.bundle2requested(bundlecaps):
331 if exchange.bundle2requested(bundlecaps):
332 # When requesting a bundle2, getbundle returns a stream to make the
332 # When requesting a bundle2, getbundle returns a stream to make the
333 # wire level function happier. We need to build a proper object
333 # wire level function happier. We need to build a proper object
334 # from it in local peer.
334 # from it in local peer.
335 return bundle2.getunbundler(self.ui, cb)
335 return bundle2.getunbundler(self.ui, cb)
336 else:
336 else:
337 return changegroup.getunbundler(b'01', cb, None)
337 return changegroup.getunbundler(b'01', cb, None)
338
338
339 def heads(self):
339 def heads(self):
340 return self._repo.heads()
340 return self._repo.heads()
341
341
342 def known(self, nodes):
342 def known(self, nodes):
343 return self._repo.known(nodes)
343 return self._repo.known(nodes)
344
344
345 def listkeys(self, namespace):
345 def listkeys(self, namespace):
346 return self._repo.listkeys(namespace)
346 return self._repo.listkeys(namespace)
347
347
348 def lookup(self, key):
348 def lookup(self, key):
349 return self._repo.lookup(key)
349 return self._repo.lookup(key)
350
350
351 def pushkey(self, namespace, key, old, new):
351 def pushkey(self, namespace, key, old, new):
352 return self._repo.pushkey(namespace, key, old, new)
352 return self._repo.pushkey(namespace, key, old, new)
353
353
354 def stream_out(self):
354 def stream_out(self):
355 raise error.Abort(_(b'cannot perform stream clone against local peer'))
355 raise error.Abort(_(b'cannot perform stream clone against local peer'))
356
356
357 def unbundle(self, bundle, heads, url):
357 def unbundle(self, bundle, heads, url):
358 """apply a bundle on a repo
358 """apply a bundle on a repo
359
359
360 This function handles the repo locking itself."""
360 This function handles the repo locking itself."""
361 try:
361 try:
362 try:
362 try:
363 bundle = exchange.readbundle(self.ui, bundle, None)
363 bundle = exchange.readbundle(self.ui, bundle, None)
364 ret = exchange.unbundle(self._repo, bundle, heads, b'push', url)
364 ret = exchange.unbundle(self._repo, bundle, heads, b'push', url)
365 if util.safehasattr(ret, b'getchunks'):
365 if util.safehasattr(ret, b'getchunks'):
366 # This is a bundle20 object, turn it into an unbundler.
366 # This is a bundle20 object, turn it into an unbundler.
367 # This little dance should be dropped eventually when the
367 # This little dance should be dropped eventually when the
368 # API is finally improved.
368 # API is finally improved.
369 stream = util.chunkbuffer(ret.getchunks())
369 stream = util.chunkbuffer(ret.getchunks())
370 ret = bundle2.getunbundler(self.ui, stream)
370 ret = bundle2.getunbundler(self.ui, stream)
371 return ret
371 return ret
372 except Exception as exc:
372 except Exception as exc:
373 # If the exception contains output salvaged from a bundle2
373 # If the exception contains output salvaged from a bundle2
374 # reply, we need to make sure it is printed before continuing
374 # reply, we need to make sure it is printed before continuing
375 # to fail. So we build a bundle2 with such output and consume
375 # to fail. So we build a bundle2 with such output and consume
376 # it directly.
376 # it directly.
377 #
377 #
378 # This is not very elegant but allows a "simple" solution for
378 # This is not very elegant but allows a "simple" solution for
379 # issue4594
379 # issue4594
380 output = getattr(exc, '_bundle2salvagedoutput', ())
380 output = getattr(exc, '_bundle2salvagedoutput', ())
381 if output:
381 if output:
382 bundler = bundle2.bundle20(self._repo.ui)
382 bundler = bundle2.bundle20(self._repo.ui)
383 for out in output:
383 for out in output:
384 bundler.addpart(out)
384 bundler.addpart(out)
385 stream = util.chunkbuffer(bundler.getchunks())
385 stream = util.chunkbuffer(bundler.getchunks())
386 b = bundle2.getunbundler(self.ui, stream)
386 b = bundle2.getunbundler(self.ui, stream)
387 bundle2.processbundle(self._repo, b)
387 bundle2.processbundle(self._repo, b)
388 raise
388 raise
389 except error.PushRaced as exc:
389 except error.PushRaced as exc:
390 raise error.ResponseError(
390 raise error.ResponseError(
391 _(b'push failed:'), stringutil.forcebytestr(exc)
391 _(b'push failed:'), stringutil.forcebytestr(exc)
392 )
392 )
393
393
394 # End of _basewirecommands interface.
394 # End of _basewirecommands interface.
395
395
396 # Begin of peer interface.
396 # Begin of peer interface.
397
397
398 def commandexecutor(self):
398 def commandexecutor(self):
399 return localcommandexecutor(self)
399 return localcommandexecutor(self)
400
400
401 # End of peer interface.
401 # End of peer interface.
402
402
403
403
404 @interfaceutil.implementer(repository.ipeerlegacycommands)
404 @interfaceutil.implementer(repository.ipeerlegacycommands)
405 class locallegacypeer(localpeer):
405 class locallegacypeer(localpeer):
406 """peer extension which implements legacy methods too; used for tests with
406 """peer extension which implements legacy methods too; used for tests with
407 restricted capabilities"""
407 restricted capabilities"""
408
408
409 def __init__(self, repo):
409 def __init__(self, repo):
410 super(locallegacypeer, self).__init__(repo, caps=legacycaps)
410 super(locallegacypeer, self).__init__(repo, caps=legacycaps)
411
411
412 # Begin of baselegacywirecommands interface.
412 # Begin of baselegacywirecommands interface.
413
413
414 def between(self, pairs):
414 def between(self, pairs):
415 return self._repo.between(pairs)
415 return self._repo.between(pairs)
416
416
417 def branches(self, nodes):
417 def branches(self, nodes):
418 return self._repo.branches(nodes)
418 return self._repo.branches(nodes)
419
419
420 def changegroup(self, nodes, source):
420 def changegroup(self, nodes, source):
421 outgoing = discovery.outgoing(
421 outgoing = discovery.outgoing(
422 self._repo, missingroots=nodes, ancestorsof=self._repo.heads()
422 self._repo, missingroots=nodes, ancestorsof=self._repo.heads()
423 )
423 )
424 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
424 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
425
425
426 def changegroupsubset(self, bases, heads, source):
426 def changegroupsubset(self, bases, heads, source):
427 outgoing = discovery.outgoing(
427 outgoing = discovery.outgoing(
428 self._repo, missingroots=bases, ancestorsof=heads
428 self._repo, missingroots=bases, ancestorsof=heads
429 )
429 )
430 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
430 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
431
431
432 # End of baselegacywirecommands interface.
432 # End of baselegacywirecommands interface.
433
433
434
434
435 # Functions receiving (ui, features) that extensions can register to impact
435 # Functions receiving (ui, features) that extensions can register to impact
436 # the ability to load repositories with custom requirements. Only
436 # the ability to load repositories with custom requirements. Only
437 # functions defined in loaded extensions are called.
437 # functions defined in loaded extensions are called.
438 #
438 #
439 # The function receives a set of requirement strings that the repository
439 # The function receives a set of requirement strings that the repository
440 # is capable of opening. Functions will typically add elements to the
440 # is capable of opening. Functions will typically add elements to the
441 # set to reflect that the extension knows how to handle that requirements.
441 # set to reflect that the extension knows how to handle that requirements.
442 featuresetupfuncs = set()
442 featuresetupfuncs = set()
443
443
444
444
445 def _getsharedvfs(hgvfs, requirements):
445 def _getsharedvfs(hgvfs, requirements):
446 """returns the vfs object pointing to root of shared source
446 """returns the vfs object pointing to root of shared source
447 repo for a shared repository
447 repo for a shared repository
448
448
449 hgvfs is vfs pointing at .hg/ of current repo (shared one)
449 hgvfs is vfs pointing at .hg/ of current repo (shared one)
450 requirements is a set of requirements of current repo (shared one)
450 requirements is a set of requirements of current repo (shared one)
451 """
451 """
452 # The ``shared`` or ``relshared`` requirements indicate the
452 # The ``shared`` or ``relshared`` requirements indicate the
453 # store lives in the path contained in the ``.hg/sharedpath`` file.
453 # store lives in the path contained in the ``.hg/sharedpath`` file.
454 # This is an absolute path for ``shared`` and relative to
454 # This is an absolute path for ``shared`` and relative to
455 # ``.hg/`` for ``relshared``.
455 # ``.hg/`` for ``relshared``.
456 sharedpath = hgvfs.read(b'sharedpath').rstrip(b'\n')
456 sharedpath = hgvfs.read(b'sharedpath').rstrip(b'\n')
457 if requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements:
457 if requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements:
458 sharedpath = hgvfs.join(sharedpath)
458 sharedpath = hgvfs.join(sharedpath)
459
459
460 sharedvfs = vfsmod.vfs(sharedpath, realpath=True)
460 sharedvfs = vfsmod.vfs(sharedpath, realpath=True)
461
461
462 if not sharedvfs.exists():
462 if not sharedvfs.exists():
463 raise error.RepoError(
463 raise error.RepoError(
464 _(b'.hg/sharedpath points to nonexistent directory %s')
464 _(b'.hg/sharedpath points to nonexistent directory %s')
465 % sharedvfs.base
465 % sharedvfs.base
466 )
466 )
467 return sharedvfs
467 return sharedvfs
468
468
469
469
470 def _readrequires(vfs, allowmissing):
470 def _readrequires(vfs, allowmissing):
471 """reads the require file present at root of this vfs
471 """reads the require file present at root of this vfs
472 and return a set of requirements
472 and return a set of requirements
473
473
474 If allowmissing is True, we suppress ENOENT if raised"""
474 If allowmissing is True, we suppress ENOENT if raised"""
475 # requires file contains a newline-delimited list of
475 # requires file contains a newline-delimited list of
476 # features/capabilities the opener (us) must have in order to use
476 # features/capabilities the opener (us) must have in order to use
477 # the repository. This file was introduced in Mercurial 0.9.2,
477 # the repository. This file was introduced in Mercurial 0.9.2,
478 # which means very old repositories may not have one. We assume
478 # which means very old repositories may not have one. We assume
479 # a missing file translates to no requirements.
479 # a missing file translates to no requirements.
480 try:
480 try:
481 requirements = set(vfs.read(b'requires').splitlines())
481 requirements = set(vfs.read(b'requires').splitlines())
482 except IOError as e:
482 except IOError as e:
483 if not (allowmissing and e.errno == errno.ENOENT):
483 if not (allowmissing and e.errno == errno.ENOENT):
484 raise
484 raise
485 requirements = set()
485 requirements = set()
486 return requirements
486 return requirements
487
487
488
488
489 def makelocalrepository(baseui, path, intents=None):
489 def makelocalrepository(baseui, path, intents=None):
490 """Create a local repository object.
490 """Create a local repository object.
491
491
492 Given arguments needed to construct a local repository, this function
492 Given arguments needed to construct a local repository, this function
493 performs various early repository loading functionality (such as
493 performs various early repository loading functionality (such as
494 reading the ``.hg/requires`` and ``.hg/hgrc`` files), validates that
494 reading the ``.hg/requires`` and ``.hg/hgrc`` files), validates that
495 the repository can be opened, derives a type suitable for representing
495 the repository can be opened, derives a type suitable for representing
496 that repository, and returns an instance of it.
496 that repository, and returns an instance of it.
497
497
498 The returned object conforms to the ``repository.completelocalrepository``
498 The returned object conforms to the ``repository.completelocalrepository``
499 interface.
499 interface.
500
500
501 The repository type is derived by calling a series of factory functions
501 The repository type is derived by calling a series of factory functions
502 for each aspect/interface of the final repository. These are defined by
502 for each aspect/interface of the final repository. These are defined by
503 ``REPO_INTERFACES``.
503 ``REPO_INTERFACES``.
504
504
505 Each factory function is called to produce a type implementing a specific
505 Each factory function is called to produce a type implementing a specific
506 interface. The cumulative list of returned types will be combined into a
506 interface. The cumulative list of returned types will be combined into a
507 new type and that type will be instantiated to represent the local
507 new type and that type will be instantiated to represent the local
508 repository.
508 repository.
509
509
510 The factory functions each receive various state that may be consulted
510 The factory functions each receive various state that may be consulted
511 as part of deriving a type.
511 as part of deriving a type.
512
512
513 Extensions should wrap these factory functions to customize repository type
513 Extensions should wrap these factory functions to customize repository type
514 creation. Note that an extension's wrapped function may be called even if
514 creation. Note that an extension's wrapped function may be called even if
515 that extension is not loaded for the repo being constructed. Extensions
515 that extension is not loaded for the repo being constructed. Extensions
516 should check if their ``__name__`` appears in the
516 should check if their ``__name__`` appears in the
517 ``extensionmodulenames`` set passed to the factory function and no-op if
517 ``extensionmodulenames`` set passed to the factory function and no-op if
518 not.
518 not.
519 """
519 """
520 ui = baseui.copy()
520 ui = baseui.copy()
521 # Prevent copying repo configuration.
521 # Prevent copying repo configuration.
522 ui.copy = baseui.copy
522 ui.copy = baseui.copy
523
523
524 # Working directory VFS rooted at repository root.
524 # Working directory VFS rooted at repository root.
525 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
525 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
526
526
527 # Main VFS for .hg/ directory.
527 # Main VFS for .hg/ directory.
528 hgpath = wdirvfs.join(b'.hg')
528 hgpath = wdirvfs.join(b'.hg')
529 hgvfs = vfsmod.vfs(hgpath, cacheaudited=True)
529 hgvfs = vfsmod.vfs(hgpath, cacheaudited=True)
530 # Whether this repository is shared one or not
530 # Whether this repository is shared one or not
531 shared = False
531 shared = False
532 # If this repository is shared, vfs pointing to shared repo
532 # If this repository is shared, vfs pointing to shared repo
533 sharedvfs = None
533 sharedvfs = None
534
534
535 # The .hg/ path should exist and should be a directory. All other
535 # The .hg/ path should exist and should be a directory. All other
536 # cases are errors.
536 # cases are errors.
537 if not hgvfs.isdir():
537 if not hgvfs.isdir():
538 try:
538 try:
539 hgvfs.stat()
539 hgvfs.stat()
540 except OSError as e:
540 except OSError as e:
541 if e.errno != errno.ENOENT:
541 if e.errno != errno.ENOENT:
542 raise
542 raise
543 except ValueError as e:
543 except ValueError as e:
544 # Can be raised on Python 3.8 when path is invalid.
544 # Can be raised on Python 3.8 when path is invalid.
545 raise error.Abort(
545 raise error.Abort(
546 _(b'invalid path %s: %s') % (path, pycompat.bytestr(e))
546 _(b'invalid path %s: %s') % (path, stringutil.forcebytestr(e))
547 )
547 )
548
548
549 raise error.RepoError(_(b'repository %s not found') % path)
549 raise error.RepoError(_(b'repository %s not found') % path)
550
550
551 requirements = _readrequires(hgvfs, True)
551 requirements = _readrequires(hgvfs, True)
552 shared = (
552 shared = (
553 requirementsmod.SHARED_REQUIREMENT in requirements
553 requirementsmod.SHARED_REQUIREMENT in requirements
554 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
554 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
555 )
555 )
556 storevfs = None
556 storevfs = None
557 if shared:
557 if shared:
558 # This is a shared repo
558 # This is a shared repo
559 sharedvfs = _getsharedvfs(hgvfs, requirements)
559 sharedvfs = _getsharedvfs(hgvfs, requirements)
560 storevfs = vfsmod.vfs(sharedvfs.join(b'store'))
560 storevfs = vfsmod.vfs(sharedvfs.join(b'store'))
561 else:
561 else:
562 storevfs = vfsmod.vfs(hgvfs.join(b'store'))
562 storevfs = vfsmod.vfs(hgvfs.join(b'store'))
563
563
564 # if .hg/requires contains the sharesafe requirement, it means
564 # if .hg/requires contains the sharesafe requirement, it means
565 # there exists a `.hg/store/requires` too and we should read it
565 # there exists a `.hg/store/requires` too and we should read it
566 # NOTE: presence of SHARESAFE_REQUIREMENT imply that store requirement
566 # NOTE: presence of SHARESAFE_REQUIREMENT imply that store requirement
567 # is present. We never write SHARESAFE_REQUIREMENT for a repo if store
567 # is present. We never write SHARESAFE_REQUIREMENT for a repo if store
568 # is not present, refer checkrequirementscompat() for that
568 # is not present, refer checkrequirementscompat() for that
569 #
569 #
570 # However, if SHARESAFE_REQUIREMENT is not present, it means that the
570 # However, if SHARESAFE_REQUIREMENT is not present, it means that the
571 # repository was shared the old way. We check the share source .hg/requires
571 # repository was shared the old way. We check the share source .hg/requires
572 # for SHARESAFE_REQUIREMENT to detect whether the current repository needs
572 # for SHARESAFE_REQUIREMENT to detect whether the current repository needs
573 # to be reshared
573 # to be reshared
574 hint = _("see `hg help config.format.use-share-safe` for more information")
574 hint = _(b"see `hg help config.format.use-share-safe` for more information")
575 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
575 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
576
576
577 if (
577 if (
578 shared
578 shared
579 and requirementsmod.SHARESAFE_REQUIREMENT
579 and requirementsmod.SHARESAFE_REQUIREMENT
580 not in _readrequires(sharedvfs, True)
580 not in _readrequires(sharedvfs, True)
581 ):
581 ):
582 mismatch_warn = ui.configbool(
582 mismatch_warn = ui.configbool(
583 b'share', b'safe-mismatch.source-not-safe.warn'
583 b'share', b'safe-mismatch.source-not-safe.warn'
584 )
584 )
585 mismatch_config = ui.config(
585 mismatch_config = ui.config(
586 b'share', b'safe-mismatch.source-not-safe'
586 b'share', b'safe-mismatch.source-not-safe'
587 )
587 )
588 if mismatch_config in (
588 if mismatch_config in (
589 b'downgrade-allow',
589 b'downgrade-allow',
590 b'allow',
590 b'allow',
591 b'downgrade-abort',
591 b'downgrade-abort',
592 ):
592 ):
593 # prevent cyclic import localrepo -> upgrade -> localrepo
593 # prevent cyclic import localrepo -> upgrade -> localrepo
594 from . import upgrade
594 from . import upgrade
595
595
596 upgrade.downgrade_share_to_non_safe(
596 upgrade.downgrade_share_to_non_safe(
597 ui,
597 ui,
598 hgvfs,
598 hgvfs,
599 sharedvfs,
599 sharedvfs,
600 requirements,
600 requirements,
601 mismatch_config,
601 mismatch_config,
602 mismatch_warn,
602 mismatch_warn,
603 )
603 )
604 elif mismatch_config == b'abort':
604 elif mismatch_config == b'abort':
605 raise error.Abort(
605 raise error.Abort(
606 _(b"share source does not support share-safe requirement"),
606 _(b"share source does not support share-safe requirement"),
607 hint=hint,
607 hint=hint,
608 )
608 )
609 else:
609 else:
610 raise error.Abort(
610 raise error.Abort(
611 _(
611 _(
612 b"share-safe mismatch with source.\nUnrecognized"
612 b"share-safe mismatch with source.\nUnrecognized"
613 b" value '%s' of `share.safe-mismatch.source-not-safe`"
613 b" value '%s' of `share.safe-mismatch.source-not-safe`"
614 b" set."
614 b" set."
615 )
615 )
616 % mismatch_config,
616 % mismatch_config,
617 hint=hint,
617 hint=hint,
618 )
618 )
619 else:
619 else:
620 requirements |= _readrequires(storevfs, False)
620 requirements |= _readrequires(storevfs, False)
621 elif shared:
621 elif shared:
622 sourcerequires = _readrequires(sharedvfs, False)
622 sourcerequires = _readrequires(sharedvfs, False)
623 if requirementsmod.SHARESAFE_REQUIREMENT in sourcerequires:
623 if requirementsmod.SHARESAFE_REQUIREMENT in sourcerequires:
624 mismatch_config = ui.config(b'share', b'safe-mismatch.source-safe')
624 mismatch_config = ui.config(b'share', b'safe-mismatch.source-safe')
625 mismatch_warn = ui.configbool(
625 mismatch_warn = ui.configbool(
626 b'share', b'safe-mismatch.source-safe.warn'
626 b'share', b'safe-mismatch.source-safe.warn'
627 )
627 )
628 if mismatch_config in (
628 if mismatch_config in (
629 b'upgrade-allow',
629 b'upgrade-allow',
630 b'allow',
630 b'allow',
631 b'upgrade-abort',
631 b'upgrade-abort',
632 ):
632 ):
633 # prevent cyclic import localrepo -> upgrade -> localrepo
633 # prevent cyclic import localrepo -> upgrade -> localrepo
634 from . import upgrade
634 from . import upgrade
635
635
636 upgrade.upgrade_share_to_safe(
636 upgrade.upgrade_share_to_safe(
637 ui,
637 ui,
638 hgvfs,
638 hgvfs,
639 storevfs,
639 storevfs,
640 requirements,
640 requirements,
641 mismatch_config,
641 mismatch_config,
642 mismatch_warn,
642 mismatch_warn,
643 )
643 )
644 elif mismatch_config == b'abort':
644 elif mismatch_config == b'abort':
645 raise error.Abort(
645 raise error.Abort(
646 _(
646 _(
647 b'version mismatch: source uses share-safe'
647 b'version mismatch: source uses share-safe'
648 b' functionality while the current share does not'
648 b' functionality while the current share does not'
649 ),
649 ),
650 hint=hint,
650 hint=hint,
651 )
651 )
652 else:
652 else:
653 raise error.Abort(
653 raise error.Abort(
654 _(
654 _(
655 b"share-safe mismatch with source.\nUnrecognized"
655 b"share-safe mismatch with source.\nUnrecognized"
656 b" value '%s' of `share.safe-mismatch.source-safe` set."
656 b" value '%s' of `share.safe-mismatch.source-safe` set."
657 )
657 )
658 % mismatch_config,
658 % mismatch_config,
659 hint=hint,
659 hint=hint,
660 )
660 )
661
661
662 # The .hg/hgrc file may load extensions or contain config options
662 # The .hg/hgrc file may load extensions or contain config options
663 # that influence repository construction. Attempt to load it and
663 # that influence repository construction. Attempt to load it and
664 # process any new extensions that it may have pulled in.
664 # process any new extensions that it may have pulled in.
665 if loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs):
665 if loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs):
666 afterhgrcload(ui, wdirvfs, hgvfs, requirements)
666 afterhgrcload(ui, wdirvfs, hgvfs, requirements)
667 extensions.loadall(ui)
667 extensions.loadall(ui)
668 extensions.populateui(ui)
668 extensions.populateui(ui)
669
669
670 # Set of module names of extensions loaded for this repository.
670 # Set of module names of extensions loaded for this repository.
671 extensionmodulenames = {m.__name__ for n, m in extensions.extensions(ui)}
671 extensionmodulenames = {m.__name__ for n, m in extensions.extensions(ui)}
672
672
673 supportedrequirements = gathersupportedrequirements(ui)
673 supportedrequirements = gathersupportedrequirements(ui)
674
674
675 # We first validate the requirements are known.
675 # We first validate the requirements are known.
676 ensurerequirementsrecognized(requirements, supportedrequirements)
676 ensurerequirementsrecognized(requirements, supportedrequirements)
677
677
678 # Then we validate that the known set is reasonable to use together.
678 # Then we validate that the known set is reasonable to use together.
679 ensurerequirementscompatible(ui, requirements)
679 ensurerequirementscompatible(ui, requirements)
680
680
681 # TODO there are unhandled edge cases related to opening repositories with
681 # TODO there are unhandled edge cases related to opening repositories with
682 # shared storage. If storage is shared, we should also test for requirements
682 # shared storage. If storage is shared, we should also test for requirements
683 # compatibility in the pointed-to repo. This entails loading the .hg/hgrc in
683 # compatibility in the pointed-to repo. This entails loading the .hg/hgrc in
684 # that repo, as that repo may load extensions needed to open it. This is a
684 # that repo, as that repo may load extensions needed to open it. This is a
685 # bit complicated because we don't want the other hgrc to overwrite settings
685 # bit complicated because we don't want the other hgrc to overwrite settings
686 # in this hgrc.
686 # in this hgrc.
687 #
687 #
688 # This bug is somewhat mitigated by the fact that we copy the .hg/requires
688 # This bug is somewhat mitigated by the fact that we copy the .hg/requires
689 # file when sharing repos. But if a requirement is added after the share is
689 # file when sharing repos. But if a requirement is added after the share is
690 # performed, thereby introducing a new requirement for the opener, we may
690 # performed, thereby introducing a new requirement for the opener, we may
691 # will not see that and could encounter a run-time error interacting with
691 # will not see that and could encounter a run-time error interacting with
692 # that shared store since it has an unknown-to-us requirement.
692 # that shared store since it has an unknown-to-us requirement.
693
693
694 # At this point, we know we should be capable of opening the repository.
694 # At this point, we know we should be capable of opening the repository.
695 # Now get on with doing that.
695 # Now get on with doing that.
696
696
697 features = set()
697 features = set()
698
698
699 # The "store" part of the repository holds versioned data. How it is
699 # The "store" part of the repository holds versioned data. How it is
700 # accessed is determined by various requirements. If `shared` or
700 # accessed is determined by various requirements. If `shared` or
701 # `relshared` requirements are present, this indicates current repository
701 # `relshared` requirements are present, this indicates current repository
702 # is a share and store exists in path mentioned in `.hg/sharedpath`
702 # is a share and store exists in path mentioned in `.hg/sharedpath`
703 if shared:
703 if shared:
704 storebasepath = sharedvfs.base
704 storebasepath = sharedvfs.base
705 cachepath = sharedvfs.join(b'cache')
705 cachepath = sharedvfs.join(b'cache')
706 features.add(repository.REPO_FEATURE_SHARED_STORAGE)
706 features.add(repository.REPO_FEATURE_SHARED_STORAGE)
707 else:
707 else:
708 storebasepath = hgvfs.base
708 storebasepath = hgvfs.base
709 cachepath = hgvfs.join(b'cache')
709 cachepath = hgvfs.join(b'cache')
710 wcachepath = hgvfs.join(b'wcache')
710 wcachepath = hgvfs.join(b'wcache')
711
711
712 # The store has changed over time and the exact layout is dictated by
712 # The store has changed over time and the exact layout is dictated by
713 # requirements. The store interface abstracts differences across all
713 # requirements. The store interface abstracts differences across all
714 # of them.
714 # of them.
715 store = makestore(
715 store = makestore(
716 requirements,
716 requirements,
717 storebasepath,
717 storebasepath,
718 lambda base: vfsmod.vfs(base, cacheaudited=True),
718 lambda base: vfsmod.vfs(base, cacheaudited=True),
719 )
719 )
720 hgvfs.createmode = store.createmode
720 hgvfs.createmode = store.createmode
721
721
722 storevfs = store.vfs
722 storevfs = store.vfs
723 storevfs.options = resolvestorevfsoptions(ui, requirements, features)
723 storevfs.options = resolvestorevfsoptions(ui, requirements, features)
724
724
725 # The cache vfs is used to manage cache files.
725 # The cache vfs is used to manage cache files.
726 cachevfs = vfsmod.vfs(cachepath, cacheaudited=True)
726 cachevfs = vfsmod.vfs(cachepath, cacheaudited=True)
727 cachevfs.createmode = store.createmode
727 cachevfs.createmode = store.createmode
728 # The cache vfs is used to manage cache files related to the working copy
728 # The cache vfs is used to manage cache files related to the working copy
729 wcachevfs = vfsmod.vfs(wcachepath, cacheaudited=True)
729 wcachevfs = vfsmod.vfs(wcachepath, cacheaudited=True)
730 wcachevfs.createmode = store.createmode
730 wcachevfs.createmode = store.createmode
731
731
732 # Now resolve the type for the repository object. We do this by repeatedly
732 # Now resolve the type for the repository object. We do this by repeatedly
733 # calling a factory function to produces types for specific aspects of the
733 # calling a factory function to produces types for specific aspects of the
734 # repo's operation. The aggregate returned types are used as base classes
734 # repo's operation. The aggregate returned types are used as base classes
735 # for a dynamically-derived type, which will represent our new repository.
735 # for a dynamically-derived type, which will represent our new repository.
736
736
737 bases = []
737 bases = []
738 extrastate = {}
738 extrastate = {}
739
739
740 for iface, fn in REPO_INTERFACES:
740 for iface, fn in REPO_INTERFACES:
741 # We pass all potentially useful state to give extensions tons of
741 # We pass all potentially useful state to give extensions tons of
742 # flexibility.
742 # flexibility.
743 typ = fn()(
743 typ = fn()(
744 ui=ui,
744 ui=ui,
745 intents=intents,
745 intents=intents,
746 requirements=requirements,
746 requirements=requirements,
747 features=features,
747 features=features,
748 wdirvfs=wdirvfs,
748 wdirvfs=wdirvfs,
749 hgvfs=hgvfs,
749 hgvfs=hgvfs,
750 store=store,
750 store=store,
751 storevfs=storevfs,
751 storevfs=storevfs,
752 storeoptions=storevfs.options,
752 storeoptions=storevfs.options,
753 cachevfs=cachevfs,
753 cachevfs=cachevfs,
754 wcachevfs=wcachevfs,
754 wcachevfs=wcachevfs,
755 extensionmodulenames=extensionmodulenames,
755 extensionmodulenames=extensionmodulenames,
756 extrastate=extrastate,
756 extrastate=extrastate,
757 baseclasses=bases,
757 baseclasses=bases,
758 )
758 )
759
759
760 if not isinstance(typ, type):
760 if not isinstance(typ, type):
761 raise error.ProgrammingError(
761 raise error.ProgrammingError(
762 b'unable to construct type for %s' % iface
762 b'unable to construct type for %s' % iface
763 )
763 )
764
764
765 bases.append(typ)
765 bases.append(typ)
766
766
767 # type() allows you to use characters in type names that wouldn't be
767 # type() allows you to use characters in type names that wouldn't be
768 # recognized as Python symbols in source code. We abuse that to add
768 # recognized as Python symbols in source code. We abuse that to add
769 # rich information about our constructed repo.
769 # rich information about our constructed repo.
770 name = pycompat.sysstr(
770 name = pycompat.sysstr(
771 b'derivedrepo:%s<%s>' % (wdirvfs.base, b','.join(sorted(requirements)))
771 b'derivedrepo:%s<%s>' % (wdirvfs.base, b','.join(sorted(requirements)))
772 )
772 )
773
773
774 cls = type(name, tuple(bases), {})
774 cls = type(name, tuple(bases), {})
775
775
776 return cls(
776 return cls(
777 baseui=baseui,
777 baseui=baseui,
778 ui=ui,
778 ui=ui,
779 origroot=path,
779 origroot=path,
780 wdirvfs=wdirvfs,
780 wdirvfs=wdirvfs,
781 hgvfs=hgvfs,
781 hgvfs=hgvfs,
782 requirements=requirements,
782 requirements=requirements,
783 supportedrequirements=supportedrequirements,
783 supportedrequirements=supportedrequirements,
784 sharedpath=storebasepath,
784 sharedpath=storebasepath,
785 store=store,
785 store=store,
786 cachevfs=cachevfs,
786 cachevfs=cachevfs,
787 wcachevfs=wcachevfs,
787 wcachevfs=wcachevfs,
788 features=features,
788 features=features,
789 intents=intents,
789 intents=intents,
790 )
790 )
791
791
792
792
793 def loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs=None):
793 def loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs=None):
794 """Load hgrc files/content into a ui instance.
794 """Load hgrc files/content into a ui instance.
795
795
796 This is called during repository opening to load any additional
796 This is called during repository opening to load any additional
797 config files or settings relevant to the current repository.
797 config files or settings relevant to the current repository.
798
798
799 Returns a bool indicating whether any additional configs were loaded.
799 Returns a bool indicating whether any additional configs were loaded.
800
800
801 Extensions should monkeypatch this function to modify how per-repo
801 Extensions should monkeypatch this function to modify how per-repo
802 configs are loaded. For example, an extension may wish to pull in
802 configs are loaded. For example, an extension may wish to pull in
803 configs from alternate files or sources.
803 configs from alternate files or sources.
804
804
805 sharedvfs is vfs object pointing to source repo if the current one is a
805 sharedvfs is vfs object pointing to source repo if the current one is a
806 shared one
806 shared one
807 """
807 """
808 if not rcutil.use_repo_hgrc():
808 if not rcutil.use_repo_hgrc():
809 return False
809 return False
810
810
811 ret = False
811 ret = False
812 # first load config from shared source if we has to
812 # first load config from shared source if we has to
813 if requirementsmod.SHARESAFE_REQUIREMENT in requirements and sharedvfs:
813 if requirementsmod.SHARESAFE_REQUIREMENT in requirements and sharedvfs:
814 try:
814 try:
815 ui.readconfig(sharedvfs.join(b'hgrc'), root=sharedvfs.base)
815 ui.readconfig(sharedvfs.join(b'hgrc'), root=sharedvfs.base)
816 ret = True
816 ret = True
817 except IOError:
817 except IOError:
818 pass
818 pass
819
819
820 try:
820 try:
821 ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base)
821 ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base)
822 ret = True
822 ret = True
823 except IOError:
823 except IOError:
824 pass
824 pass
825
825
826 try:
826 try:
827 ui.readconfig(hgvfs.join(b'hgrc-not-shared'), root=wdirvfs.base)
827 ui.readconfig(hgvfs.join(b'hgrc-not-shared'), root=wdirvfs.base)
828 ret = True
828 ret = True
829 except IOError:
829 except IOError:
830 pass
830 pass
831
831
832 return ret
832 return ret
833
833
834
834
835 def afterhgrcload(ui, wdirvfs, hgvfs, requirements):
835 def afterhgrcload(ui, wdirvfs, hgvfs, requirements):
836 """Perform additional actions after .hg/hgrc is loaded.
836 """Perform additional actions after .hg/hgrc is loaded.
837
837
838 This function is called during repository loading immediately after
838 This function is called during repository loading immediately after
839 the .hg/hgrc file is loaded and before per-repo extensions are loaded.
839 the .hg/hgrc file is loaded and before per-repo extensions are loaded.
840
840
841 The function can be used to validate configs, automatically add
841 The function can be used to validate configs, automatically add
842 options (including extensions) based on requirements, etc.
842 options (including extensions) based on requirements, etc.
843 """
843 """
844
844
845 # Map of requirements to list of extensions to load automatically when
845 # Map of requirements to list of extensions to load automatically when
846 # requirement is present.
846 # requirement is present.
847 autoextensions = {
847 autoextensions = {
848 b'git': [b'git'],
848 b'git': [b'git'],
849 b'largefiles': [b'largefiles'],
849 b'largefiles': [b'largefiles'],
850 b'lfs': [b'lfs'],
850 b'lfs': [b'lfs'],
851 }
851 }
852
852
853 for requirement, names in sorted(autoextensions.items()):
853 for requirement, names in sorted(autoextensions.items()):
854 if requirement not in requirements:
854 if requirement not in requirements:
855 continue
855 continue
856
856
857 for name in names:
857 for name in names:
858 if not ui.hasconfig(b'extensions', name):
858 if not ui.hasconfig(b'extensions', name):
859 ui.setconfig(b'extensions', name, b'', source=b'autoload')
859 ui.setconfig(b'extensions', name, b'', source=b'autoload')
860
860
861
861
862 def gathersupportedrequirements(ui):
862 def gathersupportedrequirements(ui):
863 """Determine the complete set of recognized requirements."""
863 """Determine the complete set of recognized requirements."""
864 # Start with all requirements supported by this file.
864 # Start with all requirements supported by this file.
865 supported = set(localrepository._basesupported)
865 supported = set(localrepository._basesupported)
866
866
867 # Execute ``featuresetupfuncs`` entries if they belong to an extension
867 # Execute ``featuresetupfuncs`` entries if they belong to an extension
868 # relevant to this ui instance.
868 # relevant to this ui instance.
869 modules = {m.__name__ for n, m in extensions.extensions(ui)}
869 modules = {m.__name__ for n, m in extensions.extensions(ui)}
870
870
871 for fn in featuresetupfuncs:
871 for fn in featuresetupfuncs:
872 if fn.__module__ in modules:
872 if fn.__module__ in modules:
873 fn(ui, supported)
873 fn(ui, supported)
874
874
875 # Add derived requirements from registered compression engines.
875 # Add derived requirements from registered compression engines.
876 for name in util.compengines:
876 for name in util.compengines:
877 engine = util.compengines[name]
877 engine = util.compengines[name]
878 if engine.available() and engine.revlogheader():
878 if engine.available() and engine.revlogheader():
879 supported.add(b'exp-compression-%s' % name)
879 supported.add(b'exp-compression-%s' % name)
880 if engine.name() == b'zstd':
880 if engine.name() == b'zstd':
881 supported.add(b'revlog-compression-zstd')
881 supported.add(b'revlog-compression-zstd')
882
882
883 return supported
883 return supported
884
884
885
885
886 def ensurerequirementsrecognized(requirements, supported):
886 def ensurerequirementsrecognized(requirements, supported):
887 """Validate that a set of local requirements is recognized.
887 """Validate that a set of local requirements is recognized.
888
888
889 Receives a set of requirements. Raises an ``error.RepoError`` if there
889 Receives a set of requirements. Raises an ``error.RepoError`` if there
890 exists any requirement in that set that currently loaded code doesn't
890 exists any requirement in that set that currently loaded code doesn't
891 recognize.
891 recognize.
892
892
893 Returns a set of supported requirements.
893 Returns a set of supported requirements.
894 """
894 """
895 missing = set()
895 missing = set()
896
896
897 for requirement in requirements:
897 for requirement in requirements:
898 if requirement in supported:
898 if requirement in supported:
899 continue
899 continue
900
900
901 if not requirement or not requirement[0:1].isalnum():
901 if not requirement or not requirement[0:1].isalnum():
902 raise error.RequirementError(_(b'.hg/requires file is corrupt'))
902 raise error.RequirementError(_(b'.hg/requires file is corrupt'))
903
903
904 missing.add(requirement)
904 missing.add(requirement)
905
905
906 if missing:
906 if missing:
907 raise error.RequirementError(
907 raise error.RequirementError(
908 _(b'repository requires features unknown to this Mercurial: %s')
908 _(b'repository requires features unknown to this Mercurial: %s')
909 % b' '.join(sorted(missing)),
909 % b' '.join(sorted(missing)),
910 hint=_(
910 hint=_(
911 b'see https://mercurial-scm.org/wiki/MissingRequirement '
911 b'see https://mercurial-scm.org/wiki/MissingRequirement '
912 b'for more information'
912 b'for more information'
913 ),
913 ),
914 )
914 )
915
915
916
916
917 def ensurerequirementscompatible(ui, requirements):
917 def ensurerequirementscompatible(ui, requirements):
918 """Validates that a set of recognized requirements is mutually compatible.
918 """Validates that a set of recognized requirements is mutually compatible.
919
919
920 Some requirements may not be compatible with others or require
920 Some requirements may not be compatible with others or require
921 config options that aren't enabled. This function is called during
921 config options that aren't enabled. This function is called during
922 repository opening to ensure that the set of requirements needed
922 repository opening to ensure that the set of requirements needed
923 to open a repository is sane and compatible with config options.
923 to open a repository is sane and compatible with config options.
924
924
925 Extensions can monkeypatch this function to perform additional
925 Extensions can monkeypatch this function to perform additional
926 checking.
926 checking.
927
927
928 ``error.RepoError`` should be raised on failure.
928 ``error.RepoError`` should be raised on failure.
929 """
929 """
930 if (
930 if (
931 requirementsmod.SPARSE_REQUIREMENT in requirements
931 requirementsmod.SPARSE_REQUIREMENT in requirements
932 and not sparse.enabled
932 and not sparse.enabled
933 ):
933 ):
934 raise error.RepoError(
934 raise error.RepoError(
935 _(
935 _(
936 b'repository is using sparse feature but '
936 b'repository is using sparse feature but '
937 b'sparse is not enabled; enable the '
937 b'sparse is not enabled; enable the '
938 b'"sparse" extensions to access'
938 b'"sparse" extensions to access'
939 )
939 )
940 )
940 )
941
941
942
942
943 def makestore(requirements, path, vfstype):
943 def makestore(requirements, path, vfstype):
944 """Construct a storage object for a repository."""
944 """Construct a storage object for a repository."""
945 if requirementsmod.STORE_REQUIREMENT in requirements:
945 if requirementsmod.STORE_REQUIREMENT in requirements:
946 if requirementsmod.FNCACHE_REQUIREMENT in requirements:
946 if requirementsmod.FNCACHE_REQUIREMENT in requirements:
947 dotencode = requirementsmod.DOTENCODE_REQUIREMENT in requirements
947 dotencode = requirementsmod.DOTENCODE_REQUIREMENT in requirements
948 return storemod.fncachestore(path, vfstype, dotencode)
948 return storemod.fncachestore(path, vfstype, dotencode)
949
949
950 return storemod.encodedstore(path, vfstype)
950 return storemod.encodedstore(path, vfstype)
951
951
952 return storemod.basicstore(path, vfstype)
952 return storemod.basicstore(path, vfstype)
953
953
954
954
955 def resolvestorevfsoptions(ui, requirements, features):
955 def resolvestorevfsoptions(ui, requirements, features):
956 """Resolve the options to pass to the store vfs opener.
956 """Resolve the options to pass to the store vfs opener.
957
957
958 The returned dict is used to influence behavior of the storage layer.
958 The returned dict is used to influence behavior of the storage layer.
959 """
959 """
960 options = {}
960 options = {}
961
961
962 if requirementsmod.TREEMANIFEST_REQUIREMENT in requirements:
962 if requirementsmod.TREEMANIFEST_REQUIREMENT in requirements:
963 options[b'treemanifest'] = True
963 options[b'treemanifest'] = True
964
964
965 # experimental config: format.manifestcachesize
965 # experimental config: format.manifestcachesize
966 manifestcachesize = ui.configint(b'format', b'manifestcachesize')
966 manifestcachesize = ui.configint(b'format', b'manifestcachesize')
967 if manifestcachesize is not None:
967 if manifestcachesize is not None:
968 options[b'manifestcachesize'] = manifestcachesize
968 options[b'manifestcachesize'] = manifestcachesize
969
969
970 # In the absence of another requirement superseding a revlog-related
970 # In the absence of another requirement superseding a revlog-related
971 # requirement, we have to assume the repo is using revlog version 0.
971 # requirement, we have to assume the repo is using revlog version 0.
972 # This revlog format is super old and we don't bother trying to parse
972 # This revlog format is super old and we don't bother trying to parse
973 # opener options for it because those options wouldn't do anything
973 # opener options for it because those options wouldn't do anything
974 # meaningful on such old repos.
974 # meaningful on such old repos.
975 if (
975 if (
976 requirementsmod.REVLOGV1_REQUIREMENT in requirements
976 requirementsmod.REVLOGV1_REQUIREMENT in requirements
977 or requirementsmod.REVLOGV2_REQUIREMENT in requirements
977 or requirementsmod.REVLOGV2_REQUIREMENT in requirements
978 ):
978 ):
979 options.update(resolverevlogstorevfsoptions(ui, requirements, features))
979 options.update(resolverevlogstorevfsoptions(ui, requirements, features))
980 else: # explicitly mark repo as using revlogv0
980 else: # explicitly mark repo as using revlogv0
981 options[b'revlogv0'] = True
981 options[b'revlogv0'] = True
982
982
983 if requirementsmod.COPIESSDC_REQUIREMENT in requirements:
983 if requirementsmod.COPIESSDC_REQUIREMENT in requirements:
984 options[b'copies-storage'] = b'changeset-sidedata'
984 options[b'copies-storage'] = b'changeset-sidedata'
985 else:
985 else:
986 writecopiesto = ui.config(b'experimental', b'copies.write-to')
986 writecopiesto = ui.config(b'experimental', b'copies.write-to')
987 copiesextramode = (b'changeset-only', b'compatibility')
987 copiesextramode = (b'changeset-only', b'compatibility')
988 if writecopiesto in copiesextramode:
988 if writecopiesto in copiesextramode:
989 options[b'copies-storage'] = b'extra'
989 options[b'copies-storage'] = b'extra'
990
990
991 return options
991 return options
992
992
993
993
994 def resolverevlogstorevfsoptions(ui, requirements, features):
994 def resolverevlogstorevfsoptions(ui, requirements, features):
995 """Resolve opener options specific to revlogs."""
995 """Resolve opener options specific to revlogs."""
996
996
997 options = {}
997 options = {}
998 options[b'flagprocessors'] = {}
998 options[b'flagprocessors'] = {}
999
999
1000 if requirementsmod.REVLOGV1_REQUIREMENT in requirements:
1000 if requirementsmod.REVLOGV1_REQUIREMENT in requirements:
1001 options[b'revlogv1'] = True
1001 options[b'revlogv1'] = True
1002 if requirementsmod.REVLOGV2_REQUIREMENT in requirements:
1002 if requirementsmod.REVLOGV2_REQUIREMENT in requirements:
1003 options[b'revlogv2'] = True
1003 options[b'revlogv2'] = True
1004
1004
1005 if requirementsmod.GENERALDELTA_REQUIREMENT in requirements:
1005 if requirementsmod.GENERALDELTA_REQUIREMENT in requirements:
1006 options[b'generaldelta'] = True
1006 options[b'generaldelta'] = True
1007
1007
1008 # experimental config: format.chunkcachesize
1008 # experimental config: format.chunkcachesize
1009 chunkcachesize = ui.configint(b'format', b'chunkcachesize')
1009 chunkcachesize = ui.configint(b'format', b'chunkcachesize')
1010 if chunkcachesize is not None:
1010 if chunkcachesize is not None:
1011 options[b'chunkcachesize'] = chunkcachesize
1011 options[b'chunkcachesize'] = chunkcachesize
1012
1012
1013 deltabothparents = ui.configbool(
1013 deltabothparents = ui.configbool(
1014 b'storage', b'revlog.optimize-delta-parent-choice'
1014 b'storage', b'revlog.optimize-delta-parent-choice'
1015 )
1015 )
1016 options[b'deltabothparents'] = deltabothparents
1016 options[b'deltabothparents'] = deltabothparents
1017
1017
1018 lazydelta = ui.configbool(b'storage', b'revlog.reuse-external-delta')
1018 lazydelta = ui.configbool(b'storage', b'revlog.reuse-external-delta')
1019 lazydeltabase = False
1019 lazydeltabase = False
1020 if lazydelta:
1020 if lazydelta:
1021 lazydeltabase = ui.configbool(
1021 lazydeltabase = ui.configbool(
1022 b'storage', b'revlog.reuse-external-delta-parent'
1022 b'storage', b'revlog.reuse-external-delta-parent'
1023 )
1023 )
1024 if lazydeltabase is None:
1024 if lazydeltabase is None:
1025 lazydeltabase = not scmutil.gddeltaconfig(ui)
1025 lazydeltabase = not scmutil.gddeltaconfig(ui)
1026 options[b'lazydelta'] = lazydelta
1026 options[b'lazydelta'] = lazydelta
1027 options[b'lazydeltabase'] = lazydeltabase
1027 options[b'lazydeltabase'] = lazydeltabase
1028
1028
1029 chainspan = ui.configbytes(b'experimental', b'maxdeltachainspan')
1029 chainspan = ui.configbytes(b'experimental', b'maxdeltachainspan')
1030 if 0 <= chainspan:
1030 if 0 <= chainspan:
1031 options[b'maxdeltachainspan'] = chainspan
1031 options[b'maxdeltachainspan'] = chainspan
1032
1032
1033 mmapindexthreshold = ui.configbytes(b'experimental', b'mmapindexthreshold')
1033 mmapindexthreshold = ui.configbytes(b'experimental', b'mmapindexthreshold')
1034 if mmapindexthreshold is not None:
1034 if mmapindexthreshold is not None:
1035 options[b'mmapindexthreshold'] = mmapindexthreshold
1035 options[b'mmapindexthreshold'] = mmapindexthreshold
1036
1036
1037 withsparseread = ui.configbool(b'experimental', b'sparse-read')
1037 withsparseread = ui.configbool(b'experimental', b'sparse-read')
1038 srdensitythres = float(
1038 srdensitythres = float(
1039 ui.config(b'experimental', b'sparse-read.density-threshold')
1039 ui.config(b'experimental', b'sparse-read.density-threshold')
1040 )
1040 )
1041 srmingapsize = ui.configbytes(b'experimental', b'sparse-read.min-gap-size')
1041 srmingapsize = ui.configbytes(b'experimental', b'sparse-read.min-gap-size')
1042 options[b'with-sparse-read'] = withsparseread
1042 options[b'with-sparse-read'] = withsparseread
1043 options[b'sparse-read-density-threshold'] = srdensitythres
1043 options[b'sparse-read-density-threshold'] = srdensitythres
1044 options[b'sparse-read-min-gap-size'] = srmingapsize
1044 options[b'sparse-read-min-gap-size'] = srmingapsize
1045
1045
1046 sparserevlog = requirementsmod.SPARSEREVLOG_REQUIREMENT in requirements
1046 sparserevlog = requirementsmod.SPARSEREVLOG_REQUIREMENT in requirements
1047 options[b'sparse-revlog'] = sparserevlog
1047 options[b'sparse-revlog'] = sparserevlog
1048 if sparserevlog:
1048 if sparserevlog:
1049 options[b'generaldelta'] = True
1049 options[b'generaldelta'] = True
1050
1050
1051 sidedata = requirementsmod.SIDEDATA_REQUIREMENT in requirements
1051 sidedata = requirementsmod.SIDEDATA_REQUIREMENT in requirements
1052 options[b'side-data'] = sidedata
1052 options[b'side-data'] = sidedata
1053
1053
1054 maxchainlen = None
1054 maxchainlen = None
1055 if sparserevlog:
1055 if sparserevlog:
1056 maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
1056 maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
1057 # experimental config: format.maxchainlen
1057 # experimental config: format.maxchainlen
1058 maxchainlen = ui.configint(b'format', b'maxchainlen', maxchainlen)
1058 maxchainlen = ui.configint(b'format', b'maxchainlen', maxchainlen)
1059 if maxchainlen is not None:
1059 if maxchainlen is not None:
1060 options[b'maxchainlen'] = maxchainlen
1060 options[b'maxchainlen'] = maxchainlen
1061
1061
1062 for r in requirements:
1062 for r in requirements:
1063 # we allow multiple compression engine requirement to co-exist because
1063 # we allow multiple compression engine requirement to co-exist because
1064 # strickly speaking, revlog seems to support mixed compression style.
1064 # strickly speaking, revlog seems to support mixed compression style.
1065 #
1065 #
1066 # The compression used for new entries will be "the last one"
1066 # The compression used for new entries will be "the last one"
1067 prefix = r.startswith
1067 prefix = r.startswith
1068 if prefix(b'revlog-compression-') or prefix(b'exp-compression-'):
1068 if prefix(b'revlog-compression-') or prefix(b'exp-compression-'):
1069 options[b'compengine'] = r.split(b'-', 2)[2]
1069 options[b'compengine'] = r.split(b'-', 2)[2]
1070
1070
1071 options[b'zlib.level'] = ui.configint(b'storage', b'revlog.zlib.level')
1071 options[b'zlib.level'] = ui.configint(b'storage', b'revlog.zlib.level')
1072 if options[b'zlib.level'] is not None:
1072 if options[b'zlib.level'] is not None:
1073 if not (0 <= options[b'zlib.level'] <= 9):
1073 if not (0 <= options[b'zlib.level'] <= 9):
1074 msg = _(b'invalid value for `storage.revlog.zlib.level` config: %d')
1074 msg = _(b'invalid value for `storage.revlog.zlib.level` config: %d')
1075 raise error.Abort(msg % options[b'zlib.level'])
1075 raise error.Abort(msg % options[b'zlib.level'])
1076 options[b'zstd.level'] = ui.configint(b'storage', b'revlog.zstd.level')
1076 options[b'zstd.level'] = ui.configint(b'storage', b'revlog.zstd.level')
1077 if options[b'zstd.level'] is not None:
1077 if options[b'zstd.level'] is not None:
1078 if not (0 <= options[b'zstd.level'] <= 22):
1078 if not (0 <= options[b'zstd.level'] <= 22):
1079 msg = _(b'invalid value for `storage.revlog.zstd.level` config: %d')
1079 msg = _(b'invalid value for `storage.revlog.zstd.level` config: %d')
1080 raise error.Abort(msg % options[b'zstd.level'])
1080 raise error.Abort(msg % options[b'zstd.level'])
1081
1081
1082 if requirementsmod.NARROW_REQUIREMENT in requirements:
1082 if requirementsmod.NARROW_REQUIREMENT in requirements:
1083 options[b'enableellipsis'] = True
1083 options[b'enableellipsis'] = True
1084
1084
1085 if ui.configbool(b'experimental', b'rust.index'):
1085 if ui.configbool(b'experimental', b'rust.index'):
1086 options[b'rust.index'] = True
1086 options[b'rust.index'] = True
1087 if requirementsmod.NODEMAP_REQUIREMENT in requirements:
1087 if requirementsmod.NODEMAP_REQUIREMENT in requirements:
1088 slow_path = ui.config(
1088 slow_path = ui.config(
1089 b'storage', b'revlog.persistent-nodemap.slow-path'
1089 b'storage', b'revlog.persistent-nodemap.slow-path'
1090 )
1090 )
1091 if slow_path not in (b'allow', b'warn', b'abort'):
1091 if slow_path not in (b'allow', b'warn', b'abort'):
1092 default = ui.config_default(
1092 default = ui.config_default(
1093 b'storage', b'revlog.persistent-nodemap.slow-path'
1093 b'storage', b'revlog.persistent-nodemap.slow-path'
1094 )
1094 )
1095 msg = _(
1095 msg = _(
1096 b'unknown value for config '
1096 b'unknown value for config '
1097 b'"storage.revlog.persistent-nodemap.slow-path": "%s"\n'
1097 b'"storage.revlog.persistent-nodemap.slow-path": "%s"\n'
1098 )
1098 )
1099 ui.warn(msg % slow_path)
1099 ui.warn(msg % slow_path)
1100 if not ui.quiet:
1100 if not ui.quiet:
1101 ui.warn(_(b'falling back to default value: %s\n') % default)
1101 ui.warn(_(b'falling back to default value: %s\n') % default)
1102 slow_path = default
1102 slow_path = default
1103
1103
1104 msg = _(
1104 msg = _(
1105 b"accessing `persistent-nodemap` repository without associated "
1105 b"accessing `persistent-nodemap` repository without associated "
1106 b"fast implementation."
1106 b"fast implementation."
1107 )
1107 )
1108 hint = _(
1108 hint = _(
1109 b"check `hg help config.format.use-persistent-nodemap` "
1109 b"check `hg help config.format.use-persistent-nodemap` "
1110 b"for details"
1110 b"for details"
1111 )
1111 )
1112 if not revlog.HAS_FAST_PERSISTENT_NODEMAP:
1112 if not revlog.HAS_FAST_PERSISTENT_NODEMAP:
1113 if slow_path == b'warn':
1113 if slow_path == b'warn':
1114 msg = b"warning: " + msg + b'\n'
1114 msg = b"warning: " + msg + b'\n'
1115 ui.warn(msg)
1115 ui.warn(msg)
1116 if not ui.quiet:
1116 if not ui.quiet:
1117 hint = b'(' + hint + b')\n'
1117 hint = b'(' + hint + b')\n'
1118 ui.warn(hint)
1118 ui.warn(hint)
1119 if slow_path == b'abort':
1119 if slow_path == b'abort':
1120 raise error.Abort(msg, hint=hint)
1120 raise error.Abort(msg, hint=hint)
1121 options[b'persistent-nodemap'] = True
1121 options[b'persistent-nodemap'] = True
1122 if ui.configbool(b'storage', b'revlog.persistent-nodemap.mmap'):
1122 if ui.configbool(b'storage', b'revlog.persistent-nodemap.mmap'):
1123 options[b'persistent-nodemap.mmap'] = True
1123 options[b'persistent-nodemap.mmap'] = True
1124 if ui.configbool(b'devel', b'persistent-nodemap'):
1124 if ui.configbool(b'devel', b'persistent-nodemap'):
1125 options[b'devel-force-nodemap'] = True
1125 options[b'devel-force-nodemap'] = True
1126
1126
1127 return options
1127 return options
1128
1128
1129
1129
1130 def makemain(**kwargs):
1130 def makemain(**kwargs):
1131 """Produce a type conforming to ``ilocalrepositorymain``."""
1131 """Produce a type conforming to ``ilocalrepositorymain``."""
1132 return localrepository
1132 return localrepository
1133
1133
1134
1134
1135 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
1135 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
1136 class revlogfilestorage(object):
1136 class revlogfilestorage(object):
1137 """File storage when using revlogs."""
1137 """File storage when using revlogs."""
1138
1138
1139 def file(self, path):
1139 def file(self, path):
1140 if path[0] == b'/':
1140 if path.startswith(b'/'):
1141 path = path[1:]
1141 path = path[1:]
1142
1142
1143 return filelog.filelog(self.svfs, path)
1143 return filelog.filelog(self.svfs, path)
1144
1144
1145
1145
1146 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
1146 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
1147 class revlognarrowfilestorage(object):
1147 class revlognarrowfilestorage(object):
1148 """File storage when using revlogs and narrow files."""
1148 """File storage when using revlogs and narrow files."""
1149
1149
1150 def file(self, path):
1150 def file(self, path):
1151 if path[0] == b'/':
1151 if path.startswith(b'/'):
1152 path = path[1:]
1152 path = path[1:]
1153
1153
1154 return filelog.narrowfilelog(self.svfs, path, self._storenarrowmatch)
1154 return filelog.narrowfilelog(self.svfs, path, self._storenarrowmatch)
1155
1155
1156
1156
1157 def makefilestorage(requirements, features, **kwargs):
1157 def makefilestorage(requirements, features, **kwargs):
1158 """Produce a type conforming to ``ilocalrepositoryfilestorage``."""
1158 """Produce a type conforming to ``ilocalrepositoryfilestorage``."""
1159 features.add(repository.REPO_FEATURE_REVLOG_FILE_STORAGE)
1159 features.add(repository.REPO_FEATURE_REVLOG_FILE_STORAGE)
1160 features.add(repository.REPO_FEATURE_STREAM_CLONE)
1160 features.add(repository.REPO_FEATURE_STREAM_CLONE)
1161
1161
1162 if requirementsmod.NARROW_REQUIREMENT in requirements:
1162 if requirementsmod.NARROW_REQUIREMENT in requirements:
1163 return revlognarrowfilestorage
1163 return revlognarrowfilestorage
1164 else:
1164 else:
1165 return revlogfilestorage
1165 return revlogfilestorage
1166
1166
1167
1167
1168 # List of repository interfaces and factory functions for them. Each
1168 # List of repository interfaces and factory functions for them. Each
1169 # will be called in order during ``makelocalrepository()`` to iteratively
1169 # will be called in order during ``makelocalrepository()`` to iteratively
1170 # derive the final type for a local repository instance. We capture the
1170 # derive the final type for a local repository instance. We capture the
1171 # function as a lambda so we don't hold a reference and the module-level
1171 # function as a lambda so we don't hold a reference and the module-level
1172 # functions can be wrapped.
1172 # functions can be wrapped.
1173 REPO_INTERFACES = [
1173 REPO_INTERFACES = [
1174 (repository.ilocalrepositorymain, lambda: makemain),
1174 (repository.ilocalrepositorymain, lambda: makemain),
1175 (repository.ilocalrepositoryfilestorage, lambda: makefilestorage),
1175 (repository.ilocalrepositoryfilestorage, lambda: makefilestorage),
1176 ]
1176 ]
1177
1177
1178
1178
1179 @interfaceutil.implementer(repository.ilocalrepositorymain)
1179 @interfaceutil.implementer(repository.ilocalrepositorymain)
1180 class localrepository(object):
1180 class localrepository(object):
1181 """Main class for representing local repositories.
1181 """Main class for representing local repositories.
1182
1182
1183 All local repositories are instances of this class.
1183 All local repositories are instances of this class.
1184
1184
1185 Constructed on its own, instances of this class are not usable as
1185 Constructed on its own, instances of this class are not usable as
1186 repository objects. To obtain a usable repository object, call
1186 repository objects. To obtain a usable repository object, call
1187 ``hg.repository()``, ``localrepo.instance()``, or
1187 ``hg.repository()``, ``localrepo.instance()``, or
1188 ``localrepo.makelocalrepository()``. The latter is the lowest-level.
1188 ``localrepo.makelocalrepository()``. The latter is the lowest-level.
1189 ``instance()`` adds support for creating new repositories.
1189 ``instance()`` adds support for creating new repositories.
1190 ``hg.repository()`` adds more extension integration, including calling
1190 ``hg.repository()`` adds more extension integration, including calling
1191 ``reposetup()``. Generally speaking, ``hg.repository()`` should be
1191 ``reposetup()``. Generally speaking, ``hg.repository()`` should be
1192 used.
1192 used.
1193 """
1193 """
1194
1194
1195 # obsolete experimental requirements:
1195 # obsolete experimental requirements:
1196 # - manifestv2: An experimental new manifest format that allowed
1196 # - manifestv2: An experimental new manifest format that allowed
1197 # for stem compression of long paths. Experiment ended up not
1197 # for stem compression of long paths. Experiment ended up not
1198 # being successful (repository sizes went up due to worse delta
1198 # being successful (repository sizes went up due to worse delta
1199 # chains), and the code was deleted in 4.6.
1199 # chains), and the code was deleted in 4.6.
1200 supportedformats = {
1200 supportedformats = {
1201 requirementsmod.REVLOGV1_REQUIREMENT,
1201 requirementsmod.REVLOGV1_REQUIREMENT,
1202 requirementsmod.GENERALDELTA_REQUIREMENT,
1202 requirementsmod.GENERALDELTA_REQUIREMENT,
1203 requirementsmod.TREEMANIFEST_REQUIREMENT,
1203 requirementsmod.TREEMANIFEST_REQUIREMENT,
1204 requirementsmod.COPIESSDC_REQUIREMENT,
1204 requirementsmod.COPIESSDC_REQUIREMENT,
1205 requirementsmod.REVLOGV2_REQUIREMENT,
1205 requirementsmod.REVLOGV2_REQUIREMENT,
1206 requirementsmod.SIDEDATA_REQUIREMENT,
1206 requirementsmod.SIDEDATA_REQUIREMENT,
1207 requirementsmod.SPARSEREVLOG_REQUIREMENT,
1207 requirementsmod.SPARSEREVLOG_REQUIREMENT,
1208 requirementsmod.NODEMAP_REQUIREMENT,
1208 requirementsmod.NODEMAP_REQUIREMENT,
1209 bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
1209 bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
1210 requirementsmod.SHARESAFE_REQUIREMENT,
1210 requirementsmod.SHARESAFE_REQUIREMENT,
1211 }
1211 }
1212 _basesupported = supportedformats | {
1212 _basesupported = supportedformats | {
1213 requirementsmod.STORE_REQUIREMENT,
1213 requirementsmod.STORE_REQUIREMENT,
1214 requirementsmod.FNCACHE_REQUIREMENT,
1214 requirementsmod.FNCACHE_REQUIREMENT,
1215 requirementsmod.SHARED_REQUIREMENT,
1215 requirementsmod.SHARED_REQUIREMENT,
1216 requirementsmod.RELATIVE_SHARED_REQUIREMENT,
1216 requirementsmod.RELATIVE_SHARED_REQUIREMENT,
1217 requirementsmod.DOTENCODE_REQUIREMENT,
1217 requirementsmod.DOTENCODE_REQUIREMENT,
1218 requirementsmod.SPARSE_REQUIREMENT,
1218 requirementsmod.SPARSE_REQUIREMENT,
1219 requirementsmod.INTERNAL_PHASE_REQUIREMENT,
1219 requirementsmod.INTERNAL_PHASE_REQUIREMENT,
1220 }
1220 }
1221
1221
1222 # list of prefix for file which can be written without 'wlock'
1222 # list of prefix for file which can be written without 'wlock'
1223 # Extensions should extend this list when needed
1223 # Extensions should extend this list when needed
1224 _wlockfreeprefix = {
1224 _wlockfreeprefix = {
1225 # We migh consider requiring 'wlock' for the next
1225 # We migh consider requiring 'wlock' for the next
1226 # two, but pretty much all the existing code assume
1226 # two, but pretty much all the existing code assume
1227 # wlock is not needed so we keep them excluded for
1227 # wlock is not needed so we keep them excluded for
1228 # now.
1228 # now.
1229 b'hgrc',
1229 b'hgrc',
1230 b'requires',
1230 b'requires',
1231 # XXX cache is a complicatged business someone
1231 # XXX cache is a complicatged business someone
1232 # should investigate this in depth at some point
1232 # should investigate this in depth at some point
1233 b'cache/',
1233 b'cache/',
1234 # XXX shouldn't be dirstate covered by the wlock?
1234 # XXX shouldn't be dirstate covered by the wlock?
1235 b'dirstate',
1235 b'dirstate',
1236 # XXX bisect was still a bit too messy at the time
1236 # XXX bisect was still a bit too messy at the time
1237 # this changeset was introduced. Someone should fix
1237 # this changeset was introduced. Someone should fix
1238 # the remainig bit and drop this line
1238 # the remainig bit and drop this line
1239 b'bisect.state',
1239 b'bisect.state',
1240 }
1240 }
1241
1241
1242 def __init__(
1242 def __init__(
1243 self,
1243 self,
1244 baseui,
1244 baseui,
1245 ui,
1245 ui,
1246 origroot,
1246 origroot,
1247 wdirvfs,
1247 wdirvfs,
1248 hgvfs,
1248 hgvfs,
1249 requirements,
1249 requirements,
1250 supportedrequirements,
1250 supportedrequirements,
1251 sharedpath,
1251 sharedpath,
1252 store,
1252 store,
1253 cachevfs,
1253 cachevfs,
1254 wcachevfs,
1254 wcachevfs,
1255 features,
1255 features,
1256 intents=None,
1256 intents=None,
1257 ):
1257 ):
1258 """Create a new local repository instance.
1258 """Create a new local repository instance.
1259
1259
1260 Most callers should use ``hg.repository()``, ``localrepo.instance()``,
1260 Most callers should use ``hg.repository()``, ``localrepo.instance()``,
1261 or ``localrepo.makelocalrepository()`` for obtaining a new repository
1261 or ``localrepo.makelocalrepository()`` for obtaining a new repository
1262 object.
1262 object.
1263
1263
1264 Arguments:
1264 Arguments:
1265
1265
1266 baseui
1266 baseui
1267 ``ui.ui`` instance that ``ui`` argument was based off of.
1267 ``ui.ui`` instance that ``ui`` argument was based off of.
1268
1268
1269 ui
1269 ui
1270 ``ui.ui`` instance for use by the repository.
1270 ``ui.ui`` instance for use by the repository.
1271
1271
1272 origroot
1272 origroot
1273 ``bytes`` path to working directory root of this repository.
1273 ``bytes`` path to working directory root of this repository.
1274
1274
1275 wdirvfs
1275 wdirvfs
1276 ``vfs.vfs`` rooted at the working directory.
1276 ``vfs.vfs`` rooted at the working directory.
1277
1277
1278 hgvfs
1278 hgvfs
1279 ``vfs.vfs`` rooted at .hg/
1279 ``vfs.vfs`` rooted at .hg/
1280
1280
1281 requirements
1281 requirements
1282 ``set`` of bytestrings representing repository opening requirements.
1282 ``set`` of bytestrings representing repository opening requirements.
1283
1283
1284 supportedrequirements
1284 supportedrequirements
1285 ``set`` of bytestrings representing repository requirements that we
1285 ``set`` of bytestrings representing repository requirements that we
1286 know how to open. May be a supetset of ``requirements``.
1286 know how to open. May be a supetset of ``requirements``.
1287
1287
1288 sharedpath
1288 sharedpath
1289 ``bytes`` Defining path to storage base directory. Points to a
1289 ``bytes`` Defining path to storage base directory. Points to a
1290 ``.hg/`` directory somewhere.
1290 ``.hg/`` directory somewhere.
1291
1291
1292 store
1292 store
1293 ``store.basicstore`` (or derived) instance providing access to
1293 ``store.basicstore`` (or derived) instance providing access to
1294 versioned storage.
1294 versioned storage.
1295
1295
1296 cachevfs
1296 cachevfs
1297 ``vfs.vfs`` used for cache files.
1297 ``vfs.vfs`` used for cache files.
1298
1298
1299 wcachevfs
1299 wcachevfs
1300 ``vfs.vfs`` used for cache files related to the working copy.
1300 ``vfs.vfs`` used for cache files related to the working copy.
1301
1301
1302 features
1302 features
1303 ``set`` of bytestrings defining features/capabilities of this
1303 ``set`` of bytestrings defining features/capabilities of this
1304 instance.
1304 instance.
1305
1305
1306 intents
1306 intents
1307 ``set`` of system strings indicating what this repo will be used
1307 ``set`` of system strings indicating what this repo will be used
1308 for.
1308 for.
1309 """
1309 """
1310 self.baseui = baseui
1310 self.baseui = baseui
1311 self.ui = ui
1311 self.ui = ui
1312 self.origroot = origroot
1312 self.origroot = origroot
1313 # vfs rooted at working directory.
1313 # vfs rooted at working directory.
1314 self.wvfs = wdirvfs
1314 self.wvfs = wdirvfs
1315 self.root = wdirvfs.base
1315 self.root = wdirvfs.base
1316 # vfs rooted at .hg/. Used to access most non-store paths.
1316 # vfs rooted at .hg/. Used to access most non-store paths.
1317 self.vfs = hgvfs
1317 self.vfs = hgvfs
1318 self.path = hgvfs.base
1318 self.path = hgvfs.base
1319 self.requirements = requirements
1319 self.requirements = requirements
1320 self.supported = supportedrequirements
1320 self.supported = supportedrequirements
1321 self.sharedpath = sharedpath
1321 self.sharedpath = sharedpath
1322 self.store = store
1322 self.store = store
1323 self.cachevfs = cachevfs
1323 self.cachevfs = cachevfs
1324 self.wcachevfs = wcachevfs
1324 self.wcachevfs = wcachevfs
1325 self.features = features
1325 self.features = features
1326
1326
1327 self.filtername = None
1327 self.filtername = None
1328
1328
1329 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
1329 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
1330 b'devel', b'check-locks'
1330 b'devel', b'check-locks'
1331 ):
1331 ):
1332 self.vfs.audit = self._getvfsward(self.vfs.audit)
1332 self.vfs.audit = self._getvfsward(self.vfs.audit)
1333 # A list of callback to shape the phase if no data were found.
1333 # A list of callback to shape the phase if no data were found.
1334 # Callback are in the form: func(repo, roots) --> processed root.
1334 # Callback are in the form: func(repo, roots) --> processed root.
1335 # This list it to be filled by extension during repo setup
1335 # This list it to be filled by extension during repo setup
1336 self._phasedefaults = []
1336 self._phasedefaults = []
1337
1337
1338 color.setup(self.ui)
1338 color.setup(self.ui)
1339
1339
1340 self.spath = self.store.path
1340 self.spath = self.store.path
1341 self.svfs = self.store.vfs
1341 self.svfs = self.store.vfs
1342 self.sjoin = self.store.join
1342 self.sjoin = self.store.join
1343 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
1343 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
1344 b'devel', b'check-locks'
1344 b'devel', b'check-locks'
1345 ):
1345 ):
1346 if util.safehasattr(self.svfs, b'vfs'): # this is filtervfs
1346 if util.safehasattr(self.svfs, b'vfs'): # this is filtervfs
1347 self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit)
1347 self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit)
1348 else: # standard vfs
1348 else: # standard vfs
1349 self.svfs.audit = self._getsvfsward(self.svfs.audit)
1349 self.svfs.audit = self._getsvfsward(self.svfs.audit)
1350
1350
1351 self._dirstatevalidatewarned = False
1351 self._dirstatevalidatewarned = False
1352
1352
1353 self._branchcaches = branchmap.BranchMapCache()
1353 self._branchcaches = branchmap.BranchMapCache()
1354 self._revbranchcache = None
1354 self._revbranchcache = None
1355 self._filterpats = {}
1355 self._filterpats = {}
1356 self._datafilters = {}
1356 self._datafilters = {}
1357 self._transref = self._lockref = self._wlockref = None
1357 self._transref = self._lockref = self._wlockref = None
1358
1358
1359 # A cache for various files under .hg/ that tracks file changes,
1359 # A cache for various files under .hg/ that tracks file changes,
1360 # (used by the filecache decorator)
1360 # (used by the filecache decorator)
1361 #
1361 #
1362 # Maps a property name to its util.filecacheentry
1362 # Maps a property name to its util.filecacheentry
1363 self._filecache = {}
1363 self._filecache = {}
1364
1364
1365 # hold sets of revision to be filtered
1365 # hold sets of revision to be filtered
1366 # should be cleared when something might have changed the filter value:
1366 # should be cleared when something might have changed the filter value:
1367 # - new changesets,
1367 # - new changesets,
1368 # - phase change,
1368 # - phase change,
1369 # - new obsolescence marker,
1369 # - new obsolescence marker,
1370 # - working directory parent change,
1370 # - working directory parent change,
1371 # - bookmark changes
1371 # - bookmark changes
1372 self.filteredrevcache = {}
1372 self.filteredrevcache = {}
1373
1373
1374 # post-dirstate-status hooks
1374 # post-dirstate-status hooks
1375 self._postdsstatus = []
1375 self._postdsstatus = []
1376
1376
1377 # generic mapping between names and nodes
1377 # generic mapping between names and nodes
1378 self.names = namespaces.namespaces()
1378 self.names = namespaces.namespaces()
1379
1379
1380 # Key to signature value.
1380 # Key to signature value.
1381 self._sparsesignaturecache = {}
1381 self._sparsesignaturecache = {}
1382 # Signature to cached matcher instance.
1382 # Signature to cached matcher instance.
1383 self._sparsematchercache = {}
1383 self._sparsematchercache = {}
1384
1384
1385 self._extrafilterid = repoview.extrafilter(ui)
1385 self._extrafilterid = repoview.extrafilter(ui)
1386
1386
1387 self.filecopiesmode = None
1387 self.filecopiesmode = None
1388 if requirementsmod.COPIESSDC_REQUIREMENT in self.requirements:
1388 if requirementsmod.COPIESSDC_REQUIREMENT in self.requirements:
1389 self.filecopiesmode = b'changeset-sidedata'
1389 self.filecopiesmode = b'changeset-sidedata'
1390
1390
1391 def _getvfsward(self, origfunc):
1391 def _getvfsward(self, origfunc):
1392 """build a ward for self.vfs"""
1392 """build a ward for self.vfs"""
1393 rref = weakref.ref(self)
1393 rref = weakref.ref(self)
1394
1394
1395 def checkvfs(path, mode=None):
1395 def checkvfs(path, mode=None):
1396 ret = origfunc(path, mode=mode)
1396 ret = origfunc(path, mode=mode)
1397 repo = rref()
1397 repo = rref()
1398 if (
1398 if (
1399 repo is None
1399 repo is None
1400 or not util.safehasattr(repo, b'_wlockref')
1400 or not util.safehasattr(repo, b'_wlockref')
1401 or not util.safehasattr(repo, b'_lockref')
1401 or not util.safehasattr(repo, b'_lockref')
1402 ):
1402 ):
1403 return
1403 return
1404 if mode in (None, b'r', b'rb'):
1404 if mode in (None, b'r', b'rb'):
1405 return
1405 return
1406 if path.startswith(repo.path):
1406 if path.startswith(repo.path):
1407 # truncate name relative to the repository (.hg)
1407 # truncate name relative to the repository (.hg)
1408 path = path[len(repo.path) + 1 :]
1408 path = path[len(repo.path) + 1 :]
1409 if path.startswith(b'cache/'):
1409 if path.startswith(b'cache/'):
1410 msg = b'accessing cache with vfs instead of cachevfs: "%s"'
1410 msg = b'accessing cache with vfs instead of cachevfs: "%s"'
1411 repo.ui.develwarn(msg % path, stacklevel=3, config=b"cache-vfs")
1411 repo.ui.develwarn(msg % path, stacklevel=3, config=b"cache-vfs")
1412 # path prefixes covered by 'lock'
1412 # path prefixes covered by 'lock'
1413 vfs_path_prefixes = (
1413 vfs_path_prefixes = (
1414 b'journal.',
1414 b'journal.',
1415 b'undo.',
1415 b'undo.',
1416 b'strip-backup/',
1416 b'strip-backup/',
1417 b'cache/',
1417 b'cache/',
1418 )
1418 )
1419 if any(path.startswith(prefix) for prefix in vfs_path_prefixes):
1419 if any(path.startswith(prefix) for prefix in vfs_path_prefixes):
1420 if repo._currentlock(repo._lockref) is None:
1420 if repo._currentlock(repo._lockref) is None:
1421 repo.ui.develwarn(
1421 repo.ui.develwarn(
1422 b'write with no lock: "%s"' % path,
1422 b'write with no lock: "%s"' % path,
1423 stacklevel=3,
1423 stacklevel=3,
1424 config=b'check-locks',
1424 config=b'check-locks',
1425 )
1425 )
1426 elif repo._currentlock(repo._wlockref) is None:
1426 elif repo._currentlock(repo._wlockref) is None:
1427 # rest of vfs files are covered by 'wlock'
1427 # rest of vfs files are covered by 'wlock'
1428 #
1428 #
1429 # exclude special files
1429 # exclude special files
1430 for prefix in self._wlockfreeprefix:
1430 for prefix in self._wlockfreeprefix:
1431 if path.startswith(prefix):
1431 if path.startswith(prefix):
1432 return
1432 return
1433 repo.ui.develwarn(
1433 repo.ui.develwarn(
1434 b'write with no wlock: "%s"' % path,
1434 b'write with no wlock: "%s"' % path,
1435 stacklevel=3,
1435 stacklevel=3,
1436 config=b'check-locks',
1436 config=b'check-locks',
1437 )
1437 )
1438 return ret
1438 return ret
1439
1439
1440 return checkvfs
1440 return checkvfs
1441
1441
1442 def _getsvfsward(self, origfunc):
1442 def _getsvfsward(self, origfunc):
1443 """build a ward for self.svfs"""
1443 """build a ward for self.svfs"""
1444 rref = weakref.ref(self)
1444 rref = weakref.ref(self)
1445
1445
1446 def checksvfs(path, mode=None):
1446 def checksvfs(path, mode=None):
1447 ret = origfunc(path, mode=mode)
1447 ret = origfunc(path, mode=mode)
1448 repo = rref()
1448 repo = rref()
1449 if repo is None or not util.safehasattr(repo, b'_lockref'):
1449 if repo is None or not util.safehasattr(repo, b'_lockref'):
1450 return
1450 return
1451 if mode in (None, b'r', b'rb'):
1451 if mode in (None, b'r', b'rb'):
1452 return
1452 return
1453 if path.startswith(repo.sharedpath):
1453 if path.startswith(repo.sharedpath):
1454 # truncate name relative to the repository (.hg)
1454 # truncate name relative to the repository (.hg)
1455 path = path[len(repo.sharedpath) + 1 :]
1455 path = path[len(repo.sharedpath) + 1 :]
1456 if repo._currentlock(repo._lockref) is None:
1456 if repo._currentlock(repo._lockref) is None:
1457 repo.ui.develwarn(
1457 repo.ui.develwarn(
1458 b'write with no lock: "%s"' % path, stacklevel=4
1458 b'write with no lock: "%s"' % path, stacklevel=4
1459 )
1459 )
1460 return ret
1460 return ret
1461
1461
1462 return checksvfs
1462 return checksvfs
1463
1463
1464 def close(self):
1464 def close(self):
1465 self._writecaches()
1465 self._writecaches()
1466
1466
1467 def _writecaches(self):
1467 def _writecaches(self):
1468 if self._revbranchcache:
1468 if self._revbranchcache:
1469 self._revbranchcache.write()
1469 self._revbranchcache.write()
1470
1470
1471 def _restrictcapabilities(self, caps):
1471 def _restrictcapabilities(self, caps):
1472 if self.ui.configbool(b'experimental', b'bundle2-advertise'):
1472 if self.ui.configbool(b'experimental', b'bundle2-advertise'):
1473 caps = set(caps)
1473 caps = set(caps)
1474 capsblob = bundle2.encodecaps(
1474 capsblob = bundle2.encodecaps(
1475 bundle2.getrepocaps(self, role=b'client')
1475 bundle2.getrepocaps(self, role=b'client')
1476 )
1476 )
1477 caps.add(b'bundle2=' + urlreq.quote(capsblob))
1477 caps.add(b'bundle2=' + urlreq.quote(capsblob))
1478 return caps
1478 return caps
1479
1479
1480 # Don't cache auditor/nofsauditor, or you'll end up with reference cycle:
1480 # Don't cache auditor/nofsauditor, or you'll end up with reference cycle:
1481 # self -> auditor -> self._checknested -> self
1481 # self -> auditor -> self._checknested -> self
1482
1482
1483 @property
1483 @property
1484 def auditor(self):
1484 def auditor(self):
1485 # This is only used by context.workingctx.match in order to
1485 # This is only used by context.workingctx.match in order to
1486 # detect files in subrepos.
1486 # detect files in subrepos.
1487 return pathutil.pathauditor(self.root, callback=self._checknested)
1487 return pathutil.pathauditor(self.root, callback=self._checknested)
1488
1488
1489 @property
1489 @property
1490 def nofsauditor(self):
1490 def nofsauditor(self):
1491 # This is only used by context.basectx.match in order to detect
1491 # This is only used by context.basectx.match in order to detect
1492 # files in subrepos.
1492 # files in subrepos.
1493 return pathutil.pathauditor(
1493 return pathutil.pathauditor(
1494 self.root, callback=self._checknested, realfs=False, cached=True
1494 self.root, callback=self._checknested, realfs=False, cached=True
1495 )
1495 )
1496
1496
1497 def _checknested(self, path):
1497 def _checknested(self, path):
1498 """Determine if path is a legal nested repository."""
1498 """Determine if path is a legal nested repository."""
1499 if not path.startswith(self.root):
1499 if not path.startswith(self.root):
1500 return False
1500 return False
1501 subpath = path[len(self.root) + 1 :]
1501 subpath = path[len(self.root) + 1 :]
1502 normsubpath = util.pconvert(subpath)
1502 normsubpath = util.pconvert(subpath)
1503
1503
1504 # XXX: Checking against the current working copy is wrong in
1504 # XXX: Checking against the current working copy is wrong in
1505 # the sense that it can reject things like
1505 # the sense that it can reject things like
1506 #
1506 #
1507 # $ hg cat -r 10 sub/x.txt
1507 # $ hg cat -r 10 sub/x.txt
1508 #
1508 #
1509 # if sub/ is no longer a subrepository in the working copy
1509 # if sub/ is no longer a subrepository in the working copy
1510 # parent revision.
1510 # parent revision.
1511 #
1511 #
1512 # However, it can of course also allow things that would have
1512 # However, it can of course also allow things that would have
1513 # been rejected before, such as the above cat command if sub/
1513 # been rejected before, such as the above cat command if sub/
1514 # is a subrepository now, but was a normal directory before.
1514 # is a subrepository now, but was a normal directory before.
1515 # The old path auditor would have rejected by mistake since it
1515 # The old path auditor would have rejected by mistake since it
1516 # panics when it sees sub/.hg/.
1516 # panics when it sees sub/.hg/.
1517 #
1517 #
1518 # All in all, checking against the working copy seems sensible
1518 # All in all, checking against the working copy seems sensible
1519 # since we want to prevent access to nested repositories on
1519 # since we want to prevent access to nested repositories on
1520 # the filesystem *now*.
1520 # the filesystem *now*.
1521 ctx = self[None]
1521 ctx = self[None]
1522 parts = util.splitpath(subpath)
1522 parts = util.splitpath(subpath)
1523 while parts:
1523 while parts:
1524 prefix = b'/'.join(parts)
1524 prefix = b'/'.join(parts)
1525 if prefix in ctx.substate:
1525 if prefix in ctx.substate:
1526 if prefix == normsubpath:
1526 if prefix == normsubpath:
1527 return True
1527 return True
1528 else:
1528 else:
1529 sub = ctx.sub(prefix)
1529 sub = ctx.sub(prefix)
1530 return sub.checknested(subpath[len(prefix) + 1 :])
1530 return sub.checknested(subpath[len(prefix) + 1 :])
1531 else:
1531 else:
1532 parts.pop()
1532 parts.pop()
1533 return False
1533 return False
1534
1534
1535 def peer(self):
1535 def peer(self):
1536 return localpeer(self) # not cached to avoid reference cycle
1536 return localpeer(self) # not cached to avoid reference cycle
1537
1537
1538 def unfiltered(self):
1538 def unfiltered(self):
1539 """Return unfiltered version of the repository
1539 """Return unfiltered version of the repository
1540
1540
1541 Intended to be overwritten by filtered repo."""
1541 Intended to be overwritten by filtered repo."""
1542 return self
1542 return self
1543
1543
1544 def filtered(self, name, visibilityexceptions=None):
1544 def filtered(self, name, visibilityexceptions=None):
1545 """Return a filtered version of a repository
1545 """Return a filtered version of a repository
1546
1546
1547 The `name` parameter is the identifier of the requested view. This
1547 The `name` parameter is the identifier of the requested view. This
1548 will return a repoview object set "exactly" to the specified view.
1548 will return a repoview object set "exactly" to the specified view.
1549
1549
1550 This function does not apply recursive filtering to a repository. For
1550 This function does not apply recursive filtering to a repository. For
1551 example calling `repo.filtered("served")` will return a repoview using
1551 example calling `repo.filtered("served")` will return a repoview using
1552 the "served" view, regardless of the initial view used by `repo`.
1552 the "served" view, regardless of the initial view used by `repo`.
1553
1553
1554 In other word, there is always only one level of `repoview` "filtering".
1554 In other word, there is always only one level of `repoview` "filtering".
1555 """
1555 """
1556 if self._extrafilterid is not None and b'%' not in name:
1556 if self._extrafilterid is not None and b'%' not in name:
1557 name = name + b'%' + self._extrafilterid
1557 name = name + b'%' + self._extrafilterid
1558
1558
1559 cls = repoview.newtype(self.unfiltered().__class__)
1559 cls = repoview.newtype(self.unfiltered().__class__)
1560 return cls(self, name, visibilityexceptions)
1560 return cls(self, name, visibilityexceptions)
1561
1561
1562 @mixedrepostorecache(
1562 @mixedrepostorecache(
1563 (b'bookmarks', b'plain'),
1563 (b'bookmarks', b'plain'),
1564 (b'bookmarks.current', b'plain'),
1564 (b'bookmarks.current', b'plain'),
1565 (b'bookmarks', b''),
1565 (b'bookmarks', b''),
1566 (b'00changelog.i', b''),
1566 (b'00changelog.i', b''),
1567 )
1567 )
1568 def _bookmarks(self):
1568 def _bookmarks(self):
1569 # Since the multiple files involved in the transaction cannot be
1569 # Since the multiple files involved in the transaction cannot be
1570 # written atomically (with current repository format), there is a race
1570 # written atomically (with current repository format), there is a race
1571 # condition here.
1571 # condition here.
1572 #
1572 #
1573 # 1) changelog content A is read
1573 # 1) changelog content A is read
1574 # 2) outside transaction update changelog to content B
1574 # 2) outside transaction update changelog to content B
1575 # 3) outside transaction update bookmark file referring to content B
1575 # 3) outside transaction update bookmark file referring to content B
1576 # 4) bookmarks file content is read and filtered against changelog-A
1576 # 4) bookmarks file content is read and filtered against changelog-A
1577 #
1577 #
1578 # When this happens, bookmarks against nodes missing from A are dropped.
1578 # When this happens, bookmarks against nodes missing from A are dropped.
1579 #
1579 #
1580 # Having this happening during read is not great, but it become worse
1580 # Having this happening during read is not great, but it become worse
1581 # when this happen during write because the bookmarks to the "unknown"
1581 # when this happen during write because the bookmarks to the "unknown"
1582 # nodes will be dropped for good. However, writes happen within locks.
1582 # nodes will be dropped for good. However, writes happen within locks.
1583 # This locking makes it possible to have a race free consistent read.
1583 # This locking makes it possible to have a race free consistent read.
1584 # For this purpose data read from disc before locking are
1584 # For this purpose data read from disc before locking are
1585 # "invalidated" right after the locks are taken. This invalidations are
1585 # "invalidated" right after the locks are taken. This invalidations are
1586 # "light", the `filecache` mechanism keep the data in memory and will
1586 # "light", the `filecache` mechanism keep the data in memory and will
1587 # reuse them if the underlying files did not changed. Not parsing the
1587 # reuse them if the underlying files did not changed. Not parsing the
1588 # same data multiple times helps performances.
1588 # same data multiple times helps performances.
1589 #
1589 #
1590 # Unfortunately in the case describe above, the files tracked by the
1590 # Unfortunately in the case describe above, the files tracked by the
1591 # bookmarks file cache might not have changed, but the in-memory
1591 # bookmarks file cache might not have changed, but the in-memory
1592 # content is still "wrong" because we used an older changelog content
1592 # content is still "wrong" because we used an older changelog content
1593 # to process the on-disk data. So after locking, the changelog would be
1593 # to process the on-disk data. So after locking, the changelog would be
1594 # refreshed but `_bookmarks` would be preserved.
1594 # refreshed but `_bookmarks` would be preserved.
1595 # Adding `00changelog.i` to the list of tracked file is not
1595 # Adding `00changelog.i` to the list of tracked file is not
1596 # enough, because at the time we build the content for `_bookmarks` in
1596 # enough, because at the time we build the content for `_bookmarks` in
1597 # (4), the changelog file has already diverged from the content used
1597 # (4), the changelog file has already diverged from the content used
1598 # for loading `changelog` in (1)
1598 # for loading `changelog` in (1)
1599 #
1599 #
1600 # To prevent the issue, we force the changelog to be explicitly
1600 # To prevent the issue, we force the changelog to be explicitly
1601 # reloaded while computing `_bookmarks`. The data race can still happen
1601 # reloaded while computing `_bookmarks`. The data race can still happen
1602 # without the lock (with a narrower window), but it would no longer go
1602 # without the lock (with a narrower window), but it would no longer go
1603 # undetected during the lock time refresh.
1603 # undetected during the lock time refresh.
1604 #
1604 #
1605 # The new schedule is as follow
1605 # The new schedule is as follow
1606 #
1606 #
1607 # 1) filecache logic detect that `_bookmarks` needs to be computed
1607 # 1) filecache logic detect that `_bookmarks` needs to be computed
1608 # 2) cachestat for `bookmarks` and `changelog` are captured (for book)
1608 # 2) cachestat for `bookmarks` and `changelog` are captured (for book)
1609 # 3) We force `changelog` filecache to be tested
1609 # 3) We force `changelog` filecache to be tested
1610 # 4) cachestat for `changelog` are captured (for changelog)
1610 # 4) cachestat for `changelog` are captured (for changelog)
1611 # 5) `_bookmarks` is computed and cached
1611 # 5) `_bookmarks` is computed and cached
1612 #
1612 #
1613 # The step in (3) ensure we have a changelog at least as recent as the
1613 # The step in (3) ensure we have a changelog at least as recent as the
1614 # cache stat computed in (1). As a result at locking time:
1614 # cache stat computed in (1). As a result at locking time:
1615 # * if the changelog did not changed since (1) -> we can reuse the data
1615 # * if the changelog did not changed since (1) -> we can reuse the data
1616 # * otherwise -> the bookmarks get refreshed.
1616 # * otherwise -> the bookmarks get refreshed.
1617 self._refreshchangelog()
1617 self._refreshchangelog()
1618 return bookmarks.bmstore(self)
1618 return bookmarks.bmstore(self)
1619
1619
1620 def _refreshchangelog(self):
1620 def _refreshchangelog(self):
1621 """make sure the in memory changelog match the on-disk one"""
1621 """make sure the in memory changelog match the on-disk one"""
1622 if 'changelog' in vars(self) and self.currenttransaction() is None:
1622 if 'changelog' in vars(self) and self.currenttransaction() is None:
1623 del self.changelog
1623 del self.changelog
1624
1624
1625 @property
1625 @property
1626 def _activebookmark(self):
1626 def _activebookmark(self):
1627 return self._bookmarks.active
1627 return self._bookmarks.active
1628
1628
1629 # _phasesets depend on changelog. what we need is to call
1629 # _phasesets depend on changelog. what we need is to call
1630 # _phasecache.invalidate() if '00changelog.i' was changed, but it
1630 # _phasecache.invalidate() if '00changelog.i' was changed, but it
1631 # can't be easily expressed in filecache mechanism.
1631 # can't be easily expressed in filecache mechanism.
1632 @storecache(b'phaseroots', b'00changelog.i')
1632 @storecache(b'phaseroots', b'00changelog.i')
1633 def _phasecache(self):
1633 def _phasecache(self):
1634 return phases.phasecache(self, self._phasedefaults)
1634 return phases.phasecache(self, self._phasedefaults)
1635
1635
1636 @storecache(b'obsstore')
1636 @storecache(b'obsstore')
1637 def obsstore(self):
1637 def obsstore(self):
1638 return obsolete.makestore(self.ui, self)
1638 return obsolete.makestore(self.ui, self)
1639
1639
1640 @storecache(b'00changelog.i')
1640 @storecache(b'00changelog.i')
1641 def changelog(self):
1641 def changelog(self):
1642 # load dirstate before changelog to avoid race see issue6303
1642 # load dirstate before changelog to avoid race see issue6303
1643 self.dirstate.prefetch_parents()
1643 self.dirstate.prefetch_parents()
1644 return self.store.changelog(
1644 return self.store.changelog(
1645 txnutil.mayhavepending(self.root),
1645 txnutil.mayhavepending(self.root),
1646 concurrencychecker=revlogchecker.get_checker(self.ui, b'changelog'),
1646 concurrencychecker=revlogchecker.get_checker(self.ui, b'changelog'),
1647 )
1647 )
1648
1648
1649 @storecache(b'00manifest.i')
1649 @storecache(b'00manifest.i')
1650 def manifestlog(self):
1650 def manifestlog(self):
1651 return self.store.manifestlog(self, self._storenarrowmatch)
1651 return self.store.manifestlog(self, self._storenarrowmatch)
1652
1652
1653 @repofilecache(b'dirstate')
1653 @repofilecache(b'dirstate')
1654 def dirstate(self):
1654 def dirstate(self):
1655 return self._makedirstate()
1655 return self._makedirstate()
1656
1656
1657 def _makedirstate(self):
1657 def _makedirstate(self):
1658 """Extension point for wrapping the dirstate per-repo."""
1658 """Extension point for wrapping the dirstate per-repo."""
1659 sparsematchfn = lambda: sparse.matcher(self)
1659 sparsematchfn = lambda: sparse.matcher(self)
1660
1660
1661 return dirstate.dirstate(
1661 return dirstate.dirstate(
1662 self.vfs, self.ui, self.root, self._dirstatevalidate, sparsematchfn
1662 self.vfs, self.ui, self.root, self._dirstatevalidate, sparsematchfn
1663 )
1663 )
1664
1664
1665 def _dirstatevalidate(self, node):
1665 def _dirstatevalidate(self, node):
1666 try:
1666 try:
1667 self.changelog.rev(node)
1667 self.changelog.rev(node)
1668 return node
1668 return node
1669 except error.LookupError:
1669 except error.LookupError:
1670 if not self._dirstatevalidatewarned:
1670 if not self._dirstatevalidatewarned:
1671 self._dirstatevalidatewarned = True
1671 self._dirstatevalidatewarned = True
1672 self.ui.warn(
1672 self.ui.warn(
1673 _(b"warning: ignoring unknown working parent %s!\n")
1673 _(b"warning: ignoring unknown working parent %s!\n")
1674 % short(node)
1674 % short(node)
1675 )
1675 )
1676 return nullid
1676 return nullid
1677
1677
1678 @storecache(narrowspec.FILENAME)
1678 @storecache(narrowspec.FILENAME)
1679 def narrowpats(self):
1679 def narrowpats(self):
1680 """matcher patterns for this repository's narrowspec
1680 """matcher patterns for this repository's narrowspec
1681
1681
1682 A tuple of (includes, excludes).
1682 A tuple of (includes, excludes).
1683 """
1683 """
1684 return narrowspec.load(self)
1684 return narrowspec.load(self)
1685
1685
1686 @storecache(narrowspec.FILENAME)
1686 @storecache(narrowspec.FILENAME)
1687 def _storenarrowmatch(self):
1687 def _storenarrowmatch(self):
1688 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
1688 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
1689 return matchmod.always()
1689 return matchmod.always()
1690 include, exclude = self.narrowpats
1690 include, exclude = self.narrowpats
1691 return narrowspec.match(self.root, include=include, exclude=exclude)
1691 return narrowspec.match(self.root, include=include, exclude=exclude)
1692
1692
1693 @storecache(narrowspec.FILENAME)
1693 @storecache(narrowspec.FILENAME)
1694 def _narrowmatch(self):
1694 def _narrowmatch(self):
1695 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
1695 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
1696 return matchmod.always()
1696 return matchmod.always()
1697 narrowspec.checkworkingcopynarrowspec(self)
1697 narrowspec.checkworkingcopynarrowspec(self)
1698 include, exclude = self.narrowpats
1698 include, exclude = self.narrowpats
1699 return narrowspec.match(self.root, include=include, exclude=exclude)
1699 return narrowspec.match(self.root, include=include, exclude=exclude)
1700
1700
1701 def narrowmatch(self, match=None, includeexact=False):
1701 def narrowmatch(self, match=None, includeexact=False):
1702 """matcher corresponding the the repo's narrowspec
1702 """matcher corresponding the the repo's narrowspec
1703
1703
1704 If `match` is given, then that will be intersected with the narrow
1704 If `match` is given, then that will be intersected with the narrow
1705 matcher.
1705 matcher.
1706
1706
1707 If `includeexact` is True, then any exact matches from `match` will
1707 If `includeexact` is True, then any exact matches from `match` will
1708 be included even if they're outside the narrowspec.
1708 be included even if they're outside the narrowspec.
1709 """
1709 """
1710 if match:
1710 if match:
1711 if includeexact and not self._narrowmatch.always():
1711 if includeexact and not self._narrowmatch.always():
1712 # do not exclude explicitly-specified paths so that they can
1712 # do not exclude explicitly-specified paths so that they can
1713 # be warned later on
1713 # be warned later on
1714 em = matchmod.exact(match.files())
1714 em = matchmod.exact(match.files())
1715 nm = matchmod.unionmatcher([self._narrowmatch, em])
1715 nm = matchmod.unionmatcher([self._narrowmatch, em])
1716 return matchmod.intersectmatchers(match, nm)
1716 return matchmod.intersectmatchers(match, nm)
1717 return matchmod.intersectmatchers(match, self._narrowmatch)
1717 return matchmod.intersectmatchers(match, self._narrowmatch)
1718 return self._narrowmatch
1718 return self._narrowmatch
1719
1719
1720 def setnarrowpats(self, newincludes, newexcludes):
1720 def setnarrowpats(self, newincludes, newexcludes):
1721 narrowspec.save(self, newincludes, newexcludes)
1721 narrowspec.save(self, newincludes, newexcludes)
1722 self.invalidate(clearfilecache=True)
1722 self.invalidate(clearfilecache=True)
1723
1723
1724 @unfilteredpropertycache
1724 @unfilteredpropertycache
1725 def _quick_access_changeid_null(self):
1725 def _quick_access_changeid_null(self):
1726 return {
1726 return {
1727 b'null': (nullrev, nullid),
1727 b'null': (nullrev, nullid),
1728 nullrev: (nullrev, nullid),
1728 nullrev: (nullrev, nullid),
1729 nullid: (nullrev, nullid),
1729 nullid: (nullrev, nullid),
1730 }
1730 }
1731
1731
1732 @unfilteredpropertycache
1732 @unfilteredpropertycache
1733 def _quick_access_changeid_wc(self):
1733 def _quick_access_changeid_wc(self):
1734 # also fast path access to the working copy parents
1734 # also fast path access to the working copy parents
1735 # however, only do it for filter that ensure wc is visible.
1735 # however, only do it for filter that ensure wc is visible.
1736 quick = self._quick_access_changeid_null.copy()
1736 quick = self._quick_access_changeid_null.copy()
1737 cl = self.unfiltered().changelog
1737 cl = self.unfiltered().changelog
1738 for node in self.dirstate.parents():
1738 for node in self.dirstate.parents():
1739 if node == nullid:
1739 if node == nullid:
1740 continue
1740 continue
1741 rev = cl.index.get_rev(node)
1741 rev = cl.index.get_rev(node)
1742 if rev is None:
1742 if rev is None:
1743 # unknown working copy parent case:
1743 # unknown working copy parent case:
1744 #
1744 #
1745 # skip the fast path and let higher code deal with it
1745 # skip the fast path and let higher code deal with it
1746 continue
1746 continue
1747 pair = (rev, node)
1747 pair = (rev, node)
1748 quick[rev] = pair
1748 quick[rev] = pair
1749 quick[node] = pair
1749 quick[node] = pair
1750 # also add the parents of the parents
1750 # also add the parents of the parents
1751 for r in cl.parentrevs(rev):
1751 for r in cl.parentrevs(rev):
1752 if r == nullrev:
1752 if r == nullrev:
1753 continue
1753 continue
1754 n = cl.node(r)
1754 n = cl.node(r)
1755 pair = (r, n)
1755 pair = (r, n)
1756 quick[r] = pair
1756 quick[r] = pair
1757 quick[n] = pair
1757 quick[n] = pair
1758 p1node = self.dirstate.p1()
1758 p1node = self.dirstate.p1()
1759 if p1node != nullid:
1759 if p1node != nullid:
1760 quick[b'.'] = quick[p1node]
1760 quick[b'.'] = quick[p1node]
1761 return quick
1761 return quick
1762
1762
1763 @unfilteredmethod
1763 @unfilteredmethod
1764 def _quick_access_changeid_invalidate(self):
1764 def _quick_access_changeid_invalidate(self):
1765 if '_quick_access_changeid_wc' in vars(self):
1765 if '_quick_access_changeid_wc' in vars(self):
1766 del self.__dict__['_quick_access_changeid_wc']
1766 del self.__dict__['_quick_access_changeid_wc']
1767
1767
1768 @property
1768 @property
1769 def _quick_access_changeid(self):
1769 def _quick_access_changeid(self):
1770 """an helper dictionnary for __getitem__ calls
1770 """an helper dictionnary for __getitem__ calls
1771
1771
1772 This contains a list of symbol we can recognise right away without
1772 This contains a list of symbol we can recognise right away without
1773 further processing.
1773 further processing.
1774 """
1774 """
1775 if self.filtername in repoview.filter_has_wc:
1775 if self.filtername in repoview.filter_has_wc:
1776 return self._quick_access_changeid_wc
1776 return self._quick_access_changeid_wc
1777 return self._quick_access_changeid_null
1777 return self._quick_access_changeid_null
1778
1778
1779 def __getitem__(self, changeid):
1779 def __getitem__(self, changeid):
1780 # dealing with special cases
1780 # dealing with special cases
1781 if changeid is None:
1781 if changeid is None:
1782 return context.workingctx(self)
1782 return context.workingctx(self)
1783 if isinstance(changeid, context.basectx):
1783 if isinstance(changeid, context.basectx):
1784 return changeid
1784 return changeid
1785
1785
1786 # dealing with multiple revisions
1786 # dealing with multiple revisions
1787 if isinstance(changeid, slice):
1787 if isinstance(changeid, slice):
1788 # wdirrev isn't contiguous so the slice shouldn't include it
1788 # wdirrev isn't contiguous so the slice shouldn't include it
1789 return [
1789 return [
1790 self[i]
1790 self[i]
1791 for i in pycompat.xrange(*changeid.indices(len(self)))
1791 for i in pycompat.xrange(*changeid.indices(len(self)))
1792 if i not in self.changelog.filteredrevs
1792 if i not in self.changelog.filteredrevs
1793 ]
1793 ]
1794
1794
1795 # dealing with some special values
1795 # dealing with some special values
1796 quick_access = self._quick_access_changeid.get(changeid)
1796 quick_access = self._quick_access_changeid.get(changeid)
1797 if quick_access is not None:
1797 if quick_access is not None:
1798 rev, node = quick_access
1798 rev, node = quick_access
1799 return context.changectx(self, rev, node, maybe_filtered=False)
1799 return context.changectx(self, rev, node, maybe_filtered=False)
1800 if changeid == b'tip':
1800 if changeid == b'tip':
1801 node = self.changelog.tip()
1801 node = self.changelog.tip()
1802 rev = self.changelog.rev(node)
1802 rev = self.changelog.rev(node)
1803 return context.changectx(self, rev, node)
1803 return context.changectx(self, rev, node)
1804
1804
1805 # dealing with arbitrary values
1805 # dealing with arbitrary values
1806 try:
1806 try:
1807 if isinstance(changeid, int):
1807 if isinstance(changeid, int):
1808 node = self.changelog.node(changeid)
1808 node = self.changelog.node(changeid)
1809 rev = changeid
1809 rev = changeid
1810 elif changeid == b'.':
1810 elif changeid == b'.':
1811 # this is a hack to delay/avoid loading obsmarkers
1811 # this is a hack to delay/avoid loading obsmarkers
1812 # when we know that '.' won't be hidden
1812 # when we know that '.' won't be hidden
1813 node = self.dirstate.p1()
1813 node = self.dirstate.p1()
1814 rev = self.unfiltered().changelog.rev(node)
1814 rev = self.unfiltered().changelog.rev(node)
1815 elif len(changeid) == 20:
1815 elif len(changeid) == 20:
1816 try:
1816 try:
1817 node = changeid
1817 node = changeid
1818 rev = self.changelog.rev(changeid)
1818 rev = self.changelog.rev(changeid)
1819 except error.FilteredLookupError:
1819 except error.FilteredLookupError:
1820 changeid = hex(changeid) # for the error message
1820 changeid = hex(changeid) # for the error message
1821 raise
1821 raise
1822 except LookupError:
1822 except LookupError:
1823 # check if it might have come from damaged dirstate
1823 # check if it might have come from damaged dirstate
1824 #
1824 #
1825 # XXX we could avoid the unfiltered if we had a recognizable
1825 # XXX we could avoid the unfiltered if we had a recognizable
1826 # exception for filtered changeset access
1826 # exception for filtered changeset access
1827 if (
1827 if (
1828 self.local()
1828 self.local()
1829 and changeid in self.unfiltered().dirstate.parents()
1829 and changeid in self.unfiltered().dirstate.parents()
1830 ):
1830 ):
1831 msg = _(b"working directory has unknown parent '%s'!")
1831 msg = _(b"working directory has unknown parent '%s'!")
1832 raise error.Abort(msg % short(changeid))
1832 raise error.Abort(msg % short(changeid))
1833 changeid = hex(changeid) # for the error message
1833 changeid = hex(changeid) # for the error message
1834 raise
1834 raise
1835
1835
1836 elif len(changeid) == 40:
1836 elif len(changeid) == 40:
1837 node = bin(changeid)
1837 node = bin(changeid)
1838 rev = self.changelog.rev(node)
1838 rev = self.changelog.rev(node)
1839 else:
1839 else:
1840 raise error.ProgrammingError(
1840 raise error.ProgrammingError(
1841 b"unsupported changeid '%s' of type %s"
1841 b"unsupported changeid '%s' of type %s"
1842 % (changeid, pycompat.bytestr(type(changeid)))
1842 % (changeid, pycompat.bytestr(type(changeid)))
1843 )
1843 )
1844
1844
1845 return context.changectx(self, rev, node)
1845 return context.changectx(self, rev, node)
1846
1846
1847 except (error.FilteredIndexError, error.FilteredLookupError):
1847 except (error.FilteredIndexError, error.FilteredLookupError):
1848 raise error.FilteredRepoLookupError(
1848 raise error.FilteredRepoLookupError(
1849 _(b"filtered revision '%s'") % pycompat.bytestr(changeid)
1849 _(b"filtered revision '%s'") % pycompat.bytestr(changeid)
1850 )
1850 )
1851 except (IndexError, LookupError):
1851 except (IndexError, LookupError):
1852 raise error.RepoLookupError(
1852 raise error.RepoLookupError(
1853 _(b"unknown revision '%s'") % pycompat.bytestr(changeid)
1853 _(b"unknown revision '%s'") % pycompat.bytestr(changeid)
1854 )
1854 )
1855 except error.WdirUnsupported:
1855 except error.WdirUnsupported:
1856 return context.workingctx(self)
1856 return context.workingctx(self)
1857
1857
1858 def __contains__(self, changeid):
1858 def __contains__(self, changeid):
1859 """True if the given changeid exists"""
1859 """True if the given changeid exists"""
1860 try:
1860 try:
1861 self[changeid]
1861 self[changeid]
1862 return True
1862 return True
1863 except error.RepoLookupError:
1863 except error.RepoLookupError:
1864 return False
1864 return False
1865
1865
1866 def __nonzero__(self):
1866 def __nonzero__(self):
1867 return True
1867 return True
1868
1868
1869 __bool__ = __nonzero__
1869 __bool__ = __nonzero__
1870
1870
1871 def __len__(self):
1871 def __len__(self):
1872 # no need to pay the cost of repoview.changelog
1872 # no need to pay the cost of repoview.changelog
1873 unfi = self.unfiltered()
1873 unfi = self.unfiltered()
1874 return len(unfi.changelog)
1874 return len(unfi.changelog)
1875
1875
1876 def __iter__(self):
1876 def __iter__(self):
1877 return iter(self.changelog)
1877 return iter(self.changelog)
1878
1878
1879 def revs(self, expr, *args):
1879 def revs(self, expr, *args):
1880 """Find revisions matching a revset.
1880 """Find revisions matching a revset.
1881
1881
1882 The revset is specified as a string ``expr`` that may contain
1882 The revset is specified as a string ``expr`` that may contain
1883 %-formatting to escape certain types. See ``revsetlang.formatspec``.
1883 %-formatting to escape certain types. See ``revsetlang.formatspec``.
1884
1884
1885 Revset aliases from the configuration are not expanded. To expand
1885 Revset aliases from the configuration are not expanded. To expand
1886 user aliases, consider calling ``scmutil.revrange()`` or
1886 user aliases, consider calling ``scmutil.revrange()`` or
1887 ``repo.anyrevs([expr], user=True)``.
1887 ``repo.anyrevs([expr], user=True)``.
1888
1888
1889 Returns a smartset.abstractsmartset, which is a list-like interface
1889 Returns a smartset.abstractsmartset, which is a list-like interface
1890 that contains integer revisions.
1890 that contains integer revisions.
1891 """
1891 """
1892 tree = revsetlang.spectree(expr, *args)
1892 tree = revsetlang.spectree(expr, *args)
1893 return revset.makematcher(tree)(self)
1893 return revset.makematcher(tree)(self)
1894
1894
1895 def set(self, expr, *args):
1895 def set(self, expr, *args):
1896 """Find revisions matching a revset and emit changectx instances.
1896 """Find revisions matching a revset and emit changectx instances.
1897
1897
1898 This is a convenience wrapper around ``revs()`` that iterates the
1898 This is a convenience wrapper around ``revs()`` that iterates the
1899 result and is a generator of changectx instances.
1899 result and is a generator of changectx instances.
1900
1900
1901 Revset aliases from the configuration are not expanded. To expand
1901 Revset aliases from the configuration are not expanded. To expand
1902 user aliases, consider calling ``scmutil.revrange()``.
1902 user aliases, consider calling ``scmutil.revrange()``.
1903 """
1903 """
1904 for r in self.revs(expr, *args):
1904 for r in self.revs(expr, *args):
1905 yield self[r]
1905 yield self[r]
1906
1906
1907 def anyrevs(self, specs, user=False, localalias=None):
1907 def anyrevs(self, specs, user=False, localalias=None):
1908 """Find revisions matching one of the given revsets.
1908 """Find revisions matching one of the given revsets.
1909
1909
1910 Revset aliases from the configuration are not expanded by default. To
1910 Revset aliases from the configuration are not expanded by default. To
1911 expand user aliases, specify ``user=True``. To provide some local
1911 expand user aliases, specify ``user=True``. To provide some local
1912 definitions overriding user aliases, set ``localalias`` to
1912 definitions overriding user aliases, set ``localalias`` to
1913 ``{name: definitionstring}``.
1913 ``{name: definitionstring}``.
1914 """
1914 """
1915 if specs == [b'null']:
1915 if specs == [b'null']:
1916 return revset.baseset([nullrev])
1916 return revset.baseset([nullrev])
1917 if specs == [b'.']:
1917 if specs == [b'.']:
1918 quick_data = self._quick_access_changeid.get(b'.')
1918 quick_data = self._quick_access_changeid.get(b'.')
1919 if quick_data is not None:
1919 if quick_data is not None:
1920 return revset.baseset([quick_data[0]])
1920 return revset.baseset([quick_data[0]])
1921 if user:
1921 if user:
1922 m = revset.matchany(
1922 m = revset.matchany(
1923 self.ui,
1923 self.ui,
1924 specs,
1924 specs,
1925 lookup=revset.lookupfn(self),
1925 lookup=revset.lookupfn(self),
1926 localalias=localalias,
1926 localalias=localalias,
1927 )
1927 )
1928 else:
1928 else:
1929 m = revset.matchany(None, specs, localalias=localalias)
1929 m = revset.matchany(None, specs, localalias=localalias)
1930 return m(self)
1930 return m(self)
1931
1931
1932 def url(self):
1932 def url(self):
1933 return b'file:' + self.root
1933 return b'file:' + self.root
1934
1934
1935 def hook(self, name, throw=False, **args):
1935 def hook(self, name, throw=False, **args):
1936 """Call a hook, passing this repo instance.
1936 """Call a hook, passing this repo instance.
1937
1937
1938 This a convenience method to aid invoking hooks. Extensions likely
1938 This a convenience method to aid invoking hooks. Extensions likely
1939 won't call this unless they have registered a custom hook or are
1939 won't call this unless they have registered a custom hook or are
1940 replacing code that is expected to call a hook.
1940 replacing code that is expected to call a hook.
1941 """
1941 """
1942 return hook.hook(self.ui, self, name, throw, **args)
1942 return hook.hook(self.ui, self, name, throw, **args)
1943
1943
1944 @filteredpropertycache
1944 @filteredpropertycache
1945 def _tagscache(self):
1945 def _tagscache(self):
1946 """Returns a tagscache object that contains various tags related
1946 """Returns a tagscache object that contains various tags related
1947 caches."""
1947 caches."""
1948
1948
1949 # This simplifies its cache management by having one decorated
1949 # This simplifies its cache management by having one decorated
1950 # function (this one) and the rest simply fetch things from it.
1950 # function (this one) and the rest simply fetch things from it.
1951 class tagscache(object):
1951 class tagscache(object):
1952 def __init__(self):
1952 def __init__(self):
1953 # These two define the set of tags for this repository. tags
1953 # These two define the set of tags for this repository. tags
1954 # maps tag name to node; tagtypes maps tag name to 'global' or
1954 # maps tag name to node; tagtypes maps tag name to 'global' or
1955 # 'local'. (Global tags are defined by .hgtags across all
1955 # 'local'. (Global tags are defined by .hgtags across all
1956 # heads, and local tags are defined in .hg/localtags.)
1956 # heads, and local tags are defined in .hg/localtags.)
1957 # They constitute the in-memory cache of tags.
1957 # They constitute the in-memory cache of tags.
1958 self.tags = self.tagtypes = None
1958 self.tags = self.tagtypes = None
1959
1959
1960 self.nodetagscache = self.tagslist = None
1960 self.nodetagscache = self.tagslist = None
1961
1961
1962 cache = tagscache()
1962 cache = tagscache()
1963 cache.tags, cache.tagtypes = self._findtags()
1963 cache.tags, cache.tagtypes = self._findtags()
1964
1964
1965 return cache
1965 return cache
1966
1966
1967 def tags(self):
1967 def tags(self):
1968 '''return a mapping of tag to node'''
1968 '''return a mapping of tag to node'''
1969 t = {}
1969 t = {}
1970 if self.changelog.filteredrevs:
1970 if self.changelog.filteredrevs:
1971 tags, tt = self._findtags()
1971 tags, tt = self._findtags()
1972 else:
1972 else:
1973 tags = self._tagscache.tags
1973 tags = self._tagscache.tags
1974 rev = self.changelog.rev
1974 rev = self.changelog.rev
1975 for k, v in pycompat.iteritems(tags):
1975 for k, v in pycompat.iteritems(tags):
1976 try:
1976 try:
1977 # ignore tags to unknown nodes
1977 # ignore tags to unknown nodes
1978 rev(v)
1978 rev(v)
1979 t[k] = v
1979 t[k] = v
1980 except (error.LookupError, ValueError):
1980 except (error.LookupError, ValueError):
1981 pass
1981 pass
1982 return t
1982 return t
1983
1983
1984 def _findtags(self):
1984 def _findtags(self):
1985 """Do the hard work of finding tags. Return a pair of dicts
1985 """Do the hard work of finding tags. Return a pair of dicts
1986 (tags, tagtypes) where tags maps tag name to node, and tagtypes
1986 (tags, tagtypes) where tags maps tag name to node, and tagtypes
1987 maps tag name to a string like \'global\' or \'local\'.
1987 maps tag name to a string like \'global\' or \'local\'.
1988 Subclasses or extensions are free to add their own tags, but
1988 Subclasses or extensions are free to add their own tags, but
1989 should be aware that the returned dicts will be retained for the
1989 should be aware that the returned dicts will be retained for the
1990 duration of the localrepo object."""
1990 duration of the localrepo object."""
1991
1991
1992 # XXX what tagtype should subclasses/extensions use? Currently
1992 # XXX what tagtype should subclasses/extensions use? Currently
1993 # mq and bookmarks add tags, but do not set the tagtype at all.
1993 # mq and bookmarks add tags, but do not set the tagtype at all.
1994 # Should each extension invent its own tag type? Should there
1994 # Should each extension invent its own tag type? Should there
1995 # be one tagtype for all such "virtual" tags? Or is the status
1995 # be one tagtype for all such "virtual" tags? Or is the status
1996 # quo fine?
1996 # quo fine?
1997
1997
1998 # map tag name to (node, hist)
1998 # map tag name to (node, hist)
1999 alltags = tagsmod.findglobaltags(self.ui, self)
1999 alltags = tagsmod.findglobaltags(self.ui, self)
2000 # map tag name to tag type
2000 # map tag name to tag type
2001 tagtypes = {tag: b'global' for tag in alltags}
2001 tagtypes = {tag: b'global' for tag in alltags}
2002
2002
2003 tagsmod.readlocaltags(self.ui, self, alltags, tagtypes)
2003 tagsmod.readlocaltags(self.ui, self, alltags, tagtypes)
2004
2004
2005 # Build the return dicts. Have to re-encode tag names because
2005 # Build the return dicts. Have to re-encode tag names because
2006 # the tags module always uses UTF-8 (in order not to lose info
2006 # the tags module always uses UTF-8 (in order not to lose info
2007 # writing to the cache), but the rest of Mercurial wants them in
2007 # writing to the cache), but the rest of Mercurial wants them in
2008 # local encoding.
2008 # local encoding.
2009 tags = {}
2009 tags = {}
2010 for (name, (node, hist)) in pycompat.iteritems(alltags):
2010 for (name, (node, hist)) in pycompat.iteritems(alltags):
2011 if node != nullid:
2011 if node != nullid:
2012 tags[encoding.tolocal(name)] = node
2012 tags[encoding.tolocal(name)] = node
2013 tags[b'tip'] = self.changelog.tip()
2013 tags[b'tip'] = self.changelog.tip()
2014 tagtypes = {
2014 tagtypes = {
2015 encoding.tolocal(name): value
2015 encoding.tolocal(name): value
2016 for (name, value) in pycompat.iteritems(tagtypes)
2016 for (name, value) in pycompat.iteritems(tagtypes)
2017 }
2017 }
2018 return (tags, tagtypes)
2018 return (tags, tagtypes)
2019
2019
2020 def tagtype(self, tagname):
2020 def tagtype(self, tagname):
2021 """
2021 """
2022 return the type of the given tag. result can be:
2022 return the type of the given tag. result can be:
2023
2023
2024 'local' : a local tag
2024 'local' : a local tag
2025 'global' : a global tag
2025 'global' : a global tag
2026 None : tag does not exist
2026 None : tag does not exist
2027 """
2027 """
2028
2028
2029 return self._tagscache.tagtypes.get(tagname)
2029 return self._tagscache.tagtypes.get(tagname)
2030
2030
2031 def tagslist(self):
2031 def tagslist(self):
2032 '''return a list of tags ordered by revision'''
2032 '''return a list of tags ordered by revision'''
2033 if not self._tagscache.tagslist:
2033 if not self._tagscache.tagslist:
2034 l = []
2034 l = []
2035 for t, n in pycompat.iteritems(self.tags()):
2035 for t, n in pycompat.iteritems(self.tags()):
2036 l.append((self.changelog.rev(n), t, n))
2036 l.append((self.changelog.rev(n), t, n))
2037 self._tagscache.tagslist = [(t, n) for r, t, n in sorted(l)]
2037 self._tagscache.tagslist = [(t, n) for r, t, n in sorted(l)]
2038
2038
2039 return self._tagscache.tagslist
2039 return self._tagscache.tagslist
2040
2040
2041 def nodetags(self, node):
2041 def nodetags(self, node):
2042 '''return the tags associated with a node'''
2042 '''return the tags associated with a node'''
2043 if not self._tagscache.nodetagscache:
2043 if not self._tagscache.nodetagscache:
2044 nodetagscache = {}
2044 nodetagscache = {}
2045 for t, n in pycompat.iteritems(self._tagscache.tags):
2045 for t, n in pycompat.iteritems(self._tagscache.tags):
2046 nodetagscache.setdefault(n, []).append(t)
2046 nodetagscache.setdefault(n, []).append(t)
2047 for tags in pycompat.itervalues(nodetagscache):
2047 for tags in pycompat.itervalues(nodetagscache):
2048 tags.sort()
2048 tags.sort()
2049 self._tagscache.nodetagscache = nodetagscache
2049 self._tagscache.nodetagscache = nodetagscache
2050 return self._tagscache.nodetagscache.get(node, [])
2050 return self._tagscache.nodetagscache.get(node, [])
2051
2051
2052 def nodebookmarks(self, node):
2052 def nodebookmarks(self, node):
2053 """return the list of bookmarks pointing to the specified node"""
2053 """return the list of bookmarks pointing to the specified node"""
2054 return self._bookmarks.names(node)
2054 return self._bookmarks.names(node)
2055
2055
2056 def branchmap(self):
2056 def branchmap(self):
2057 """returns a dictionary {branch: [branchheads]} with branchheads
2057 """returns a dictionary {branch: [branchheads]} with branchheads
2058 ordered by increasing revision number"""
2058 ordered by increasing revision number"""
2059 return self._branchcaches[self]
2059 return self._branchcaches[self]
2060
2060
2061 @unfilteredmethod
2061 @unfilteredmethod
2062 def revbranchcache(self):
2062 def revbranchcache(self):
2063 if not self._revbranchcache:
2063 if not self._revbranchcache:
2064 self._revbranchcache = branchmap.revbranchcache(self.unfiltered())
2064 self._revbranchcache = branchmap.revbranchcache(self.unfiltered())
2065 return self._revbranchcache
2065 return self._revbranchcache
2066
2066
2067 def register_changeset(self, rev, changelogrevision):
2067 def register_changeset(self, rev, changelogrevision):
2068 self.revbranchcache().setdata(rev, changelogrevision)
2068 self.revbranchcache().setdata(rev, changelogrevision)
2069
2069
2070 def branchtip(self, branch, ignoremissing=False):
2070 def branchtip(self, branch, ignoremissing=False):
2071 """return the tip node for a given branch
2071 """return the tip node for a given branch
2072
2072
2073 If ignoremissing is True, then this method will not raise an error.
2073 If ignoremissing is True, then this method will not raise an error.
2074 This is helpful for callers that only expect None for a missing branch
2074 This is helpful for callers that only expect None for a missing branch
2075 (e.g. namespace).
2075 (e.g. namespace).
2076
2076
2077 """
2077 """
2078 try:
2078 try:
2079 return self.branchmap().branchtip(branch)
2079 return self.branchmap().branchtip(branch)
2080 except KeyError:
2080 except KeyError:
2081 if not ignoremissing:
2081 if not ignoremissing:
2082 raise error.RepoLookupError(_(b"unknown branch '%s'") % branch)
2082 raise error.RepoLookupError(_(b"unknown branch '%s'") % branch)
2083 else:
2083 else:
2084 pass
2084 pass
2085
2085
2086 def lookup(self, key):
2086 def lookup(self, key):
2087 node = scmutil.revsymbol(self, key).node()
2087 node = scmutil.revsymbol(self, key).node()
2088 if node is None:
2088 if node is None:
2089 raise error.RepoLookupError(_(b"unknown revision '%s'") % key)
2089 raise error.RepoLookupError(_(b"unknown revision '%s'") % key)
2090 return node
2090 return node
2091
2091
2092 def lookupbranch(self, key):
2092 def lookupbranch(self, key):
2093 if self.branchmap().hasbranch(key):
2093 if self.branchmap().hasbranch(key):
2094 return key
2094 return key
2095
2095
2096 return scmutil.revsymbol(self, key).branch()
2096 return scmutil.revsymbol(self, key).branch()
2097
2097
2098 def known(self, nodes):
2098 def known(self, nodes):
2099 cl = self.changelog
2099 cl = self.changelog
2100 get_rev = cl.index.get_rev
2100 get_rev = cl.index.get_rev
2101 filtered = cl.filteredrevs
2101 filtered = cl.filteredrevs
2102 result = []
2102 result = []
2103 for n in nodes:
2103 for n in nodes:
2104 r = get_rev(n)
2104 r = get_rev(n)
2105 resp = not (r is None or r in filtered)
2105 resp = not (r is None or r in filtered)
2106 result.append(resp)
2106 result.append(resp)
2107 return result
2107 return result
2108
2108
2109 def local(self):
2109 def local(self):
2110 return self
2110 return self
2111
2111
2112 def publishing(self):
2112 def publishing(self):
2113 # it's safe (and desirable) to trust the publish flag unconditionally
2113 # it's safe (and desirable) to trust the publish flag unconditionally
2114 # so that we don't finalize changes shared between users via ssh or nfs
2114 # so that we don't finalize changes shared between users via ssh or nfs
2115 return self.ui.configbool(b'phases', b'publish', untrusted=True)
2115 return self.ui.configbool(b'phases', b'publish', untrusted=True)
2116
2116
2117 def cancopy(self):
2117 def cancopy(self):
2118 # so statichttprepo's override of local() works
2118 # so statichttprepo's override of local() works
2119 if not self.local():
2119 if not self.local():
2120 return False
2120 return False
2121 if not self.publishing():
2121 if not self.publishing():
2122 return True
2122 return True
2123 # if publishing we can't copy if there is filtered content
2123 # if publishing we can't copy if there is filtered content
2124 return not self.filtered(b'visible').changelog.filteredrevs
2124 return not self.filtered(b'visible').changelog.filteredrevs
2125
2125
2126 def shared(self):
2126 def shared(self):
2127 '''the type of shared repository (None if not shared)'''
2127 '''the type of shared repository (None if not shared)'''
2128 if self.sharedpath != self.path:
2128 if self.sharedpath != self.path:
2129 return b'store'
2129 return b'store'
2130 return None
2130 return None
2131
2131
2132 def wjoin(self, f, *insidef):
2132 def wjoin(self, f, *insidef):
2133 return self.vfs.reljoin(self.root, f, *insidef)
2133 return self.vfs.reljoin(self.root, f, *insidef)
2134
2134
2135 def setparents(self, p1, p2=nullid):
2135 def setparents(self, p1, p2=nullid):
2136 self[None].setparents(p1, p2)
2136 self[None].setparents(p1, p2)
2137 self._quick_access_changeid_invalidate()
2137 self._quick_access_changeid_invalidate()
2138
2138
2139 def filectx(self, path, changeid=None, fileid=None, changectx=None):
2139 def filectx(self, path, changeid=None, fileid=None, changectx=None):
2140 """changeid must be a changeset revision, if specified.
2140 """changeid must be a changeset revision, if specified.
2141 fileid can be a file revision or node."""
2141 fileid can be a file revision or node."""
2142 return context.filectx(
2142 return context.filectx(
2143 self, path, changeid, fileid, changectx=changectx
2143 self, path, changeid, fileid, changectx=changectx
2144 )
2144 )
2145
2145
2146 def getcwd(self):
2146 def getcwd(self):
2147 return self.dirstate.getcwd()
2147 return self.dirstate.getcwd()
2148
2148
2149 def pathto(self, f, cwd=None):
2149 def pathto(self, f, cwd=None):
2150 return self.dirstate.pathto(f, cwd)
2150 return self.dirstate.pathto(f, cwd)
2151
2151
2152 def _loadfilter(self, filter):
2152 def _loadfilter(self, filter):
2153 if filter not in self._filterpats:
2153 if filter not in self._filterpats:
2154 l = []
2154 l = []
2155 for pat, cmd in self.ui.configitems(filter):
2155 for pat, cmd in self.ui.configitems(filter):
2156 if cmd == b'!':
2156 if cmd == b'!':
2157 continue
2157 continue
2158 mf = matchmod.match(self.root, b'', [pat])
2158 mf = matchmod.match(self.root, b'', [pat])
2159 fn = None
2159 fn = None
2160 params = cmd
2160 params = cmd
2161 for name, filterfn in pycompat.iteritems(self._datafilters):
2161 for name, filterfn in pycompat.iteritems(self._datafilters):
2162 if cmd.startswith(name):
2162 if cmd.startswith(name):
2163 fn = filterfn
2163 fn = filterfn
2164 params = cmd[len(name) :].lstrip()
2164 params = cmd[len(name) :].lstrip()
2165 break
2165 break
2166 if not fn:
2166 if not fn:
2167 fn = lambda s, c, **kwargs: procutil.filter(s, c)
2167 fn = lambda s, c, **kwargs: procutil.filter(s, c)
2168 fn.__name__ = 'commandfilter'
2168 fn.__name__ = 'commandfilter'
2169 # Wrap old filters not supporting keyword arguments
2169 # Wrap old filters not supporting keyword arguments
2170 if not pycompat.getargspec(fn)[2]:
2170 if not pycompat.getargspec(fn)[2]:
2171 oldfn = fn
2171 oldfn = fn
2172 fn = lambda s, c, oldfn=oldfn, **kwargs: oldfn(s, c)
2172 fn = lambda s, c, oldfn=oldfn, **kwargs: oldfn(s, c)
2173 fn.__name__ = 'compat-' + oldfn.__name__
2173 fn.__name__ = 'compat-' + oldfn.__name__
2174 l.append((mf, fn, params))
2174 l.append((mf, fn, params))
2175 self._filterpats[filter] = l
2175 self._filterpats[filter] = l
2176 return self._filterpats[filter]
2176 return self._filterpats[filter]
2177
2177
2178 def _filter(self, filterpats, filename, data):
2178 def _filter(self, filterpats, filename, data):
2179 for mf, fn, cmd in filterpats:
2179 for mf, fn, cmd in filterpats:
2180 if mf(filename):
2180 if mf(filename):
2181 self.ui.debug(
2181 self.ui.debug(
2182 b"filtering %s through %s\n"
2182 b"filtering %s through %s\n"
2183 % (filename, cmd or pycompat.sysbytes(fn.__name__))
2183 % (filename, cmd or pycompat.sysbytes(fn.__name__))
2184 )
2184 )
2185 data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
2185 data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
2186 break
2186 break
2187
2187
2188 return data
2188 return data
2189
2189
2190 @unfilteredpropertycache
2190 @unfilteredpropertycache
2191 def _encodefilterpats(self):
2191 def _encodefilterpats(self):
2192 return self._loadfilter(b'encode')
2192 return self._loadfilter(b'encode')
2193
2193
2194 @unfilteredpropertycache
2194 @unfilteredpropertycache
2195 def _decodefilterpats(self):
2195 def _decodefilterpats(self):
2196 return self._loadfilter(b'decode')
2196 return self._loadfilter(b'decode')
2197
2197
2198 def adddatafilter(self, name, filter):
2198 def adddatafilter(self, name, filter):
2199 self._datafilters[name] = filter
2199 self._datafilters[name] = filter
2200
2200
2201 def wread(self, filename):
2201 def wread(self, filename):
2202 if self.wvfs.islink(filename):
2202 if self.wvfs.islink(filename):
2203 data = self.wvfs.readlink(filename)
2203 data = self.wvfs.readlink(filename)
2204 else:
2204 else:
2205 data = self.wvfs.read(filename)
2205 data = self.wvfs.read(filename)
2206 return self._filter(self._encodefilterpats, filename, data)
2206 return self._filter(self._encodefilterpats, filename, data)
2207
2207
2208 def wwrite(self, filename, data, flags, backgroundclose=False, **kwargs):
2208 def wwrite(self, filename, data, flags, backgroundclose=False, **kwargs):
2209 """write ``data`` into ``filename`` in the working directory
2209 """write ``data`` into ``filename`` in the working directory
2210
2210
2211 This returns length of written (maybe decoded) data.
2211 This returns length of written (maybe decoded) data.
2212 """
2212 """
2213 data = self._filter(self._decodefilterpats, filename, data)
2213 data = self._filter(self._decodefilterpats, filename, data)
2214 if b'l' in flags:
2214 if b'l' in flags:
2215 self.wvfs.symlink(data, filename)
2215 self.wvfs.symlink(data, filename)
2216 else:
2216 else:
2217 self.wvfs.write(
2217 self.wvfs.write(
2218 filename, data, backgroundclose=backgroundclose, **kwargs
2218 filename, data, backgroundclose=backgroundclose, **kwargs
2219 )
2219 )
2220 if b'x' in flags:
2220 if b'x' in flags:
2221 self.wvfs.setflags(filename, False, True)
2221 self.wvfs.setflags(filename, False, True)
2222 else:
2222 else:
2223 self.wvfs.setflags(filename, False, False)
2223 self.wvfs.setflags(filename, False, False)
2224 return len(data)
2224 return len(data)
2225
2225
2226 def wwritedata(self, filename, data):
2226 def wwritedata(self, filename, data):
2227 return self._filter(self._decodefilterpats, filename, data)
2227 return self._filter(self._decodefilterpats, filename, data)
2228
2228
2229 def currenttransaction(self):
2229 def currenttransaction(self):
2230 """return the current transaction or None if non exists"""
2230 """return the current transaction or None if non exists"""
2231 if self._transref:
2231 if self._transref:
2232 tr = self._transref()
2232 tr = self._transref()
2233 else:
2233 else:
2234 tr = None
2234 tr = None
2235
2235
2236 if tr and tr.running():
2236 if tr and tr.running():
2237 return tr
2237 return tr
2238 return None
2238 return None
2239
2239
2240 def transaction(self, desc, report=None):
2240 def transaction(self, desc, report=None):
2241 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
2241 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
2242 b'devel', b'check-locks'
2242 b'devel', b'check-locks'
2243 ):
2243 ):
2244 if self._currentlock(self._lockref) is None:
2244 if self._currentlock(self._lockref) is None:
2245 raise error.ProgrammingError(b'transaction requires locking')
2245 raise error.ProgrammingError(b'transaction requires locking')
2246 tr = self.currenttransaction()
2246 tr = self.currenttransaction()
2247 if tr is not None:
2247 if tr is not None:
2248 return tr.nest(name=desc)
2248 return tr.nest(name=desc)
2249
2249
2250 # abort here if the journal already exists
2250 # abort here if the journal already exists
2251 if self.svfs.exists(b"journal"):
2251 if self.svfs.exists(b"journal"):
2252 raise error.RepoError(
2252 raise error.RepoError(
2253 _(b"abandoned transaction found"),
2253 _(b"abandoned transaction found"),
2254 hint=_(b"run 'hg recover' to clean up transaction"),
2254 hint=_(b"run 'hg recover' to clean up transaction"),
2255 )
2255 )
2256
2256
2257 idbase = b"%.40f#%f" % (random.random(), time.time())
2257 idbase = b"%.40f#%f" % (random.random(), time.time())
2258 ha = hex(hashutil.sha1(idbase).digest())
2258 ha = hex(hashutil.sha1(idbase).digest())
2259 txnid = b'TXN:' + ha
2259 txnid = b'TXN:' + ha
2260 self.hook(b'pretxnopen', throw=True, txnname=desc, txnid=txnid)
2260 self.hook(b'pretxnopen', throw=True, txnname=desc, txnid=txnid)
2261
2261
2262 self._writejournal(desc)
2262 self._writejournal(desc)
2263 renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
2263 renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
2264 if report:
2264 if report:
2265 rp = report
2265 rp = report
2266 else:
2266 else:
2267 rp = self.ui.warn
2267 rp = self.ui.warn
2268 vfsmap = {b'plain': self.vfs, b'store': self.svfs} # root of .hg/
2268 vfsmap = {b'plain': self.vfs, b'store': self.svfs} # root of .hg/
2269 # we must avoid cyclic reference between repo and transaction.
2269 # we must avoid cyclic reference between repo and transaction.
2270 reporef = weakref.ref(self)
2270 reporef = weakref.ref(self)
2271 # Code to track tag movement
2271 # Code to track tag movement
2272 #
2272 #
2273 # Since tags are all handled as file content, it is actually quite hard
2273 # Since tags are all handled as file content, it is actually quite hard
2274 # to track these movement from a code perspective. So we fallback to a
2274 # to track these movement from a code perspective. So we fallback to a
2275 # tracking at the repository level. One could envision to track changes
2275 # tracking at the repository level. One could envision to track changes
2276 # to the '.hgtags' file through changegroup apply but that fails to
2276 # to the '.hgtags' file through changegroup apply but that fails to
2277 # cope with case where transaction expose new heads without changegroup
2277 # cope with case where transaction expose new heads without changegroup
2278 # being involved (eg: phase movement).
2278 # being involved (eg: phase movement).
2279 #
2279 #
2280 # For now, We gate the feature behind a flag since this likely comes
2280 # For now, We gate the feature behind a flag since this likely comes
2281 # with performance impacts. The current code run more often than needed
2281 # with performance impacts. The current code run more often than needed
2282 # and do not use caches as much as it could. The current focus is on
2282 # and do not use caches as much as it could. The current focus is on
2283 # the behavior of the feature so we disable it by default. The flag
2283 # the behavior of the feature so we disable it by default. The flag
2284 # will be removed when we are happy with the performance impact.
2284 # will be removed when we are happy with the performance impact.
2285 #
2285 #
2286 # Once this feature is no longer experimental move the following
2286 # Once this feature is no longer experimental move the following
2287 # documentation to the appropriate help section:
2287 # documentation to the appropriate help section:
2288 #
2288 #
2289 # The ``HG_TAG_MOVED`` variable will be set if the transaction touched
2289 # The ``HG_TAG_MOVED`` variable will be set if the transaction touched
2290 # tags (new or changed or deleted tags). In addition the details of
2290 # tags (new or changed or deleted tags). In addition the details of
2291 # these changes are made available in a file at:
2291 # these changes are made available in a file at:
2292 # ``REPOROOT/.hg/changes/tags.changes``.
2292 # ``REPOROOT/.hg/changes/tags.changes``.
2293 # Make sure you check for HG_TAG_MOVED before reading that file as it
2293 # Make sure you check for HG_TAG_MOVED before reading that file as it
2294 # might exist from a previous transaction even if no tag were touched
2294 # might exist from a previous transaction even if no tag were touched
2295 # in this one. Changes are recorded in a line base format::
2295 # in this one. Changes are recorded in a line base format::
2296 #
2296 #
2297 # <action> <hex-node> <tag-name>\n
2297 # <action> <hex-node> <tag-name>\n
2298 #
2298 #
2299 # Actions are defined as follow:
2299 # Actions are defined as follow:
2300 # "-R": tag is removed,
2300 # "-R": tag is removed,
2301 # "+A": tag is added,
2301 # "+A": tag is added,
2302 # "-M": tag is moved (old value),
2302 # "-M": tag is moved (old value),
2303 # "+M": tag is moved (new value),
2303 # "+M": tag is moved (new value),
2304 tracktags = lambda x: None
2304 tracktags = lambda x: None
2305 # experimental config: experimental.hook-track-tags
2305 # experimental config: experimental.hook-track-tags
2306 shouldtracktags = self.ui.configbool(
2306 shouldtracktags = self.ui.configbool(
2307 b'experimental', b'hook-track-tags'
2307 b'experimental', b'hook-track-tags'
2308 )
2308 )
2309 if desc != b'strip' and shouldtracktags:
2309 if desc != b'strip' and shouldtracktags:
2310 oldheads = self.changelog.headrevs()
2310 oldheads = self.changelog.headrevs()
2311
2311
2312 def tracktags(tr2):
2312 def tracktags(tr2):
2313 repo = reporef()
2313 repo = reporef()
2314 oldfnodes = tagsmod.fnoderevs(repo.ui, repo, oldheads)
2314 oldfnodes = tagsmod.fnoderevs(repo.ui, repo, oldheads)
2315 newheads = repo.changelog.headrevs()
2315 newheads = repo.changelog.headrevs()
2316 newfnodes = tagsmod.fnoderevs(repo.ui, repo, newheads)
2316 newfnodes = tagsmod.fnoderevs(repo.ui, repo, newheads)
2317 # notes: we compare lists here.
2317 # notes: we compare lists here.
2318 # As we do it only once buiding set would not be cheaper
2318 # As we do it only once buiding set would not be cheaper
2319 changes = tagsmod.difftags(repo.ui, repo, oldfnodes, newfnodes)
2319 changes = tagsmod.difftags(repo.ui, repo, oldfnodes, newfnodes)
2320 if changes:
2320 if changes:
2321 tr2.hookargs[b'tag_moved'] = b'1'
2321 tr2.hookargs[b'tag_moved'] = b'1'
2322 with repo.vfs(
2322 with repo.vfs(
2323 b'changes/tags.changes', b'w', atomictemp=True
2323 b'changes/tags.changes', b'w', atomictemp=True
2324 ) as changesfile:
2324 ) as changesfile:
2325 # note: we do not register the file to the transaction
2325 # note: we do not register the file to the transaction
2326 # because we needs it to still exist on the transaction
2326 # because we needs it to still exist on the transaction
2327 # is close (for txnclose hooks)
2327 # is close (for txnclose hooks)
2328 tagsmod.writediff(changesfile, changes)
2328 tagsmod.writediff(changesfile, changes)
2329
2329
2330 def validate(tr2):
2330 def validate(tr2):
2331 """will run pre-closing hooks"""
2331 """will run pre-closing hooks"""
2332 # XXX the transaction API is a bit lacking here so we take a hacky
2332 # XXX the transaction API is a bit lacking here so we take a hacky
2333 # path for now
2333 # path for now
2334 #
2334 #
2335 # We cannot add this as a "pending" hooks since the 'tr.hookargs'
2335 # We cannot add this as a "pending" hooks since the 'tr.hookargs'
2336 # dict is copied before these run. In addition we needs the data
2336 # dict is copied before these run. In addition we needs the data
2337 # available to in memory hooks too.
2337 # available to in memory hooks too.
2338 #
2338 #
2339 # Moreover, we also need to make sure this runs before txnclose
2339 # Moreover, we also need to make sure this runs before txnclose
2340 # hooks and there is no "pending" mechanism that would execute
2340 # hooks and there is no "pending" mechanism that would execute
2341 # logic only if hooks are about to run.
2341 # logic only if hooks are about to run.
2342 #
2342 #
2343 # Fixing this limitation of the transaction is also needed to track
2343 # Fixing this limitation of the transaction is also needed to track
2344 # other families of changes (bookmarks, phases, obsolescence).
2344 # other families of changes (bookmarks, phases, obsolescence).
2345 #
2345 #
2346 # This will have to be fixed before we remove the experimental
2346 # This will have to be fixed before we remove the experimental
2347 # gating.
2347 # gating.
2348 tracktags(tr2)
2348 tracktags(tr2)
2349 repo = reporef()
2349 repo = reporef()
2350
2350
2351 singleheadopt = (b'experimental', b'single-head-per-branch')
2351 singleheadopt = (b'experimental', b'single-head-per-branch')
2352 singlehead = repo.ui.configbool(*singleheadopt)
2352 singlehead = repo.ui.configbool(*singleheadopt)
2353 if singlehead:
2353 if singlehead:
2354 singleheadsub = repo.ui.configsuboptions(*singleheadopt)[1]
2354 singleheadsub = repo.ui.configsuboptions(*singleheadopt)[1]
2355 accountclosed = singleheadsub.get(
2355 accountclosed = singleheadsub.get(
2356 b"account-closed-heads", False
2356 b"account-closed-heads", False
2357 )
2357 )
2358 if singleheadsub.get(b"public-changes-only", False):
2358 if singleheadsub.get(b"public-changes-only", False):
2359 filtername = b"immutable"
2359 filtername = b"immutable"
2360 else:
2360 else:
2361 filtername = b"visible"
2361 filtername = b"visible"
2362 scmutil.enforcesinglehead(
2362 scmutil.enforcesinglehead(
2363 repo, tr2, desc, accountclosed, filtername
2363 repo, tr2, desc, accountclosed, filtername
2364 )
2364 )
2365 if hook.hashook(repo.ui, b'pretxnclose-bookmark'):
2365 if hook.hashook(repo.ui, b'pretxnclose-bookmark'):
2366 for name, (old, new) in sorted(
2366 for name, (old, new) in sorted(
2367 tr.changes[b'bookmarks'].items()
2367 tr.changes[b'bookmarks'].items()
2368 ):
2368 ):
2369 args = tr.hookargs.copy()
2369 args = tr.hookargs.copy()
2370 args.update(bookmarks.preparehookargs(name, old, new))
2370 args.update(bookmarks.preparehookargs(name, old, new))
2371 repo.hook(
2371 repo.hook(
2372 b'pretxnclose-bookmark',
2372 b'pretxnclose-bookmark',
2373 throw=True,
2373 throw=True,
2374 **pycompat.strkwargs(args)
2374 **pycompat.strkwargs(args)
2375 )
2375 )
2376 if hook.hashook(repo.ui, b'pretxnclose-phase'):
2376 if hook.hashook(repo.ui, b'pretxnclose-phase'):
2377 cl = repo.unfiltered().changelog
2377 cl = repo.unfiltered().changelog
2378 for revs, (old, new) in tr.changes[b'phases']:
2378 for revs, (old, new) in tr.changes[b'phases']:
2379 for rev in revs:
2379 for rev in revs:
2380 args = tr.hookargs.copy()
2380 args = tr.hookargs.copy()
2381 node = hex(cl.node(rev))
2381 node = hex(cl.node(rev))
2382 args.update(phases.preparehookargs(node, old, new))
2382 args.update(phases.preparehookargs(node, old, new))
2383 repo.hook(
2383 repo.hook(
2384 b'pretxnclose-phase',
2384 b'pretxnclose-phase',
2385 throw=True,
2385 throw=True,
2386 **pycompat.strkwargs(args)
2386 **pycompat.strkwargs(args)
2387 )
2387 )
2388
2388
2389 repo.hook(
2389 repo.hook(
2390 b'pretxnclose', throw=True, **pycompat.strkwargs(tr.hookargs)
2390 b'pretxnclose', throw=True, **pycompat.strkwargs(tr.hookargs)
2391 )
2391 )
2392
2392
2393 def releasefn(tr, success):
2393 def releasefn(tr, success):
2394 repo = reporef()
2394 repo = reporef()
2395 if repo is None:
2395 if repo is None:
2396 # If the repo has been GC'd (and this release function is being
2396 # If the repo has been GC'd (and this release function is being
2397 # called from transaction.__del__), there's not much we can do,
2397 # called from transaction.__del__), there's not much we can do,
2398 # so just leave the unfinished transaction there and let the
2398 # so just leave the unfinished transaction there and let the
2399 # user run `hg recover`.
2399 # user run `hg recover`.
2400 return
2400 return
2401 if success:
2401 if success:
2402 # this should be explicitly invoked here, because
2402 # this should be explicitly invoked here, because
2403 # in-memory changes aren't written out at closing
2403 # in-memory changes aren't written out at closing
2404 # transaction, if tr.addfilegenerator (via
2404 # transaction, if tr.addfilegenerator (via
2405 # dirstate.write or so) isn't invoked while
2405 # dirstate.write or so) isn't invoked while
2406 # transaction running
2406 # transaction running
2407 repo.dirstate.write(None)
2407 repo.dirstate.write(None)
2408 else:
2408 else:
2409 # discard all changes (including ones already written
2409 # discard all changes (including ones already written
2410 # out) in this transaction
2410 # out) in this transaction
2411 narrowspec.restorebackup(self, b'journal.narrowspec')
2411 narrowspec.restorebackup(self, b'journal.narrowspec')
2412 narrowspec.restorewcbackup(self, b'journal.narrowspec.dirstate')
2412 narrowspec.restorewcbackup(self, b'journal.narrowspec.dirstate')
2413 repo.dirstate.restorebackup(None, b'journal.dirstate')
2413 repo.dirstate.restorebackup(None, b'journal.dirstate')
2414
2414
2415 repo.invalidate(clearfilecache=True)
2415 repo.invalidate(clearfilecache=True)
2416
2416
2417 tr = transaction.transaction(
2417 tr = transaction.transaction(
2418 rp,
2418 rp,
2419 self.svfs,
2419 self.svfs,
2420 vfsmap,
2420 vfsmap,
2421 b"journal",
2421 b"journal",
2422 b"undo",
2422 b"undo",
2423 aftertrans(renames),
2423 aftertrans(renames),
2424 self.store.createmode,
2424 self.store.createmode,
2425 validator=validate,
2425 validator=validate,
2426 releasefn=releasefn,
2426 releasefn=releasefn,
2427 checkambigfiles=_cachedfiles,
2427 checkambigfiles=_cachedfiles,
2428 name=desc,
2428 name=desc,
2429 )
2429 )
2430 tr.changes[b'origrepolen'] = len(self)
2430 tr.changes[b'origrepolen'] = len(self)
2431 tr.changes[b'obsmarkers'] = set()
2431 tr.changes[b'obsmarkers'] = set()
2432 tr.changes[b'phases'] = []
2432 tr.changes[b'phases'] = []
2433 tr.changes[b'bookmarks'] = {}
2433 tr.changes[b'bookmarks'] = {}
2434
2434
2435 tr.hookargs[b'txnid'] = txnid
2435 tr.hookargs[b'txnid'] = txnid
2436 tr.hookargs[b'txnname'] = desc
2436 tr.hookargs[b'txnname'] = desc
2437 tr.hookargs[b'changes'] = tr.changes
2437 tr.hookargs[b'changes'] = tr.changes
2438 # note: writing the fncache only during finalize mean that the file is
2438 # note: writing the fncache only during finalize mean that the file is
2439 # outdated when running hooks. As fncache is used for streaming clone,
2439 # outdated when running hooks. As fncache is used for streaming clone,
2440 # this is not expected to break anything that happen during the hooks.
2440 # this is not expected to break anything that happen during the hooks.
2441 tr.addfinalize(b'flush-fncache', self.store.write)
2441 tr.addfinalize(b'flush-fncache', self.store.write)
2442
2442
2443 def txnclosehook(tr2):
2443 def txnclosehook(tr2):
2444 """To be run if transaction is successful, will schedule a hook run"""
2444 """To be run if transaction is successful, will schedule a hook run"""
2445 # Don't reference tr2 in hook() so we don't hold a reference.
2445 # Don't reference tr2 in hook() so we don't hold a reference.
2446 # This reduces memory consumption when there are multiple
2446 # This reduces memory consumption when there are multiple
2447 # transactions per lock. This can likely go away if issue5045
2447 # transactions per lock. This can likely go away if issue5045
2448 # fixes the function accumulation.
2448 # fixes the function accumulation.
2449 hookargs = tr2.hookargs
2449 hookargs = tr2.hookargs
2450
2450
2451 def hookfunc(unused_success):
2451 def hookfunc(unused_success):
2452 repo = reporef()
2452 repo = reporef()
2453 if hook.hashook(repo.ui, b'txnclose-bookmark'):
2453 if hook.hashook(repo.ui, b'txnclose-bookmark'):
2454 bmchanges = sorted(tr.changes[b'bookmarks'].items())
2454 bmchanges = sorted(tr.changes[b'bookmarks'].items())
2455 for name, (old, new) in bmchanges:
2455 for name, (old, new) in bmchanges:
2456 args = tr.hookargs.copy()
2456 args = tr.hookargs.copy()
2457 args.update(bookmarks.preparehookargs(name, old, new))
2457 args.update(bookmarks.preparehookargs(name, old, new))
2458 repo.hook(
2458 repo.hook(
2459 b'txnclose-bookmark',
2459 b'txnclose-bookmark',
2460 throw=False,
2460 throw=False,
2461 **pycompat.strkwargs(args)
2461 **pycompat.strkwargs(args)
2462 )
2462 )
2463
2463
2464 if hook.hashook(repo.ui, b'txnclose-phase'):
2464 if hook.hashook(repo.ui, b'txnclose-phase'):
2465 cl = repo.unfiltered().changelog
2465 cl = repo.unfiltered().changelog
2466 phasemv = sorted(
2466 phasemv = sorted(
2467 tr.changes[b'phases'], key=lambda r: r[0][0]
2467 tr.changes[b'phases'], key=lambda r: r[0][0]
2468 )
2468 )
2469 for revs, (old, new) in phasemv:
2469 for revs, (old, new) in phasemv:
2470 for rev in revs:
2470 for rev in revs:
2471 args = tr.hookargs.copy()
2471 args = tr.hookargs.copy()
2472 node = hex(cl.node(rev))
2472 node = hex(cl.node(rev))
2473 args.update(phases.preparehookargs(node, old, new))
2473 args.update(phases.preparehookargs(node, old, new))
2474 repo.hook(
2474 repo.hook(
2475 b'txnclose-phase',
2475 b'txnclose-phase',
2476 throw=False,
2476 throw=False,
2477 **pycompat.strkwargs(args)
2477 **pycompat.strkwargs(args)
2478 )
2478 )
2479
2479
2480 repo.hook(
2480 repo.hook(
2481 b'txnclose', throw=False, **pycompat.strkwargs(hookargs)
2481 b'txnclose', throw=False, **pycompat.strkwargs(hookargs)
2482 )
2482 )
2483
2483
2484 reporef()._afterlock(hookfunc)
2484 reporef()._afterlock(hookfunc)
2485
2485
2486 tr.addfinalize(b'txnclose-hook', txnclosehook)
2486 tr.addfinalize(b'txnclose-hook', txnclosehook)
2487 # Include a leading "-" to make it happen before the transaction summary
2487 # Include a leading "-" to make it happen before the transaction summary
2488 # reports registered via scmutil.registersummarycallback() whose names
2488 # reports registered via scmutil.registersummarycallback() whose names
2489 # are 00-txnreport etc. That way, the caches will be warm when the
2489 # are 00-txnreport etc. That way, the caches will be warm when the
2490 # callbacks run.
2490 # callbacks run.
2491 tr.addpostclose(b'-warm-cache', self._buildcacheupdater(tr))
2491 tr.addpostclose(b'-warm-cache', self._buildcacheupdater(tr))
2492
2492
2493 def txnaborthook(tr2):
2493 def txnaborthook(tr2):
2494 """To be run if transaction is aborted"""
2494 """To be run if transaction is aborted"""
2495 reporef().hook(
2495 reporef().hook(
2496 b'txnabort', throw=False, **pycompat.strkwargs(tr2.hookargs)
2496 b'txnabort', throw=False, **pycompat.strkwargs(tr2.hookargs)
2497 )
2497 )
2498
2498
2499 tr.addabort(b'txnabort-hook', txnaborthook)
2499 tr.addabort(b'txnabort-hook', txnaborthook)
2500 # avoid eager cache invalidation. in-memory data should be identical
2500 # avoid eager cache invalidation. in-memory data should be identical
2501 # to stored data if transaction has no error.
2501 # to stored data if transaction has no error.
2502 tr.addpostclose(b'refresh-filecachestats', self._refreshfilecachestats)
2502 tr.addpostclose(b'refresh-filecachestats', self._refreshfilecachestats)
2503 self._transref = weakref.ref(tr)
2503 self._transref = weakref.ref(tr)
2504 scmutil.registersummarycallback(self, tr, desc)
2504 scmutil.registersummarycallback(self, tr, desc)
2505 return tr
2505 return tr
2506
2506
2507 def _journalfiles(self):
2507 def _journalfiles(self):
2508 return (
2508 return (
2509 (self.svfs, b'journal'),
2509 (self.svfs, b'journal'),
2510 (self.svfs, b'journal.narrowspec'),
2510 (self.svfs, b'journal.narrowspec'),
2511 (self.vfs, b'journal.narrowspec.dirstate'),
2511 (self.vfs, b'journal.narrowspec.dirstate'),
2512 (self.vfs, b'journal.dirstate'),
2512 (self.vfs, b'journal.dirstate'),
2513 (self.vfs, b'journal.branch'),
2513 (self.vfs, b'journal.branch'),
2514 (self.vfs, b'journal.desc'),
2514 (self.vfs, b'journal.desc'),
2515 (bookmarks.bookmarksvfs(self), b'journal.bookmarks'),
2515 (bookmarks.bookmarksvfs(self), b'journal.bookmarks'),
2516 (self.svfs, b'journal.phaseroots'),
2516 (self.svfs, b'journal.phaseroots'),
2517 )
2517 )
2518
2518
2519 def undofiles(self):
2519 def undofiles(self):
2520 return [(vfs, undoname(x)) for vfs, x in self._journalfiles()]
2520 return [(vfs, undoname(x)) for vfs, x in self._journalfiles()]
2521
2521
2522 @unfilteredmethod
2522 @unfilteredmethod
2523 def _writejournal(self, desc):
2523 def _writejournal(self, desc):
2524 self.dirstate.savebackup(None, b'journal.dirstate')
2524 self.dirstate.savebackup(None, b'journal.dirstate')
2525 narrowspec.savewcbackup(self, b'journal.narrowspec.dirstate')
2525 narrowspec.savewcbackup(self, b'journal.narrowspec.dirstate')
2526 narrowspec.savebackup(self, b'journal.narrowspec')
2526 narrowspec.savebackup(self, b'journal.narrowspec')
2527 self.vfs.write(
2527 self.vfs.write(
2528 b"journal.branch", encoding.fromlocal(self.dirstate.branch())
2528 b"journal.branch", encoding.fromlocal(self.dirstate.branch())
2529 )
2529 )
2530 self.vfs.write(b"journal.desc", b"%d\n%s\n" % (len(self), desc))
2530 self.vfs.write(b"journal.desc", b"%d\n%s\n" % (len(self), desc))
2531 bookmarksvfs = bookmarks.bookmarksvfs(self)
2531 bookmarksvfs = bookmarks.bookmarksvfs(self)
2532 bookmarksvfs.write(
2532 bookmarksvfs.write(
2533 b"journal.bookmarks", bookmarksvfs.tryread(b"bookmarks")
2533 b"journal.bookmarks", bookmarksvfs.tryread(b"bookmarks")
2534 )
2534 )
2535 self.svfs.write(b"journal.phaseroots", self.svfs.tryread(b"phaseroots"))
2535 self.svfs.write(b"journal.phaseroots", self.svfs.tryread(b"phaseroots"))
2536
2536
2537 def recover(self):
2537 def recover(self):
2538 with self.lock():
2538 with self.lock():
2539 if self.svfs.exists(b"journal"):
2539 if self.svfs.exists(b"journal"):
2540 self.ui.status(_(b"rolling back interrupted transaction\n"))
2540 self.ui.status(_(b"rolling back interrupted transaction\n"))
2541 vfsmap = {
2541 vfsmap = {
2542 b'': self.svfs,
2542 b'': self.svfs,
2543 b'plain': self.vfs,
2543 b'plain': self.vfs,
2544 }
2544 }
2545 transaction.rollback(
2545 transaction.rollback(
2546 self.svfs,
2546 self.svfs,
2547 vfsmap,
2547 vfsmap,
2548 b"journal",
2548 b"journal",
2549 self.ui.warn,
2549 self.ui.warn,
2550 checkambigfiles=_cachedfiles,
2550 checkambigfiles=_cachedfiles,
2551 )
2551 )
2552 self.invalidate()
2552 self.invalidate()
2553 return True
2553 return True
2554 else:
2554 else:
2555 self.ui.warn(_(b"no interrupted transaction available\n"))
2555 self.ui.warn(_(b"no interrupted transaction available\n"))
2556 return False
2556 return False
2557
2557
2558 def rollback(self, dryrun=False, force=False):
2558 def rollback(self, dryrun=False, force=False):
2559 wlock = lock = dsguard = None
2559 wlock = lock = dsguard = None
2560 try:
2560 try:
2561 wlock = self.wlock()
2561 wlock = self.wlock()
2562 lock = self.lock()
2562 lock = self.lock()
2563 if self.svfs.exists(b"undo"):
2563 if self.svfs.exists(b"undo"):
2564 dsguard = dirstateguard.dirstateguard(self, b'rollback')
2564 dsguard = dirstateguard.dirstateguard(self, b'rollback')
2565
2565
2566 return self._rollback(dryrun, force, dsguard)
2566 return self._rollback(dryrun, force, dsguard)
2567 else:
2567 else:
2568 self.ui.warn(_(b"no rollback information available\n"))
2568 self.ui.warn(_(b"no rollback information available\n"))
2569 return 1
2569 return 1
2570 finally:
2570 finally:
2571 release(dsguard, lock, wlock)
2571 release(dsguard, lock, wlock)
2572
2572
2573 @unfilteredmethod # Until we get smarter cache management
2573 @unfilteredmethod # Until we get smarter cache management
2574 def _rollback(self, dryrun, force, dsguard):
2574 def _rollback(self, dryrun, force, dsguard):
2575 ui = self.ui
2575 ui = self.ui
2576 try:
2576 try:
2577 args = self.vfs.read(b'undo.desc').splitlines()
2577 args = self.vfs.read(b'undo.desc').splitlines()
2578 (oldlen, desc, detail) = (int(args[0]), args[1], None)
2578 (oldlen, desc, detail) = (int(args[0]), args[1], None)
2579 if len(args) >= 3:
2579 if len(args) >= 3:
2580 detail = args[2]
2580 detail = args[2]
2581 oldtip = oldlen - 1
2581 oldtip = oldlen - 1
2582
2582
2583 if detail and ui.verbose:
2583 if detail and ui.verbose:
2584 msg = _(
2584 msg = _(
2585 b'repository tip rolled back to revision %d'
2585 b'repository tip rolled back to revision %d'
2586 b' (undo %s: %s)\n'
2586 b' (undo %s: %s)\n'
2587 ) % (oldtip, desc, detail)
2587 ) % (oldtip, desc, detail)
2588 else:
2588 else:
2589 msg = _(
2589 msg = _(
2590 b'repository tip rolled back to revision %d (undo %s)\n'
2590 b'repository tip rolled back to revision %d (undo %s)\n'
2591 ) % (oldtip, desc)
2591 ) % (oldtip, desc)
2592 except IOError:
2592 except IOError:
2593 msg = _(b'rolling back unknown transaction\n')
2593 msg = _(b'rolling back unknown transaction\n')
2594 desc = None
2594 desc = None
2595
2595
2596 if not force and self[b'.'] != self[b'tip'] and desc == b'commit':
2596 if not force and self[b'.'] != self[b'tip'] and desc == b'commit':
2597 raise error.Abort(
2597 raise error.Abort(
2598 _(
2598 _(
2599 b'rollback of last commit while not checked out '
2599 b'rollback of last commit while not checked out '
2600 b'may lose data'
2600 b'may lose data'
2601 ),
2601 ),
2602 hint=_(b'use -f to force'),
2602 hint=_(b'use -f to force'),
2603 )
2603 )
2604
2604
2605 ui.status(msg)
2605 ui.status(msg)
2606 if dryrun:
2606 if dryrun:
2607 return 0
2607 return 0
2608
2608
2609 parents = self.dirstate.parents()
2609 parents = self.dirstate.parents()
2610 self.destroying()
2610 self.destroying()
2611 vfsmap = {b'plain': self.vfs, b'': self.svfs}
2611 vfsmap = {b'plain': self.vfs, b'': self.svfs}
2612 transaction.rollback(
2612 transaction.rollback(
2613 self.svfs, vfsmap, b'undo', ui.warn, checkambigfiles=_cachedfiles
2613 self.svfs, vfsmap, b'undo', ui.warn, checkambigfiles=_cachedfiles
2614 )
2614 )
2615 bookmarksvfs = bookmarks.bookmarksvfs(self)
2615 bookmarksvfs = bookmarks.bookmarksvfs(self)
2616 if bookmarksvfs.exists(b'undo.bookmarks'):
2616 if bookmarksvfs.exists(b'undo.bookmarks'):
2617 bookmarksvfs.rename(
2617 bookmarksvfs.rename(
2618 b'undo.bookmarks', b'bookmarks', checkambig=True
2618 b'undo.bookmarks', b'bookmarks', checkambig=True
2619 )
2619 )
2620 if self.svfs.exists(b'undo.phaseroots'):
2620 if self.svfs.exists(b'undo.phaseroots'):
2621 self.svfs.rename(b'undo.phaseroots', b'phaseroots', checkambig=True)
2621 self.svfs.rename(b'undo.phaseroots', b'phaseroots', checkambig=True)
2622 self.invalidate()
2622 self.invalidate()
2623
2623
2624 has_node = self.changelog.index.has_node
2624 has_node = self.changelog.index.has_node
2625 parentgone = any(not has_node(p) for p in parents)
2625 parentgone = any(not has_node(p) for p in parents)
2626 if parentgone:
2626 if parentgone:
2627 # prevent dirstateguard from overwriting already restored one
2627 # prevent dirstateguard from overwriting already restored one
2628 dsguard.close()
2628 dsguard.close()
2629
2629
2630 narrowspec.restorebackup(self, b'undo.narrowspec')
2630 narrowspec.restorebackup(self, b'undo.narrowspec')
2631 narrowspec.restorewcbackup(self, b'undo.narrowspec.dirstate')
2631 narrowspec.restorewcbackup(self, b'undo.narrowspec.dirstate')
2632 self.dirstate.restorebackup(None, b'undo.dirstate')
2632 self.dirstate.restorebackup(None, b'undo.dirstate')
2633 try:
2633 try:
2634 branch = self.vfs.read(b'undo.branch')
2634 branch = self.vfs.read(b'undo.branch')
2635 self.dirstate.setbranch(encoding.tolocal(branch))
2635 self.dirstate.setbranch(encoding.tolocal(branch))
2636 except IOError:
2636 except IOError:
2637 ui.warn(
2637 ui.warn(
2638 _(
2638 _(
2639 b'named branch could not be reset: '
2639 b'named branch could not be reset: '
2640 b'current branch is still \'%s\'\n'
2640 b'current branch is still \'%s\'\n'
2641 )
2641 )
2642 % self.dirstate.branch()
2642 % self.dirstate.branch()
2643 )
2643 )
2644
2644
2645 parents = tuple([p.rev() for p in self[None].parents()])
2645 parents = tuple([p.rev() for p in self[None].parents()])
2646 if len(parents) > 1:
2646 if len(parents) > 1:
2647 ui.status(
2647 ui.status(
2648 _(
2648 _(
2649 b'working directory now based on '
2649 b'working directory now based on '
2650 b'revisions %d and %d\n'
2650 b'revisions %d and %d\n'
2651 )
2651 )
2652 % parents
2652 % parents
2653 )
2653 )
2654 else:
2654 else:
2655 ui.status(
2655 ui.status(
2656 _(b'working directory now based on revision %d\n') % parents
2656 _(b'working directory now based on revision %d\n') % parents
2657 )
2657 )
2658 mergestatemod.mergestate.clean(self)
2658 mergestatemod.mergestate.clean(self)
2659
2659
2660 # TODO: if we know which new heads may result from this rollback, pass
2660 # TODO: if we know which new heads may result from this rollback, pass
2661 # them to destroy(), which will prevent the branchhead cache from being
2661 # them to destroy(), which will prevent the branchhead cache from being
2662 # invalidated.
2662 # invalidated.
2663 self.destroyed()
2663 self.destroyed()
2664 return 0
2664 return 0
2665
2665
2666 def _buildcacheupdater(self, newtransaction):
2666 def _buildcacheupdater(self, newtransaction):
2667 """called during transaction to build the callback updating cache
2667 """called during transaction to build the callback updating cache
2668
2668
2669 Lives on the repository to help extension who might want to augment
2669 Lives on the repository to help extension who might want to augment
2670 this logic. For this purpose, the created transaction is passed to the
2670 this logic. For this purpose, the created transaction is passed to the
2671 method.
2671 method.
2672 """
2672 """
2673 # we must avoid cyclic reference between repo and transaction.
2673 # we must avoid cyclic reference between repo and transaction.
2674 reporef = weakref.ref(self)
2674 reporef = weakref.ref(self)
2675
2675
2676 def updater(tr):
2676 def updater(tr):
2677 repo = reporef()
2677 repo = reporef()
2678 repo.updatecaches(tr)
2678 repo.updatecaches(tr)
2679
2679
2680 return updater
2680 return updater
2681
2681
2682 @unfilteredmethod
2682 @unfilteredmethod
2683 def updatecaches(self, tr=None, full=False):
2683 def updatecaches(self, tr=None, full=False):
2684 """warm appropriate caches
2684 """warm appropriate caches
2685
2685
2686 If this function is called after a transaction closed. The transaction
2686 If this function is called after a transaction closed. The transaction
2687 will be available in the 'tr' argument. This can be used to selectively
2687 will be available in the 'tr' argument. This can be used to selectively
2688 update caches relevant to the changes in that transaction.
2688 update caches relevant to the changes in that transaction.
2689
2689
2690 If 'full' is set, make sure all caches the function knows about have
2690 If 'full' is set, make sure all caches the function knows about have
2691 up-to-date data. Even the ones usually loaded more lazily.
2691 up-to-date data. Even the ones usually loaded more lazily.
2692 """
2692 """
2693 if tr is not None and tr.hookargs.get(b'source') == b'strip':
2693 if tr is not None and tr.hookargs.get(b'source') == b'strip':
2694 # During strip, many caches are invalid but
2694 # During strip, many caches are invalid but
2695 # later call to `destroyed` will refresh them.
2695 # later call to `destroyed` will refresh them.
2696 return
2696 return
2697
2697
2698 if tr is None or tr.changes[b'origrepolen'] < len(self):
2698 if tr is None or tr.changes[b'origrepolen'] < len(self):
2699 # accessing the 'served' branchmap should refresh all the others,
2699 # accessing the 'served' branchmap should refresh all the others,
2700 self.ui.debug(b'updating the branch cache\n')
2700 self.ui.debug(b'updating the branch cache\n')
2701 self.filtered(b'served').branchmap()
2701 self.filtered(b'served').branchmap()
2702 self.filtered(b'served.hidden').branchmap()
2702 self.filtered(b'served.hidden').branchmap()
2703
2703
2704 if full:
2704 if full:
2705 unfi = self.unfiltered()
2705 unfi = self.unfiltered()
2706
2706
2707 self.changelog.update_caches(transaction=tr)
2707 self.changelog.update_caches(transaction=tr)
2708 self.manifestlog.update_caches(transaction=tr)
2708 self.manifestlog.update_caches(transaction=tr)
2709
2709
2710 rbc = unfi.revbranchcache()
2710 rbc = unfi.revbranchcache()
2711 for r in unfi.changelog:
2711 for r in unfi.changelog:
2712 rbc.branchinfo(r)
2712 rbc.branchinfo(r)
2713 rbc.write()
2713 rbc.write()
2714
2714
2715 # ensure the working copy parents are in the manifestfulltextcache
2715 # ensure the working copy parents are in the manifestfulltextcache
2716 for ctx in self[b'.'].parents():
2716 for ctx in self[b'.'].parents():
2717 ctx.manifest() # accessing the manifest is enough
2717 ctx.manifest() # accessing the manifest is enough
2718
2718
2719 # accessing fnode cache warms the cache
2719 # accessing fnode cache warms the cache
2720 tagsmod.fnoderevs(self.ui, unfi, unfi.changelog.revs())
2720 tagsmod.fnoderevs(self.ui, unfi, unfi.changelog.revs())
2721 # accessing tags warm the cache
2721 # accessing tags warm the cache
2722 self.tags()
2722 self.tags()
2723 self.filtered(b'served').tags()
2723 self.filtered(b'served').tags()
2724
2724
2725 # The `full` arg is documented as updating even the lazily-loaded
2725 # The `full` arg is documented as updating even the lazily-loaded
2726 # caches immediately, so we're forcing a write to cause these caches
2726 # caches immediately, so we're forcing a write to cause these caches
2727 # to be warmed up even if they haven't explicitly been requested
2727 # to be warmed up even if they haven't explicitly been requested
2728 # yet (if they've never been used by hg, they won't ever have been
2728 # yet (if they've never been used by hg, they won't ever have been
2729 # written, even if they're a subset of another kind of cache that
2729 # written, even if they're a subset of another kind of cache that
2730 # *has* been used).
2730 # *has* been used).
2731 for filt in repoview.filtertable.keys():
2731 for filt in repoview.filtertable.keys():
2732 filtered = self.filtered(filt)
2732 filtered = self.filtered(filt)
2733 filtered.branchmap().write(filtered)
2733 filtered.branchmap().write(filtered)
2734
2734
2735 def invalidatecaches(self):
2735 def invalidatecaches(self):
2736
2736
2737 if '_tagscache' in vars(self):
2737 if '_tagscache' in vars(self):
2738 # can't use delattr on proxy
2738 # can't use delattr on proxy
2739 del self.__dict__['_tagscache']
2739 del self.__dict__['_tagscache']
2740
2740
2741 self._branchcaches.clear()
2741 self._branchcaches.clear()
2742 self.invalidatevolatilesets()
2742 self.invalidatevolatilesets()
2743 self._sparsesignaturecache.clear()
2743 self._sparsesignaturecache.clear()
2744
2744
2745 def invalidatevolatilesets(self):
2745 def invalidatevolatilesets(self):
2746 self.filteredrevcache.clear()
2746 self.filteredrevcache.clear()
2747 obsolete.clearobscaches(self)
2747 obsolete.clearobscaches(self)
2748 self._quick_access_changeid_invalidate()
2748 self._quick_access_changeid_invalidate()
2749
2749
2750 def invalidatedirstate(self):
2750 def invalidatedirstate(self):
2751 """Invalidates the dirstate, causing the next call to dirstate
2751 """Invalidates the dirstate, causing the next call to dirstate
2752 to check if it was modified since the last time it was read,
2752 to check if it was modified since the last time it was read,
2753 rereading it if it has.
2753 rereading it if it has.
2754
2754
2755 This is different to dirstate.invalidate() that it doesn't always
2755 This is different to dirstate.invalidate() that it doesn't always
2756 rereads the dirstate. Use dirstate.invalidate() if you want to
2756 rereads the dirstate. Use dirstate.invalidate() if you want to
2757 explicitly read the dirstate again (i.e. restoring it to a previous
2757 explicitly read the dirstate again (i.e. restoring it to a previous
2758 known good state)."""
2758 known good state)."""
2759 if hasunfilteredcache(self, 'dirstate'):
2759 if hasunfilteredcache(self, 'dirstate'):
2760 for k in self.dirstate._filecache:
2760 for k in self.dirstate._filecache:
2761 try:
2761 try:
2762 delattr(self.dirstate, k)
2762 delattr(self.dirstate, k)
2763 except AttributeError:
2763 except AttributeError:
2764 pass
2764 pass
2765 delattr(self.unfiltered(), 'dirstate')
2765 delattr(self.unfiltered(), 'dirstate')
2766
2766
2767 def invalidate(self, clearfilecache=False):
2767 def invalidate(self, clearfilecache=False):
2768 """Invalidates both store and non-store parts other than dirstate
2768 """Invalidates both store and non-store parts other than dirstate
2769
2769
2770 If a transaction is running, invalidation of store is omitted,
2770 If a transaction is running, invalidation of store is omitted,
2771 because discarding in-memory changes might cause inconsistency
2771 because discarding in-memory changes might cause inconsistency
2772 (e.g. incomplete fncache causes unintentional failure, but
2772 (e.g. incomplete fncache causes unintentional failure, but
2773 redundant one doesn't).
2773 redundant one doesn't).
2774 """
2774 """
2775 unfiltered = self.unfiltered() # all file caches are stored unfiltered
2775 unfiltered = self.unfiltered() # all file caches are stored unfiltered
2776 for k in list(self._filecache.keys()):
2776 for k in list(self._filecache.keys()):
2777 # dirstate is invalidated separately in invalidatedirstate()
2777 # dirstate is invalidated separately in invalidatedirstate()
2778 if k == b'dirstate':
2778 if k == b'dirstate':
2779 continue
2779 continue
2780 if (
2780 if (
2781 k == b'changelog'
2781 k == b'changelog'
2782 and self.currenttransaction()
2782 and self.currenttransaction()
2783 and self.changelog._delayed
2783 and self.changelog._delayed
2784 ):
2784 ):
2785 # The changelog object may store unwritten revisions. We don't
2785 # The changelog object may store unwritten revisions. We don't
2786 # want to lose them.
2786 # want to lose them.
2787 # TODO: Solve the problem instead of working around it.
2787 # TODO: Solve the problem instead of working around it.
2788 continue
2788 continue
2789
2789
2790 if clearfilecache:
2790 if clearfilecache:
2791 del self._filecache[k]
2791 del self._filecache[k]
2792 try:
2792 try:
2793 delattr(unfiltered, k)
2793 delattr(unfiltered, k)
2794 except AttributeError:
2794 except AttributeError:
2795 pass
2795 pass
2796 self.invalidatecaches()
2796 self.invalidatecaches()
2797 if not self.currenttransaction():
2797 if not self.currenttransaction():
2798 # TODO: Changing contents of store outside transaction
2798 # TODO: Changing contents of store outside transaction
2799 # causes inconsistency. We should make in-memory store
2799 # causes inconsistency. We should make in-memory store
2800 # changes detectable, and abort if changed.
2800 # changes detectable, and abort if changed.
2801 self.store.invalidatecaches()
2801 self.store.invalidatecaches()
2802
2802
2803 def invalidateall(self):
2803 def invalidateall(self):
2804 """Fully invalidates both store and non-store parts, causing the
2804 """Fully invalidates both store and non-store parts, causing the
2805 subsequent operation to reread any outside changes."""
2805 subsequent operation to reread any outside changes."""
2806 # extension should hook this to invalidate its caches
2806 # extension should hook this to invalidate its caches
2807 self.invalidate()
2807 self.invalidate()
2808 self.invalidatedirstate()
2808 self.invalidatedirstate()
2809
2809
2810 @unfilteredmethod
2810 @unfilteredmethod
2811 def _refreshfilecachestats(self, tr):
2811 def _refreshfilecachestats(self, tr):
2812 """Reload stats of cached files so that they are flagged as valid"""
2812 """Reload stats of cached files so that they are flagged as valid"""
2813 for k, ce in self._filecache.items():
2813 for k, ce in self._filecache.items():
2814 k = pycompat.sysstr(k)
2814 k = pycompat.sysstr(k)
2815 if k == 'dirstate' or k not in self.__dict__:
2815 if k == 'dirstate' or k not in self.__dict__:
2816 continue
2816 continue
2817 ce.refresh()
2817 ce.refresh()
2818
2818
2819 def _lock(
2819 def _lock(
2820 self,
2820 self,
2821 vfs,
2821 vfs,
2822 lockname,
2822 lockname,
2823 wait,
2823 wait,
2824 releasefn,
2824 releasefn,
2825 acquirefn,
2825 acquirefn,
2826 desc,
2826 desc,
2827 ):
2827 ):
2828 timeout = 0
2828 timeout = 0
2829 warntimeout = 0
2829 warntimeout = 0
2830 if wait:
2830 if wait:
2831 timeout = self.ui.configint(b"ui", b"timeout")
2831 timeout = self.ui.configint(b"ui", b"timeout")
2832 warntimeout = self.ui.configint(b"ui", b"timeout.warn")
2832 warntimeout = self.ui.configint(b"ui", b"timeout.warn")
2833 # internal config: ui.signal-safe-lock
2833 # internal config: ui.signal-safe-lock
2834 signalsafe = self.ui.configbool(b'ui', b'signal-safe-lock')
2834 signalsafe = self.ui.configbool(b'ui', b'signal-safe-lock')
2835
2835
2836 l = lockmod.trylock(
2836 l = lockmod.trylock(
2837 self.ui,
2837 self.ui,
2838 vfs,
2838 vfs,
2839 lockname,
2839 lockname,
2840 timeout,
2840 timeout,
2841 warntimeout,
2841 warntimeout,
2842 releasefn=releasefn,
2842 releasefn=releasefn,
2843 acquirefn=acquirefn,
2843 acquirefn=acquirefn,
2844 desc=desc,
2844 desc=desc,
2845 signalsafe=signalsafe,
2845 signalsafe=signalsafe,
2846 )
2846 )
2847 return l
2847 return l
2848
2848
2849 def _afterlock(self, callback):
2849 def _afterlock(self, callback):
2850 """add a callback to be run when the repository is fully unlocked
2850 """add a callback to be run when the repository is fully unlocked
2851
2851
2852 The callback will be executed when the outermost lock is released
2852 The callback will be executed when the outermost lock is released
2853 (with wlock being higher level than 'lock')."""
2853 (with wlock being higher level than 'lock')."""
2854 for ref in (self._wlockref, self._lockref):
2854 for ref in (self._wlockref, self._lockref):
2855 l = ref and ref()
2855 l = ref and ref()
2856 if l and l.held:
2856 if l and l.held:
2857 l.postrelease.append(callback)
2857 l.postrelease.append(callback)
2858 break
2858 break
2859 else: # no lock have been found.
2859 else: # no lock have been found.
2860 callback(True)
2860 callback(True)
2861
2861
2862 def lock(self, wait=True):
2862 def lock(self, wait=True):
2863 """Lock the repository store (.hg/store) and return a weak reference
2863 """Lock the repository store (.hg/store) and return a weak reference
2864 to the lock. Use this before modifying the store (e.g. committing or
2864 to the lock. Use this before modifying the store (e.g. committing or
2865 stripping). If you are opening a transaction, get a lock as well.)
2865 stripping). If you are opening a transaction, get a lock as well.)
2866
2866
2867 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
2867 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
2868 'wlock' first to avoid a dead-lock hazard."""
2868 'wlock' first to avoid a dead-lock hazard."""
2869 l = self._currentlock(self._lockref)
2869 l = self._currentlock(self._lockref)
2870 if l is not None:
2870 if l is not None:
2871 l.lock()
2871 l.lock()
2872 return l
2872 return l
2873
2873
2874 l = self._lock(
2874 l = self._lock(
2875 vfs=self.svfs,
2875 vfs=self.svfs,
2876 lockname=b"lock",
2876 lockname=b"lock",
2877 wait=wait,
2877 wait=wait,
2878 releasefn=None,
2878 releasefn=None,
2879 acquirefn=self.invalidate,
2879 acquirefn=self.invalidate,
2880 desc=_(b'repository %s') % self.origroot,
2880 desc=_(b'repository %s') % self.origroot,
2881 )
2881 )
2882 self._lockref = weakref.ref(l)
2882 self._lockref = weakref.ref(l)
2883 return l
2883 return l
2884
2884
2885 def wlock(self, wait=True):
2885 def wlock(self, wait=True):
2886 """Lock the non-store parts of the repository (everything under
2886 """Lock the non-store parts of the repository (everything under
2887 .hg except .hg/store) and return a weak reference to the lock.
2887 .hg except .hg/store) and return a weak reference to the lock.
2888
2888
2889 Use this before modifying files in .hg.
2889 Use this before modifying files in .hg.
2890
2890
2891 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
2891 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
2892 'wlock' first to avoid a dead-lock hazard."""
2892 'wlock' first to avoid a dead-lock hazard."""
2893 l = self._wlockref and self._wlockref()
2893 l = self._wlockref and self._wlockref()
2894 if l is not None and l.held:
2894 if l is not None and l.held:
2895 l.lock()
2895 l.lock()
2896 return l
2896 return l
2897
2897
2898 # We do not need to check for non-waiting lock acquisition. Such
2898 # We do not need to check for non-waiting lock acquisition. Such
2899 # acquisition would not cause dead-lock as they would just fail.
2899 # acquisition would not cause dead-lock as they would just fail.
2900 if wait and (
2900 if wait and (
2901 self.ui.configbool(b'devel', b'all-warnings')
2901 self.ui.configbool(b'devel', b'all-warnings')
2902 or self.ui.configbool(b'devel', b'check-locks')
2902 or self.ui.configbool(b'devel', b'check-locks')
2903 ):
2903 ):
2904 if self._currentlock(self._lockref) is not None:
2904 if self._currentlock(self._lockref) is not None:
2905 self.ui.develwarn(b'"wlock" acquired after "lock"')
2905 self.ui.develwarn(b'"wlock" acquired after "lock"')
2906
2906
2907 def unlock():
2907 def unlock():
2908 if self.dirstate.pendingparentchange():
2908 if self.dirstate.pendingparentchange():
2909 self.dirstate.invalidate()
2909 self.dirstate.invalidate()
2910 else:
2910 else:
2911 self.dirstate.write(None)
2911 self.dirstate.write(None)
2912
2912
2913 self._filecache[b'dirstate'].refresh()
2913 self._filecache[b'dirstate'].refresh()
2914
2914
2915 l = self._lock(
2915 l = self._lock(
2916 self.vfs,
2916 self.vfs,
2917 b"wlock",
2917 b"wlock",
2918 wait,
2918 wait,
2919 unlock,
2919 unlock,
2920 self.invalidatedirstate,
2920 self.invalidatedirstate,
2921 _(b'working directory of %s') % self.origroot,
2921 _(b'working directory of %s') % self.origroot,
2922 )
2922 )
2923 self._wlockref = weakref.ref(l)
2923 self._wlockref = weakref.ref(l)
2924 return l
2924 return l
2925
2925
2926 def _currentlock(self, lockref):
2926 def _currentlock(self, lockref):
2927 """Returns the lock if it's held, or None if it's not."""
2927 """Returns the lock if it's held, or None if it's not."""
2928 if lockref is None:
2928 if lockref is None:
2929 return None
2929 return None
2930 l = lockref()
2930 l = lockref()
2931 if l is None or not l.held:
2931 if l is None or not l.held:
2932 return None
2932 return None
2933 return l
2933 return l
2934
2934
2935 def currentwlock(self):
2935 def currentwlock(self):
2936 """Returns the wlock if it's held, or None if it's not."""
2936 """Returns the wlock if it's held, or None if it's not."""
2937 return self._currentlock(self._wlockref)
2937 return self._currentlock(self._wlockref)
2938
2938
2939 def checkcommitpatterns(self, wctx, match, status, fail):
2939 def checkcommitpatterns(self, wctx, match, status, fail):
2940 """check for commit arguments that aren't committable"""
2940 """check for commit arguments that aren't committable"""
2941 if match.isexact() or match.prefix():
2941 if match.isexact() or match.prefix():
2942 matched = set(status.modified + status.added + status.removed)
2942 matched = set(status.modified + status.added + status.removed)
2943
2943
2944 for f in match.files():
2944 for f in match.files():
2945 f = self.dirstate.normalize(f)
2945 f = self.dirstate.normalize(f)
2946 if f == b'.' or f in matched or f in wctx.substate:
2946 if f == b'.' or f in matched or f in wctx.substate:
2947 continue
2947 continue
2948 if f in status.deleted:
2948 if f in status.deleted:
2949 fail(f, _(b'file not found!'))
2949 fail(f, _(b'file not found!'))
2950 # Is it a directory that exists or used to exist?
2950 # Is it a directory that exists or used to exist?
2951 if self.wvfs.isdir(f) or wctx.p1().hasdir(f):
2951 if self.wvfs.isdir(f) or wctx.p1().hasdir(f):
2952 d = f + b'/'
2952 d = f + b'/'
2953 for mf in matched:
2953 for mf in matched:
2954 if mf.startswith(d):
2954 if mf.startswith(d):
2955 break
2955 break
2956 else:
2956 else:
2957 fail(f, _(b"no match under directory!"))
2957 fail(f, _(b"no match under directory!"))
2958 elif f not in self.dirstate:
2958 elif f not in self.dirstate:
2959 fail(f, _(b"file not tracked!"))
2959 fail(f, _(b"file not tracked!"))
2960
2960
2961 @unfilteredmethod
2961 @unfilteredmethod
2962 def commit(
2962 def commit(
2963 self,
2963 self,
2964 text=b"",
2964 text=b"",
2965 user=None,
2965 user=None,
2966 date=None,
2966 date=None,
2967 match=None,
2967 match=None,
2968 force=False,
2968 force=False,
2969 editor=None,
2969 editor=None,
2970 extra=None,
2970 extra=None,
2971 ):
2971 ):
2972 """Add a new revision to current repository.
2972 """Add a new revision to current repository.
2973
2973
2974 Revision information is gathered from the working directory,
2974 Revision information is gathered from the working directory,
2975 match can be used to filter the committed files. If editor is
2975 match can be used to filter the committed files. If editor is
2976 supplied, it is called to get a commit message.
2976 supplied, it is called to get a commit message.
2977 """
2977 """
2978 if extra is None:
2978 if extra is None:
2979 extra = {}
2979 extra = {}
2980
2980
2981 def fail(f, msg):
2981 def fail(f, msg):
2982 raise error.InputError(b'%s: %s' % (f, msg))
2982 raise error.InputError(b'%s: %s' % (f, msg))
2983
2983
2984 if not match:
2984 if not match:
2985 match = matchmod.always()
2985 match = matchmod.always()
2986
2986
2987 if not force:
2987 if not force:
2988 match.bad = fail
2988 match.bad = fail
2989
2989
2990 # lock() for recent changelog (see issue4368)
2990 # lock() for recent changelog (see issue4368)
2991 with self.wlock(), self.lock():
2991 with self.wlock(), self.lock():
2992 wctx = self[None]
2992 wctx = self[None]
2993 merge = len(wctx.parents()) > 1
2993 merge = len(wctx.parents()) > 1
2994
2994
2995 if not force and merge and not match.always():
2995 if not force and merge and not match.always():
2996 raise error.Abort(
2996 raise error.Abort(
2997 _(
2997 _(
2998 b'cannot partially commit a merge '
2998 b'cannot partially commit a merge '
2999 b'(do not specify files or patterns)'
2999 b'(do not specify files or patterns)'
3000 )
3000 )
3001 )
3001 )
3002
3002
3003 status = self.status(match=match, clean=force)
3003 status = self.status(match=match, clean=force)
3004 if force:
3004 if force:
3005 status.modified.extend(
3005 status.modified.extend(
3006 status.clean
3006 status.clean
3007 ) # mq may commit clean files
3007 ) # mq may commit clean files
3008
3008
3009 # check subrepos
3009 # check subrepos
3010 subs, commitsubs, newstate = subrepoutil.precommit(
3010 subs, commitsubs, newstate = subrepoutil.precommit(
3011 self.ui, wctx, status, match, force=force
3011 self.ui, wctx, status, match, force=force
3012 )
3012 )
3013
3013
3014 # make sure all explicit patterns are matched
3014 # make sure all explicit patterns are matched
3015 if not force:
3015 if not force:
3016 self.checkcommitpatterns(wctx, match, status, fail)
3016 self.checkcommitpatterns(wctx, match, status, fail)
3017
3017
3018 cctx = context.workingcommitctx(
3018 cctx = context.workingcommitctx(
3019 self, status, text, user, date, extra
3019 self, status, text, user, date, extra
3020 )
3020 )
3021
3021
3022 ms = mergestatemod.mergestate.read(self)
3022 ms = mergestatemod.mergestate.read(self)
3023 mergeutil.checkunresolved(ms)
3023 mergeutil.checkunresolved(ms)
3024
3024
3025 # internal config: ui.allowemptycommit
3025 # internal config: ui.allowemptycommit
3026 if cctx.isempty() and not self.ui.configbool(
3026 if cctx.isempty() and not self.ui.configbool(
3027 b'ui', b'allowemptycommit'
3027 b'ui', b'allowemptycommit'
3028 ):
3028 ):
3029 self.ui.debug(b'nothing to commit, clearing merge state\n')
3029 self.ui.debug(b'nothing to commit, clearing merge state\n')
3030 ms.reset()
3030 ms.reset()
3031 return None
3031 return None
3032
3032
3033 if merge and cctx.deleted():
3033 if merge and cctx.deleted():
3034 raise error.Abort(_(b"cannot commit merge with missing files"))
3034 raise error.Abort(_(b"cannot commit merge with missing files"))
3035
3035
3036 if editor:
3036 if editor:
3037 cctx._text = editor(self, cctx, subs)
3037 cctx._text = editor(self, cctx, subs)
3038 edited = text != cctx._text
3038 edited = text != cctx._text
3039
3039
3040 # Save commit message in case this transaction gets rolled back
3040 # Save commit message in case this transaction gets rolled back
3041 # (e.g. by a pretxncommit hook). Leave the content alone on
3041 # (e.g. by a pretxncommit hook). Leave the content alone on
3042 # the assumption that the user will use the same editor again.
3042 # the assumption that the user will use the same editor again.
3043 msgfn = self.savecommitmessage(cctx._text)
3043 msgfn = self.savecommitmessage(cctx._text)
3044
3044
3045 # commit subs and write new state
3045 # commit subs and write new state
3046 if subs:
3046 if subs:
3047 uipathfn = scmutil.getuipathfn(self)
3047 uipathfn = scmutil.getuipathfn(self)
3048 for s in sorted(commitsubs):
3048 for s in sorted(commitsubs):
3049 sub = wctx.sub(s)
3049 sub = wctx.sub(s)
3050 self.ui.status(
3050 self.ui.status(
3051 _(b'committing subrepository %s\n')
3051 _(b'committing subrepository %s\n')
3052 % uipathfn(subrepoutil.subrelpath(sub))
3052 % uipathfn(subrepoutil.subrelpath(sub))
3053 )
3053 )
3054 sr = sub.commit(cctx._text, user, date)
3054 sr = sub.commit(cctx._text, user, date)
3055 newstate[s] = (newstate[s][0], sr)
3055 newstate[s] = (newstate[s][0], sr)
3056 subrepoutil.writestate(self, newstate)
3056 subrepoutil.writestate(self, newstate)
3057
3057
3058 p1, p2 = self.dirstate.parents()
3058 p1, p2 = self.dirstate.parents()
3059 hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or b'')
3059 hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or b'')
3060 try:
3060 try:
3061 self.hook(
3061 self.hook(
3062 b"precommit", throw=True, parent1=hookp1, parent2=hookp2
3062 b"precommit", throw=True, parent1=hookp1, parent2=hookp2
3063 )
3063 )
3064 with self.transaction(b'commit'):
3064 with self.transaction(b'commit'):
3065 ret = self.commitctx(cctx, True)
3065 ret = self.commitctx(cctx, True)
3066 # update bookmarks, dirstate and mergestate
3066 # update bookmarks, dirstate and mergestate
3067 bookmarks.update(self, [p1, p2], ret)
3067 bookmarks.update(self, [p1, p2], ret)
3068 cctx.markcommitted(ret)
3068 cctx.markcommitted(ret)
3069 ms.reset()
3069 ms.reset()
3070 except: # re-raises
3070 except: # re-raises
3071 if edited:
3071 if edited:
3072 self.ui.write(
3072 self.ui.write(
3073 _(b'note: commit message saved in %s\n') % msgfn
3073 _(b'note: commit message saved in %s\n') % msgfn
3074 )
3074 )
3075 self.ui.write(
3075 self.ui.write(
3076 _(
3076 _(
3077 b"note: use 'hg commit --logfile "
3077 b"note: use 'hg commit --logfile "
3078 b".hg/last-message.txt --edit' to reuse it\n"
3078 b".hg/last-message.txt --edit' to reuse it\n"
3079 )
3079 )
3080 )
3080 )
3081 raise
3081 raise
3082
3082
3083 def commithook(unused_success):
3083 def commithook(unused_success):
3084 # hack for command that use a temporary commit (eg: histedit)
3084 # hack for command that use a temporary commit (eg: histedit)
3085 # temporary commit got stripped before hook release
3085 # temporary commit got stripped before hook release
3086 if self.changelog.hasnode(ret):
3086 if self.changelog.hasnode(ret):
3087 self.hook(
3087 self.hook(
3088 b"commit", node=hex(ret), parent1=hookp1, parent2=hookp2
3088 b"commit", node=hex(ret), parent1=hookp1, parent2=hookp2
3089 )
3089 )
3090
3090
3091 self._afterlock(commithook)
3091 self._afterlock(commithook)
3092 return ret
3092 return ret
3093
3093
3094 @unfilteredmethod
3094 @unfilteredmethod
3095 def commitctx(self, ctx, error=False, origctx=None):
3095 def commitctx(self, ctx, error=False, origctx=None):
3096 return commit.commitctx(self, ctx, error=error, origctx=origctx)
3096 return commit.commitctx(self, ctx, error=error, origctx=origctx)
3097
3097
3098 @unfilteredmethod
3098 @unfilteredmethod
3099 def destroying(self):
3099 def destroying(self):
3100 """Inform the repository that nodes are about to be destroyed.
3100 """Inform the repository that nodes are about to be destroyed.
3101 Intended for use by strip and rollback, so there's a common
3101 Intended for use by strip and rollback, so there's a common
3102 place for anything that has to be done before destroying history.
3102 place for anything that has to be done before destroying history.
3103
3103
3104 This is mostly useful for saving state that is in memory and waiting
3104 This is mostly useful for saving state that is in memory and waiting
3105 to be flushed when the current lock is released. Because a call to
3105 to be flushed when the current lock is released. Because a call to
3106 destroyed is imminent, the repo will be invalidated causing those
3106 destroyed is imminent, the repo will be invalidated causing those
3107 changes to stay in memory (waiting for the next unlock), or vanish
3107 changes to stay in memory (waiting for the next unlock), or vanish
3108 completely.
3108 completely.
3109 """
3109 """
3110 # When using the same lock to commit and strip, the phasecache is left
3110 # When using the same lock to commit and strip, the phasecache is left
3111 # dirty after committing. Then when we strip, the repo is invalidated,
3111 # dirty after committing. Then when we strip, the repo is invalidated,
3112 # causing those changes to disappear.
3112 # causing those changes to disappear.
3113 if '_phasecache' in vars(self):
3113 if '_phasecache' in vars(self):
3114 self._phasecache.write()
3114 self._phasecache.write()
3115
3115
3116 @unfilteredmethod
3116 @unfilteredmethod
3117 def destroyed(self):
3117 def destroyed(self):
3118 """Inform the repository that nodes have been destroyed.
3118 """Inform the repository that nodes have been destroyed.
3119 Intended for use by strip and rollback, so there's a common
3119 Intended for use by strip and rollback, so there's a common
3120 place for anything that has to be done after destroying history.
3120 place for anything that has to be done after destroying history.
3121 """
3121 """
3122 # When one tries to:
3122 # When one tries to:
3123 # 1) destroy nodes thus calling this method (e.g. strip)
3123 # 1) destroy nodes thus calling this method (e.g. strip)
3124 # 2) use phasecache somewhere (e.g. commit)
3124 # 2) use phasecache somewhere (e.g. commit)
3125 #
3125 #
3126 # then 2) will fail because the phasecache contains nodes that were
3126 # then 2) will fail because the phasecache contains nodes that were
3127 # removed. We can either remove phasecache from the filecache,
3127 # removed. We can either remove phasecache from the filecache,
3128 # causing it to reload next time it is accessed, or simply filter
3128 # causing it to reload next time it is accessed, or simply filter
3129 # the removed nodes now and write the updated cache.
3129 # the removed nodes now and write the updated cache.
3130 self._phasecache.filterunknown(self)
3130 self._phasecache.filterunknown(self)
3131 self._phasecache.write()
3131 self._phasecache.write()
3132
3132
3133 # refresh all repository caches
3133 # refresh all repository caches
3134 self.updatecaches()
3134 self.updatecaches()
3135
3135
3136 # Ensure the persistent tag cache is updated. Doing it now
3136 # Ensure the persistent tag cache is updated. Doing it now
3137 # means that the tag cache only has to worry about destroyed
3137 # means that the tag cache only has to worry about destroyed
3138 # heads immediately after a strip/rollback. That in turn
3138 # heads immediately after a strip/rollback. That in turn
3139 # guarantees that "cachetip == currenttip" (comparing both rev
3139 # guarantees that "cachetip == currenttip" (comparing both rev
3140 # and node) always means no nodes have been added or destroyed.
3140 # and node) always means no nodes have been added or destroyed.
3141
3141
3142 # XXX this is suboptimal when qrefresh'ing: we strip the current
3142 # XXX this is suboptimal when qrefresh'ing: we strip the current
3143 # head, refresh the tag cache, then immediately add a new head.
3143 # head, refresh the tag cache, then immediately add a new head.
3144 # But I think doing it this way is necessary for the "instant
3144 # But I think doing it this way is necessary for the "instant
3145 # tag cache retrieval" case to work.
3145 # tag cache retrieval" case to work.
3146 self.invalidate()
3146 self.invalidate()
3147
3147
3148 def status(
3148 def status(
3149 self,
3149 self,
3150 node1=b'.',
3150 node1=b'.',
3151 node2=None,
3151 node2=None,
3152 match=None,
3152 match=None,
3153 ignored=False,
3153 ignored=False,
3154 clean=False,
3154 clean=False,
3155 unknown=False,
3155 unknown=False,
3156 listsubrepos=False,
3156 listsubrepos=False,
3157 ):
3157 ):
3158 '''a convenience method that calls node1.status(node2)'''
3158 '''a convenience method that calls node1.status(node2)'''
3159 return self[node1].status(
3159 return self[node1].status(
3160 node2, match, ignored, clean, unknown, listsubrepos
3160 node2, match, ignored, clean, unknown, listsubrepos
3161 )
3161 )
3162
3162
3163 def addpostdsstatus(self, ps):
3163 def addpostdsstatus(self, ps):
3164 """Add a callback to run within the wlock, at the point at which status
3164 """Add a callback to run within the wlock, at the point at which status
3165 fixups happen.
3165 fixups happen.
3166
3166
3167 On status completion, callback(wctx, status) will be called with the
3167 On status completion, callback(wctx, status) will be called with the
3168 wlock held, unless the dirstate has changed from underneath or the wlock
3168 wlock held, unless the dirstate has changed from underneath or the wlock
3169 couldn't be grabbed.
3169 couldn't be grabbed.
3170
3170
3171 Callbacks should not capture and use a cached copy of the dirstate --
3171 Callbacks should not capture and use a cached copy of the dirstate --
3172 it might change in the meanwhile. Instead, they should access the
3172 it might change in the meanwhile. Instead, they should access the
3173 dirstate via wctx.repo().dirstate.
3173 dirstate via wctx.repo().dirstate.
3174
3174
3175 This list is emptied out after each status run -- extensions should
3175 This list is emptied out after each status run -- extensions should
3176 make sure it adds to this list each time dirstate.status is called.
3176 make sure it adds to this list each time dirstate.status is called.
3177 Extensions should also make sure they don't call this for statuses
3177 Extensions should also make sure they don't call this for statuses
3178 that don't involve the dirstate.
3178 that don't involve the dirstate.
3179 """
3179 """
3180
3180
3181 # The list is located here for uniqueness reasons -- it is actually
3181 # The list is located here for uniqueness reasons -- it is actually
3182 # managed by the workingctx, but that isn't unique per-repo.
3182 # managed by the workingctx, but that isn't unique per-repo.
3183 self._postdsstatus.append(ps)
3183 self._postdsstatus.append(ps)
3184
3184
3185 def postdsstatus(self):
3185 def postdsstatus(self):
3186 """Used by workingctx to get the list of post-dirstate-status hooks."""
3186 """Used by workingctx to get the list of post-dirstate-status hooks."""
3187 return self._postdsstatus
3187 return self._postdsstatus
3188
3188
3189 def clearpostdsstatus(self):
3189 def clearpostdsstatus(self):
3190 """Used by workingctx to clear post-dirstate-status hooks."""
3190 """Used by workingctx to clear post-dirstate-status hooks."""
3191 del self._postdsstatus[:]
3191 del self._postdsstatus[:]
3192
3192
3193 def heads(self, start=None):
3193 def heads(self, start=None):
3194 if start is None:
3194 if start is None:
3195 cl = self.changelog
3195 cl = self.changelog
3196 headrevs = reversed(cl.headrevs())
3196 headrevs = reversed(cl.headrevs())
3197 return [cl.node(rev) for rev in headrevs]
3197 return [cl.node(rev) for rev in headrevs]
3198
3198
3199 heads = self.changelog.heads(start)
3199 heads = self.changelog.heads(start)
3200 # sort the output in rev descending order
3200 # sort the output in rev descending order
3201 return sorted(heads, key=self.changelog.rev, reverse=True)
3201 return sorted(heads, key=self.changelog.rev, reverse=True)
3202
3202
3203 def branchheads(self, branch=None, start=None, closed=False):
3203 def branchheads(self, branch=None, start=None, closed=False):
3204 """return a (possibly filtered) list of heads for the given branch
3204 """return a (possibly filtered) list of heads for the given branch
3205
3205
3206 Heads are returned in topological order, from newest to oldest.
3206 Heads are returned in topological order, from newest to oldest.
3207 If branch is None, use the dirstate branch.
3207 If branch is None, use the dirstate branch.
3208 If start is not None, return only heads reachable from start.
3208 If start is not None, return only heads reachable from start.
3209 If closed is True, return heads that are marked as closed as well.
3209 If closed is True, return heads that are marked as closed as well.
3210 """
3210 """
3211 if branch is None:
3211 if branch is None:
3212 branch = self[None].branch()
3212 branch = self[None].branch()
3213 branches = self.branchmap()
3213 branches = self.branchmap()
3214 if not branches.hasbranch(branch):
3214 if not branches.hasbranch(branch):
3215 return []
3215 return []
3216 # the cache returns heads ordered lowest to highest
3216 # the cache returns heads ordered lowest to highest
3217 bheads = list(reversed(branches.branchheads(branch, closed=closed)))
3217 bheads = list(reversed(branches.branchheads(branch, closed=closed)))
3218 if start is not None:
3218 if start is not None:
3219 # filter out the heads that cannot be reached from startrev
3219 # filter out the heads that cannot be reached from startrev
3220 fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
3220 fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
3221 bheads = [h for h in bheads if h in fbheads]
3221 bheads = [h for h in bheads if h in fbheads]
3222 return bheads
3222 return bheads
3223
3223
3224 def branches(self, nodes):
3224 def branches(self, nodes):
3225 if not nodes:
3225 if not nodes:
3226 nodes = [self.changelog.tip()]
3226 nodes = [self.changelog.tip()]
3227 b = []
3227 b = []
3228 for n in nodes:
3228 for n in nodes:
3229 t = n
3229 t = n
3230 while True:
3230 while True:
3231 p = self.changelog.parents(n)
3231 p = self.changelog.parents(n)
3232 if p[1] != nullid or p[0] == nullid:
3232 if p[1] != nullid or p[0] == nullid:
3233 b.append((t, n, p[0], p[1]))
3233 b.append((t, n, p[0], p[1]))
3234 break
3234 break
3235 n = p[0]
3235 n = p[0]
3236 return b
3236 return b
3237
3237
3238 def between(self, pairs):
3238 def between(self, pairs):
3239 r = []
3239 r = []
3240
3240
3241 for top, bottom in pairs:
3241 for top, bottom in pairs:
3242 n, l, i = top, [], 0
3242 n, l, i = top, [], 0
3243 f = 1
3243 f = 1
3244
3244
3245 while n != bottom and n != nullid:
3245 while n != bottom and n != nullid:
3246 p = self.changelog.parents(n)[0]
3246 p = self.changelog.parents(n)[0]
3247 if i == f:
3247 if i == f:
3248 l.append(n)
3248 l.append(n)
3249 f = f * 2
3249 f = f * 2
3250 n = p
3250 n = p
3251 i += 1
3251 i += 1
3252
3252
3253 r.append(l)
3253 r.append(l)
3254
3254
3255 return r
3255 return r
3256
3256
3257 def checkpush(self, pushop):
3257 def checkpush(self, pushop):
3258 """Extensions can override this function if additional checks have
3258 """Extensions can override this function if additional checks have
3259 to be performed before pushing, or call it if they override push
3259 to be performed before pushing, or call it if they override push
3260 command.
3260 command.
3261 """
3261 """
3262
3262
3263 @unfilteredpropertycache
3263 @unfilteredpropertycache
3264 def prepushoutgoinghooks(self):
3264 def prepushoutgoinghooks(self):
3265 """Return util.hooks consists of a pushop with repo, remote, outgoing
3265 """Return util.hooks consists of a pushop with repo, remote, outgoing
3266 methods, which are called before pushing changesets.
3266 methods, which are called before pushing changesets.
3267 """
3267 """
3268 return util.hooks()
3268 return util.hooks()
3269
3269
3270 def pushkey(self, namespace, key, old, new):
3270 def pushkey(self, namespace, key, old, new):
3271 try:
3271 try:
3272 tr = self.currenttransaction()
3272 tr = self.currenttransaction()
3273 hookargs = {}
3273 hookargs = {}
3274 if tr is not None:
3274 if tr is not None:
3275 hookargs.update(tr.hookargs)
3275 hookargs.update(tr.hookargs)
3276 hookargs = pycompat.strkwargs(hookargs)
3276 hookargs = pycompat.strkwargs(hookargs)
3277 hookargs['namespace'] = namespace
3277 hookargs['namespace'] = namespace
3278 hookargs['key'] = key
3278 hookargs['key'] = key
3279 hookargs['old'] = old
3279 hookargs['old'] = old
3280 hookargs['new'] = new
3280 hookargs['new'] = new
3281 self.hook(b'prepushkey', throw=True, **hookargs)
3281 self.hook(b'prepushkey', throw=True, **hookargs)
3282 except error.HookAbort as exc:
3282 except error.HookAbort as exc:
3283 self.ui.write_err(_(b"pushkey-abort: %s\n") % exc)
3283 self.ui.write_err(_(b"pushkey-abort: %s\n") % exc)
3284 if exc.hint:
3284 if exc.hint:
3285 self.ui.write_err(_(b"(%s)\n") % exc.hint)
3285 self.ui.write_err(_(b"(%s)\n") % exc.hint)
3286 return False
3286 return False
3287 self.ui.debug(b'pushing key for "%s:%s"\n' % (namespace, key))
3287 self.ui.debug(b'pushing key for "%s:%s"\n' % (namespace, key))
3288 ret = pushkey.push(self, namespace, key, old, new)
3288 ret = pushkey.push(self, namespace, key, old, new)
3289
3289
3290 def runhook(unused_success):
3290 def runhook(unused_success):
3291 self.hook(
3291 self.hook(
3292 b'pushkey',
3292 b'pushkey',
3293 namespace=namespace,
3293 namespace=namespace,
3294 key=key,
3294 key=key,
3295 old=old,
3295 old=old,
3296 new=new,
3296 new=new,
3297 ret=ret,
3297 ret=ret,
3298 )
3298 )
3299
3299
3300 self._afterlock(runhook)
3300 self._afterlock(runhook)
3301 return ret
3301 return ret
3302
3302
3303 def listkeys(self, namespace):
3303 def listkeys(self, namespace):
3304 self.hook(b'prelistkeys', throw=True, namespace=namespace)
3304 self.hook(b'prelistkeys', throw=True, namespace=namespace)
3305 self.ui.debug(b'listing keys for "%s"\n' % namespace)
3305 self.ui.debug(b'listing keys for "%s"\n' % namespace)
3306 values = pushkey.list(self, namespace)
3306 values = pushkey.list(self, namespace)
3307 self.hook(b'listkeys', namespace=namespace, values=values)
3307 self.hook(b'listkeys', namespace=namespace, values=values)
3308 return values
3308 return values
3309
3309
3310 def debugwireargs(self, one, two, three=None, four=None, five=None):
3310 def debugwireargs(self, one, two, three=None, four=None, five=None):
3311 '''used to test argument passing over the wire'''
3311 '''used to test argument passing over the wire'''
3312 return b"%s %s %s %s %s" % (
3312 return b"%s %s %s %s %s" % (
3313 one,
3313 one,
3314 two,
3314 two,
3315 pycompat.bytestr(three),
3315 pycompat.bytestr(three),
3316 pycompat.bytestr(four),
3316 pycompat.bytestr(four),
3317 pycompat.bytestr(five),
3317 pycompat.bytestr(five),
3318 )
3318 )
3319
3319
3320 def savecommitmessage(self, text):
3320 def savecommitmessage(self, text):
3321 fp = self.vfs(b'last-message.txt', b'wb')
3321 fp = self.vfs(b'last-message.txt', b'wb')
3322 try:
3322 try:
3323 fp.write(text)
3323 fp.write(text)
3324 finally:
3324 finally:
3325 fp.close()
3325 fp.close()
3326 return self.pathto(fp.name[len(self.root) + 1 :])
3326 return self.pathto(fp.name[len(self.root) + 1 :])
3327
3327
3328
3328
3329 # used to avoid circular references so destructors work
3329 # used to avoid circular references so destructors work
3330 def aftertrans(files):
3330 def aftertrans(files):
3331 renamefiles = [tuple(t) for t in files]
3331 renamefiles = [tuple(t) for t in files]
3332
3332
3333 def a():
3333 def a():
3334 for vfs, src, dest in renamefiles:
3334 for vfs, src, dest in renamefiles:
3335 # if src and dest refer to a same file, vfs.rename is a no-op,
3335 # if src and dest refer to a same file, vfs.rename is a no-op,
3336 # leaving both src and dest on disk. delete dest to make sure
3336 # leaving both src and dest on disk. delete dest to make sure
3337 # the rename couldn't be such a no-op.
3337 # the rename couldn't be such a no-op.
3338 vfs.tryunlink(dest)
3338 vfs.tryunlink(dest)
3339 try:
3339 try:
3340 vfs.rename(src, dest)
3340 vfs.rename(src, dest)
3341 except OSError: # journal file does not yet exist
3341 except OSError: # journal file does not yet exist
3342 pass
3342 pass
3343
3343
3344 return a
3344 return a
3345
3345
3346
3346
3347 def undoname(fn):
3347 def undoname(fn):
3348 base, name = os.path.split(fn)
3348 base, name = os.path.split(fn)
3349 assert name.startswith(b'journal')
3349 assert name.startswith(b'journal')
3350 return os.path.join(base, name.replace(b'journal', b'undo', 1))
3350 return os.path.join(base, name.replace(b'journal', b'undo', 1))
3351
3351
3352
3352
3353 def instance(ui, path, create, intents=None, createopts=None):
3353 def instance(ui, path, create, intents=None, createopts=None):
3354 localpath = util.urllocalpath(path)
3354 localpath = util.urllocalpath(path)
3355 if create:
3355 if create:
3356 createrepository(ui, localpath, createopts=createopts)
3356 createrepository(ui, localpath, createopts=createopts)
3357
3357
3358 return makelocalrepository(ui, localpath, intents=intents)
3358 return makelocalrepository(ui, localpath, intents=intents)
3359
3359
3360
3360
3361 def islocal(path):
3361 def islocal(path):
3362 return True
3362 return True
3363
3363
3364
3364
3365 def defaultcreateopts(ui, createopts=None):
3365 def defaultcreateopts(ui, createopts=None):
3366 """Populate the default creation options for a repository.
3366 """Populate the default creation options for a repository.
3367
3367
3368 A dictionary of explicitly requested creation options can be passed
3368 A dictionary of explicitly requested creation options can be passed
3369 in. Missing keys will be populated.
3369 in. Missing keys will be populated.
3370 """
3370 """
3371 createopts = dict(createopts or {})
3371 createopts = dict(createopts or {})
3372
3372
3373 if b'backend' not in createopts:
3373 if b'backend' not in createopts:
3374 # experimental config: storage.new-repo-backend
3374 # experimental config: storage.new-repo-backend
3375 createopts[b'backend'] = ui.config(b'storage', b'new-repo-backend')
3375 createopts[b'backend'] = ui.config(b'storage', b'new-repo-backend')
3376
3376
3377 return createopts
3377 return createopts
3378
3378
3379
3379
3380 def newreporequirements(ui, createopts):
3380 def newreporequirements(ui, createopts):
3381 """Determine the set of requirements for a new local repository.
3381 """Determine the set of requirements for a new local repository.
3382
3382
3383 Extensions can wrap this function to specify custom requirements for
3383 Extensions can wrap this function to specify custom requirements for
3384 new repositories.
3384 new repositories.
3385 """
3385 """
3386 # If the repo is being created from a shared repository, we copy
3386 # If the repo is being created from a shared repository, we copy
3387 # its requirements.
3387 # its requirements.
3388 if b'sharedrepo' in createopts:
3388 if b'sharedrepo' in createopts:
3389 requirements = set(createopts[b'sharedrepo'].requirements)
3389 requirements = set(createopts[b'sharedrepo'].requirements)
3390 if createopts.get(b'sharedrelative'):
3390 if createopts.get(b'sharedrelative'):
3391 requirements.add(requirementsmod.RELATIVE_SHARED_REQUIREMENT)
3391 requirements.add(requirementsmod.RELATIVE_SHARED_REQUIREMENT)
3392 else:
3392 else:
3393 requirements.add(requirementsmod.SHARED_REQUIREMENT)
3393 requirements.add(requirementsmod.SHARED_REQUIREMENT)
3394
3394
3395 return requirements
3395 return requirements
3396
3396
3397 if b'backend' not in createopts:
3397 if b'backend' not in createopts:
3398 raise error.ProgrammingError(
3398 raise error.ProgrammingError(
3399 b'backend key not present in createopts; '
3399 b'backend key not present in createopts; '
3400 b'was defaultcreateopts() called?'
3400 b'was defaultcreateopts() called?'
3401 )
3401 )
3402
3402
3403 if createopts[b'backend'] != b'revlogv1':
3403 if createopts[b'backend'] != b'revlogv1':
3404 raise error.Abort(
3404 raise error.Abort(
3405 _(
3405 _(
3406 b'unable to determine repository requirements for '
3406 b'unable to determine repository requirements for '
3407 b'storage backend: %s'
3407 b'storage backend: %s'
3408 )
3408 )
3409 % createopts[b'backend']
3409 % createopts[b'backend']
3410 )
3410 )
3411
3411
3412 requirements = {requirementsmod.REVLOGV1_REQUIREMENT}
3412 requirements = {requirementsmod.REVLOGV1_REQUIREMENT}
3413 if ui.configbool(b'format', b'usestore'):
3413 if ui.configbool(b'format', b'usestore'):
3414 requirements.add(requirementsmod.STORE_REQUIREMENT)
3414 requirements.add(requirementsmod.STORE_REQUIREMENT)
3415 if ui.configbool(b'format', b'usefncache'):
3415 if ui.configbool(b'format', b'usefncache'):
3416 requirements.add(requirementsmod.FNCACHE_REQUIREMENT)
3416 requirements.add(requirementsmod.FNCACHE_REQUIREMENT)
3417 if ui.configbool(b'format', b'dotencode'):
3417 if ui.configbool(b'format', b'dotencode'):
3418 requirements.add(requirementsmod.DOTENCODE_REQUIREMENT)
3418 requirements.add(requirementsmod.DOTENCODE_REQUIREMENT)
3419
3419
3420 compengines = ui.configlist(b'format', b'revlog-compression')
3420 compengines = ui.configlist(b'format', b'revlog-compression')
3421 for compengine in compengines:
3421 for compengine in compengines:
3422 if compengine in util.compengines:
3422 if compengine in util.compengines:
3423 break
3423 break
3424 else:
3424 else:
3425 raise error.Abort(
3425 raise error.Abort(
3426 _(
3426 _(
3427 b'compression engines %s defined by '
3427 b'compression engines %s defined by '
3428 b'format.revlog-compression not available'
3428 b'format.revlog-compression not available'
3429 )
3429 )
3430 % b', '.join(b'"%s"' % e for e in compengines),
3430 % b', '.join(b'"%s"' % e for e in compengines),
3431 hint=_(
3431 hint=_(
3432 b'run "hg debuginstall" to list available '
3432 b'run "hg debuginstall" to list available '
3433 b'compression engines'
3433 b'compression engines'
3434 ),
3434 ),
3435 )
3435 )
3436
3436
3437 # zlib is the historical default and doesn't need an explicit requirement.
3437 # zlib is the historical default and doesn't need an explicit requirement.
3438 if compengine == b'zstd':
3438 if compengine == b'zstd':
3439 requirements.add(b'revlog-compression-zstd')
3439 requirements.add(b'revlog-compression-zstd')
3440 elif compengine != b'zlib':
3440 elif compengine != b'zlib':
3441 requirements.add(b'exp-compression-%s' % compengine)
3441 requirements.add(b'exp-compression-%s' % compengine)
3442
3442
3443 if scmutil.gdinitconfig(ui):
3443 if scmutil.gdinitconfig(ui):
3444 requirements.add(requirementsmod.GENERALDELTA_REQUIREMENT)
3444 requirements.add(requirementsmod.GENERALDELTA_REQUIREMENT)
3445 if ui.configbool(b'format', b'sparse-revlog'):
3445 if ui.configbool(b'format', b'sparse-revlog'):
3446 requirements.add(requirementsmod.SPARSEREVLOG_REQUIREMENT)
3446 requirements.add(requirementsmod.SPARSEREVLOG_REQUIREMENT)
3447
3447
3448 # experimental config: format.exp-use-side-data
3448 # experimental config: format.exp-use-side-data
3449 if ui.configbool(b'format', b'exp-use-side-data'):
3449 if ui.configbool(b'format', b'exp-use-side-data'):
3450 requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
3450 requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
3451 # experimental config: format.exp-use-copies-side-data-changeset
3451 # experimental config: format.exp-use-copies-side-data-changeset
3452 if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
3452 if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
3453 requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
3453 requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
3454 requirements.add(requirementsmod.COPIESSDC_REQUIREMENT)
3454 requirements.add(requirementsmod.COPIESSDC_REQUIREMENT)
3455 if ui.configbool(b'experimental', b'treemanifest'):
3455 if ui.configbool(b'experimental', b'treemanifest'):
3456 requirements.add(requirementsmod.TREEMANIFEST_REQUIREMENT)
3456 requirements.add(requirementsmod.TREEMANIFEST_REQUIREMENT)
3457
3457
3458 revlogv2 = ui.config(b'experimental', b'revlogv2')
3458 revlogv2 = ui.config(b'experimental', b'revlogv2')
3459 if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
3459 if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
3460 requirements.remove(requirementsmod.REVLOGV1_REQUIREMENT)
3460 requirements.remove(requirementsmod.REVLOGV1_REQUIREMENT)
3461 # generaldelta is implied by revlogv2.
3461 # generaldelta is implied by revlogv2.
3462 requirements.discard(requirementsmod.GENERALDELTA_REQUIREMENT)
3462 requirements.discard(requirementsmod.GENERALDELTA_REQUIREMENT)
3463 requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
3463 requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
3464 # experimental config: format.internal-phase
3464 # experimental config: format.internal-phase
3465 if ui.configbool(b'format', b'internal-phase'):
3465 if ui.configbool(b'format', b'internal-phase'):
3466 requirements.add(requirementsmod.INTERNAL_PHASE_REQUIREMENT)
3466 requirements.add(requirementsmod.INTERNAL_PHASE_REQUIREMENT)
3467
3467
3468 if createopts.get(b'narrowfiles'):
3468 if createopts.get(b'narrowfiles'):
3469 requirements.add(requirementsmod.NARROW_REQUIREMENT)
3469 requirements.add(requirementsmod.NARROW_REQUIREMENT)
3470
3470
3471 if createopts.get(b'lfs'):
3471 if createopts.get(b'lfs'):
3472 requirements.add(b'lfs')
3472 requirements.add(b'lfs')
3473
3473
3474 if ui.configbool(b'format', b'bookmarks-in-store'):
3474 if ui.configbool(b'format', b'bookmarks-in-store'):
3475 requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
3475 requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
3476
3476
3477 if ui.configbool(b'format', b'use-persistent-nodemap'):
3477 if ui.configbool(b'format', b'use-persistent-nodemap'):
3478 requirements.add(requirementsmod.NODEMAP_REQUIREMENT)
3478 requirements.add(requirementsmod.NODEMAP_REQUIREMENT)
3479
3479
3480 # if share-safe is enabled, let's create the new repository with the new
3480 # if share-safe is enabled, let's create the new repository with the new
3481 # requirement
3481 # requirement
3482 if ui.configbool(b'format', b'use-share-safe'):
3482 if ui.configbool(b'format', b'use-share-safe'):
3483 requirements.add(requirementsmod.SHARESAFE_REQUIREMENT)
3483 requirements.add(requirementsmod.SHARESAFE_REQUIREMENT)
3484
3484
3485 return requirements
3485 return requirements
3486
3486
3487
3487
3488 def checkrequirementscompat(ui, requirements):
3488 def checkrequirementscompat(ui, requirements):
3489 """Checks compatibility of repository requirements enabled and disabled.
3489 """Checks compatibility of repository requirements enabled and disabled.
3490
3490
3491 Returns a set of requirements which needs to be dropped because dependend
3491 Returns a set of requirements which needs to be dropped because dependend
3492 requirements are not enabled. Also warns users about it"""
3492 requirements are not enabled. Also warns users about it"""
3493
3493
3494 dropped = set()
3494 dropped = set()
3495
3495
3496 if requirementsmod.STORE_REQUIREMENT not in requirements:
3496 if requirementsmod.STORE_REQUIREMENT not in requirements:
3497 if bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT in requirements:
3497 if bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT in requirements:
3498 ui.warn(
3498 ui.warn(
3499 _(
3499 _(
3500 b'ignoring enabled \'format.bookmarks-in-store\' config '
3500 b'ignoring enabled \'format.bookmarks-in-store\' config '
3501 b'beacuse it is incompatible with disabled '
3501 b'beacuse it is incompatible with disabled '
3502 b'\'format.usestore\' config\n'
3502 b'\'format.usestore\' config\n'
3503 )
3503 )
3504 )
3504 )
3505 dropped.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
3505 dropped.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
3506
3506
3507 if (
3507 if (
3508 requirementsmod.SHARED_REQUIREMENT in requirements
3508 requirementsmod.SHARED_REQUIREMENT in requirements
3509 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
3509 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
3510 ):
3510 ):
3511 raise error.Abort(
3511 raise error.Abort(
3512 _(
3512 _(
3513 b"cannot create shared repository as source was created"
3513 b"cannot create shared repository as source was created"
3514 b" with 'format.usestore' config disabled"
3514 b" with 'format.usestore' config disabled"
3515 )
3515 )
3516 )
3516 )
3517
3517
3518 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
3518 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
3519 ui.warn(
3519 ui.warn(
3520 _(
3520 _(
3521 b"ignoring enabled 'format.use-share-safe' config because "
3521 b"ignoring enabled 'format.use-share-safe' config because "
3522 b"it is incompatible with disabled 'format.usestore'"
3522 b"it is incompatible with disabled 'format.usestore'"
3523 b" config\n"
3523 b" config\n"
3524 )
3524 )
3525 )
3525 )
3526 dropped.add(requirementsmod.SHARESAFE_REQUIREMENT)
3526 dropped.add(requirementsmod.SHARESAFE_REQUIREMENT)
3527
3527
3528 return dropped
3528 return dropped
3529
3529
3530
3530
3531 def filterknowncreateopts(ui, createopts):
3531 def filterknowncreateopts(ui, createopts):
3532 """Filters a dict of repo creation options against options that are known.
3532 """Filters a dict of repo creation options against options that are known.
3533
3533
3534 Receives a dict of repo creation options and returns a dict of those
3534 Receives a dict of repo creation options and returns a dict of those
3535 options that we don't know how to handle.
3535 options that we don't know how to handle.
3536
3536
3537 This function is called as part of repository creation. If the
3537 This function is called as part of repository creation. If the
3538 returned dict contains any items, repository creation will not
3538 returned dict contains any items, repository creation will not
3539 be allowed, as it means there was a request to create a repository
3539 be allowed, as it means there was a request to create a repository
3540 with options not recognized by loaded code.
3540 with options not recognized by loaded code.
3541
3541
3542 Extensions can wrap this function to filter out creation options
3542 Extensions can wrap this function to filter out creation options
3543 they know how to handle.
3543 they know how to handle.
3544 """
3544 """
3545 known = {
3545 known = {
3546 b'backend',
3546 b'backend',
3547 b'lfs',
3547 b'lfs',
3548 b'narrowfiles',
3548 b'narrowfiles',
3549 b'sharedrepo',
3549 b'sharedrepo',
3550 b'sharedrelative',
3550 b'sharedrelative',
3551 b'shareditems',
3551 b'shareditems',
3552 b'shallowfilestore',
3552 b'shallowfilestore',
3553 }
3553 }
3554
3554
3555 return {k: v for k, v in createopts.items() if k not in known}
3555 return {k: v for k, v in createopts.items() if k not in known}
3556
3556
3557
3557
3558 def createrepository(ui, path, createopts=None):
3558 def createrepository(ui, path, createopts=None):
3559 """Create a new repository in a vfs.
3559 """Create a new repository in a vfs.
3560
3560
3561 ``path`` path to the new repo's working directory.
3561 ``path`` path to the new repo's working directory.
3562 ``createopts`` options for the new repository.
3562 ``createopts`` options for the new repository.
3563
3563
3564 The following keys for ``createopts`` are recognized:
3564 The following keys for ``createopts`` are recognized:
3565
3565
3566 backend
3566 backend
3567 The storage backend to use.
3567 The storage backend to use.
3568 lfs
3568 lfs
3569 Repository will be created with ``lfs`` requirement. The lfs extension
3569 Repository will be created with ``lfs`` requirement. The lfs extension
3570 will automatically be loaded when the repository is accessed.
3570 will automatically be loaded when the repository is accessed.
3571 narrowfiles
3571 narrowfiles
3572 Set up repository to support narrow file storage.
3572 Set up repository to support narrow file storage.
3573 sharedrepo
3573 sharedrepo
3574 Repository object from which storage should be shared.
3574 Repository object from which storage should be shared.
3575 sharedrelative
3575 sharedrelative
3576 Boolean indicating if the path to the shared repo should be
3576 Boolean indicating if the path to the shared repo should be
3577 stored as relative. By default, the pointer to the "parent" repo
3577 stored as relative. By default, the pointer to the "parent" repo
3578 is stored as an absolute path.
3578 is stored as an absolute path.
3579 shareditems
3579 shareditems
3580 Set of items to share to the new repository (in addition to storage).
3580 Set of items to share to the new repository (in addition to storage).
3581 shallowfilestore
3581 shallowfilestore
3582 Indicates that storage for files should be shallow (not all ancestor
3582 Indicates that storage for files should be shallow (not all ancestor
3583 revisions are known).
3583 revisions are known).
3584 """
3584 """
3585 createopts = defaultcreateopts(ui, createopts=createopts)
3585 createopts = defaultcreateopts(ui, createopts=createopts)
3586
3586
3587 unknownopts = filterknowncreateopts(ui, createopts)
3587 unknownopts = filterknowncreateopts(ui, createopts)
3588
3588
3589 if not isinstance(unknownopts, dict):
3589 if not isinstance(unknownopts, dict):
3590 raise error.ProgrammingError(
3590 raise error.ProgrammingError(
3591 b'filterknowncreateopts() did not return a dict'
3591 b'filterknowncreateopts() did not return a dict'
3592 )
3592 )
3593
3593
3594 if unknownopts:
3594 if unknownopts:
3595 raise error.Abort(
3595 raise error.Abort(
3596 _(
3596 _(
3597 b'unable to create repository because of unknown '
3597 b'unable to create repository because of unknown '
3598 b'creation option: %s'
3598 b'creation option: %s'
3599 )
3599 )
3600 % b', '.join(sorted(unknownopts)),
3600 % b', '.join(sorted(unknownopts)),
3601 hint=_(b'is a required extension not loaded?'),
3601 hint=_(b'is a required extension not loaded?'),
3602 )
3602 )
3603
3603
3604 requirements = newreporequirements(ui, createopts=createopts)
3604 requirements = newreporequirements(ui, createopts=createopts)
3605 requirements -= checkrequirementscompat(ui, requirements)
3605 requirements -= checkrequirementscompat(ui, requirements)
3606
3606
3607 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
3607 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
3608
3608
3609 hgvfs = vfsmod.vfs(wdirvfs.join(b'.hg'))
3609 hgvfs = vfsmod.vfs(wdirvfs.join(b'.hg'))
3610 if hgvfs.exists():
3610 if hgvfs.exists():
3611 raise error.RepoError(_(b'repository %s already exists') % path)
3611 raise error.RepoError(_(b'repository %s already exists') % path)
3612
3612
3613 if b'sharedrepo' in createopts:
3613 if b'sharedrepo' in createopts:
3614 sharedpath = createopts[b'sharedrepo'].sharedpath
3614 sharedpath = createopts[b'sharedrepo'].sharedpath
3615
3615
3616 if createopts.get(b'sharedrelative'):
3616 if createopts.get(b'sharedrelative'):
3617 try:
3617 try:
3618 sharedpath = os.path.relpath(sharedpath, hgvfs.base)
3618 sharedpath = os.path.relpath(sharedpath, hgvfs.base)
3619 except (IOError, ValueError) as e:
3619 except (IOError, ValueError) as e:
3620 # ValueError is raised on Windows if the drive letters differ
3620 # ValueError is raised on Windows if the drive letters differ
3621 # on each path.
3621 # on each path.
3622 raise error.Abort(
3622 raise error.Abort(
3623 _(b'cannot calculate relative path'),
3623 _(b'cannot calculate relative path'),
3624 hint=stringutil.forcebytestr(e),
3624 hint=stringutil.forcebytestr(e),
3625 )
3625 )
3626
3626
3627 if not wdirvfs.exists():
3627 if not wdirvfs.exists():
3628 wdirvfs.makedirs()
3628 wdirvfs.makedirs()
3629
3629
3630 hgvfs.makedir(notindexed=True)
3630 hgvfs.makedir(notindexed=True)
3631 if b'sharedrepo' not in createopts:
3631 if b'sharedrepo' not in createopts:
3632 hgvfs.mkdir(b'cache')
3632 hgvfs.mkdir(b'cache')
3633 hgvfs.mkdir(b'wcache')
3633 hgvfs.mkdir(b'wcache')
3634
3634
3635 has_store = requirementsmod.STORE_REQUIREMENT in requirements
3635 has_store = requirementsmod.STORE_REQUIREMENT in requirements
3636 if has_store and b'sharedrepo' not in createopts:
3636 if has_store and b'sharedrepo' not in createopts:
3637 hgvfs.mkdir(b'store')
3637 hgvfs.mkdir(b'store')
3638
3638
3639 # We create an invalid changelog outside the store so very old
3639 # We create an invalid changelog outside the store so very old
3640 # Mercurial versions (which didn't know about the requirements
3640 # Mercurial versions (which didn't know about the requirements
3641 # file) encounter an error on reading the changelog. This
3641 # file) encounter an error on reading the changelog. This
3642 # effectively locks out old clients and prevents them from
3642 # effectively locks out old clients and prevents them from
3643 # mucking with a repo in an unknown format.
3643 # mucking with a repo in an unknown format.
3644 #
3644 #
3645 # The revlog header has version 65535, which won't be recognized by
3645 # The revlog header has version 65535, which won't be recognized by
3646 # such old clients.
3646 # such old clients.
3647 hgvfs.append(
3647 hgvfs.append(
3648 b'00changelog.i',
3648 b'00changelog.i',
3649 b'\0\0\xFF\xFF dummy changelog to prevent using the old repo '
3649 b'\0\0\xFF\xFF dummy changelog to prevent using the old repo '
3650 b'layout',
3650 b'layout',
3651 )
3651 )
3652
3652
3653 # Filter the requirements into working copy and store ones
3653 # Filter the requirements into working copy and store ones
3654 wcreq, storereq = scmutil.filterrequirements(requirements)
3654 wcreq, storereq = scmutil.filterrequirements(requirements)
3655 # write working copy ones
3655 # write working copy ones
3656 scmutil.writerequires(hgvfs, wcreq)
3656 scmutil.writerequires(hgvfs, wcreq)
3657 # If there are store requirements and the current repository
3657 # If there are store requirements and the current repository
3658 # is not a shared one, write stored requirements
3658 # is not a shared one, write stored requirements
3659 # For new shared repository, we don't need to write the store
3659 # For new shared repository, we don't need to write the store
3660 # requirements as they are already present in store requires
3660 # requirements as they are already present in store requires
3661 if storereq and b'sharedrepo' not in createopts:
3661 if storereq and b'sharedrepo' not in createopts:
3662 storevfs = vfsmod.vfs(hgvfs.join(b'store'), cacheaudited=True)
3662 storevfs = vfsmod.vfs(hgvfs.join(b'store'), cacheaudited=True)
3663 scmutil.writerequires(storevfs, storereq)
3663 scmutil.writerequires(storevfs, storereq)
3664
3664
3665 # Write out file telling readers where to find the shared store.
3665 # Write out file telling readers where to find the shared store.
3666 if b'sharedrepo' in createopts:
3666 if b'sharedrepo' in createopts:
3667 hgvfs.write(b'sharedpath', sharedpath)
3667 hgvfs.write(b'sharedpath', sharedpath)
3668
3668
3669 if createopts.get(b'shareditems'):
3669 if createopts.get(b'shareditems'):
3670 shared = b'\n'.join(sorted(createopts[b'shareditems'])) + b'\n'
3670 shared = b'\n'.join(sorted(createopts[b'shareditems'])) + b'\n'
3671 hgvfs.write(b'shared', shared)
3671 hgvfs.write(b'shared', shared)
3672
3672
3673
3673
3674 def poisonrepository(repo):
3674 def poisonrepository(repo):
3675 """Poison a repository instance so it can no longer be used."""
3675 """Poison a repository instance so it can no longer be used."""
3676 # Perform any cleanup on the instance.
3676 # Perform any cleanup on the instance.
3677 repo.close()
3677 repo.close()
3678
3678
3679 # Our strategy is to replace the type of the object with one that
3679 # Our strategy is to replace the type of the object with one that
3680 # has all attribute lookups result in error.
3680 # has all attribute lookups result in error.
3681 #
3681 #
3682 # But we have to allow the close() method because some constructors
3682 # But we have to allow the close() method because some constructors
3683 # of repos call close() on repo references.
3683 # of repos call close() on repo references.
3684 class poisonedrepository(object):
3684 class poisonedrepository(object):
3685 def __getattribute__(self, item):
3685 def __getattribute__(self, item):
3686 if item == 'close':
3686 if item == 'close':
3687 return object.__getattribute__(self, item)
3687 return object.__getattribute__(self, item)
3688
3688
3689 raise error.ProgrammingError(
3689 raise error.ProgrammingError(
3690 b'repo instances should not be used after unshare'
3690 b'repo instances should not be used after unshare'
3691 )
3691 )
3692
3692
3693 def close(self):
3693 def close(self):
3694 pass
3694 pass
3695
3695
3696 # We may have a repoview, which intercepts __setattr__. So be sure
3696 # We may have a repoview, which intercepts __setattr__. So be sure
3697 # we operate at the lowest level possible.
3697 # we operate at the lowest level possible.
3698 object.__setattr__(repo, '__class__', poisonedrepository)
3698 object.__setattr__(repo, '__class__', poisonedrepository)
@@ -1,1250 +1,1250 b''
1 # logcmdutil.py - utility for log-like commands
1 # logcmdutil.py - utility for log-like commands
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@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 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import itertools
10 import itertools
11 import os
11 import os
12 import posixpath
12 import posixpath
13
13
14 from .i18n import _
14 from .i18n import _
15 from .node import (
15 from .node import (
16 nullid,
16 nullid,
17 wdirid,
17 wdirid,
18 wdirrev,
18 wdirrev,
19 )
19 )
20
20
21 from .thirdparty import attr
21 from .thirdparty import attr
22
22
23 from . import (
23 from . import (
24 dagop,
24 dagop,
25 error,
25 error,
26 formatter,
26 formatter,
27 graphmod,
27 graphmod,
28 match as matchmod,
28 match as matchmod,
29 mdiff,
29 mdiff,
30 merge,
30 merge,
31 patch,
31 patch,
32 pathutil,
32 pathutil,
33 pycompat,
33 pycompat,
34 revset,
34 revset,
35 revsetlang,
35 revsetlang,
36 scmutil,
36 scmutil,
37 smartset,
37 smartset,
38 templatekw,
38 templatekw,
39 templater,
39 templater,
40 util,
40 util,
41 )
41 )
42 from .utils import (
42 from .utils import (
43 dateutil,
43 dateutil,
44 stringutil,
44 stringutil,
45 )
45 )
46
46
47
47
48 if pycompat.TYPE_CHECKING:
48 if pycompat.TYPE_CHECKING:
49 from typing import (
49 from typing import (
50 Any,
50 Any,
51 Callable,
51 Callable,
52 Dict,
52 Dict,
53 List,
53 List,
54 Optional,
54 Optional,
55 Tuple,
55 Tuple,
56 )
56 )
57
57
58 for t in (Any, Callable, Dict, List, Optional, Tuple):
58 for t in (Any, Callable, Dict, List, Optional, Tuple):
59 assert t
59 assert t
60
60
61
61
62 def getlimit(opts):
62 def getlimit(opts):
63 """get the log limit according to option -l/--limit"""
63 """get the log limit according to option -l/--limit"""
64 limit = opts.get(b'limit')
64 limit = opts.get(b'limit')
65 if limit:
65 if limit:
66 try:
66 try:
67 limit = int(limit)
67 limit = int(limit)
68 except ValueError:
68 except ValueError:
69 raise error.Abort(_(b'limit must be a positive integer'))
69 raise error.Abort(_(b'limit must be a positive integer'))
70 if limit <= 0:
70 if limit <= 0:
71 raise error.Abort(_(b'limit must be positive'))
71 raise error.Abort(_(b'limit must be positive'))
72 else:
72 else:
73 limit = None
73 limit = None
74 return limit
74 return limit
75
75
76
76
77 def diff_parent(ctx):
77 def diff_parent(ctx):
78 """get the context object to use as parent when diffing
78 """get the context object to use as parent when diffing
79
79
80
80
81 If diff.merge is enabled, an overlayworkingctx of the auto-merged parents will be returned.
81 If diff.merge is enabled, an overlayworkingctx of the auto-merged parents will be returned.
82 """
82 """
83 repo = ctx.repo()
83 repo = ctx.repo()
84 if repo.ui.configbool(b"diff", b"merge") and ctx.p2().node() != nullid:
84 if repo.ui.configbool(b"diff", b"merge") and ctx.p2().node() != nullid:
85 # avoid cycle context -> subrepo -> cmdutil -> logcmdutil
85 # avoid cycle context -> subrepo -> cmdutil -> logcmdutil
86 from . import context
86 from . import context
87
87
88 wctx = context.overlayworkingctx(repo)
88 wctx = context.overlayworkingctx(repo)
89 wctx.setbase(ctx.p1())
89 wctx.setbase(ctx.p1())
90 with repo.ui.configoverride(
90 with repo.ui.configoverride(
91 {
91 {
92 (
92 (
93 b"ui",
93 b"ui",
94 b"forcemerge",
94 b"forcemerge",
95 ): b"internal:merge3-lie-about-conflicts",
95 ): b"internal:merge3-lie-about-conflicts",
96 },
96 },
97 b"merge-diff",
97 b"merge-diff",
98 ):
98 ):
99 repo.ui.pushbuffer()
99 repo.ui.pushbuffer()
100 merge.merge(ctx.p2(), wc=wctx)
100 merge.merge(ctx.p2(), wc=wctx)
101 repo.ui.popbuffer()
101 repo.ui.popbuffer()
102 return wctx
102 return wctx
103 else:
103 else:
104 return ctx.p1()
104 return ctx.p1()
105
105
106
106
107 def diffordiffstat(
107 def diffordiffstat(
108 ui,
108 ui,
109 repo,
109 repo,
110 diffopts,
110 diffopts,
111 ctx1,
111 ctx1,
112 ctx2,
112 ctx2,
113 match,
113 match,
114 changes=None,
114 changes=None,
115 stat=False,
115 stat=False,
116 fp=None,
116 fp=None,
117 graphwidth=0,
117 graphwidth=0,
118 prefix=b'',
118 prefix=b'',
119 root=b'',
119 root=b'',
120 listsubrepos=False,
120 listsubrepos=False,
121 hunksfilterfn=None,
121 hunksfilterfn=None,
122 ):
122 ):
123 '''show diff or diffstat.'''
123 '''show diff or diffstat.'''
124 if root:
124 if root:
125 relroot = pathutil.canonpath(repo.root, repo.getcwd(), root)
125 relroot = pathutil.canonpath(repo.root, repo.getcwd(), root)
126 else:
126 else:
127 relroot = b''
127 relroot = b''
128 copysourcematch = None
128 copysourcematch = None
129
129
130 def compose(f, g):
130 def compose(f, g):
131 return lambda x: f(g(x))
131 return lambda x: f(g(x))
132
132
133 def pathfn(f):
133 def pathfn(f):
134 return posixpath.join(prefix, f)
134 return posixpath.join(prefix, f)
135
135
136 if relroot != b'':
136 if relroot != b'':
137 # XXX relative roots currently don't work if the root is within a
137 # XXX relative roots currently don't work if the root is within a
138 # subrepo
138 # subrepo
139 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
139 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
140 uirelroot = uipathfn(pathfn(relroot))
140 uirelroot = uipathfn(pathfn(relroot))
141 relroot += b'/'
141 relroot += b'/'
142 for matchroot in match.files():
142 for matchroot in match.files():
143 if not matchroot.startswith(relroot):
143 if not matchroot.startswith(relroot):
144 ui.warn(
144 ui.warn(
145 _(b'warning: %s not inside relative root %s\n')
145 _(b'warning: %s not inside relative root %s\n')
146 % (uipathfn(pathfn(matchroot)), uirelroot)
146 % (uipathfn(pathfn(matchroot)), uirelroot)
147 )
147 )
148
148
149 relrootmatch = scmutil.match(ctx2, pats=[relroot], default=b'path')
149 relrootmatch = scmutil.match(ctx2, pats=[relroot], default=b'path')
150 match = matchmod.intersectmatchers(match, relrootmatch)
150 match = matchmod.intersectmatchers(match, relrootmatch)
151 copysourcematch = relrootmatch
151 copysourcematch = relrootmatch
152
152
153 checkroot = repo.ui.configbool(
153 checkroot = repo.ui.configbool(
154 b'devel', b'all-warnings'
154 b'devel', b'all-warnings'
155 ) or repo.ui.configbool(b'devel', b'check-relroot')
155 ) or repo.ui.configbool(b'devel', b'check-relroot')
156
156
157 def relrootpathfn(f):
157 def relrootpathfn(f):
158 if checkroot and not f.startswith(relroot):
158 if checkroot and not f.startswith(relroot):
159 raise AssertionError(
159 raise AssertionError(
160 b"file %s doesn't start with relroot %s" % (f, relroot)
160 b"file %s doesn't start with relroot %s" % (f, relroot)
161 )
161 )
162 return f[len(relroot) :]
162 return f[len(relroot) :]
163
163
164 pathfn = compose(relrootpathfn, pathfn)
164 pathfn = compose(relrootpathfn, pathfn)
165
165
166 if stat:
166 if stat:
167 diffopts = diffopts.copy(context=0, noprefix=False)
167 diffopts = diffopts.copy(context=0, noprefix=False)
168 width = 80
168 width = 80
169 if not ui.plain():
169 if not ui.plain():
170 width = ui.termwidth() - graphwidth
170 width = ui.termwidth() - graphwidth
171 # If an explicit --root was given, don't respect ui.relative-paths
171 # If an explicit --root was given, don't respect ui.relative-paths
172 if not relroot:
172 if not relroot:
173 pathfn = compose(scmutil.getuipathfn(repo), pathfn)
173 pathfn = compose(scmutil.getuipathfn(repo), pathfn)
174
174
175 chunks = ctx2.diff(
175 chunks = ctx2.diff(
176 ctx1,
176 ctx1,
177 match,
177 match,
178 changes,
178 changes,
179 opts=diffopts,
179 opts=diffopts,
180 pathfn=pathfn,
180 pathfn=pathfn,
181 copysourcematch=copysourcematch,
181 copysourcematch=copysourcematch,
182 hunksfilterfn=hunksfilterfn,
182 hunksfilterfn=hunksfilterfn,
183 )
183 )
184
184
185 if fp is not None or ui.canwritewithoutlabels():
185 if fp is not None or ui.canwritewithoutlabels():
186 out = fp or ui
186 out = fp or ui
187 if stat:
187 if stat:
188 chunks = [patch.diffstat(util.iterlines(chunks), width=width)]
188 chunks = [patch.diffstat(util.iterlines(chunks), width=width)]
189 for chunk in util.filechunkiter(util.chunkbuffer(chunks)):
189 for chunk in util.filechunkiter(util.chunkbuffer(chunks)):
190 out.write(chunk)
190 out.write(chunk)
191 else:
191 else:
192 if stat:
192 if stat:
193 chunks = patch.diffstatui(util.iterlines(chunks), width=width)
193 chunks = patch.diffstatui(util.iterlines(chunks), width=width)
194 else:
194 else:
195 chunks = patch.difflabel(
195 chunks = patch.difflabel(
196 lambda chunks, **kwargs: chunks, chunks, opts=diffopts
196 lambda chunks, **kwargs: chunks, chunks, opts=diffopts
197 )
197 )
198 if ui.canbatchlabeledwrites():
198 if ui.canbatchlabeledwrites():
199
199
200 def gen():
200 def gen():
201 for chunk, label in chunks:
201 for chunk, label in chunks:
202 yield ui.label(chunk, label=label)
202 yield ui.label(chunk, label=label)
203
203
204 for chunk in util.filechunkiter(util.chunkbuffer(gen())):
204 for chunk in util.filechunkiter(util.chunkbuffer(gen())):
205 ui.write(chunk)
205 ui.write(chunk)
206 else:
206 else:
207 for chunk, label in chunks:
207 for chunk, label in chunks:
208 ui.write(chunk, label=label)
208 ui.write(chunk, label=label)
209
209
210 node2 = ctx2.node()
210 node2 = ctx2.node()
211 for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
211 for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
212 tempnode2 = node2
212 tempnode2 = node2
213 try:
213 try:
214 if node2 is not None:
214 if node2 is not None:
215 tempnode2 = ctx2.substate[subpath][1]
215 tempnode2 = ctx2.substate[subpath][1]
216 except KeyError:
216 except KeyError:
217 # A subrepo that existed in node1 was deleted between node1 and
217 # A subrepo that existed in node1 was deleted between node1 and
218 # node2 (inclusive). Thus, ctx2's substate won't contain that
218 # node2 (inclusive). Thus, ctx2's substate won't contain that
219 # subpath. The best we can do is to ignore it.
219 # subpath. The best we can do is to ignore it.
220 tempnode2 = None
220 tempnode2 = None
221 submatch = matchmod.subdirmatcher(subpath, match)
221 submatch = matchmod.subdirmatcher(subpath, match)
222 subprefix = repo.wvfs.reljoin(prefix, subpath)
222 subprefix = repo.wvfs.reljoin(prefix, subpath)
223 if listsubrepos or match.exact(subpath) or any(submatch.files()):
223 if listsubrepos or match.exact(subpath) or any(submatch.files()):
224 sub.diff(
224 sub.diff(
225 ui,
225 ui,
226 diffopts,
226 diffopts,
227 tempnode2,
227 tempnode2,
228 submatch,
228 submatch,
229 changes=changes,
229 changes=changes,
230 stat=stat,
230 stat=stat,
231 fp=fp,
231 fp=fp,
232 prefix=subprefix,
232 prefix=subprefix,
233 )
233 )
234
234
235
235
236 class changesetdiffer(object):
236 class changesetdiffer(object):
237 """Generate diff of changeset with pre-configured filtering functions"""
237 """Generate diff of changeset with pre-configured filtering functions"""
238
238
239 def _makefilematcher(self, ctx):
239 def _makefilematcher(self, ctx):
240 return scmutil.matchall(ctx.repo())
240 return scmutil.matchall(ctx.repo())
241
241
242 def _makehunksfilter(self, ctx):
242 def _makehunksfilter(self, ctx):
243 return None
243 return None
244
244
245 def showdiff(self, ui, ctx, diffopts, graphwidth=0, stat=False):
245 def showdiff(self, ui, ctx, diffopts, graphwidth=0, stat=False):
246 diffordiffstat(
246 diffordiffstat(
247 ui,
247 ui,
248 ctx.repo(),
248 ctx.repo(),
249 diffopts,
249 diffopts,
250 diff_parent(ctx),
250 diff_parent(ctx),
251 ctx,
251 ctx,
252 match=self._makefilematcher(ctx),
252 match=self._makefilematcher(ctx),
253 stat=stat,
253 stat=stat,
254 graphwidth=graphwidth,
254 graphwidth=graphwidth,
255 hunksfilterfn=self._makehunksfilter(ctx),
255 hunksfilterfn=self._makehunksfilter(ctx),
256 )
256 )
257
257
258
258
259 def changesetlabels(ctx):
259 def changesetlabels(ctx):
260 labels = [b'log.changeset', b'changeset.%s' % ctx.phasestr()]
260 labels = [b'log.changeset', b'changeset.%s' % ctx.phasestr()]
261 if ctx.obsolete():
261 if ctx.obsolete():
262 labels.append(b'changeset.obsolete')
262 labels.append(b'changeset.obsolete')
263 if ctx.isunstable():
263 if ctx.isunstable():
264 labels.append(b'changeset.unstable')
264 labels.append(b'changeset.unstable')
265 for instability in ctx.instabilities():
265 for instability in ctx.instabilities():
266 labels.append(b'instability.%s' % instability)
266 labels.append(b'instability.%s' % instability)
267 return b' '.join(labels)
267 return b' '.join(labels)
268
268
269
269
270 class changesetprinter(object):
270 class changesetprinter(object):
271 '''show changeset information when templating not requested.'''
271 '''show changeset information when templating not requested.'''
272
272
273 def __init__(self, ui, repo, differ=None, diffopts=None, buffered=False):
273 def __init__(self, ui, repo, differ=None, diffopts=None, buffered=False):
274 self.ui = ui
274 self.ui = ui
275 self.repo = repo
275 self.repo = repo
276 self.buffered = buffered
276 self.buffered = buffered
277 self._differ = differ or changesetdiffer()
277 self._differ = differ or changesetdiffer()
278 self._diffopts = patch.diffallopts(ui, diffopts)
278 self._diffopts = patch.diffallopts(ui, diffopts)
279 self._includestat = diffopts and diffopts.get(b'stat')
279 self._includestat = diffopts and diffopts.get(b'stat')
280 self._includediff = diffopts and diffopts.get(b'patch')
280 self._includediff = diffopts and diffopts.get(b'patch')
281 self.header = {}
281 self.header = {}
282 self.hunk = {}
282 self.hunk = {}
283 self.lastheader = None
283 self.lastheader = None
284 self.footer = None
284 self.footer = None
285 self._columns = templatekw.getlogcolumns()
285 self._columns = templatekw.getlogcolumns()
286
286
287 def flush(self, ctx):
287 def flush(self, ctx):
288 rev = ctx.rev()
288 rev = ctx.rev()
289 if rev in self.header:
289 if rev in self.header:
290 h = self.header[rev]
290 h = self.header[rev]
291 if h != self.lastheader:
291 if h != self.lastheader:
292 self.lastheader = h
292 self.lastheader = h
293 self.ui.write(h)
293 self.ui.write(h)
294 del self.header[rev]
294 del self.header[rev]
295 if rev in self.hunk:
295 if rev in self.hunk:
296 self.ui.write(self.hunk[rev])
296 self.ui.write(self.hunk[rev])
297 del self.hunk[rev]
297 del self.hunk[rev]
298
298
299 def close(self):
299 def close(self):
300 if self.footer:
300 if self.footer:
301 self.ui.write(self.footer)
301 self.ui.write(self.footer)
302
302
303 def show(self, ctx, copies=None, **props):
303 def show(self, ctx, copies=None, **props):
304 props = pycompat.byteskwargs(props)
304 props = pycompat.byteskwargs(props)
305 if self.buffered:
305 if self.buffered:
306 self.ui.pushbuffer(labeled=True)
306 self.ui.pushbuffer(labeled=True)
307 self._show(ctx, copies, props)
307 self._show(ctx, copies, props)
308 self.hunk[ctx.rev()] = self.ui.popbuffer()
308 self.hunk[ctx.rev()] = self.ui.popbuffer()
309 else:
309 else:
310 self._show(ctx, copies, props)
310 self._show(ctx, copies, props)
311
311
312 def _show(self, ctx, copies, props):
312 def _show(self, ctx, copies, props):
313 '''show a single changeset or file revision'''
313 '''show a single changeset or file revision'''
314 changenode = ctx.node()
314 changenode = ctx.node()
315 graphwidth = props.get(b'graphwidth', 0)
315 graphwidth = props.get(b'graphwidth', 0)
316
316
317 if self.ui.quiet:
317 if self.ui.quiet:
318 self.ui.write(
318 self.ui.write(
319 b"%s\n" % scmutil.formatchangeid(ctx), label=b'log.node'
319 b"%s\n" % scmutil.formatchangeid(ctx), label=b'log.node'
320 )
320 )
321 return
321 return
322
322
323 columns = self._columns
323 columns = self._columns
324 self.ui.write(
324 self.ui.write(
325 columns[b'changeset'] % scmutil.formatchangeid(ctx),
325 columns[b'changeset'] % scmutil.formatchangeid(ctx),
326 label=changesetlabels(ctx),
326 label=changesetlabels(ctx),
327 )
327 )
328
328
329 # branches are shown first before any other names due to backwards
329 # branches are shown first before any other names due to backwards
330 # compatibility
330 # compatibility
331 branch = ctx.branch()
331 branch = ctx.branch()
332 # don't show the default branch name
332 # don't show the default branch name
333 if branch != b'default':
333 if branch != b'default':
334 self.ui.write(columns[b'branch'] % branch, label=b'log.branch')
334 self.ui.write(columns[b'branch'] % branch, label=b'log.branch')
335
335
336 for nsname, ns in pycompat.iteritems(self.repo.names):
336 for nsname, ns in pycompat.iteritems(self.repo.names):
337 # branches has special logic already handled above, so here we just
337 # branches has special logic already handled above, so here we just
338 # skip it
338 # skip it
339 if nsname == b'branches':
339 if nsname == b'branches':
340 continue
340 continue
341 # we will use the templatename as the color name since those two
341 # we will use the templatename as the color name since those two
342 # should be the same
342 # should be the same
343 for name in ns.names(self.repo, changenode):
343 for name in ns.names(self.repo, changenode):
344 self.ui.write(ns.logfmt % name, label=b'log.%s' % ns.colorname)
344 self.ui.write(ns.logfmt % name, label=b'log.%s' % ns.colorname)
345 if self.ui.debugflag:
345 if self.ui.debugflag:
346 self.ui.write(
346 self.ui.write(
347 columns[b'phase'] % ctx.phasestr(), label=b'log.phase'
347 columns[b'phase'] % ctx.phasestr(), label=b'log.phase'
348 )
348 )
349 for pctx in scmutil.meaningfulparents(self.repo, ctx):
349 for pctx in scmutil.meaningfulparents(self.repo, ctx):
350 label = b'log.parent changeset.%s' % pctx.phasestr()
350 label = b'log.parent changeset.%s' % pctx.phasestr()
351 self.ui.write(
351 self.ui.write(
352 columns[b'parent'] % scmutil.formatchangeid(pctx), label=label
352 columns[b'parent'] % scmutil.formatchangeid(pctx), label=label
353 )
353 )
354
354
355 if self.ui.debugflag:
355 if self.ui.debugflag:
356 mnode = ctx.manifestnode()
356 mnode = ctx.manifestnode()
357 if mnode is None:
357 if mnode is None:
358 mnode = wdirid
358 mnode = wdirid
359 mrev = wdirrev
359 mrev = wdirrev
360 else:
360 else:
361 mrev = self.repo.manifestlog.rev(mnode)
361 mrev = self.repo.manifestlog.rev(mnode)
362 self.ui.write(
362 self.ui.write(
363 columns[b'manifest']
363 columns[b'manifest']
364 % scmutil.formatrevnode(self.ui, mrev, mnode),
364 % scmutil.formatrevnode(self.ui, mrev, mnode),
365 label=b'ui.debug log.manifest',
365 label=b'ui.debug log.manifest',
366 )
366 )
367 self.ui.write(columns[b'user'] % ctx.user(), label=b'log.user')
367 self.ui.write(columns[b'user'] % ctx.user(), label=b'log.user')
368 self.ui.write(
368 self.ui.write(
369 columns[b'date'] % dateutil.datestr(ctx.date()), label=b'log.date'
369 columns[b'date'] % dateutil.datestr(ctx.date()), label=b'log.date'
370 )
370 )
371
371
372 if ctx.isunstable():
372 if ctx.isunstable():
373 instabilities = ctx.instabilities()
373 instabilities = ctx.instabilities()
374 self.ui.write(
374 self.ui.write(
375 columns[b'instability'] % b', '.join(instabilities),
375 columns[b'instability'] % b', '.join(instabilities),
376 label=b'log.instability',
376 label=b'log.instability',
377 )
377 )
378
378
379 elif ctx.obsolete():
379 elif ctx.obsolete():
380 self._showobsfate(ctx)
380 self._showobsfate(ctx)
381
381
382 self._exthook(ctx)
382 self._exthook(ctx)
383
383
384 if self.ui.debugflag:
384 if self.ui.debugflag:
385 files = ctx.p1().status(ctx)
385 files = ctx.p1().status(ctx)
386 for key, value in zip(
386 for key, value in zip(
387 [b'files', b'files+', b'files-'],
387 [b'files', b'files+', b'files-'],
388 [files.modified, files.added, files.removed],
388 [files.modified, files.added, files.removed],
389 ):
389 ):
390 if value:
390 if value:
391 self.ui.write(
391 self.ui.write(
392 columns[key] % b" ".join(value),
392 columns[key] % b" ".join(value),
393 label=b'ui.debug log.files',
393 label=b'ui.debug log.files',
394 )
394 )
395 elif ctx.files() and self.ui.verbose:
395 elif ctx.files() and self.ui.verbose:
396 self.ui.write(
396 self.ui.write(
397 columns[b'files'] % b" ".join(ctx.files()),
397 columns[b'files'] % b" ".join(ctx.files()),
398 label=b'ui.note log.files',
398 label=b'ui.note log.files',
399 )
399 )
400 if copies and self.ui.verbose:
400 if copies and self.ui.verbose:
401 copies = [b'%s (%s)' % c for c in copies]
401 copies = [b'%s (%s)' % c for c in copies]
402 self.ui.write(
402 self.ui.write(
403 columns[b'copies'] % b' '.join(copies),
403 columns[b'copies'] % b' '.join(copies),
404 label=b'ui.note log.copies',
404 label=b'ui.note log.copies',
405 )
405 )
406
406
407 extra = ctx.extra()
407 extra = ctx.extra()
408 if extra and self.ui.debugflag:
408 if extra and self.ui.debugflag:
409 for key, value in sorted(extra.items()):
409 for key, value in sorted(extra.items()):
410 self.ui.write(
410 self.ui.write(
411 columns[b'extra'] % (key, stringutil.escapestr(value)),
411 columns[b'extra'] % (key, stringutil.escapestr(value)),
412 label=b'ui.debug log.extra',
412 label=b'ui.debug log.extra',
413 )
413 )
414
414
415 description = ctx.description().strip()
415 description = ctx.description().strip()
416 if description:
416 if description:
417 if self.ui.verbose:
417 if self.ui.verbose:
418 self.ui.write(
418 self.ui.write(
419 _(b"description:\n"), label=b'ui.note log.description'
419 _(b"description:\n"), label=b'ui.note log.description'
420 )
420 )
421 self.ui.write(description, label=b'ui.note log.description')
421 self.ui.write(description, label=b'ui.note log.description')
422 self.ui.write(b"\n\n")
422 self.ui.write(b"\n\n")
423 else:
423 else:
424 self.ui.write(
424 self.ui.write(
425 columns[b'summary'] % description.splitlines()[0],
425 columns[b'summary'] % description.splitlines()[0],
426 label=b'log.summary',
426 label=b'log.summary',
427 )
427 )
428 self.ui.write(b"\n")
428 self.ui.write(b"\n")
429
429
430 self._showpatch(ctx, graphwidth)
430 self._showpatch(ctx, graphwidth)
431
431
432 def _showobsfate(self, ctx):
432 def _showobsfate(self, ctx):
433 # TODO: do not depend on templater
433 # TODO: do not depend on templater
434 tres = formatter.templateresources(self.repo.ui, self.repo)
434 tres = formatter.templateresources(self.repo.ui, self.repo)
435 t = formatter.maketemplater(
435 t = formatter.maketemplater(
436 self.repo.ui,
436 self.repo.ui,
437 b'{join(obsfate, "\n")}',
437 b'{join(obsfate, "\n")}',
438 defaults=templatekw.keywords,
438 defaults=templatekw.keywords,
439 resources=tres,
439 resources=tres,
440 )
440 )
441 obsfate = t.renderdefault({b'ctx': ctx}).splitlines()
441 obsfate = t.renderdefault({b'ctx': ctx}).splitlines()
442
442
443 if obsfate:
443 if obsfate:
444 for obsfateline in obsfate:
444 for obsfateline in obsfate:
445 self.ui.write(
445 self.ui.write(
446 self._columns[b'obsolete'] % obsfateline,
446 self._columns[b'obsolete'] % obsfateline,
447 label=b'log.obsfate',
447 label=b'log.obsfate',
448 )
448 )
449
449
450 def _exthook(self, ctx):
450 def _exthook(self, ctx):
451 """empty method used by extension as a hook point"""
451 """empty method used by extension as a hook point"""
452
452
453 def _showpatch(self, ctx, graphwidth=0):
453 def _showpatch(self, ctx, graphwidth=0):
454 if self._includestat:
454 if self._includestat:
455 self._differ.showdiff(
455 self._differ.showdiff(
456 self.ui, ctx, self._diffopts, graphwidth, stat=True
456 self.ui, ctx, self._diffopts, graphwidth, stat=True
457 )
457 )
458 if self._includestat and self._includediff:
458 if self._includestat and self._includediff:
459 self.ui.write(b"\n")
459 self.ui.write(b"\n")
460 if self._includediff:
460 if self._includediff:
461 self._differ.showdiff(
461 self._differ.showdiff(
462 self.ui, ctx, self._diffopts, graphwidth, stat=False
462 self.ui, ctx, self._diffopts, graphwidth, stat=False
463 )
463 )
464 if self._includestat or self._includediff:
464 if self._includestat or self._includediff:
465 self.ui.write(b"\n")
465 self.ui.write(b"\n")
466
466
467
467
468 class changesetformatter(changesetprinter):
468 class changesetformatter(changesetprinter):
469 """Format changeset information by generic formatter"""
469 """Format changeset information by generic formatter"""
470
470
471 def __init__(
471 def __init__(
472 self, ui, repo, fm, differ=None, diffopts=None, buffered=False
472 self, ui, repo, fm, differ=None, diffopts=None, buffered=False
473 ):
473 ):
474 changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
474 changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
475 self._diffopts = patch.difffeatureopts(ui, diffopts, git=True)
475 self._diffopts = patch.difffeatureopts(ui, diffopts, git=True)
476 self._fm = fm
476 self._fm = fm
477
477
478 def close(self):
478 def close(self):
479 self._fm.end()
479 self._fm.end()
480
480
481 def _show(self, ctx, copies, props):
481 def _show(self, ctx, copies, props):
482 '''show a single changeset or file revision'''
482 '''show a single changeset or file revision'''
483 fm = self._fm
483 fm = self._fm
484 fm.startitem()
484 fm.startitem()
485 fm.context(ctx=ctx)
485 fm.context(ctx=ctx)
486 fm.data(rev=scmutil.intrev(ctx), node=fm.hexfunc(scmutil.binnode(ctx)))
486 fm.data(rev=scmutil.intrev(ctx), node=fm.hexfunc(scmutil.binnode(ctx)))
487
487
488 datahint = fm.datahint()
488 datahint = fm.datahint()
489 if self.ui.quiet and not datahint:
489 if self.ui.quiet and not datahint:
490 return
490 return
491
491
492 fm.data(
492 fm.data(
493 branch=ctx.branch(),
493 branch=ctx.branch(),
494 phase=ctx.phasestr(),
494 phase=ctx.phasestr(),
495 user=ctx.user(),
495 user=ctx.user(),
496 date=fm.formatdate(ctx.date()),
496 date=fm.formatdate(ctx.date()),
497 desc=ctx.description(),
497 desc=ctx.description(),
498 bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'),
498 bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'),
499 tags=fm.formatlist(ctx.tags(), name=b'tag'),
499 tags=fm.formatlist(ctx.tags(), name=b'tag'),
500 parents=fm.formatlist(
500 parents=fm.formatlist(
501 [fm.hexfunc(c.node()) for c in ctx.parents()], name=b'node'
501 [fm.hexfunc(c.node()) for c in ctx.parents()], name=b'node'
502 ),
502 ),
503 )
503 )
504
504
505 if self.ui.debugflag or b'manifest' in datahint:
505 if self.ui.debugflag or b'manifest' in datahint:
506 fm.data(manifest=fm.hexfunc(ctx.manifestnode() or wdirid))
506 fm.data(manifest=fm.hexfunc(ctx.manifestnode() or wdirid))
507 if self.ui.debugflag or b'extra' in datahint:
507 if self.ui.debugflag or b'extra' in datahint:
508 fm.data(extra=fm.formatdict(ctx.extra()))
508 fm.data(extra=fm.formatdict(ctx.extra()))
509
509
510 if (
510 if (
511 self.ui.debugflag
511 self.ui.debugflag
512 or b'modified' in datahint
512 or b'modified' in datahint
513 or b'added' in datahint
513 or b'added' in datahint
514 or b'removed' in datahint
514 or b'removed' in datahint
515 ):
515 ):
516 files = ctx.p1().status(ctx)
516 files = ctx.p1().status(ctx)
517 fm.data(
517 fm.data(
518 modified=fm.formatlist(files.modified, name=b'file'),
518 modified=fm.formatlist(files.modified, name=b'file'),
519 added=fm.formatlist(files.added, name=b'file'),
519 added=fm.formatlist(files.added, name=b'file'),
520 removed=fm.formatlist(files.removed, name=b'file'),
520 removed=fm.formatlist(files.removed, name=b'file'),
521 )
521 )
522
522
523 verbose = not self.ui.debugflag and self.ui.verbose
523 verbose = not self.ui.debugflag and self.ui.verbose
524 if verbose or b'files' in datahint:
524 if verbose or b'files' in datahint:
525 fm.data(files=fm.formatlist(ctx.files(), name=b'file'))
525 fm.data(files=fm.formatlist(ctx.files(), name=b'file'))
526 if verbose and copies or b'copies' in datahint:
526 if verbose and copies or b'copies' in datahint:
527 fm.data(
527 fm.data(
528 copies=fm.formatdict(copies or {}, key=b'name', value=b'source')
528 copies=fm.formatdict(copies or {}, key=b'name', value=b'source')
529 )
529 )
530
530
531 if self._includestat or b'diffstat' in datahint:
531 if self._includestat or b'diffstat' in datahint:
532 self.ui.pushbuffer()
532 self.ui.pushbuffer()
533 self._differ.showdiff(self.ui, ctx, self._diffopts, stat=True)
533 self._differ.showdiff(self.ui, ctx, self._diffopts, stat=True)
534 fm.data(diffstat=self.ui.popbuffer())
534 fm.data(diffstat=self.ui.popbuffer())
535 if self._includediff or b'diff' in datahint:
535 if self._includediff or b'diff' in datahint:
536 self.ui.pushbuffer()
536 self.ui.pushbuffer()
537 self._differ.showdiff(self.ui, ctx, self._diffopts, stat=False)
537 self._differ.showdiff(self.ui, ctx, self._diffopts, stat=False)
538 fm.data(diff=self.ui.popbuffer())
538 fm.data(diff=self.ui.popbuffer())
539
539
540
540
541 class changesettemplater(changesetprinter):
541 class changesettemplater(changesetprinter):
542 """format changeset information.
542 """format changeset information.
543
543
544 Note: there are a variety of convenience functions to build a
544 Note: there are a variety of convenience functions to build a
545 changesettemplater for common cases. See functions such as:
545 changesettemplater for common cases. See functions such as:
546 maketemplater, changesetdisplayer, buildcommittemplate, or other
546 maketemplater, changesetdisplayer, buildcommittemplate, or other
547 functions that use changesest_templater.
547 functions that use changesest_templater.
548 """
548 """
549
549
550 # Arguments before "buffered" used to be positional. Consider not
550 # Arguments before "buffered" used to be positional. Consider not
551 # adding/removing arguments before "buffered" to not break callers.
551 # adding/removing arguments before "buffered" to not break callers.
552 def __init__(
552 def __init__(
553 self, ui, repo, tmplspec, differ=None, diffopts=None, buffered=False
553 self, ui, repo, tmplspec, differ=None, diffopts=None, buffered=False
554 ):
554 ):
555 changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
555 changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
556 # tres is shared with _graphnodeformatter()
556 # tres is shared with _graphnodeformatter()
557 self._tresources = tres = formatter.templateresources(ui, repo)
557 self._tresources = tres = formatter.templateresources(ui, repo)
558 self.t = formatter.loadtemplater(
558 self.t = formatter.loadtemplater(
559 ui,
559 ui,
560 tmplspec,
560 tmplspec,
561 defaults=templatekw.keywords,
561 defaults=templatekw.keywords,
562 resources=tres,
562 resources=tres,
563 cache=templatekw.defaulttempl,
563 cache=templatekw.defaulttempl,
564 )
564 )
565 self._counter = itertools.count()
565 self._counter = itertools.count()
566
566
567 self._tref = tmplspec.ref
567 self._tref = tmplspec.ref
568 self._parts = {
568 self._parts = {
569 b'header': b'',
569 b'header': b'',
570 b'footer': b'',
570 b'footer': b'',
571 tmplspec.ref: tmplspec.ref,
571 tmplspec.ref: tmplspec.ref,
572 b'docheader': b'',
572 b'docheader': b'',
573 b'docfooter': b'',
573 b'docfooter': b'',
574 b'separator': b'',
574 b'separator': b'',
575 }
575 }
576 if tmplspec.mapfile:
576 if tmplspec.mapfile:
577 # find correct templates for current mode, for backward
577 # find correct templates for current mode, for backward
578 # compatibility with 'log -v/-q/--debug' using a mapfile
578 # compatibility with 'log -v/-q/--debug' using a mapfile
579 tmplmodes = [
579 tmplmodes = [
580 (True, b''),
580 (True, b''),
581 (self.ui.verbose, b'_verbose'),
581 (self.ui.verbose, b'_verbose'),
582 (self.ui.quiet, b'_quiet'),
582 (self.ui.quiet, b'_quiet'),
583 (self.ui.debugflag, b'_debug'),
583 (self.ui.debugflag, b'_debug'),
584 ]
584 ]
585 for mode, postfix in tmplmodes:
585 for mode, postfix in tmplmodes:
586 for t in self._parts:
586 for t in self._parts:
587 cur = t + postfix
587 cur = t + postfix
588 if mode and cur in self.t:
588 if mode and cur in self.t:
589 self._parts[t] = cur
589 self._parts[t] = cur
590 else:
590 else:
591 partnames = [p for p in self._parts.keys() if p != tmplspec.ref]
591 partnames = [p for p in self._parts.keys() if p != tmplspec.ref]
592 m = formatter.templatepartsmap(tmplspec, self.t, partnames)
592 m = formatter.templatepartsmap(tmplspec, self.t, partnames)
593 self._parts.update(m)
593 self._parts.update(m)
594
594
595 if self._parts[b'docheader']:
595 if self._parts[b'docheader']:
596 self.ui.write(self.t.render(self._parts[b'docheader'], {}))
596 self.ui.write(self.t.render(self._parts[b'docheader'], {}))
597
597
598 def close(self):
598 def close(self):
599 if self._parts[b'docfooter']:
599 if self._parts[b'docfooter']:
600 if not self.footer:
600 if not self.footer:
601 self.footer = b""
601 self.footer = b""
602 self.footer += self.t.render(self._parts[b'docfooter'], {})
602 self.footer += self.t.render(self._parts[b'docfooter'], {})
603 return super(changesettemplater, self).close()
603 return super(changesettemplater, self).close()
604
604
605 def _show(self, ctx, copies, props):
605 def _show(self, ctx, copies, props):
606 '''show a single changeset or file revision'''
606 '''show a single changeset or file revision'''
607 props = props.copy()
607 props = props.copy()
608 props[b'ctx'] = ctx
608 props[b'ctx'] = ctx
609 props[b'index'] = index = next(self._counter)
609 props[b'index'] = index = next(self._counter)
610 props[b'revcache'] = {b'copies': copies}
610 props[b'revcache'] = {b'copies': copies}
611 graphwidth = props.get(b'graphwidth', 0)
611 graphwidth = props.get(b'graphwidth', 0)
612
612
613 # write separator, which wouldn't work well with the header part below
613 # write separator, which wouldn't work well with the header part below
614 # since there's inherently a conflict between header (across items) and
614 # since there's inherently a conflict between header (across items) and
615 # separator (per item)
615 # separator (per item)
616 if self._parts[b'separator'] and index > 0:
616 if self._parts[b'separator'] and index > 0:
617 self.ui.write(self.t.render(self._parts[b'separator'], {}))
617 self.ui.write(self.t.render(self._parts[b'separator'], {}))
618
618
619 # write header
619 # write header
620 if self._parts[b'header']:
620 if self._parts[b'header']:
621 h = self.t.render(self._parts[b'header'], props)
621 h = self.t.render(self._parts[b'header'], props)
622 if self.buffered:
622 if self.buffered:
623 self.header[ctx.rev()] = h
623 self.header[ctx.rev()] = h
624 else:
624 else:
625 if self.lastheader != h:
625 if self.lastheader != h:
626 self.lastheader = h
626 self.lastheader = h
627 self.ui.write(h)
627 self.ui.write(h)
628
628
629 # write changeset metadata, then patch if requested
629 # write changeset metadata, then patch if requested
630 key = self._parts[self._tref]
630 key = self._parts[self._tref]
631 self.ui.write(self.t.render(key, props))
631 self.ui.write(self.t.render(key, props))
632 self._exthook(ctx)
632 self._exthook(ctx)
633 self._showpatch(ctx, graphwidth)
633 self._showpatch(ctx, graphwidth)
634
634
635 if self._parts[b'footer']:
635 if self._parts[b'footer']:
636 if not self.footer:
636 if not self.footer:
637 self.footer = self.t.render(self._parts[b'footer'], props)
637 self.footer = self.t.render(self._parts[b'footer'], props)
638
638
639
639
640 def templatespec(tmpl, mapfile):
640 def templatespec(tmpl, mapfile):
641 assert not (tmpl and mapfile)
641 assert not (tmpl and mapfile)
642 if mapfile:
642 if mapfile:
643 return formatter.mapfile_templatespec(b'changeset', mapfile)
643 return formatter.mapfile_templatespec(b'changeset', mapfile)
644 else:
644 else:
645 return formatter.literal_templatespec(tmpl)
645 return formatter.literal_templatespec(tmpl)
646
646
647
647
648 def _lookuptemplate(ui, tmpl, style):
648 def _lookuptemplate(ui, tmpl, style):
649 """Find the template matching the given template spec or style
649 """Find the template matching the given template spec or style
650
650
651 See formatter.lookuptemplate() for details.
651 See formatter.lookuptemplate() for details.
652 """
652 """
653
653
654 # ui settings
654 # ui settings
655 if not tmpl and not style: # template are stronger than style
655 if not tmpl and not style: # template are stronger than style
656 tmpl = ui.config(b'command-templates', b'log')
656 tmpl = ui.config(b'command-templates', b'log')
657 if tmpl:
657 if tmpl:
658 return formatter.literal_templatespec(templater.unquotestring(tmpl))
658 return formatter.literal_templatespec(templater.unquotestring(tmpl))
659 else:
659 else:
660 style = util.expandpath(ui.config(b'ui', b'style'))
660 style = util.expandpath(ui.config(b'ui', b'style'))
661
661
662 if not tmpl and style:
662 if not tmpl and style:
663 mapfile = style
663 mapfile = style
664 fp = None
664 fp = None
665 if not os.path.split(mapfile)[0]:
665 if not os.path.split(mapfile)[0]:
666 (mapname, fp) = templater.try_open_template(
666 (mapname, fp) = templater.try_open_template(
667 b'map-cmdline.' + mapfile
667 b'map-cmdline.' + mapfile
668 ) or templater.try_open_template(mapfile)
668 ) or templater.try_open_template(mapfile)
669 if mapname:
669 if mapname:
670 mapfile = mapname
670 mapfile = mapname
671 return formatter.mapfile_templatespec(b'changeset', mapfile, fp)
671 return formatter.mapfile_templatespec(b'changeset', mapfile, fp)
672
672
673 return formatter.lookuptemplate(ui, b'changeset', tmpl)
673 return formatter.lookuptemplate(ui, b'changeset', tmpl)
674
674
675
675
676 def maketemplater(ui, repo, tmpl, buffered=False):
676 def maketemplater(ui, repo, tmpl, buffered=False):
677 """Create a changesettemplater from a literal template 'tmpl'
677 """Create a changesettemplater from a literal template 'tmpl'
678 byte-string."""
678 byte-string."""
679 spec = formatter.literal_templatespec(tmpl)
679 spec = formatter.literal_templatespec(tmpl)
680 return changesettemplater(ui, repo, spec, buffered=buffered)
680 return changesettemplater(ui, repo, spec, buffered=buffered)
681
681
682
682
683 def changesetdisplayer(ui, repo, opts, differ=None, buffered=False):
683 def changesetdisplayer(ui, repo, opts, differ=None, buffered=False):
684 """show one changeset using template or regular display.
684 """show one changeset using template or regular display.
685
685
686 Display format will be the first non-empty hit of:
686 Display format will be the first non-empty hit of:
687 1. option 'template'
687 1. option 'template'
688 2. option 'style'
688 2. option 'style'
689 3. [command-templates] setting 'log'
689 3. [command-templates] setting 'log'
690 4. [ui] setting 'style'
690 4. [ui] setting 'style'
691 If all of these values are either the unset or the empty string,
691 If all of these values are either the unset or the empty string,
692 regular display via changesetprinter() is done.
692 regular display via changesetprinter() is done.
693 """
693 """
694 postargs = (differ, opts, buffered)
694 postargs = (differ, opts, buffered)
695 spec = _lookuptemplate(ui, opts.get(b'template'), opts.get(b'style'))
695 spec = _lookuptemplate(ui, opts.get(b'template'), opts.get(b'style'))
696
696
697 # machine-readable formats have slightly different keyword set than
697 # machine-readable formats have slightly different keyword set than
698 # plain templates, which are handled by changesetformatter.
698 # plain templates, which are handled by changesetformatter.
699 # note that {b'pickle', b'debug'} can also be added to the list if needed.
699 # note that {b'pickle', b'debug'} can also be added to the list if needed.
700 if spec.ref in {b'cbor', b'json'}:
700 if spec.ref in {b'cbor', b'json'}:
701 fm = ui.formatter(b'log', opts)
701 fm = ui.formatter(b'log', opts)
702 return changesetformatter(ui, repo, fm, *postargs)
702 return changesetformatter(ui, repo, fm, *postargs)
703
703
704 if not spec.ref and not spec.tmpl and not spec.mapfile:
704 if not spec.ref and not spec.tmpl and not spec.mapfile:
705 return changesetprinter(ui, repo, *postargs)
705 return changesetprinter(ui, repo, *postargs)
706
706
707 return changesettemplater(ui, repo, spec, *postargs)
707 return changesettemplater(ui, repo, spec, *postargs)
708
708
709
709
710 @attr.s
710 @attr.s
711 class walkopts(object):
711 class walkopts(object):
712 """Options to configure a set of revisions and file matcher factory
712 """Options to configure a set of revisions and file matcher factory
713 to scan revision/file history
713 to scan revision/file history
714 """
714 """
715
715
716 # raw command-line parameters, which a matcher will be built from
716 # raw command-line parameters, which a matcher will be built from
717 pats = attr.ib() # type: List[bytes]
717 pats = attr.ib() # type: List[bytes]
718 opts = attr.ib() # type: Dict[bytes, Any]
718 opts = attr.ib() # type: Dict[bytes, Any]
719
719
720 # a list of revset expressions to be traversed; if follow, it specifies
720 # a list of revset expressions to be traversed; if follow, it specifies
721 # the start revisions
721 # the start revisions
722 revspec = attr.ib() # type: List[bytes]
722 revspec = attr.ib() # type: List[bytes]
723
723
724 # miscellaneous queries to filter revisions (see "hg help log" for details)
724 # miscellaneous queries to filter revisions (see "hg help log" for details)
725 bookmarks = attr.ib(default=attr.Factory(list)) # type: List[bytes]
725 bookmarks = attr.ib(default=attr.Factory(list)) # type: List[bytes]
726 branches = attr.ib(default=attr.Factory(list)) # type: List[bytes]
726 branches = attr.ib(default=attr.Factory(list)) # type: List[bytes]
727 date = attr.ib(default=None) # type: Optional[bytes]
727 date = attr.ib(default=None) # type: Optional[bytes]
728 keywords = attr.ib(default=attr.Factory(list)) # type: List[bytes]
728 keywords = attr.ib(default=attr.Factory(list)) # type: List[bytes]
729 no_merges = attr.ib(default=False) # type: bool
729 no_merges = attr.ib(default=False) # type: bool
730 only_merges = attr.ib(default=False) # type: bool
730 only_merges = attr.ib(default=False) # type: bool
731 prune_ancestors = attr.ib(default=attr.Factory(list)) # type: List[bytes]
731 prune_ancestors = attr.ib(default=attr.Factory(list)) # type: List[bytes]
732 users = attr.ib(default=attr.Factory(list)) # type: List[bytes]
732 users = attr.ib(default=attr.Factory(list)) # type: List[bytes]
733
733
734 # miscellaneous matcher arguments
734 # miscellaneous matcher arguments
735 include_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes]
735 include_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes]
736 exclude_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes]
736 exclude_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes]
737
737
738 # 0: no follow, 1: follow first, 2: follow both parents
738 # 0: no follow, 1: follow first, 2: follow both parents
739 follow = attr.ib(default=0) # type: int
739 follow = attr.ib(default=0) # type: int
740
740
741 # do not attempt filelog-based traversal, which may be fast but cannot
741 # do not attempt filelog-based traversal, which may be fast but cannot
742 # include revisions where files were removed
742 # include revisions where files were removed
743 force_changelog_traversal = attr.ib(default=False) # type: bool
743 force_changelog_traversal = attr.ib(default=False) # type: bool
744
744
745 # filter revisions by file patterns, which should be disabled only if
745 # filter revisions by file patterns, which should be disabled only if
746 # you want to include revisions where files were unmodified
746 # you want to include revisions where files were unmodified
747 filter_revisions_by_pats = attr.ib(default=True) # type: bool
747 filter_revisions_by_pats = attr.ib(default=True) # type: bool
748
748
749 # sort revisions prior to traversal: 'desc', 'topo', or None
749 # sort revisions prior to traversal: 'desc', 'topo', or None
750 sort_revisions = attr.ib(default=None) # type: Optional[bytes]
750 sort_revisions = attr.ib(default=None) # type: Optional[bytes]
751
751
752 # limit number of changes displayed; None means unlimited
752 # limit number of changes displayed; None means unlimited
753 limit = attr.ib(default=None) # type: Optional[int]
753 limit = attr.ib(default=None) # type: Optional[int]
754
754
755
755
756 def parseopts(ui, pats, opts):
756 def parseopts(ui, pats, opts):
757 # type: (Any, List[bytes], Dict[bytes, Any]) -> walkopts
757 # type: (Any, List[bytes], Dict[bytes, Any]) -> walkopts
758 """Parse log command options into walkopts
758 """Parse log command options into walkopts
759
759
760 The returned walkopts will be passed in to getrevs() or makewalker().
760 The returned walkopts will be passed in to getrevs() or makewalker().
761 """
761 """
762 if opts.get(b'follow_first'):
762 if opts.get(b'follow_first'):
763 follow = 1
763 follow = 1
764 elif opts.get(b'follow'):
764 elif opts.get(b'follow'):
765 follow = 2
765 follow = 2
766 else:
766 else:
767 follow = 0
767 follow = 0
768
768
769 if opts.get(b'graph'):
769 if opts.get(b'graph'):
770 if ui.configbool(b'experimental', b'log.topo'):
770 if ui.configbool(b'experimental', b'log.topo'):
771 sort_revisions = b'topo'
771 sort_revisions = b'topo'
772 else:
772 else:
773 sort_revisions = b'desc'
773 sort_revisions = b'desc'
774 else:
774 else:
775 sort_revisions = None
775 sort_revisions = None
776
776
777 return walkopts(
777 return walkopts(
778 pats=pats,
778 pats=pats,
779 opts=opts,
779 opts=opts,
780 revspec=opts.get(b'rev', []),
780 revspec=opts.get(b'rev', []),
781 bookmarks=opts.get(b'bookmark', []),
781 bookmarks=opts.get(b'bookmark', []),
782 # branch and only_branch are really aliases and must be handled at
782 # branch and only_branch are really aliases and must be handled at
783 # the same time
783 # the same time
784 branches=opts.get(b'branch', []) + opts.get(b'only_branch', []),
784 branches=opts.get(b'branch', []) + opts.get(b'only_branch', []),
785 date=opts.get(b'date'),
785 date=opts.get(b'date'),
786 keywords=opts.get(b'keyword', []),
786 keywords=opts.get(b'keyword', []),
787 no_merges=bool(opts.get(b'no_merges')),
787 no_merges=bool(opts.get(b'no_merges')),
788 only_merges=bool(opts.get(b'only_merges')),
788 only_merges=bool(opts.get(b'only_merges')),
789 prune_ancestors=opts.get(b'prune', []),
789 prune_ancestors=opts.get(b'prune', []),
790 users=opts.get(b'user', []),
790 users=opts.get(b'user', []),
791 include_pats=opts.get(b'include', []),
791 include_pats=opts.get(b'include', []),
792 exclude_pats=opts.get(b'exclude', []),
792 exclude_pats=opts.get(b'exclude', []),
793 follow=follow,
793 follow=follow,
794 force_changelog_traversal=bool(opts.get(b'removed')),
794 force_changelog_traversal=bool(opts.get(b'removed')),
795 sort_revisions=sort_revisions,
795 sort_revisions=sort_revisions,
796 limit=getlimit(opts),
796 limit=getlimit(opts),
797 )
797 )
798
798
799
799
800 def _makematcher(repo, revs, wopts):
800 def _makematcher(repo, revs, wopts):
801 """Build matcher and expanded patterns from log options
801 """Build matcher and expanded patterns from log options
802
802
803 If --follow, revs are the revisions to follow from.
803 If --follow, revs are the revisions to follow from.
804
804
805 Returns (match, pats, slowpath) where
805 Returns (match, pats, slowpath) where
806 - match: a matcher built from the given pats and -I/-X opts
806 - match: a matcher built from the given pats and -I/-X opts
807 - pats: patterns used (globs are expanded on Windows)
807 - pats: patterns used (globs are expanded on Windows)
808 - slowpath: True if patterns aren't as simple as scanning filelogs
808 - slowpath: True if patterns aren't as simple as scanning filelogs
809 """
809 """
810 # pats/include/exclude are passed to match.match() directly in
810 # pats/include/exclude are passed to match.match() directly in
811 # _matchfiles() revset, but a log-like command should build its matcher
811 # _matchfiles() revset, but a log-like command should build its matcher
812 # with scmutil.match(). The difference is input pats are globbed on
812 # with scmutil.match(). The difference is input pats are globbed on
813 # platforms without shell expansion (windows).
813 # platforms without shell expansion (windows).
814 wctx = repo[None]
814 wctx = repo[None]
815 match, pats = scmutil.matchandpats(wctx, wopts.pats, wopts.opts)
815 match, pats = scmutil.matchandpats(wctx, wopts.pats, wopts.opts)
816 slowpath = match.anypats() or (
816 slowpath = match.anypats() or (
817 not match.always() and wopts.force_changelog_traversal
817 not match.always() and wopts.force_changelog_traversal
818 )
818 )
819 if not slowpath:
819 if not slowpath:
820 if wopts.follow and wopts.revspec:
820 if wopts.follow and wopts.revspec:
821 # There may be the case that a path doesn't exist in some (but
821 # There may be the case that a path doesn't exist in some (but
822 # not all) of the specified start revisions, but let's consider
822 # not all) of the specified start revisions, but let's consider
823 # the path is valid. Missing files will be warned by the matcher.
823 # the path is valid. Missing files will be warned by the matcher.
824 startctxs = [repo[r] for r in revs]
824 startctxs = [repo[r] for r in revs]
825 for f in match.files():
825 for f in match.files():
826 found = False
826 found = False
827 for c in startctxs:
827 for c in startctxs:
828 if f in c:
828 if f in c:
829 found = True
829 found = True
830 elif c.hasdir(f):
830 elif c.hasdir(f):
831 # If a directory exists in any of the start revisions,
831 # If a directory exists in any of the start revisions,
832 # take the slow path.
832 # take the slow path.
833 found = slowpath = True
833 found = slowpath = True
834 if not found:
834 if not found:
835 raise error.Abort(
835 raise error.Abort(
836 _(
836 _(
837 b'cannot follow file not in any of the specified '
837 b'cannot follow file not in any of the specified '
838 b'revisions: "%s"'
838 b'revisions: "%s"'
839 )
839 )
840 % f
840 % f
841 )
841 )
842 elif wopts.follow:
842 elif wopts.follow:
843 for f in match.files():
843 for f in match.files():
844 if f not in wctx:
844 if f not in wctx:
845 # If the file exists, it may be a directory, so let it
845 # If the file exists, it may be a directory, so let it
846 # take the slow path.
846 # take the slow path.
847 if os.path.exists(repo.wjoin(f)):
847 if os.path.exists(repo.wjoin(f)):
848 slowpath = True
848 slowpath = True
849 continue
849 continue
850 else:
850 else:
851 raise error.Abort(
851 raise error.Abort(
852 _(
852 _(
853 b'cannot follow file not in parent '
853 b'cannot follow file not in parent '
854 b'revision: "%s"'
854 b'revision: "%s"'
855 )
855 )
856 % f
856 % f
857 )
857 )
858 filelog = repo.file(f)
858 filelog = repo.file(f)
859 if not filelog:
859 if not filelog:
860 # A file exists in wdir but not in history, which means
860 # A file exists in wdir but not in history, which means
861 # the file isn't committed yet.
861 # the file isn't committed yet.
862 raise error.Abort(
862 raise error.Abort(
863 _(b'cannot follow nonexistent file: "%s"') % f
863 _(b'cannot follow nonexistent file: "%s"') % f
864 )
864 )
865 else:
865 else:
866 for f in match.files():
866 for f in match.files():
867 filelog = repo.file(f)
867 filelog = repo.file(f)
868 if not filelog:
868 if not filelog:
869 # A zero count may be a directory or deleted file, so
869 # A zero count may be a directory or deleted file, so
870 # try to find matching entries on the slow path.
870 # try to find matching entries on the slow path.
871 slowpath = True
871 slowpath = True
872
872
873 # We decided to fall back to the slowpath because at least one
873 # We decided to fall back to the slowpath because at least one
874 # of the paths was not a file. Check to see if at least one of them
874 # of the paths was not a file. Check to see if at least one of them
875 # existed in history - in that case, we'll continue down the
875 # existed in history - in that case, we'll continue down the
876 # slowpath; otherwise, we can turn off the slowpath
876 # slowpath; otherwise, we can turn off the slowpath
877 if slowpath:
877 if slowpath:
878 for path in match.files():
878 for path in match.files():
879 if path == b'.' or path in repo.store:
879 if not path or path in repo.store:
880 break
880 break
881 else:
881 else:
882 slowpath = False
882 slowpath = False
883
883
884 return match, pats, slowpath
884 return match, pats, slowpath
885
885
886
886
887 def _fileancestors(repo, revs, match, followfirst):
887 def _fileancestors(repo, revs, match, followfirst):
888 fctxs = []
888 fctxs = []
889 for r in revs:
889 for r in revs:
890 ctx = repo[r]
890 ctx = repo[r]
891 fctxs.extend(ctx[f].introfilectx() for f in ctx.walk(match))
891 fctxs.extend(ctx[f].introfilectx() for f in ctx.walk(match))
892
892
893 # When displaying a revision with --patch --follow FILE, we have
893 # When displaying a revision with --patch --follow FILE, we have
894 # to know which file of the revision must be diffed. With
894 # to know which file of the revision must be diffed. With
895 # --follow, we want the names of the ancestors of FILE in the
895 # --follow, we want the names of the ancestors of FILE in the
896 # revision, stored in "fcache". "fcache" is populated as a side effect
896 # revision, stored in "fcache". "fcache" is populated as a side effect
897 # of the graph traversal.
897 # of the graph traversal.
898 fcache = {}
898 fcache = {}
899
899
900 def filematcher(ctx):
900 def filematcher(ctx):
901 return scmutil.matchfiles(repo, fcache.get(scmutil.intrev(ctx), []))
901 return scmutil.matchfiles(repo, fcache.get(scmutil.intrev(ctx), []))
902
902
903 def revgen():
903 def revgen():
904 for rev, cs in dagop.filectxancestors(fctxs, followfirst=followfirst):
904 for rev, cs in dagop.filectxancestors(fctxs, followfirst=followfirst):
905 fcache[rev] = [c.path() for c in cs]
905 fcache[rev] = [c.path() for c in cs]
906 yield rev
906 yield rev
907
907
908 return smartset.generatorset(revgen(), iterasc=False), filematcher
908 return smartset.generatorset(revgen(), iterasc=False), filematcher
909
909
910
910
911 def _makenofollowfilematcher(repo, pats, opts):
911 def _makenofollowfilematcher(repo, pats, opts):
912 '''hook for extensions to override the filematcher for non-follow cases'''
912 '''hook for extensions to override the filematcher for non-follow cases'''
913 return None
913 return None
914
914
915
915
916 _opt2logrevset = {
916 _opt2logrevset = {
917 b'no_merges': (b'not merge()', None),
917 b'no_merges': (b'not merge()', None),
918 b'only_merges': (b'merge()', None),
918 b'only_merges': (b'merge()', None),
919 b'_matchfiles': (None, b'_matchfiles(%ps)'),
919 b'_matchfiles': (None, b'_matchfiles(%ps)'),
920 b'date': (b'date(%s)', None),
920 b'date': (b'date(%s)', None),
921 b'branch': (b'branch(%s)', b'%lr'),
921 b'branch': (b'branch(%s)', b'%lr'),
922 b'_patslog': (b'filelog(%s)', b'%lr'),
922 b'_patslog': (b'filelog(%s)', b'%lr'),
923 b'keyword': (b'keyword(%s)', b'%lr'),
923 b'keyword': (b'keyword(%s)', b'%lr'),
924 b'prune': (b'ancestors(%s)', b'not %lr'),
924 b'prune': (b'ancestors(%s)', b'not %lr'),
925 b'user': (b'user(%s)', b'%lr'),
925 b'user': (b'user(%s)', b'%lr'),
926 }
926 }
927
927
928
928
929 def _makerevset(repo, wopts, slowpath):
929 def _makerevset(repo, wopts, slowpath):
930 """Return a revset string built from log options and file patterns"""
930 """Return a revset string built from log options and file patterns"""
931 opts = {
931 opts = {
932 b'branch': [b'literal:' + repo.lookupbranch(b) for b in wopts.branches],
932 b'branch': [b'literal:' + repo.lookupbranch(b) for b in wopts.branches],
933 b'date': wopts.date,
933 b'date': wopts.date,
934 b'keyword': wopts.keywords,
934 b'keyword': wopts.keywords,
935 b'no_merges': wopts.no_merges,
935 b'no_merges': wopts.no_merges,
936 b'only_merges': wopts.only_merges,
936 b'only_merges': wopts.only_merges,
937 b'prune': wopts.prune_ancestors,
937 b'prune': wopts.prune_ancestors,
938 b'user': [b'literal:' + v for v in wopts.users],
938 b'user': [b'literal:' + v for v in wopts.users],
939 }
939 }
940
940
941 if wopts.filter_revisions_by_pats and slowpath:
941 if wopts.filter_revisions_by_pats and slowpath:
942 # pats/include/exclude cannot be represented as separate
942 # pats/include/exclude cannot be represented as separate
943 # revset expressions as their filtering logic applies at file
943 # revset expressions as their filtering logic applies at file
944 # level. For instance "-I a -X b" matches a revision touching
944 # level. For instance "-I a -X b" matches a revision touching
945 # "a" and "b" while "file(a) and not file(b)" does
945 # "a" and "b" while "file(a) and not file(b)" does
946 # not. Besides, filesets are evaluated against the working
946 # not. Besides, filesets are evaluated against the working
947 # directory.
947 # directory.
948 matchargs = [b'r:', b'd:relpath']
948 matchargs = [b'r:', b'd:relpath']
949 for p in wopts.pats:
949 for p in wopts.pats:
950 matchargs.append(b'p:' + p)
950 matchargs.append(b'p:' + p)
951 for p in wopts.include_pats:
951 for p in wopts.include_pats:
952 matchargs.append(b'i:' + p)
952 matchargs.append(b'i:' + p)
953 for p in wopts.exclude_pats:
953 for p in wopts.exclude_pats:
954 matchargs.append(b'x:' + p)
954 matchargs.append(b'x:' + p)
955 opts[b'_matchfiles'] = matchargs
955 opts[b'_matchfiles'] = matchargs
956 elif wopts.filter_revisions_by_pats and not wopts.follow:
956 elif wopts.filter_revisions_by_pats and not wopts.follow:
957 opts[b'_patslog'] = list(wopts.pats)
957 opts[b'_patslog'] = list(wopts.pats)
958
958
959 expr = []
959 expr = []
960 for op, val in sorted(pycompat.iteritems(opts)):
960 for op, val in sorted(pycompat.iteritems(opts)):
961 if not val:
961 if not val:
962 continue
962 continue
963 revop, listop = _opt2logrevset[op]
963 revop, listop = _opt2logrevset[op]
964 if revop and b'%' not in revop:
964 if revop and b'%' not in revop:
965 expr.append(revop)
965 expr.append(revop)
966 elif not listop:
966 elif not listop:
967 expr.append(revsetlang.formatspec(revop, val))
967 expr.append(revsetlang.formatspec(revop, val))
968 else:
968 else:
969 if revop:
969 if revop:
970 val = [revsetlang.formatspec(revop, v) for v in val]
970 val = [revsetlang.formatspec(revop, v) for v in val]
971 expr.append(revsetlang.formatspec(listop, val))
971 expr.append(revsetlang.formatspec(listop, val))
972
972
973 if wopts.bookmarks:
973 if wopts.bookmarks:
974 expr.append(
974 expr.append(
975 revsetlang.formatspec(
975 revsetlang.formatspec(
976 b'%lr',
976 b'%lr',
977 [scmutil.format_bookmark_revspec(v) for v in wopts.bookmarks],
977 [scmutil.format_bookmark_revspec(v) for v in wopts.bookmarks],
978 )
978 )
979 )
979 )
980
980
981 if expr:
981 if expr:
982 expr = b'(' + b' and '.join(expr) + b')'
982 expr = b'(' + b' and '.join(expr) + b')'
983 else:
983 else:
984 expr = None
984 expr = None
985 return expr
985 return expr
986
986
987
987
988 def _initialrevs(repo, wopts):
988 def _initialrevs(repo, wopts):
989 """Return the initial set of revisions to be filtered or followed"""
989 """Return the initial set of revisions to be filtered or followed"""
990 if wopts.revspec:
990 if wopts.revspec:
991 revs = scmutil.revrange(repo, wopts.revspec)
991 revs = scmutil.revrange(repo, wopts.revspec)
992 elif wopts.follow and repo.dirstate.p1() == nullid:
992 elif wopts.follow and repo.dirstate.p1() == nullid:
993 revs = smartset.baseset()
993 revs = smartset.baseset()
994 elif wopts.follow:
994 elif wopts.follow:
995 revs = repo.revs(b'.')
995 revs = repo.revs(b'.')
996 else:
996 else:
997 revs = smartset.spanset(repo)
997 revs = smartset.spanset(repo)
998 revs.reverse()
998 revs.reverse()
999 return revs
999 return revs
1000
1000
1001
1001
1002 def makewalker(repo, wopts):
1002 def makewalker(repo, wopts):
1003 # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[Callable[[Any], matchmod.basematcher]]]
1003 # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[Callable[[Any], matchmod.basematcher]]]
1004 """Build (revs, makefilematcher) to scan revision/file history
1004 """Build (revs, makefilematcher) to scan revision/file history
1005
1005
1006 - revs is the smartset to be traversed.
1006 - revs is the smartset to be traversed.
1007 - makefilematcher is a function to map ctx to a matcher for that revision
1007 - makefilematcher is a function to map ctx to a matcher for that revision
1008 """
1008 """
1009 revs = _initialrevs(repo, wopts)
1009 revs = _initialrevs(repo, wopts)
1010 if not revs:
1010 if not revs:
1011 return smartset.baseset(), None
1011 return smartset.baseset(), None
1012 # TODO: might want to merge slowpath with wopts.force_changelog_traversal
1012 # TODO: might want to merge slowpath with wopts.force_changelog_traversal
1013 match, pats, slowpath = _makematcher(repo, revs, wopts)
1013 match, pats, slowpath = _makematcher(repo, revs, wopts)
1014 wopts = attr.evolve(wopts, pats=pats)
1014 wopts = attr.evolve(wopts, pats=pats)
1015
1015
1016 filematcher = None
1016 filematcher = None
1017 if wopts.follow:
1017 if wopts.follow:
1018 if slowpath or match.always():
1018 if slowpath or match.always():
1019 revs = dagop.revancestors(repo, revs, followfirst=wopts.follow == 1)
1019 revs = dagop.revancestors(repo, revs, followfirst=wopts.follow == 1)
1020 else:
1020 else:
1021 assert not wopts.force_changelog_traversal
1021 assert not wopts.force_changelog_traversal
1022 revs, filematcher = _fileancestors(
1022 revs, filematcher = _fileancestors(
1023 repo, revs, match, followfirst=wopts.follow == 1
1023 repo, revs, match, followfirst=wopts.follow == 1
1024 )
1024 )
1025 revs.reverse()
1025 revs.reverse()
1026 if filematcher is None:
1026 if filematcher is None:
1027 filematcher = _makenofollowfilematcher(repo, wopts.pats, wopts.opts)
1027 filematcher = _makenofollowfilematcher(repo, wopts.pats, wopts.opts)
1028 if filematcher is None:
1028 if filematcher is None:
1029
1029
1030 def filematcher(ctx):
1030 def filematcher(ctx):
1031 return match
1031 return match
1032
1032
1033 expr = _makerevset(repo, wopts, slowpath)
1033 expr = _makerevset(repo, wopts, slowpath)
1034 if wopts.sort_revisions:
1034 if wopts.sort_revisions:
1035 assert wopts.sort_revisions in {b'topo', b'desc'}
1035 assert wopts.sort_revisions in {b'topo', b'desc'}
1036 if wopts.sort_revisions == b'topo':
1036 if wopts.sort_revisions == b'topo':
1037 if not revs.istopo():
1037 if not revs.istopo():
1038 revs = dagop.toposort(revs, repo.changelog.parentrevs)
1038 revs = dagop.toposort(revs, repo.changelog.parentrevs)
1039 # TODO: try to iterate the set lazily
1039 # TODO: try to iterate the set lazily
1040 revs = revset.baseset(list(revs), istopo=True)
1040 revs = revset.baseset(list(revs), istopo=True)
1041 elif not (revs.isdescending() or revs.istopo()):
1041 elif not (revs.isdescending() or revs.istopo()):
1042 # User-specified revs might be unsorted
1042 # User-specified revs might be unsorted
1043 revs.sort(reverse=True)
1043 revs.sort(reverse=True)
1044 if expr:
1044 if expr:
1045 matcher = revset.match(None, expr)
1045 matcher = revset.match(None, expr)
1046 revs = matcher(repo, revs)
1046 revs = matcher(repo, revs)
1047 if wopts.limit is not None:
1047 if wopts.limit is not None:
1048 revs = revs.slice(0, wopts.limit)
1048 revs = revs.slice(0, wopts.limit)
1049
1049
1050 return revs, filematcher
1050 return revs, filematcher
1051
1051
1052
1052
1053 def getrevs(repo, wopts):
1053 def getrevs(repo, wopts):
1054 # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]]
1054 # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]]
1055 """Return (revs, differ) where revs is a smartset
1055 """Return (revs, differ) where revs is a smartset
1056
1056
1057 differ is a changesetdiffer with pre-configured file matcher.
1057 differ is a changesetdiffer with pre-configured file matcher.
1058 """
1058 """
1059 revs, filematcher = makewalker(repo, wopts)
1059 revs, filematcher = makewalker(repo, wopts)
1060 if not revs:
1060 if not revs:
1061 return revs, None
1061 return revs, None
1062 differ = changesetdiffer()
1062 differ = changesetdiffer()
1063 differ._makefilematcher = filematcher
1063 differ._makefilematcher = filematcher
1064 return revs, differ
1064 return revs, differ
1065
1065
1066
1066
1067 def _parselinerangeopt(repo, opts):
1067 def _parselinerangeopt(repo, opts):
1068 """Parse --line-range log option and return a list of tuples (filename,
1068 """Parse --line-range log option and return a list of tuples (filename,
1069 (fromline, toline)).
1069 (fromline, toline)).
1070 """
1070 """
1071 linerangebyfname = []
1071 linerangebyfname = []
1072 for pat in opts.get(b'line_range', []):
1072 for pat in opts.get(b'line_range', []):
1073 try:
1073 try:
1074 pat, linerange = pat.rsplit(b',', 1)
1074 pat, linerange = pat.rsplit(b',', 1)
1075 except ValueError:
1075 except ValueError:
1076 raise error.Abort(_(b'malformatted line-range pattern %s') % pat)
1076 raise error.Abort(_(b'malformatted line-range pattern %s') % pat)
1077 try:
1077 try:
1078 fromline, toline = map(int, linerange.split(b':'))
1078 fromline, toline = map(int, linerange.split(b':'))
1079 except ValueError:
1079 except ValueError:
1080 raise error.Abort(_(b"invalid line range for %s") % pat)
1080 raise error.Abort(_(b"invalid line range for %s") % pat)
1081 msg = _(b"line range pattern '%s' must match exactly one file") % pat
1081 msg = _(b"line range pattern '%s' must match exactly one file") % pat
1082 fname = scmutil.parsefollowlinespattern(repo, None, pat, msg)
1082 fname = scmutil.parsefollowlinespattern(repo, None, pat, msg)
1083 linerangebyfname.append(
1083 linerangebyfname.append(
1084 (fname, util.processlinerange(fromline, toline))
1084 (fname, util.processlinerange(fromline, toline))
1085 )
1085 )
1086 return linerangebyfname
1086 return linerangebyfname
1087
1087
1088
1088
1089 def getlinerangerevs(repo, userrevs, opts):
1089 def getlinerangerevs(repo, userrevs, opts):
1090 """Return (revs, differ).
1090 """Return (revs, differ).
1091
1091
1092 "revs" are revisions obtained by processing "line-range" log options and
1092 "revs" are revisions obtained by processing "line-range" log options and
1093 walking block ancestors of each specified file/line-range.
1093 walking block ancestors of each specified file/line-range.
1094
1094
1095 "differ" is a changesetdiffer with pre-configured file matcher and hunks
1095 "differ" is a changesetdiffer with pre-configured file matcher and hunks
1096 filter.
1096 filter.
1097 """
1097 """
1098 wctx = repo[None]
1098 wctx = repo[None]
1099
1099
1100 # Two-levels map of "rev -> file ctx -> [line range]".
1100 # Two-levels map of "rev -> file ctx -> [line range]".
1101 linerangesbyrev = {}
1101 linerangesbyrev = {}
1102 for fname, (fromline, toline) in _parselinerangeopt(repo, opts):
1102 for fname, (fromline, toline) in _parselinerangeopt(repo, opts):
1103 if fname not in wctx:
1103 if fname not in wctx:
1104 raise error.Abort(
1104 raise error.Abort(
1105 _(b'cannot follow file not in parent revision: "%s"') % fname
1105 _(b'cannot follow file not in parent revision: "%s"') % fname
1106 )
1106 )
1107 fctx = wctx.filectx(fname)
1107 fctx = wctx.filectx(fname)
1108 for fctx, linerange in dagop.blockancestors(fctx, fromline, toline):
1108 for fctx, linerange in dagop.blockancestors(fctx, fromline, toline):
1109 rev = fctx.introrev()
1109 rev = fctx.introrev()
1110 if rev is None:
1110 if rev is None:
1111 rev = wdirrev
1111 rev = wdirrev
1112 if rev not in userrevs:
1112 if rev not in userrevs:
1113 continue
1113 continue
1114 linerangesbyrev.setdefault(rev, {}).setdefault(
1114 linerangesbyrev.setdefault(rev, {}).setdefault(
1115 fctx.path(), []
1115 fctx.path(), []
1116 ).append(linerange)
1116 ).append(linerange)
1117
1117
1118 def nofilterhunksfn(fctx, hunks):
1118 def nofilterhunksfn(fctx, hunks):
1119 return hunks
1119 return hunks
1120
1120
1121 def hunksfilter(ctx):
1121 def hunksfilter(ctx):
1122 fctxlineranges = linerangesbyrev.get(scmutil.intrev(ctx))
1122 fctxlineranges = linerangesbyrev.get(scmutil.intrev(ctx))
1123 if fctxlineranges is None:
1123 if fctxlineranges is None:
1124 return nofilterhunksfn
1124 return nofilterhunksfn
1125
1125
1126 def filterfn(fctx, hunks):
1126 def filterfn(fctx, hunks):
1127 lineranges = fctxlineranges.get(fctx.path())
1127 lineranges = fctxlineranges.get(fctx.path())
1128 if lineranges is not None:
1128 if lineranges is not None:
1129 for hr, lines in hunks:
1129 for hr, lines in hunks:
1130 if hr is None: # binary
1130 if hr is None: # binary
1131 yield hr, lines
1131 yield hr, lines
1132 continue
1132 continue
1133 if any(mdiff.hunkinrange(hr[2:], lr) for lr in lineranges):
1133 if any(mdiff.hunkinrange(hr[2:], lr) for lr in lineranges):
1134 yield hr, lines
1134 yield hr, lines
1135 else:
1135 else:
1136 for hunk in hunks:
1136 for hunk in hunks:
1137 yield hunk
1137 yield hunk
1138
1138
1139 return filterfn
1139 return filterfn
1140
1140
1141 def filematcher(ctx):
1141 def filematcher(ctx):
1142 files = list(linerangesbyrev.get(scmutil.intrev(ctx), []))
1142 files = list(linerangesbyrev.get(scmutil.intrev(ctx), []))
1143 return scmutil.matchfiles(repo, files)
1143 return scmutil.matchfiles(repo, files)
1144
1144
1145 revs = sorted(linerangesbyrev, reverse=True)
1145 revs = sorted(linerangesbyrev, reverse=True)
1146
1146
1147 differ = changesetdiffer()
1147 differ = changesetdiffer()
1148 differ._makefilematcher = filematcher
1148 differ._makefilematcher = filematcher
1149 differ._makehunksfilter = hunksfilter
1149 differ._makehunksfilter = hunksfilter
1150 return smartset.baseset(revs), differ
1150 return smartset.baseset(revs), differ
1151
1151
1152
1152
1153 def _graphnodeformatter(ui, displayer):
1153 def _graphnodeformatter(ui, displayer):
1154 spec = ui.config(b'command-templates', b'graphnode')
1154 spec = ui.config(b'command-templates', b'graphnode')
1155 if not spec:
1155 if not spec:
1156 return templatekw.getgraphnode # fast path for "{graphnode}"
1156 return templatekw.getgraphnode # fast path for "{graphnode}"
1157
1157
1158 spec = templater.unquotestring(spec)
1158 spec = templater.unquotestring(spec)
1159 if isinstance(displayer, changesettemplater):
1159 if isinstance(displayer, changesettemplater):
1160 # reuse cache of slow templates
1160 # reuse cache of slow templates
1161 tres = displayer._tresources
1161 tres = displayer._tresources
1162 else:
1162 else:
1163 tres = formatter.templateresources(ui)
1163 tres = formatter.templateresources(ui)
1164 templ = formatter.maketemplater(
1164 templ = formatter.maketemplater(
1165 ui, spec, defaults=templatekw.keywords, resources=tres
1165 ui, spec, defaults=templatekw.keywords, resources=tres
1166 )
1166 )
1167
1167
1168 def formatnode(repo, ctx, cache):
1168 def formatnode(repo, ctx, cache):
1169 props = {b'ctx': ctx, b'repo': repo}
1169 props = {b'ctx': ctx, b'repo': repo}
1170 return templ.renderdefault(props)
1170 return templ.renderdefault(props)
1171
1171
1172 return formatnode
1172 return formatnode
1173
1173
1174
1174
1175 def displaygraph(ui, repo, dag, displayer, edgefn, getcopies=None, props=None):
1175 def displaygraph(ui, repo, dag, displayer, edgefn, getcopies=None, props=None):
1176 props = props or {}
1176 props = props or {}
1177 formatnode = _graphnodeformatter(ui, displayer)
1177 formatnode = _graphnodeformatter(ui, displayer)
1178 state = graphmod.asciistate()
1178 state = graphmod.asciistate()
1179 styles = state.styles
1179 styles = state.styles
1180
1180
1181 # only set graph styling if HGPLAIN is not set.
1181 # only set graph styling if HGPLAIN is not set.
1182 if ui.plain(b'graph'):
1182 if ui.plain(b'graph'):
1183 # set all edge styles to |, the default pre-3.8 behaviour
1183 # set all edge styles to |, the default pre-3.8 behaviour
1184 styles.update(dict.fromkeys(styles, b'|'))
1184 styles.update(dict.fromkeys(styles, b'|'))
1185 else:
1185 else:
1186 edgetypes = {
1186 edgetypes = {
1187 b'parent': graphmod.PARENT,
1187 b'parent': graphmod.PARENT,
1188 b'grandparent': graphmod.GRANDPARENT,
1188 b'grandparent': graphmod.GRANDPARENT,
1189 b'missing': graphmod.MISSINGPARENT,
1189 b'missing': graphmod.MISSINGPARENT,
1190 }
1190 }
1191 for name, key in edgetypes.items():
1191 for name, key in edgetypes.items():
1192 # experimental config: experimental.graphstyle.*
1192 # experimental config: experimental.graphstyle.*
1193 styles[key] = ui.config(
1193 styles[key] = ui.config(
1194 b'experimental', b'graphstyle.%s' % name, styles[key]
1194 b'experimental', b'graphstyle.%s' % name, styles[key]
1195 )
1195 )
1196 if not styles[key]:
1196 if not styles[key]:
1197 styles[key] = None
1197 styles[key] = None
1198
1198
1199 # experimental config: experimental.graphshorten
1199 # experimental config: experimental.graphshorten
1200 state.graphshorten = ui.configbool(b'experimental', b'graphshorten')
1200 state.graphshorten = ui.configbool(b'experimental', b'graphshorten')
1201
1201
1202 formatnode_cache = {}
1202 formatnode_cache = {}
1203 for rev, type, ctx, parents in dag:
1203 for rev, type, ctx, parents in dag:
1204 char = formatnode(repo, ctx, formatnode_cache)
1204 char = formatnode(repo, ctx, formatnode_cache)
1205 copies = getcopies(ctx) if getcopies else None
1205 copies = getcopies(ctx) if getcopies else None
1206 edges = edgefn(type, char, state, rev, parents)
1206 edges = edgefn(type, char, state, rev, parents)
1207 firstedge = next(edges)
1207 firstedge = next(edges)
1208 width = firstedge[2]
1208 width = firstedge[2]
1209 displayer.show(
1209 displayer.show(
1210 ctx, copies=copies, graphwidth=width, **pycompat.strkwargs(props)
1210 ctx, copies=copies, graphwidth=width, **pycompat.strkwargs(props)
1211 )
1211 )
1212 lines = displayer.hunk.pop(rev).split(b'\n')
1212 lines = displayer.hunk.pop(rev).split(b'\n')
1213 if not lines[-1]:
1213 if not lines[-1]:
1214 del lines[-1]
1214 del lines[-1]
1215 displayer.flush(ctx)
1215 displayer.flush(ctx)
1216 for type, char, width, coldata in itertools.chain([firstedge], edges):
1216 for type, char, width, coldata in itertools.chain([firstedge], edges):
1217 graphmod.ascii(ui, state, type, char, lines, coldata)
1217 graphmod.ascii(ui, state, type, char, lines, coldata)
1218 lines = []
1218 lines = []
1219 displayer.close()
1219 displayer.close()
1220
1220
1221
1221
1222 def displaygraphrevs(ui, repo, revs, displayer, getrenamed):
1222 def displaygraphrevs(ui, repo, revs, displayer, getrenamed):
1223 revdag = graphmod.dagwalker(repo, revs)
1223 revdag = graphmod.dagwalker(repo, revs)
1224 displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges, getrenamed)
1224 displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges, getrenamed)
1225
1225
1226
1226
1227 def displayrevs(ui, repo, revs, displayer, getcopies):
1227 def displayrevs(ui, repo, revs, displayer, getcopies):
1228 for rev in revs:
1228 for rev in revs:
1229 ctx = repo[rev]
1229 ctx = repo[rev]
1230 copies = getcopies(ctx) if getcopies else None
1230 copies = getcopies(ctx) if getcopies else None
1231 displayer.show(ctx, copies=copies)
1231 displayer.show(ctx, copies=copies)
1232 displayer.flush(ctx)
1232 displayer.flush(ctx)
1233 displayer.close()
1233 displayer.close()
1234
1234
1235
1235
1236 def checkunsupportedgraphflags(pats, opts):
1236 def checkunsupportedgraphflags(pats, opts):
1237 for op in [b"newest_first"]:
1237 for op in [b"newest_first"]:
1238 if op in opts and opts[op]:
1238 if op in opts and opts[op]:
1239 raise error.Abort(
1239 raise error.Abort(
1240 _(b"-G/--graph option is incompatible with --%s")
1240 _(b"-G/--graph option is incompatible with --%s")
1241 % op.replace(b"_", b"-")
1241 % op.replace(b"_", b"-")
1242 )
1242 )
1243
1243
1244
1244
1245 def graphrevs(repo, nodes, opts):
1245 def graphrevs(repo, nodes, opts):
1246 limit = getlimit(opts)
1246 limit = getlimit(opts)
1247 nodes.reverse()
1247 nodes.reverse()
1248 if limit is not None:
1248 if limit is not None:
1249 nodes = nodes[:limit]
1249 nodes = nodes[:limit]
1250 return graphmod.nodes(repo, nodes)
1250 return graphmod.nodes(repo, nodes)
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