##// END OF EJS Templates
branching: merge stable into default
Raphaël Gomès -
r52011:98910135 merge default
parent child Browse files
Show More
@@ -1,252 +1,253 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,268 +1,269 b''
1 d40cc5aacc31ed673d9b5b24f98bee78c283062c 0.4f
1 d40cc5aacc31ed673d9b5b24f98bee78c283062c 0.4f
2 1c590d34bf61e2ea12c71738e5a746cd74586157 0.4e
2 1c590d34bf61e2ea12c71738e5a746cd74586157 0.4e
3 7eca4cfa8aad5fce9a04f7d8acadcd0452e2f34e 0.4d
3 7eca4cfa8aad5fce9a04f7d8acadcd0452e2f34e 0.4d
4 b4d0c3786ad3e47beacf8412157326a32b6d25a4 0.4c
4 b4d0c3786ad3e47beacf8412157326a32b6d25a4 0.4c
5 f40273b0ad7b3a6d3012fd37736d0611f41ecf54 0.5
5 f40273b0ad7b3a6d3012fd37736d0611f41ecf54 0.5
6 0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 0.5b
6 0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 0.5b
7 12e0fdbc57a0be78f0e817fd1d170a3615cd35da 0.6
7 12e0fdbc57a0be78f0e817fd1d170a3615cd35da 0.6
8 4ccf3de52989b14c3d84e1097f59e39a992e00bd 0.6b
8 4ccf3de52989b14c3d84e1097f59e39a992e00bd 0.6b
9 eac9c8efcd9bd8244e72fb6821f769f450457a32 0.6c
9 eac9c8efcd9bd8244e72fb6821f769f450457a32 0.6c
10 979c049974485125e1f9357f6bbe9c1b548a64c3 0.7
10 979c049974485125e1f9357f6bbe9c1b548a64c3 0.7
11 3a56574f329a368d645853e0f9e09472aee62349 0.8
11 3a56574f329a368d645853e0f9e09472aee62349 0.8
12 6a03cff2b0f5d30281e6addefe96b993582f2eac 0.8.1
12 6a03cff2b0f5d30281e6addefe96b993582f2eac 0.8.1
13 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0.9
13 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0.9
14 2be3001847cb18a23c403439d9e7d0ace30804e9 0.9.1
14 2be3001847cb18a23c403439d9e7d0ace30804e9 0.9.1
15 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0.9.2
15 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0.9.2
16 27230c29bfec36d5540fbe1c976810aefecfd1d2 0.9.3
16 27230c29bfec36d5540fbe1c976810aefecfd1d2 0.9.3
17 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0.9.4
17 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0.9.4
18 23889160905a1b09fffe1c07378e9fc1827606eb 0.9.5
18 23889160905a1b09fffe1c07378e9fc1827606eb 0.9.5
19 bae2e9c838e90a393bae3973a7850280413e091a 1.0
19 bae2e9c838e90a393bae3973a7850280413e091a 1.0
20 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 1.0.1
20 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 1.0.1
21 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 1.0.2
21 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 1.0.2
22 2a67430f92f15ea5159c26b09ec4839a0c549a26 1.1
22 2a67430f92f15ea5159c26b09ec4839a0c549a26 1.1
23 3773e510d433969e277b1863c317b674cbee2065 1.1.1
23 3773e510d433969e277b1863c317b674cbee2065 1.1.1
24 11a4eb81fb4f4742451591489e2797dc47903277 1.1.2
24 11a4eb81fb4f4742451591489e2797dc47903277 1.1.2
25 11efa41037e280d08cfb07c09ad485df30fb0ea8 1.2
25 11efa41037e280d08cfb07c09ad485df30fb0ea8 1.2
26 02981000012e3adf40c4849bd7b3d5618f9ce82d 1.2.1
26 02981000012e3adf40c4849bd7b3d5618f9ce82d 1.2.1
27 196d40e7c885fa6e95f89134809b3ec7bdbca34b 1.3
27 196d40e7c885fa6e95f89134809b3ec7bdbca34b 1.3
28 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 1.3.1
28 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 1.3.1
29 31ec469f9b556f11819937cf68ee53f2be927ebf 1.4
29 31ec469f9b556f11819937cf68ee53f2be927ebf 1.4
30 439d7ea6fe3aa4ab9ec274a68846779153789de9 1.4.1
30 439d7ea6fe3aa4ab9ec274a68846779153789de9 1.4.1
31 296a0b14a68621f6990c54fdba0083f6f20935bf 1.4.2
31 296a0b14a68621f6990c54fdba0083f6f20935bf 1.4.2
32 4aa619c4c2c09907034d9824ebb1dd0e878206eb 1.4.3
32 4aa619c4c2c09907034d9824ebb1dd0e878206eb 1.4.3
33 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 1.5
33 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 1.5
34 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 1.5.1
34 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 1.5.1
35 39f725929f0c48c5fb3b90c071fc3066012456ca 1.5.2
35 39f725929f0c48c5fb3b90c071fc3066012456ca 1.5.2
36 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 1.5.3
36 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 1.5.3
37 24fe2629c6fd0c74c90bd066e77387c2b02e8437 1.5.4
37 24fe2629c6fd0c74c90bd066e77387c2b02e8437 1.5.4
38 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 1.6
38 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 1.6
39 bf1774d95bde614af3956d92b20e2a0c68c5fec7 1.6.1
39 bf1774d95bde614af3956d92b20e2a0c68c5fec7 1.6.1
40 c00f03a4982e467fb6b6bd45908767db6df4771d 1.6.2
40 c00f03a4982e467fb6b6bd45908767db6df4771d 1.6.2
41 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 1.6.3
41 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 1.6.3
42 93d8bff78c96fe7e33237b257558ee97290048a4 1.6.4
42 93d8bff78c96fe7e33237b257558ee97290048a4 1.6.4
43 333421b9e0f96c7bc788e5667c146a58a9440a55 1.7
43 333421b9e0f96c7bc788e5667c146a58a9440a55 1.7
44 4438875ec01bd0fc32be92b0872eb6daeed4d44f 1.7.1
44 4438875ec01bd0fc32be92b0872eb6daeed4d44f 1.7.1
45 6aff4f144ad356311318b0011df0bb21f2c97429 1.7.2
45 6aff4f144ad356311318b0011df0bb21f2c97429 1.7.2
46 e3bf16703e2601de99e563cdb3a5d50b64e6d320 1.7.3
46 e3bf16703e2601de99e563cdb3a5d50b64e6d320 1.7.3
47 a6c855c32ea081da3c3b8ff628f1847ff271482f 1.7.4
47 a6c855c32ea081da3c3b8ff628f1847ff271482f 1.7.4
48 2b2155623ee2559caf288fd333f30475966c4525 1.7.5
48 2b2155623ee2559caf288fd333f30475966c4525 1.7.5
49 2616325766e3504c8ae7c84bd15ee610901fe91d 1.8
49 2616325766e3504c8ae7c84bd15ee610901fe91d 1.8
50 aa1f3be38ab127280761889d2dca906ca465b5f4 1.8.1
50 aa1f3be38ab127280761889d2dca906ca465b5f4 1.8.1
51 b032bec2c0a651ca0ddecb65714bfe6770f67d70 1.8.2
51 b032bec2c0a651ca0ddecb65714bfe6770f67d70 1.8.2
52 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 1.8.3
52 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 1.8.3
53 733af5d9f6b22387913e1d11350fb8cb7c1487dd 1.8.4
53 733af5d9f6b22387913e1d11350fb8cb7c1487dd 1.8.4
54 de9eb6b1da4fc522b1cab16d86ca166204c24f25 1.9
54 de9eb6b1da4fc522b1cab16d86ca166204c24f25 1.9
55 4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1
55 4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1
56 d629f1e89021103f1753addcef6b310e4435b184 1.9.2
56 d629f1e89021103f1753addcef6b310e4435b184 1.9.2
57 351a9292e430e35766c552066ed3e87c557b803b 1.9.3
57 351a9292e430e35766c552066ed3e87c557b803b 1.9.3
58 384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
58 384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
59 41453d55b481ddfcc1dacb445179649e24ca861d 2.0
59 41453d55b481ddfcc1dacb445179649e24ca861d 2.0
60 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1
60 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1
61 6344043924497cd06d781d9014c66802285072e4 2.0.2
61 6344043924497cd06d781d9014c66802285072e4 2.0.2
62 db33555eafeaf9df1e18950e29439eaa706d399b 2.1-rc
62 db33555eafeaf9df1e18950e29439eaa706d399b 2.1-rc
63 2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1
63 2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1
64 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1
64 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1
65 b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2
65 b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2
66 d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc
66 d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc
67 00182b3d087909e3c3ae44761efecdde8f319ef3 2.2
67 00182b3d087909e3c3ae44761efecdde8f319ef3 2.2
68 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 2.2.1
68 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 2.2.1
69 85a358df5bbbe404ca25730c9c459b34263441dc 2.2.2
69 85a358df5bbbe404ca25730c9c459b34263441dc 2.2.2
70 b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3
70 b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3
71 a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc
71 a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc
72 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 2.3
72 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 2.3
73 072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1
73 072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1
74 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 2.3.2
74 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 2.3.2
75 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 2.4-rc
75 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 2.4-rc
76 195ad823b5d58c68903a6153a25e3fb4ed25239d 2.4
76 195ad823b5d58c68903a6153a25e3fb4ed25239d 2.4
77 0c10cf8191469e7c3c8844922e17e71a176cb7cb 2.4.1
77 0c10cf8191469e7c3c8844922e17e71a176cb7cb 2.4.1
78 a4765077b65e6ae29ba42bab7834717b5072d5ba 2.4.2
78 a4765077b65e6ae29ba42bab7834717b5072d5ba 2.4.2
79 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 2.5-rc
79 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 2.5-rc
80 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 2.5
80 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 2.5
81 7511d4df752e61fe7ae4f3682e0a0008573b0402 2.5.1
81 7511d4df752e61fe7ae4f3682e0a0008573b0402 2.5.1
82 5b7175377babacce80a6c1e12366d8032a6d4340 2.5.2
82 5b7175377babacce80a6c1e12366d8032a6d4340 2.5.2
83 50c922c1b5145dab8baefefb0437d363b6a6c21c 2.5.3
83 50c922c1b5145dab8baefefb0437d363b6a6c21c 2.5.3
84 8a7bd2dccd44ed571afe7424cd7f95594f27c092 2.5.4
84 8a7bd2dccd44ed571afe7424cd7f95594f27c092 2.5.4
85 292cd385856d98bacb2c3086f8897bc660c2beea 2.6-rc
85 292cd385856d98bacb2c3086f8897bc660c2beea 2.6-rc
86 23f785b38af38d2fca6b8f3db56b8007a84cd73a 2.6
86 23f785b38af38d2fca6b8f3db56b8007a84cd73a 2.6
87 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 2.6.1
87 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 2.6.1
88 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 2.6.2
88 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 2.6.2
89 009794acc6e37a650f0fae37872e733382ac1c0c 2.6.3
89 009794acc6e37a650f0fae37872e733382ac1c0c 2.6.3
90 f0d7721d7322dcfb5af33599c2543f27335334bb 2.7-rc
90 f0d7721d7322dcfb5af33599c2543f27335334bb 2.7-rc
91 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 2.7
91 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 2.7
92 335a558f81dc73afeab4d7be63617392b130117f 2.7.1
92 335a558f81dc73afeab4d7be63617392b130117f 2.7.1
93 e7fa36d2ad3a7944a52dca126458d6f482db3524 2.7.2
93 e7fa36d2ad3a7944a52dca126458d6f482db3524 2.7.2
94 1596f2d8f2421314b1ddead8f7d0c91009358994 2.8-rc
94 1596f2d8f2421314b1ddead8f7d0c91009358994 2.8-rc
95 d825e4025e39d1c39db943cdc89818abd0a87c27 2.8
95 d825e4025e39d1c39db943cdc89818abd0a87c27 2.8
96 209e04a06467e2969c0cc6501335be0406d46ef0 2.8.1
96 209e04a06467e2969c0cc6501335be0406d46ef0 2.8.1
97 ca387377df7a3a67dbb90b6336b781cdadc3ef41 2.8.2
97 ca387377df7a3a67dbb90b6336b781cdadc3ef41 2.8.2
98 8862469e16f9236208581b20de5f96bd13cc039d 2.9-rc
98 8862469e16f9236208581b20de5f96bd13cc039d 2.9-rc
99 3cec5134e9c4bceab6a00c60f52a4f80677a78f2 2.9
99 3cec5134e9c4bceab6a00c60f52a4f80677a78f2 2.9
100 b96cb15ec9e04d8ac5ee08b34fcbbe4200588965 2.9.1
100 b96cb15ec9e04d8ac5ee08b34fcbbe4200588965 2.9.1
101 3f83fc5cfe715d292069ee8417c83804f6c6c1e4 2.9.2
101 3f83fc5cfe715d292069ee8417c83804f6c6c1e4 2.9.2
102 564f55b251224f16508dd1311452db7780dafe2b 3.0-rc
102 564f55b251224f16508dd1311452db7780dafe2b 3.0-rc
103 2195ac506c6ababe86985b932f4948837c0891b5 3.0
103 2195ac506c6ababe86985b932f4948837c0891b5 3.0
104 269c80ee5b3cb3684fa8edc61501b3506d02eb10 3.0.1
104 269c80ee5b3cb3684fa8edc61501b3506d02eb10 3.0.1
105 2d8cd3d0e83c7336c0cb45a9f88638363f993848 3.0.2
105 2d8cd3d0e83c7336c0cb45a9f88638363f993848 3.0.2
106 6c36dc6cd61a0e1b563f1d51e55bdf4dacf12162 3.1-rc
106 6c36dc6cd61a0e1b563f1d51e55bdf4dacf12162 3.1-rc
107 3178e49892020336491cdc6945885c4de26ffa8b 3.1
107 3178e49892020336491cdc6945885c4de26ffa8b 3.1
108 5dc91146f35369949ea56b40172308158b59063a 3.1.1
108 5dc91146f35369949ea56b40172308158b59063a 3.1.1
109 f768c888aaa68d12dd7f509dcc7f01c9584357d0 3.1.2
109 f768c888aaa68d12dd7f509dcc7f01c9584357d0 3.1.2
110 7f8d16af8cae246fa5a48e723d48d58b015aed94 3.2-rc
110 7f8d16af8cae246fa5a48e723d48d58b015aed94 3.2-rc
111 ced632394371a36953ce4d394f86278ae51a2aae 3.2
111 ced632394371a36953ce4d394f86278ae51a2aae 3.2
112 643c58303fb0ec020907af28b9e486be299ba043 3.2.1
112 643c58303fb0ec020907af28b9e486be299ba043 3.2.1
113 902554884335e5ca3661d63be9978eb4aec3f68a 3.2.2
113 902554884335e5ca3661d63be9978eb4aec3f68a 3.2.2
114 6dad422ecc5adb63d9fa649eeb8e05a5f9bc4900 3.2.3
114 6dad422ecc5adb63d9fa649eeb8e05a5f9bc4900 3.2.3
115 1265a3a71d75396f5d4cf6935ae7d9ba5407a547 3.2.4
115 1265a3a71d75396f5d4cf6935ae7d9ba5407a547 3.2.4
116 db8e3f7948b1fdeb9ad12d448fc3525759908b9f 3.3-rc
116 db8e3f7948b1fdeb9ad12d448fc3525759908b9f 3.3-rc
117 fbdd5195528fae4f41feebc1838215c110b25d6a 3.3
117 fbdd5195528fae4f41feebc1838215c110b25d6a 3.3
118 5b4ed033390bf6e2879c8f5c28c84e1ee3b87231 3.3.1
118 5b4ed033390bf6e2879c8f5c28c84e1ee3b87231 3.3.1
119 07a92bbd02e5e3a625e0820389b47786b02b2cea 3.3.2
119 07a92bbd02e5e3a625e0820389b47786b02b2cea 3.3.2
120 2e2e9a0750f91a6fe0ad88e4de34f8efefdcab08 3.3.3
120 2e2e9a0750f91a6fe0ad88e4de34f8efefdcab08 3.3.3
121 e89f909edffad558b56f4affa8239e4832f88de0 3.4-rc
121 e89f909edffad558b56f4affa8239e4832f88de0 3.4-rc
122 8cc6036bca532e06681c5a8fa37efaa812de67b5 3.4
122 8cc6036bca532e06681c5a8fa37efaa812de67b5 3.4
123 ed18f4acf435a2824c6f49fba40f42b9df5da7ad 3.4.1
123 ed18f4acf435a2824c6f49fba40f42b9df5da7ad 3.4.1
124 540cd0ddac49c1125b2e013aa2ff18ecbd4dd954 3.4.2
124 540cd0ddac49c1125b2e013aa2ff18ecbd4dd954 3.4.2
125 96a38d44ba093bd1d1ecfd34119e94056030278b 3.5-rc
125 96a38d44ba093bd1d1ecfd34119e94056030278b 3.5-rc
126 21aa1c313b05b1a85f8ffa1120d51579ddf6bf24 3.5
126 21aa1c313b05b1a85f8ffa1120d51579ddf6bf24 3.5
127 1a45e49a6bed023deb229102a8903234d18054d3 3.5.1
127 1a45e49a6bed023deb229102a8903234d18054d3 3.5.1
128 9a466b9f9792e3ad7ae3fc6c43c3ff2e136b718d 3.5.2
128 9a466b9f9792e3ad7ae3fc6c43c3ff2e136b718d 3.5.2
129 b66e3ca0b90c3095ea28dfd39aa24247bebf5c20 3.6-rc
129 b66e3ca0b90c3095ea28dfd39aa24247bebf5c20 3.6-rc
130 47dd34f2e7272be9e3b2a5a83cd0d20be44293f4 3.6
130 47dd34f2e7272be9e3b2a5a83cd0d20be44293f4 3.6
131 1aa5083cbebbe7575c88f3402ab377539b484897 3.6.1
131 1aa5083cbebbe7575c88f3402ab377539b484897 3.6.1
132 2d437a0f3355834a9485bbbeb30a52a052c98f19 3.6.2
132 2d437a0f3355834a9485bbbeb30a52a052c98f19 3.6.2
133 ea389970c08449440587712117f178d33bab3f1e 3.6.3
133 ea389970c08449440587712117f178d33bab3f1e 3.6.3
134 158bdc8965720ca4061f8f8d806563cfc7cdb62e 3.7-rc
134 158bdc8965720ca4061f8f8d806563cfc7cdb62e 3.7-rc
135 2408645de650d8a29a6ce9e7dce601d8dd0d1474 3.7
135 2408645de650d8a29a6ce9e7dce601d8dd0d1474 3.7
136 b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1
136 b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1
137 d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2
137 d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2
138 ae279d4a19e9683214cbd1fe8298cf0b50571432 3.7.3
138 ae279d4a19e9683214cbd1fe8298cf0b50571432 3.7.3
139 740156eedf2c450aee58b1a90b0e826f47c5da64 3.8-rc
139 740156eedf2c450aee58b1a90b0e826f47c5da64 3.8-rc
140 f85de28eae32e7d3064b1a1321309071bbaaa069 3.8
140 f85de28eae32e7d3064b1a1321309071bbaaa069 3.8
141 a56296f55a5e1038ea5016dace2076b693c28a56 3.8.1
141 a56296f55a5e1038ea5016dace2076b693c28a56 3.8.1
142 aaabed77791a75968a12b8c43ad263631a23ee81 3.8.2
142 aaabed77791a75968a12b8c43ad263631a23ee81 3.8.2
143 a9764ab80e11bcf6a37255db7dd079011f767c6c 3.8.3
143 a9764ab80e11bcf6a37255db7dd079011f767c6c 3.8.3
144 26a5d605b8683a292bb89aea11f37a81b06ac016 3.8.4
144 26a5d605b8683a292bb89aea11f37a81b06ac016 3.8.4
145 519bb4f9d3a47a6e83c2b414d58811ed38f503c2 3.9-rc
145 519bb4f9d3a47a6e83c2b414d58811ed38f503c2 3.9-rc
146 299546f84e68dbb9bd026f0f3a974ce4bdb93686 3.9
146 299546f84e68dbb9bd026f0f3a974ce4bdb93686 3.9
147 ccd436f7db6d5d7b9af89715179b911d031d44f1 3.9.1
147 ccd436f7db6d5d7b9af89715179b911d031d44f1 3.9.1
148 149433e68974eb5c63ccb03f794d8b57339a80c4 3.9.2
148 149433e68974eb5c63ccb03f794d8b57339a80c4 3.9.2
149 438173c415874f6ac653efc1099dec9c9150e90f 4.0-rc
149 438173c415874f6ac653efc1099dec9c9150e90f 4.0-rc
150 eab27446995210c334c3d06f1a659e3b9b5da769 4.0
150 eab27446995210c334c3d06f1a659e3b9b5da769 4.0
151 b3b1ae98f6a0e14c1e1ba806a6c18e193b6dae5c 4.0.1
151 b3b1ae98f6a0e14c1e1ba806a6c18e193b6dae5c 4.0.1
152 e69874dc1f4e142746ff3df91e678a09c6fc208c 4.0.2
152 e69874dc1f4e142746ff3df91e678a09c6fc208c 4.0.2
153 a1dd2c0c479e0550040542e392e87bc91262517e 4.1-rc
153 a1dd2c0c479e0550040542e392e87bc91262517e 4.1-rc
154 e1526da1e6d84e03146151c9b6e6950fe9a83d7d 4.1
154 e1526da1e6d84e03146151c9b6e6950fe9a83d7d 4.1
155 25703b624d27e3917d978af56d6ad59331e0464a 4.1.1
155 25703b624d27e3917d978af56d6ad59331e0464a 4.1.1
156 ed5b25874d998ababb181a939dd37a16ea644435 4.1.2
156 ed5b25874d998ababb181a939dd37a16ea644435 4.1.2
157 77eaf9539499a1b8be259ffe7ada787d07857f80 4.1.3
157 77eaf9539499a1b8be259ffe7ada787d07857f80 4.1.3
158 616e788321cc4ae9975b7f0c54c849f36d82182b 4.2-rc
158 616e788321cc4ae9975b7f0c54c849f36d82182b 4.2-rc
159 bb96d4a497432722623ae60d9bc734a1e360179e 4.2
159 bb96d4a497432722623ae60d9bc734a1e360179e 4.2
160 c850f0ed54c1d42f9aa079ad528f8127e5775217 4.2.1
160 c850f0ed54c1d42f9aa079ad528f8127e5775217 4.2.1
161 26c49ed51a698ec016d2b4c6b44ca3c3f73cc788 4.2.2
161 26c49ed51a698ec016d2b4c6b44ca3c3f73cc788 4.2.2
162 857876ebaed4e315f63157bd157d6ce553c7ab73 4.3-rc
162 857876ebaed4e315f63157bd157d6ce553c7ab73 4.3-rc
163 5544af8622863796a0027566f6b646e10d522c4c 4.3
163 5544af8622863796a0027566f6b646e10d522c4c 4.3
164 943c91326b23954e6e1c6960d0239511f9530258 4.2.3
164 943c91326b23954e6e1c6960d0239511f9530258 4.2.3
165 3fee7f7d2da04226914c2258cc2884dc27384fd7 4.3.1
165 3fee7f7d2da04226914c2258cc2884dc27384fd7 4.3.1
166 920977f72c7b70acfdaf56ab35360584d7845827 4.3.2
166 920977f72c7b70acfdaf56ab35360584d7845827 4.3.2
167 2f427b57bf9019c6dc3750baa539dc22c1be50f6 4.3.3
167 2f427b57bf9019c6dc3750baa539dc22c1be50f6 4.3.3
168 1e2454b60e5936f5e77498cab2648db469504487 4.4-rc
168 1e2454b60e5936f5e77498cab2648db469504487 4.4-rc
169 0ccb43d4cf01d013ae05917ec4f305509f851b2d 4.4
169 0ccb43d4cf01d013ae05917ec4f305509f851b2d 4.4
170 cabc840ffdee8a72f3689fb77dd74d04fdc2bc04 4.4.1
170 cabc840ffdee8a72f3689fb77dd74d04fdc2bc04 4.4.1
171 a92b9f8e11ba330614cdfd6af0e03b15c1ff3797 4.4.2
171 a92b9f8e11ba330614cdfd6af0e03b15c1ff3797 4.4.2
172 27b6df1b5adbdf647cf5c6675b40575e1b197c60 4.5-rc
172 27b6df1b5adbdf647cf5c6675b40575e1b197c60 4.5-rc
173 d334afc585e29577f271c5eda03378736a16ca6b 4.5
173 d334afc585e29577f271c5eda03378736a16ca6b 4.5
174 369aadf7a3264b03c8b09efce715bc41e6ab4a9b 4.5.1
174 369aadf7a3264b03c8b09efce715bc41e6ab4a9b 4.5.1
175 8bba684efde7f45add05f737952093bb2aa07155 4.5.2
175 8bba684efde7f45add05f737952093bb2aa07155 4.5.2
176 7de7bd407251af2bc98e5b809c8598ee95830daf 4.5.3
176 7de7bd407251af2bc98e5b809c8598ee95830daf 4.5.3
177 ed5448edcbfa747b9154099e18630e49024fd47b 4.6rc0
177 ed5448edcbfa747b9154099e18630e49024fd47b 4.6rc0
178 1ec874717d8a93b19e0d50628443e0ee5efab3a9 4.6rc1
178 1ec874717d8a93b19e0d50628443e0ee5efab3a9 4.6rc1
179 6614cac550aea66d19c601e45efd1b7bd08d7c40 4.6
179 6614cac550aea66d19c601e45efd1b7bd08d7c40 4.6
180 9c5ced5276d6e7d54f7c3dadf5247b7ee98ec79c 4.6.1
180 9c5ced5276d6e7d54f7c3dadf5247b7ee98ec79c 4.6.1
181 0b63a6743010dfdbf8a8154186e119949bdaa1cc 4.6.2
181 0b63a6743010dfdbf8a8154186e119949bdaa1cc 4.6.2
182 e90130af47ce8dd53a3109aed9d15876b3e7dee8 4.7rc0
182 e90130af47ce8dd53a3109aed9d15876b3e7dee8 4.7rc0
183 33ac6a72308a215e6086fbced347ec10aa963b0a 4.7
183 33ac6a72308a215e6086fbced347ec10aa963b0a 4.7
184 ede3bf31fe63677fdf5bd8db687977d4e3d792ed 4.7.1
184 ede3bf31fe63677fdf5bd8db687977d4e3d792ed 4.7.1
185 5405cb1a79010ac50c58cd84e6f50c4556bf2a4c 4.7.2
185 5405cb1a79010ac50c58cd84e6f50c4556bf2a4c 4.7.2
186 956ec6f1320df26f3133ec40f3de866ea0695fd7 4.8rc0
186 956ec6f1320df26f3133ec40f3de866ea0695fd7 4.8rc0
187 a91a2837150bdcb27ae76b3646e6c93cd6a15904 4.8
187 a91a2837150bdcb27ae76b3646e6c93cd6a15904 4.8
188 1c8c54cf97256f4468da2eb4dbee24f7f3888e71 4.8.1
188 1c8c54cf97256f4468da2eb4dbee24f7f3888e71 4.8.1
189 197f092b2cd9691e2a55d198f717b231af9be6f9 4.8.2
189 197f092b2cd9691e2a55d198f717b231af9be6f9 4.8.2
190 593718ff5844cad7a27ee3eb5adad89ac8550949 4.9rc0
190 593718ff5844cad7a27ee3eb5adad89ac8550949 4.9rc0
191 83377b4b4ae0e9a6b8e579f7b0a693b8cf5c3b10 4.9
191 83377b4b4ae0e9a6b8e579f7b0a693b8cf5c3b10 4.9
192 4ea21df312ec7159c5b3633096b6ecf68750b0dd 4.9.1
192 4ea21df312ec7159c5b3633096b6ecf68750b0dd 4.9.1
193 4a8d9ed864754837a185a642170cde24392f9abf 5.0rc0
193 4a8d9ed864754837a185a642170cde24392f9abf 5.0rc0
194 07e479ef7c9639be0029f00e6a722b96dcc05fee 5.0
194 07e479ef7c9639be0029f00e6a722b96dcc05fee 5.0
195 c3484ddbdb9621256d597ed86b90d229c59c2af9 5.0.1
195 c3484ddbdb9621256d597ed86b90d229c59c2af9 5.0.1
196 97ada9b8d51bef24c5cb4cdca4243f0db694ab6e 5.0.2
196 97ada9b8d51bef24c5cb4cdca4243f0db694ab6e 5.0.2
197 e386b5f4f8360dbb43a576dd9b1368e386fefa5b 5.1rc0
197 e386b5f4f8360dbb43a576dd9b1368e386fefa5b 5.1rc0
198 e91930d712e8507d1bc1b2dffd96c83edc4cbed3 5.1
198 e91930d712e8507d1bc1b2dffd96c83edc4cbed3 5.1
199 a4e32fd539ab41489a51b2aa88bda9a73b839562 5.1.1
199 a4e32fd539ab41489a51b2aa88bda9a73b839562 5.1.1
200 181e52f2b62f4768aa0d988936c929dc7c4a41a0 5.1.2
200 181e52f2b62f4768aa0d988936c929dc7c4a41a0 5.1.2
201 59338f9561099de77c684c00f76507f11e46ebe8 5.2rc0
201 59338f9561099de77c684c00f76507f11e46ebe8 5.2rc0
202 ca3dca416f8d5863ca6f5a4a6a6bb835dcd5feeb 5.2
202 ca3dca416f8d5863ca6f5a4a6a6bb835dcd5feeb 5.2
203 a50fecefa691c9b72a99e49aa6fe9dd13943c2bf 5.2.1
203 a50fecefa691c9b72a99e49aa6fe9dd13943c2bf 5.2.1
204 b4c82b70418022e67cc0e69b1aa3c3aa43aa1d29 5.2.2
204 b4c82b70418022e67cc0e69b1aa3c3aa43aa1d29 5.2.2
205 84a0102c05c7852c8215ef6cf21d809927586b69 5.3rc0
205 84a0102c05c7852c8215ef6cf21d809927586b69 5.3rc0
206 e4344e463c0c888a2f437b78b5982ecdf3f6650a 5.3rc1
206 e4344e463c0c888a2f437b78b5982ecdf3f6650a 5.3rc1
207 7f5410dfc8a64bb587d19637deb95d378fd1eb5c 5.3
207 7f5410dfc8a64bb587d19637deb95d378fd1eb5c 5.3
208 6d121acbb82e65fe4dd3c2318a1b61981b958492 5.3.1
208 6d121acbb82e65fe4dd3c2318a1b61981b958492 5.3.1
209 8fca7e8449a847e3cf1054f2c07b51237699fad3 5.3.2
209 8fca7e8449a847e3cf1054f2c07b51237699fad3 5.3.2
210 26ce8e7515036d3431a03aaeb7bc72dd96cb1112 5.4rc0
210 26ce8e7515036d3431a03aaeb7bc72dd96cb1112 5.4rc0
211 cf3e07d7648a4371ce584d15dd692e7a6845792f 5.4
211 cf3e07d7648a4371ce584d15dd692e7a6845792f 5.4
212 065704cbdbdbb05dcd6bb814eb9bbdd982211b28 5.4.1
212 065704cbdbdbb05dcd6bb814eb9bbdd982211b28 5.4.1
213 0ea9c86fac8974cd74dc12ea681c8986eb6da6c4 5.4.2
213 0ea9c86fac8974cd74dc12ea681c8986eb6da6c4 5.4.2
214 28163c5de797e5416f9b588940f4608269b4d50a 5.5rc0
214 28163c5de797e5416f9b588940f4608269b4d50a 5.5rc0
215 7fc3c5fbc65f6fe85d70ea63923b8767dda4f2e0 5.5
215 7fc3c5fbc65f6fe85d70ea63923b8767dda4f2e0 5.5
216 f62bb5d07848ca598aa860a517394130b61bf2ee 5.5.1
216 f62bb5d07848ca598aa860a517394130b61bf2ee 5.5.1
217 07731064ac41dacdf0ec869ebd05c2e848c14fbf 5.5.2
217 07731064ac41dacdf0ec869ebd05c2e848c14fbf 5.5.2
218 0e06a7ab9e0d5c65af4e511aee1e0342998799df 5.6rc0
218 0e06a7ab9e0d5c65af4e511aee1e0342998799df 5.6rc0
219 18c17d63fdabd009e70bf994e5efb7db422f4f7f 5.6
219 18c17d63fdabd009e70bf994e5efb7db422f4f7f 5.6
220 1d5189a57405ceca5aa244052c9f948977f4699b 5.6.1
220 1d5189a57405ceca5aa244052c9f948977f4699b 5.6.1
221 9da65e3cf3706ff41e08b311381c588440c27baf 5.7rc0
221 9da65e3cf3706ff41e08b311381c588440c27baf 5.7rc0
222 0e2e7300f4302b02412b0b734717697049494c4c 5.7
222 0e2e7300f4302b02412b0b734717697049494c4c 5.7
223 d5d9177c0045d206db575bae6daa98e2cb2fe5bc 5.7.1
223 d5d9177c0045d206db575bae6daa98e2cb2fe5bc 5.7.1
224 f67b8946bb1b6cfa8328dbf8d6a9128b69ccdcb4 5.8rc0
224 f67b8946bb1b6cfa8328dbf8d6a9128b69ccdcb4 5.8rc0
225 8d2b62d716b095507effaa8d56f87cd27ba659ab 5.8rc1
225 8d2b62d716b095507effaa8d56f87cd27ba659ab 5.8rc1
226 067f2c53fb24506c9e9fb4639871b13b19a85f8a 5.8
226 067f2c53fb24506c9e9fb4639871b13b19a85f8a 5.8
227 411dc27fd9fd076d6a031a08fcaace659afe2fe3 5.8.1
227 411dc27fd9fd076d6a031a08fcaace659afe2fe3 5.8.1
228 d7515d29761d5ada7d9c765f517db67db75dea9a 5.9rc0
228 d7515d29761d5ada7d9c765f517db67db75dea9a 5.9rc0
229 2813d406b03607cdb8c06cb04c44efcc9a79d9a2 5.9rc1
229 2813d406b03607cdb8c06cb04c44efcc9a79d9a2 5.9rc1
230 53221078e0de65d1a821ce5311dec45a7a978301 5.9
230 53221078e0de65d1a821ce5311dec45a7a978301 5.9
231 86a60679cf619e14cee9442f865fcf31b142cb9f 5.9.1
231 86a60679cf619e14cee9442f865fcf31b142cb9f 5.9.1
232 750920b18aaaddd654756be40dec59d90f2643be 5.9.2
232 750920b18aaaddd654756be40dec59d90f2643be 5.9.2
233 6ee0244fc1cf889ae543d2ce0ec45201ae0be6e1 5.9.3
233 6ee0244fc1cf889ae543d2ce0ec45201ae0be6e1 5.9.3
234 a44bb185f6bdbecc754996d8386722e2f0123b0a 6.0rc0
234 a44bb185f6bdbecc754996d8386722e2f0123b0a 6.0rc0
235 5d08b289e2e526259d7d5ea32b70fe76d5b327d7 6.0
235 5d08b289e2e526259d7d5ea32b70fe76d5b327d7 6.0
236 799fdf4cca80cb9ae40537a90995e6bd163ebc0b 6.0.1
236 799fdf4cca80cb9ae40537a90995e6bd163ebc0b 6.0.1
237 75676122c2bf7594ac732b7388db4c74c648b365 6.0.2
237 75676122c2bf7594ac732b7388db4c74c648b365 6.0.2
238 dcec16e799ddb6d33fcd11b04af530250a417a58 6.0.3
238 dcec16e799ddb6d33fcd11b04af530250a417a58 6.0.3
239 c00d3ce4e94bb0ee8d809e25e1dcb2a5fab84e2c 6.1rc0
239 c00d3ce4e94bb0ee8d809e25e1dcb2a5fab84e2c 6.1rc0
240 d4486810a1795fba9521449b8885ced034f3a6dd 6.1
240 d4486810a1795fba9521449b8885ced034f3a6dd 6.1
241 5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
241 5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
242 0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
242 0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
243 6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
243 6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
244 0cc5f74ff7f0f4ac2427096bddbe102dbc2453ae 6.1.4
244 0cc5f74ff7f0f4ac2427096bddbe102dbc2453ae 6.1.4
245 288de6f5d724bba7bf1669e2838f196962bb7528 6.2rc0
245 288de6f5d724bba7bf1669e2838f196962bb7528 6.2rc0
246 094a5fa3cf52f936e0de3f1e507c818bee5ece6b 6.2
246 094a5fa3cf52f936e0de3f1e507c818bee5ece6b 6.2
247 f69bffd00abe3a1b94d1032eb2c92e611d16a192 6.2.1
247 f69bffd00abe3a1b94d1032eb2c92e611d16a192 6.2.1
248 b5c8524827d20fe2e0ca8fb1234a0fe35a1a36c7 6.2.2
248 b5c8524827d20fe2e0ca8fb1234a0fe35a1a36c7 6.2.2
249 dbdee8ac3e3fcdda1fa55b90c0a235125b7f8e6f 6.2.3
249 dbdee8ac3e3fcdda1fa55b90c0a235125b7f8e6f 6.2.3
250 a3356ab610fc50000cf0ba55c424a4d96da11db7 6.3rc0
250 a3356ab610fc50000cf0ba55c424a4d96da11db7 6.3rc0
251 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
251 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
252 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3
252 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3
253 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
253 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
254 0000000000000000000000000000000000000000 6.3.0
254 0000000000000000000000000000000000000000 6.3.0
255 c890d8b8bc59b18e5febf60caada629df5356ee2 6.3.1
255 c890d8b8bc59b18e5febf60caada629df5356ee2 6.3.1
256 59466b13a3ae0e29a5d4f485393e516cfbb057d0 6.3.2
256 59466b13a3ae0e29a5d4f485393e516cfbb057d0 6.3.2
257 8830004967ad865ead89c28a410405a6e71e0796 6.3.3
257 8830004967ad865ead89c28a410405a6e71e0796 6.3.3
258 05de4896508e8ec387b33eb30d8aab78d1c8e9e4 6.4rc0
258 05de4896508e8ec387b33eb30d8aab78d1c8e9e4 6.4rc0
259 f14864fffdcab725d9eac6d4f4c07be05a35f59a 6.4
259 f14864fffdcab725d9eac6d4f4c07be05a35f59a 6.4
260 83ea6ce48b4fd09fb79c4e34cc5750c805699a53 6.4.1
260 83ea6ce48b4fd09fb79c4e34cc5750c805699a53 6.4.1
261 f952be90b0514a576dcc8bbe758ce3847faba9bb 6.4.2
261 f952be90b0514a576dcc8bbe758ce3847faba9bb 6.4.2
262 fc445f8abcf90b33db7c463816a1b3560681767f 6.4.3
262 fc445f8abcf90b33db7c463816a1b3560681767f 6.4.3
263 da372c745e0f053bb7a64e74cccd15810d96341d 6.4.4
263 da372c745e0f053bb7a64e74cccd15810d96341d 6.4.4
264 271a4ab29605ffa0bae5d3208eaa21a95427ff92 6.4.5
264 271a4ab29605ffa0bae5d3208eaa21a95427ff92 6.4.5
265 bb42988c7e156931b0ff1e93732b98173ebbcb7f 6.5rc0
265 bb42988c7e156931b0ff1e93732b98173ebbcb7f 6.5rc0
266 3ffc7209bbae5804a53084c9dc2d41139e88c867 6.5
266 3ffc7209bbae5804a53084c9dc2d41139e88c867 6.5
267 787af4e0e8b787e1b77a8059926b123730a4cd01 6.5.1
267 787af4e0e8b787e1b77a8059926b123730a4cd01 6.5.1
268 5a8b5420103937fca97c584c5162178eed828ada 6.5.2
268 5a8b5420103937fca97c584c5162178eed828ada 6.5.2
269 c083d9776cb2fb6056715b2988d1ea48055f3162 6.5.3
@@ -1,4226 +1,4229 b''
1 # revlog.py - storage back-end for mercurial
1 # revlog.py - storage back-end for mercurial
2 # coding: utf8
2 # coding: utf8
3 #
3 #
4 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
4 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 """Storage back-end for Mercurial.
9 """Storage back-end for Mercurial.
10
10
11 This provides efficient delta storage with O(1) retrieve and append
11 This provides efficient delta storage with O(1) retrieve and append
12 and O(changes) merge between branches.
12 and O(changes) merge between branches.
13 """
13 """
14
14
15
15
16 import binascii
16 import binascii
17 import collections
17 import collections
18 import contextlib
18 import contextlib
19 import io
19 import io
20 import os
20 import os
21 import struct
21 import struct
22 import weakref
22 import weakref
23 import zlib
23 import zlib
24
24
25 # import stuff from node for others to import from revlog
25 # import stuff from node for others to import from revlog
26 from .node import (
26 from .node import (
27 bin,
27 bin,
28 hex,
28 hex,
29 nullrev,
29 nullrev,
30 sha1nodeconstants,
30 sha1nodeconstants,
31 short,
31 short,
32 wdirrev,
32 wdirrev,
33 )
33 )
34 from .i18n import _
34 from .i18n import _
35 from .revlogutils.constants import (
35 from .revlogutils.constants import (
36 ALL_KINDS,
36 ALL_KINDS,
37 CHANGELOGV2,
37 CHANGELOGV2,
38 COMP_MODE_DEFAULT,
38 COMP_MODE_DEFAULT,
39 COMP_MODE_INLINE,
39 COMP_MODE_INLINE,
40 COMP_MODE_PLAIN,
40 COMP_MODE_PLAIN,
41 DELTA_BASE_REUSE_NO,
41 DELTA_BASE_REUSE_NO,
42 DELTA_BASE_REUSE_TRY,
42 DELTA_BASE_REUSE_TRY,
43 ENTRY_RANK,
43 ENTRY_RANK,
44 FEATURES_BY_VERSION,
44 FEATURES_BY_VERSION,
45 FLAG_GENERALDELTA,
45 FLAG_GENERALDELTA,
46 FLAG_INLINE_DATA,
46 FLAG_INLINE_DATA,
47 INDEX_HEADER,
47 INDEX_HEADER,
48 KIND_CHANGELOG,
48 KIND_CHANGELOG,
49 KIND_FILELOG,
49 KIND_FILELOG,
50 RANK_UNKNOWN,
50 RANK_UNKNOWN,
51 REVLOGV0,
51 REVLOGV0,
52 REVLOGV1,
52 REVLOGV1,
53 REVLOGV1_FLAGS,
53 REVLOGV1_FLAGS,
54 REVLOGV2,
54 REVLOGV2,
55 REVLOGV2_FLAGS,
55 REVLOGV2_FLAGS,
56 REVLOG_DEFAULT_FLAGS,
56 REVLOG_DEFAULT_FLAGS,
57 REVLOG_DEFAULT_FORMAT,
57 REVLOG_DEFAULT_FORMAT,
58 REVLOG_DEFAULT_VERSION,
58 REVLOG_DEFAULT_VERSION,
59 SUPPORTED_FLAGS,
59 SUPPORTED_FLAGS,
60 )
60 )
61 from .revlogutils.flagutil import (
61 from .revlogutils.flagutil import (
62 REVIDX_DEFAULT_FLAGS,
62 REVIDX_DEFAULT_FLAGS,
63 REVIDX_ELLIPSIS,
63 REVIDX_ELLIPSIS,
64 REVIDX_EXTSTORED,
64 REVIDX_EXTSTORED,
65 REVIDX_FLAGS_ORDER,
65 REVIDX_FLAGS_ORDER,
66 REVIDX_HASCOPIESINFO,
66 REVIDX_HASCOPIESINFO,
67 REVIDX_ISCENSORED,
67 REVIDX_ISCENSORED,
68 REVIDX_RAWTEXT_CHANGING_FLAGS,
68 REVIDX_RAWTEXT_CHANGING_FLAGS,
69 )
69 )
70 from .thirdparty import attr
70 from .thirdparty import attr
71 from . import (
71 from . import (
72 ancestor,
72 ancestor,
73 dagop,
73 dagop,
74 error,
74 error,
75 mdiff,
75 mdiff,
76 policy,
76 policy,
77 pycompat,
77 pycompat,
78 revlogutils,
78 revlogutils,
79 templatefilters,
79 templatefilters,
80 util,
80 util,
81 )
81 )
82 from .interfaces import (
82 from .interfaces import (
83 repository,
83 repository,
84 util as interfaceutil,
84 util as interfaceutil,
85 )
85 )
86 from .revlogutils import (
86 from .revlogutils import (
87 deltas as deltautil,
87 deltas as deltautil,
88 docket as docketutil,
88 docket as docketutil,
89 flagutil,
89 flagutil,
90 nodemap as nodemaputil,
90 nodemap as nodemaputil,
91 randomaccessfile,
91 randomaccessfile,
92 revlogv0,
92 revlogv0,
93 rewrite,
93 rewrite,
94 sidedata as sidedatautil,
94 sidedata as sidedatautil,
95 )
95 )
96 from .utils import (
96 from .utils import (
97 storageutil,
97 storageutil,
98 stringutil,
98 stringutil,
99 )
99 )
100
100
101 # blanked usage of all the name to prevent pyflakes constraints
101 # blanked usage of all the name to prevent pyflakes constraints
102 # We need these name available in the module for extensions.
102 # We need these name available in the module for extensions.
103
103
104 REVLOGV0
104 REVLOGV0
105 REVLOGV1
105 REVLOGV1
106 REVLOGV2
106 REVLOGV2
107 CHANGELOGV2
107 CHANGELOGV2
108 FLAG_INLINE_DATA
108 FLAG_INLINE_DATA
109 FLAG_GENERALDELTA
109 FLAG_GENERALDELTA
110 REVLOG_DEFAULT_FLAGS
110 REVLOG_DEFAULT_FLAGS
111 REVLOG_DEFAULT_FORMAT
111 REVLOG_DEFAULT_FORMAT
112 REVLOG_DEFAULT_VERSION
112 REVLOG_DEFAULT_VERSION
113 REVLOGV1_FLAGS
113 REVLOGV1_FLAGS
114 REVLOGV2_FLAGS
114 REVLOGV2_FLAGS
115 REVIDX_ISCENSORED
115 REVIDX_ISCENSORED
116 REVIDX_ELLIPSIS
116 REVIDX_ELLIPSIS
117 REVIDX_HASCOPIESINFO
117 REVIDX_HASCOPIESINFO
118 REVIDX_EXTSTORED
118 REVIDX_EXTSTORED
119 REVIDX_DEFAULT_FLAGS
119 REVIDX_DEFAULT_FLAGS
120 REVIDX_FLAGS_ORDER
120 REVIDX_FLAGS_ORDER
121 REVIDX_RAWTEXT_CHANGING_FLAGS
121 REVIDX_RAWTEXT_CHANGING_FLAGS
122
122
123 parsers = policy.importmod('parsers')
123 parsers = policy.importmod('parsers')
124 rustancestor = policy.importrust('ancestor')
124 rustancestor = policy.importrust('ancestor')
125 rustdagop = policy.importrust('dagop')
125 rustdagop = policy.importrust('dagop')
126 rustrevlog = policy.importrust('revlog')
126 rustrevlog = policy.importrust('revlog')
127
127
128 # Aliased for performance.
128 # Aliased for performance.
129 _zlibdecompress = zlib.decompress
129 _zlibdecompress = zlib.decompress
130
130
131 # max size of inline data embedded into a revlog
131 # max size of inline data embedded into a revlog
132 _maxinline = 131072
132 _maxinline = 131072
133
133
134 # Flag processors for REVIDX_ELLIPSIS.
134 # Flag processors for REVIDX_ELLIPSIS.
135 def ellipsisreadprocessor(rl, text):
135 def ellipsisreadprocessor(rl, text):
136 return text, False
136 return text, False
137
137
138
138
139 def ellipsiswriteprocessor(rl, text):
139 def ellipsiswriteprocessor(rl, text):
140 return text, False
140 return text, False
141
141
142
142
143 def ellipsisrawprocessor(rl, text):
143 def ellipsisrawprocessor(rl, text):
144 return False
144 return False
145
145
146
146
147 ellipsisprocessor = (
147 ellipsisprocessor = (
148 ellipsisreadprocessor,
148 ellipsisreadprocessor,
149 ellipsiswriteprocessor,
149 ellipsiswriteprocessor,
150 ellipsisrawprocessor,
150 ellipsisrawprocessor,
151 )
151 )
152
152
153
153
154 def _verify_revision(rl, skipflags, state, node):
154 def _verify_revision(rl, skipflags, state, node):
155 """Verify the integrity of the given revlog ``node`` while providing a hook
155 """Verify the integrity of the given revlog ``node`` while providing a hook
156 point for extensions to influence the operation."""
156 point for extensions to influence the operation."""
157 if skipflags:
157 if skipflags:
158 state[b'skipread'].add(node)
158 state[b'skipread'].add(node)
159 else:
159 else:
160 # Side-effect: read content and verify hash.
160 # Side-effect: read content and verify hash.
161 rl.revision(node)
161 rl.revision(node)
162
162
163
163
164 # True if a fast implementation for persistent-nodemap is available
164 # True if a fast implementation for persistent-nodemap is available
165 #
165 #
166 # We also consider we have a "fast" implementation in "pure" python because
166 # We also consider we have a "fast" implementation in "pure" python because
167 # people using pure don't really have performance consideration (and a
167 # people using pure don't really have performance consideration (and a
168 # wheelbarrow of other slowness source)
168 # wheelbarrow of other slowness source)
169 HAS_FAST_PERSISTENT_NODEMAP = rustrevlog is not None or hasattr(
169 HAS_FAST_PERSISTENT_NODEMAP = rustrevlog is not None or hasattr(
170 parsers, 'BaseIndexObject'
170 parsers, 'BaseIndexObject'
171 )
171 )
172
172
173
173
174 @interfaceutil.implementer(repository.irevisiondelta)
174 @interfaceutil.implementer(repository.irevisiondelta)
175 @attr.s(slots=True)
175 @attr.s(slots=True)
176 class revlogrevisiondelta:
176 class revlogrevisiondelta:
177 node = attr.ib()
177 node = attr.ib()
178 p1node = attr.ib()
178 p1node = attr.ib()
179 p2node = attr.ib()
179 p2node = attr.ib()
180 basenode = attr.ib()
180 basenode = attr.ib()
181 flags = attr.ib()
181 flags = attr.ib()
182 baserevisionsize = attr.ib()
182 baserevisionsize = attr.ib()
183 revision = attr.ib()
183 revision = attr.ib()
184 delta = attr.ib()
184 delta = attr.ib()
185 sidedata = attr.ib()
185 sidedata = attr.ib()
186 protocol_flags = attr.ib()
186 protocol_flags = attr.ib()
187 linknode = attr.ib(default=None)
187 linknode = attr.ib(default=None)
188
188
189
189
190 @interfaceutil.implementer(repository.iverifyproblem)
190 @interfaceutil.implementer(repository.iverifyproblem)
191 @attr.s(frozen=True)
191 @attr.s(frozen=True)
192 class revlogproblem:
192 class revlogproblem:
193 warning = attr.ib(default=None)
193 warning = attr.ib(default=None)
194 error = attr.ib(default=None)
194 error = attr.ib(default=None)
195 node = attr.ib(default=None)
195 node = attr.ib(default=None)
196
196
197
197
198 def parse_index_v1(data, inline):
198 def parse_index_v1(data, inline):
199 # call the C implementation to parse the index data
199 # call the C implementation to parse the index data
200 index, cache = parsers.parse_index2(data, inline)
200 index, cache = parsers.parse_index2(data, inline)
201 return index, cache
201 return index, cache
202
202
203
203
204 def parse_index_v2(data, inline):
204 def parse_index_v2(data, inline):
205 # call the C implementation to parse the index data
205 # call the C implementation to parse the index data
206 index, cache = parsers.parse_index2(data, inline, format=REVLOGV2)
206 index, cache = parsers.parse_index2(data, inline, format=REVLOGV2)
207 return index, cache
207 return index, cache
208
208
209
209
210 def parse_index_cl_v2(data, inline):
210 def parse_index_cl_v2(data, inline):
211 # call the C implementation to parse the index data
211 # call the C implementation to parse the index data
212 index, cache = parsers.parse_index2(data, inline, format=CHANGELOGV2)
212 index, cache = parsers.parse_index2(data, inline, format=CHANGELOGV2)
213 return index, cache
213 return index, cache
214
214
215
215
216 if hasattr(parsers, 'parse_index_devel_nodemap'):
216 if hasattr(parsers, 'parse_index_devel_nodemap'):
217
217
218 def parse_index_v1_nodemap(data, inline):
218 def parse_index_v1_nodemap(data, inline):
219 index, cache = parsers.parse_index_devel_nodemap(data, inline)
219 index, cache = parsers.parse_index_devel_nodemap(data, inline)
220 return index, cache
220 return index, cache
221
221
222
222
223 else:
223 else:
224 parse_index_v1_nodemap = None
224 parse_index_v1_nodemap = None
225
225
226
226
227 def parse_index_v1_mixed(data, inline):
227 def parse_index_v1_mixed(data, inline):
228 index, cache = parse_index_v1(data, inline)
228 index, cache = parse_index_v1(data, inline)
229 return rustrevlog.MixedIndex(index), cache
229 return rustrevlog.MixedIndex(index), cache
230
230
231
231
232 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte
232 # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte
233 # signed integer)
233 # signed integer)
234 _maxentrysize = 0x7FFFFFFF
234 _maxentrysize = 0x7FFFFFFF
235
235
236 FILE_TOO_SHORT_MSG = _(
236 FILE_TOO_SHORT_MSG = _(
237 b'cannot read from revlog %s;'
237 b'cannot read from revlog %s;'
238 b' expected %d bytes from offset %d, data size is %d'
238 b' expected %d bytes from offset %d, data size is %d'
239 )
239 )
240
240
241 hexdigits = b'0123456789abcdefABCDEF'
241 hexdigits = b'0123456789abcdefABCDEF'
242
242
243
243
244 class _Config:
244 class _Config:
245 def copy(self):
245 def copy(self):
246 return self.__class__(**self.__dict__)
246 return self.__class__(**self.__dict__)
247
247
248
248
249 @attr.s()
249 @attr.s()
250 class FeatureConfig(_Config):
250 class FeatureConfig(_Config):
251 """Hold configuration values about the available revlog features"""
251 """Hold configuration values about the available revlog features"""
252
252
253 # the default compression engine
253 # the default compression engine
254 compression_engine = attr.ib(default=b'zlib')
254 compression_engine = attr.ib(default=b'zlib')
255 # compression engines options
255 # compression engines options
256 compression_engine_options = attr.ib(default=attr.Factory(dict))
256 compression_engine_options = attr.ib(default=attr.Factory(dict))
257
257
258 # can we use censor on this revlog
258 # can we use censor on this revlog
259 censorable = attr.ib(default=False)
259 censorable = attr.ib(default=False)
260 # does this revlog use the "side data" feature
260 # does this revlog use the "side data" feature
261 has_side_data = attr.ib(default=False)
261 has_side_data = attr.ib(default=False)
262 # might remove rank configuration once the computation has no impact
262 # might remove rank configuration once the computation has no impact
263 compute_rank = attr.ib(default=False)
263 compute_rank = attr.ib(default=False)
264 # parent order is supposed to be semantically irrelevant, so we
264 # parent order is supposed to be semantically irrelevant, so we
265 # normally resort parents to ensure that the first parent is non-null,
265 # normally resort parents to ensure that the first parent is non-null,
266 # if there is a non-null parent at all.
266 # if there is a non-null parent at all.
267 # filelog abuses the parent order as flag to mark some instances of
267 # filelog abuses the parent order as flag to mark some instances of
268 # meta-encoded files, so allow it to disable this behavior.
268 # meta-encoded files, so allow it to disable this behavior.
269 canonical_parent_order = attr.ib(default=False)
269 canonical_parent_order = attr.ib(default=False)
270 # can ellipsis commit be used
270 # can ellipsis commit be used
271 enable_ellipsis = attr.ib(default=False)
271 enable_ellipsis = attr.ib(default=False)
272
272
273 def copy(self):
273 def copy(self):
274 new = super().copy()
274 new = super().copy()
275 new.compression_engine_options = self.compression_engine_options.copy()
275 new.compression_engine_options = self.compression_engine_options.copy()
276 return new
276 return new
277
277
278
278
279 @attr.s()
279 @attr.s()
280 class DataConfig(_Config):
280 class DataConfig(_Config):
281 """Hold configuration value about how the revlog data are read"""
281 """Hold configuration value about how the revlog data are read"""
282
282
283 # should we try to open the "pending" version of the revlog
283 # should we try to open the "pending" version of the revlog
284 try_pending = attr.ib(default=False)
284 try_pending = attr.ib(default=False)
285 # should we try to open the "splitted" version of the revlog
285 # should we try to open the "splitted" version of the revlog
286 try_split = attr.ib(default=False)
286 try_split = attr.ib(default=False)
287 # When True, indexfile should be opened with checkambig=True at writing,
287 # When True, indexfile should be opened with checkambig=True at writing,
288 # to avoid file stat ambiguity.
288 # to avoid file stat ambiguity.
289 check_ambig = attr.ib(default=False)
289 check_ambig = attr.ib(default=False)
290
290
291 # If true, use mmap instead of reading to deal with large index
291 # If true, use mmap instead of reading to deal with large index
292 mmap_large_index = attr.ib(default=False)
292 mmap_large_index = attr.ib(default=False)
293 # how much data is large
293 # how much data is large
294 mmap_index_threshold = attr.ib(default=None)
294 mmap_index_threshold = attr.ib(default=None)
295 # How much data to read and cache into the raw revlog data cache.
295 # How much data to read and cache into the raw revlog data cache.
296 chunk_cache_size = attr.ib(default=65536)
296 chunk_cache_size = attr.ib(default=65536)
297
297
298 # The size of the uncompressed cache compared to the largest revision seen.
298 # The size of the uncompressed cache compared to the largest revision seen.
299 uncompressed_cache_factor = attr.ib(default=None)
299 uncompressed_cache_factor = attr.ib(default=None)
300
300
301 # The number of chunk cached
301 # The number of chunk cached
302 uncompressed_cache_count = attr.ib(default=None)
302 uncompressed_cache_count = attr.ib(default=None)
303
303
304 # Allow sparse reading of the revlog data
304 # Allow sparse reading of the revlog data
305 with_sparse_read = attr.ib(default=False)
305 with_sparse_read = attr.ib(default=False)
306 # minimal density of a sparse read chunk
306 # minimal density of a sparse read chunk
307 sr_density_threshold = attr.ib(default=0.50)
307 sr_density_threshold = attr.ib(default=0.50)
308 # minimal size of data we skip when performing sparse read
308 # minimal size of data we skip when performing sparse read
309 sr_min_gap_size = attr.ib(default=262144)
309 sr_min_gap_size = attr.ib(default=262144)
310
310
311 # are delta encoded against arbitrary bases.
311 # are delta encoded against arbitrary bases.
312 generaldelta = attr.ib(default=False)
312 generaldelta = attr.ib(default=False)
313
313
314
314
315 @attr.s()
315 @attr.s()
316 class DeltaConfig(_Config):
316 class DeltaConfig(_Config):
317 """Hold configuration value about how new delta are computed
317 """Hold configuration value about how new delta are computed
318
318
319 Some attributes are duplicated from DataConfig to help havign each object
319 Some attributes are duplicated from DataConfig to help havign each object
320 self contained.
320 self contained.
321 """
321 """
322
322
323 # can delta be encoded against arbitrary bases.
323 # can delta be encoded against arbitrary bases.
324 general_delta = attr.ib(default=False)
324 general_delta = attr.ib(default=False)
325 # Allow sparse writing of the revlog data
325 # Allow sparse writing of the revlog data
326 sparse_revlog = attr.ib(default=False)
326 sparse_revlog = attr.ib(default=False)
327 # maximum length of a delta chain
327 # maximum length of a delta chain
328 max_chain_len = attr.ib(default=None)
328 max_chain_len = attr.ib(default=None)
329 # Maximum distance between delta chain base start and end
329 # Maximum distance between delta chain base start and end
330 max_deltachain_span = attr.ib(default=-1)
330 max_deltachain_span = attr.ib(default=-1)
331 # If `upper_bound_comp` is not None, this is the expected maximal gain from
331 # If `upper_bound_comp` is not None, this is the expected maximal gain from
332 # compression for the data content.
332 # compression for the data content.
333 upper_bound_comp = attr.ib(default=None)
333 upper_bound_comp = attr.ib(default=None)
334 # Should we try a delta against both parent
334 # Should we try a delta against both parent
335 delta_both_parents = attr.ib(default=True)
335 delta_both_parents = attr.ib(default=True)
336 # Test delta base candidate group by chunk of this maximal size.
336 # Test delta base candidate group by chunk of this maximal size.
337 candidate_group_chunk_size = attr.ib(default=0)
337 candidate_group_chunk_size = attr.ib(default=0)
338 # Should we display debug information about delta computation
338 # Should we display debug information about delta computation
339 debug_delta = attr.ib(default=False)
339 debug_delta = attr.ib(default=False)
340 # trust incoming delta by default
340 # trust incoming delta by default
341 lazy_delta = attr.ib(default=True)
341 lazy_delta = attr.ib(default=True)
342 # trust the base of incoming delta by default
342 # trust the base of incoming delta by default
343 lazy_delta_base = attr.ib(default=False)
343 lazy_delta_base = attr.ib(default=False)
344
344
345
345
346 class _InnerRevlog:
346 class _InnerRevlog:
347 """An inner layer of the revlog object
347 """An inner layer of the revlog object
348
348
349 That layer exist to be able to delegate some operation to Rust, its
349 That layer exist to be able to delegate some operation to Rust, its
350 boundaries are arbitrary and based on what we can delegate to Rust.
350 boundaries are arbitrary and based on what we can delegate to Rust.
351 """
351 """
352
352
353 def __init__(
353 def __init__(
354 self,
354 self,
355 opener,
355 opener,
356 index,
356 index,
357 index_file,
357 index_file,
358 data_file,
358 data_file,
359 sidedata_file,
359 sidedata_file,
360 inline,
360 inline,
361 data_config,
361 data_config,
362 delta_config,
362 delta_config,
363 feature_config,
363 feature_config,
364 chunk_cache,
364 chunk_cache,
365 default_compression_header,
365 default_compression_header,
366 ):
366 ):
367 self.opener = opener
367 self.opener = opener
368 self.index = index
368 self.index = index
369
369
370 self.__index_file = index_file
370 self.__index_file = index_file
371 self.data_file = data_file
371 self.data_file = data_file
372 self.sidedata_file = sidedata_file
372 self.sidedata_file = sidedata_file
373 self.inline = inline
373 self.inline = inline
374 self.data_config = data_config
374 self.data_config = data_config
375 self.delta_config = delta_config
375 self.delta_config = delta_config
376 self.feature_config = feature_config
376 self.feature_config = feature_config
377
377
378 # used during diverted write.
378 # used during diverted write.
379 self._orig_index_file = None
379 self._orig_index_file = None
380
380
381 self._default_compression_header = default_compression_header
381 self._default_compression_header = default_compression_header
382
382
383 # index
383 # index
384
384
385 # 3-tuple of file handles being used for active writing.
385 # 3-tuple of file handles being used for active writing.
386 self._writinghandles = None
386 self._writinghandles = None
387
387
388 self._segmentfile = randomaccessfile.randomaccessfile(
388 self._segmentfile = randomaccessfile.randomaccessfile(
389 self.opener,
389 self.opener,
390 (self.index_file if self.inline else self.data_file),
390 (self.index_file if self.inline else self.data_file),
391 self.data_config.chunk_cache_size,
391 self.data_config.chunk_cache_size,
392 chunk_cache,
392 chunk_cache,
393 )
393 )
394 self._segmentfile_sidedata = randomaccessfile.randomaccessfile(
394 self._segmentfile_sidedata = randomaccessfile.randomaccessfile(
395 self.opener,
395 self.opener,
396 self.sidedata_file,
396 self.sidedata_file,
397 self.data_config.chunk_cache_size,
397 self.data_config.chunk_cache_size,
398 )
398 )
399
399
400 # revlog header -> revlog compressor
400 # revlog header -> revlog compressor
401 self._decompressors = {}
401 self._decompressors = {}
402 # 3-tuple of (node, rev, text) for a raw revision.
402 # 3-tuple of (node, rev, text) for a raw revision.
403 self._revisioncache = None
403 self._revisioncache = None
404
404
405 # cache some uncompressed chunks
405 # cache some uncompressed chunks
406 # rev → uncompressed_chunk
406 # rev → uncompressed_chunk
407 #
407 #
408 # the max cost is dynamically updated to be proportionnal to the
408 # the max cost is dynamically updated to be proportionnal to the
409 # size of revision we actually encounter.
409 # size of revision we actually encounter.
410 self._uncompressed_chunk_cache = None
410 self._uncompressed_chunk_cache = None
411 if self.data_config.uncompressed_cache_factor is not None:
411 if self.data_config.uncompressed_cache_factor is not None:
412 self._uncompressed_chunk_cache = util.lrucachedict(
412 self._uncompressed_chunk_cache = util.lrucachedict(
413 self.data_config.uncompressed_cache_count,
413 self.data_config.uncompressed_cache_count,
414 maxcost=65536, # some arbitrary initial value
414 maxcost=65536, # some arbitrary initial value
415 )
415 )
416
416
417 self._delay_buffer = None
417 self._delay_buffer = None
418
418
419 @property
419 @property
420 def index_file(self):
420 def index_file(self):
421 return self.__index_file
421 return self.__index_file
422
422
423 @index_file.setter
423 @index_file.setter
424 def index_file(self, new_index_file):
424 def index_file(self, new_index_file):
425 self.__index_file = new_index_file
425 self.__index_file = new_index_file
426 if self.inline:
426 if self.inline:
427 self._segmentfile.filename = new_index_file
427 self._segmentfile.filename = new_index_file
428
428
429 def __len__(self):
429 def __len__(self):
430 return len(self.index)
430 return len(self.index)
431
431
432 def clear_cache(self):
432 def clear_cache(self):
433 assert not self.is_delaying
433 assert not self.is_delaying
434 self._revisioncache = None
434 self._revisioncache = None
435 if self._uncompressed_chunk_cache is not None:
435 if self._uncompressed_chunk_cache is not None:
436 self._uncompressed_chunk_cache.clear()
436 self._uncompressed_chunk_cache.clear()
437 self._segmentfile.clear_cache()
437 self._segmentfile.clear_cache()
438 self._segmentfile_sidedata.clear_cache()
438 self._segmentfile_sidedata.clear_cache()
439
439
440 @property
440 @property
441 def canonical_index_file(self):
441 def canonical_index_file(self):
442 if self._orig_index_file is not None:
442 if self._orig_index_file is not None:
443 return self._orig_index_file
443 return self._orig_index_file
444 return self.index_file
444 return self.index_file
445
445
446 @property
446 @property
447 def is_delaying(self):
447 def is_delaying(self):
448 """is the revlog is currently delaying the visibility of written data?
448 """is the revlog is currently delaying the visibility of written data?
449
449
450 The delaying mechanism can be either in-memory or written on disk in a
450 The delaying mechanism can be either in-memory or written on disk in a
451 side-file."""
451 side-file."""
452 return (self._delay_buffer is not None) or (
452 return (self._delay_buffer is not None) or (
453 self._orig_index_file is not None
453 self._orig_index_file is not None
454 )
454 )
455
455
456 # Derived from index values.
456 # Derived from index values.
457
457
458 def start(self, rev):
458 def start(self, rev):
459 """the offset of the data chunk for this revision"""
459 """the offset of the data chunk for this revision"""
460 return int(self.index[rev][0] >> 16)
460 return int(self.index[rev][0] >> 16)
461
461
462 def length(self, rev):
462 def length(self, rev):
463 """the length of the data chunk for this revision"""
463 """the length of the data chunk for this revision"""
464 return self.index[rev][1]
464 return self.index[rev][1]
465
465
466 def end(self, rev):
466 def end(self, rev):
467 """the end of the data chunk for this revision"""
467 """the end of the data chunk for this revision"""
468 return self.start(rev) + self.length(rev)
468 return self.start(rev) + self.length(rev)
469
469
470 def deltaparent(self, rev):
470 def deltaparent(self, rev):
471 """return deltaparent of the given revision"""
471 """return deltaparent of the given revision"""
472 base = self.index[rev][3]
472 base = self.index[rev][3]
473 if base == rev:
473 if base == rev:
474 return nullrev
474 return nullrev
475 elif self.delta_config.general_delta:
475 elif self.delta_config.general_delta:
476 return base
476 return base
477 else:
477 else:
478 return rev - 1
478 return rev - 1
479
479
480 def issnapshot(self, rev):
480 def issnapshot(self, rev):
481 """tells whether rev is a snapshot"""
481 """tells whether rev is a snapshot"""
482 if not self.delta_config.sparse_revlog:
482 if not self.delta_config.sparse_revlog:
483 return self.deltaparent(rev) == nullrev
483 return self.deltaparent(rev) == nullrev
484 elif hasattr(self.index, 'issnapshot'):
484 elif hasattr(self.index, 'issnapshot'):
485 # directly assign the method to cache the testing and access
485 # directly assign the method to cache the testing and access
486 self.issnapshot = self.index.issnapshot
486 self.issnapshot = self.index.issnapshot
487 return self.issnapshot(rev)
487 return self.issnapshot(rev)
488 if rev == nullrev:
488 if rev == nullrev:
489 return True
489 return True
490 entry = self.index[rev]
490 entry = self.index[rev]
491 base = entry[3]
491 base = entry[3]
492 if base == rev:
492 if base == rev:
493 return True
493 return True
494 if base == nullrev:
494 if base == nullrev:
495 return True
495 return True
496 p1 = entry[5]
496 p1 = entry[5]
497 while self.length(p1) == 0:
497 while self.length(p1) == 0:
498 b = self.deltaparent(p1)
498 b = self.deltaparent(p1)
499 if b == p1:
499 if b == p1:
500 break
500 break
501 p1 = b
501 p1 = b
502 p2 = entry[6]
502 p2 = entry[6]
503 while self.length(p2) == 0:
503 while self.length(p2) == 0:
504 b = self.deltaparent(p2)
504 b = self.deltaparent(p2)
505 if b == p2:
505 if b == p2:
506 break
506 break
507 p2 = b
507 p2 = b
508 if base == p1 or base == p2:
508 if base == p1 or base == p2:
509 return False
509 return False
510 return self.issnapshot(base)
510 return self.issnapshot(base)
511
511
512 def _deltachain(self, rev, stoprev=None):
512 def _deltachain(self, rev, stoprev=None):
513 """Obtain the delta chain for a revision.
513 """Obtain the delta chain for a revision.
514
514
515 ``stoprev`` specifies a revision to stop at. If not specified, we
515 ``stoprev`` specifies a revision to stop at. If not specified, we
516 stop at the base of the chain.
516 stop at the base of the chain.
517
517
518 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of
518 Returns a 2-tuple of (chain, stopped) where ``chain`` is a list of
519 revs in ascending order and ``stopped`` is a bool indicating whether
519 revs in ascending order and ``stopped`` is a bool indicating whether
520 ``stoprev`` was hit.
520 ``stoprev`` was hit.
521 """
521 """
522 generaldelta = self.delta_config.general_delta
522 generaldelta = self.delta_config.general_delta
523 # Try C implementation.
523 # Try C implementation.
524 try:
524 try:
525 return self.index.deltachain(rev, stoprev, generaldelta)
525 return self.index.deltachain(rev, stoprev, generaldelta)
526 except AttributeError:
526 except AttributeError:
527 pass
527 pass
528
528
529 chain = []
529 chain = []
530
530
531 # Alias to prevent attribute lookup in tight loop.
531 # Alias to prevent attribute lookup in tight loop.
532 index = self.index
532 index = self.index
533
533
534 iterrev = rev
534 iterrev = rev
535 e = index[iterrev]
535 e = index[iterrev]
536 while iterrev != e[3] and iterrev != stoprev:
536 while iterrev != e[3] and iterrev != stoprev:
537 chain.append(iterrev)
537 chain.append(iterrev)
538 if generaldelta:
538 if generaldelta:
539 iterrev = e[3]
539 iterrev = e[3]
540 else:
540 else:
541 iterrev -= 1
541 iterrev -= 1
542 e = index[iterrev]
542 e = index[iterrev]
543
543
544 if iterrev == stoprev:
544 if iterrev == stoprev:
545 stopped = True
545 stopped = True
546 else:
546 else:
547 chain.append(iterrev)
547 chain.append(iterrev)
548 stopped = False
548 stopped = False
549
549
550 chain.reverse()
550 chain.reverse()
551 return chain, stopped
551 return chain, stopped
552
552
553 @util.propertycache
553 @util.propertycache
554 def _compressor(self):
554 def _compressor(self):
555 engine = util.compengines[self.feature_config.compression_engine]
555 engine = util.compengines[self.feature_config.compression_engine]
556 return engine.revlogcompressor(
556 return engine.revlogcompressor(
557 self.feature_config.compression_engine_options
557 self.feature_config.compression_engine_options
558 )
558 )
559
559
560 @util.propertycache
560 @util.propertycache
561 def _decompressor(self):
561 def _decompressor(self):
562 """the default decompressor"""
562 """the default decompressor"""
563 if self._default_compression_header is None:
563 if self._default_compression_header is None:
564 return None
564 return None
565 t = self._default_compression_header
565 t = self._default_compression_header
566 c = self._get_decompressor(t)
566 c = self._get_decompressor(t)
567 return c.decompress
567 return c.decompress
568
568
569 def _get_decompressor(self, t):
569 def _get_decompressor(self, t):
570 try:
570 try:
571 compressor = self._decompressors[t]
571 compressor = self._decompressors[t]
572 except KeyError:
572 except KeyError:
573 try:
573 try:
574 engine = util.compengines.forrevlogheader(t)
574 engine = util.compengines.forrevlogheader(t)
575 compressor = engine.revlogcompressor(
575 compressor = engine.revlogcompressor(
576 self.feature_config.compression_engine_options
576 self.feature_config.compression_engine_options
577 )
577 )
578 self._decompressors[t] = compressor
578 self._decompressors[t] = compressor
579 except KeyError:
579 except KeyError:
580 raise error.RevlogError(
580 raise error.RevlogError(
581 _(b'unknown compression type %s') % binascii.hexlify(t)
581 _(b'unknown compression type %s') % binascii.hexlify(t)
582 )
582 )
583 return compressor
583 return compressor
584
584
585 def compress(self, data):
585 def compress(self, data):
586 """Generate a possibly-compressed representation of data."""
586 """Generate a possibly-compressed representation of data."""
587 if not data:
587 if not data:
588 return b'', data
588 return b'', data
589
589
590 compressed = self._compressor.compress(data)
590 compressed = self._compressor.compress(data)
591
591
592 if compressed:
592 if compressed:
593 # The revlog compressor added the header in the returned data.
593 # The revlog compressor added the header in the returned data.
594 return b'', compressed
594 return b'', compressed
595
595
596 if data[0:1] == b'\0':
596 if data[0:1] == b'\0':
597 return b'', data
597 return b'', data
598 return b'u', data
598 return b'u', data
599
599
600 def decompress(self, data):
600 def decompress(self, data):
601 """Decompress a revlog chunk.
601 """Decompress a revlog chunk.
602
602
603 The chunk is expected to begin with a header identifying the
603 The chunk is expected to begin with a header identifying the
604 format type so it can be routed to an appropriate decompressor.
604 format type so it can be routed to an appropriate decompressor.
605 """
605 """
606 if not data:
606 if not data:
607 return data
607 return data
608
608
609 # Revlogs are read much more frequently than they are written and many
609 # Revlogs are read much more frequently than they are written and many
610 # chunks only take microseconds to decompress, so performance is
610 # chunks only take microseconds to decompress, so performance is
611 # important here.
611 # important here.
612 #
612 #
613 # We can make a few assumptions about revlogs:
613 # We can make a few assumptions about revlogs:
614 #
614 #
615 # 1) the majority of chunks will be compressed (as opposed to inline
615 # 1) the majority of chunks will be compressed (as opposed to inline
616 # raw data).
616 # raw data).
617 # 2) decompressing *any* data will likely by at least 10x slower than
617 # 2) decompressing *any* data will likely by at least 10x slower than
618 # returning raw inline data.
618 # returning raw inline data.
619 # 3) we want to prioritize common and officially supported compression
619 # 3) we want to prioritize common and officially supported compression
620 # engines
620 # engines
621 #
621 #
622 # It follows that we want to optimize for "decompress compressed data
622 # It follows that we want to optimize for "decompress compressed data
623 # when encoded with common and officially supported compression engines"
623 # when encoded with common and officially supported compression engines"
624 # case over "raw data" and "data encoded by less common or non-official
624 # case over "raw data" and "data encoded by less common or non-official
625 # compression engines." That is why we have the inline lookup first
625 # compression engines." That is why we have the inline lookup first
626 # followed by the compengines lookup.
626 # followed by the compengines lookup.
627 #
627 #
628 # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib
628 # According to `hg perfrevlogchunks`, this is ~0.5% faster for zlib
629 # compressed chunks. And this matters for changelog and manifest reads.
629 # compressed chunks. And this matters for changelog and manifest reads.
630 t = data[0:1]
630 t = data[0:1]
631
631
632 if t == b'x':
632 if t == b'x':
633 try:
633 try:
634 return _zlibdecompress(data)
634 return _zlibdecompress(data)
635 except zlib.error as e:
635 except zlib.error as e:
636 raise error.RevlogError(
636 raise error.RevlogError(
637 _(b'revlog decompress error: %s')
637 _(b'revlog decompress error: %s')
638 % stringutil.forcebytestr(e)
638 % stringutil.forcebytestr(e)
639 )
639 )
640 # '\0' is more common than 'u' so it goes first.
640 # '\0' is more common than 'u' so it goes first.
641 elif t == b'\0':
641 elif t == b'\0':
642 return data
642 return data
643 elif t == b'u':
643 elif t == b'u':
644 return util.buffer(data, 1)
644 return util.buffer(data, 1)
645
645
646 compressor = self._get_decompressor(t)
646 compressor = self._get_decompressor(t)
647
647
648 return compressor.decompress(data)
648 return compressor.decompress(data)
649
649
650 @contextlib.contextmanager
650 @contextlib.contextmanager
651 def reading(self):
651 def reading(self):
652 """Context manager that keeps data and sidedata files open for reading"""
652 """Context manager that keeps data and sidedata files open for reading"""
653 if len(self.index) == 0:
653 if len(self.index) == 0:
654 yield # nothing to be read
654 yield # nothing to be read
655 else:
655 else:
656 with self._segmentfile.reading():
656 with self._segmentfile.reading():
657 with self._segmentfile_sidedata.reading():
657 with self._segmentfile_sidedata.reading():
658 yield
658 yield
659
659
660 @property
660 @property
661 def is_writing(self):
661 def is_writing(self):
662 """True is a writing context is open"""
662 """True is a writing context is open"""
663 return self._writinghandles is not None
663 return self._writinghandles is not None
664
664
665 @property
665 @property
666 def is_open(self):
666 def is_open(self):
667 """True if any file handle is being held
667 """True if any file handle is being held
668
668
669 Used for assert and debug in the python code"""
669 Used for assert and debug in the python code"""
670 return self._segmentfile.is_open or self._segmentfile_sidedata.is_open
670 return self._segmentfile.is_open or self._segmentfile_sidedata.is_open
671
671
672 @contextlib.contextmanager
672 @contextlib.contextmanager
673 def writing(self, transaction, data_end=None, sidedata_end=None):
673 def writing(self, transaction, data_end=None, sidedata_end=None):
674 """Open the revlog files for writing
674 """Open the revlog files for writing
675
675
676 Add content to a revlog should be done within such context.
676 Add content to a revlog should be done within such context.
677 """
677 """
678 if self.is_writing:
678 if self.is_writing:
679 yield
679 yield
680 else:
680 else:
681 ifh = dfh = sdfh = None
681 ifh = dfh = sdfh = None
682 try:
682 try:
683 r = len(self.index)
683 r = len(self.index)
684 # opening the data file.
684 # opening the data file.
685 dsize = 0
685 dsize = 0
686 if r:
686 if r:
687 dsize = self.end(r - 1)
687 dsize = self.end(r - 1)
688 dfh = None
688 dfh = None
689 if not self.inline:
689 if not self.inline:
690 try:
690 try:
691 dfh = self.opener(self.data_file, mode=b"r+")
691 dfh = self.opener(self.data_file, mode=b"r+")
692 if data_end is None:
692 if data_end is None:
693 dfh.seek(0, os.SEEK_END)
693 dfh.seek(0, os.SEEK_END)
694 else:
694 else:
695 dfh.seek(data_end, os.SEEK_SET)
695 dfh.seek(data_end, os.SEEK_SET)
696 except FileNotFoundError:
696 except FileNotFoundError:
697 dfh = self.opener(self.data_file, mode=b"w+")
697 dfh = self.opener(self.data_file, mode=b"w+")
698 transaction.add(self.data_file, dsize)
698 transaction.add(self.data_file, dsize)
699 if self.sidedata_file is not None:
699 if self.sidedata_file is not None:
700 assert sidedata_end is not None
700 assert sidedata_end is not None
701 # revlog-v2 does not inline, help Pytype
701 # revlog-v2 does not inline, help Pytype
702 assert dfh is not None
702 assert dfh is not None
703 try:
703 try:
704 sdfh = self.opener(self.sidedata_file, mode=b"r+")
704 sdfh = self.opener(self.sidedata_file, mode=b"r+")
705 dfh.seek(sidedata_end, os.SEEK_SET)
705 dfh.seek(sidedata_end, os.SEEK_SET)
706 except FileNotFoundError:
706 except FileNotFoundError:
707 sdfh = self.opener(self.sidedata_file, mode=b"w+")
707 sdfh = self.opener(self.sidedata_file, mode=b"w+")
708 transaction.add(self.sidedata_file, sidedata_end)
708 transaction.add(self.sidedata_file, sidedata_end)
709
709
710 # opening the index file.
710 # opening the index file.
711 isize = r * self.index.entry_size
711 isize = r * self.index.entry_size
712 ifh = self.__index_write_fp()
712 ifh = self.__index_write_fp()
713 if self.inline:
713 if self.inline:
714 transaction.add(self.index_file, dsize + isize)
714 transaction.add(self.index_file, dsize + isize)
715 else:
715 else:
716 transaction.add(self.index_file, isize)
716 transaction.add(self.index_file, isize)
717 # exposing all file handle for writing.
717 # exposing all file handle for writing.
718 self._writinghandles = (ifh, dfh, sdfh)
718 self._writinghandles = (ifh, dfh, sdfh)
719 self._segmentfile.writing_handle = ifh if self.inline else dfh
719 self._segmentfile.writing_handle = ifh if self.inline else dfh
720 self._segmentfile_sidedata.writing_handle = sdfh
720 self._segmentfile_sidedata.writing_handle = sdfh
721 yield
721 yield
722 finally:
722 finally:
723 self._writinghandles = None
723 self._writinghandles = None
724 self._segmentfile.writing_handle = None
724 self._segmentfile.writing_handle = None
725 self._segmentfile_sidedata.writing_handle = None
725 self._segmentfile_sidedata.writing_handle = None
726 if dfh is not None:
726 if dfh is not None:
727 dfh.close()
727 dfh.close()
728 if sdfh is not None:
728 if sdfh is not None:
729 sdfh.close()
729 sdfh.close()
730 # closing the index file last to avoid exposing referent to
730 # closing the index file last to avoid exposing referent to
731 # potential unflushed data content.
731 # potential unflushed data content.
732 if ifh is not None:
732 if ifh is not None:
733 ifh.close()
733 ifh.close()
734
734
735 def __index_write_fp(self, index_end=None):
735 def __index_write_fp(self, index_end=None):
736 """internal method to open the index file for writing
736 """internal method to open the index file for writing
737
737
738 You should not use this directly and use `_writing` instead
738 You should not use this directly and use `_writing` instead
739 """
739 """
740 try:
740 try:
741 if self._delay_buffer is None:
741 if self._delay_buffer is None:
742 f = self.opener(
742 f = self.opener(
743 self.index_file,
743 self.index_file,
744 mode=b"r+",
744 mode=b"r+",
745 checkambig=self.data_config.check_ambig,
745 checkambig=self.data_config.check_ambig,
746 )
746 )
747 else:
747 else:
748 # check_ambig affect we way we open file for writing, however
748 # check_ambig affect we way we open file for writing, however
749 # here, we do not actually open a file for writting as write
749 # here, we do not actually open a file for writting as write
750 # will appened to a delay_buffer. So check_ambig is not
750 # will appened to a delay_buffer. So check_ambig is not
751 # meaningful and unneeded here.
751 # meaningful and unneeded here.
752 f = randomaccessfile.appender(
752 f = randomaccessfile.appender(
753 self.opener, self.index_file, b"r+", self._delay_buffer
753 self.opener, self.index_file, b"r+", self._delay_buffer
754 )
754 )
755 if index_end is None:
755 if index_end is None:
756 f.seek(0, os.SEEK_END)
756 f.seek(0, os.SEEK_END)
757 else:
757 else:
758 f.seek(index_end, os.SEEK_SET)
758 f.seek(index_end, os.SEEK_SET)
759 return f
759 return f
760 except FileNotFoundError:
760 except FileNotFoundError:
761 if self._delay_buffer is None:
761 if self._delay_buffer is None:
762 return self.opener(
762 return self.opener(
763 self.index_file,
763 self.index_file,
764 mode=b"w+",
764 mode=b"w+",
765 checkambig=self.data_config.check_ambig,
765 checkambig=self.data_config.check_ambig,
766 )
766 )
767 else:
767 else:
768 return randomaccessfile.appender(
768 return randomaccessfile.appender(
769 self.opener, self.index_file, b"w+", self._delay_buffer
769 self.opener, self.index_file, b"w+", self._delay_buffer
770 )
770 )
771
771
772 def __index_new_fp(self):
772 def __index_new_fp(self):
773 """internal method to create a new index file for writing
773 """internal method to create a new index file for writing
774
774
775 You should not use this unless you are upgrading from inline revlog
775 You should not use this unless you are upgrading from inline revlog
776 """
776 """
777 return self.opener(
777 return self.opener(
778 self.index_file,
778 self.index_file,
779 mode=b"w",
779 mode=b"w",
780 checkambig=self.data_config.check_ambig,
780 checkambig=self.data_config.check_ambig,
781 atomictemp=True,
781 atomictemp=True,
782 )
782 )
783
783
784 def split_inline(self, tr, header, new_index_file_path=None):
784 def split_inline(self, tr, header, new_index_file_path=None):
785 """split the data of an inline revlog into an index and a data file"""
785 """split the data of an inline revlog into an index and a data file"""
786 existing_handles = False
786 existing_handles = False
787 if self._writinghandles is not None:
787 if self._writinghandles is not None:
788 existing_handles = True
788 existing_handles = True
789 fp = self._writinghandles[0]
789 fp = self._writinghandles[0]
790 fp.flush()
790 fp.flush()
791 fp.close()
791 fp.close()
792 # We can't use the cached file handle after close(). So prevent
792 # We can't use the cached file handle after close(). So prevent
793 # its usage.
793 # its usage.
794 self._writinghandles = None
794 self._writinghandles = None
795 self._segmentfile.writing_handle = None
795 self._segmentfile.writing_handle = None
796 # No need to deal with sidedata writing handle as it is only
796 # No need to deal with sidedata writing handle as it is only
797 # relevant with revlog-v2 which is never inline, not reaching
797 # relevant with revlog-v2 which is never inline, not reaching
798 # this code
798 # this code
799
799
800 new_dfh = self.opener(self.data_file, mode=b"w+")
800 new_dfh = self.opener(self.data_file, mode=b"w+")
801 new_dfh.truncate(0) # drop any potentially existing data
801 new_dfh.truncate(0) # drop any potentially existing data
802 try:
802 try:
803 with self.reading():
803 with self.reading():
804 for r in range(len(self.index)):
804 for r in range(len(self.index)):
805 new_dfh.write(self.get_segment_for_revs(r, r)[1])
805 new_dfh.write(self.get_segment_for_revs(r, r)[1])
806 new_dfh.flush()
806 new_dfh.flush()
807
807
808 if new_index_file_path is not None:
808 if new_index_file_path is not None:
809 self.index_file = new_index_file_path
809 self.index_file = new_index_file_path
810 with self.__index_new_fp() as fp:
810 with self.__index_new_fp() as fp:
811 self.inline = False
811 self.inline = False
812 for i in range(len(self.index)):
812 for i in range(len(self.index)):
813 e = self.index.entry_binary(i)
813 e = self.index.entry_binary(i)
814 if i == 0:
814 if i == 0:
815 packed_header = self.index.pack_header(header)
815 packed_header = self.index.pack_header(header)
816 e = packed_header + e
816 e = packed_header + e
817 fp.write(e)
817 fp.write(e)
818
818
819 # If we don't use side-write, the temp file replace the real
819 # If we don't use side-write, the temp file replace the real
820 # index when we exit the context manager
820 # index when we exit the context manager
821
821
822 self._segmentfile = randomaccessfile.randomaccessfile(
822 self._segmentfile = randomaccessfile.randomaccessfile(
823 self.opener,
823 self.opener,
824 self.data_file,
824 self.data_file,
825 self.data_config.chunk_cache_size,
825 self.data_config.chunk_cache_size,
826 )
826 )
827
827
828 if existing_handles:
828 if existing_handles:
829 # switched from inline to conventional reopen the index
829 # switched from inline to conventional reopen the index
830 ifh = self.__index_write_fp()
830 ifh = self.__index_write_fp()
831 self._writinghandles = (ifh, new_dfh, None)
831 self._writinghandles = (ifh, new_dfh, None)
832 self._segmentfile.writing_handle = new_dfh
832 self._segmentfile.writing_handle = new_dfh
833 new_dfh = None
833 new_dfh = None
834 # No need to deal with sidedata writing handle as it is only
834 # No need to deal with sidedata writing handle as it is only
835 # relevant with revlog-v2 which is never inline, not reaching
835 # relevant with revlog-v2 which is never inline, not reaching
836 # this code
836 # this code
837 finally:
837 finally:
838 if new_dfh is not None:
838 if new_dfh is not None:
839 new_dfh.close()
839 new_dfh.close()
840 return self.index_file
840 return self.index_file
841
841
842 def get_segment_for_revs(self, startrev, endrev):
842 def get_segment_for_revs(self, startrev, endrev):
843 """Obtain a segment of raw data corresponding to a range of revisions.
843 """Obtain a segment of raw data corresponding to a range of revisions.
844
844
845 Accepts the start and end revisions and an optional already-open
845 Accepts the start and end revisions and an optional already-open
846 file handle to be used for reading. If the file handle is read, its
846 file handle to be used for reading. If the file handle is read, its
847 seek position will not be preserved.
847 seek position will not be preserved.
848
848
849 Requests for data may be satisfied by a cache.
849 Requests for data may be satisfied by a cache.
850
850
851 Returns a 2-tuple of (offset, data) for the requested range of
851 Returns a 2-tuple of (offset, data) for the requested range of
852 revisions. Offset is the integer offset from the beginning of the
852 revisions. Offset is the integer offset from the beginning of the
853 revlog and data is a str or buffer of the raw byte data.
853 revlog and data is a str or buffer of the raw byte data.
854
854
855 Callers will need to call ``self.start(rev)`` and ``self.length(rev)``
855 Callers will need to call ``self.start(rev)`` and ``self.length(rev)``
856 to determine where each revision's data begins and ends.
856 to determine where each revision's data begins and ends.
857
857
858 API: we should consider making this a private part of the InnerRevlog
858 API: we should consider making this a private part of the InnerRevlog
859 at some point.
859 at some point.
860 """
860 """
861 # Inlined self.start(startrev) & self.end(endrev) for perf reasons
861 # Inlined self.start(startrev) & self.end(endrev) for perf reasons
862 # (functions are expensive).
862 # (functions are expensive).
863 index = self.index
863 index = self.index
864 istart = index[startrev]
864 istart = index[startrev]
865 start = int(istart[0] >> 16)
865 start = int(istart[0] >> 16)
866 if startrev == endrev:
866 if startrev == endrev:
867 end = start + istart[1]
867 end = start + istart[1]
868 else:
868 else:
869 iend = index[endrev]
869 iend = index[endrev]
870 end = int(iend[0] >> 16) + iend[1]
870 end = int(iend[0] >> 16) + iend[1]
871
871
872 if self.inline:
872 if self.inline:
873 start += (startrev + 1) * self.index.entry_size
873 start += (startrev + 1) * self.index.entry_size
874 end += (endrev + 1) * self.index.entry_size
874 end += (endrev + 1) * self.index.entry_size
875 length = end - start
875 length = end - start
876
876
877 return start, self._segmentfile.read_chunk(start, length)
877 return start, self._segmentfile.read_chunk(start, length)
878
878
879 def _chunk(self, rev):
879 def _chunk(self, rev):
880 """Obtain a single decompressed chunk for a revision.
880 """Obtain a single decompressed chunk for a revision.
881
881
882 Accepts an integer revision and an optional already-open file handle
882 Accepts an integer revision and an optional already-open file handle
883 to be used for reading. If used, the seek position of the file will not
883 to be used for reading. If used, the seek position of the file will not
884 be preserved.
884 be preserved.
885
885
886 Returns a str holding uncompressed data for the requested revision.
886 Returns a str holding uncompressed data for the requested revision.
887 """
887 """
888 if self._uncompressed_chunk_cache is not None:
888 if self._uncompressed_chunk_cache is not None:
889 uncomp = self._uncompressed_chunk_cache.get(rev)
889 uncomp = self._uncompressed_chunk_cache.get(rev)
890 if uncomp is not None:
890 if uncomp is not None:
891 return uncomp
891 return uncomp
892
892
893 compression_mode = self.index[rev][10]
893 compression_mode = self.index[rev][10]
894 data = self.get_segment_for_revs(rev, rev)[1]
894 data = self.get_segment_for_revs(rev, rev)[1]
895 if compression_mode == COMP_MODE_PLAIN:
895 if compression_mode == COMP_MODE_PLAIN:
896 uncomp = data
896 uncomp = data
897 elif compression_mode == COMP_MODE_DEFAULT:
897 elif compression_mode == COMP_MODE_DEFAULT:
898 uncomp = self._decompressor(data)
898 uncomp = self._decompressor(data)
899 elif compression_mode == COMP_MODE_INLINE:
899 elif compression_mode == COMP_MODE_INLINE:
900 uncomp = self.decompress(data)
900 uncomp = self.decompress(data)
901 else:
901 else:
902 msg = b'unknown compression mode %d'
902 msg = b'unknown compression mode %d'
903 msg %= compression_mode
903 msg %= compression_mode
904 raise error.RevlogError(msg)
904 raise error.RevlogError(msg)
905 if self._uncompressed_chunk_cache is not None:
905 if self._uncompressed_chunk_cache is not None:
906 self._uncompressed_chunk_cache.insert(rev, uncomp, cost=len(uncomp))
906 self._uncompressed_chunk_cache.insert(rev, uncomp, cost=len(uncomp))
907 return uncomp
907 return uncomp
908
908
909 def _chunks(self, revs, targetsize=None):
909 def _chunks(self, revs, targetsize=None):
910 """Obtain decompressed chunks for the specified revisions.
910 """Obtain decompressed chunks for the specified revisions.
911
911
912 Accepts an iterable of numeric revisions that are assumed to be in
912 Accepts an iterable of numeric revisions that are assumed to be in
913 ascending order. Also accepts an optional already-open file handle
913 ascending order. Also accepts an optional already-open file handle
914 to be used for reading. If used, the seek position of the file will
914 to be used for reading. If used, the seek position of the file will
915 not be preserved.
915 not be preserved.
916
916
917 This function is similar to calling ``self._chunk()`` multiple times,
917 This function is similar to calling ``self._chunk()`` multiple times,
918 but is faster.
918 but is faster.
919
919
920 Returns a list with decompressed data for each requested revision.
920 Returns a list with decompressed data for each requested revision.
921 """
921 """
922 if not revs:
922 if not revs:
923 return []
923 return []
924 start = self.start
924 start = self.start
925 length = self.length
925 length = self.length
926 inline = self.inline
926 inline = self.inline
927 iosize = self.index.entry_size
927 iosize = self.index.entry_size
928 buffer = util.buffer
928 buffer = util.buffer
929
929
930 fetched_revs = []
930 fetched_revs = []
931 fadd = fetched_revs.append
931 fadd = fetched_revs.append
932
932
933 chunks = []
933 chunks = []
934 ladd = chunks.append
934 ladd = chunks.append
935
935
936 if self._uncompressed_chunk_cache is None:
936 if self._uncompressed_chunk_cache is None:
937 fetched_revs = revs
937 fetched_revs = revs
938 else:
938 else:
939 for rev in revs:
939 for rev in revs:
940 cached_value = self._uncompressed_chunk_cache.get(rev)
940 cached_value = self._uncompressed_chunk_cache.get(rev)
941 if cached_value is None:
941 if cached_value is None:
942 fadd(rev)
942 fadd(rev)
943 else:
943 else:
944 ladd((rev, cached_value))
944 ladd((rev, cached_value))
945
945
946 if not fetched_revs:
946 if not fetched_revs:
947 slicedchunks = ()
947 slicedchunks = ()
948 elif not self.data_config.with_sparse_read:
948 elif not self.data_config.with_sparse_read:
949 slicedchunks = (fetched_revs,)
949 slicedchunks = (fetched_revs,)
950 else:
950 else:
951 slicedchunks = deltautil.slicechunk(
951 slicedchunks = deltautil.slicechunk(
952 self,
952 self,
953 fetched_revs,
953 fetched_revs,
954 targetsize=targetsize,
954 targetsize=targetsize,
955 )
955 )
956
956
957 for revschunk in slicedchunks:
957 for revschunk in slicedchunks:
958 firstrev = revschunk[0]
958 firstrev = revschunk[0]
959 # Skip trailing revisions with empty diff
959 # Skip trailing revisions with empty diff
960 for lastrev in revschunk[::-1]:
960 for lastrev in revschunk[::-1]:
961 if length(lastrev) != 0:
961 if length(lastrev) != 0:
962 break
962 break
963
963
964 try:
964 try:
965 offset, data = self.get_segment_for_revs(firstrev, lastrev)
965 offset, data = self.get_segment_for_revs(firstrev, lastrev)
966 except OverflowError:
966 except OverflowError:
967 # issue4215 - we can't cache a run of chunks greater than
967 # issue4215 - we can't cache a run of chunks greater than
968 # 2G on Windows
968 # 2G on Windows
969 for rev in revschunk:
969 for rev in revschunk:
970 ladd((rev, self._chunk(rev)))
970 ladd((rev, self._chunk(rev)))
971
971
972 decomp = self.decompress
972 decomp = self.decompress
973 # self._decompressor might be None, but will not be used in that case
973 # self._decompressor might be None, but will not be used in that case
974 def_decomp = self._decompressor
974 def_decomp = self._decompressor
975 for rev in revschunk:
975 for rev in revschunk:
976 chunkstart = start(rev)
976 chunkstart = start(rev)
977 if inline:
977 if inline:
978 chunkstart += (rev + 1) * iosize
978 chunkstart += (rev + 1) * iosize
979 chunklength = length(rev)
979 chunklength = length(rev)
980 comp_mode = self.index[rev][10]
980 comp_mode = self.index[rev][10]
981 c = buffer(data, chunkstart - offset, chunklength)
981 c = buffer(data, chunkstart - offset, chunklength)
982 if comp_mode == COMP_MODE_PLAIN:
982 if comp_mode == COMP_MODE_PLAIN:
983 c = c
983 c = c
984 elif comp_mode == COMP_MODE_INLINE:
984 elif comp_mode == COMP_MODE_INLINE:
985 c = decomp(c)
985 c = decomp(c)
986 elif comp_mode == COMP_MODE_DEFAULT:
986 elif comp_mode == COMP_MODE_DEFAULT:
987 c = def_decomp(c)
987 c = def_decomp(c)
988 else:
988 else:
989 msg = b'unknown compression mode %d'
989 msg = b'unknown compression mode %d'
990 msg %= comp_mode
990 msg %= comp_mode
991 raise error.RevlogError(msg)
991 raise error.RevlogError(msg)
992 ladd((rev, c))
992 ladd((rev, c))
993 if self._uncompressed_chunk_cache is not None:
993 if self._uncompressed_chunk_cache is not None:
994 self._uncompressed_chunk_cache.insert(rev, c, len(c))
994 self._uncompressed_chunk_cache.insert(rev, c, len(c))
995
995
996 chunks.sort()
996 chunks.sort()
997 return [x[1] for x in chunks]
997 return [x[1] for x in chunks]
998
998
999 def raw_text(self, node, rev):
999 def raw_text(self, node, rev):
1000 """return the possibly unvalidated rawtext for a revision
1000 """return the possibly unvalidated rawtext for a revision
1001
1001
1002 returns (rev, rawtext, validated)
1002 returns (rev, rawtext, validated)
1003 """
1003 """
1004
1004
1005 # revision in the cache (could be useful to apply delta)
1005 # revision in the cache (could be useful to apply delta)
1006 cachedrev = None
1006 cachedrev = None
1007 # An intermediate text to apply deltas to
1007 # An intermediate text to apply deltas to
1008 basetext = None
1008 basetext = None
1009
1009
1010 # Check if we have the entry in cache
1010 # Check if we have the entry in cache
1011 # The cache entry looks like (node, rev, rawtext)
1011 # The cache entry looks like (node, rev, rawtext)
1012 if self._revisioncache:
1012 if self._revisioncache:
1013 cachedrev = self._revisioncache[1]
1013 cachedrev = self._revisioncache[1]
1014
1014
1015 chain, stopped = self._deltachain(rev, stoprev=cachedrev)
1015 chain, stopped = self._deltachain(rev, stoprev=cachedrev)
1016 if stopped:
1016 if stopped:
1017 basetext = self._revisioncache[2]
1017 basetext = self._revisioncache[2]
1018
1018
1019 # drop cache to save memory, the caller is expected to
1019 # drop cache to save memory, the caller is expected to
1020 # update self._inner._revisioncache after validating the text
1020 # update self._inner._revisioncache after validating the text
1021 self._revisioncache = None
1021 self._revisioncache = None
1022
1022
1023 targetsize = None
1023 targetsize = None
1024 rawsize = self.index[rev][2]
1024 rawsize = self.index[rev][2]
1025 if 0 <= rawsize:
1025 if 0 <= rawsize:
1026 targetsize = 4 * rawsize
1026 targetsize = 4 * rawsize
1027
1027
1028 if self._uncompressed_chunk_cache is not None:
1028 if self._uncompressed_chunk_cache is not None:
1029 # dynamically update the uncompressed_chunk_cache size to the
1029 # dynamically update the uncompressed_chunk_cache size to the
1030 # largest revision we saw in this revlog.
1030 # largest revision we saw in this revlog.
1031 factor = self.data_config.uncompressed_cache_factor
1031 factor = self.data_config.uncompressed_cache_factor
1032 candidate_size = rawsize * factor
1032 candidate_size = rawsize * factor
1033 if candidate_size > self._uncompressed_chunk_cache.maxcost:
1033 if candidate_size > self._uncompressed_chunk_cache.maxcost:
1034 self._uncompressed_chunk_cache.maxcost = candidate_size
1034 self._uncompressed_chunk_cache.maxcost = candidate_size
1035
1035
1036 bins = self._chunks(chain, targetsize=targetsize)
1036 bins = self._chunks(chain, targetsize=targetsize)
1037 if basetext is None:
1037 if basetext is None:
1038 basetext = bytes(bins[0])
1038 basetext = bytes(bins[0])
1039 bins = bins[1:]
1039 bins = bins[1:]
1040
1040
1041 rawtext = mdiff.patches(basetext, bins)
1041 rawtext = mdiff.patches(basetext, bins)
1042 del basetext # let us have a chance to free memory early
1042 del basetext # let us have a chance to free memory early
1043 return (rev, rawtext, False)
1043 return (rev, rawtext, False)
1044
1044
1045 def sidedata(self, rev, sidedata_end):
1045 def sidedata(self, rev, sidedata_end):
1046 """Return the sidedata for a given revision number."""
1046 """Return the sidedata for a given revision number."""
1047 index_entry = self.index[rev]
1047 index_entry = self.index[rev]
1048 sidedata_offset = index_entry[8]
1048 sidedata_offset = index_entry[8]
1049 sidedata_size = index_entry[9]
1049 sidedata_size = index_entry[9]
1050
1050
1051 if self.inline:
1051 if self.inline:
1052 sidedata_offset += self.index.entry_size * (1 + rev)
1052 sidedata_offset += self.index.entry_size * (1 + rev)
1053 if sidedata_size == 0:
1053 if sidedata_size == 0:
1054 return {}
1054 return {}
1055
1055
1056 if sidedata_end < sidedata_offset + sidedata_size:
1056 if sidedata_end < sidedata_offset + sidedata_size:
1057 filename = self.sidedata_file
1057 filename = self.sidedata_file
1058 end = sidedata_end
1058 end = sidedata_end
1059 offset = sidedata_offset
1059 offset = sidedata_offset
1060 length = sidedata_size
1060 length = sidedata_size
1061 m = FILE_TOO_SHORT_MSG % (filename, length, offset, end)
1061 m = FILE_TOO_SHORT_MSG % (filename, length, offset, end)
1062 raise error.RevlogError(m)
1062 raise error.RevlogError(m)
1063
1063
1064 comp_segment = self._segmentfile_sidedata.read_chunk(
1064 comp_segment = self._segmentfile_sidedata.read_chunk(
1065 sidedata_offset, sidedata_size
1065 sidedata_offset, sidedata_size
1066 )
1066 )
1067
1067
1068 comp = self.index[rev][11]
1068 comp = self.index[rev][11]
1069 if comp == COMP_MODE_PLAIN:
1069 if comp == COMP_MODE_PLAIN:
1070 segment = comp_segment
1070 segment = comp_segment
1071 elif comp == COMP_MODE_DEFAULT:
1071 elif comp == COMP_MODE_DEFAULT:
1072 segment = self._decompressor(comp_segment)
1072 segment = self._decompressor(comp_segment)
1073 elif comp == COMP_MODE_INLINE:
1073 elif comp == COMP_MODE_INLINE:
1074 segment = self.decompress(comp_segment)
1074 segment = self.decompress(comp_segment)
1075 else:
1075 else:
1076 msg = b'unknown compression mode %d'
1076 msg = b'unknown compression mode %d'
1077 msg %= comp
1077 msg %= comp
1078 raise error.RevlogError(msg)
1078 raise error.RevlogError(msg)
1079
1079
1080 sidedata = sidedatautil.deserialize_sidedata(segment)
1080 sidedata = sidedatautil.deserialize_sidedata(segment)
1081 return sidedata
1081 return sidedata
1082
1082
1083 def write_entry(
1083 def write_entry(
1084 self,
1084 self,
1085 transaction,
1085 transaction,
1086 entry,
1086 entry,
1087 data,
1087 data,
1088 link,
1088 link,
1089 offset,
1089 offset,
1090 sidedata,
1090 sidedata,
1091 sidedata_offset,
1091 sidedata_offset,
1092 index_end,
1092 index_end,
1093 data_end,
1093 data_end,
1094 sidedata_end,
1094 sidedata_end,
1095 ):
1095 ):
1096 # Files opened in a+ mode have inconsistent behavior on various
1096 # Files opened in a+ mode have inconsistent behavior on various
1097 # platforms. Windows requires that a file positioning call be made
1097 # platforms. Windows requires that a file positioning call be made
1098 # when the file handle transitions between reads and writes. See
1098 # when the file handle transitions between reads and writes. See
1099 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other
1099 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other
1100 # platforms, Python or the platform itself can be buggy. Some versions
1100 # platforms, Python or the platform itself can be buggy. Some versions
1101 # of Solaris have been observed to not append at the end of the file
1101 # of Solaris have been observed to not append at the end of the file
1102 # if the file was seeked to before the end. See issue4943 for more.
1102 # if the file was seeked to before the end. See issue4943 for more.
1103 #
1103 #
1104 # We work around this issue by inserting a seek() before writing.
1104 # We work around this issue by inserting a seek() before writing.
1105 # Note: This is likely not necessary on Python 3. However, because
1105 # Note: This is likely not necessary on Python 3. However, because
1106 # the file handle is reused for reads and may be seeked there, we need
1106 # the file handle is reused for reads and may be seeked there, we need
1107 # to be careful before changing this.
1107 # to be careful before changing this.
1108 if self._writinghandles is None:
1108 if self._writinghandles is None:
1109 msg = b'adding revision outside `revlog._writing` context'
1109 msg = b'adding revision outside `revlog._writing` context'
1110 raise error.ProgrammingError(msg)
1110 raise error.ProgrammingError(msg)
1111 ifh, dfh, sdfh = self._writinghandles
1111 ifh, dfh, sdfh = self._writinghandles
1112 if index_end is None:
1112 if index_end is None:
1113 ifh.seek(0, os.SEEK_END)
1113 ifh.seek(0, os.SEEK_END)
1114 else:
1114 else:
1115 ifh.seek(index_end, os.SEEK_SET)
1115 ifh.seek(index_end, os.SEEK_SET)
1116 if dfh:
1116 if dfh:
1117 if data_end is None:
1117 if data_end is None:
1118 dfh.seek(0, os.SEEK_END)
1118 dfh.seek(0, os.SEEK_END)
1119 else:
1119 else:
1120 dfh.seek(data_end, os.SEEK_SET)
1120 dfh.seek(data_end, os.SEEK_SET)
1121 if sdfh:
1121 if sdfh:
1122 sdfh.seek(sidedata_end, os.SEEK_SET)
1122 sdfh.seek(sidedata_end, os.SEEK_SET)
1123
1123
1124 curr = len(self.index) - 1
1124 curr = len(self.index) - 1
1125 if not self.inline:
1125 if not self.inline:
1126 transaction.add(self.data_file, offset)
1126 transaction.add(self.data_file, offset)
1127 if self.sidedata_file:
1127 if self.sidedata_file:
1128 transaction.add(self.sidedata_file, sidedata_offset)
1128 transaction.add(self.sidedata_file, sidedata_offset)
1129 transaction.add(self.canonical_index_file, curr * len(entry))
1129 transaction.add(self.canonical_index_file, curr * len(entry))
1130 if data[0]:
1130 if data[0]:
1131 dfh.write(data[0])
1131 dfh.write(data[0])
1132 dfh.write(data[1])
1132 dfh.write(data[1])
1133 if sidedata:
1133 if sidedata:
1134 sdfh.write(sidedata)
1134 sdfh.write(sidedata)
1135 if self._delay_buffer is None:
1135 if self._delay_buffer is None:
1136 ifh.write(entry)
1136 ifh.write(entry)
1137 else:
1137 else:
1138 self._delay_buffer.append(entry)
1138 self._delay_buffer.append(entry)
1139 else:
1139 else:
1140 offset += curr * self.index.entry_size
1140 offset += curr * self.index.entry_size
1141 transaction.add(self.canonical_index_file, offset)
1141 transaction.add(self.canonical_index_file, offset)
1142 assert not sidedata
1142 assert not sidedata
1143 if self._delay_buffer is None:
1143 if self._delay_buffer is None:
1144 ifh.write(entry)
1144 ifh.write(entry)
1145 ifh.write(data[0])
1145 ifh.write(data[0])
1146 ifh.write(data[1])
1146 ifh.write(data[1])
1147 else:
1147 else:
1148 self._delay_buffer.append(entry)
1148 self._delay_buffer.append(entry)
1149 self._delay_buffer.append(data[0])
1149 self._delay_buffer.append(data[0])
1150 self._delay_buffer.append(data[1])
1150 self._delay_buffer.append(data[1])
1151 return (
1151 return (
1152 ifh.tell(),
1152 ifh.tell(),
1153 dfh.tell() if dfh else None,
1153 dfh.tell() if dfh else None,
1154 sdfh.tell() if sdfh else None,
1154 sdfh.tell() if sdfh else None,
1155 )
1155 )
1156
1156
1157 def _divert_index(self):
1157 def _divert_index(self):
1158 return self.index_file + b'.a'
1158 return self.index_file + b'.a'
1159
1159
1160 def delay(self):
1160 def delay(self):
1161 assert not self.is_open
1161 assert not self.is_open
1162 if self._delay_buffer is not None or self._orig_index_file is not None:
1162 if self._delay_buffer is not None or self._orig_index_file is not None:
1163 # delay or divert already in place
1163 # delay or divert already in place
1164 return None
1164 return None
1165 elif len(self.index) == 0:
1165 elif len(self.index) == 0:
1166 self._orig_index_file = self.index_file
1166 self._orig_index_file = self.index_file
1167 self.index_file = self._divert_index()
1167 self.index_file = self._divert_index()
1168 self._segmentfile.filename = self.index_file
1168 self._segmentfile.filename = self.index_file
1169 assert self._orig_index_file is not None
1169 assert self._orig_index_file is not None
1170 assert self.index_file is not None
1170 assert self.index_file is not None
1171 if self.opener.exists(self.index_file):
1171 if self.opener.exists(self.index_file):
1172 self.opener.unlink(self.index_file)
1172 self.opener.unlink(self.index_file)
1173 return self.index_file
1173 return self.index_file
1174 else:
1174 else:
1175 self._segmentfile._delay_buffer = self._delay_buffer = []
1175 self._segmentfile._delay_buffer = self._delay_buffer = []
1176 return None
1176 return None
1177
1177
1178 def write_pending(self):
1178 def write_pending(self):
1179 assert not self.is_open
1179 assert not self.is_open
1180 if self._orig_index_file is not None:
1180 if self._orig_index_file is not None:
1181 return None, True
1181 return None, True
1182 any_pending = False
1182 any_pending = False
1183 pending_index_file = self._divert_index()
1183 pending_index_file = self._divert_index()
1184 if self.opener.exists(pending_index_file):
1184 if self.opener.exists(pending_index_file):
1185 self.opener.unlink(pending_index_file)
1185 self.opener.unlink(pending_index_file)
1186 util.copyfile(
1186 util.copyfile(
1187 self.opener.join(self.index_file),
1187 self.opener.join(self.index_file),
1188 self.opener.join(pending_index_file),
1188 self.opener.join(pending_index_file),
1189 )
1189 )
1190 if self._delay_buffer:
1190 if self._delay_buffer:
1191 with self.opener(pending_index_file, b'r+') as ifh:
1191 with self.opener(pending_index_file, b'r+') as ifh:
1192 ifh.seek(0, os.SEEK_END)
1192 ifh.seek(0, os.SEEK_END)
1193 ifh.write(b"".join(self._delay_buffer))
1193 ifh.write(b"".join(self._delay_buffer))
1194 any_pending = True
1194 any_pending = True
1195 self._segmentfile._delay_buffer = self._delay_buffer = None
1195 self._segmentfile._delay_buffer = self._delay_buffer = None
1196 self._orig_index_file = self.index_file
1196 self._orig_index_file = self.index_file
1197 self.index_file = pending_index_file
1197 self.index_file = pending_index_file
1198 self._segmentfile.filename = self.index_file
1198 self._segmentfile.filename = self.index_file
1199 return self.index_file, any_pending
1199 return self.index_file, any_pending
1200
1200
1201 def finalize_pending(self):
1201 def finalize_pending(self):
1202 assert not self.is_open
1202 assert not self.is_open
1203
1203
1204 delay = self._delay_buffer is not None
1204 delay = self._delay_buffer is not None
1205 divert = self._orig_index_file is not None
1205 divert = self._orig_index_file is not None
1206
1206
1207 if delay and divert:
1207 if delay and divert:
1208 assert False, "unreachable"
1208 assert False, "unreachable"
1209 elif delay:
1209 elif delay:
1210 if self._delay_buffer:
1210 if self._delay_buffer:
1211 with self.opener(self.index_file, b'r+') as ifh:
1211 with self.opener(self.index_file, b'r+') as ifh:
1212 ifh.seek(0, os.SEEK_END)
1212 ifh.seek(0, os.SEEK_END)
1213 ifh.write(b"".join(self._delay_buffer))
1213 ifh.write(b"".join(self._delay_buffer))
1214 self._segmentfile._delay_buffer = self._delay_buffer = None
1214 self._segmentfile._delay_buffer = self._delay_buffer = None
1215 elif divert:
1215 elif divert:
1216 if self.opener.exists(self.index_file):
1216 if self.opener.exists(self.index_file):
1217 self.opener.rename(
1217 self.opener.rename(
1218 self.index_file,
1218 self.index_file,
1219 self._orig_index_file,
1219 self._orig_index_file,
1220 checkambig=True,
1220 checkambig=True,
1221 )
1221 )
1222 self.index_file = self._orig_index_file
1222 self.index_file = self._orig_index_file
1223 self._orig_index_file = None
1223 self._orig_index_file = None
1224 self._segmentfile.filename = self.index_file
1224 self._segmentfile.filename = self.index_file
1225 else:
1225 else:
1226 msg = b"not delay or divert found on this revlog"
1226 msg = b"not delay or divert found on this revlog"
1227 raise error.ProgrammingError(msg)
1227 raise error.ProgrammingError(msg)
1228 return self.canonical_index_file
1228 return self.canonical_index_file
1229
1229
1230
1230
1231 class revlog:
1231 class revlog:
1232 """
1232 """
1233 the underlying revision storage object
1233 the underlying revision storage object
1234
1234
1235 A revlog consists of two parts, an index and the revision data.
1235 A revlog consists of two parts, an index and the revision data.
1236
1236
1237 The index is a file with a fixed record size containing
1237 The index is a file with a fixed record size containing
1238 information on each revision, including its nodeid (hash), the
1238 information on each revision, including its nodeid (hash), the
1239 nodeids of its parents, the position and offset of its data within
1239 nodeids of its parents, the position and offset of its data within
1240 the data file, and the revision it's based on. Finally, each entry
1240 the data file, and the revision it's based on. Finally, each entry
1241 contains a linkrev entry that can serve as a pointer to external
1241 contains a linkrev entry that can serve as a pointer to external
1242 data.
1242 data.
1243
1243
1244 The revision data itself is a linear collection of data chunks.
1244 The revision data itself is a linear collection of data chunks.
1245 Each chunk represents a revision and is usually represented as a
1245 Each chunk represents a revision and is usually represented as a
1246 delta against the previous chunk. To bound lookup time, runs of
1246 delta against the previous chunk. To bound lookup time, runs of
1247 deltas are limited to about 2 times the length of the original
1247 deltas are limited to about 2 times the length of the original
1248 version data. This makes retrieval of a version proportional to
1248 version data. This makes retrieval of a version proportional to
1249 its size, or O(1) relative to the number of revisions.
1249 its size, or O(1) relative to the number of revisions.
1250
1250
1251 Both pieces of the revlog are written to in an append-only
1251 Both pieces of the revlog are written to in an append-only
1252 fashion, which means we never need to rewrite a file to insert or
1252 fashion, which means we never need to rewrite a file to insert or
1253 remove data, and can use some simple techniques to avoid the need
1253 remove data, and can use some simple techniques to avoid the need
1254 for locking while reading.
1254 for locking while reading.
1255
1255
1256 If checkambig, indexfile is opened with checkambig=True at
1256 If checkambig, indexfile is opened with checkambig=True at
1257 writing, to avoid file stat ambiguity.
1257 writing, to avoid file stat ambiguity.
1258
1258
1259 If mmaplargeindex is True, and an mmapindexthreshold is set, the
1259 If mmaplargeindex is True, and an mmapindexthreshold is set, the
1260 index will be mmapped rather than read if it is larger than the
1260 index will be mmapped rather than read if it is larger than the
1261 configured threshold.
1261 configured threshold.
1262
1262
1263 If censorable is True, the revlog can have censored revisions.
1263 If censorable is True, the revlog can have censored revisions.
1264
1264
1265 If `upperboundcomp` is not None, this is the expected maximal gain from
1265 If `upperboundcomp` is not None, this is the expected maximal gain from
1266 compression for the data content.
1266 compression for the data content.
1267
1267
1268 `concurrencychecker` is an optional function that receives 3 arguments: a
1268 `concurrencychecker` is an optional function that receives 3 arguments: a
1269 file handle, a filename, and an expected position. It should check whether
1269 file handle, a filename, and an expected position. It should check whether
1270 the current position in the file handle is valid, and log/warn/fail (by
1270 the current position in the file handle is valid, and log/warn/fail (by
1271 raising).
1271 raising).
1272
1272
1273 See mercurial/revlogutils/contants.py for details about the content of an
1273 See mercurial/revlogutils/contants.py for details about the content of an
1274 index entry.
1274 index entry.
1275 """
1275 """
1276
1276
1277 _flagserrorclass = error.RevlogError
1277 _flagserrorclass = error.RevlogError
1278
1278
1279 @staticmethod
1279 @staticmethod
1280 def is_inline_index(header_bytes):
1280 def is_inline_index(header_bytes):
1281 """Determine if a revlog is inline from the initial bytes of the index"""
1281 """Determine if a revlog is inline from the initial bytes of the index"""
1282 if len(header_bytes) == 0:
1283 return True
1284
1282 header = INDEX_HEADER.unpack(header_bytes)[0]
1285 header = INDEX_HEADER.unpack(header_bytes)[0]
1283
1286
1284 _format_flags = header & ~0xFFFF
1287 _format_flags = header & ~0xFFFF
1285 _format_version = header & 0xFFFF
1288 _format_version = header & 0xFFFF
1286
1289
1287 features = FEATURES_BY_VERSION[_format_version]
1290 features = FEATURES_BY_VERSION[_format_version]
1288 return features[b'inline'](_format_flags)
1291 return features[b'inline'](_format_flags)
1289
1292
1290 def __init__(
1293 def __init__(
1291 self,
1294 self,
1292 opener,
1295 opener,
1293 target,
1296 target,
1294 radix,
1297 radix,
1295 postfix=None, # only exist for `tmpcensored` now
1298 postfix=None, # only exist for `tmpcensored` now
1296 checkambig=False,
1299 checkambig=False,
1297 mmaplargeindex=False,
1300 mmaplargeindex=False,
1298 censorable=False,
1301 censorable=False,
1299 upperboundcomp=None,
1302 upperboundcomp=None,
1300 persistentnodemap=False,
1303 persistentnodemap=False,
1301 concurrencychecker=None,
1304 concurrencychecker=None,
1302 trypending=False,
1305 trypending=False,
1303 try_split=False,
1306 try_split=False,
1304 canonical_parent_order=True,
1307 canonical_parent_order=True,
1305 ):
1308 ):
1306 """
1309 """
1307 create a revlog object
1310 create a revlog object
1308
1311
1309 opener is a function that abstracts the file opening operation
1312 opener is a function that abstracts the file opening operation
1310 and can be used to implement COW semantics or the like.
1313 and can be used to implement COW semantics or the like.
1311
1314
1312 `target`: a (KIND, ID) tuple that identify the content stored in
1315 `target`: a (KIND, ID) tuple that identify the content stored in
1313 this revlog. It help the rest of the code to understand what the revlog
1316 this revlog. It help the rest of the code to understand what the revlog
1314 is about without having to resort to heuristic and index filename
1317 is about without having to resort to heuristic and index filename
1315 analysis. Note: that this must be reliably be set by normal code, but
1318 analysis. Note: that this must be reliably be set by normal code, but
1316 that test, debug, or performance measurement code might not set this to
1319 that test, debug, or performance measurement code might not set this to
1317 accurate value.
1320 accurate value.
1318 """
1321 """
1319
1322
1320 self.radix = radix
1323 self.radix = radix
1321
1324
1322 self._docket_file = None
1325 self._docket_file = None
1323 self._indexfile = None
1326 self._indexfile = None
1324 self._datafile = None
1327 self._datafile = None
1325 self._sidedatafile = None
1328 self._sidedatafile = None
1326 self._nodemap_file = None
1329 self._nodemap_file = None
1327 self.postfix = postfix
1330 self.postfix = postfix
1328 self._trypending = trypending
1331 self._trypending = trypending
1329 self._try_split = try_split
1332 self._try_split = try_split
1330 self.opener = opener
1333 self.opener = opener
1331 if persistentnodemap:
1334 if persistentnodemap:
1332 self._nodemap_file = nodemaputil.get_nodemap_file(self)
1335 self._nodemap_file = nodemaputil.get_nodemap_file(self)
1333
1336
1334 assert target[0] in ALL_KINDS
1337 assert target[0] in ALL_KINDS
1335 assert len(target) == 2
1338 assert len(target) == 2
1336 self.target = target
1339 self.target = target
1337 if b'feature-config' in self.opener.options:
1340 if b'feature-config' in self.opener.options:
1338 self.feature_config = self.opener.options[b'feature-config'].copy()
1341 self.feature_config = self.opener.options[b'feature-config'].copy()
1339 else:
1342 else:
1340 self.feature_config = FeatureConfig()
1343 self.feature_config = FeatureConfig()
1341 self.feature_config.censorable = censorable
1344 self.feature_config.censorable = censorable
1342 self.feature_config.canonical_parent_order = canonical_parent_order
1345 self.feature_config.canonical_parent_order = canonical_parent_order
1343 if b'data-config' in self.opener.options:
1346 if b'data-config' in self.opener.options:
1344 self.data_config = self.opener.options[b'data-config'].copy()
1347 self.data_config = self.opener.options[b'data-config'].copy()
1345 else:
1348 else:
1346 self.data_config = DataConfig()
1349 self.data_config = DataConfig()
1347 self.data_config.check_ambig = checkambig
1350 self.data_config.check_ambig = checkambig
1348 self.data_config.mmap_large_index = mmaplargeindex
1351 self.data_config.mmap_large_index = mmaplargeindex
1349 if b'delta-config' in self.opener.options:
1352 if b'delta-config' in self.opener.options:
1350 self.delta_config = self.opener.options[b'delta-config'].copy()
1353 self.delta_config = self.opener.options[b'delta-config'].copy()
1351 else:
1354 else:
1352 self.delta_config = DeltaConfig()
1355 self.delta_config = DeltaConfig()
1353 self.delta_config.upper_bound_comp = upperboundcomp
1356 self.delta_config.upper_bound_comp = upperboundcomp
1354
1357
1355 # Maps rev to chain base rev.
1358 # Maps rev to chain base rev.
1356 self._chainbasecache = util.lrucachedict(100)
1359 self._chainbasecache = util.lrucachedict(100)
1357
1360
1358 self.index = None
1361 self.index = None
1359 self._docket = None
1362 self._docket = None
1360 self._nodemap_docket = None
1363 self._nodemap_docket = None
1361 # Mapping of partial identifiers to full nodes.
1364 # Mapping of partial identifiers to full nodes.
1362 self._pcache = {}
1365 self._pcache = {}
1363
1366
1364 # other optionnals features
1367 # other optionnals features
1365
1368
1366 # Make copy of flag processors so each revlog instance can support
1369 # Make copy of flag processors so each revlog instance can support
1367 # custom flags.
1370 # custom flags.
1368 self._flagprocessors = dict(flagutil.flagprocessors)
1371 self._flagprocessors = dict(flagutil.flagprocessors)
1369 # prevent nesting of addgroup
1372 # prevent nesting of addgroup
1370 self._adding_group = None
1373 self._adding_group = None
1371
1374
1372 chunk_cache = self._loadindex()
1375 chunk_cache = self._loadindex()
1373 self._load_inner(chunk_cache)
1376 self._load_inner(chunk_cache)
1374 self._concurrencychecker = concurrencychecker
1377 self._concurrencychecker = concurrencychecker
1375
1378
1376 @property
1379 @property
1377 def _generaldelta(self):
1380 def _generaldelta(self):
1378 """temporary compatibility proxy"""
1381 """temporary compatibility proxy"""
1379 util.nouideprecwarn(
1382 util.nouideprecwarn(
1380 b"use revlog.delta_config.general_delta", b"6.6", stacklevel=2
1383 b"use revlog.delta_config.general_delta", b"6.6", stacklevel=2
1381 )
1384 )
1382 return self.delta_config.general_delta
1385 return self.delta_config.general_delta
1383
1386
1384 @property
1387 @property
1385 def _checkambig(self):
1388 def _checkambig(self):
1386 """temporary compatibility proxy"""
1389 """temporary compatibility proxy"""
1387 util.nouideprecwarn(
1390 util.nouideprecwarn(
1388 b"use revlog.data_config.checkambig", b"6.6", stacklevel=2
1391 b"use revlog.data_config.checkambig", b"6.6", stacklevel=2
1389 )
1392 )
1390 return self.data_config.check_ambig
1393 return self.data_config.check_ambig
1391
1394
1392 @property
1395 @property
1393 def _mmaplargeindex(self):
1396 def _mmaplargeindex(self):
1394 """temporary compatibility proxy"""
1397 """temporary compatibility proxy"""
1395 util.nouideprecwarn(
1398 util.nouideprecwarn(
1396 b"use revlog.data_config.mmap_large_index", b"6.6", stacklevel=2
1399 b"use revlog.data_config.mmap_large_index", b"6.6", stacklevel=2
1397 )
1400 )
1398 return self.data_config.mmap_large_index
1401 return self.data_config.mmap_large_index
1399
1402
1400 @property
1403 @property
1401 def _censorable(self):
1404 def _censorable(self):
1402 """temporary compatibility proxy"""
1405 """temporary compatibility proxy"""
1403 util.nouideprecwarn(
1406 util.nouideprecwarn(
1404 b"use revlog.feature_config.censorable", b"6.6", stacklevel=2
1407 b"use revlog.feature_config.censorable", b"6.6", stacklevel=2
1405 )
1408 )
1406 return self.feature_config.censorable
1409 return self.feature_config.censorable
1407
1410
1408 @property
1411 @property
1409 def _chunkcachesize(self):
1412 def _chunkcachesize(self):
1410 """temporary compatibility proxy"""
1413 """temporary compatibility proxy"""
1411 util.nouideprecwarn(
1414 util.nouideprecwarn(
1412 b"use revlog.data_config.chunk_cache_size", b"6.6", stacklevel=2
1415 b"use revlog.data_config.chunk_cache_size", b"6.6", stacklevel=2
1413 )
1416 )
1414 return self.data_config.chunk_cache_size
1417 return self.data_config.chunk_cache_size
1415
1418
1416 @property
1419 @property
1417 def _maxchainlen(self):
1420 def _maxchainlen(self):
1418 """temporary compatibility proxy"""
1421 """temporary compatibility proxy"""
1419 util.nouideprecwarn(
1422 util.nouideprecwarn(
1420 b"use revlog.delta_config.max_chain_len", b"6.6", stacklevel=2
1423 b"use revlog.delta_config.max_chain_len", b"6.6", stacklevel=2
1421 )
1424 )
1422 return self.delta_config.max_chain_len
1425 return self.delta_config.max_chain_len
1423
1426
1424 @property
1427 @property
1425 def _deltabothparents(self):
1428 def _deltabothparents(self):
1426 """temporary compatibility proxy"""
1429 """temporary compatibility proxy"""
1427 util.nouideprecwarn(
1430 util.nouideprecwarn(
1428 b"use revlog.delta_config.delta_both_parents", b"6.6", stacklevel=2
1431 b"use revlog.delta_config.delta_both_parents", b"6.6", stacklevel=2
1429 )
1432 )
1430 return self.delta_config.delta_both_parents
1433 return self.delta_config.delta_both_parents
1431
1434
1432 @property
1435 @property
1433 def _candidate_group_chunk_size(self):
1436 def _candidate_group_chunk_size(self):
1434 """temporary compatibility proxy"""
1437 """temporary compatibility proxy"""
1435 util.nouideprecwarn(
1438 util.nouideprecwarn(
1436 b"use revlog.delta_config.candidate_group_chunk_size",
1439 b"use revlog.delta_config.candidate_group_chunk_size",
1437 b"6.6",
1440 b"6.6",
1438 stacklevel=2,
1441 stacklevel=2,
1439 )
1442 )
1440 return self.delta_config.candidate_group_chunk_size
1443 return self.delta_config.candidate_group_chunk_size
1441
1444
1442 @property
1445 @property
1443 def _debug_delta(self):
1446 def _debug_delta(self):
1444 """temporary compatibility proxy"""
1447 """temporary compatibility proxy"""
1445 util.nouideprecwarn(
1448 util.nouideprecwarn(
1446 b"use revlog.delta_config.debug_delta", b"6.6", stacklevel=2
1449 b"use revlog.delta_config.debug_delta", b"6.6", stacklevel=2
1447 )
1450 )
1448 return self.delta_config.debug_delta
1451 return self.delta_config.debug_delta
1449
1452
1450 @property
1453 @property
1451 def _compengine(self):
1454 def _compengine(self):
1452 """temporary compatibility proxy"""
1455 """temporary compatibility proxy"""
1453 util.nouideprecwarn(
1456 util.nouideprecwarn(
1454 b"use revlog.feature_config.compression_engine",
1457 b"use revlog.feature_config.compression_engine",
1455 b"6.6",
1458 b"6.6",
1456 stacklevel=2,
1459 stacklevel=2,
1457 )
1460 )
1458 return self.feature_config.compression_engine
1461 return self.feature_config.compression_engine
1459
1462
1460 @property
1463 @property
1461 def upperboundcomp(self):
1464 def upperboundcomp(self):
1462 """temporary compatibility proxy"""
1465 """temporary compatibility proxy"""
1463 util.nouideprecwarn(
1466 util.nouideprecwarn(
1464 b"use revlog.delta_config.upper_bound_comp",
1467 b"use revlog.delta_config.upper_bound_comp",
1465 b"6.6",
1468 b"6.6",
1466 stacklevel=2,
1469 stacklevel=2,
1467 )
1470 )
1468 return self.delta_config.upper_bound_comp
1471 return self.delta_config.upper_bound_comp
1469
1472
1470 @property
1473 @property
1471 def _compengineopts(self):
1474 def _compengineopts(self):
1472 """temporary compatibility proxy"""
1475 """temporary compatibility proxy"""
1473 util.nouideprecwarn(
1476 util.nouideprecwarn(
1474 b"use revlog.feature_config.compression_engine_options",
1477 b"use revlog.feature_config.compression_engine_options",
1475 b"6.6",
1478 b"6.6",
1476 stacklevel=2,
1479 stacklevel=2,
1477 )
1480 )
1478 return self.feature_config.compression_engine_options
1481 return self.feature_config.compression_engine_options
1479
1482
1480 @property
1483 @property
1481 def _maxdeltachainspan(self):
1484 def _maxdeltachainspan(self):
1482 """temporary compatibility proxy"""
1485 """temporary compatibility proxy"""
1483 util.nouideprecwarn(
1486 util.nouideprecwarn(
1484 b"use revlog.delta_config.max_deltachain_span", b"6.6", stacklevel=2
1487 b"use revlog.delta_config.max_deltachain_span", b"6.6", stacklevel=2
1485 )
1488 )
1486 return self.delta_config.max_deltachain_span
1489 return self.delta_config.max_deltachain_span
1487
1490
1488 @property
1491 @property
1489 def _withsparseread(self):
1492 def _withsparseread(self):
1490 """temporary compatibility proxy"""
1493 """temporary compatibility proxy"""
1491 util.nouideprecwarn(
1494 util.nouideprecwarn(
1492 b"use revlog.data_config.with_sparse_read", b"6.6", stacklevel=2
1495 b"use revlog.data_config.with_sparse_read", b"6.6", stacklevel=2
1493 )
1496 )
1494 return self.data_config.with_sparse_read
1497 return self.data_config.with_sparse_read
1495
1498
1496 @property
1499 @property
1497 def _sparserevlog(self):
1500 def _sparserevlog(self):
1498 """temporary compatibility proxy"""
1501 """temporary compatibility proxy"""
1499 util.nouideprecwarn(
1502 util.nouideprecwarn(
1500 b"use revlog.delta_config.sparse_revlog", b"6.6", stacklevel=2
1503 b"use revlog.delta_config.sparse_revlog", b"6.6", stacklevel=2
1501 )
1504 )
1502 return self.delta_config.sparse_revlog
1505 return self.delta_config.sparse_revlog
1503
1506
1504 @property
1507 @property
1505 def hassidedata(self):
1508 def hassidedata(self):
1506 """temporary compatibility proxy"""
1509 """temporary compatibility proxy"""
1507 util.nouideprecwarn(
1510 util.nouideprecwarn(
1508 b"use revlog.feature_config.has_side_data", b"6.6", stacklevel=2
1511 b"use revlog.feature_config.has_side_data", b"6.6", stacklevel=2
1509 )
1512 )
1510 return self.feature_config.has_side_data
1513 return self.feature_config.has_side_data
1511
1514
1512 @property
1515 @property
1513 def _srdensitythreshold(self):
1516 def _srdensitythreshold(self):
1514 """temporary compatibility proxy"""
1517 """temporary compatibility proxy"""
1515 util.nouideprecwarn(
1518 util.nouideprecwarn(
1516 b"use revlog.data_config.sr_density_threshold",
1519 b"use revlog.data_config.sr_density_threshold",
1517 b"6.6",
1520 b"6.6",
1518 stacklevel=2,
1521 stacklevel=2,
1519 )
1522 )
1520 return self.data_config.sr_density_threshold
1523 return self.data_config.sr_density_threshold
1521
1524
1522 @property
1525 @property
1523 def _srmingapsize(self):
1526 def _srmingapsize(self):
1524 """temporary compatibility proxy"""
1527 """temporary compatibility proxy"""
1525 util.nouideprecwarn(
1528 util.nouideprecwarn(
1526 b"use revlog.data_config.sr_min_gap_size", b"6.6", stacklevel=2
1529 b"use revlog.data_config.sr_min_gap_size", b"6.6", stacklevel=2
1527 )
1530 )
1528 return self.data_config.sr_min_gap_size
1531 return self.data_config.sr_min_gap_size
1529
1532
1530 @property
1533 @property
1531 def _compute_rank(self):
1534 def _compute_rank(self):
1532 """temporary compatibility proxy"""
1535 """temporary compatibility proxy"""
1533 util.nouideprecwarn(
1536 util.nouideprecwarn(
1534 b"use revlog.feature_config.compute_rank", b"6.6", stacklevel=2
1537 b"use revlog.feature_config.compute_rank", b"6.6", stacklevel=2
1535 )
1538 )
1536 return self.feature_config.compute_rank
1539 return self.feature_config.compute_rank
1537
1540
1538 @property
1541 @property
1539 def canonical_parent_order(self):
1542 def canonical_parent_order(self):
1540 """temporary compatibility proxy"""
1543 """temporary compatibility proxy"""
1541 util.nouideprecwarn(
1544 util.nouideprecwarn(
1542 b"use revlog.feature_config.canonical_parent_order",
1545 b"use revlog.feature_config.canonical_parent_order",
1543 b"6.6",
1546 b"6.6",
1544 stacklevel=2,
1547 stacklevel=2,
1545 )
1548 )
1546 return self.feature_config.canonical_parent_order
1549 return self.feature_config.canonical_parent_order
1547
1550
1548 @property
1551 @property
1549 def _lazydelta(self):
1552 def _lazydelta(self):
1550 """temporary compatibility proxy"""
1553 """temporary compatibility proxy"""
1551 util.nouideprecwarn(
1554 util.nouideprecwarn(
1552 b"use revlog.delta_config.lazy_delta", b"6.6", stacklevel=2
1555 b"use revlog.delta_config.lazy_delta", b"6.6", stacklevel=2
1553 )
1556 )
1554 return self.delta_config.lazy_delta
1557 return self.delta_config.lazy_delta
1555
1558
1556 @property
1559 @property
1557 def _lazydeltabase(self):
1560 def _lazydeltabase(self):
1558 """temporary compatibility proxy"""
1561 """temporary compatibility proxy"""
1559 util.nouideprecwarn(
1562 util.nouideprecwarn(
1560 b"use revlog.delta_config.lazy_delta_base", b"6.6", stacklevel=2
1563 b"use revlog.delta_config.lazy_delta_base", b"6.6", stacklevel=2
1561 )
1564 )
1562 return self.delta_config.lazy_delta_base
1565 return self.delta_config.lazy_delta_base
1563
1566
1564 def _init_opts(self):
1567 def _init_opts(self):
1565 """process options (from above/config) to setup associated default revlog mode
1568 """process options (from above/config) to setup associated default revlog mode
1566
1569
1567 These values might be affected when actually reading on disk information.
1570 These values might be affected when actually reading on disk information.
1568
1571
1569 The relevant values are returned for use in _loadindex().
1572 The relevant values are returned for use in _loadindex().
1570
1573
1571 * newversionflags:
1574 * newversionflags:
1572 version header to use if we need to create a new revlog
1575 version header to use if we need to create a new revlog
1573
1576
1574 * mmapindexthreshold:
1577 * mmapindexthreshold:
1575 minimal index size for start to use mmap
1578 minimal index size for start to use mmap
1576
1579
1577 * force_nodemap:
1580 * force_nodemap:
1578 force the usage of a "development" version of the nodemap code
1581 force the usage of a "development" version of the nodemap code
1579 """
1582 """
1580 opts = self.opener.options
1583 opts = self.opener.options
1581
1584
1582 if b'changelogv2' in opts and self.revlog_kind == KIND_CHANGELOG:
1585 if b'changelogv2' in opts and self.revlog_kind == KIND_CHANGELOG:
1583 new_header = CHANGELOGV2
1586 new_header = CHANGELOGV2
1584 compute_rank = opts.get(b'changelogv2.compute-rank', True)
1587 compute_rank = opts.get(b'changelogv2.compute-rank', True)
1585 self.feature_config.compute_rank = compute_rank
1588 self.feature_config.compute_rank = compute_rank
1586 elif b'revlogv2' in opts:
1589 elif b'revlogv2' in opts:
1587 new_header = REVLOGV2
1590 new_header = REVLOGV2
1588 elif b'revlogv1' in opts:
1591 elif b'revlogv1' in opts:
1589 new_header = REVLOGV1 | FLAG_INLINE_DATA
1592 new_header = REVLOGV1 | FLAG_INLINE_DATA
1590 if b'generaldelta' in opts:
1593 if b'generaldelta' in opts:
1591 new_header |= FLAG_GENERALDELTA
1594 new_header |= FLAG_GENERALDELTA
1592 elif b'revlogv0' in self.opener.options:
1595 elif b'revlogv0' in self.opener.options:
1593 new_header = REVLOGV0
1596 new_header = REVLOGV0
1594 else:
1597 else:
1595 new_header = REVLOG_DEFAULT_VERSION
1598 new_header = REVLOG_DEFAULT_VERSION
1596
1599
1597 mmapindexthreshold = None
1600 mmapindexthreshold = None
1598 if self.data_config.mmap_large_index:
1601 if self.data_config.mmap_large_index:
1599 mmapindexthreshold = self.data_config.mmap_index_threshold
1602 mmapindexthreshold = self.data_config.mmap_index_threshold
1600 if self.feature_config.enable_ellipsis:
1603 if self.feature_config.enable_ellipsis:
1601 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor
1604 self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor
1602
1605
1603 # revlog v0 doesn't have flag processors
1606 # revlog v0 doesn't have flag processors
1604 for flag, processor in opts.get(b'flagprocessors', {}).items():
1607 for flag, processor in opts.get(b'flagprocessors', {}).items():
1605 flagutil.insertflagprocessor(flag, processor, self._flagprocessors)
1608 flagutil.insertflagprocessor(flag, processor, self._flagprocessors)
1606
1609
1607 chunk_cache_size = self.data_config.chunk_cache_size
1610 chunk_cache_size = self.data_config.chunk_cache_size
1608 if chunk_cache_size <= 0:
1611 if chunk_cache_size <= 0:
1609 raise error.RevlogError(
1612 raise error.RevlogError(
1610 _(b'revlog chunk cache size %r is not greater than 0')
1613 _(b'revlog chunk cache size %r is not greater than 0')
1611 % chunk_cache_size
1614 % chunk_cache_size
1612 )
1615 )
1613 elif chunk_cache_size & (chunk_cache_size - 1):
1616 elif chunk_cache_size & (chunk_cache_size - 1):
1614 raise error.RevlogError(
1617 raise error.RevlogError(
1615 _(b'revlog chunk cache size %r is not a power of 2')
1618 _(b'revlog chunk cache size %r is not a power of 2')
1616 % chunk_cache_size
1619 % chunk_cache_size
1617 )
1620 )
1618 force_nodemap = opts.get(b'devel-force-nodemap', False)
1621 force_nodemap = opts.get(b'devel-force-nodemap', False)
1619 return new_header, mmapindexthreshold, force_nodemap
1622 return new_header, mmapindexthreshold, force_nodemap
1620
1623
1621 def _get_data(self, filepath, mmap_threshold, size=None):
1624 def _get_data(self, filepath, mmap_threshold, size=None):
1622 """return a file content with or without mmap
1625 """return a file content with or without mmap
1623
1626
1624 If the file is missing return the empty string"""
1627 If the file is missing return the empty string"""
1625 try:
1628 try:
1626 with self.opener(filepath) as fp:
1629 with self.opener(filepath) as fp:
1627 if mmap_threshold is not None:
1630 if mmap_threshold is not None:
1628 file_size = self.opener.fstat(fp).st_size
1631 file_size = self.opener.fstat(fp).st_size
1629 if file_size >= mmap_threshold:
1632 if file_size >= mmap_threshold:
1630 if size is not None:
1633 if size is not None:
1631 # avoid potentiel mmap crash
1634 # avoid potentiel mmap crash
1632 size = min(file_size, size)
1635 size = min(file_size, size)
1633 # TODO: should .close() to release resources without
1636 # TODO: should .close() to release resources without
1634 # relying on Python GC
1637 # relying on Python GC
1635 if size is None:
1638 if size is None:
1636 return util.buffer(util.mmapread(fp))
1639 return util.buffer(util.mmapread(fp))
1637 else:
1640 else:
1638 return util.buffer(util.mmapread(fp, size))
1641 return util.buffer(util.mmapread(fp, size))
1639 if size is None:
1642 if size is None:
1640 return fp.read()
1643 return fp.read()
1641 else:
1644 else:
1642 return fp.read(size)
1645 return fp.read(size)
1643 except FileNotFoundError:
1646 except FileNotFoundError:
1644 return b''
1647 return b''
1645
1648
1646 def get_streams(self, max_linkrev, force_inline=False):
1649 def get_streams(self, max_linkrev, force_inline=False):
1647 """return a list of streams that represent this revlog
1650 """return a list of streams that represent this revlog
1648
1651
1649 This is used by stream-clone to do bytes to bytes copies of a repository.
1652 This is used by stream-clone to do bytes to bytes copies of a repository.
1650
1653
1651 This streams data for all revisions that refer to a changelog revision up
1654 This streams data for all revisions that refer to a changelog revision up
1652 to `max_linkrev`.
1655 to `max_linkrev`.
1653
1656
1654 If `force_inline` is set, it enforces that the stream will represent an inline revlog.
1657 If `force_inline` is set, it enforces that the stream will represent an inline revlog.
1655
1658
1656 It returns is a list of three-tuple:
1659 It returns is a list of three-tuple:
1657
1660
1658 [
1661 [
1659 (filename, bytes_stream, stream_size),
1662 (filename, bytes_stream, stream_size),
1660
1663
1661 ]
1664 ]
1662 """
1665 """
1663 n = len(self)
1666 n = len(self)
1664 index = self.index
1667 index = self.index
1665 while n > 0:
1668 while n > 0:
1666 linkrev = index[n - 1][4]
1669 linkrev = index[n - 1][4]
1667 if linkrev < max_linkrev:
1670 if linkrev < max_linkrev:
1668 break
1671 break
1669 # note: this loop will rarely go through multiple iterations, since
1672 # note: this loop will rarely go through multiple iterations, since
1670 # it only traverses commits created during the current streaming
1673 # it only traverses commits created during the current streaming
1671 # pull operation.
1674 # pull operation.
1672 #
1675 #
1673 # If this become a problem, using a binary search should cap the
1676 # If this become a problem, using a binary search should cap the
1674 # runtime of this.
1677 # runtime of this.
1675 n = n - 1
1678 n = n - 1
1676 if n == 0:
1679 if n == 0:
1677 # no data to send
1680 # no data to send
1678 return []
1681 return []
1679 index_size = n * index.entry_size
1682 index_size = n * index.entry_size
1680 data_size = self.end(n - 1)
1683 data_size = self.end(n - 1)
1681
1684
1682 # XXX we might have been split (or stripped) since the object
1685 # XXX we might have been split (or stripped) since the object
1683 # initialization, We need to close this race too, but having a way to
1686 # initialization, We need to close this race too, but having a way to
1684 # pre-open the file we feed to the revlog and never closing them before
1687 # pre-open the file we feed to the revlog and never closing them before
1685 # we are done streaming.
1688 # we are done streaming.
1686
1689
1687 if self._inline:
1690 if self._inline:
1688
1691
1689 def get_stream():
1692 def get_stream():
1690 with self.opener(self._indexfile, mode=b"r") as fp:
1693 with self.opener(self._indexfile, mode=b"r") as fp:
1691 yield None
1694 yield None
1692 size = index_size + data_size
1695 size = index_size + data_size
1693 if size <= 65536:
1696 if size <= 65536:
1694 yield fp.read(size)
1697 yield fp.read(size)
1695 else:
1698 else:
1696 yield from util.filechunkiter(fp, limit=size)
1699 yield from util.filechunkiter(fp, limit=size)
1697
1700
1698 inline_stream = get_stream()
1701 inline_stream = get_stream()
1699 next(inline_stream)
1702 next(inline_stream)
1700 return [
1703 return [
1701 (self._indexfile, inline_stream, index_size + data_size),
1704 (self._indexfile, inline_stream, index_size + data_size),
1702 ]
1705 ]
1703 elif force_inline:
1706 elif force_inline:
1704
1707
1705 def get_stream():
1708 def get_stream():
1706 with self.reading():
1709 with self.reading():
1707 yield None
1710 yield None
1708
1711
1709 for rev in range(n):
1712 for rev in range(n):
1710 idx = self.index.entry_binary(rev)
1713 idx = self.index.entry_binary(rev)
1711 if rev == 0 and self._docket is None:
1714 if rev == 0 and self._docket is None:
1712 # re-inject the inline flag
1715 # re-inject the inline flag
1713 header = self._format_flags
1716 header = self._format_flags
1714 header |= self._format_version
1717 header |= self._format_version
1715 header |= FLAG_INLINE_DATA
1718 header |= FLAG_INLINE_DATA
1716 header = self.index.pack_header(header)
1719 header = self.index.pack_header(header)
1717 idx = header + idx
1720 idx = header + idx
1718 yield idx
1721 yield idx
1719 yield self._inner.get_segment_for_revs(rev, rev)[1]
1722 yield self._inner.get_segment_for_revs(rev, rev)[1]
1720
1723
1721 inline_stream = get_stream()
1724 inline_stream = get_stream()
1722 next(inline_stream)
1725 next(inline_stream)
1723 return [
1726 return [
1724 (self._indexfile, inline_stream, index_size + data_size),
1727 (self._indexfile, inline_stream, index_size + data_size),
1725 ]
1728 ]
1726 else:
1729 else:
1727
1730
1728 def get_index_stream():
1731 def get_index_stream():
1729 with self.opener(self._indexfile, mode=b"r") as fp:
1732 with self.opener(self._indexfile, mode=b"r") as fp:
1730 yield None
1733 yield None
1731 if index_size <= 65536:
1734 if index_size <= 65536:
1732 yield fp.read(index_size)
1735 yield fp.read(index_size)
1733 else:
1736 else:
1734 yield from util.filechunkiter(fp, limit=index_size)
1737 yield from util.filechunkiter(fp, limit=index_size)
1735
1738
1736 def get_data_stream():
1739 def get_data_stream():
1737 with self._datafp() as fp:
1740 with self._datafp() as fp:
1738 yield None
1741 yield None
1739 if data_size <= 65536:
1742 if data_size <= 65536:
1740 yield fp.read(data_size)
1743 yield fp.read(data_size)
1741 else:
1744 else:
1742 yield from util.filechunkiter(fp, limit=data_size)
1745 yield from util.filechunkiter(fp, limit=data_size)
1743
1746
1744 index_stream = get_index_stream()
1747 index_stream = get_index_stream()
1745 next(index_stream)
1748 next(index_stream)
1746 data_stream = get_data_stream()
1749 data_stream = get_data_stream()
1747 next(data_stream)
1750 next(data_stream)
1748 return [
1751 return [
1749 (self._datafile, data_stream, data_size),
1752 (self._datafile, data_stream, data_size),
1750 (self._indexfile, index_stream, index_size),
1753 (self._indexfile, index_stream, index_size),
1751 ]
1754 ]
1752
1755
1753 def _loadindex(self, docket=None):
1756 def _loadindex(self, docket=None):
1754
1757
1755 new_header, mmapindexthreshold, force_nodemap = self._init_opts()
1758 new_header, mmapindexthreshold, force_nodemap = self._init_opts()
1756
1759
1757 if self.postfix is not None:
1760 if self.postfix is not None:
1758 entry_point = b'%s.i.%s' % (self.radix, self.postfix)
1761 entry_point = b'%s.i.%s' % (self.radix, self.postfix)
1759 elif self._trypending and self.opener.exists(b'%s.i.a' % self.radix):
1762 elif self._trypending and self.opener.exists(b'%s.i.a' % self.radix):
1760 entry_point = b'%s.i.a' % self.radix
1763 entry_point = b'%s.i.a' % self.radix
1761 elif self._try_split and self.opener.exists(self._split_index_file):
1764 elif self._try_split and self.opener.exists(self._split_index_file):
1762 entry_point = self._split_index_file
1765 entry_point = self._split_index_file
1763 else:
1766 else:
1764 entry_point = b'%s.i' % self.radix
1767 entry_point = b'%s.i' % self.radix
1765
1768
1766 if docket is not None:
1769 if docket is not None:
1767 self._docket = docket
1770 self._docket = docket
1768 self._docket_file = entry_point
1771 self._docket_file = entry_point
1769 else:
1772 else:
1770 self._initempty = True
1773 self._initempty = True
1771 entry_data = self._get_data(entry_point, mmapindexthreshold)
1774 entry_data = self._get_data(entry_point, mmapindexthreshold)
1772 if len(entry_data) > 0:
1775 if len(entry_data) > 0:
1773 header = INDEX_HEADER.unpack(entry_data[:4])[0]
1776 header = INDEX_HEADER.unpack(entry_data[:4])[0]
1774 self._initempty = False
1777 self._initempty = False
1775 else:
1778 else:
1776 header = new_header
1779 header = new_header
1777
1780
1778 self._format_flags = header & ~0xFFFF
1781 self._format_flags = header & ~0xFFFF
1779 self._format_version = header & 0xFFFF
1782 self._format_version = header & 0xFFFF
1780
1783
1781 supported_flags = SUPPORTED_FLAGS.get(self._format_version)
1784 supported_flags = SUPPORTED_FLAGS.get(self._format_version)
1782 if supported_flags is None:
1785 if supported_flags is None:
1783 msg = _(b'unknown version (%d) in revlog %s')
1786 msg = _(b'unknown version (%d) in revlog %s')
1784 msg %= (self._format_version, self.display_id)
1787 msg %= (self._format_version, self.display_id)
1785 raise error.RevlogError(msg)
1788 raise error.RevlogError(msg)
1786 elif self._format_flags & ~supported_flags:
1789 elif self._format_flags & ~supported_flags:
1787 msg = _(b'unknown flags (%#04x) in version %d revlog %s')
1790 msg = _(b'unknown flags (%#04x) in version %d revlog %s')
1788 display_flag = self._format_flags >> 16
1791 display_flag = self._format_flags >> 16
1789 msg %= (display_flag, self._format_version, self.display_id)
1792 msg %= (display_flag, self._format_version, self.display_id)
1790 raise error.RevlogError(msg)
1793 raise error.RevlogError(msg)
1791
1794
1792 features = FEATURES_BY_VERSION[self._format_version]
1795 features = FEATURES_BY_VERSION[self._format_version]
1793 self._inline = features[b'inline'](self._format_flags)
1796 self._inline = features[b'inline'](self._format_flags)
1794 self.delta_config.general_delta = features[b'generaldelta'](
1797 self.delta_config.general_delta = features[b'generaldelta'](
1795 self._format_flags
1798 self._format_flags
1796 )
1799 )
1797 self.feature_config.has_side_data = features[b'sidedata']
1800 self.feature_config.has_side_data = features[b'sidedata']
1798
1801
1799 if not features[b'docket']:
1802 if not features[b'docket']:
1800 self._indexfile = entry_point
1803 self._indexfile = entry_point
1801 index_data = entry_data
1804 index_data = entry_data
1802 else:
1805 else:
1803 self._docket_file = entry_point
1806 self._docket_file = entry_point
1804 if self._initempty:
1807 if self._initempty:
1805 self._docket = docketutil.default_docket(self, header)
1808 self._docket = docketutil.default_docket(self, header)
1806 else:
1809 else:
1807 self._docket = docketutil.parse_docket(
1810 self._docket = docketutil.parse_docket(
1808 self, entry_data, use_pending=self._trypending
1811 self, entry_data, use_pending=self._trypending
1809 )
1812 )
1810
1813
1811 if self._docket is not None:
1814 if self._docket is not None:
1812 self._indexfile = self._docket.index_filepath()
1815 self._indexfile = self._docket.index_filepath()
1813 index_data = b''
1816 index_data = b''
1814 index_size = self._docket.index_end
1817 index_size = self._docket.index_end
1815 if index_size > 0:
1818 if index_size > 0:
1816 index_data = self._get_data(
1819 index_data = self._get_data(
1817 self._indexfile, mmapindexthreshold, size=index_size
1820 self._indexfile, mmapindexthreshold, size=index_size
1818 )
1821 )
1819 if len(index_data) < index_size:
1822 if len(index_data) < index_size:
1820 msg = _(b'too few index data for %s: got %d, expected %d')
1823 msg = _(b'too few index data for %s: got %d, expected %d')
1821 msg %= (self.display_id, len(index_data), index_size)
1824 msg %= (self.display_id, len(index_data), index_size)
1822 raise error.RevlogError(msg)
1825 raise error.RevlogError(msg)
1823
1826
1824 self._inline = False
1827 self._inline = False
1825 # generaldelta implied by version 2 revlogs.
1828 # generaldelta implied by version 2 revlogs.
1826 self.delta_config.general_delta = True
1829 self.delta_config.general_delta = True
1827 # the logic for persistent nodemap will be dealt with within the
1830 # the logic for persistent nodemap will be dealt with within the
1828 # main docket, so disable it for now.
1831 # main docket, so disable it for now.
1829 self._nodemap_file = None
1832 self._nodemap_file = None
1830
1833
1831 if self._docket is not None:
1834 if self._docket is not None:
1832 self._datafile = self._docket.data_filepath()
1835 self._datafile = self._docket.data_filepath()
1833 self._sidedatafile = self._docket.sidedata_filepath()
1836 self._sidedatafile = self._docket.sidedata_filepath()
1834 elif self.postfix is None:
1837 elif self.postfix is None:
1835 self._datafile = b'%s.d' % self.radix
1838 self._datafile = b'%s.d' % self.radix
1836 else:
1839 else:
1837 self._datafile = b'%s.d.%s' % (self.radix, self.postfix)
1840 self._datafile = b'%s.d.%s' % (self.radix, self.postfix)
1838
1841
1839 self.nodeconstants = sha1nodeconstants
1842 self.nodeconstants = sha1nodeconstants
1840 self.nullid = self.nodeconstants.nullid
1843 self.nullid = self.nodeconstants.nullid
1841
1844
1842 # sparse-revlog can't be on without general-delta (issue6056)
1845 # sparse-revlog can't be on without general-delta (issue6056)
1843 if not self.delta_config.general_delta:
1846 if not self.delta_config.general_delta:
1844 self.delta_config.sparse_revlog = False
1847 self.delta_config.sparse_revlog = False
1845
1848
1846 self._storedeltachains = True
1849 self._storedeltachains = True
1847
1850
1848 devel_nodemap = (
1851 devel_nodemap = (
1849 self._nodemap_file
1852 self._nodemap_file
1850 and force_nodemap
1853 and force_nodemap
1851 and parse_index_v1_nodemap is not None
1854 and parse_index_v1_nodemap is not None
1852 )
1855 )
1853
1856
1854 use_rust_index = False
1857 use_rust_index = False
1855 if rustrevlog is not None:
1858 if rustrevlog is not None:
1856 if self._nodemap_file is not None:
1859 if self._nodemap_file is not None:
1857 use_rust_index = True
1860 use_rust_index = True
1858 else:
1861 else:
1859 use_rust_index = self.opener.options.get(b'rust.index')
1862 use_rust_index = self.opener.options.get(b'rust.index')
1860
1863
1861 self._parse_index = parse_index_v1
1864 self._parse_index = parse_index_v1
1862 if self._format_version == REVLOGV0:
1865 if self._format_version == REVLOGV0:
1863 self._parse_index = revlogv0.parse_index_v0
1866 self._parse_index = revlogv0.parse_index_v0
1864 elif self._format_version == REVLOGV2:
1867 elif self._format_version == REVLOGV2:
1865 self._parse_index = parse_index_v2
1868 self._parse_index = parse_index_v2
1866 elif self._format_version == CHANGELOGV2:
1869 elif self._format_version == CHANGELOGV2:
1867 self._parse_index = parse_index_cl_v2
1870 self._parse_index = parse_index_cl_v2
1868 elif devel_nodemap:
1871 elif devel_nodemap:
1869 self._parse_index = parse_index_v1_nodemap
1872 self._parse_index = parse_index_v1_nodemap
1870 elif use_rust_index:
1873 elif use_rust_index:
1871 self._parse_index = parse_index_v1_mixed
1874 self._parse_index = parse_index_v1_mixed
1872 try:
1875 try:
1873 d = self._parse_index(index_data, self._inline)
1876 d = self._parse_index(index_data, self._inline)
1874 index, chunkcache = d
1877 index, chunkcache = d
1875 use_nodemap = (
1878 use_nodemap = (
1876 not self._inline
1879 not self._inline
1877 and self._nodemap_file is not None
1880 and self._nodemap_file is not None
1878 and hasattr(index, 'update_nodemap_data')
1881 and hasattr(index, 'update_nodemap_data')
1879 )
1882 )
1880 if use_nodemap:
1883 if use_nodemap:
1881 nodemap_data = nodemaputil.persisted_data(self)
1884 nodemap_data = nodemaputil.persisted_data(self)
1882 if nodemap_data is not None:
1885 if nodemap_data is not None:
1883 docket = nodemap_data[0]
1886 docket = nodemap_data[0]
1884 if (
1887 if (
1885 len(d[0]) > docket.tip_rev
1888 len(d[0]) > docket.tip_rev
1886 and d[0][docket.tip_rev][7] == docket.tip_node
1889 and d[0][docket.tip_rev][7] == docket.tip_node
1887 ):
1890 ):
1888 # no changelog tampering
1891 # no changelog tampering
1889 self._nodemap_docket = docket
1892 self._nodemap_docket = docket
1890 index.update_nodemap_data(*nodemap_data)
1893 index.update_nodemap_data(*nodemap_data)
1891 except (ValueError, IndexError):
1894 except (ValueError, IndexError):
1892 raise error.RevlogError(
1895 raise error.RevlogError(
1893 _(b"index %s is corrupted") % self.display_id
1896 _(b"index %s is corrupted") % self.display_id
1894 )
1897 )
1895 self.index = index
1898 self.index = index
1896 # revnum -> (chain-length, sum-delta-length)
1899 # revnum -> (chain-length, sum-delta-length)
1897 self._chaininfocache = util.lrucachedict(500)
1900 self._chaininfocache = util.lrucachedict(500)
1898
1901
1899 return chunkcache
1902 return chunkcache
1900
1903
1901 def _load_inner(self, chunk_cache):
1904 def _load_inner(self, chunk_cache):
1902 if self._docket is None:
1905 if self._docket is None:
1903 default_compression_header = None
1906 default_compression_header = None
1904 else:
1907 else:
1905 default_compression_header = self._docket.default_compression_header
1908 default_compression_header = self._docket.default_compression_header
1906
1909
1907 self._inner = _InnerRevlog(
1910 self._inner = _InnerRevlog(
1908 opener=self.opener,
1911 opener=self.opener,
1909 index=self.index,
1912 index=self.index,
1910 index_file=self._indexfile,
1913 index_file=self._indexfile,
1911 data_file=self._datafile,
1914 data_file=self._datafile,
1912 sidedata_file=self._sidedatafile,
1915 sidedata_file=self._sidedatafile,
1913 inline=self._inline,
1916 inline=self._inline,
1914 data_config=self.data_config,
1917 data_config=self.data_config,
1915 delta_config=self.delta_config,
1918 delta_config=self.delta_config,
1916 feature_config=self.feature_config,
1919 feature_config=self.feature_config,
1917 chunk_cache=chunk_cache,
1920 chunk_cache=chunk_cache,
1918 default_compression_header=default_compression_header,
1921 default_compression_header=default_compression_header,
1919 )
1922 )
1920
1923
1921 def get_revlog(self):
1924 def get_revlog(self):
1922 """simple function to mirror API of other not-really-revlog API"""
1925 """simple function to mirror API of other not-really-revlog API"""
1923 return self
1926 return self
1924
1927
1925 @util.propertycache
1928 @util.propertycache
1926 def revlog_kind(self):
1929 def revlog_kind(self):
1927 return self.target[0]
1930 return self.target[0]
1928
1931
1929 @util.propertycache
1932 @util.propertycache
1930 def display_id(self):
1933 def display_id(self):
1931 """The public facing "ID" of the revlog that we use in message"""
1934 """The public facing "ID" of the revlog that we use in message"""
1932 if self.revlog_kind == KIND_FILELOG:
1935 if self.revlog_kind == KIND_FILELOG:
1933 # Reference the file without the "data/" prefix, so it is familiar
1936 # Reference the file without the "data/" prefix, so it is familiar
1934 # to the user.
1937 # to the user.
1935 return self.target[1]
1938 return self.target[1]
1936 else:
1939 else:
1937 return self.radix
1940 return self.radix
1938
1941
1939 def _datafp(self, mode=b'r'):
1942 def _datafp(self, mode=b'r'):
1940 """file object for the revlog's data file"""
1943 """file object for the revlog's data file"""
1941 return self.opener(self._datafile, mode=mode)
1944 return self.opener(self._datafile, mode=mode)
1942
1945
1943 def tiprev(self):
1946 def tiprev(self):
1944 return len(self.index) - 1
1947 return len(self.index) - 1
1945
1948
1946 def tip(self):
1949 def tip(self):
1947 return self.node(self.tiprev())
1950 return self.node(self.tiprev())
1948
1951
1949 def __contains__(self, rev):
1952 def __contains__(self, rev):
1950 return 0 <= rev < len(self)
1953 return 0 <= rev < len(self)
1951
1954
1952 def __len__(self):
1955 def __len__(self):
1953 return len(self.index)
1956 return len(self.index)
1954
1957
1955 def __iter__(self):
1958 def __iter__(self):
1956 return iter(range(len(self)))
1959 return iter(range(len(self)))
1957
1960
1958 def revs(self, start=0, stop=None):
1961 def revs(self, start=0, stop=None):
1959 """iterate over all rev in this revlog (from start to stop)"""
1962 """iterate over all rev in this revlog (from start to stop)"""
1960 return storageutil.iterrevs(len(self), start=start, stop=stop)
1963 return storageutil.iterrevs(len(self), start=start, stop=stop)
1961
1964
1962 def hasnode(self, node):
1965 def hasnode(self, node):
1963 try:
1966 try:
1964 self.rev(node)
1967 self.rev(node)
1965 return True
1968 return True
1966 except KeyError:
1969 except KeyError:
1967 return False
1970 return False
1968
1971
1969 def _candelta(self, baserev, rev):
1972 def _candelta(self, baserev, rev):
1970 """whether two revisions (baserev, rev) can be delta-ed or not"""
1973 """whether two revisions (baserev, rev) can be delta-ed or not"""
1971 # Disable delta if either rev requires a content-changing flag
1974 # Disable delta if either rev requires a content-changing flag
1972 # processor (ex. LFS). This is because such flag processor can alter
1975 # processor (ex. LFS). This is because such flag processor can alter
1973 # the rawtext content that the delta will be based on, and two clients
1976 # the rawtext content that the delta will be based on, and two clients
1974 # could have a same revlog node with different flags (i.e. different
1977 # could have a same revlog node with different flags (i.e. different
1975 # rawtext contents) and the delta could be incompatible.
1978 # rawtext contents) and the delta could be incompatible.
1976 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or (
1979 if (self.flags(baserev) & REVIDX_RAWTEXT_CHANGING_FLAGS) or (
1977 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS
1980 self.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS
1978 ):
1981 ):
1979 return False
1982 return False
1980 return True
1983 return True
1981
1984
1982 def update_caches(self, transaction):
1985 def update_caches(self, transaction):
1983 """update on disk cache
1986 """update on disk cache
1984
1987
1985 If a transaction is passed, the update may be delayed to transaction
1988 If a transaction is passed, the update may be delayed to transaction
1986 commit."""
1989 commit."""
1987 if self._nodemap_file is not None:
1990 if self._nodemap_file is not None:
1988 if transaction is None:
1991 if transaction is None:
1989 nodemaputil.update_persistent_nodemap(self)
1992 nodemaputil.update_persistent_nodemap(self)
1990 else:
1993 else:
1991 nodemaputil.setup_persistent_nodemap(transaction, self)
1994 nodemaputil.setup_persistent_nodemap(transaction, self)
1992
1995
1993 def clearcaches(self):
1996 def clearcaches(self):
1994 """Clear in-memory caches"""
1997 """Clear in-memory caches"""
1995 self._chainbasecache.clear()
1998 self._chainbasecache.clear()
1996 self._inner.clear_cache()
1999 self._inner.clear_cache()
1997 self._pcache = {}
2000 self._pcache = {}
1998 self._nodemap_docket = None
2001 self._nodemap_docket = None
1999 self.index.clearcaches()
2002 self.index.clearcaches()
2000 # The python code is the one responsible for validating the docket, we
2003 # The python code is the one responsible for validating the docket, we
2001 # end up having to refresh it here.
2004 # end up having to refresh it here.
2002 use_nodemap = (
2005 use_nodemap = (
2003 not self._inline
2006 not self._inline
2004 and self._nodemap_file is not None
2007 and self._nodemap_file is not None
2005 and hasattr(self.index, 'update_nodemap_data')
2008 and hasattr(self.index, 'update_nodemap_data')
2006 )
2009 )
2007 if use_nodemap:
2010 if use_nodemap:
2008 nodemap_data = nodemaputil.persisted_data(self)
2011 nodemap_data = nodemaputil.persisted_data(self)
2009 if nodemap_data is not None:
2012 if nodemap_data is not None:
2010 self._nodemap_docket = nodemap_data[0]
2013 self._nodemap_docket = nodemap_data[0]
2011 self.index.update_nodemap_data(*nodemap_data)
2014 self.index.update_nodemap_data(*nodemap_data)
2012
2015
2013 def rev(self, node):
2016 def rev(self, node):
2014 """return the revision number associated with a <nodeid>"""
2017 """return the revision number associated with a <nodeid>"""
2015 try:
2018 try:
2016 return self.index.rev(node)
2019 return self.index.rev(node)
2017 except TypeError:
2020 except TypeError:
2018 raise
2021 raise
2019 except error.RevlogError:
2022 except error.RevlogError:
2020 # parsers.c radix tree lookup failed
2023 # parsers.c radix tree lookup failed
2021 if (
2024 if (
2022 node == self.nodeconstants.wdirid
2025 node == self.nodeconstants.wdirid
2023 or node in self.nodeconstants.wdirfilenodeids
2026 or node in self.nodeconstants.wdirfilenodeids
2024 ):
2027 ):
2025 raise error.WdirUnsupported
2028 raise error.WdirUnsupported
2026 raise error.LookupError(node, self.display_id, _(b'no node'))
2029 raise error.LookupError(node, self.display_id, _(b'no node'))
2027
2030
2028 # Accessors for index entries.
2031 # Accessors for index entries.
2029
2032
2030 # First tuple entry is 8 bytes. First 6 bytes are offset. Last 2 bytes
2033 # First tuple entry is 8 bytes. First 6 bytes are offset. Last 2 bytes
2031 # are flags.
2034 # are flags.
2032 def start(self, rev):
2035 def start(self, rev):
2033 return int(self.index[rev][0] >> 16)
2036 return int(self.index[rev][0] >> 16)
2034
2037
2035 def sidedata_cut_off(self, rev):
2038 def sidedata_cut_off(self, rev):
2036 sd_cut_off = self.index[rev][8]
2039 sd_cut_off = self.index[rev][8]
2037 if sd_cut_off != 0:
2040 if sd_cut_off != 0:
2038 return sd_cut_off
2041 return sd_cut_off
2039 # This is some annoying dance, because entries without sidedata
2042 # This is some annoying dance, because entries without sidedata
2040 # currently use 0 as their ofsset. (instead of previous-offset +
2043 # currently use 0 as their ofsset. (instead of previous-offset +
2041 # previous-size)
2044 # previous-size)
2042 #
2045 #
2043 # We should reconsider this sidedata → 0 sidata_offset policy.
2046 # We should reconsider this sidedata → 0 sidata_offset policy.
2044 # In the meantime, we need this.
2047 # In the meantime, we need this.
2045 while 0 <= rev:
2048 while 0 <= rev:
2046 e = self.index[rev]
2049 e = self.index[rev]
2047 if e[9] != 0:
2050 if e[9] != 0:
2048 return e[8] + e[9]
2051 return e[8] + e[9]
2049 rev -= 1
2052 rev -= 1
2050 return 0
2053 return 0
2051
2054
2052 def flags(self, rev):
2055 def flags(self, rev):
2053 return self.index[rev][0] & 0xFFFF
2056 return self.index[rev][0] & 0xFFFF
2054
2057
2055 def length(self, rev):
2058 def length(self, rev):
2056 return self.index[rev][1]
2059 return self.index[rev][1]
2057
2060
2058 def sidedata_length(self, rev):
2061 def sidedata_length(self, rev):
2059 if not self.feature_config.has_side_data:
2062 if not self.feature_config.has_side_data:
2060 return 0
2063 return 0
2061 return self.index[rev][9]
2064 return self.index[rev][9]
2062
2065
2063 def rawsize(self, rev):
2066 def rawsize(self, rev):
2064 """return the length of the uncompressed text for a given revision"""
2067 """return the length of the uncompressed text for a given revision"""
2065 l = self.index[rev][2]
2068 l = self.index[rev][2]
2066 if l >= 0:
2069 if l >= 0:
2067 return l
2070 return l
2068
2071
2069 t = self.rawdata(rev)
2072 t = self.rawdata(rev)
2070 return len(t)
2073 return len(t)
2071
2074
2072 def size(self, rev):
2075 def size(self, rev):
2073 """length of non-raw text (processed by a "read" flag processor)"""
2076 """length of non-raw text (processed by a "read" flag processor)"""
2074 # fast path: if no "read" flag processor could change the content,
2077 # fast path: if no "read" flag processor could change the content,
2075 # size is rawsize. note: ELLIPSIS is known to not change the content.
2078 # size is rawsize. note: ELLIPSIS is known to not change the content.
2076 flags = self.flags(rev)
2079 flags = self.flags(rev)
2077 if flags & (flagutil.REVIDX_KNOWN_FLAGS ^ REVIDX_ELLIPSIS) == 0:
2080 if flags & (flagutil.REVIDX_KNOWN_FLAGS ^ REVIDX_ELLIPSIS) == 0:
2078 return self.rawsize(rev)
2081 return self.rawsize(rev)
2079
2082
2080 return len(self.revision(rev))
2083 return len(self.revision(rev))
2081
2084
2082 def fast_rank(self, rev):
2085 def fast_rank(self, rev):
2083 """Return the rank of a revision if already known, or None otherwise.
2086 """Return the rank of a revision if already known, or None otherwise.
2084
2087
2085 The rank of a revision is the size of the sub-graph it defines as a
2088 The rank of a revision is the size of the sub-graph it defines as a
2086 head. Equivalently, the rank of a revision `r` is the size of the set
2089 head. Equivalently, the rank of a revision `r` is the size of the set
2087 `ancestors(r)`, `r` included.
2090 `ancestors(r)`, `r` included.
2088
2091
2089 This method returns the rank retrieved from the revlog in constant
2092 This method returns the rank retrieved from the revlog in constant
2090 time. It makes no attempt at computing unknown values for versions of
2093 time. It makes no attempt at computing unknown values for versions of
2091 the revlog which do not persist the rank.
2094 the revlog which do not persist the rank.
2092 """
2095 """
2093 rank = self.index[rev][ENTRY_RANK]
2096 rank = self.index[rev][ENTRY_RANK]
2094 if self._format_version != CHANGELOGV2 or rank == RANK_UNKNOWN:
2097 if self._format_version != CHANGELOGV2 or rank == RANK_UNKNOWN:
2095 return None
2098 return None
2096 if rev == nullrev:
2099 if rev == nullrev:
2097 return 0 # convention
2100 return 0 # convention
2098 return rank
2101 return rank
2099
2102
2100 def chainbase(self, rev):
2103 def chainbase(self, rev):
2101 base = self._chainbasecache.get(rev)
2104 base = self._chainbasecache.get(rev)
2102 if base is not None:
2105 if base is not None:
2103 return base
2106 return base
2104
2107
2105 index = self.index
2108 index = self.index
2106 iterrev = rev
2109 iterrev = rev
2107 base = index[iterrev][3]
2110 base = index[iterrev][3]
2108 while base != iterrev:
2111 while base != iterrev:
2109 iterrev = base
2112 iterrev = base
2110 base = index[iterrev][3]
2113 base = index[iterrev][3]
2111
2114
2112 self._chainbasecache[rev] = base
2115 self._chainbasecache[rev] = base
2113 return base
2116 return base
2114
2117
2115 def linkrev(self, rev):
2118 def linkrev(self, rev):
2116 return self.index[rev][4]
2119 return self.index[rev][4]
2117
2120
2118 def parentrevs(self, rev):
2121 def parentrevs(self, rev):
2119 try:
2122 try:
2120 entry = self.index[rev]
2123 entry = self.index[rev]
2121 except IndexError:
2124 except IndexError:
2122 if rev == wdirrev:
2125 if rev == wdirrev:
2123 raise error.WdirUnsupported
2126 raise error.WdirUnsupported
2124 raise
2127 raise
2125
2128
2126 if self.feature_config.canonical_parent_order and entry[5] == nullrev:
2129 if self.feature_config.canonical_parent_order and entry[5] == nullrev:
2127 return entry[6], entry[5]
2130 return entry[6], entry[5]
2128 else:
2131 else:
2129 return entry[5], entry[6]
2132 return entry[5], entry[6]
2130
2133
2131 # fast parentrevs(rev) where rev isn't filtered
2134 # fast parentrevs(rev) where rev isn't filtered
2132 _uncheckedparentrevs = parentrevs
2135 _uncheckedparentrevs = parentrevs
2133
2136
2134 def node(self, rev):
2137 def node(self, rev):
2135 try:
2138 try:
2136 return self.index[rev][7]
2139 return self.index[rev][7]
2137 except IndexError:
2140 except IndexError:
2138 if rev == wdirrev:
2141 if rev == wdirrev:
2139 raise error.WdirUnsupported
2142 raise error.WdirUnsupported
2140 raise
2143 raise
2141
2144
2142 # Derived from index values.
2145 # Derived from index values.
2143
2146
2144 def end(self, rev):
2147 def end(self, rev):
2145 return self.start(rev) + self.length(rev)
2148 return self.start(rev) + self.length(rev)
2146
2149
2147 def parents(self, node):
2150 def parents(self, node):
2148 i = self.index
2151 i = self.index
2149 d = i[self.rev(node)]
2152 d = i[self.rev(node)]
2150 # inline node() to avoid function call overhead
2153 # inline node() to avoid function call overhead
2151 if self.feature_config.canonical_parent_order and d[5] == self.nullid:
2154 if self.feature_config.canonical_parent_order and d[5] == self.nullid:
2152 return i[d[6]][7], i[d[5]][7]
2155 return i[d[6]][7], i[d[5]][7]
2153 else:
2156 else:
2154 return i[d[5]][7], i[d[6]][7]
2157 return i[d[5]][7], i[d[6]][7]
2155
2158
2156 def chainlen(self, rev):
2159 def chainlen(self, rev):
2157 return self._chaininfo(rev)[0]
2160 return self._chaininfo(rev)[0]
2158
2161
2159 def _chaininfo(self, rev):
2162 def _chaininfo(self, rev):
2160 chaininfocache = self._chaininfocache
2163 chaininfocache = self._chaininfocache
2161 if rev in chaininfocache:
2164 if rev in chaininfocache:
2162 return chaininfocache[rev]
2165 return chaininfocache[rev]
2163 index = self.index
2166 index = self.index
2164 generaldelta = self.delta_config.general_delta
2167 generaldelta = self.delta_config.general_delta
2165 iterrev = rev
2168 iterrev = rev
2166 e = index[iterrev]
2169 e = index[iterrev]
2167 clen = 0
2170 clen = 0
2168 compresseddeltalen = 0
2171 compresseddeltalen = 0
2169 while iterrev != e[3]:
2172 while iterrev != e[3]:
2170 clen += 1
2173 clen += 1
2171 compresseddeltalen += e[1]
2174 compresseddeltalen += e[1]
2172 if generaldelta:
2175 if generaldelta:
2173 iterrev = e[3]
2176 iterrev = e[3]
2174 else:
2177 else:
2175 iterrev -= 1
2178 iterrev -= 1
2176 if iterrev in chaininfocache:
2179 if iterrev in chaininfocache:
2177 t = chaininfocache[iterrev]
2180 t = chaininfocache[iterrev]
2178 clen += t[0]
2181 clen += t[0]
2179 compresseddeltalen += t[1]
2182 compresseddeltalen += t[1]
2180 break
2183 break
2181 e = index[iterrev]
2184 e = index[iterrev]
2182 else:
2185 else:
2183 # Add text length of base since decompressing that also takes
2186 # Add text length of base since decompressing that also takes
2184 # work. For cache hits the length is already included.
2187 # work. For cache hits the length is already included.
2185 compresseddeltalen += e[1]
2188 compresseddeltalen += e[1]
2186 r = (clen, compresseddeltalen)
2189 r = (clen, compresseddeltalen)
2187 chaininfocache[rev] = r
2190 chaininfocache[rev] = r
2188 return r
2191 return r
2189
2192
2190 def _deltachain(self, rev, stoprev=None):
2193 def _deltachain(self, rev, stoprev=None):
2191 return self._inner._deltachain(rev, stoprev=stoprev)
2194 return self._inner._deltachain(rev, stoprev=stoprev)
2192
2195
2193 def ancestors(self, revs, stoprev=0, inclusive=False):
2196 def ancestors(self, revs, stoprev=0, inclusive=False):
2194 """Generate the ancestors of 'revs' in reverse revision order.
2197 """Generate the ancestors of 'revs' in reverse revision order.
2195 Does not generate revs lower than stoprev.
2198 Does not generate revs lower than stoprev.
2196
2199
2197 See the documentation for ancestor.lazyancestors for more details."""
2200 See the documentation for ancestor.lazyancestors for more details."""
2198
2201
2199 # first, make sure start revisions aren't filtered
2202 # first, make sure start revisions aren't filtered
2200 revs = list(revs)
2203 revs = list(revs)
2201 checkrev = self.node
2204 checkrev = self.node
2202 for r in revs:
2205 for r in revs:
2203 checkrev(r)
2206 checkrev(r)
2204 # and we're sure ancestors aren't filtered as well
2207 # and we're sure ancestors aren't filtered as well
2205
2208
2206 if rustancestor is not None and self.index.rust_ext_compat:
2209 if rustancestor is not None and self.index.rust_ext_compat:
2207 lazyancestors = rustancestor.LazyAncestors
2210 lazyancestors = rustancestor.LazyAncestors
2208 arg = self.index
2211 arg = self.index
2209 else:
2212 else:
2210 lazyancestors = ancestor.lazyancestors
2213 lazyancestors = ancestor.lazyancestors
2211 arg = self._uncheckedparentrevs
2214 arg = self._uncheckedparentrevs
2212 return lazyancestors(arg, revs, stoprev=stoprev, inclusive=inclusive)
2215 return lazyancestors(arg, revs, stoprev=stoprev, inclusive=inclusive)
2213
2216
2214 def descendants(self, revs):
2217 def descendants(self, revs):
2215 return dagop.descendantrevs(revs, self.revs, self.parentrevs)
2218 return dagop.descendantrevs(revs, self.revs, self.parentrevs)
2216
2219
2217 def findcommonmissing(self, common=None, heads=None):
2220 def findcommonmissing(self, common=None, heads=None):
2218 """Return a tuple of the ancestors of common and the ancestors of heads
2221 """Return a tuple of the ancestors of common and the ancestors of heads
2219 that are not ancestors of common. In revset terminology, we return the
2222 that are not ancestors of common. In revset terminology, we return the
2220 tuple:
2223 tuple:
2221
2224
2222 ::common, (::heads) - (::common)
2225 ::common, (::heads) - (::common)
2223
2226
2224 The list is sorted by revision number, meaning it is
2227 The list is sorted by revision number, meaning it is
2225 topologically sorted.
2228 topologically sorted.
2226
2229
2227 'heads' and 'common' are both lists of node IDs. If heads is
2230 'heads' and 'common' are both lists of node IDs. If heads is
2228 not supplied, uses all of the revlog's heads. If common is not
2231 not supplied, uses all of the revlog's heads. If common is not
2229 supplied, uses nullid."""
2232 supplied, uses nullid."""
2230 if common is None:
2233 if common is None:
2231 common = [self.nullid]
2234 common = [self.nullid]
2232 if heads is None:
2235 if heads is None:
2233 heads = self.heads()
2236 heads = self.heads()
2234
2237
2235 common = [self.rev(n) for n in common]
2238 common = [self.rev(n) for n in common]
2236 heads = [self.rev(n) for n in heads]
2239 heads = [self.rev(n) for n in heads]
2237
2240
2238 # we want the ancestors, but inclusive
2241 # we want the ancestors, but inclusive
2239 class lazyset:
2242 class lazyset:
2240 def __init__(self, lazyvalues):
2243 def __init__(self, lazyvalues):
2241 self.addedvalues = set()
2244 self.addedvalues = set()
2242 self.lazyvalues = lazyvalues
2245 self.lazyvalues = lazyvalues
2243
2246
2244 def __contains__(self, value):
2247 def __contains__(self, value):
2245 return value in self.addedvalues or value in self.lazyvalues
2248 return value in self.addedvalues or value in self.lazyvalues
2246
2249
2247 def __iter__(self):
2250 def __iter__(self):
2248 added = self.addedvalues
2251 added = self.addedvalues
2249 for r in added:
2252 for r in added:
2250 yield r
2253 yield r
2251 for r in self.lazyvalues:
2254 for r in self.lazyvalues:
2252 if not r in added:
2255 if not r in added:
2253 yield r
2256 yield r
2254
2257
2255 def add(self, value):
2258 def add(self, value):
2256 self.addedvalues.add(value)
2259 self.addedvalues.add(value)
2257
2260
2258 def update(self, values):
2261 def update(self, values):
2259 self.addedvalues.update(values)
2262 self.addedvalues.update(values)
2260
2263
2261 has = lazyset(self.ancestors(common))
2264 has = lazyset(self.ancestors(common))
2262 has.add(nullrev)
2265 has.add(nullrev)
2263 has.update(common)
2266 has.update(common)
2264
2267
2265 # take all ancestors from heads that aren't in has
2268 # take all ancestors from heads that aren't in has
2266 missing = set()
2269 missing = set()
2267 visit = collections.deque(r for r in heads if r not in has)
2270 visit = collections.deque(r for r in heads if r not in has)
2268 while visit:
2271 while visit:
2269 r = visit.popleft()
2272 r = visit.popleft()
2270 if r in missing:
2273 if r in missing:
2271 continue
2274 continue
2272 else:
2275 else:
2273 missing.add(r)
2276 missing.add(r)
2274 for p in self.parentrevs(r):
2277 for p in self.parentrevs(r):
2275 if p not in has:
2278 if p not in has:
2276 visit.append(p)
2279 visit.append(p)
2277 missing = list(missing)
2280 missing = list(missing)
2278 missing.sort()
2281 missing.sort()
2279 return has, [self.node(miss) for miss in missing]
2282 return has, [self.node(miss) for miss in missing]
2280
2283
2281 def incrementalmissingrevs(self, common=None):
2284 def incrementalmissingrevs(self, common=None):
2282 """Return an object that can be used to incrementally compute the
2285 """Return an object that can be used to incrementally compute the
2283 revision numbers of the ancestors of arbitrary sets that are not
2286 revision numbers of the ancestors of arbitrary sets that are not
2284 ancestors of common. This is an ancestor.incrementalmissingancestors
2287 ancestors of common. This is an ancestor.incrementalmissingancestors
2285 object.
2288 object.
2286
2289
2287 'common' is a list of revision numbers. If common is not supplied, uses
2290 'common' is a list of revision numbers. If common is not supplied, uses
2288 nullrev.
2291 nullrev.
2289 """
2292 """
2290 if common is None:
2293 if common is None:
2291 common = [nullrev]
2294 common = [nullrev]
2292
2295
2293 if rustancestor is not None and self.index.rust_ext_compat:
2296 if rustancestor is not None and self.index.rust_ext_compat:
2294 return rustancestor.MissingAncestors(self.index, common)
2297 return rustancestor.MissingAncestors(self.index, common)
2295 return ancestor.incrementalmissingancestors(self.parentrevs, common)
2298 return ancestor.incrementalmissingancestors(self.parentrevs, common)
2296
2299
2297 def findmissingrevs(self, common=None, heads=None):
2300 def findmissingrevs(self, common=None, heads=None):
2298 """Return the revision numbers of the ancestors of heads that
2301 """Return the revision numbers of the ancestors of heads that
2299 are not ancestors of common.
2302 are not ancestors of common.
2300
2303
2301 More specifically, return a list of revision numbers corresponding to
2304 More specifically, return a list of revision numbers corresponding to
2302 nodes N such that every N satisfies the following constraints:
2305 nodes N such that every N satisfies the following constraints:
2303
2306
2304 1. N is an ancestor of some node in 'heads'
2307 1. N is an ancestor of some node in 'heads'
2305 2. N is not an ancestor of any node in 'common'
2308 2. N is not an ancestor of any node in 'common'
2306
2309
2307 The list is sorted by revision number, meaning it is
2310 The list is sorted by revision number, meaning it is
2308 topologically sorted.
2311 topologically sorted.
2309
2312
2310 'heads' and 'common' are both lists of revision numbers. If heads is
2313 'heads' and 'common' are both lists of revision numbers. If heads is
2311 not supplied, uses all of the revlog's heads. If common is not
2314 not supplied, uses all of the revlog's heads. If common is not
2312 supplied, uses nullid."""
2315 supplied, uses nullid."""
2313 if common is None:
2316 if common is None:
2314 common = [nullrev]
2317 common = [nullrev]
2315 if heads is None:
2318 if heads is None:
2316 heads = self.headrevs()
2319 heads = self.headrevs()
2317
2320
2318 inc = self.incrementalmissingrevs(common=common)
2321 inc = self.incrementalmissingrevs(common=common)
2319 return inc.missingancestors(heads)
2322 return inc.missingancestors(heads)
2320
2323
2321 def findmissing(self, common=None, heads=None):
2324 def findmissing(self, common=None, heads=None):
2322 """Return the ancestors of heads that are not ancestors of common.
2325 """Return the ancestors of heads that are not ancestors of common.
2323
2326
2324 More specifically, return a list of nodes N such that every N
2327 More specifically, return a list of nodes N such that every N
2325 satisfies the following constraints:
2328 satisfies the following constraints:
2326
2329
2327 1. N is an ancestor of some node in 'heads'
2330 1. N is an ancestor of some node in 'heads'
2328 2. N is not an ancestor of any node in 'common'
2331 2. N is not an ancestor of any node in 'common'
2329
2332
2330 The list is sorted by revision number, meaning it is
2333 The list is sorted by revision number, meaning it is
2331 topologically sorted.
2334 topologically sorted.
2332
2335
2333 'heads' and 'common' are both lists of node IDs. If heads is
2336 'heads' and 'common' are both lists of node IDs. If heads is
2334 not supplied, uses all of the revlog's heads. If common is not
2337 not supplied, uses all of the revlog's heads. If common is not
2335 supplied, uses nullid."""
2338 supplied, uses nullid."""
2336 if common is None:
2339 if common is None:
2337 common = [self.nullid]
2340 common = [self.nullid]
2338 if heads is None:
2341 if heads is None:
2339 heads = self.heads()
2342 heads = self.heads()
2340
2343
2341 common = [self.rev(n) for n in common]
2344 common = [self.rev(n) for n in common]
2342 heads = [self.rev(n) for n in heads]
2345 heads = [self.rev(n) for n in heads]
2343
2346
2344 inc = self.incrementalmissingrevs(common=common)
2347 inc = self.incrementalmissingrevs(common=common)
2345 return [self.node(r) for r in inc.missingancestors(heads)]
2348 return [self.node(r) for r in inc.missingancestors(heads)]
2346
2349
2347 def nodesbetween(self, roots=None, heads=None):
2350 def nodesbetween(self, roots=None, heads=None):
2348 """Return a topological path from 'roots' to 'heads'.
2351 """Return a topological path from 'roots' to 'heads'.
2349
2352
2350 Return a tuple (nodes, outroots, outheads) where 'nodes' is a
2353 Return a tuple (nodes, outroots, outheads) where 'nodes' is a
2351 topologically sorted list of all nodes N that satisfy both of
2354 topologically sorted list of all nodes N that satisfy both of
2352 these constraints:
2355 these constraints:
2353
2356
2354 1. N is a descendant of some node in 'roots'
2357 1. N is a descendant of some node in 'roots'
2355 2. N is an ancestor of some node in 'heads'
2358 2. N is an ancestor of some node in 'heads'
2356
2359
2357 Every node is considered to be both a descendant and an ancestor
2360 Every node is considered to be both a descendant and an ancestor
2358 of itself, so every reachable node in 'roots' and 'heads' will be
2361 of itself, so every reachable node in 'roots' and 'heads' will be
2359 included in 'nodes'.
2362 included in 'nodes'.
2360
2363
2361 'outroots' is the list of reachable nodes in 'roots', i.e., the
2364 'outroots' is the list of reachable nodes in 'roots', i.e., the
2362 subset of 'roots' that is returned in 'nodes'. Likewise,
2365 subset of 'roots' that is returned in 'nodes'. Likewise,
2363 'outheads' is the subset of 'heads' that is also in 'nodes'.
2366 'outheads' is the subset of 'heads' that is also in 'nodes'.
2364
2367
2365 'roots' and 'heads' are both lists of node IDs. If 'roots' is
2368 'roots' and 'heads' are both lists of node IDs. If 'roots' is
2366 unspecified, uses nullid as the only root. If 'heads' is
2369 unspecified, uses nullid as the only root. If 'heads' is
2367 unspecified, uses list of all of the revlog's heads."""
2370 unspecified, uses list of all of the revlog's heads."""
2368 nonodes = ([], [], [])
2371 nonodes = ([], [], [])
2369 if roots is not None:
2372 if roots is not None:
2370 roots = list(roots)
2373 roots = list(roots)
2371 if not roots:
2374 if not roots:
2372 return nonodes
2375 return nonodes
2373 lowestrev = min([self.rev(n) for n in roots])
2376 lowestrev = min([self.rev(n) for n in roots])
2374 else:
2377 else:
2375 roots = [self.nullid] # Everybody's a descendant of nullid
2378 roots = [self.nullid] # Everybody's a descendant of nullid
2376 lowestrev = nullrev
2379 lowestrev = nullrev
2377 if (lowestrev == nullrev) and (heads is None):
2380 if (lowestrev == nullrev) and (heads is None):
2378 # We want _all_ the nodes!
2381 # We want _all_ the nodes!
2379 return (
2382 return (
2380 [self.node(r) for r in self],
2383 [self.node(r) for r in self],
2381 [self.nullid],
2384 [self.nullid],
2382 list(self.heads()),
2385 list(self.heads()),
2383 )
2386 )
2384 if heads is None:
2387 if heads is None:
2385 # All nodes are ancestors, so the latest ancestor is the last
2388 # All nodes are ancestors, so the latest ancestor is the last
2386 # node.
2389 # node.
2387 highestrev = len(self) - 1
2390 highestrev = len(self) - 1
2388 # Set ancestors to None to signal that every node is an ancestor.
2391 # Set ancestors to None to signal that every node is an ancestor.
2389 ancestors = None
2392 ancestors = None
2390 # Set heads to an empty dictionary for later discovery of heads
2393 # Set heads to an empty dictionary for later discovery of heads
2391 heads = {}
2394 heads = {}
2392 else:
2395 else:
2393 heads = list(heads)
2396 heads = list(heads)
2394 if not heads:
2397 if not heads:
2395 return nonodes
2398 return nonodes
2396 ancestors = set()
2399 ancestors = set()
2397 # Turn heads into a dictionary so we can remove 'fake' heads.
2400 # Turn heads into a dictionary so we can remove 'fake' heads.
2398 # Also, later we will be using it to filter out the heads we can't
2401 # Also, later we will be using it to filter out the heads we can't
2399 # find from roots.
2402 # find from roots.
2400 heads = dict.fromkeys(heads, False)
2403 heads = dict.fromkeys(heads, False)
2401 # Start at the top and keep marking parents until we're done.
2404 # Start at the top and keep marking parents until we're done.
2402 nodestotag = set(heads)
2405 nodestotag = set(heads)
2403 # Remember where the top was so we can use it as a limit later.
2406 # Remember where the top was so we can use it as a limit later.
2404 highestrev = max([self.rev(n) for n in nodestotag])
2407 highestrev = max([self.rev(n) for n in nodestotag])
2405 while nodestotag:
2408 while nodestotag:
2406 # grab a node to tag
2409 # grab a node to tag
2407 n = nodestotag.pop()
2410 n = nodestotag.pop()
2408 # Never tag nullid
2411 # Never tag nullid
2409 if n == self.nullid:
2412 if n == self.nullid:
2410 continue
2413 continue
2411 # A node's revision number represents its place in a
2414 # A node's revision number represents its place in a
2412 # topologically sorted list of nodes.
2415 # topologically sorted list of nodes.
2413 r = self.rev(n)
2416 r = self.rev(n)
2414 if r >= lowestrev:
2417 if r >= lowestrev:
2415 if n not in ancestors:
2418 if n not in ancestors:
2416 # If we are possibly a descendant of one of the roots
2419 # If we are possibly a descendant of one of the roots
2417 # and we haven't already been marked as an ancestor
2420 # and we haven't already been marked as an ancestor
2418 ancestors.add(n) # Mark as ancestor
2421 ancestors.add(n) # Mark as ancestor
2419 # Add non-nullid parents to list of nodes to tag.
2422 # Add non-nullid parents to list of nodes to tag.
2420 nodestotag.update(
2423 nodestotag.update(
2421 [p for p in self.parents(n) if p != self.nullid]
2424 [p for p in self.parents(n) if p != self.nullid]
2422 )
2425 )
2423 elif n in heads: # We've seen it before, is it a fake head?
2426 elif n in heads: # We've seen it before, is it a fake head?
2424 # So it is, real heads should not be the ancestors of
2427 # So it is, real heads should not be the ancestors of
2425 # any other heads.
2428 # any other heads.
2426 heads.pop(n)
2429 heads.pop(n)
2427 if not ancestors:
2430 if not ancestors:
2428 return nonodes
2431 return nonodes
2429 # Now that we have our set of ancestors, we want to remove any
2432 # Now that we have our set of ancestors, we want to remove any
2430 # roots that are not ancestors.
2433 # roots that are not ancestors.
2431
2434
2432 # If one of the roots was nullid, everything is included anyway.
2435 # If one of the roots was nullid, everything is included anyway.
2433 if lowestrev > nullrev:
2436 if lowestrev > nullrev:
2434 # But, since we weren't, let's recompute the lowest rev to not
2437 # But, since we weren't, let's recompute the lowest rev to not
2435 # include roots that aren't ancestors.
2438 # include roots that aren't ancestors.
2436
2439
2437 # Filter out roots that aren't ancestors of heads
2440 # Filter out roots that aren't ancestors of heads
2438 roots = [root for root in roots if root in ancestors]
2441 roots = [root for root in roots if root in ancestors]
2439 # Recompute the lowest revision
2442 # Recompute the lowest revision
2440 if roots:
2443 if roots:
2441 lowestrev = min([self.rev(root) for root in roots])
2444 lowestrev = min([self.rev(root) for root in roots])
2442 else:
2445 else:
2443 # No more roots? Return empty list
2446 # No more roots? Return empty list
2444 return nonodes
2447 return nonodes
2445 else:
2448 else:
2446 # We are descending from nullid, and don't need to care about
2449 # We are descending from nullid, and don't need to care about
2447 # any other roots.
2450 # any other roots.
2448 lowestrev = nullrev
2451 lowestrev = nullrev
2449 roots = [self.nullid]
2452 roots = [self.nullid]
2450 # Transform our roots list into a set.
2453 # Transform our roots list into a set.
2451 descendants = set(roots)
2454 descendants = set(roots)
2452 # Also, keep the original roots so we can filter out roots that aren't
2455 # Also, keep the original roots so we can filter out roots that aren't
2453 # 'real' roots (i.e. are descended from other roots).
2456 # 'real' roots (i.e. are descended from other roots).
2454 roots = descendants.copy()
2457 roots = descendants.copy()
2455 # Our topologically sorted list of output nodes.
2458 # Our topologically sorted list of output nodes.
2456 orderedout = []
2459 orderedout = []
2457 # Don't start at nullid since we don't want nullid in our output list,
2460 # Don't start at nullid since we don't want nullid in our output list,
2458 # and if nullid shows up in descendants, empty parents will look like
2461 # and if nullid shows up in descendants, empty parents will look like
2459 # they're descendants.
2462 # they're descendants.
2460 for r in self.revs(start=max(lowestrev, 0), stop=highestrev + 1):
2463 for r in self.revs(start=max(lowestrev, 0), stop=highestrev + 1):
2461 n = self.node(r)
2464 n = self.node(r)
2462 isdescendant = False
2465 isdescendant = False
2463 if lowestrev == nullrev: # Everybody is a descendant of nullid
2466 if lowestrev == nullrev: # Everybody is a descendant of nullid
2464 isdescendant = True
2467 isdescendant = True
2465 elif n in descendants:
2468 elif n in descendants:
2466 # n is already a descendant
2469 # n is already a descendant
2467 isdescendant = True
2470 isdescendant = True
2468 # This check only needs to be done here because all the roots
2471 # This check only needs to be done here because all the roots
2469 # will start being marked is descendants before the loop.
2472 # will start being marked is descendants before the loop.
2470 if n in roots:
2473 if n in roots:
2471 # If n was a root, check if it's a 'real' root.
2474 # If n was a root, check if it's a 'real' root.
2472 p = tuple(self.parents(n))
2475 p = tuple(self.parents(n))
2473 # If any of its parents are descendants, it's not a root.
2476 # If any of its parents are descendants, it's not a root.
2474 if (p[0] in descendants) or (p[1] in descendants):
2477 if (p[0] in descendants) or (p[1] in descendants):
2475 roots.remove(n)
2478 roots.remove(n)
2476 else:
2479 else:
2477 p = tuple(self.parents(n))
2480 p = tuple(self.parents(n))
2478 # A node is a descendant if either of its parents are
2481 # A node is a descendant if either of its parents are
2479 # descendants. (We seeded the dependents list with the roots
2482 # descendants. (We seeded the dependents list with the roots
2480 # up there, remember?)
2483 # up there, remember?)
2481 if (p[0] in descendants) or (p[1] in descendants):
2484 if (p[0] in descendants) or (p[1] in descendants):
2482 descendants.add(n)
2485 descendants.add(n)
2483 isdescendant = True
2486 isdescendant = True
2484 if isdescendant and ((ancestors is None) or (n in ancestors)):
2487 if isdescendant and ((ancestors is None) or (n in ancestors)):
2485 # Only include nodes that are both descendants and ancestors.
2488 # Only include nodes that are both descendants and ancestors.
2486 orderedout.append(n)
2489 orderedout.append(n)
2487 if (ancestors is not None) and (n in heads):
2490 if (ancestors is not None) and (n in heads):
2488 # We're trying to figure out which heads are reachable
2491 # We're trying to figure out which heads are reachable
2489 # from roots.
2492 # from roots.
2490 # Mark this head as having been reached
2493 # Mark this head as having been reached
2491 heads[n] = True
2494 heads[n] = True
2492 elif ancestors is None:
2495 elif ancestors is None:
2493 # Otherwise, we're trying to discover the heads.
2496 # Otherwise, we're trying to discover the heads.
2494 # Assume this is a head because if it isn't, the next step
2497 # Assume this is a head because if it isn't, the next step
2495 # will eventually remove it.
2498 # will eventually remove it.
2496 heads[n] = True
2499 heads[n] = True
2497 # But, obviously its parents aren't.
2500 # But, obviously its parents aren't.
2498 for p in self.parents(n):
2501 for p in self.parents(n):
2499 heads.pop(p, None)
2502 heads.pop(p, None)
2500 heads = [head for head, flag in heads.items() if flag]
2503 heads = [head for head, flag in heads.items() if flag]
2501 roots = list(roots)
2504 roots = list(roots)
2502 assert orderedout
2505 assert orderedout
2503 assert roots
2506 assert roots
2504 assert heads
2507 assert heads
2505 return (orderedout, roots, heads)
2508 return (orderedout, roots, heads)
2506
2509
2507 def headrevs(self, revs=None):
2510 def headrevs(self, revs=None):
2508 if revs is None:
2511 if revs is None:
2509 try:
2512 try:
2510 return self.index.headrevs()
2513 return self.index.headrevs()
2511 except AttributeError:
2514 except AttributeError:
2512 return self._headrevs()
2515 return self._headrevs()
2513 if rustdagop is not None and self.index.rust_ext_compat:
2516 if rustdagop is not None and self.index.rust_ext_compat:
2514 return rustdagop.headrevs(self.index, revs)
2517 return rustdagop.headrevs(self.index, revs)
2515 return dagop.headrevs(revs, self._uncheckedparentrevs)
2518 return dagop.headrevs(revs, self._uncheckedparentrevs)
2516
2519
2517 def computephases(self, roots):
2520 def computephases(self, roots):
2518 return self.index.computephasesmapsets(roots)
2521 return self.index.computephasesmapsets(roots)
2519
2522
2520 def _headrevs(self):
2523 def _headrevs(self):
2521 count = len(self)
2524 count = len(self)
2522 if not count:
2525 if not count:
2523 return [nullrev]
2526 return [nullrev]
2524 # we won't iter over filtered rev so nobody is a head at start
2527 # we won't iter over filtered rev so nobody is a head at start
2525 ishead = [0] * (count + 1)
2528 ishead = [0] * (count + 1)
2526 index = self.index
2529 index = self.index
2527 for r in self:
2530 for r in self:
2528 ishead[r] = 1 # I may be an head
2531 ishead[r] = 1 # I may be an head
2529 e = index[r]
2532 e = index[r]
2530 ishead[e[5]] = ishead[e[6]] = 0 # my parent are not
2533 ishead[e[5]] = ishead[e[6]] = 0 # my parent are not
2531 return [r for r, val in enumerate(ishead) if val]
2534 return [r for r, val in enumerate(ishead) if val]
2532
2535
2533 def heads(self, start=None, stop=None):
2536 def heads(self, start=None, stop=None):
2534 """return the list of all nodes that have no children
2537 """return the list of all nodes that have no children
2535
2538
2536 if start is specified, only heads that are descendants of
2539 if start is specified, only heads that are descendants of
2537 start will be returned
2540 start will be returned
2538 if stop is specified, it will consider all the revs from stop
2541 if stop is specified, it will consider all the revs from stop
2539 as if they had no children
2542 as if they had no children
2540 """
2543 """
2541 if start is None and stop is None:
2544 if start is None and stop is None:
2542 if not len(self):
2545 if not len(self):
2543 return [self.nullid]
2546 return [self.nullid]
2544 return [self.node(r) for r in self.headrevs()]
2547 return [self.node(r) for r in self.headrevs()]
2545
2548
2546 if start is None:
2549 if start is None:
2547 start = nullrev
2550 start = nullrev
2548 else:
2551 else:
2549 start = self.rev(start)
2552 start = self.rev(start)
2550
2553
2551 stoprevs = {self.rev(n) for n in stop or []}
2554 stoprevs = {self.rev(n) for n in stop or []}
2552
2555
2553 revs = dagop.headrevssubset(
2556 revs = dagop.headrevssubset(
2554 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs
2557 self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs
2555 )
2558 )
2556
2559
2557 return [self.node(rev) for rev in revs]
2560 return [self.node(rev) for rev in revs]
2558
2561
2559 def children(self, node):
2562 def children(self, node):
2560 """find the children of a given node"""
2563 """find the children of a given node"""
2561 c = []
2564 c = []
2562 p = self.rev(node)
2565 p = self.rev(node)
2563 for r in self.revs(start=p + 1):
2566 for r in self.revs(start=p + 1):
2564 prevs = [pr for pr in self.parentrevs(r) if pr != nullrev]
2567 prevs = [pr for pr in self.parentrevs(r) if pr != nullrev]
2565 if prevs:
2568 if prevs:
2566 for pr in prevs:
2569 for pr in prevs:
2567 if pr == p:
2570 if pr == p:
2568 c.append(self.node(r))
2571 c.append(self.node(r))
2569 elif p == nullrev:
2572 elif p == nullrev:
2570 c.append(self.node(r))
2573 c.append(self.node(r))
2571 return c
2574 return c
2572
2575
2573 def commonancestorsheads(self, a, b):
2576 def commonancestorsheads(self, a, b):
2574 """calculate all the heads of the common ancestors of nodes a and b"""
2577 """calculate all the heads of the common ancestors of nodes a and b"""
2575 a, b = self.rev(a), self.rev(b)
2578 a, b = self.rev(a), self.rev(b)
2576 ancs = self._commonancestorsheads(a, b)
2579 ancs = self._commonancestorsheads(a, b)
2577 return pycompat.maplist(self.node, ancs)
2580 return pycompat.maplist(self.node, ancs)
2578
2581
2579 def _commonancestorsheads(self, *revs):
2582 def _commonancestorsheads(self, *revs):
2580 """calculate all the heads of the common ancestors of revs"""
2583 """calculate all the heads of the common ancestors of revs"""
2581 try:
2584 try:
2582 ancs = self.index.commonancestorsheads(*revs)
2585 ancs = self.index.commonancestorsheads(*revs)
2583 except (AttributeError, OverflowError): # C implementation failed
2586 except (AttributeError, OverflowError): # C implementation failed
2584 ancs = ancestor.commonancestorsheads(self.parentrevs, *revs)
2587 ancs = ancestor.commonancestorsheads(self.parentrevs, *revs)
2585 return ancs
2588 return ancs
2586
2589
2587 def isancestor(self, a, b):
2590 def isancestor(self, a, b):
2588 """return True if node a is an ancestor of node b
2591 """return True if node a is an ancestor of node b
2589
2592
2590 A revision is considered an ancestor of itself."""
2593 A revision is considered an ancestor of itself."""
2591 a, b = self.rev(a), self.rev(b)
2594 a, b = self.rev(a), self.rev(b)
2592 return self.isancestorrev(a, b)
2595 return self.isancestorrev(a, b)
2593
2596
2594 def isancestorrev(self, a, b):
2597 def isancestorrev(self, a, b):
2595 """return True if revision a is an ancestor of revision b
2598 """return True if revision a is an ancestor of revision b
2596
2599
2597 A revision is considered an ancestor of itself.
2600 A revision is considered an ancestor of itself.
2598
2601
2599 The implementation of this is trivial but the use of
2602 The implementation of this is trivial but the use of
2600 reachableroots is not."""
2603 reachableroots is not."""
2601 if a == nullrev:
2604 if a == nullrev:
2602 return True
2605 return True
2603 elif a == b:
2606 elif a == b:
2604 return True
2607 return True
2605 elif a > b:
2608 elif a > b:
2606 return False
2609 return False
2607 return bool(self.reachableroots(a, [b], [a], includepath=False))
2610 return bool(self.reachableroots(a, [b], [a], includepath=False))
2608
2611
2609 def reachableroots(self, minroot, heads, roots, includepath=False):
2612 def reachableroots(self, minroot, heads, roots, includepath=False):
2610 """return (heads(::(<roots> and <roots>::<heads>)))
2613 """return (heads(::(<roots> and <roots>::<heads>)))
2611
2614
2612 If includepath is True, return (<roots>::<heads>)."""
2615 If includepath is True, return (<roots>::<heads>)."""
2613 try:
2616 try:
2614 return self.index.reachableroots2(
2617 return self.index.reachableroots2(
2615 minroot, heads, roots, includepath
2618 minroot, heads, roots, includepath
2616 )
2619 )
2617 except AttributeError:
2620 except AttributeError:
2618 return dagop._reachablerootspure(
2621 return dagop._reachablerootspure(
2619 self.parentrevs, minroot, roots, heads, includepath
2622 self.parentrevs, minroot, roots, heads, includepath
2620 )
2623 )
2621
2624
2622 def ancestor(self, a, b):
2625 def ancestor(self, a, b):
2623 """calculate the "best" common ancestor of nodes a and b"""
2626 """calculate the "best" common ancestor of nodes a and b"""
2624
2627
2625 a, b = self.rev(a), self.rev(b)
2628 a, b = self.rev(a), self.rev(b)
2626 try:
2629 try:
2627 ancs = self.index.ancestors(a, b)
2630 ancs = self.index.ancestors(a, b)
2628 except (AttributeError, OverflowError):
2631 except (AttributeError, OverflowError):
2629 ancs = ancestor.ancestors(self.parentrevs, a, b)
2632 ancs = ancestor.ancestors(self.parentrevs, a, b)
2630 if ancs:
2633 if ancs:
2631 # choose a consistent winner when there's a tie
2634 # choose a consistent winner when there's a tie
2632 return min(map(self.node, ancs))
2635 return min(map(self.node, ancs))
2633 return self.nullid
2636 return self.nullid
2634
2637
2635 def _match(self, id):
2638 def _match(self, id):
2636 if isinstance(id, int):
2639 if isinstance(id, int):
2637 # rev
2640 # rev
2638 return self.node(id)
2641 return self.node(id)
2639 if len(id) == self.nodeconstants.nodelen:
2642 if len(id) == self.nodeconstants.nodelen:
2640 # possibly a binary node
2643 # possibly a binary node
2641 # odds of a binary node being all hex in ASCII are 1 in 10**25
2644 # odds of a binary node being all hex in ASCII are 1 in 10**25
2642 try:
2645 try:
2643 node = id
2646 node = id
2644 self.rev(node) # quick search the index
2647 self.rev(node) # quick search the index
2645 return node
2648 return node
2646 except error.LookupError:
2649 except error.LookupError:
2647 pass # may be partial hex id
2650 pass # may be partial hex id
2648 try:
2651 try:
2649 # str(rev)
2652 # str(rev)
2650 rev = int(id)
2653 rev = int(id)
2651 if b"%d" % rev != id:
2654 if b"%d" % rev != id:
2652 raise ValueError
2655 raise ValueError
2653 if rev < 0:
2656 if rev < 0:
2654 rev = len(self) + rev
2657 rev = len(self) + rev
2655 if rev < 0 or rev >= len(self):
2658 if rev < 0 or rev >= len(self):
2656 raise ValueError
2659 raise ValueError
2657 return self.node(rev)
2660 return self.node(rev)
2658 except (ValueError, OverflowError):
2661 except (ValueError, OverflowError):
2659 pass
2662 pass
2660 if len(id) == 2 * self.nodeconstants.nodelen:
2663 if len(id) == 2 * self.nodeconstants.nodelen:
2661 try:
2664 try:
2662 # a full hex nodeid?
2665 # a full hex nodeid?
2663 node = bin(id)
2666 node = bin(id)
2664 self.rev(node)
2667 self.rev(node)
2665 return node
2668 return node
2666 except (binascii.Error, error.LookupError):
2669 except (binascii.Error, error.LookupError):
2667 pass
2670 pass
2668
2671
2669 def _partialmatch(self, id):
2672 def _partialmatch(self, id):
2670 # we don't care wdirfilenodeids as they should be always full hash
2673 # we don't care wdirfilenodeids as they should be always full hash
2671 maybewdir = self.nodeconstants.wdirhex.startswith(id)
2674 maybewdir = self.nodeconstants.wdirhex.startswith(id)
2672 ambiguous = False
2675 ambiguous = False
2673 try:
2676 try:
2674 partial = self.index.partialmatch(id)
2677 partial = self.index.partialmatch(id)
2675 if partial and self.hasnode(partial):
2678 if partial and self.hasnode(partial):
2676 if maybewdir:
2679 if maybewdir:
2677 # single 'ff...' match in radix tree, ambiguous with wdir
2680 # single 'ff...' match in radix tree, ambiguous with wdir
2678 ambiguous = True
2681 ambiguous = True
2679 else:
2682 else:
2680 return partial
2683 return partial
2681 elif maybewdir:
2684 elif maybewdir:
2682 # no 'ff...' match in radix tree, wdir identified
2685 # no 'ff...' match in radix tree, wdir identified
2683 raise error.WdirUnsupported
2686 raise error.WdirUnsupported
2684 else:
2687 else:
2685 return None
2688 return None
2686 except error.RevlogError:
2689 except error.RevlogError:
2687 # parsers.c radix tree lookup gave multiple matches
2690 # parsers.c radix tree lookup gave multiple matches
2688 # fast path: for unfiltered changelog, radix tree is accurate
2691 # fast path: for unfiltered changelog, radix tree is accurate
2689 if not getattr(self, 'filteredrevs', None):
2692 if not getattr(self, 'filteredrevs', None):
2690 ambiguous = True
2693 ambiguous = True
2691 # fall through to slow path that filters hidden revisions
2694 # fall through to slow path that filters hidden revisions
2692 except (AttributeError, ValueError):
2695 except (AttributeError, ValueError):
2693 # we are pure python, or key is not hex
2696 # we are pure python, or key is not hex
2694 pass
2697 pass
2695 if ambiguous:
2698 if ambiguous:
2696 raise error.AmbiguousPrefixLookupError(
2699 raise error.AmbiguousPrefixLookupError(
2697 id, self.display_id, _(b'ambiguous identifier')
2700 id, self.display_id, _(b'ambiguous identifier')
2698 )
2701 )
2699
2702
2700 if id in self._pcache:
2703 if id in self._pcache:
2701 return self._pcache[id]
2704 return self._pcache[id]
2702
2705
2703 if len(id) <= 40:
2706 if len(id) <= 40:
2704 # hex(node)[:...]
2707 # hex(node)[:...]
2705 l = len(id) // 2 * 2 # grab an even number of digits
2708 l = len(id) // 2 * 2 # grab an even number of digits
2706 try:
2709 try:
2707 # we're dropping the last digit, so let's check that it's hex,
2710 # we're dropping the last digit, so let's check that it's hex,
2708 # to avoid the expensive computation below if it's not
2711 # to avoid the expensive computation below if it's not
2709 if len(id) % 2 > 0:
2712 if len(id) % 2 > 0:
2710 if not (id[-1] in hexdigits):
2713 if not (id[-1] in hexdigits):
2711 return None
2714 return None
2712 prefix = bin(id[:l])
2715 prefix = bin(id[:l])
2713 except binascii.Error:
2716 except binascii.Error:
2714 pass
2717 pass
2715 else:
2718 else:
2716 nl = [e[7] for e in self.index if e[7].startswith(prefix)]
2719 nl = [e[7] for e in self.index if e[7].startswith(prefix)]
2717 nl = [
2720 nl = [
2718 n for n in nl if hex(n).startswith(id) and self.hasnode(n)
2721 n for n in nl if hex(n).startswith(id) and self.hasnode(n)
2719 ]
2722 ]
2720 if self.nodeconstants.nullhex.startswith(id):
2723 if self.nodeconstants.nullhex.startswith(id):
2721 nl.append(self.nullid)
2724 nl.append(self.nullid)
2722 if len(nl) > 0:
2725 if len(nl) > 0:
2723 if len(nl) == 1 and not maybewdir:
2726 if len(nl) == 1 and not maybewdir:
2724 self._pcache[id] = nl[0]
2727 self._pcache[id] = nl[0]
2725 return nl[0]
2728 return nl[0]
2726 raise error.AmbiguousPrefixLookupError(
2729 raise error.AmbiguousPrefixLookupError(
2727 id, self.display_id, _(b'ambiguous identifier')
2730 id, self.display_id, _(b'ambiguous identifier')
2728 )
2731 )
2729 if maybewdir:
2732 if maybewdir:
2730 raise error.WdirUnsupported
2733 raise error.WdirUnsupported
2731 return None
2734 return None
2732
2735
2733 def lookup(self, id):
2736 def lookup(self, id):
2734 """locate a node based on:
2737 """locate a node based on:
2735 - revision number or str(revision number)
2738 - revision number or str(revision number)
2736 - nodeid or subset of hex nodeid
2739 - nodeid or subset of hex nodeid
2737 """
2740 """
2738 n = self._match(id)
2741 n = self._match(id)
2739 if n is not None:
2742 if n is not None:
2740 return n
2743 return n
2741 n = self._partialmatch(id)
2744 n = self._partialmatch(id)
2742 if n:
2745 if n:
2743 return n
2746 return n
2744
2747
2745 raise error.LookupError(id, self.display_id, _(b'no match found'))
2748 raise error.LookupError(id, self.display_id, _(b'no match found'))
2746
2749
2747 def shortest(self, node, minlength=1):
2750 def shortest(self, node, minlength=1):
2748 """Find the shortest unambiguous prefix that matches node."""
2751 """Find the shortest unambiguous prefix that matches node."""
2749
2752
2750 def isvalid(prefix):
2753 def isvalid(prefix):
2751 try:
2754 try:
2752 matchednode = self._partialmatch(prefix)
2755 matchednode = self._partialmatch(prefix)
2753 except error.AmbiguousPrefixLookupError:
2756 except error.AmbiguousPrefixLookupError:
2754 return False
2757 return False
2755 except error.WdirUnsupported:
2758 except error.WdirUnsupported:
2756 # single 'ff...' match
2759 # single 'ff...' match
2757 return True
2760 return True
2758 if matchednode is None:
2761 if matchednode is None:
2759 raise error.LookupError(node, self.display_id, _(b'no node'))
2762 raise error.LookupError(node, self.display_id, _(b'no node'))
2760 return True
2763 return True
2761
2764
2762 def maybewdir(prefix):
2765 def maybewdir(prefix):
2763 return all(c == b'f' for c in pycompat.iterbytestr(prefix))
2766 return all(c == b'f' for c in pycompat.iterbytestr(prefix))
2764
2767
2765 hexnode = hex(node)
2768 hexnode = hex(node)
2766
2769
2767 def disambiguate(hexnode, minlength):
2770 def disambiguate(hexnode, minlength):
2768 """Disambiguate against wdirid."""
2771 """Disambiguate against wdirid."""
2769 for length in range(minlength, len(hexnode) + 1):
2772 for length in range(minlength, len(hexnode) + 1):
2770 prefix = hexnode[:length]
2773 prefix = hexnode[:length]
2771 if not maybewdir(prefix):
2774 if not maybewdir(prefix):
2772 return prefix
2775 return prefix
2773
2776
2774 if not getattr(self, 'filteredrevs', None):
2777 if not getattr(self, 'filteredrevs', None):
2775 try:
2778 try:
2776 length = max(self.index.shortest(node), minlength)
2779 length = max(self.index.shortest(node), minlength)
2777 return disambiguate(hexnode, length)
2780 return disambiguate(hexnode, length)
2778 except error.RevlogError:
2781 except error.RevlogError:
2779 if node != self.nodeconstants.wdirid:
2782 if node != self.nodeconstants.wdirid:
2780 raise error.LookupError(
2783 raise error.LookupError(
2781 node, self.display_id, _(b'no node')
2784 node, self.display_id, _(b'no node')
2782 )
2785 )
2783 except AttributeError:
2786 except AttributeError:
2784 # Fall through to pure code
2787 # Fall through to pure code
2785 pass
2788 pass
2786
2789
2787 if node == self.nodeconstants.wdirid:
2790 if node == self.nodeconstants.wdirid:
2788 for length in range(minlength, len(hexnode) + 1):
2791 for length in range(minlength, len(hexnode) + 1):
2789 prefix = hexnode[:length]
2792 prefix = hexnode[:length]
2790 if isvalid(prefix):
2793 if isvalid(prefix):
2791 return prefix
2794 return prefix
2792
2795
2793 for length in range(minlength, len(hexnode) + 1):
2796 for length in range(minlength, len(hexnode) + 1):
2794 prefix = hexnode[:length]
2797 prefix = hexnode[:length]
2795 if isvalid(prefix):
2798 if isvalid(prefix):
2796 return disambiguate(hexnode, length)
2799 return disambiguate(hexnode, length)
2797
2800
2798 def cmp(self, node, text):
2801 def cmp(self, node, text):
2799 """compare text with a given file revision
2802 """compare text with a given file revision
2800
2803
2801 returns True if text is different than what is stored.
2804 returns True if text is different than what is stored.
2802 """
2805 """
2803 p1, p2 = self.parents(node)
2806 p1, p2 = self.parents(node)
2804 return storageutil.hashrevisionsha1(text, p1, p2) != node
2807 return storageutil.hashrevisionsha1(text, p1, p2) != node
2805
2808
2806 def deltaparent(self, rev):
2809 def deltaparent(self, rev):
2807 """return deltaparent of the given revision"""
2810 """return deltaparent of the given revision"""
2808 base = self.index[rev][3]
2811 base = self.index[rev][3]
2809 if base == rev:
2812 if base == rev:
2810 return nullrev
2813 return nullrev
2811 elif self.delta_config.general_delta:
2814 elif self.delta_config.general_delta:
2812 return base
2815 return base
2813 else:
2816 else:
2814 return rev - 1
2817 return rev - 1
2815
2818
2816 def issnapshot(self, rev):
2819 def issnapshot(self, rev):
2817 """tells whether rev is a snapshot"""
2820 """tells whether rev is a snapshot"""
2818 ret = self._inner.issnapshot(rev)
2821 ret = self._inner.issnapshot(rev)
2819 self.issnapshot = self._inner.issnapshot
2822 self.issnapshot = self._inner.issnapshot
2820 return ret
2823 return ret
2821
2824
2822 def snapshotdepth(self, rev):
2825 def snapshotdepth(self, rev):
2823 """number of snapshot in the chain before this one"""
2826 """number of snapshot in the chain before this one"""
2824 if not self.issnapshot(rev):
2827 if not self.issnapshot(rev):
2825 raise error.ProgrammingError(b'revision %d not a snapshot')
2828 raise error.ProgrammingError(b'revision %d not a snapshot')
2826 return len(self._inner._deltachain(rev)[0]) - 1
2829 return len(self._inner._deltachain(rev)[0]) - 1
2827
2830
2828 def revdiff(self, rev1, rev2):
2831 def revdiff(self, rev1, rev2):
2829 """return or calculate a delta between two revisions
2832 """return or calculate a delta between two revisions
2830
2833
2831 The delta calculated is in binary form and is intended to be written to
2834 The delta calculated is in binary form and is intended to be written to
2832 revlog data directly. So this function needs raw revision data.
2835 revlog data directly. So this function needs raw revision data.
2833 """
2836 """
2834 if rev1 != nullrev and self.deltaparent(rev2) == rev1:
2837 if rev1 != nullrev and self.deltaparent(rev2) == rev1:
2835 return bytes(self._inner._chunk(rev2))
2838 return bytes(self._inner._chunk(rev2))
2836
2839
2837 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2))
2840 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2))
2838
2841
2839 def revision(self, nodeorrev):
2842 def revision(self, nodeorrev):
2840 """return an uncompressed revision of a given node or revision
2843 """return an uncompressed revision of a given node or revision
2841 number.
2844 number.
2842 """
2845 """
2843 return self._revisiondata(nodeorrev)
2846 return self._revisiondata(nodeorrev)
2844
2847
2845 def sidedata(self, nodeorrev):
2848 def sidedata(self, nodeorrev):
2846 """a map of extra data related to the changeset but not part of the hash
2849 """a map of extra data related to the changeset but not part of the hash
2847
2850
2848 This function currently return a dictionary. However, more advanced
2851 This function currently return a dictionary. However, more advanced
2849 mapping object will likely be used in the future for a more
2852 mapping object will likely be used in the future for a more
2850 efficient/lazy code.
2853 efficient/lazy code.
2851 """
2854 """
2852 # deal with <nodeorrev> argument type
2855 # deal with <nodeorrev> argument type
2853 if isinstance(nodeorrev, int):
2856 if isinstance(nodeorrev, int):
2854 rev = nodeorrev
2857 rev = nodeorrev
2855 else:
2858 else:
2856 rev = self.rev(nodeorrev)
2859 rev = self.rev(nodeorrev)
2857 return self._sidedata(rev)
2860 return self._sidedata(rev)
2858
2861
2859 def _rawtext(self, node, rev):
2862 def _rawtext(self, node, rev):
2860 """return the possibly unvalidated rawtext for a revision
2863 """return the possibly unvalidated rawtext for a revision
2861
2864
2862 returns (rev, rawtext, validated)
2865 returns (rev, rawtext, validated)
2863 """
2866 """
2864 # Check if we have the entry in cache
2867 # Check if we have the entry in cache
2865 # The cache entry looks like (node, rev, rawtext)
2868 # The cache entry looks like (node, rev, rawtext)
2866 if self._inner._revisioncache:
2869 if self._inner._revisioncache:
2867 if self._inner._revisioncache[0] == node:
2870 if self._inner._revisioncache[0] == node:
2868 return (rev, self._inner._revisioncache[2], True)
2871 return (rev, self._inner._revisioncache[2], True)
2869
2872
2870 if rev is None:
2873 if rev is None:
2871 rev = self.rev(node)
2874 rev = self.rev(node)
2872
2875
2873 return self._inner.raw_text(node, rev)
2876 return self._inner.raw_text(node, rev)
2874
2877
2875 def _revisiondata(self, nodeorrev, raw=False):
2878 def _revisiondata(self, nodeorrev, raw=False):
2876 # deal with <nodeorrev> argument type
2879 # deal with <nodeorrev> argument type
2877 if isinstance(nodeorrev, int):
2880 if isinstance(nodeorrev, int):
2878 rev = nodeorrev
2881 rev = nodeorrev
2879 node = self.node(rev)
2882 node = self.node(rev)
2880 else:
2883 else:
2881 node = nodeorrev
2884 node = nodeorrev
2882 rev = None
2885 rev = None
2883
2886
2884 # fast path the special `nullid` rev
2887 # fast path the special `nullid` rev
2885 if node == self.nullid:
2888 if node == self.nullid:
2886 return b""
2889 return b""
2887
2890
2888 # ``rawtext`` is the text as stored inside the revlog. Might be the
2891 # ``rawtext`` is the text as stored inside the revlog. Might be the
2889 # revision or might need to be processed to retrieve the revision.
2892 # revision or might need to be processed to retrieve the revision.
2890 rev, rawtext, validated = self._rawtext(node, rev)
2893 rev, rawtext, validated = self._rawtext(node, rev)
2891
2894
2892 if raw and validated:
2895 if raw and validated:
2893 # if we don't want to process the raw text and that raw
2896 # if we don't want to process the raw text and that raw
2894 # text is cached, we can exit early.
2897 # text is cached, we can exit early.
2895 return rawtext
2898 return rawtext
2896 if rev is None:
2899 if rev is None:
2897 rev = self.rev(node)
2900 rev = self.rev(node)
2898 # the revlog's flag for this revision
2901 # the revlog's flag for this revision
2899 # (usually alter its state or content)
2902 # (usually alter its state or content)
2900 flags = self.flags(rev)
2903 flags = self.flags(rev)
2901
2904
2902 if validated and flags == REVIDX_DEFAULT_FLAGS:
2905 if validated and flags == REVIDX_DEFAULT_FLAGS:
2903 # no extra flags set, no flag processor runs, text = rawtext
2906 # no extra flags set, no flag processor runs, text = rawtext
2904 return rawtext
2907 return rawtext
2905
2908
2906 if raw:
2909 if raw:
2907 validatehash = flagutil.processflagsraw(self, rawtext, flags)
2910 validatehash = flagutil.processflagsraw(self, rawtext, flags)
2908 text = rawtext
2911 text = rawtext
2909 else:
2912 else:
2910 r = flagutil.processflagsread(self, rawtext, flags)
2913 r = flagutil.processflagsread(self, rawtext, flags)
2911 text, validatehash = r
2914 text, validatehash = r
2912 if validatehash:
2915 if validatehash:
2913 self.checkhash(text, node, rev=rev)
2916 self.checkhash(text, node, rev=rev)
2914 if not validated:
2917 if not validated:
2915 self._inner._revisioncache = (node, rev, rawtext)
2918 self._inner._revisioncache = (node, rev, rawtext)
2916
2919
2917 return text
2920 return text
2918
2921
2919 def _sidedata(self, rev):
2922 def _sidedata(self, rev):
2920 """Return the sidedata for a given revision number."""
2923 """Return the sidedata for a given revision number."""
2921 sidedata_end = None
2924 sidedata_end = None
2922 if self._docket is not None:
2925 if self._docket is not None:
2923 sidedata_end = self._docket.sidedata_end
2926 sidedata_end = self._docket.sidedata_end
2924 return self._inner.sidedata(rev, sidedata_end)
2927 return self._inner.sidedata(rev, sidedata_end)
2925
2928
2926 def rawdata(self, nodeorrev):
2929 def rawdata(self, nodeorrev):
2927 """return an uncompressed raw data of a given node or revision number."""
2930 """return an uncompressed raw data of a given node or revision number."""
2928 return self._revisiondata(nodeorrev, raw=True)
2931 return self._revisiondata(nodeorrev, raw=True)
2929
2932
2930 def hash(self, text, p1, p2):
2933 def hash(self, text, p1, p2):
2931 """Compute a node hash.
2934 """Compute a node hash.
2932
2935
2933 Available as a function so that subclasses can replace the hash
2936 Available as a function so that subclasses can replace the hash
2934 as needed.
2937 as needed.
2935 """
2938 """
2936 return storageutil.hashrevisionsha1(text, p1, p2)
2939 return storageutil.hashrevisionsha1(text, p1, p2)
2937
2940
2938 def checkhash(self, text, node, p1=None, p2=None, rev=None):
2941 def checkhash(self, text, node, p1=None, p2=None, rev=None):
2939 """Check node hash integrity.
2942 """Check node hash integrity.
2940
2943
2941 Available as a function so that subclasses can extend hash mismatch
2944 Available as a function so that subclasses can extend hash mismatch
2942 behaviors as needed.
2945 behaviors as needed.
2943 """
2946 """
2944 try:
2947 try:
2945 if p1 is None and p2 is None:
2948 if p1 is None and p2 is None:
2946 p1, p2 = self.parents(node)
2949 p1, p2 = self.parents(node)
2947 if node != self.hash(text, p1, p2):
2950 if node != self.hash(text, p1, p2):
2948 # Clear the revision cache on hash failure. The revision cache
2951 # Clear the revision cache on hash failure. The revision cache
2949 # only stores the raw revision and clearing the cache does have
2952 # only stores the raw revision and clearing the cache does have
2950 # the side-effect that we won't have a cache hit when the raw
2953 # the side-effect that we won't have a cache hit when the raw
2951 # revision data is accessed. But this case should be rare and
2954 # revision data is accessed. But this case should be rare and
2952 # it is extra work to teach the cache about the hash
2955 # it is extra work to teach the cache about the hash
2953 # verification state.
2956 # verification state.
2954 if (
2957 if (
2955 self._inner._revisioncache
2958 self._inner._revisioncache
2956 and self._inner._revisioncache[0] == node
2959 and self._inner._revisioncache[0] == node
2957 ):
2960 ):
2958 self._inner._revisioncache = None
2961 self._inner._revisioncache = None
2959
2962
2960 revornode = rev
2963 revornode = rev
2961 if revornode is None:
2964 if revornode is None:
2962 revornode = templatefilters.short(hex(node))
2965 revornode = templatefilters.short(hex(node))
2963 raise error.RevlogError(
2966 raise error.RevlogError(
2964 _(b"integrity check failed on %s:%s")
2967 _(b"integrity check failed on %s:%s")
2965 % (self.display_id, pycompat.bytestr(revornode))
2968 % (self.display_id, pycompat.bytestr(revornode))
2966 )
2969 )
2967 except error.RevlogError:
2970 except error.RevlogError:
2968 if self.feature_config.censorable and storageutil.iscensoredtext(
2971 if self.feature_config.censorable and storageutil.iscensoredtext(
2969 text
2972 text
2970 ):
2973 ):
2971 raise error.CensoredNodeError(self.display_id, node, text)
2974 raise error.CensoredNodeError(self.display_id, node, text)
2972 raise
2975 raise
2973
2976
2974 @property
2977 @property
2975 def _split_index_file(self):
2978 def _split_index_file(self):
2976 """the path where to expect the index of an ongoing splitting operation
2979 """the path where to expect the index of an ongoing splitting operation
2977
2980
2978 The file will only exist if a splitting operation is in progress, but
2981 The file will only exist if a splitting operation is in progress, but
2979 it is always expected at the same location."""
2982 it is always expected at the same location."""
2980 parts = self.radix.split(b'/')
2983 parts = self.radix.split(b'/')
2981 if len(parts) > 1:
2984 if len(parts) > 1:
2982 # adds a '-s' prefix to the ``data/` or `meta/` base
2985 # adds a '-s' prefix to the ``data/` or `meta/` base
2983 head = parts[0] + b'-s'
2986 head = parts[0] + b'-s'
2984 mids = parts[1:-1]
2987 mids = parts[1:-1]
2985 tail = parts[-1] + b'.i'
2988 tail = parts[-1] + b'.i'
2986 pieces = [head] + mids + [tail]
2989 pieces = [head] + mids + [tail]
2987 return b'/'.join(pieces)
2990 return b'/'.join(pieces)
2988 else:
2991 else:
2989 # the revlog is stored at the root of the store (changelog or
2992 # the revlog is stored at the root of the store (changelog or
2990 # manifest), no risk of collision.
2993 # manifest), no risk of collision.
2991 return self.radix + b'.i.s'
2994 return self.radix + b'.i.s'
2992
2995
2993 def _enforceinlinesize(self, tr, side_write=True):
2996 def _enforceinlinesize(self, tr, side_write=True):
2994 """Check if the revlog is too big for inline and convert if so.
2997 """Check if the revlog is too big for inline and convert if so.
2995
2998
2996 This should be called after revisions are added to the revlog. If the
2999 This should be called after revisions are added to the revlog. If the
2997 revlog has grown too large to be an inline revlog, it will convert it
3000 revlog has grown too large to be an inline revlog, it will convert it
2998 to use multiple index and data files.
3001 to use multiple index and data files.
2999 """
3002 """
3000 tiprev = len(self) - 1
3003 tiprev = len(self) - 1
3001 total_size = self.start(tiprev) + self.length(tiprev)
3004 total_size = self.start(tiprev) + self.length(tiprev)
3002 if not self._inline or total_size < _maxinline:
3005 if not self._inline or total_size < _maxinline:
3003 return
3006 return
3004
3007
3005 if self._docket is not None:
3008 if self._docket is not None:
3006 msg = b"inline revlog should not have a docket"
3009 msg = b"inline revlog should not have a docket"
3007 raise error.ProgrammingError(msg)
3010 raise error.ProgrammingError(msg)
3008
3011
3009 troffset = tr.findoffset(self._inner.canonical_index_file)
3012 troffset = tr.findoffset(self._inner.canonical_index_file)
3010 if troffset is None:
3013 if troffset is None:
3011 raise error.RevlogError(
3014 raise error.RevlogError(
3012 _(b"%s not found in the transaction") % self._indexfile
3015 _(b"%s not found in the transaction") % self._indexfile
3013 )
3016 )
3014 if troffset:
3017 if troffset:
3015 tr.addbackup(self._inner.canonical_index_file, for_offset=True)
3018 tr.addbackup(self._inner.canonical_index_file, for_offset=True)
3016 tr.add(self._datafile, 0)
3019 tr.add(self._datafile, 0)
3017
3020
3018 new_index_file_path = None
3021 new_index_file_path = None
3019 if side_write:
3022 if side_write:
3020 old_index_file_path = self._indexfile
3023 old_index_file_path = self._indexfile
3021 new_index_file_path = self._split_index_file
3024 new_index_file_path = self._split_index_file
3022 opener = self.opener
3025 opener = self.opener
3023 weak_self = weakref.ref(self)
3026 weak_self = weakref.ref(self)
3024
3027
3025 # the "split" index replace the real index when the transaction is
3028 # the "split" index replace the real index when the transaction is
3026 # finalized
3029 # finalized
3027 def finalize_callback(tr):
3030 def finalize_callback(tr):
3028 opener.rename(
3031 opener.rename(
3029 new_index_file_path,
3032 new_index_file_path,
3030 old_index_file_path,
3033 old_index_file_path,
3031 checkambig=True,
3034 checkambig=True,
3032 )
3035 )
3033 maybe_self = weak_self()
3036 maybe_self = weak_self()
3034 if maybe_self is not None:
3037 if maybe_self is not None:
3035 maybe_self._indexfile = old_index_file_path
3038 maybe_self._indexfile = old_index_file_path
3036 maybe_self._inner.index_file = maybe_self._indexfile
3039 maybe_self._inner.index_file = maybe_self._indexfile
3037
3040
3038 def abort_callback(tr):
3041 def abort_callback(tr):
3039 maybe_self = weak_self()
3042 maybe_self = weak_self()
3040 if maybe_self is not None:
3043 if maybe_self is not None:
3041 maybe_self._indexfile = old_index_file_path
3044 maybe_self._indexfile = old_index_file_path
3042 maybe_self._inner.inline = True
3045 maybe_self._inner.inline = True
3043 maybe_self._inner.index_file = old_index_file_path
3046 maybe_self._inner.index_file = old_index_file_path
3044
3047
3045 tr.registertmp(new_index_file_path)
3048 tr.registertmp(new_index_file_path)
3046 if self.target[1] is not None:
3049 if self.target[1] is not None:
3047 callback_id = b'000-revlog-split-%d-%s' % self.target
3050 callback_id = b'000-revlog-split-%d-%s' % self.target
3048 else:
3051 else:
3049 callback_id = b'000-revlog-split-%d' % self.target[0]
3052 callback_id = b'000-revlog-split-%d' % self.target[0]
3050 tr.addfinalize(callback_id, finalize_callback)
3053 tr.addfinalize(callback_id, finalize_callback)
3051 tr.addabort(callback_id, abort_callback)
3054 tr.addabort(callback_id, abort_callback)
3052
3055
3053 self._format_flags &= ~FLAG_INLINE_DATA
3056 self._format_flags &= ~FLAG_INLINE_DATA
3054 self._inner.split_inline(
3057 self._inner.split_inline(
3055 tr,
3058 tr,
3056 self._format_flags | self._format_version,
3059 self._format_flags | self._format_version,
3057 new_index_file_path=new_index_file_path,
3060 new_index_file_path=new_index_file_path,
3058 )
3061 )
3059
3062
3060 self._inline = False
3063 self._inline = False
3061 if new_index_file_path is not None:
3064 if new_index_file_path is not None:
3062 self._indexfile = new_index_file_path
3065 self._indexfile = new_index_file_path
3063
3066
3064 nodemaputil.setup_persistent_nodemap(tr, self)
3067 nodemaputil.setup_persistent_nodemap(tr, self)
3065
3068
3066 def _nodeduplicatecallback(self, transaction, node):
3069 def _nodeduplicatecallback(self, transaction, node):
3067 """called when trying to add a node already stored."""
3070 """called when trying to add a node already stored."""
3068
3071
3069 @contextlib.contextmanager
3072 @contextlib.contextmanager
3070 def reading(self):
3073 def reading(self):
3071 with self._inner.reading():
3074 with self._inner.reading():
3072 yield
3075 yield
3073
3076
3074 @contextlib.contextmanager
3077 @contextlib.contextmanager
3075 def _writing(self, transaction):
3078 def _writing(self, transaction):
3076 if self._trypending:
3079 if self._trypending:
3077 msg = b'try to write in a `trypending` revlog: %s'
3080 msg = b'try to write in a `trypending` revlog: %s'
3078 msg %= self.display_id
3081 msg %= self.display_id
3079 raise error.ProgrammingError(msg)
3082 raise error.ProgrammingError(msg)
3080 if self._inner.is_writing:
3083 if self._inner.is_writing:
3081 yield
3084 yield
3082 else:
3085 else:
3083 data_end = None
3086 data_end = None
3084 sidedata_end = None
3087 sidedata_end = None
3085 if self._docket is not None:
3088 if self._docket is not None:
3086 data_end = self._docket.data_end
3089 data_end = self._docket.data_end
3087 sidedata_end = self._docket.sidedata_end
3090 sidedata_end = self._docket.sidedata_end
3088 with self._inner.writing(
3091 with self._inner.writing(
3089 transaction,
3092 transaction,
3090 data_end=data_end,
3093 data_end=data_end,
3091 sidedata_end=sidedata_end,
3094 sidedata_end=sidedata_end,
3092 ):
3095 ):
3093 yield
3096 yield
3094 if self._docket is not None:
3097 if self._docket is not None:
3095 self._write_docket(transaction)
3098 self._write_docket(transaction)
3096
3099
3097 @property
3100 @property
3098 def is_delaying(self):
3101 def is_delaying(self):
3099 return self._inner.is_delaying
3102 return self._inner.is_delaying
3100
3103
3101 def _write_docket(self, transaction):
3104 def _write_docket(self, transaction):
3102 """write the current docket on disk
3105 """write the current docket on disk
3103
3106
3104 Exist as a method to help changelog to implement transaction logic
3107 Exist as a method to help changelog to implement transaction logic
3105
3108
3106 We could also imagine using the same transaction logic for all revlog
3109 We could also imagine using the same transaction logic for all revlog
3107 since docket are cheap."""
3110 since docket are cheap."""
3108 self._docket.write(transaction)
3111 self._docket.write(transaction)
3109
3112
3110 def addrevision(
3113 def addrevision(
3111 self,
3114 self,
3112 text,
3115 text,
3113 transaction,
3116 transaction,
3114 link,
3117 link,
3115 p1,
3118 p1,
3116 p2,
3119 p2,
3117 cachedelta=None,
3120 cachedelta=None,
3118 node=None,
3121 node=None,
3119 flags=REVIDX_DEFAULT_FLAGS,
3122 flags=REVIDX_DEFAULT_FLAGS,
3120 deltacomputer=None,
3123 deltacomputer=None,
3121 sidedata=None,
3124 sidedata=None,
3122 ):
3125 ):
3123 """add a revision to the log
3126 """add a revision to the log
3124
3127
3125 text - the revision data to add
3128 text - the revision data to add
3126 transaction - the transaction object used for rollback
3129 transaction - the transaction object used for rollback
3127 link - the linkrev data to add
3130 link - the linkrev data to add
3128 p1, p2 - the parent nodeids of the revision
3131 p1, p2 - the parent nodeids of the revision
3129 cachedelta - an optional precomputed delta
3132 cachedelta - an optional precomputed delta
3130 node - nodeid of revision; typically node is not specified, and it is
3133 node - nodeid of revision; typically node is not specified, and it is
3131 computed by default as hash(text, p1, p2), however subclasses might
3134 computed by default as hash(text, p1, p2), however subclasses might
3132 use different hashing method (and override checkhash() in such case)
3135 use different hashing method (and override checkhash() in such case)
3133 flags - the known flags to set on the revision
3136 flags - the known flags to set on the revision
3134 deltacomputer - an optional deltacomputer instance shared between
3137 deltacomputer - an optional deltacomputer instance shared between
3135 multiple calls
3138 multiple calls
3136 """
3139 """
3137 if link == nullrev:
3140 if link == nullrev:
3138 raise error.RevlogError(
3141 raise error.RevlogError(
3139 _(b"attempted to add linkrev -1 to %s") % self.display_id
3142 _(b"attempted to add linkrev -1 to %s") % self.display_id
3140 )
3143 )
3141
3144
3142 if sidedata is None:
3145 if sidedata is None:
3143 sidedata = {}
3146 sidedata = {}
3144 elif sidedata and not self.feature_config.has_side_data:
3147 elif sidedata and not self.feature_config.has_side_data:
3145 raise error.ProgrammingError(
3148 raise error.ProgrammingError(
3146 _(b"trying to add sidedata to a revlog who don't support them")
3149 _(b"trying to add sidedata to a revlog who don't support them")
3147 )
3150 )
3148
3151
3149 if flags:
3152 if flags:
3150 node = node or self.hash(text, p1, p2)
3153 node = node or self.hash(text, p1, p2)
3151
3154
3152 rawtext, validatehash = flagutil.processflagswrite(self, text, flags)
3155 rawtext, validatehash = flagutil.processflagswrite(self, text, flags)
3153
3156
3154 # If the flag processor modifies the revision data, ignore any provided
3157 # If the flag processor modifies the revision data, ignore any provided
3155 # cachedelta.
3158 # cachedelta.
3156 if rawtext != text:
3159 if rawtext != text:
3157 cachedelta = None
3160 cachedelta = None
3158
3161
3159 if len(rawtext) > _maxentrysize:
3162 if len(rawtext) > _maxentrysize:
3160 raise error.RevlogError(
3163 raise error.RevlogError(
3161 _(
3164 _(
3162 b"%s: size of %d bytes exceeds maximum revlog storage of 2GiB"
3165 b"%s: size of %d bytes exceeds maximum revlog storage of 2GiB"
3163 )
3166 )
3164 % (self.display_id, len(rawtext))
3167 % (self.display_id, len(rawtext))
3165 )
3168 )
3166
3169
3167 node = node or self.hash(rawtext, p1, p2)
3170 node = node or self.hash(rawtext, p1, p2)
3168 rev = self.index.get_rev(node)
3171 rev = self.index.get_rev(node)
3169 if rev is not None:
3172 if rev is not None:
3170 return rev
3173 return rev
3171
3174
3172 if validatehash:
3175 if validatehash:
3173 self.checkhash(rawtext, node, p1=p1, p2=p2)
3176 self.checkhash(rawtext, node, p1=p1, p2=p2)
3174
3177
3175 return self.addrawrevision(
3178 return self.addrawrevision(
3176 rawtext,
3179 rawtext,
3177 transaction,
3180 transaction,
3178 link,
3181 link,
3179 p1,
3182 p1,
3180 p2,
3183 p2,
3181 node,
3184 node,
3182 flags,
3185 flags,
3183 cachedelta=cachedelta,
3186 cachedelta=cachedelta,
3184 deltacomputer=deltacomputer,
3187 deltacomputer=deltacomputer,
3185 sidedata=sidedata,
3188 sidedata=sidedata,
3186 )
3189 )
3187
3190
3188 def addrawrevision(
3191 def addrawrevision(
3189 self,
3192 self,
3190 rawtext,
3193 rawtext,
3191 transaction,
3194 transaction,
3192 link,
3195 link,
3193 p1,
3196 p1,
3194 p2,
3197 p2,
3195 node,
3198 node,
3196 flags,
3199 flags,
3197 cachedelta=None,
3200 cachedelta=None,
3198 deltacomputer=None,
3201 deltacomputer=None,
3199 sidedata=None,
3202 sidedata=None,
3200 ):
3203 ):
3201 """add a raw revision with known flags, node and parents
3204 """add a raw revision with known flags, node and parents
3202 useful when reusing a revision not stored in this revlog (ex: received
3205 useful when reusing a revision not stored in this revlog (ex: received
3203 over wire, or read from an external bundle).
3206 over wire, or read from an external bundle).
3204 """
3207 """
3205 with self._writing(transaction):
3208 with self._writing(transaction):
3206 return self._addrevision(
3209 return self._addrevision(
3207 node,
3210 node,
3208 rawtext,
3211 rawtext,
3209 transaction,
3212 transaction,
3210 link,
3213 link,
3211 p1,
3214 p1,
3212 p2,
3215 p2,
3213 flags,
3216 flags,
3214 cachedelta,
3217 cachedelta,
3215 deltacomputer=deltacomputer,
3218 deltacomputer=deltacomputer,
3216 sidedata=sidedata,
3219 sidedata=sidedata,
3217 )
3220 )
3218
3221
3219 def compress(self, data):
3222 def compress(self, data):
3220 return self._inner.compress(data)
3223 return self._inner.compress(data)
3221
3224
3222 def decompress(self, data):
3225 def decompress(self, data):
3223 return self._inner.decompress(data)
3226 return self._inner.decompress(data)
3224
3227
3225 def _addrevision(
3228 def _addrevision(
3226 self,
3229 self,
3227 node,
3230 node,
3228 rawtext,
3231 rawtext,
3229 transaction,
3232 transaction,
3230 link,
3233 link,
3231 p1,
3234 p1,
3232 p2,
3235 p2,
3233 flags,
3236 flags,
3234 cachedelta,
3237 cachedelta,
3235 alwayscache=False,
3238 alwayscache=False,
3236 deltacomputer=None,
3239 deltacomputer=None,
3237 sidedata=None,
3240 sidedata=None,
3238 ):
3241 ):
3239 """internal function to add revisions to the log
3242 """internal function to add revisions to the log
3240
3243
3241 see addrevision for argument descriptions.
3244 see addrevision for argument descriptions.
3242
3245
3243 note: "addrevision" takes non-raw text, "_addrevision" takes raw text.
3246 note: "addrevision" takes non-raw text, "_addrevision" takes raw text.
3244
3247
3245 if "deltacomputer" is not provided or None, a defaultdeltacomputer will
3248 if "deltacomputer" is not provided or None, a defaultdeltacomputer will
3246 be used.
3249 be used.
3247
3250
3248 invariants:
3251 invariants:
3249 - rawtext is optional (can be None); if not set, cachedelta must be set.
3252 - rawtext is optional (can be None); if not set, cachedelta must be set.
3250 if both are set, they must correspond to each other.
3253 if both are set, they must correspond to each other.
3251 """
3254 """
3252 if node == self.nullid:
3255 if node == self.nullid:
3253 raise error.RevlogError(
3256 raise error.RevlogError(
3254 _(b"%s: attempt to add null revision") % self.display_id
3257 _(b"%s: attempt to add null revision") % self.display_id
3255 )
3258 )
3256 if (
3259 if (
3257 node == self.nodeconstants.wdirid
3260 node == self.nodeconstants.wdirid
3258 or node in self.nodeconstants.wdirfilenodeids
3261 or node in self.nodeconstants.wdirfilenodeids
3259 ):
3262 ):
3260 raise error.RevlogError(
3263 raise error.RevlogError(
3261 _(b"%s: attempt to add wdir revision") % self.display_id
3264 _(b"%s: attempt to add wdir revision") % self.display_id
3262 )
3265 )
3263 if self._inner._writinghandles is None:
3266 if self._inner._writinghandles is None:
3264 msg = b'adding revision outside `revlog._writing` context'
3267 msg = b'adding revision outside `revlog._writing` context'
3265 raise error.ProgrammingError(msg)
3268 raise error.ProgrammingError(msg)
3266
3269
3267 btext = [rawtext]
3270 btext = [rawtext]
3268
3271
3269 curr = len(self)
3272 curr = len(self)
3270 prev = curr - 1
3273 prev = curr - 1
3271
3274
3272 offset = self._get_data_offset(prev)
3275 offset = self._get_data_offset(prev)
3273
3276
3274 if self._concurrencychecker:
3277 if self._concurrencychecker:
3275 ifh, dfh, sdfh = self._inner._writinghandles
3278 ifh, dfh, sdfh = self._inner._writinghandles
3276 # XXX no checking for the sidedata file
3279 # XXX no checking for the sidedata file
3277 if self._inline:
3280 if self._inline:
3278 # offset is "as if" it were in the .d file, so we need to add on
3281 # offset is "as if" it were in the .d file, so we need to add on
3279 # the size of the entry metadata.
3282 # the size of the entry metadata.
3280 self._concurrencychecker(
3283 self._concurrencychecker(
3281 ifh, self._indexfile, offset + curr * self.index.entry_size
3284 ifh, self._indexfile, offset + curr * self.index.entry_size
3282 )
3285 )
3283 else:
3286 else:
3284 # Entries in the .i are a consistent size.
3287 # Entries in the .i are a consistent size.
3285 self._concurrencychecker(
3288 self._concurrencychecker(
3286 ifh, self._indexfile, curr * self.index.entry_size
3289 ifh, self._indexfile, curr * self.index.entry_size
3287 )
3290 )
3288 self._concurrencychecker(dfh, self._datafile, offset)
3291 self._concurrencychecker(dfh, self._datafile, offset)
3289
3292
3290 p1r, p2r = self.rev(p1), self.rev(p2)
3293 p1r, p2r = self.rev(p1), self.rev(p2)
3291
3294
3292 # full versions are inserted when the needed deltas
3295 # full versions are inserted when the needed deltas
3293 # become comparable to the uncompressed text
3296 # become comparable to the uncompressed text
3294 if rawtext is None:
3297 if rawtext is None:
3295 # need rawtext size, before changed by flag processors, which is
3298 # need rawtext size, before changed by flag processors, which is
3296 # the non-raw size. use revlog explicitly to avoid filelog's extra
3299 # the non-raw size. use revlog explicitly to avoid filelog's extra
3297 # logic that might remove metadata size.
3300 # logic that might remove metadata size.
3298 textlen = mdiff.patchedsize(
3301 textlen = mdiff.patchedsize(
3299 revlog.size(self, cachedelta[0]), cachedelta[1]
3302 revlog.size(self, cachedelta[0]), cachedelta[1]
3300 )
3303 )
3301 else:
3304 else:
3302 textlen = len(rawtext)
3305 textlen = len(rawtext)
3303
3306
3304 if deltacomputer is None:
3307 if deltacomputer is None:
3305 write_debug = None
3308 write_debug = None
3306 if self.delta_config.debug_delta:
3309 if self.delta_config.debug_delta:
3307 write_debug = transaction._report
3310 write_debug = transaction._report
3308 deltacomputer = deltautil.deltacomputer(
3311 deltacomputer = deltautil.deltacomputer(
3309 self, write_debug=write_debug
3312 self, write_debug=write_debug
3310 )
3313 )
3311
3314
3312 if cachedelta is not None and len(cachedelta) == 2:
3315 if cachedelta is not None and len(cachedelta) == 2:
3313 # If the cached delta has no information about how it should be
3316 # If the cached delta has no information about how it should be
3314 # reused, add the default reuse instruction according to the
3317 # reused, add the default reuse instruction according to the
3315 # revlog's configuration.
3318 # revlog's configuration.
3316 if (
3319 if (
3317 self.delta_config.general_delta
3320 self.delta_config.general_delta
3318 and self.delta_config.lazy_delta_base
3321 and self.delta_config.lazy_delta_base
3319 ):
3322 ):
3320 delta_base_reuse = DELTA_BASE_REUSE_TRY
3323 delta_base_reuse = DELTA_BASE_REUSE_TRY
3321 else:
3324 else:
3322 delta_base_reuse = DELTA_BASE_REUSE_NO
3325 delta_base_reuse = DELTA_BASE_REUSE_NO
3323 cachedelta = (cachedelta[0], cachedelta[1], delta_base_reuse)
3326 cachedelta = (cachedelta[0], cachedelta[1], delta_base_reuse)
3324
3327
3325 revinfo = revlogutils.revisioninfo(
3328 revinfo = revlogutils.revisioninfo(
3326 node,
3329 node,
3327 p1,
3330 p1,
3328 p2,
3331 p2,
3329 btext,
3332 btext,
3330 textlen,
3333 textlen,
3331 cachedelta,
3334 cachedelta,
3332 flags,
3335 flags,
3333 )
3336 )
3334
3337
3335 deltainfo = deltacomputer.finddeltainfo(revinfo)
3338 deltainfo = deltacomputer.finddeltainfo(revinfo)
3336
3339
3337 compression_mode = COMP_MODE_INLINE
3340 compression_mode = COMP_MODE_INLINE
3338 if self._docket is not None:
3341 if self._docket is not None:
3339 default_comp = self._docket.default_compression_header
3342 default_comp = self._docket.default_compression_header
3340 r = deltautil.delta_compression(default_comp, deltainfo)
3343 r = deltautil.delta_compression(default_comp, deltainfo)
3341 compression_mode, deltainfo = r
3344 compression_mode, deltainfo = r
3342
3345
3343 sidedata_compression_mode = COMP_MODE_INLINE
3346 sidedata_compression_mode = COMP_MODE_INLINE
3344 if sidedata and self.feature_config.has_side_data:
3347 if sidedata and self.feature_config.has_side_data:
3345 sidedata_compression_mode = COMP_MODE_PLAIN
3348 sidedata_compression_mode = COMP_MODE_PLAIN
3346 serialized_sidedata = sidedatautil.serialize_sidedata(sidedata)
3349 serialized_sidedata = sidedatautil.serialize_sidedata(sidedata)
3347 sidedata_offset = self._docket.sidedata_end
3350 sidedata_offset = self._docket.sidedata_end
3348 h, comp_sidedata = self._inner.compress(serialized_sidedata)
3351 h, comp_sidedata = self._inner.compress(serialized_sidedata)
3349 if (
3352 if (
3350 h != b'u'
3353 h != b'u'
3351 and comp_sidedata[0:1] != b'\0'
3354 and comp_sidedata[0:1] != b'\0'
3352 and len(comp_sidedata) < len(serialized_sidedata)
3355 and len(comp_sidedata) < len(serialized_sidedata)
3353 ):
3356 ):
3354 assert not h
3357 assert not h
3355 if (
3358 if (
3356 comp_sidedata[0:1]
3359 comp_sidedata[0:1]
3357 == self._docket.default_compression_header
3360 == self._docket.default_compression_header
3358 ):
3361 ):
3359 sidedata_compression_mode = COMP_MODE_DEFAULT
3362 sidedata_compression_mode = COMP_MODE_DEFAULT
3360 serialized_sidedata = comp_sidedata
3363 serialized_sidedata = comp_sidedata
3361 else:
3364 else:
3362 sidedata_compression_mode = COMP_MODE_INLINE
3365 sidedata_compression_mode = COMP_MODE_INLINE
3363 serialized_sidedata = comp_sidedata
3366 serialized_sidedata = comp_sidedata
3364 else:
3367 else:
3365 serialized_sidedata = b""
3368 serialized_sidedata = b""
3366 # Don't store the offset if the sidedata is empty, that way
3369 # Don't store the offset if the sidedata is empty, that way
3367 # we can easily detect empty sidedata and they will be no different
3370 # we can easily detect empty sidedata and they will be no different
3368 # than ones we manually add.
3371 # than ones we manually add.
3369 sidedata_offset = 0
3372 sidedata_offset = 0
3370
3373
3371 rank = RANK_UNKNOWN
3374 rank = RANK_UNKNOWN
3372 if self.feature_config.compute_rank:
3375 if self.feature_config.compute_rank:
3373 if (p1r, p2r) == (nullrev, nullrev):
3376 if (p1r, p2r) == (nullrev, nullrev):
3374 rank = 1
3377 rank = 1
3375 elif p1r != nullrev and p2r == nullrev:
3378 elif p1r != nullrev and p2r == nullrev:
3376 rank = 1 + self.fast_rank(p1r)
3379 rank = 1 + self.fast_rank(p1r)
3377 elif p1r == nullrev and p2r != nullrev:
3380 elif p1r == nullrev and p2r != nullrev:
3378 rank = 1 + self.fast_rank(p2r)
3381 rank = 1 + self.fast_rank(p2r)
3379 else: # merge node
3382 else: # merge node
3380 if rustdagop is not None and self.index.rust_ext_compat:
3383 if rustdagop is not None and self.index.rust_ext_compat:
3381 rank = rustdagop.rank(self.index, p1r, p2r)
3384 rank = rustdagop.rank(self.index, p1r, p2r)
3382 else:
3385 else:
3383 pmin, pmax = sorted((p1r, p2r))
3386 pmin, pmax = sorted((p1r, p2r))
3384 rank = 1 + self.fast_rank(pmax)
3387 rank = 1 + self.fast_rank(pmax)
3385 rank += sum(1 for _ in self.findmissingrevs([pmax], [pmin]))
3388 rank += sum(1 for _ in self.findmissingrevs([pmax], [pmin]))
3386
3389
3387 e = revlogutils.entry(
3390 e = revlogutils.entry(
3388 flags=flags,
3391 flags=flags,
3389 data_offset=offset,
3392 data_offset=offset,
3390 data_compressed_length=deltainfo.deltalen,
3393 data_compressed_length=deltainfo.deltalen,
3391 data_uncompressed_length=textlen,
3394 data_uncompressed_length=textlen,
3392 data_compression_mode=compression_mode,
3395 data_compression_mode=compression_mode,
3393 data_delta_base=deltainfo.base,
3396 data_delta_base=deltainfo.base,
3394 link_rev=link,
3397 link_rev=link,
3395 parent_rev_1=p1r,
3398 parent_rev_1=p1r,
3396 parent_rev_2=p2r,
3399 parent_rev_2=p2r,
3397 node_id=node,
3400 node_id=node,
3398 sidedata_offset=sidedata_offset,
3401 sidedata_offset=sidedata_offset,
3399 sidedata_compressed_length=len(serialized_sidedata),
3402 sidedata_compressed_length=len(serialized_sidedata),
3400 sidedata_compression_mode=sidedata_compression_mode,
3403 sidedata_compression_mode=sidedata_compression_mode,
3401 rank=rank,
3404 rank=rank,
3402 )
3405 )
3403
3406
3404 self.index.append(e)
3407 self.index.append(e)
3405 entry = self.index.entry_binary(curr)
3408 entry = self.index.entry_binary(curr)
3406 if curr == 0 and self._docket is None:
3409 if curr == 0 and self._docket is None:
3407 header = self._format_flags | self._format_version
3410 header = self._format_flags | self._format_version
3408 header = self.index.pack_header(header)
3411 header = self.index.pack_header(header)
3409 entry = header + entry
3412 entry = header + entry
3410 self._writeentry(
3413 self._writeentry(
3411 transaction,
3414 transaction,
3412 entry,
3415 entry,
3413 deltainfo.data,
3416 deltainfo.data,
3414 link,
3417 link,
3415 offset,
3418 offset,
3416 serialized_sidedata,
3419 serialized_sidedata,
3417 sidedata_offset,
3420 sidedata_offset,
3418 )
3421 )
3419
3422
3420 rawtext = btext[0]
3423 rawtext = btext[0]
3421
3424
3422 if alwayscache and rawtext is None:
3425 if alwayscache and rawtext is None:
3423 rawtext = deltacomputer.buildtext(revinfo)
3426 rawtext = deltacomputer.buildtext(revinfo)
3424
3427
3425 if type(rawtext) == bytes: # only accept immutable objects
3428 if type(rawtext) == bytes: # only accept immutable objects
3426 self._inner._revisioncache = (node, curr, rawtext)
3429 self._inner._revisioncache = (node, curr, rawtext)
3427 self._chainbasecache[curr] = deltainfo.chainbase
3430 self._chainbasecache[curr] = deltainfo.chainbase
3428 return curr
3431 return curr
3429
3432
3430 def _get_data_offset(self, prev):
3433 def _get_data_offset(self, prev):
3431 """Returns the current offset in the (in-transaction) data file.
3434 """Returns the current offset in the (in-transaction) data file.
3432 Versions < 2 of the revlog can get this 0(1), revlog v2 needs a docket
3435 Versions < 2 of the revlog can get this 0(1), revlog v2 needs a docket
3433 file to store that information: since sidedata can be rewritten to the
3436 file to store that information: since sidedata can be rewritten to the
3434 end of the data file within a transaction, you can have cases where, for
3437 end of the data file within a transaction, you can have cases where, for
3435 example, rev `n` does not have sidedata while rev `n - 1` does, leading
3438 example, rev `n` does not have sidedata while rev `n - 1` does, leading
3436 to `n - 1`'s sidedata being written after `n`'s data.
3439 to `n - 1`'s sidedata being written after `n`'s data.
3437
3440
3438 TODO cache this in a docket file before getting out of experimental."""
3441 TODO cache this in a docket file before getting out of experimental."""
3439 if self._docket is None:
3442 if self._docket is None:
3440 return self.end(prev)
3443 return self.end(prev)
3441 else:
3444 else:
3442 return self._docket.data_end
3445 return self._docket.data_end
3443
3446
3444 def _writeentry(
3447 def _writeentry(
3445 self,
3448 self,
3446 transaction,
3449 transaction,
3447 entry,
3450 entry,
3448 data,
3451 data,
3449 link,
3452 link,
3450 offset,
3453 offset,
3451 sidedata,
3454 sidedata,
3452 sidedata_offset,
3455 sidedata_offset,
3453 ):
3456 ):
3454 # Files opened in a+ mode have inconsistent behavior on various
3457 # Files opened in a+ mode have inconsistent behavior on various
3455 # platforms. Windows requires that a file positioning call be made
3458 # platforms. Windows requires that a file positioning call be made
3456 # when the file handle transitions between reads and writes. See
3459 # when the file handle transitions between reads and writes. See
3457 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other
3460 # 3686fa2b8eee and the mixedfilemodewrapper in windows.py. On other
3458 # platforms, Python or the platform itself can be buggy. Some versions
3461 # platforms, Python or the platform itself can be buggy. Some versions
3459 # of Solaris have been observed to not append at the end of the file
3462 # of Solaris have been observed to not append at the end of the file
3460 # if the file was seeked to before the end. See issue4943 for more.
3463 # if the file was seeked to before the end. See issue4943 for more.
3461 #
3464 #
3462 # We work around this issue by inserting a seek() before writing.
3465 # We work around this issue by inserting a seek() before writing.
3463 # Note: This is likely not necessary on Python 3. However, because
3466 # Note: This is likely not necessary on Python 3. However, because
3464 # the file handle is reused for reads and may be seeked there, we need
3467 # the file handle is reused for reads and may be seeked there, we need
3465 # to be careful before changing this.
3468 # to be careful before changing this.
3466 index_end = data_end = sidedata_end = None
3469 index_end = data_end = sidedata_end = None
3467 if self._docket is not None:
3470 if self._docket is not None:
3468 index_end = self._docket.index_end
3471 index_end = self._docket.index_end
3469 data_end = self._docket.data_end
3472 data_end = self._docket.data_end
3470 sidedata_end = self._docket.sidedata_end
3473 sidedata_end = self._docket.sidedata_end
3471
3474
3472 files_end = self._inner.write_entry(
3475 files_end = self._inner.write_entry(
3473 transaction,
3476 transaction,
3474 entry,
3477 entry,
3475 data,
3478 data,
3476 link,
3479 link,
3477 offset,
3480 offset,
3478 sidedata,
3481 sidedata,
3479 sidedata_offset,
3482 sidedata_offset,
3480 index_end,
3483 index_end,
3481 data_end,
3484 data_end,
3482 sidedata_end,
3485 sidedata_end,
3483 )
3486 )
3484 self._enforceinlinesize(transaction)
3487 self._enforceinlinesize(transaction)
3485 if self._docket is not None:
3488 if self._docket is not None:
3486 self._docket.index_end = files_end[0]
3489 self._docket.index_end = files_end[0]
3487 self._docket.data_end = files_end[1]
3490 self._docket.data_end = files_end[1]
3488 self._docket.sidedata_end = files_end[2]
3491 self._docket.sidedata_end = files_end[2]
3489
3492
3490 nodemaputil.setup_persistent_nodemap(transaction, self)
3493 nodemaputil.setup_persistent_nodemap(transaction, self)
3491
3494
3492 def addgroup(
3495 def addgroup(
3493 self,
3496 self,
3494 deltas,
3497 deltas,
3495 linkmapper,
3498 linkmapper,
3496 transaction,
3499 transaction,
3497 alwayscache=False,
3500 alwayscache=False,
3498 addrevisioncb=None,
3501 addrevisioncb=None,
3499 duplicaterevisioncb=None,
3502 duplicaterevisioncb=None,
3500 debug_info=None,
3503 debug_info=None,
3501 delta_base_reuse_policy=None,
3504 delta_base_reuse_policy=None,
3502 ):
3505 ):
3503 """
3506 """
3504 add a delta group
3507 add a delta group
3505
3508
3506 given a set of deltas, add them to the revision log. the
3509 given a set of deltas, add them to the revision log. the
3507 first delta is against its parent, which should be in our
3510 first delta is against its parent, which should be in our
3508 log, the rest are against the previous delta.
3511 log, the rest are against the previous delta.
3509
3512
3510 If ``addrevisioncb`` is defined, it will be called with arguments of
3513 If ``addrevisioncb`` is defined, it will be called with arguments of
3511 this revlog and the node that was added.
3514 this revlog and the node that was added.
3512 """
3515 """
3513
3516
3514 if self._adding_group:
3517 if self._adding_group:
3515 raise error.ProgrammingError(b'cannot nest addgroup() calls')
3518 raise error.ProgrammingError(b'cannot nest addgroup() calls')
3516
3519
3517 # read the default delta-base reuse policy from revlog config if the
3520 # read the default delta-base reuse policy from revlog config if the
3518 # group did not specify one.
3521 # group did not specify one.
3519 if delta_base_reuse_policy is None:
3522 if delta_base_reuse_policy is None:
3520 if (
3523 if (
3521 self.delta_config.general_delta
3524 self.delta_config.general_delta
3522 and self.delta_config.lazy_delta_base
3525 and self.delta_config.lazy_delta_base
3523 ):
3526 ):
3524 delta_base_reuse_policy = DELTA_BASE_REUSE_TRY
3527 delta_base_reuse_policy = DELTA_BASE_REUSE_TRY
3525 else:
3528 else:
3526 delta_base_reuse_policy = DELTA_BASE_REUSE_NO
3529 delta_base_reuse_policy = DELTA_BASE_REUSE_NO
3527
3530
3528 self._adding_group = True
3531 self._adding_group = True
3529 empty = True
3532 empty = True
3530 try:
3533 try:
3531 with self._writing(transaction):
3534 with self._writing(transaction):
3532 write_debug = None
3535 write_debug = None
3533 if self.delta_config.debug_delta:
3536 if self.delta_config.debug_delta:
3534 write_debug = transaction._report
3537 write_debug = transaction._report
3535 deltacomputer = deltautil.deltacomputer(
3538 deltacomputer = deltautil.deltacomputer(
3536 self,
3539 self,
3537 write_debug=write_debug,
3540 write_debug=write_debug,
3538 debug_info=debug_info,
3541 debug_info=debug_info,
3539 )
3542 )
3540 # loop through our set of deltas
3543 # loop through our set of deltas
3541 for data in deltas:
3544 for data in deltas:
3542 (
3545 (
3543 node,
3546 node,
3544 p1,
3547 p1,
3545 p2,
3548 p2,
3546 linknode,
3549 linknode,
3547 deltabase,
3550 deltabase,
3548 delta,
3551 delta,
3549 flags,
3552 flags,
3550 sidedata,
3553 sidedata,
3551 ) = data
3554 ) = data
3552 link = linkmapper(linknode)
3555 link = linkmapper(linknode)
3553 flags = flags or REVIDX_DEFAULT_FLAGS
3556 flags = flags or REVIDX_DEFAULT_FLAGS
3554
3557
3555 rev = self.index.get_rev(node)
3558 rev = self.index.get_rev(node)
3556 if rev is not None:
3559 if rev is not None:
3557 # this can happen if two branches make the same change
3560 # this can happen if two branches make the same change
3558 self._nodeduplicatecallback(transaction, rev)
3561 self._nodeduplicatecallback(transaction, rev)
3559 if duplicaterevisioncb:
3562 if duplicaterevisioncb:
3560 duplicaterevisioncb(self, rev)
3563 duplicaterevisioncb(self, rev)
3561 empty = False
3564 empty = False
3562 continue
3565 continue
3563
3566
3564 for p in (p1, p2):
3567 for p in (p1, p2):
3565 if not self.index.has_node(p):
3568 if not self.index.has_node(p):
3566 raise error.LookupError(
3569 raise error.LookupError(
3567 p, self.radix, _(b'unknown parent')
3570 p, self.radix, _(b'unknown parent')
3568 )
3571 )
3569
3572
3570 if not self.index.has_node(deltabase):
3573 if not self.index.has_node(deltabase):
3571 raise error.LookupError(
3574 raise error.LookupError(
3572 deltabase, self.display_id, _(b'unknown delta base')
3575 deltabase, self.display_id, _(b'unknown delta base')
3573 )
3576 )
3574
3577
3575 baserev = self.rev(deltabase)
3578 baserev = self.rev(deltabase)
3576
3579
3577 if baserev != nullrev and self.iscensored(baserev):
3580 if baserev != nullrev and self.iscensored(baserev):
3578 # if base is censored, delta must be full replacement in a
3581 # if base is censored, delta must be full replacement in a
3579 # single patch operation
3582 # single patch operation
3580 hlen = struct.calcsize(b">lll")
3583 hlen = struct.calcsize(b">lll")
3581 oldlen = self.rawsize(baserev)
3584 oldlen = self.rawsize(baserev)
3582 newlen = len(delta) - hlen
3585 newlen = len(delta) - hlen
3583 if delta[:hlen] != mdiff.replacediffheader(
3586 if delta[:hlen] != mdiff.replacediffheader(
3584 oldlen, newlen
3587 oldlen, newlen
3585 ):
3588 ):
3586 raise error.CensoredBaseError(
3589 raise error.CensoredBaseError(
3587 self.display_id, self.node(baserev)
3590 self.display_id, self.node(baserev)
3588 )
3591 )
3589
3592
3590 if not flags and self._peek_iscensored(baserev, delta):
3593 if not flags and self._peek_iscensored(baserev, delta):
3591 flags |= REVIDX_ISCENSORED
3594 flags |= REVIDX_ISCENSORED
3592
3595
3593 # We assume consumers of addrevisioncb will want to retrieve
3596 # We assume consumers of addrevisioncb will want to retrieve
3594 # the added revision, which will require a call to
3597 # the added revision, which will require a call to
3595 # revision(). revision() will fast path if there is a cache
3598 # revision(). revision() will fast path if there is a cache
3596 # hit. So, we tell _addrevision() to always cache in this case.
3599 # hit. So, we tell _addrevision() to always cache in this case.
3597 # We're only using addgroup() in the context of changegroup
3600 # We're only using addgroup() in the context of changegroup
3598 # generation so the revision data can always be handled as raw
3601 # generation so the revision data can always be handled as raw
3599 # by the flagprocessor.
3602 # by the flagprocessor.
3600 rev = self._addrevision(
3603 rev = self._addrevision(
3601 node,
3604 node,
3602 None,
3605 None,
3603 transaction,
3606 transaction,
3604 link,
3607 link,
3605 p1,
3608 p1,
3606 p2,
3609 p2,
3607 flags,
3610 flags,
3608 (baserev, delta, delta_base_reuse_policy),
3611 (baserev, delta, delta_base_reuse_policy),
3609 alwayscache=alwayscache,
3612 alwayscache=alwayscache,
3610 deltacomputer=deltacomputer,
3613 deltacomputer=deltacomputer,
3611 sidedata=sidedata,
3614 sidedata=sidedata,
3612 )
3615 )
3613
3616
3614 if addrevisioncb:
3617 if addrevisioncb:
3615 addrevisioncb(self, rev)
3618 addrevisioncb(self, rev)
3616 empty = False
3619 empty = False
3617 finally:
3620 finally:
3618 self._adding_group = False
3621 self._adding_group = False
3619 return not empty
3622 return not empty
3620
3623
3621 def iscensored(self, rev):
3624 def iscensored(self, rev):
3622 """Check if a file revision is censored."""
3625 """Check if a file revision is censored."""
3623 if not self.feature_config.censorable:
3626 if not self.feature_config.censorable:
3624 return False
3627 return False
3625
3628
3626 return self.flags(rev) & REVIDX_ISCENSORED
3629 return self.flags(rev) & REVIDX_ISCENSORED
3627
3630
3628 def _peek_iscensored(self, baserev, delta):
3631 def _peek_iscensored(self, baserev, delta):
3629 """Quickly check if a delta produces a censored revision."""
3632 """Quickly check if a delta produces a censored revision."""
3630 if not self.feature_config.censorable:
3633 if not self.feature_config.censorable:
3631 return False
3634 return False
3632
3635
3633 return storageutil.deltaiscensored(delta, baserev, self.rawsize)
3636 return storageutil.deltaiscensored(delta, baserev, self.rawsize)
3634
3637
3635 def getstrippoint(self, minlink):
3638 def getstrippoint(self, minlink):
3636 """find the minimum rev that must be stripped to strip the linkrev
3639 """find the minimum rev that must be stripped to strip the linkrev
3637
3640
3638 Returns a tuple containing the minimum rev and a set of all revs that
3641 Returns a tuple containing the minimum rev and a set of all revs that
3639 have linkrevs that will be broken by this strip.
3642 have linkrevs that will be broken by this strip.
3640 """
3643 """
3641 return storageutil.resolvestripinfo(
3644 return storageutil.resolvestripinfo(
3642 minlink,
3645 minlink,
3643 len(self) - 1,
3646 len(self) - 1,
3644 self.headrevs(),
3647 self.headrevs(),
3645 self.linkrev,
3648 self.linkrev,
3646 self.parentrevs,
3649 self.parentrevs,
3647 )
3650 )
3648
3651
3649 def strip(self, minlink, transaction):
3652 def strip(self, minlink, transaction):
3650 """truncate the revlog on the first revision with a linkrev >= minlink
3653 """truncate the revlog on the first revision with a linkrev >= minlink
3651
3654
3652 This function is called when we're stripping revision minlink and
3655 This function is called when we're stripping revision minlink and
3653 its descendants from the repository.
3656 its descendants from the repository.
3654
3657
3655 We have to remove all revisions with linkrev >= minlink, because
3658 We have to remove all revisions with linkrev >= minlink, because
3656 the equivalent changelog revisions will be renumbered after the
3659 the equivalent changelog revisions will be renumbered after the
3657 strip.
3660 strip.
3658
3661
3659 So we truncate the revlog on the first of these revisions, and
3662 So we truncate the revlog on the first of these revisions, and
3660 trust that the caller has saved the revisions that shouldn't be
3663 trust that the caller has saved the revisions that shouldn't be
3661 removed and that it'll re-add them after this truncation.
3664 removed and that it'll re-add them after this truncation.
3662 """
3665 """
3663 if len(self) == 0:
3666 if len(self) == 0:
3664 return
3667 return
3665
3668
3666 rev, _ = self.getstrippoint(minlink)
3669 rev, _ = self.getstrippoint(minlink)
3667 if rev == len(self):
3670 if rev == len(self):
3668 return
3671 return
3669
3672
3670 # first truncate the files on disk
3673 # first truncate the files on disk
3671 data_end = self.start(rev)
3674 data_end = self.start(rev)
3672 if not self._inline:
3675 if not self._inline:
3673 transaction.add(self._datafile, data_end)
3676 transaction.add(self._datafile, data_end)
3674 end = rev * self.index.entry_size
3677 end = rev * self.index.entry_size
3675 else:
3678 else:
3676 end = data_end + (rev * self.index.entry_size)
3679 end = data_end + (rev * self.index.entry_size)
3677
3680
3678 if self._sidedatafile:
3681 if self._sidedatafile:
3679 sidedata_end = self.sidedata_cut_off(rev)
3682 sidedata_end = self.sidedata_cut_off(rev)
3680 transaction.add(self._sidedatafile, sidedata_end)
3683 transaction.add(self._sidedatafile, sidedata_end)
3681
3684
3682 transaction.add(self._indexfile, end)
3685 transaction.add(self._indexfile, end)
3683 if self._docket is not None:
3686 if self._docket is not None:
3684 # XXX we could, leverage the docket while stripping. However it is
3687 # XXX we could, leverage the docket while stripping. However it is
3685 # not powerfull enough at the time of this comment
3688 # not powerfull enough at the time of this comment
3686 self._docket.index_end = end
3689 self._docket.index_end = end
3687 self._docket.data_end = data_end
3690 self._docket.data_end = data_end
3688 self._docket.sidedata_end = sidedata_end
3691 self._docket.sidedata_end = sidedata_end
3689 self._docket.write(transaction, stripping=True)
3692 self._docket.write(transaction, stripping=True)
3690
3693
3691 # then reset internal state in memory to forget those revisions
3694 # then reset internal state in memory to forget those revisions
3692 self._chaininfocache = util.lrucachedict(500)
3695 self._chaininfocache = util.lrucachedict(500)
3693 self._inner.clear_cache()
3696 self._inner.clear_cache()
3694
3697
3695 del self.index[rev:-1]
3698 del self.index[rev:-1]
3696
3699
3697 def checksize(self):
3700 def checksize(self):
3698 """Check size of index and data files
3701 """Check size of index and data files
3699
3702
3700 return a (dd, di) tuple.
3703 return a (dd, di) tuple.
3701 - dd: extra bytes for the "data" file
3704 - dd: extra bytes for the "data" file
3702 - di: extra bytes for the "index" file
3705 - di: extra bytes for the "index" file
3703
3706
3704 A healthy revlog will return (0, 0).
3707 A healthy revlog will return (0, 0).
3705 """
3708 """
3706 expected = 0
3709 expected = 0
3707 if len(self):
3710 if len(self):
3708 expected = max(0, self.end(len(self) - 1))
3711 expected = max(0, self.end(len(self) - 1))
3709
3712
3710 try:
3713 try:
3711 with self._datafp() as f:
3714 with self._datafp() as f:
3712 f.seek(0, io.SEEK_END)
3715 f.seek(0, io.SEEK_END)
3713 actual = f.tell()
3716 actual = f.tell()
3714 dd = actual - expected
3717 dd = actual - expected
3715 except FileNotFoundError:
3718 except FileNotFoundError:
3716 dd = 0
3719 dd = 0
3717
3720
3718 try:
3721 try:
3719 f = self.opener(self._indexfile)
3722 f = self.opener(self._indexfile)
3720 f.seek(0, io.SEEK_END)
3723 f.seek(0, io.SEEK_END)
3721 actual = f.tell()
3724 actual = f.tell()
3722 f.close()
3725 f.close()
3723 s = self.index.entry_size
3726 s = self.index.entry_size
3724 i = max(0, actual // s)
3727 i = max(0, actual // s)
3725 di = actual - (i * s)
3728 di = actual - (i * s)
3726 if self._inline:
3729 if self._inline:
3727 databytes = 0
3730 databytes = 0
3728 for r in self:
3731 for r in self:
3729 databytes += max(0, self.length(r))
3732 databytes += max(0, self.length(r))
3730 dd = 0
3733 dd = 0
3731 di = actual - len(self) * s - databytes
3734 di = actual - len(self) * s - databytes
3732 except FileNotFoundError:
3735 except FileNotFoundError:
3733 di = 0
3736 di = 0
3734
3737
3735 return (dd, di)
3738 return (dd, di)
3736
3739
3737 def files(self):
3740 def files(self):
3738 """return list of files that compose this revlog"""
3741 """return list of files that compose this revlog"""
3739 res = [self._indexfile]
3742 res = [self._indexfile]
3740 if self._docket_file is None:
3743 if self._docket_file is None:
3741 if not self._inline:
3744 if not self._inline:
3742 res.append(self._datafile)
3745 res.append(self._datafile)
3743 else:
3746 else:
3744 res.append(self._docket_file)
3747 res.append(self._docket_file)
3745 res.extend(self._docket.old_index_filepaths(include_empty=False))
3748 res.extend(self._docket.old_index_filepaths(include_empty=False))
3746 if self._docket.data_end:
3749 if self._docket.data_end:
3747 res.append(self._datafile)
3750 res.append(self._datafile)
3748 res.extend(self._docket.old_data_filepaths(include_empty=False))
3751 res.extend(self._docket.old_data_filepaths(include_empty=False))
3749 if self._docket.sidedata_end:
3752 if self._docket.sidedata_end:
3750 res.append(self._sidedatafile)
3753 res.append(self._sidedatafile)
3751 res.extend(self._docket.old_sidedata_filepaths(include_empty=False))
3754 res.extend(self._docket.old_sidedata_filepaths(include_empty=False))
3752 return res
3755 return res
3753
3756
3754 def emitrevisions(
3757 def emitrevisions(
3755 self,
3758 self,
3756 nodes,
3759 nodes,
3757 nodesorder=None,
3760 nodesorder=None,
3758 revisiondata=False,
3761 revisiondata=False,
3759 assumehaveparentrevisions=False,
3762 assumehaveparentrevisions=False,
3760 deltamode=repository.CG_DELTAMODE_STD,
3763 deltamode=repository.CG_DELTAMODE_STD,
3761 sidedata_helpers=None,
3764 sidedata_helpers=None,
3762 debug_info=None,
3765 debug_info=None,
3763 ):
3766 ):
3764 if nodesorder not in (b'nodes', b'storage', b'linear', None):
3767 if nodesorder not in (b'nodes', b'storage', b'linear', None):
3765 raise error.ProgrammingError(
3768 raise error.ProgrammingError(
3766 b'unhandled value for nodesorder: %s' % nodesorder
3769 b'unhandled value for nodesorder: %s' % nodesorder
3767 )
3770 )
3768
3771
3769 if nodesorder is None and not self.delta_config.general_delta:
3772 if nodesorder is None and not self.delta_config.general_delta:
3770 nodesorder = b'storage'
3773 nodesorder = b'storage'
3771
3774
3772 if (
3775 if (
3773 not self._storedeltachains
3776 not self._storedeltachains
3774 and deltamode != repository.CG_DELTAMODE_PREV
3777 and deltamode != repository.CG_DELTAMODE_PREV
3775 ):
3778 ):
3776 deltamode = repository.CG_DELTAMODE_FULL
3779 deltamode = repository.CG_DELTAMODE_FULL
3777
3780
3778 return storageutil.emitrevisions(
3781 return storageutil.emitrevisions(
3779 self,
3782 self,
3780 nodes,
3783 nodes,
3781 nodesorder,
3784 nodesorder,
3782 revlogrevisiondelta,
3785 revlogrevisiondelta,
3783 deltaparentfn=self.deltaparent,
3786 deltaparentfn=self.deltaparent,
3784 candeltafn=self._candelta,
3787 candeltafn=self._candelta,
3785 rawsizefn=self.rawsize,
3788 rawsizefn=self.rawsize,
3786 revdifffn=self.revdiff,
3789 revdifffn=self.revdiff,
3787 flagsfn=self.flags,
3790 flagsfn=self.flags,
3788 deltamode=deltamode,
3791 deltamode=deltamode,
3789 revisiondata=revisiondata,
3792 revisiondata=revisiondata,
3790 assumehaveparentrevisions=assumehaveparentrevisions,
3793 assumehaveparentrevisions=assumehaveparentrevisions,
3791 sidedata_helpers=sidedata_helpers,
3794 sidedata_helpers=sidedata_helpers,
3792 debug_info=debug_info,
3795 debug_info=debug_info,
3793 )
3796 )
3794
3797
3795 DELTAREUSEALWAYS = b'always'
3798 DELTAREUSEALWAYS = b'always'
3796 DELTAREUSESAMEREVS = b'samerevs'
3799 DELTAREUSESAMEREVS = b'samerevs'
3797 DELTAREUSENEVER = b'never'
3800 DELTAREUSENEVER = b'never'
3798
3801
3799 DELTAREUSEFULLADD = b'fulladd'
3802 DELTAREUSEFULLADD = b'fulladd'
3800
3803
3801 DELTAREUSEALL = {b'always', b'samerevs', b'never', b'fulladd'}
3804 DELTAREUSEALL = {b'always', b'samerevs', b'never', b'fulladd'}
3802
3805
3803 def clone(
3806 def clone(
3804 self,
3807 self,
3805 tr,
3808 tr,
3806 destrevlog,
3809 destrevlog,
3807 addrevisioncb=None,
3810 addrevisioncb=None,
3808 deltareuse=DELTAREUSESAMEREVS,
3811 deltareuse=DELTAREUSESAMEREVS,
3809 forcedeltabothparents=None,
3812 forcedeltabothparents=None,
3810 sidedata_helpers=None,
3813 sidedata_helpers=None,
3811 ):
3814 ):
3812 """Copy this revlog to another, possibly with format changes.
3815 """Copy this revlog to another, possibly with format changes.
3813
3816
3814 The destination revlog will contain the same revisions and nodes.
3817 The destination revlog will contain the same revisions and nodes.
3815 However, it may not be bit-for-bit identical due to e.g. delta encoding
3818 However, it may not be bit-for-bit identical due to e.g. delta encoding
3816 differences.
3819 differences.
3817
3820
3818 The ``deltareuse`` argument control how deltas from the existing revlog
3821 The ``deltareuse`` argument control how deltas from the existing revlog
3819 are preserved in the destination revlog. The argument can have the
3822 are preserved in the destination revlog. The argument can have the
3820 following values:
3823 following values:
3821
3824
3822 DELTAREUSEALWAYS
3825 DELTAREUSEALWAYS
3823 Deltas will always be reused (if possible), even if the destination
3826 Deltas will always be reused (if possible), even if the destination
3824 revlog would not select the same revisions for the delta. This is the
3827 revlog would not select the same revisions for the delta. This is the
3825 fastest mode of operation.
3828 fastest mode of operation.
3826 DELTAREUSESAMEREVS
3829 DELTAREUSESAMEREVS
3827 Deltas will be reused if the destination revlog would pick the same
3830 Deltas will be reused if the destination revlog would pick the same
3828 revisions for the delta. This mode strikes a balance between speed
3831 revisions for the delta. This mode strikes a balance between speed
3829 and optimization.
3832 and optimization.
3830 DELTAREUSENEVER
3833 DELTAREUSENEVER
3831 Deltas will never be reused. This is the slowest mode of execution.
3834 Deltas will never be reused. This is the slowest mode of execution.
3832 This mode can be used to recompute deltas (e.g. if the diff/delta
3835 This mode can be used to recompute deltas (e.g. if the diff/delta
3833 algorithm changes).
3836 algorithm changes).
3834 DELTAREUSEFULLADD
3837 DELTAREUSEFULLADD
3835 Revision will be re-added as if their were new content. This is
3838 Revision will be re-added as if their were new content. This is
3836 slower than DELTAREUSEALWAYS but allow more mechanism to kicks in.
3839 slower than DELTAREUSEALWAYS but allow more mechanism to kicks in.
3837 eg: large file detection and handling.
3840 eg: large file detection and handling.
3838
3841
3839 Delta computation can be slow, so the choice of delta reuse policy can
3842 Delta computation can be slow, so the choice of delta reuse policy can
3840 significantly affect run time.
3843 significantly affect run time.
3841
3844
3842 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between
3845 The default policy (``DELTAREUSESAMEREVS``) strikes a balance between
3843 two extremes. Deltas will be reused if they are appropriate. But if the
3846 two extremes. Deltas will be reused if they are appropriate. But if the
3844 delta could choose a better revision, it will do so. This means if you
3847 delta could choose a better revision, it will do so. This means if you
3845 are converting a non-generaldelta revlog to a generaldelta revlog,
3848 are converting a non-generaldelta revlog to a generaldelta revlog,
3846 deltas will be recomputed if the delta's parent isn't a parent of the
3849 deltas will be recomputed if the delta's parent isn't a parent of the
3847 revision.
3850 revision.
3848
3851
3849 In addition to the delta policy, the ``forcedeltabothparents``
3852 In addition to the delta policy, the ``forcedeltabothparents``
3850 argument controls whether to force compute deltas against both parents
3853 argument controls whether to force compute deltas against both parents
3851 for merges. By default, the current default is used.
3854 for merges. By default, the current default is used.
3852
3855
3853 See `revlogutil.sidedata.get_sidedata_helpers` for the doc on
3856 See `revlogutil.sidedata.get_sidedata_helpers` for the doc on
3854 `sidedata_helpers`.
3857 `sidedata_helpers`.
3855 """
3858 """
3856 if deltareuse not in self.DELTAREUSEALL:
3859 if deltareuse not in self.DELTAREUSEALL:
3857 raise ValueError(
3860 raise ValueError(
3858 _(b'value for deltareuse invalid: %s') % deltareuse
3861 _(b'value for deltareuse invalid: %s') % deltareuse
3859 )
3862 )
3860
3863
3861 if len(destrevlog):
3864 if len(destrevlog):
3862 raise ValueError(_(b'destination revlog is not empty'))
3865 raise ValueError(_(b'destination revlog is not empty'))
3863
3866
3864 if getattr(self, 'filteredrevs', None):
3867 if getattr(self, 'filteredrevs', None):
3865 raise ValueError(_(b'source revlog has filtered revisions'))
3868 raise ValueError(_(b'source revlog has filtered revisions'))
3866 if getattr(destrevlog, 'filteredrevs', None):
3869 if getattr(destrevlog, 'filteredrevs', None):
3867 raise ValueError(_(b'destination revlog has filtered revisions'))
3870 raise ValueError(_(b'destination revlog has filtered revisions'))
3868
3871
3869 # lazydelta and lazydeltabase controls whether to reuse a cached delta,
3872 # lazydelta and lazydeltabase controls whether to reuse a cached delta,
3870 # if possible.
3873 # if possible.
3871 old_delta_config = destrevlog.delta_config
3874 old_delta_config = destrevlog.delta_config
3872 destrevlog.delta_config = destrevlog.delta_config.copy()
3875 destrevlog.delta_config = destrevlog.delta_config.copy()
3873
3876
3874 try:
3877 try:
3875 if deltareuse == self.DELTAREUSEALWAYS:
3878 if deltareuse == self.DELTAREUSEALWAYS:
3876 destrevlog.delta_config.lazy_delta_base = True
3879 destrevlog.delta_config.lazy_delta_base = True
3877 destrevlog.delta_config.lazy_delta = True
3880 destrevlog.delta_config.lazy_delta = True
3878 elif deltareuse == self.DELTAREUSESAMEREVS:
3881 elif deltareuse == self.DELTAREUSESAMEREVS:
3879 destrevlog.delta_config.lazy_delta_base = False
3882 destrevlog.delta_config.lazy_delta_base = False
3880 destrevlog.delta_config.lazy_delta = True
3883 destrevlog.delta_config.lazy_delta = True
3881 elif deltareuse == self.DELTAREUSENEVER:
3884 elif deltareuse == self.DELTAREUSENEVER:
3882 destrevlog.delta_config.lazy_delta_base = False
3885 destrevlog.delta_config.lazy_delta_base = False
3883 destrevlog.delta_config.lazy_delta = False
3886 destrevlog.delta_config.lazy_delta = False
3884
3887
3885 delta_both_parents = (
3888 delta_both_parents = (
3886 forcedeltabothparents or old_delta_config.delta_both_parents
3889 forcedeltabothparents or old_delta_config.delta_both_parents
3887 )
3890 )
3888 destrevlog.delta_config.delta_both_parents = delta_both_parents
3891 destrevlog.delta_config.delta_both_parents = delta_both_parents
3889
3892
3890 with self.reading(), destrevlog._writing(tr):
3893 with self.reading(), destrevlog._writing(tr):
3891 self._clone(
3894 self._clone(
3892 tr,
3895 tr,
3893 destrevlog,
3896 destrevlog,
3894 addrevisioncb,
3897 addrevisioncb,
3895 deltareuse,
3898 deltareuse,
3896 forcedeltabothparents,
3899 forcedeltabothparents,
3897 sidedata_helpers,
3900 sidedata_helpers,
3898 )
3901 )
3899
3902
3900 finally:
3903 finally:
3901 destrevlog.delta_config = old_delta_config
3904 destrevlog.delta_config = old_delta_config
3902
3905
3903 def _clone(
3906 def _clone(
3904 self,
3907 self,
3905 tr,
3908 tr,
3906 destrevlog,
3909 destrevlog,
3907 addrevisioncb,
3910 addrevisioncb,
3908 deltareuse,
3911 deltareuse,
3909 forcedeltabothparents,
3912 forcedeltabothparents,
3910 sidedata_helpers,
3913 sidedata_helpers,
3911 ):
3914 ):
3912 """perform the core duty of `revlog.clone` after parameter processing"""
3915 """perform the core duty of `revlog.clone` after parameter processing"""
3913 write_debug = None
3916 write_debug = None
3914 if self.delta_config.debug_delta:
3917 if self.delta_config.debug_delta:
3915 write_debug = tr._report
3918 write_debug = tr._report
3916 deltacomputer = deltautil.deltacomputer(
3919 deltacomputer = deltautil.deltacomputer(
3917 destrevlog,
3920 destrevlog,
3918 write_debug=write_debug,
3921 write_debug=write_debug,
3919 )
3922 )
3920 index = self.index
3923 index = self.index
3921 for rev in self:
3924 for rev in self:
3922 entry = index[rev]
3925 entry = index[rev]
3923
3926
3924 # Some classes override linkrev to take filtered revs into
3927 # Some classes override linkrev to take filtered revs into
3925 # account. Use raw entry from index.
3928 # account. Use raw entry from index.
3926 flags = entry[0] & 0xFFFF
3929 flags = entry[0] & 0xFFFF
3927 linkrev = entry[4]
3930 linkrev = entry[4]
3928 p1 = index[entry[5]][7]
3931 p1 = index[entry[5]][7]
3929 p2 = index[entry[6]][7]
3932 p2 = index[entry[6]][7]
3930 node = entry[7]
3933 node = entry[7]
3931
3934
3932 # (Possibly) reuse the delta from the revlog if allowed and
3935 # (Possibly) reuse the delta from the revlog if allowed and
3933 # the revlog chunk is a delta.
3936 # the revlog chunk is a delta.
3934 cachedelta = None
3937 cachedelta = None
3935 rawtext = None
3938 rawtext = None
3936 if deltareuse == self.DELTAREUSEFULLADD:
3939 if deltareuse == self.DELTAREUSEFULLADD:
3937 text = self._revisiondata(rev)
3940 text = self._revisiondata(rev)
3938 sidedata = self.sidedata(rev)
3941 sidedata = self.sidedata(rev)
3939
3942
3940 if sidedata_helpers is not None:
3943 if sidedata_helpers is not None:
3941 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers(
3944 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers(
3942 self, sidedata_helpers, sidedata, rev
3945 self, sidedata_helpers, sidedata, rev
3943 )
3946 )
3944 flags = flags | new_flags[0] & ~new_flags[1]
3947 flags = flags | new_flags[0] & ~new_flags[1]
3945
3948
3946 destrevlog.addrevision(
3949 destrevlog.addrevision(
3947 text,
3950 text,
3948 tr,
3951 tr,
3949 linkrev,
3952 linkrev,
3950 p1,
3953 p1,
3951 p2,
3954 p2,
3952 cachedelta=cachedelta,
3955 cachedelta=cachedelta,
3953 node=node,
3956 node=node,
3954 flags=flags,
3957 flags=flags,
3955 deltacomputer=deltacomputer,
3958 deltacomputer=deltacomputer,
3956 sidedata=sidedata,
3959 sidedata=sidedata,
3957 )
3960 )
3958 else:
3961 else:
3959 if destrevlog.delta_config.lazy_delta:
3962 if destrevlog.delta_config.lazy_delta:
3960 dp = self.deltaparent(rev)
3963 dp = self.deltaparent(rev)
3961 if dp != nullrev:
3964 if dp != nullrev:
3962 cachedelta = (dp, bytes(self._inner._chunk(rev)))
3965 cachedelta = (dp, bytes(self._inner._chunk(rev)))
3963
3966
3964 sidedata = None
3967 sidedata = None
3965 if not cachedelta:
3968 if not cachedelta:
3966 try:
3969 try:
3967 rawtext = self._revisiondata(rev)
3970 rawtext = self._revisiondata(rev)
3968 except error.CensoredNodeError as censored:
3971 except error.CensoredNodeError as censored:
3969 assert flags & REVIDX_ISCENSORED
3972 assert flags & REVIDX_ISCENSORED
3970 rawtext = censored.tombstone
3973 rawtext = censored.tombstone
3971 sidedata = self.sidedata(rev)
3974 sidedata = self.sidedata(rev)
3972 if sidedata is None:
3975 if sidedata is None:
3973 sidedata = self.sidedata(rev)
3976 sidedata = self.sidedata(rev)
3974
3977
3975 if sidedata_helpers is not None:
3978 if sidedata_helpers is not None:
3976 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers(
3979 (sidedata, new_flags) = sidedatautil.run_sidedata_helpers(
3977 self, sidedata_helpers, sidedata, rev
3980 self, sidedata_helpers, sidedata, rev
3978 )
3981 )
3979 flags = flags | new_flags[0] & ~new_flags[1]
3982 flags = flags | new_flags[0] & ~new_flags[1]
3980
3983
3981 destrevlog._addrevision(
3984 destrevlog._addrevision(
3982 node,
3985 node,
3983 rawtext,
3986 rawtext,
3984 tr,
3987 tr,
3985 linkrev,
3988 linkrev,
3986 p1,
3989 p1,
3987 p2,
3990 p2,
3988 flags,
3991 flags,
3989 cachedelta,
3992 cachedelta,
3990 deltacomputer=deltacomputer,
3993 deltacomputer=deltacomputer,
3991 sidedata=sidedata,
3994 sidedata=sidedata,
3992 )
3995 )
3993
3996
3994 if addrevisioncb:
3997 if addrevisioncb:
3995 addrevisioncb(self, rev, node)
3998 addrevisioncb(self, rev, node)
3996
3999
3997 def censorrevision(self, tr, censornode, tombstone=b''):
4000 def censorrevision(self, tr, censornode, tombstone=b''):
3998 if self._format_version == REVLOGV0:
4001 if self._format_version == REVLOGV0:
3999 raise error.RevlogError(
4002 raise error.RevlogError(
4000 _(b'cannot censor with version %d revlogs')
4003 _(b'cannot censor with version %d revlogs')
4001 % self._format_version
4004 % self._format_version
4002 )
4005 )
4003 elif self._format_version == REVLOGV1:
4006 elif self._format_version == REVLOGV1:
4004 rewrite.v1_censor(self, tr, censornode, tombstone)
4007 rewrite.v1_censor(self, tr, censornode, tombstone)
4005 else:
4008 else:
4006 rewrite.v2_censor(self, tr, censornode, tombstone)
4009 rewrite.v2_censor(self, tr, censornode, tombstone)
4007
4010
4008 def verifyintegrity(self, state):
4011 def verifyintegrity(self, state):
4009 """Verifies the integrity of the revlog.
4012 """Verifies the integrity of the revlog.
4010
4013
4011 Yields ``revlogproblem`` instances describing problems that are
4014 Yields ``revlogproblem`` instances describing problems that are
4012 found.
4015 found.
4013 """
4016 """
4014 dd, di = self.checksize()
4017 dd, di = self.checksize()
4015 if dd:
4018 if dd:
4016 yield revlogproblem(error=_(b'data length off by %d bytes') % dd)
4019 yield revlogproblem(error=_(b'data length off by %d bytes') % dd)
4017 if di:
4020 if di:
4018 yield revlogproblem(error=_(b'index contains %d extra bytes') % di)
4021 yield revlogproblem(error=_(b'index contains %d extra bytes') % di)
4019
4022
4020 version = self._format_version
4023 version = self._format_version
4021
4024
4022 # The verifier tells us what version revlog we should be.
4025 # The verifier tells us what version revlog we should be.
4023 if version != state[b'expectedversion']:
4026 if version != state[b'expectedversion']:
4024 yield revlogproblem(
4027 yield revlogproblem(
4025 warning=_(b"warning: '%s' uses revlog format %d; expected %d")
4028 warning=_(b"warning: '%s' uses revlog format %d; expected %d")
4026 % (self.display_id, version, state[b'expectedversion'])
4029 % (self.display_id, version, state[b'expectedversion'])
4027 )
4030 )
4028
4031
4029 state[b'skipread'] = set()
4032 state[b'skipread'] = set()
4030 state[b'safe_renamed'] = set()
4033 state[b'safe_renamed'] = set()
4031
4034
4032 for rev in self:
4035 for rev in self:
4033 node = self.node(rev)
4036 node = self.node(rev)
4034
4037
4035 # Verify contents. 4 cases to care about:
4038 # Verify contents. 4 cases to care about:
4036 #
4039 #
4037 # common: the most common case
4040 # common: the most common case
4038 # rename: with a rename
4041 # rename: with a rename
4039 # meta: file content starts with b'\1\n', the metadata
4042 # meta: file content starts with b'\1\n', the metadata
4040 # header defined in filelog.py, but without a rename
4043 # header defined in filelog.py, but without a rename
4041 # ext: content stored externally
4044 # ext: content stored externally
4042 #
4045 #
4043 # More formally, their differences are shown below:
4046 # More formally, their differences are shown below:
4044 #
4047 #
4045 # | common | rename | meta | ext
4048 # | common | rename | meta | ext
4046 # -------------------------------------------------------
4049 # -------------------------------------------------------
4047 # flags() | 0 | 0 | 0 | not 0
4050 # flags() | 0 | 0 | 0 | not 0
4048 # renamed() | False | True | False | ?
4051 # renamed() | False | True | False | ?
4049 # rawtext[0:2]=='\1\n'| False | True | True | ?
4052 # rawtext[0:2]=='\1\n'| False | True | True | ?
4050 #
4053 #
4051 # "rawtext" means the raw text stored in revlog data, which
4054 # "rawtext" means the raw text stored in revlog data, which
4052 # could be retrieved by "rawdata(rev)". "text"
4055 # could be retrieved by "rawdata(rev)". "text"
4053 # mentioned below is "revision(rev)".
4056 # mentioned below is "revision(rev)".
4054 #
4057 #
4055 # There are 3 different lengths stored physically:
4058 # There are 3 different lengths stored physically:
4056 # 1. L1: rawsize, stored in revlog index
4059 # 1. L1: rawsize, stored in revlog index
4057 # 2. L2: len(rawtext), stored in revlog data
4060 # 2. L2: len(rawtext), stored in revlog data
4058 # 3. L3: len(text), stored in revlog data if flags==0, or
4061 # 3. L3: len(text), stored in revlog data if flags==0, or
4059 # possibly somewhere else if flags!=0
4062 # possibly somewhere else if flags!=0
4060 #
4063 #
4061 # L1 should be equal to L2. L3 could be different from them.
4064 # L1 should be equal to L2. L3 could be different from them.
4062 # "text" may or may not affect commit hash depending on flag
4065 # "text" may or may not affect commit hash depending on flag
4063 # processors (see flagutil.addflagprocessor).
4066 # processors (see flagutil.addflagprocessor).
4064 #
4067 #
4065 # | common | rename | meta | ext
4068 # | common | rename | meta | ext
4066 # -------------------------------------------------
4069 # -------------------------------------------------
4067 # rawsize() | L1 | L1 | L1 | L1
4070 # rawsize() | L1 | L1 | L1 | L1
4068 # size() | L1 | L2-LM | L1(*) | L1 (?)
4071 # size() | L1 | L2-LM | L1(*) | L1 (?)
4069 # len(rawtext) | L2 | L2 | L2 | L2
4072 # len(rawtext) | L2 | L2 | L2 | L2
4070 # len(text) | L2 | L2 | L2 | L3
4073 # len(text) | L2 | L2 | L2 | L3
4071 # len(read()) | L2 | L2-LM | L2-LM | L3 (?)
4074 # len(read()) | L2 | L2-LM | L2-LM | L3 (?)
4072 #
4075 #
4073 # LM: length of metadata, depending on rawtext
4076 # LM: length of metadata, depending on rawtext
4074 # (*): not ideal, see comment in filelog.size
4077 # (*): not ideal, see comment in filelog.size
4075 # (?): could be "- len(meta)" if the resolved content has
4078 # (?): could be "- len(meta)" if the resolved content has
4076 # rename metadata
4079 # rename metadata
4077 #
4080 #
4078 # Checks needed to be done:
4081 # Checks needed to be done:
4079 # 1. length check: L1 == L2, in all cases.
4082 # 1. length check: L1 == L2, in all cases.
4080 # 2. hash check: depending on flag processor, we may need to
4083 # 2. hash check: depending on flag processor, we may need to
4081 # use either "text" (external), or "rawtext" (in revlog).
4084 # use either "text" (external), or "rawtext" (in revlog).
4082
4085
4083 try:
4086 try:
4084 skipflags = state.get(b'skipflags', 0)
4087 skipflags = state.get(b'skipflags', 0)
4085 if skipflags:
4088 if skipflags:
4086 skipflags &= self.flags(rev)
4089 skipflags &= self.flags(rev)
4087
4090
4088 _verify_revision(self, skipflags, state, node)
4091 _verify_revision(self, skipflags, state, node)
4089
4092
4090 l1 = self.rawsize(rev)
4093 l1 = self.rawsize(rev)
4091 l2 = len(self.rawdata(node))
4094 l2 = len(self.rawdata(node))
4092
4095
4093 if l1 != l2:
4096 if l1 != l2:
4094 yield revlogproblem(
4097 yield revlogproblem(
4095 error=_(b'unpacked size is %d, %d expected') % (l2, l1),
4098 error=_(b'unpacked size is %d, %d expected') % (l2, l1),
4096 node=node,
4099 node=node,
4097 )
4100 )
4098
4101
4099 except error.CensoredNodeError:
4102 except error.CensoredNodeError:
4100 if state[b'erroroncensored']:
4103 if state[b'erroroncensored']:
4101 yield revlogproblem(
4104 yield revlogproblem(
4102 error=_(b'censored file data'), node=node
4105 error=_(b'censored file data'), node=node
4103 )
4106 )
4104 state[b'skipread'].add(node)
4107 state[b'skipread'].add(node)
4105 except Exception as e:
4108 except Exception as e:
4106 yield revlogproblem(
4109 yield revlogproblem(
4107 error=_(b'unpacking %s: %s')
4110 error=_(b'unpacking %s: %s')
4108 % (short(node), stringutil.forcebytestr(e)),
4111 % (short(node), stringutil.forcebytestr(e)),
4109 node=node,
4112 node=node,
4110 )
4113 )
4111 state[b'skipread'].add(node)
4114 state[b'skipread'].add(node)
4112
4115
4113 def storageinfo(
4116 def storageinfo(
4114 self,
4117 self,
4115 exclusivefiles=False,
4118 exclusivefiles=False,
4116 sharedfiles=False,
4119 sharedfiles=False,
4117 revisionscount=False,
4120 revisionscount=False,
4118 trackedsize=False,
4121 trackedsize=False,
4119 storedsize=False,
4122 storedsize=False,
4120 ):
4123 ):
4121 d = {}
4124 d = {}
4122
4125
4123 if exclusivefiles:
4126 if exclusivefiles:
4124 d[b'exclusivefiles'] = [(self.opener, self._indexfile)]
4127 d[b'exclusivefiles'] = [(self.opener, self._indexfile)]
4125 if not self._inline:
4128 if not self._inline:
4126 d[b'exclusivefiles'].append((self.opener, self._datafile))
4129 d[b'exclusivefiles'].append((self.opener, self._datafile))
4127
4130
4128 if sharedfiles:
4131 if sharedfiles:
4129 d[b'sharedfiles'] = []
4132 d[b'sharedfiles'] = []
4130
4133
4131 if revisionscount:
4134 if revisionscount:
4132 d[b'revisionscount'] = len(self)
4135 d[b'revisionscount'] = len(self)
4133
4136
4134 if trackedsize:
4137 if trackedsize:
4135 d[b'trackedsize'] = sum(map(self.rawsize, iter(self)))
4138 d[b'trackedsize'] = sum(map(self.rawsize, iter(self)))
4136
4139
4137 if storedsize:
4140 if storedsize:
4138 d[b'storedsize'] = sum(
4141 d[b'storedsize'] = sum(
4139 self.opener.stat(path).st_size for path in self.files()
4142 self.opener.stat(path).st_size for path in self.files()
4140 )
4143 )
4141
4144
4142 return d
4145 return d
4143
4146
4144 def rewrite_sidedata(self, transaction, helpers, startrev, endrev):
4147 def rewrite_sidedata(self, transaction, helpers, startrev, endrev):
4145 if not self.feature_config.has_side_data:
4148 if not self.feature_config.has_side_data:
4146 return
4149 return
4147 # revlog formats with sidedata support does not support inline
4150 # revlog formats with sidedata support does not support inline
4148 assert not self._inline
4151 assert not self._inline
4149 if not helpers[1] and not helpers[2]:
4152 if not helpers[1] and not helpers[2]:
4150 # Nothing to generate or remove
4153 # Nothing to generate or remove
4151 return
4154 return
4152
4155
4153 new_entries = []
4156 new_entries = []
4154 # append the new sidedata
4157 # append the new sidedata
4155 with self._writing(transaction):
4158 with self._writing(transaction):
4156 ifh, dfh, sdfh = self._inner._writinghandles
4159 ifh, dfh, sdfh = self._inner._writinghandles
4157 dfh.seek(self._docket.sidedata_end, os.SEEK_SET)
4160 dfh.seek(self._docket.sidedata_end, os.SEEK_SET)
4158
4161
4159 current_offset = sdfh.tell()
4162 current_offset = sdfh.tell()
4160 for rev in range(startrev, endrev + 1):
4163 for rev in range(startrev, endrev + 1):
4161 entry = self.index[rev]
4164 entry = self.index[rev]
4162 new_sidedata, flags = sidedatautil.run_sidedata_helpers(
4165 new_sidedata, flags = sidedatautil.run_sidedata_helpers(
4163 store=self,
4166 store=self,
4164 sidedata_helpers=helpers,
4167 sidedata_helpers=helpers,
4165 sidedata={},
4168 sidedata={},
4166 rev=rev,
4169 rev=rev,
4167 )
4170 )
4168
4171
4169 serialized_sidedata = sidedatautil.serialize_sidedata(
4172 serialized_sidedata = sidedatautil.serialize_sidedata(
4170 new_sidedata
4173 new_sidedata
4171 )
4174 )
4172
4175
4173 sidedata_compression_mode = COMP_MODE_INLINE
4176 sidedata_compression_mode = COMP_MODE_INLINE
4174 if serialized_sidedata and self.feature_config.has_side_data:
4177 if serialized_sidedata and self.feature_config.has_side_data:
4175 sidedata_compression_mode = COMP_MODE_PLAIN
4178 sidedata_compression_mode = COMP_MODE_PLAIN
4176 h, comp_sidedata = self._inner.compress(serialized_sidedata)
4179 h, comp_sidedata = self._inner.compress(serialized_sidedata)
4177 if (
4180 if (
4178 h != b'u'
4181 h != b'u'
4179 and comp_sidedata[0] != b'\0'
4182 and comp_sidedata[0] != b'\0'
4180 and len(comp_sidedata) < len(serialized_sidedata)
4183 and len(comp_sidedata) < len(serialized_sidedata)
4181 ):
4184 ):
4182 assert not h
4185 assert not h
4183 if (
4186 if (
4184 comp_sidedata[0]
4187 comp_sidedata[0]
4185 == self._docket.default_compression_header
4188 == self._docket.default_compression_header
4186 ):
4189 ):
4187 sidedata_compression_mode = COMP_MODE_DEFAULT
4190 sidedata_compression_mode = COMP_MODE_DEFAULT
4188 serialized_sidedata = comp_sidedata
4191 serialized_sidedata = comp_sidedata
4189 else:
4192 else:
4190 sidedata_compression_mode = COMP_MODE_INLINE
4193 sidedata_compression_mode = COMP_MODE_INLINE
4191 serialized_sidedata = comp_sidedata
4194 serialized_sidedata = comp_sidedata
4192 if entry[8] != 0 or entry[9] != 0:
4195 if entry[8] != 0 or entry[9] != 0:
4193 # rewriting entries that already have sidedata is not
4196 # rewriting entries that already have sidedata is not
4194 # supported yet, because it introduces garbage data in the
4197 # supported yet, because it introduces garbage data in the
4195 # revlog.
4198 # revlog.
4196 msg = b"rewriting existing sidedata is not supported yet"
4199 msg = b"rewriting existing sidedata is not supported yet"
4197 raise error.Abort(msg)
4200 raise error.Abort(msg)
4198
4201
4199 # Apply (potential) flags to add and to remove after running
4202 # Apply (potential) flags to add and to remove after running
4200 # the sidedata helpers
4203 # the sidedata helpers
4201 new_offset_flags = entry[0] | flags[0] & ~flags[1]
4204 new_offset_flags = entry[0] | flags[0] & ~flags[1]
4202 entry_update = (
4205 entry_update = (
4203 current_offset,
4206 current_offset,
4204 len(serialized_sidedata),
4207 len(serialized_sidedata),
4205 new_offset_flags,
4208 new_offset_flags,
4206 sidedata_compression_mode,
4209 sidedata_compression_mode,
4207 )
4210 )
4208
4211
4209 # the sidedata computation might have move the file cursors around
4212 # the sidedata computation might have move the file cursors around
4210 sdfh.seek(current_offset, os.SEEK_SET)
4213 sdfh.seek(current_offset, os.SEEK_SET)
4211 sdfh.write(serialized_sidedata)
4214 sdfh.write(serialized_sidedata)
4212 new_entries.append(entry_update)
4215 new_entries.append(entry_update)
4213 current_offset += len(serialized_sidedata)
4216 current_offset += len(serialized_sidedata)
4214 self._docket.sidedata_end = sdfh.tell()
4217 self._docket.sidedata_end = sdfh.tell()
4215
4218
4216 # rewrite the new index entries
4219 # rewrite the new index entries
4217 ifh.seek(startrev * self.index.entry_size)
4220 ifh.seek(startrev * self.index.entry_size)
4218 for i, e in enumerate(new_entries):
4221 for i, e in enumerate(new_entries):
4219 rev = startrev + i
4222 rev = startrev + i
4220 self.index.replace_sidedata_info(rev, *e)
4223 self.index.replace_sidedata_info(rev, *e)
4221 packed = self.index.entry_binary(rev)
4224 packed = self.index.entry_binary(rev)
4222 if rev == 0 and self._docket is None:
4225 if rev == 0 and self._docket is None:
4223 header = self._format_flags | self._format_version
4226 header = self._format_flags | self._format_version
4224 header = self.index.pack_header(header)
4227 header = self.index.pack_header(header)
4225 packed = header + packed
4228 packed = header + packed
4226 ifh.write(packed)
4229 ifh.write(packed)
@@ -1,109 +1,124 b''
1 = Mercurial 6.5.3 =
2
3 * "hgweb: pass strings in WSGI environment correctly from wsgicgi"
4 * "perf: introduce more cache invalidation option in perf::tags"
5 * "perf: add a `--clear-fnode-cache-rev` argument to perf::tags"
6 * "perf: add a --update-last flag to perf::tags"
7 * "blackbox: add a option to duplicate output to stderr too"
8 * "tags: avoid expensive access to repo.changelog in a loop"
9 * "revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV"
10 * "httppeer: fix static-http: scheme autodetection (issue6833)"
11 * "tests: backed out changeset 8037ddacad47"
12 * "stream-clone: fix a crash when a repo with an empty revlog is cloned"
13 * "censor: accept censored revision during upgrade"
14 * "revlog: avoid opening and closing the file for each cloned revision"
15
1 = Mercurial 6.5.2 =
16 = Mercurial 6.5.2 =
2
17
3 * hgweb: encode WSGI environment using the ISO-8859-1 codec
18 * hgweb: encode WSGI environment using the ISO-8859-1 codec
4 * rhg: fix the bug where sparse config is interpreted as relglob instead of glob
19 * rhg: fix the bug where sparse config is interpreted as relglob instead of glob
5 * gpg: fix an UnboundLocalError whenever using --force
20 * gpg: fix an UnboundLocalError whenever using --force
6 * transaction: fix __repr__() and make the default name bytes
21 * transaction: fix __repr__() and make the default name bytes
7 * setup: make the error "Unable to find a working hg binary" more informative
22 * setup: make the error "Unable to find a working hg binary" more informative
8 * tests: avoid test environment affecting setup.py
23 * tests: avoid test environment affecting setup.py
9 * run-tests: detect HGWITHRUSTEXT value
24 * run-tests: detect HGWITHRUSTEXT value
10
25
11 = Mercurial 6.5.1 =
26 = Mercurial 6.5.1 =
12
27
13 * A bunch of improvements to Python 3.12 compatibility
28 * A bunch of improvements to Python 3.12 compatibility
14 * repoview: fix the filter created by `extrafilter`
29 * repoview: fix the filter created by `extrafilter`
15 * Improve portability of the test suite
30 * Improve portability of the test suite
16 * fncache: fix a bug that corrupts the fncache after transaction rollback
31 * fncache: fix a bug that corrupts the fncache after transaction rollback
17 * revlog: fix the naming scheme use by split temporary file
32 * revlog: fix the naming scheme use by split temporary file
18 * perf: fix perf::tags
33 * perf: fix perf::tags
19
34
20 = Mercurial 6.5 =
35 = Mercurial 6.5 =
21
36
22 As usual, a lot of patches don't make it to this list since they're more internal.
37 As usual, a lot of patches don't make it to this list since they're more internal.
23
38
24 == New Features ==
39 == New Features ==
25
40
26 * Improved Python 3.12 compatiblity
41 * Improved Python 3.12 compatiblity
27 * configitems: enable changegroup3 by default (unless using infinitepush)
42 * configitems: enable changegroup3 by default (unless using infinitepush)
28 * extras: expose 'retained_extras' for extensions to extend
43 * extras: expose 'retained_extras' for extensions to extend
29 * stabletailgraph: implement stable-tail sort
44 * stabletailgraph: implement stable-tail sort
30 * stabletailgraph: naive version of leap computation
45 * stabletailgraph: naive version of leap computation
31 * bundle: introduce a "v3" spec
46 * bundle: introduce a "v3" spec
32 * clone-bundles: add a basic first version of automatic bundle generation
47 * clone-bundles: add a basic first version of automatic bundle generation
33 * clone-bundles: garbage collect older bundle when generating new ones
48 * clone-bundles: garbage collect older bundle when generating new ones
34 * clone-bundles: only regenerate the clone bundle when cached ration is low
49 * clone-bundles: only regenerate the clone bundle when cached ration is low
35 * clone-bundles: also control automation based on absolute number of revisions
50 * clone-bundles: also control automation based on absolute number of revisions
36 * clone-bundles: add a configuration to control auto-generation on changes
51 * clone-bundles: add a configuration to control auto-generation on changes
37 * clone-bundles: introduce a command to refresh bundle
52 * clone-bundles: introduce a command to refresh bundle
38 * clone-bundles: add a command to clear all bundles
53 * clone-bundles: add a command to clear all bundles
39 * clone-bundles: add an option to generate bundles in the background
54 * clone-bundles: add an option to generate bundles in the background
40 * clonebundles: add support for inline (streaming) clonebundles
55 * clonebundles: add support for inline (streaming) clonebundles
41 * clonebundles: adds a auto-generate.serve-inline option
56 * clonebundles: adds a auto-generate.serve-inline option
42 * match: add `filepath:` pattern to match an exact filepath relative to the root
57 * match: add `filepath:` pattern to match an exact filepath relative to the root
43 * hgweb: add "children" into the JSON template for a changeset
58 * hgweb: add "children" into the JSON template for a changeset
44 * hgweb: add support to explicitly access hidden changesets
59 * hgweb: add support to explicitly access hidden changesets
45 * pull: add --remote-hidden option and pass it through peer creation
60 * pull: add --remote-hidden option and pass it through peer creation
46 * hidden: add support for --remote-hidden to HTTP peer
61 * hidden: add support for --remote-hidden to HTTP peer
47 * hidden: support passing --hidden with `serve --stdio`
62 * hidden: support passing --hidden with `serve --stdio`
48 * hidden: add support to explicitly access hidden changesets with SSH peers
63 * hidden: add support to explicitly access hidden changesets with SSH peers
49 * perf: introduce a `perf::stream-locked-section` command
64 * perf: introduce a `perf::stream-locked-section` command
50 * perf: add a function to find a stream version generator
65 * perf: add a function to find a stream version generator
51 * perf: add support for stream-v3 during benchmark
66 * perf: add support for stream-v3 during benchmark
52 * perf: add a perf::stream-generate command
67 * perf: add a perf::stream-generate command
53 * perf: add a perf::stream-consume
68 * perf: add a perf::stream-consume
54 * cli: make debugnodemap capable of inspecting an arbitrary nodemap
69 * cli: make debugnodemap capable of inspecting an arbitrary nodemap
55 * rust: configure MSRV in Clippy
70 * rust: configure MSRV in Clippy
56 * rhg: make `rhg files` work if `ui.relative-files=true` is specified
71 * rhg: make `rhg files` work if `ui.relative-files=true` is specified
57 * rhg: support `rhg files` with `ui.relative-paths=false`
72 * rhg: support `rhg files` with `ui.relative-paths=false`
58 * rhg: support `status --print0`
73 * rhg: support `status --print0`
59 * tree-manifest: allow `debugupgraderepo` to run on tree manifest repo
74 * tree-manifest: allow `debugupgraderepo` to run on tree manifest repo
60 * library: enable runpy invocation on mercurial package
75 * library: enable runpy invocation on mercurial package
61 * library: incorporate demandimport into runpy invocation
76 * library: incorporate demandimport into runpy invocation
62 * exchange: allow passing no includes/excludes to `pull()`
77 * exchange: allow passing no includes/excludes to `pull()`
63
78
64 == New Experimental Features ==
79 == New Experimental Features ==
65
80
66 * stream-clone: add an experimental v3 version of the protocol
81 * stream-clone: add an experimental v3 version of the protocol
67 * stream-clone: support streamv3 on the cli [hg bundle]
82 * stream-clone: support streamv3 on the cli [hg bundle]
68
83
69 == Bug Fixes ==
84 == Bug Fixes ==
70
85
71 * mail: add a missing argument to properly override starttls
86 * mail: add a missing argument to properly override starttls
72 * bundle: include required phases when saving a bundle (issue6794)
87 * bundle: include required phases when saving a bundle (issue6794)
73 * outgoing: fix common-heads computation from `missingroots` argument
88 * outgoing: fix common-heads computation from `missingroots` argument
74 * strip: do not include internal changeset in the strip backup
89 * strip: do not include internal changeset in the strip backup
75 * bundle: abort if the user request bundling of internal changesets
90 * bundle: abort if the user request bundling of internal changesets
76 * bundle: prevent implicit bundling of internal changeset
91 * bundle: prevent implicit bundling of internal changeset
77 * encoding: avoid quadratic time complexity when json-encoding non-UTF8 strings
92 * encoding: avoid quadratic time complexity when json-encoding non-UTF8 strings
78 * sha1dc: Make sure SHA1DC_BIGENDIAN is set on Darwin/PowerPC
93 * sha1dc: Make sure SHA1DC_BIGENDIAN is set on Darwin/PowerPC
79 * zstd: hack include order to ensure that our zstd.h is found
94 * zstd: hack include order to ensure that our zstd.h is found
80 * dirstate: better error messages when dirstate is corrupted
95 * dirstate: better error messages when dirstate is corrupted
81 * stream-clone: avoid opening a revlog in case we do not need it
96 * stream-clone: avoid opening a revlog in case we do not need it
82 * treemanifest: make `updatecaches` update the nodemaps for all directories
97 * treemanifest: make `updatecaches` update the nodemaps for all directories
83 * rust-hg-core: move from `ouroboros` to `self_cell`
98 * rust-hg-core: move from `ouroboros` to `self_cell`
84 * rust-dependencies: switch from `users` to `whoami`
99 * rust-dependencies: switch from `users` to `whoami`
85 * dirstate-v2: actually fix the dirstate-v2 upgrade race
100 * dirstate-v2: actually fix the dirstate-v2 upgrade race
86 * dirstate: avoid leaking disk space in `hg debugrebuilddirstate`
101 * dirstate: avoid leaking disk space in `hg debugrebuilddirstate`
87 * clonebundles: add warning if auto-generate is enabled without formats
102 * clonebundles: add warning if auto-generate is enabled without formats
88 * win32mbcs: unbyteify some strings for py3 support
103 * win32mbcs: unbyteify some strings for py3 support
89 * rust-revlog: fix incorrect results with NULL_NODE prefixes
104 * rust-revlog: fix incorrect results with NULL_NODE prefixes
90 * rust-revlog: fix RevlogEntry.data() for NULL_REVISION
105 * rust-revlog: fix RevlogEntry.data() for NULL_REVISION
91
106
92 == Backwards Compatibility Changes ==
107 == Backwards Compatibility Changes ==
93
108
94 * infinitepush: aggressively deprecated infinite push
109 * infinitepush: aggressively deprecated infinite push
95 * narrow: indicated the default of 'Yes' when confirming auto-remove-includes
110 * narrow: indicated the default of 'Yes' when confirming auto-remove-includes
96
111
97 == Internal API Changes ==
112 == Internal API Changes ==
98
113
99 * Store walk was reworked to fix small race conditions in stream-clone and
114 * Store walk was reworked to fix small race conditions in stream-clone and
100 greatly improve its API robustness and flexibility.
115 greatly improve its API robustness and flexibility.
101
116
102 == Miscellaneous ==
117 == Miscellaneous ==
103
118
104 * Typechecking support was improved in a lot of places
119 * Typechecking support was improved in a lot of places
105 * Removed more useless compat code for now unsupported Python versions
120 * Removed more useless compat code for now unsupported Python versions
106 * Sped up zstd usage in Rust contexts
121 * Sped up zstd usage in Rust contexts
107 * revlog: add an exception hint when processing LFS flags without the extension
122 * revlog: add an exception hint when processing LFS flags without the extension
108 * ui: keep the progress bar around when writing if stdout is not a tty
123 * ui: keep the progress bar around when writing if stdout is not a tty
109 * transaction: use a ".bck" extension for all backup file
124 * transaction: use a ".bck" extension for all backup file
@@ -1,982 +1,994 b''
1 #require serve no-reposimplestore no-chg
1 #require serve no-reposimplestore no-chg
2
2
3 #testcases stream-legacy stream-bundle2-v2 stream-bundle2-v3
3 #testcases stream-legacy stream-bundle2-v2 stream-bundle2-v3
4
4
5 #if stream-legacy
5 #if stream-legacy
6 $ cat << EOF >> $HGRCPATH
6 $ cat << EOF >> $HGRCPATH
7 > [server]
7 > [server]
8 > bundle2.stream = no
8 > bundle2.stream = no
9 > EOF
9 > EOF
10 #endif
10 #endif
11 #if stream-bundle2-v3
11 #if stream-bundle2-v3
12 $ cat << EOF >> $HGRCPATH
12 $ cat << EOF >> $HGRCPATH
13 > [experimental]
13 > [experimental]
14 > stream-v3 = yes
14 > stream-v3 = yes
15 > EOF
15 > EOF
16 #endif
16 #endif
17
17
18 Initialize repository
18 Initialize repository
19
19
20 $ hg init server
20 $ hg init server
21 $ cd server
21 $ cd server
22 $ sh $TESTDIR/testlib/stream_clone_setup.sh
22 $ sh $TESTDIR/testlib/stream_clone_setup.sh
23 adding 00changelog-ab349180a0405010.nd
23 adding 00changelog-ab349180a0405010.nd
24 adding 00changelog.d
24 adding 00changelog.d
25 adding 00changelog.i
25 adding 00changelog.i
26 adding 00changelog.n
26 adding 00changelog.n
27 adding 00manifest.d
27 adding 00manifest.d
28 adding 00manifest.i
28 adding 00manifest.i
29 adding container/isam-build-centos7/bazel-coverage-generator-sandboxfs-compatibility-0758e3e4f6057904d44399bd666faba9e7f40686.patch
29 adding container/isam-build-centos7/bazel-coverage-generator-sandboxfs-compatibility-0758e3e4f6057904d44399bd666faba9e7f40686.patch
30 adding data/foo.d
30 adding data/foo.d
31 adding data/foo.i
31 adding data/foo.i
32 adding data/foo.n
32 adding data/foo.n
33 adding data/undo.babar
33 adding data/undo.babar
34 adding data/undo.d
34 adding data/undo.d
35 adding data/undo.foo.d
35 adding data/undo.foo.d
36 adding data/undo.foo.i
36 adding data/undo.foo.i
37 adding data/undo.foo.n
37 adding data/undo.foo.n
38 adding data/undo.i
38 adding data/undo.i
39 adding data/undo.n
39 adding data/undo.n
40 adding data/undo.py
40 adding data/undo.py
41 adding foo.d
41 adding foo.d
42 adding foo.i
42 adding foo.i
43 adding foo.n
43 adding foo.n
44 adding meta/foo.d
44 adding meta/foo.d
45 adding meta/foo.i
45 adding meta/foo.i
46 adding meta/foo.n
46 adding meta/foo.n
47 adding meta/undo.babar
47 adding meta/undo.babar
48 adding meta/undo.d
48 adding meta/undo.d
49 adding meta/undo.foo.d
49 adding meta/undo.foo.d
50 adding meta/undo.foo.i
50 adding meta/undo.foo.i
51 adding meta/undo.foo.n
51 adding meta/undo.foo.n
52 adding meta/undo.i
52 adding meta/undo.i
53 adding meta/undo.n
53 adding meta/undo.n
54 adding meta/undo.py
54 adding meta/undo.py
55 adding savanah/foo.d
55 adding savanah/foo.d
56 adding savanah/foo.i
56 adding savanah/foo.i
57 adding savanah/foo.n
57 adding savanah/foo.n
58 adding savanah/undo.babar
58 adding savanah/undo.babar
59 adding savanah/undo.d
59 adding savanah/undo.d
60 adding savanah/undo.foo.d
60 adding savanah/undo.foo.d
61 adding savanah/undo.foo.i
61 adding savanah/undo.foo.i
62 adding savanah/undo.foo.n
62 adding savanah/undo.foo.n
63 adding savanah/undo.i
63 adding savanah/undo.i
64 adding savanah/undo.n
64 adding savanah/undo.n
65 adding savanah/undo.py
65 adding savanah/undo.py
66 adding store/C\xc3\xa9lesteVille_is_a_Capital_City (esc)
66 adding store/C\xc3\xa9lesteVille_is_a_Capital_City (esc)
67 adding store/foo.d
67 adding store/foo.d
68 adding store/foo.i
68 adding store/foo.i
69 adding store/foo.n
69 adding store/foo.n
70 adding store/undo.babar
70 adding store/undo.babar
71 adding store/undo.d
71 adding store/undo.d
72 adding store/undo.foo.d
72 adding store/undo.foo.d
73 adding store/undo.foo.i
73 adding store/undo.foo.i
74 adding store/undo.foo.n
74 adding store/undo.foo.n
75 adding store/undo.i
75 adding store/undo.i
76 adding store/undo.n
76 adding store/undo.n
77 adding store/undo.py
77 adding store/undo.py
78 adding undo.babar
78 adding undo.babar
79 adding undo.d
79 adding undo.d
80 adding undo.foo.d
80 adding undo.foo.d
81 adding undo.foo.i
81 adding undo.foo.i
82 adding undo.foo.n
82 adding undo.foo.n
83 adding undo.i
83 adding undo.i
84 adding undo.n
84 adding undo.n
85 adding undo.py
85 adding undo.py
86
86
87 $ hg --config server.uncompressed=false serve -p $HGPORT -d --pid-file=hg.pid
87 $ hg --config server.uncompressed=false serve -p $HGPORT -d --pid-file=hg.pid
88 $ cat hg.pid > $DAEMON_PIDS
88 $ cat hg.pid > $DAEMON_PIDS
89 $ cd ..
89 $ cd ..
90
90
91 Check local clone
91 Check local clone
92 ==================
92 ==================
93
93
94 The logic is close enough of uncompressed.
94 The logic is close enough of uncompressed.
95 This is present here to reuse the testing around file with "special" names.
95 This is present here to reuse the testing around file with "special" names.
96
96
97 $ hg clone server local-clone
97 $ hg clone server local-clone
98 updating to branch default
98 updating to branch default
99 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
99 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
100
100
101 Check that the clone went well
101 Check that the clone went well
102
102
103 $ hg verify -R local-clone -q
103 $ hg verify -R local-clone -q
104
104
105 Check uncompressed
105 Check uncompressed
106 ==================
106 ==================
107
107
108 Cannot stream clone when server.uncompressed is set
108 Cannot stream clone when server.uncompressed is set
109
109
110 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=stream_out'
110 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=stream_out'
111 200 Script output follows
111 200 Script output follows
112
112
113 1
113 1
114
114
115 #if stream-legacy
115 #if stream-legacy
116 $ hg debugcapabilities http://localhost:$HGPORT
116 $ hg debugcapabilities http://localhost:$HGPORT
117 Main capabilities:
117 Main capabilities:
118 batch
118 batch
119 branchmap
119 branchmap
120 $USUAL_BUNDLE2_CAPS_SERVER$
120 $USUAL_BUNDLE2_CAPS_SERVER$
121 changegroupsubset
121 changegroupsubset
122 compression=$BUNDLE2_COMPRESSIONS$
122 compression=$BUNDLE2_COMPRESSIONS$
123 getbundle
123 getbundle
124 httpheader=1024
124 httpheader=1024
125 httpmediatype=0.1rx,0.1tx,0.2tx
125 httpmediatype=0.1rx,0.1tx,0.2tx
126 known
126 known
127 lookup
127 lookup
128 pushkey
128 pushkey
129 unbundle=HG10GZ,HG10BZ,HG10UN
129 unbundle=HG10GZ,HG10BZ,HG10UN
130 unbundlehash
130 unbundlehash
131 Bundle2 capabilities:
131 Bundle2 capabilities:
132 HG20
132 HG20
133 bookmarks
133 bookmarks
134 changegroup
134 changegroup
135 01
135 01
136 02
136 02
137 03
137 03
138 checkheads
138 checkheads
139 related
139 related
140 digests
140 digests
141 md5
141 md5
142 sha1
142 sha1
143 sha512
143 sha512
144 error
144 error
145 abort
145 abort
146 unsupportedcontent
146 unsupportedcontent
147 pushraced
147 pushraced
148 pushkey
148 pushkey
149 hgtagsfnodes
149 hgtagsfnodes
150 listkeys
150 listkeys
151 phases
151 phases
152 heads
152 heads
153 pushkey
153 pushkey
154 remote-changegroup
154 remote-changegroup
155 http
155 http
156 https
156 https
157
157
158 $ hg clone --stream -U http://localhost:$HGPORT server-disabled
158 $ hg clone --stream -U http://localhost:$HGPORT server-disabled
159 warning: stream clone requested but server has them disabled
159 warning: stream clone requested but server has them disabled
160 requesting all changes
160 requesting all changes
161 adding changesets
161 adding changesets
162 adding manifests
162 adding manifests
163 adding file changes
163 adding file changes
164 added 3 changesets with 1088 changes to 1088 files
164 added 3 changesets with 1088 changes to 1088 files
165 new changesets 96ee1d7354c4:5223b5e3265f
165 new changesets 96ee1d7354c4:5223b5e3265f
166
166
167 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto 0.2 --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
167 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto 0.2 --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
168 200 Script output follows
168 200 Script output follows
169 content-type: application/mercurial-0.2
169 content-type: application/mercurial-0.2
170
170
171
171
172 $ f --size body --hexdump --bytes 100
172 $ f --size body --hexdump --bytes 100
173 body: size=140
173 body: size=140
174 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
174 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
175 0010: 73 0b 45 52 52 4f 52 3a 41 42 4f 52 54 00 00 00 |s.ERROR:ABORT...|
175 0010: 73 0b 45 52 52 4f 52 3a 41 42 4f 52 54 00 00 00 |s.ERROR:ABORT...|
176 0020: 00 01 01 07 3c 04 16 6d 65 73 73 61 67 65 73 74 |....<..messagest|
176 0020: 00 01 01 07 3c 04 16 6d 65 73 73 61 67 65 73 74 |....<..messagest|
177 0030: 72 65 61 6d 20 64 61 74 61 20 72 65 71 75 65 73 |ream data reques|
177 0030: 72 65 61 6d 20 64 61 74 61 20 72 65 71 75 65 73 |ream data reques|
178 0040: 74 65 64 20 62 75 74 20 73 65 72 76 65 72 20 64 |ted but server d|
178 0040: 74 65 64 20 62 75 74 20 73 65 72 76 65 72 20 64 |ted but server d|
179 0050: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 |oes not allow th|
179 0050: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 |oes not allow th|
180 0060: 69 73 20 66 |is f|
180 0060: 69 73 20 66 |is f|
181
181
182 #endif
182 #endif
183 #if stream-bundle2-v2
183 #if stream-bundle2-v2
184 $ hg debugcapabilities http://localhost:$HGPORT
184 $ hg debugcapabilities http://localhost:$HGPORT
185 Main capabilities:
185 Main capabilities:
186 batch
186 batch
187 branchmap
187 branchmap
188 $USUAL_BUNDLE2_CAPS_SERVER$
188 $USUAL_BUNDLE2_CAPS_SERVER$
189 changegroupsubset
189 changegroupsubset
190 compression=$BUNDLE2_COMPRESSIONS$
190 compression=$BUNDLE2_COMPRESSIONS$
191 getbundle
191 getbundle
192 httpheader=1024
192 httpheader=1024
193 httpmediatype=0.1rx,0.1tx,0.2tx
193 httpmediatype=0.1rx,0.1tx,0.2tx
194 known
194 known
195 lookup
195 lookup
196 pushkey
196 pushkey
197 unbundle=HG10GZ,HG10BZ,HG10UN
197 unbundle=HG10GZ,HG10BZ,HG10UN
198 unbundlehash
198 unbundlehash
199 Bundle2 capabilities:
199 Bundle2 capabilities:
200 HG20
200 HG20
201 bookmarks
201 bookmarks
202 changegroup
202 changegroup
203 01
203 01
204 02
204 02
205 03
205 03
206 checkheads
206 checkheads
207 related
207 related
208 digests
208 digests
209 md5
209 md5
210 sha1
210 sha1
211 sha512
211 sha512
212 error
212 error
213 abort
213 abort
214 unsupportedcontent
214 unsupportedcontent
215 pushraced
215 pushraced
216 pushkey
216 pushkey
217 hgtagsfnodes
217 hgtagsfnodes
218 listkeys
218 listkeys
219 phases
219 phases
220 heads
220 heads
221 pushkey
221 pushkey
222 remote-changegroup
222 remote-changegroup
223 http
223 http
224 https
224 https
225
225
226 $ hg clone --stream -U http://localhost:$HGPORT server-disabled
226 $ hg clone --stream -U http://localhost:$HGPORT server-disabled
227 warning: stream clone requested but server has them disabled
227 warning: stream clone requested but server has them disabled
228 requesting all changes
228 requesting all changes
229 adding changesets
229 adding changesets
230 adding manifests
230 adding manifests
231 adding file changes
231 adding file changes
232 added 3 changesets with 1088 changes to 1088 files
232 added 3 changesets with 1088 changes to 1088 files
233 new changesets 96ee1d7354c4:5223b5e3265f
233 new changesets 96ee1d7354c4:5223b5e3265f
234
234
235 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto 0.2 --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
235 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto 0.2 --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
236 200 Script output follows
236 200 Script output follows
237 content-type: application/mercurial-0.2
237 content-type: application/mercurial-0.2
238
238
239
239
240 $ f --size body --hexdump --bytes 100
240 $ f --size body --hexdump --bytes 100
241 body: size=140
241 body: size=140
242 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
242 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
243 0010: 73 0b 45 52 52 4f 52 3a 41 42 4f 52 54 00 00 00 |s.ERROR:ABORT...|
243 0010: 73 0b 45 52 52 4f 52 3a 41 42 4f 52 54 00 00 00 |s.ERROR:ABORT...|
244 0020: 00 01 01 07 3c 04 16 6d 65 73 73 61 67 65 73 74 |....<..messagest|
244 0020: 00 01 01 07 3c 04 16 6d 65 73 73 61 67 65 73 74 |....<..messagest|
245 0030: 72 65 61 6d 20 64 61 74 61 20 72 65 71 75 65 73 |ream data reques|
245 0030: 72 65 61 6d 20 64 61 74 61 20 72 65 71 75 65 73 |ream data reques|
246 0040: 74 65 64 20 62 75 74 20 73 65 72 76 65 72 20 64 |ted but server d|
246 0040: 74 65 64 20 62 75 74 20 73 65 72 76 65 72 20 64 |ted but server d|
247 0050: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 |oes not allow th|
247 0050: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 |oes not allow th|
248 0060: 69 73 20 66 |is f|
248 0060: 69 73 20 66 |is f|
249
249
250 #endif
250 #endif
251 #if stream-bundle2-v3
251 #if stream-bundle2-v3
252 $ hg debugcapabilities http://localhost:$HGPORT
252 $ hg debugcapabilities http://localhost:$HGPORT
253 Main capabilities:
253 Main capabilities:
254 batch
254 batch
255 branchmap
255 branchmap
256 $USUAL_BUNDLE2_CAPS_SERVER$
256 $USUAL_BUNDLE2_CAPS_SERVER$
257 changegroupsubset
257 changegroupsubset
258 compression=$BUNDLE2_COMPRESSIONS$
258 compression=$BUNDLE2_COMPRESSIONS$
259 getbundle
259 getbundle
260 httpheader=1024
260 httpheader=1024
261 httpmediatype=0.1rx,0.1tx,0.2tx
261 httpmediatype=0.1rx,0.1tx,0.2tx
262 known
262 known
263 lookup
263 lookup
264 pushkey
264 pushkey
265 unbundle=HG10GZ,HG10BZ,HG10UN
265 unbundle=HG10GZ,HG10BZ,HG10UN
266 unbundlehash
266 unbundlehash
267 Bundle2 capabilities:
267 Bundle2 capabilities:
268 HG20
268 HG20
269 bookmarks
269 bookmarks
270 changegroup
270 changegroup
271 01
271 01
272 02
272 02
273 03
273 03
274 checkheads
274 checkheads
275 related
275 related
276 digests
276 digests
277 md5
277 md5
278 sha1
278 sha1
279 sha512
279 sha512
280 error
280 error
281 abort
281 abort
282 unsupportedcontent
282 unsupportedcontent
283 pushraced
283 pushraced
284 pushkey
284 pushkey
285 hgtagsfnodes
285 hgtagsfnodes
286 listkeys
286 listkeys
287 phases
287 phases
288 heads
288 heads
289 pushkey
289 pushkey
290 remote-changegroup
290 remote-changegroup
291 http
291 http
292 https
292 https
293
293
294 $ hg clone --stream -U http://localhost:$HGPORT server-disabled
294 $ hg clone --stream -U http://localhost:$HGPORT server-disabled
295 warning: stream clone requested but server has them disabled
295 warning: stream clone requested but server has them disabled
296 requesting all changes
296 requesting all changes
297 adding changesets
297 adding changesets
298 adding manifests
298 adding manifests
299 adding file changes
299 adding file changes
300 added 3 changesets with 1088 changes to 1088 files
300 added 3 changesets with 1088 changes to 1088 files
301 new changesets 96ee1d7354c4:5223b5e3265f
301 new changesets 96ee1d7354c4:5223b5e3265f
302
302
303 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto 0.2 --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
303 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto 0.2 --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
304 200 Script output follows
304 200 Script output follows
305 content-type: application/mercurial-0.2
305 content-type: application/mercurial-0.2
306
306
307
307
308 $ f --size body --hexdump --bytes 100
308 $ f --size body --hexdump --bytes 100
309 body: size=140
309 body: size=140
310 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
310 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
311 0010: 73 0b 45 52 52 4f 52 3a 41 42 4f 52 54 00 00 00 |s.ERROR:ABORT...|
311 0010: 73 0b 45 52 52 4f 52 3a 41 42 4f 52 54 00 00 00 |s.ERROR:ABORT...|
312 0020: 00 01 01 07 3c 04 16 6d 65 73 73 61 67 65 73 74 |....<..messagest|
312 0020: 00 01 01 07 3c 04 16 6d 65 73 73 61 67 65 73 74 |....<..messagest|
313 0030: 72 65 61 6d 20 64 61 74 61 20 72 65 71 75 65 73 |ream data reques|
313 0030: 72 65 61 6d 20 64 61 74 61 20 72 65 71 75 65 73 |ream data reques|
314 0040: 74 65 64 20 62 75 74 20 73 65 72 76 65 72 20 64 |ted but server d|
314 0040: 74 65 64 20 62 75 74 20 73 65 72 76 65 72 20 64 |ted but server d|
315 0050: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 |oes not allow th|
315 0050: 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 |oes not allow th|
316 0060: 69 73 20 66 |is f|
316 0060: 69 73 20 66 |is f|
317
317
318 #endif
318 #endif
319
319
320 $ killdaemons.py
320 $ killdaemons.py
321 $ cd server
321 $ cd server
322 $ hg serve -p $HGPORT -d --pid-file=hg.pid --error errors.txt
322 $ hg serve -p $HGPORT -d --pid-file=hg.pid --error errors.txt
323 $ cat hg.pid > $DAEMON_PIDS
323 $ cat hg.pid > $DAEMON_PIDS
324 $ cd ..
324 $ cd ..
325
325
326 Basic clone
326 Basic clone
327
327
328 #if stream-legacy
328 #if stream-legacy
329 $ hg clone --stream -U http://localhost:$HGPORT clone1
329 $ hg clone --stream -U http://localhost:$HGPORT clone1
330 streaming all changes
330 streaming all changes
331 1090 files to transfer, 102 KB of data (no-zstd !)
331 1090 files to transfer, 102 KB of data (no-zstd !)
332 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
332 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
333 1090 files to transfer, 98.8 KB of data (zstd !)
333 1090 files to transfer, 98.8 KB of data (zstd !)
334 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
334 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
335 searching for changes
335 searching for changes
336 no changes found
336 no changes found
337 $ cat server/errors.txt
337 $ cat server/errors.txt
338 #endif
338 #endif
339 #if stream-bundle2-v2
339 #if stream-bundle2-v2
340 $ hg clone --stream -U http://localhost:$HGPORT clone1
340 $ hg clone --stream -U http://localhost:$HGPORT clone1
341 streaming all changes
341 streaming all changes
342 1093 files to transfer, 102 KB of data (no-zstd !)
342 1093 files to transfer, 102 KB of data (no-zstd !)
343 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
343 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
344 1093 files to transfer, 98.9 KB of data (zstd !)
344 1093 files to transfer, 98.9 KB of data (zstd !)
345 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
345 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
346
346
347 $ ls -1 clone1/.hg/cache
347 $ ls -1 clone1/.hg/cache
348 branch2-base
348 branch2-base
349 branch2-immutable
349 branch2-immutable
350 branch2-served
350 branch2-served
351 branch2-served.hidden
351 branch2-served.hidden
352 branch2-visible
352 branch2-visible
353 branch2-visible-hidden
353 branch2-visible-hidden
354 rbc-names-v1
354 rbc-names-v1
355 rbc-revs-v1
355 rbc-revs-v1
356 tags2
356 tags2
357 tags2-served
357 tags2-served
358 $ cat server/errors.txt
358 $ cat server/errors.txt
359 #endif
359 #endif
360 #if stream-bundle2-v3
360 #if stream-bundle2-v3
361 $ hg clone --stream -U http://localhost:$HGPORT clone1
361 $ hg clone --stream -U http://localhost:$HGPORT clone1
362 streaming all changes
362 streaming all changes
363 1093 entries to transfer
363 1093 entries to transfer
364 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
364 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
365 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
365 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
366
366
367 $ ls -1 clone1/.hg/cache
367 $ ls -1 clone1/.hg/cache
368 branch2-base
368 branch2-base
369 branch2-immutable
369 branch2-immutable
370 branch2-served
370 branch2-served
371 branch2-served.hidden
371 branch2-served.hidden
372 branch2-visible
372 branch2-visible
373 branch2-visible-hidden
373 branch2-visible-hidden
374 rbc-names-v1
374 rbc-names-v1
375 rbc-revs-v1
375 rbc-revs-v1
376 tags2
376 tags2
377 tags2-served
377 tags2-served
378 $ cat server/errors.txt
378 $ cat server/errors.txt
379 #endif
379 #endif
380
380
381 getbundle requests with stream=1 are uncompressed
381 getbundle requests with stream=1 are uncompressed
382
382
383 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto '0.1 0.2 comp=zlib,none' --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps%250Astream%253Dv2&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
383 $ get-with-headers.py $LOCALIP:$HGPORT '?cmd=getbundle' content-type --bodyfile body --hgproto '0.1 0.2 comp=zlib,none' --requestheader "x-hgarg-1=bundlecaps=HG20%2Cbundle2%3DHG20%250Abookmarks%250Achangegroup%253D01%252C02%252C03%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Aphases%253Dheads%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps%250Astream%253Dv2&cg=0&common=0000000000000000000000000000000000000000&heads=c17445101a72edac06facd130d14808dfbd5c7c2&stream=1"
384 200 Script output follows
384 200 Script output follows
385 content-type: application/mercurial-0.2
385 content-type: application/mercurial-0.2
386
386
387
387
388 #if no-zstd no-rust
388 #if no-zstd no-rust
389 $ f --size --hex --bytes 256 body
389 $ f --size --hex --bytes 256 body
390 body: size=119123
390 body: size=119123
391 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
391 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
392 0010: 62 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 |b.STREAM2.......|
392 0010: 62 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 |b.STREAM2.......|
393 0020: 06 09 04 0c 26 62 79 74 65 63 6f 75 6e 74 31 30 |....&bytecount10|
393 0020: 06 09 04 0c 26 62 79 74 65 63 6f 75 6e 74 31 30 |....&bytecount10|
394 0030: 34 31 31 35 66 69 6c 65 63 6f 75 6e 74 31 30 39 |4115filecount109|
394 0030: 34 31 31 35 66 69 6c 65 63 6f 75 6e 74 31 30 39 |4115filecount109|
395 0040: 33 72 65 71 75 69 72 65 6d 65 6e 74 73 67 65 6e |3requirementsgen|
395 0040: 33 72 65 71 75 69 72 65 6d 65 6e 74 73 67 65 6e |3requirementsgen|
396 0050: 65 72 61 6c 64 65 6c 74 61 25 32 43 72 65 76 6c |eraldelta%2Crevl|
396 0050: 65 72 61 6c 64 65 6c 74 61 25 32 43 72 65 76 6c |eraldelta%2Crevl|
397 0060: 6f 67 76 31 25 32 43 73 70 61 72 73 65 72 65 76 |ogv1%2Csparserev|
397 0060: 6f 67 76 31 25 32 43 73 70 61 72 73 65 72 65 76 |ogv1%2Csparserev|
398 0070: 6c 6f 67 00 00 80 00 73 08 42 64 61 74 61 2f 30 |log....s.Bdata/0|
398 0070: 6c 6f 67 00 00 80 00 73 08 42 64 61 74 61 2f 30 |log....s.Bdata/0|
399 0080: 2e 69 00 03 00 01 00 00 00 00 00 00 00 02 00 00 |.i..............|
399 0080: 2e 69 00 03 00 01 00 00 00 00 00 00 00 02 00 00 |.i..............|
400 0090: 00 01 00 00 00 00 00 00 00 01 ff ff ff ff ff ff |................|
400 0090: 00 01 00 00 00 00 00 00 00 01 ff ff ff ff ff ff |................|
401 00a0: ff ff 80 29 63 a0 49 d3 23 87 bf ce fe 56 67 92 |...)c.I.#....Vg.|
401 00a0: ff ff 80 29 63 a0 49 d3 23 87 bf ce fe 56 67 92 |...)c.I.#....Vg.|
402 00b0: 67 2c 69 d1 ec 39 00 00 00 00 00 00 00 00 00 00 |g,i..9..........|
402 00b0: 67 2c 69 d1 ec 39 00 00 00 00 00 00 00 00 00 00 |g,i..9..........|
403 00c0: 00 00 75 30 73 26 45 64 61 74 61 2f 30 30 63 68 |..u0s&Edata/00ch|
403 00c0: 00 00 75 30 73 26 45 64 61 74 61 2f 30 30 63 68 |..u0s&Edata/00ch|
404 00d0: 61 6e 67 65 6c 6f 67 2d 61 62 33 34 39 31 38 30 |angelog-ab349180|
404 00d0: 61 6e 67 65 6c 6f 67 2d 61 62 33 34 39 31 38 30 |angelog-ab349180|
405 00e0: 61 30 34 30 35 30 31 30 2e 6e 64 2e 69 00 03 00 |a0405010.nd.i...|
405 00e0: 61 30 34 30 35 30 31 30 2e 6e 64 2e 69 00 03 00 |a0405010.nd.i...|
406 00f0: 01 00 00 00 00 00 00 00 05 00 00 00 04 00 00 00 |................|
406 00f0: 01 00 00 00 00 00 00 00 05 00 00 00 04 00 00 00 |................|
407 #endif
407 #endif
408 #if zstd no-rust
408 #if zstd no-rust
409 $ f --size --hex --bytes 256 body
409 $ f --size --hex --bytes 256 body
410 body: size=116310 (no-bigendian !)
410 body: size=116310 (no-bigendian !)
411 body: size=116305 (bigendian !)
411 body: size=116305 (bigendian !)
412 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
412 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
413 0010: 7c 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 ||.STREAM2.......|
413 0010: 7c 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 ||.STREAM2.......|
414 0020: 06 09 04 0c 40 62 79 74 65 63 6f 75 6e 74 31 30 |....@bytecount10|
414 0020: 06 09 04 0c 40 62 79 74 65 63 6f 75 6e 74 31 30 |....@bytecount10|
415 0030: 31 32 37 36 66 69 6c 65 63 6f 75 6e 74 31 30 39 |1276filecount109| (no-bigendian !)
415 0030: 31 32 37 36 66 69 6c 65 63 6f 75 6e 74 31 30 39 |1276filecount109| (no-bigendian !)
416 0030: 31 32 37 31 66 69 6c 65 63 6f 75 6e 74 31 30 39 |1271filecount109| (bigendian !)
416 0030: 31 32 37 31 66 69 6c 65 63 6f 75 6e 74 31 30 39 |1271filecount109| (bigendian !)
417 0040: 33 72 65 71 75 69 72 65 6d 65 6e 74 73 67 65 6e |3requirementsgen|
417 0040: 33 72 65 71 75 69 72 65 6d 65 6e 74 73 67 65 6e |3requirementsgen|
418 0050: 65 72 61 6c 64 65 6c 74 61 25 32 43 72 65 76 6c |eraldelta%2Crevl|
418 0050: 65 72 61 6c 64 65 6c 74 61 25 32 43 72 65 76 6c |eraldelta%2Crevl|
419 0060: 6f 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 2d 7a |og-compression-z|
419 0060: 6f 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 2d 7a |og-compression-z|
420 0070: 73 74 64 25 32 43 72 65 76 6c 6f 67 76 31 25 32 |std%2Crevlogv1%2|
420 0070: 73 74 64 25 32 43 72 65 76 6c 6f 67 76 31 25 32 |std%2Crevlogv1%2|
421 0080: 43 73 70 61 72 73 65 72 65 76 6c 6f 67 00 00 80 |Csparserevlog...|
421 0080: 43 73 70 61 72 73 65 72 65 76 6c 6f 67 00 00 80 |Csparserevlog...|
422 0090: 00 73 08 42 64 61 74 61 2f 30 2e 69 00 03 00 01 |.s.Bdata/0.i....|
422 0090: 00 73 08 42 64 61 74 61 2f 30 2e 69 00 03 00 01 |.s.Bdata/0.i....|
423 00a0: 00 00 00 00 00 00 00 02 00 00 00 01 00 00 00 00 |................|
423 00a0: 00 00 00 00 00 00 00 02 00 00 00 01 00 00 00 00 |................|
424 00b0: 00 00 00 01 ff ff ff ff ff ff ff ff 80 29 63 a0 |.............)c.|
424 00b0: 00 00 00 01 ff ff ff ff ff ff ff ff 80 29 63 a0 |.............)c.|
425 00c0: 49 d3 23 87 bf ce fe 56 67 92 67 2c 69 d1 ec 39 |I.#....Vg.g,i..9|
425 00c0: 49 d3 23 87 bf ce fe 56 67 92 67 2c 69 d1 ec 39 |I.#....Vg.g,i..9|
426 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 75 30 73 26 |............u0s&|
426 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 75 30 73 26 |............u0s&|
427 00e0: 45 64 61 74 61 2f 30 30 63 68 61 6e 67 65 6c 6f |Edata/00changelo|
427 00e0: 45 64 61 74 61 2f 30 30 63 68 61 6e 67 65 6c 6f |Edata/00changelo|
428 00f0: 67 2d 61 62 33 34 39 31 38 30 61 30 34 30 35 30 |g-ab349180a04050|
428 00f0: 67 2d 61 62 33 34 39 31 38 30 61 30 34 30 35 30 |g-ab349180a04050|
429 #endif
429 #endif
430 #if zstd rust no-dirstate-v2
430 #if zstd rust no-dirstate-v2
431 $ f --size --hex --bytes 256 body
431 $ f --size --hex --bytes 256 body
432 body: size=116310
432 body: size=116310
433 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
433 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
434 0010: 7c 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 ||.STREAM2.......|
434 0010: 7c 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 ||.STREAM2.......|
435 0020: 06 09 04 0c 40 62 79 74 65 63 6f 75 6e 74 31 30 |....@bytecount10|
435 0020: 06 09 04 0c 40 62 79 74 65 63 6f 75 6e 74 31 30 |....@bytecount10|
436 0030: 31 32 37 36 66 69 6c 65 63 6f 75 6e 74 31 30 39 |1276filecount109|
436 0030: 31 32 37 36 66 69 6c 65 63 6f 75 6e 74 31 30 39 |1276filecount109|
437 0040: 33 72 65 71 75 69 72 65 6d 65 6e 74 73 67 65 6e |3requirementsgen|
437 0040: 33 72 65 71 75 69 72 65 6d 65 6e 74 73 67 65 6e |3requirementsgen|
438 0050: 65 72 61 6c 64 65 6c 74 61 25 32 43 72 65 76 6c |eraldelta%2Crevl|
438 0050: 65 72 61 6c 64 65 6c 74 61 25 32 43 72 65 76 6c |eraldelta%2Crevl|
439 0060: 6f 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 2d 7a |og-compression-z|
439 0060: 6f 67 2d 63 6f 6d 70 72 65 73 73 69 6f 6e 2d 7a |og-compression-z|
440 0070: 73 74 64 25 32 43 72 65 76 6c 6f 67 76 31 25 32 |std%2Crevlogv1%2|
440 0070: 73 74 64 25 32 43 72 65 76 6c 6f 67 76 31 25 32 |std%2Crevlogv1%2|
441 0080: 43 73 70 61 72 73 65 72 65 76 6c 6f 67 00 00 80 |Csparserevlog...|
441 0080: 43 73 70 61 72 73 65 72 65 76 6c 6f 67 00 00 80 |Csparserevlog...|
442 0090: 00 73 08 42 64 61 74 61 2f 30 2e 69 00 03 00 01 |.s.Bdata/0.i....|
442 0090: 00 73 08 42 64 61 74 61 2f 30 2e 69 00 03 00 01 |.s.Bdata/0.i....|
443 00a0: 00 00 00 00 00 00 00 02 00 00 00 01 00 00 00 00 |................|
443 00a0: 00 00 00 00 00 00 00 02 00 00 00 01 00 00 00 00 |................|
444 00b0: 00 00 00 01 ff ff ff ff ff ff ff ff 80 29 63 a0 |.............)c.|
444 00b0: 00 00 00 01 ff ff ff ff ff ff ff ff 80 29 63 a0 |.............)c.|
445 00c0: 49 d3 23 87 bf ce fe 56 67 92 67 2c 69 d1 ec 39 |I.#....Vg.g,i..9|
445 00c0: 49 d3 23 87 bf ce fe 56 67 92 67 2c 69 d1 ec 39 |I.#....Vg.g,i..9|
446 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 75 30 73 26 |............u0s&|
446 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 75 30 73 26 |............u0s&|
447 00e0: 45 64 61 74 61 2f 30 30 63 68 61 6e 67 65 6c 6f |Edata/00changelo|
447 00e0: 45 64 61 74 61 2f 30 30 63 68 61 6e 67 65 6c 6f |Edata/00changelo|
448 00f0: 67 2d 61 62 33 34 39 31 38 30 61 30 34 30 35 30 |g-ab349180a04050|
448 00f0: 67 2d 61 62 33 34 39 31 38 30 61 30 34 30 35 30 |g-ab349180a04050|
449 #endif
449 #endif
450 #if zstd dirstate-v2
450 #if zstd dirstate-v2
451 $ f --size --hex --bytes 256 body
451 $ f --size --hex --bytes 256 body
452 body: size=109549
452 body: size=109549
453 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
453 0000: 04 6e 6f 6e 65 48 47 32 30 00 00 00 00 00 00 00 |.noneHG20.......|
454 0010: c0 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 |..STREAM2.......|
454 0010: c0 07 53 54 52 45 41 4d 32 00 00 00 00 03 00 09 |..STREAM2.......|
455 0020: 05 09 04 0c 85 62 79 74 65 63 6f 75 6e 74 39 35 |.....bytecount95|
455 0020: 05 09 04 0c 85 62 79 74 65 63 6f 75 6e 74 39 35 |.....bytecount95|
456 0030: 38 39 37 66 69 6c 65 63 6f 75 6e 74 31 30 33 30 |897filecount1030|
456 0030: 38 39 37 66 69 6c 65 63 6f 75 6e 74 31 30 33 30 |897filecount1030|
457 0040: 72 65 71 75 69 72 65 6d 65 6e 74 73 64 6f 74 65 |requirementsdote|
457 0040: 72 65 71 75 69 72 65 6d 65 6e 74 73 64 6f 74 65 |requirementsdote|
458 0050: 6e 63 6f 64 65 25 32 43 65 78 70 2d 64 69 72 73 |ncode%2Cexp-dirs|
458 0050: 6e 63 6f 64 65 25 32 43 65 78 70 2d 64 69 72 73 |ncode%2Cexp-dirs|
459 0060: 74 61 74 65 2d 76 32 25 32 43 66 6e 63 61 63 68 |tate-v2%2Cfncach|
459 0060: 74 61 74 65 2d 76 32 25 32 43 66 6e 63 61 63 68 |tate-v2%2Cfncach|
460 0070: 65 25 32 43 67 65 6e 65 72 61 6c 64 65 6c 74 61 |e%2Cgeneraldelta|
460 0070: 65 25 32 43 67 65 6e 65 72 61 6c 64 65 6c 74 61 |e%2Cgeneraldelta|
461 0080: 25 32 43 70 65 72 73 69 73 74 65 6e 74 2d 6e 6f |%2Cpersistent-no|
461 0080: 25 32 43 70 65 72 73 69 73 74 65 6e 74 2d 6e 6f |%2Cpersistent-no|
462 0090: 64 65 6d 61 70 25 32 43 72 65 76 6c 6f 67 2d 63 |demap%2Crevlog-c|
462 0090: 64 65 6d 61 70 25 32 43 72 65 76 6c 6f 67 2d 63 |demap%2Crevlog-c|
463 00a0: 6f 6d 70 72 65 73 73 69 6f 6e 2d 7a 73 74 64 25 |ompression-zstd%|
463 00a0: 6f 6d 70 72 65 73 73 69 6f 6e 2d 7a 73 74 64 25 |ompression-zstd%|
464 00b0: 32 43 72 65 76 6c 6f 67 76 31 25 32 43 73 70 61 |2Crevlogv1%2Cspa|
464 00b0: 32 43 72 65 76 6c 6f 67 76 31 25 32 43 73 70 61 |2Crevlogv1%2Cspa|
465 00c0: 72 73 65 72 65 76 6c 6f 67 25 32 43 73 74 6f 72 |rserevlog%2Cstor|
465 00c0: 72 73 65 72 65 76 6c 6f 67 25 32 43 73 74 6f 72 |rserevlog%2Cstor|
466 00d0: 65 00 00 80 00 73 08 42 64 61 74 61 2f 30 2e 69 |e....s.Bdata/0.i|
466 00d0: 65 00 00 80 00 73 08 42 64 61 74 61 2f 30 2e 69 |e....s.Bdata/0.i|
467 00e0: 00 03 00 01 00 00 00 00 00 00 00 02 00 00 00 01 |................|
467 00e0: 00 03 00 01 00 00 00 00 00 00 00 02 00 00 00 01 |................|
468 00f0: 00 00 00 00 00 00 00 01 ff ff ff ff ff ff ff ff |................|
468 00f0: 00 00 00 00 00 00 00 01 ff ff ff ff ff ff ff ff |................|
469 #endif
469 #endif
470
470
471 --uncompressed is an alias to --stream
471 --uncompressed is an alias to --stream
472
472
473 #if stream-legacy
473 #if stream-legacy
474 $ hg clone --uncompressed -U http://localhost:$HGPORT clone1-uncompressed
474 $ hg clone --uncompressed -U http://localhost:$HGPORT clone1-uncompressed
475 streaming all changes
475 streaming all changes
476 1090 files to transfer, 102 KB of data (no-zstd !)
476 1090 files to transfer, 102 KB of data (no-zstd !)
477 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
477 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
478 1090 files to transfer, 98.8 KB of data (zstd !)
478 1090 files to transfer, 98.8 KB of data (zstd !)
479 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
479 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
480 searching for changes
480 searching for changes
481 no changes found
481 no changes found
482 #endif
482 #endif
483 #if stream-bundle2-v2
483 #if stream-bundle2-v2
484 $ hg clone --uncompressed -U http://localhost:$HGPORT clone1-uncompressed
484 $ hg clone --uncompressed -U http://localhost:$HGPORT clone1-uncompressed
485 streaming all changes
485 streaming all changes
486 1093 files to transfer, 102 KB of data (no-zstd !)
486 1093 files to transfer, 102 KB of data (no-zstd !)
487 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
487 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
488 1093 files to transfer, 98.9 KB of data (zstd !)
488 1093 files to transfer, 98.9 KB of data (zstd !)
489 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
489 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
490 #endif
490 #endif
491 #if stream-bundle2-v3
491 #if stream-bundle2-v3
492 $ hg clone --uncompressed -U http://localhost:$HGPORT clone1-uncompressed
492 $ hg clone --uncompressed -U http://localhost:$HGPORT clone1-uncompressed
493 streaming all changes
493 streaming all changes
494 1093 entries to transfer
494 1093 entries to transfer
495 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
495 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
496 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
496 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
497 #endif
497 #endif
498
498
499 Clone with background file closing enabled
499 Clone with background file closing enabled
500
500
501 #if stream-legacy
501 #if stream-legacy
502 $ hg --debug --config worker.backgroundclose=true --config worker.backgroundcloseminfilecount=1 clone --stream -U http://localhost:$HGPORT clone-background | grep -v adding
502 $ hg --debug --config worker.backgroundclose=true --config worker.backgroundcloseminfilecount=1 clone --stream -U http://localhost:$HGPORT clone-background | grep -v adding
503 using http://localhost:$HGPORT/
503 using http://localhost:$HGPORT/
504 sending capabilities command
504 sending capabilities command
505 sending branchmap command
505 sending branchmap command
506 streaming all changes
506 streaming all changes
507 sending stream_out command
507 sending stream_out command
508 1090 files to transfer, 102 KB of data (no-zstd !)
508 1090 files to transfer, 102 KB of data (no-zstd !)
509 1090 files to transfer, 98.8 KB of data (zstd !)
509 1090 files to transfer, 98.8 KB of data (zstd !)
510 starting 4 threads for background file closing
510 starting 4 threads for background file closing
511 updating the branch cache
511 updating the branch cache
512 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
512 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
513 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
513 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
514 query 1; heads
514 query 1; heads
515 sending batch command
515 sending batch command
516 searching for changes
516 searching for changes
517 all remote heads known locally
517 all remote heads known locally
518 no changes found
518 no changes found
519 sending getbundle command
519 sending getbundle command
520 bundle2-input-bundle: with-transaction
520 bundle2-input-bundle: with-transaction
521 bundle2-input-part: "listkeys" (params: 1 mandatory) supported
521 bundle2-input-part: "listkeys" (params: 1 mandatory) supported
522 bundle2-input-part: "phase-heads" supported
522 bundle2-input-part: "phase-heads" supported
523 bundle2-input-part: total payload size 24
523 bundle2-input-part: total payload size 24
524 bundle2-input-bundle: 2 parts total
524 bundle2-input-bundle: 2 parts total
525 checking for updated bookmarks
525 checking for updated bookmarks
526 updating the branch cache
526 updating the branch cache
527 (sent 5 HTTP requests and * bytes; received * bytes in responses) (glob)
527 (sent 5 HTTP requests and * bytes; received * bytes in responses) (glob)
528 #endif
528 #endif
529 #if stream-bundle2-v2
529 #if stream-bundle2-v2
530 $ hg --debug --config worker.backgroundclose=true --config worker.backgroundcloseminfilecount=1 clone --stream -U http://localhost:$HGPORT clone-background | grep -v adding
530 $ hg --debug --config worker.backgroundclose=true --config worker.backgroundcloseminfilecount=1 clone --stream -U http://localhost:$HGPORT clone-background | grep -v adding
531 using http://localhost:$HGPORT/
531 using http://localhost:$HGPORT/
532 sending capabilities command
532 sending capabilities command
533 query 1; heads
533 query 1; heads
534 sending batch command
534 sending batch command
535 streaming all changes
535 streaming all changes
536 sending getbundle command
536 sending getbundle command
537 bundle2-input-bundle: with-transaction
537 bundle2-input-bundle: with-transaction
538 bundle2-input-part: "stream2" (params: 3 mandatory) supported
538 bundle2-input-part: "stream2" (params: 3 mandatory) supported
539 applying stream bundle
539 applying stream bundle
540 1093 files to transfer, 102 KB of data (no-zstd !)
540 1093 files to transfer, 102 KB of data (no-zstd !)
541 1093 files to transfer, 98.9 KB of data (zstd !)
541 1093 files to transfer, 98.9 KB of data (zstd !)
542 starting 4 threads for background file closing
542 starting 4 threads for background file closing
543 starting 4 threads for background file closing
543 starting 4 threads for background file closing
544 updating the branch cache
544 updating the branch cache
545 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
545 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
546 bundle2-input-part: total payload size 118984 (no-zstd !)
546 bundle2-input-part: total payload size 118984 (no-zstd !)
547 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
547 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
548 bundle2-input-part: total payload size 116145 (zstd no-bigendian !)
548 bundle2-input-part: total payload size 116145 (zstd no-bigendian !)
549 bundle2-input-part: total payload size 116140 (zstd bigendian !)
549 bundle2-input-part: total payload size 116140 (zstd bigendian !)
550 bundle2-input-part: "listkeys" (params: 1 mandatory) supported
550 bundle2-input-part: "listkeys" (params: 1 mandatory) supported
551 bundle2-input-bundle: 2 parts total
551 bundle2-input-bundle: 2 parts total
552 checking for updated bookmarks
552 checking for updated bookmarks
553 updating the branch cache
553 updating the branch cache
554 (sent 3 HTTP requests and * bytes; received * bytes in responses) (glob)
554 (sent 3 HTTP requests and * bytes; received * bytes in responses) (glob)
555 #endif
555 #endif
556 #if stream-bundle2-v3
556 #if stream-bundle2-v3
557 $ hg --debug --config worker.backgroundclose=true --config worker.backgroundcloseminfilecount=1 clone --stream -U http://localhost:$HGPORT clone-background | grep -v adding
557 $ hg --debug --config worker.backgroundclose=true --config worker.backgroundcloseminfilecount=1 clone --stream -U http://localhost:$HGPORT clone-background | grep -v adding
558 using http://localhost:$HGPORT/
558 using http://localhost:$HGPORT/
559 sending capabilities command
559 sending capabilities command
560 query 1; heads
560 query 1; heads
561 sending batch command
561 sending batch command
562 streaming all changes
562 streaming all changes
563 sending getbundle command
563 sending getbundle command
564 bundle2-input-bundle: with-transaction
564 bundle2-input-bundle: with-transaction
565 bundle2-input-part: "stream3-exp" (params: 1 mandatory) supported
565 bundle2-input-part: "stream3-exp" (params: 1 mandatory) supported
566 applying stream bundle
566 applying stream bundle
567 1093 entries to transfer
567 1093 entries to transfer
568 starting 4 threads for background file closing
568 starting 4 threads for background file closing
569 starting 4 threads for background file closing
569 starting 4 threads for background file closing
570 updating the branch cache
570 updating the branch cache
571 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
571 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
572 bundle2-input-part: total payload size 120079 (no-zstd !)
572 bundle2-input-part: total payload size 120079 (no-zstd !)
573 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
573 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
574 bundle2-input-part: total payload size 117240 (zstd no-bigendian !)
574 bundle2-input-part: total payload size 117240 (zstd no-bigendian !)
575 bundle2-input-part: total payload size 116138 (zstd bigendian !)
575 bundle2-input-part: total payload size 116138 (zstd bigendian !)
576 bundle2-input-part: "listkeys" (params: 1 mandatory) supported
576 bundle2-input-part: "listkeys" (params: 1 mandatory) supported
577 bundle2-input-bundle: 2 parts total
577 bundle2-input-bundle: 2 parts total
578 checking for updated bookmarks
578 checking for updated bookmarks
579 updating the branch cache
579 updating the branch cache
580 (sent 3 HTTP requests and * bytes; received * bytes in responses) (glob)
580 (sent 3 HTTP requests and * bytes; received * bytes in responses) (glob)
581 #endif
581 #endif
582
582
583 Cannot stream clone when there are secret changesets
583 Cannot stream clone when there are secret changesets
584
584
585 $ hg -R server phase --force --secret -r tip
585 $ hg -R server phase --force --secret -r tip
586 $ hg clone --stream -U http://localhost:$HGPORT secret-denied
586 $ hg clone --stream -U http://localhost:$HGPORT secret-denied
587 warning: stream clone requested but server has them disabled
587 warning: stream clone requested but server has them disabled
588 requesting all changes
588 requesting all changes
589 adding changesets
589 adding changesets
590 adding manifests
590 adding manifests
591 adding file changes
591 adding file changes
592 added 2 changesets with 1025 changes to 1025 files
592 added 2 changesets with 1025 changes to 1025 files
593 new changesets 96ee1d7354c4:c17445101a72
593 new changesets 96ee1d7354c4:c17445101a72
594
594
595 $ killdaemons.py
595 $ killdaemons.py
596
596
597 Streaming of secrets can be overridden by server config
597 Streaming of secrets can be overridden by server config
598
598
599 $ cd server
599 $ cd server
600 $ hg serve --config server.uncompressedallowsecret=true -p $HGPORT -d --pid-file=hg.pid
600 $ hg serve --config server.uncompressedallowsecret=true -p $HGPORT -d --pid-file=hg.pid
601 $ cat hg.pid > $DAEMON_PIDS
601 $ cat hg.pid > $DAEMON_PIDS
602 $ cd ..
602 $ cd ..
603
603
604 #if stream-legacy
604 #if stream-legacy
605 $ hg clone --stream -U http://localhost:$HGPORT secret-allowed
605 $ hg clone --stream -U http://localhost:$HGPORT secret-allowed
606 streaming all changes
606 streaming all changes
607 1090 files to transfer, 102 KB of data (no-zstd !)
607 1090 files to transfer, 102 KB of data (no-zstd !)
608 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
608 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
609 1090 files to transfer, 98.8 KB of data (zstd !)
609 1090 files to transfer, 98.8 KB of data (zstd !)
610 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
610 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
611 searching for changes
611 searching for changes
612 no changes found
612 no changes found
613 #endif
613 #endif
614 #if stream-bundle2-v2
614 #if stream-bundle2-v2
615 $ hg clone --stream -U http://localhost:$HGPORT secret-allowed
615 $ hg clone --stream -U http://localhost:$HGPORT secret-allowed
616 streaming all changes
616 streaming all changes
617 1093 files to transfer, 102 KB of data (no-zstd !)
617 1093 files to transfer, 102 KB of data (no-zstd !)
618 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
618 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
619 1093 files to transfer, 98.9 KB of data (zstd !)
619 1093 files to transfer, 98.9 KB of data (zstd !)
620 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
620 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
621 #endif
621 #endif
622 #if stream-bundle2-v3
622 #if stream-bundle2-v3
623 $ hg clone --stream -U http://localhost:$HGPORT secret-allowed
623 $ hg clone --stream -U http://localhost:$HGPORT secret-allowed
624 streaming all changes
624 streaming all changes
625 1093 entries to transfer
625 1093 entries to transfer
626 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
626 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
627 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
627 transferred 98.9 KB in * seconds (* */sec) (glob) (zstd !)
628 #endif
628 #endif
629
629
630 $ killdaemons.py
630 $ killdaemons.py
631
631
632 Verify interaction between preferuncompressed and secret presence
632 Verify interaction between preferuncompressed and secret presence
633
633
634 $ cd server
634 $ cd server
635 $ hg serve --config server.preferuncompressed=true -p $HGPORT -d --pid-file=hg.pid
635 $ hg serve --config server.preferuncompressed=true -p $HGPORT -d --pid-file=hg.pid
636 $ cat hg.pid > $DAEMON_PIDS
636 $ cat hg.pid > $DAEMON_PIDS
637 $ cd ..
637 $ cd ..
638
638
639 $ hg clone -U http://localhost:$HGPORT preferuncompressed-secret
639 $ hg clone -U http://localhost:$HGPORT preferuncompressed-secret
640 requesting all changes
640 requesting all changes
641 adding changesets
641 adding changesets
642 adding manifests
642 adding manifests
643 adding file changes
643 adding file changes
644 added 2 changesets with 1025 changes to 1025 files
644 added 2 changesets with 1025 changes to 1025 files
645 new changesets 96ee1d7354c4:c17445101a72
645 new changesets 96ee1d7354c4:c17445101a72
646
646
647 $ killdaemons.py
647 $ killdaemons.py
648
648
649 Clone not allowed when full bundles disabled and can't serve secrets
649 Clone not allowed when full bundles disabled and can't serve secrets
650
650
651 $ cd server
651 $ cd server
652 $ hg serve --config server.disablefullbundle=true -p $HGPORT -d --pid-file=hg.pid
652 $ hg serve --config server.disablefullbundle=true -p $HGPORT -d --pid-file=hg.pid
653 $ cat hg.pid > $DAEMON_PIDS
653 $ cat hg.pid > $DAEMON_PIDS
654 $ cd ..
654 $ cd ..
655
655
656 $ hg clone --stream http://localhost:$HGPORT secret-full-disabled
656 $ hg clone --stream http://localhost:$HGPORT secret-full-disabled
657 warning: stream clone requested but server has them disabled
657 warning: stream clone requested but server has them disabled
658 requesting all changes
658 requesting all changes
659 remote: abort: server has pull-based clones disabled
659 remote: abort: server has pull-based clones disabled
660 abort: pull failed on remote
660 abort: pull failed on remote
661 (remove --pull if specified or upgrade Mercurial)
661 (remove --pull if specified or upgrade Mercurial)
662 [100]
662 [100]
663
663
664 Local stream clone with secrets involved
664 Local stream clone with secrets involved
665 (This is just a test over behavior: if you have access to the repo's files,
665 (This is just a test over behavior: if you have access to the repo's files,
666 there is no security so it isn't important to prevent a clone here.)
666 there is no security so it isn't important to prevent a clone here.)
667
667
668 $ hg clone -U --stream server local-secret
668 $ hg clone -U --stream server local-secret
669 warning: stream clone requested but server has them disabled
669 warning: stream clone requested but server has them disabled
670 requesting all changes
670 requesting all changes
671 adding changesets
671 adding changesets
672 adding manifests
672 adding manifests
673 adding file changes
673 adding file changes
674 added 2 changesets with 1025 changes to 1025 files
674 added 2 changesets with 1025 changes to 1025 files
675 new changesets 96ee1d7354c4:c17445101a72
675 new changesets 96ee1d7354c4:c17445101a72
676
676
677 Stream clone while repo is changing:
677 Stream clone while repo is changing:
678
678
679 $ mkdir changing
679 $ mkdir changing
680 $ cd changing
680 $ cd changing
681
681
682 prepare repo with small and big file to cover both code paths in emitrevlogdata
682 prepare repo with small and big file to cover both code paths in emitrevlogdata
683
683
684 $ hg init repo
684 $ hg init repo
685 $ touch repo/f1
685 $ touch repo/f1
686 $ $TESTDIR/seq.py 50000 > repo/f2
686 $ $TESTDIR/seq.py 50000 > repo/f2
687 $ hg -R repo ci -Aqm "0"
687 $ hg -R repo ci -Aqm "0"
688 $ HG_TEST_STREAM_WALKED_FILE_1="$TESTTMP/sync_file_walked_1"
688 $ HG_TEST_STREAM_WALKED_FILE_1="$TESTTMP/sync_file_walked_1"
689 $ export HG_TEST_STREAM_WALKED_FILE_1
689 $ export HG_TEST_STREAM_WALKED_FILE_1
690 $ HG_TEST_STREAM_WALKED_FILE_2="$TESTTMP/sync_file_walked_2"
690 $ HG_TEST_STREAM_WALKED_FILE_2="$TESTTMP/sync_file_walked_2"
691 $ export HG_TEST_STREAM_WALKED_FILE_2
691 $ export HG_TEST_STREAM_WALKED_FILE_2
692 $ HG_TEST_STREAM_WALKED_FILE_3="$TESTTMP/sync_file_walked_3"
692 $ HG_TEST_STREAM_WALKED_FILE_3="$TESTTMP/sync_file_walked_3"
693 $ export HG_TEST_STREAM_WALKED_FILE_3
693 $ export HG_TEST_STREAM_WALKED_FILE_3
694 # $ cat << EOF >> $HGRCPATH
694 # $ cat << EOF >> $HGRCPATH
695 # > [hooks]
695 # > [hooks]
696 # > pre-clone=rm -f "$TESTTMP/sync_file_walked_*"
696 # > pre-clone=rm -f "$TESTTMP/sync_file_walked_*"
697 # > EOF
697 # > EOF
698 $ hg serve -R repo -p $HGPORT1 -d --error errors.log --pid-file=hg.pid --config extensions.stream_steps="$RUNTESTDIR/testlib/ext-stream-clone-steps.py"
698 $ hg serve -R repo -p $HGPORT1 -d --error errors.log --pid-file=hg.pid --config extensions.stream_steps="$RUNTESTDIR/testlib/ext-stream-clone-steps.py"
699 $ cat hg.pid >> $DAEMON_PIDS
699 $ cat hg.pid >> $DAEMON_PIDS
700
700
701 clone while modifying the repo between stating file with write lock and
701 clone while modifying the repo between stating file with write lock and
702 actually serving file content
702 actually serving file content
703
703
704 $ (hg clone -q --stream -U http://localhost:$HGPORT1 clone; touch "$HG_TEST_STREAM_WALKED_FILE_3") &
704 $ (hg clone -q --stream -U http://localhost:$HGPORT1 clone; touch "$HG_TEST_STREAM_WALKED_FILE_3") &
705 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_1
705 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_1
706 $ echo >> repo/f1
706 $ echo >> repo/f1
707 $ echo >> repo/f2
707 $ echo >> repo/f2
708 $ hg -R repo ci -m "1" --config ui.timeout.warn=-1
708 $ hg -R repo ci -m "1" --config ui.timeout.warn=-1
709 $ touch $HG_TEST_STREAM_WALKED_FILE_2
709 $ touch $HG_TEST_STREAM_WALKED_FILE_2
710 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_3
710 $ $RUNTESTDIR/testlib/wait-on-file 10 $HG_TEST_STREAM_WALKED_FILE_3
711 $ hg -R clone id
711 $ hg -R clone id
712 000000000000
712 000000000000
713 $ cat errors.log
713 $ cat errors.log
714 $ cd ..
714 $ cd ..
715
715
716 Stream repository with bookmarks
716 Stream repository with bookmarks
717 --------------------------------
717 --------------------------------
718
718
719 (revert introduction of secret changeset)
719 (revert introduction of secret changeset)
720
720
721 $ hg -R server phase --draft 'secret()'
721 $ hg -R server phase --draft 'secret()'
722
722
723 add a bookmark
723 add a bookmark
724
724
725 $ hg -R server bookmark -r tip some-bookmark
725 $ hg -R server bookmark -r tip some-bookmark
726
726
727 clone it
727 clone it
728
728
729 #if stream-legacy
729 #if stream-legacy
730 $ hg clone --stream http://localhost:$HGPORT with-bookmarks
730 $ hg clone --stream http://localhost:$HGPORT with-bookmarks
731 streaming all changes
731 streaming all changes
732 1090 files to transfer, 102 KB of data (no-zstd !)
732 1090 files to transfer, 102 KB of data (no-zstd !)
733 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
733 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
734 1090 files to transfer, 98.8 KB of data (zstd !)
734 1090 files to transfer, 98.8 KB of data (zstd !)
735 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
735 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
736 searching for changes
736 searching for changes
737 no changes found
737 no changes found
738 updating to branch default
738 updating to branch default
739 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
739 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
740 #endif
740 #endif
741 #if stream-bundle2-v2
741 #if stream-bundle2-v2
742 $ hg clone --stream http://localhost:$HGPORT with-bookmarks
742 $ hg clone --stream http://localhost:$HGPORT with-bookmarks
743 streaming all changes
743 streaming all changes
744 1096 files to transfer, 102 KB of data (no-zstd !)
744 1096 files to transfer, 102 KB of data (no-zstd !)
745 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
745 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
746 1096 files to transfer, 99.1 KB of data (zstd !)
746 1096 files to transfer, 99.1 KB of data (zstd !)
747 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
747 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
748 updating to branch default
748 updating to branch default
749 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
749 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
750 #endif
750 #endif
751 #if stream-bundle2-v3
751 #if stream-bundle2-v3
752 $ hg clone --stream http://localhost:$HGPORT with-bookmarks
752 $ hg clone --stream http://localhost:$HGPORT with-bookmarks
753 streaming all changes
753 streaming all changes
754 1096 entries to transfer
754 1096 entries to transfer
755 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
755 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
756 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
756 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
757 updating to branch default
757 updating to branch default
758 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
758 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
759 #endif
759 #endif
760 $ hg verify -R with-bookmarks -q
760 $ hg verify -R with-bookmarks -q
761 $ hg -R with-bookmarks bookmarks
761 $ hg -R with-bookmarks bookmarks
762 some-bookmark 2:5223b5e3265f
762 some-bookmark 2:5223b5e3265f
763
763
764 Stream repository with phases
764 Stream repository with phases
765 -----------------------------
765 -----------------------------
766
766
767 Clone as publishing
767 Clone as publishing
768
768
769 $ hg -R server phase -r 'all()'
769 $ hg -R server phase -r 'all()'
770 0: draft
770 0: draft
771 1: draft
771 1: draft
772 2: draft
772 2: draft
773
773
774 #if stream-legacy
774 #if stream-legacy
775 $ hg clone --stream http://localhost:$HGPORT phase-publish
775 $ hg clone --stream http://localhost:$HGPORT phase-publish
776 streaming all changes
776 streaming all changes
777 1090 files to transfer, 102 KB of data (no-zstd !)
777 1090 files to transfer, 102 KB of data (no-zstd !)
778 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
778 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
779 1090 files to transfer, 98.8 KB of data (zstd !)
779 1090 files to transfer, 98.8 KB of data (zstd !)
780 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
780 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
781 searching for changes
781 searching for changes
782 no changes found
782 no changes found
783 updating to branch default
783 updating to branch default
784 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
784 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
785 #endif
785 #endif
786 #if stream-bundle2-v2
786 #if stream-bundle2-v2
787 $ hg clone --stream http://localhost:$HGPORT phase-publish
787 $ hg clone --stream http://localhost:$HGPORT phase-publish
788 streaming all changes
788 streaming all changes
789 1096 files to transfer, 102 KB of data (no-zstd !)
789 1096 files to transfer, 102 KB of data (no-zstd !)
790 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
790 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
791 1096 files to transfer, 99.1 KB of data (zstd !)
791 1096 files to transfer, 99.1 KB of data (zstd !)
792 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
792 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
793 updating to branch default
793 updating to branch default
794 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
794 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
795 #endif
795 #endif
796 #if stream-bundle2-v3
796 #if stream-bundle2-v3
797 $ hg clone --stream http://localhost:$HGPORT phase-publish
797 $ hg clone --stream http://localhost:$HGPORT phase-publish
798 streaming all changes
798 streaming all changes
799 1096 entries to transfer
799 1096 entries to transfer
800 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
800 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
801 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
801 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
802 updating to branch default
802 updating to branch default
803 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
803 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
804 #endif
804 #endif
805 $ hg verify -R phase-publish -q
805 $ hg verify -R phase-publish -q
806 $ hg -R phase-publish phase -r 'all()'
806 $ hg -R phase-publish phase -r 'all()'
807 0: public
807 0: public
808 1: public
808 1: public
809 2: public
809 2: public
810
810
811 Clone as non publishing
811 Clone as non publishing
812
812
813 $ cat << EOF >> server/.hg/hgrc
813 $ cat << EOF >> server/.hg/hgrc
814 > [phases]
814 > [phases]
815 > publish = False
815 > publish = False
816 > EOF
816 > EOF
817 $ killdaemons.py
817 $ killdaemons.py
818 $ hg -R server serve -p $HGPORT -d --pid-file=hg.pid
818 $ hg -R server serve -p $HGPORT -d --pid-file=hg.pid
819 $ cat hg.pid > $DAEMON_PIDS
819 $ cat hg.pid > $DAEMON_PIDS
820
820
821 #if stream-legacy
821 #if stream-legacy
822
822
823 With v1 of the stream protocol, changeset are always cloned as public. It make
823 With v1 of the stream protocol, changeset are always cloned as public. It make
824 stream v1 unsuitable for non-publishing repository.
824 stream v1 unsuitable for non-publishing repository.
825
825
826 $ hg clone --stream http://localhost:$HGPORT phase-no-publish
826 $ hg clone --stream http://localhost:$HGPORT phase-no-publish
827 streaming all changes
827 streaming all changes
828 1090 files to transfer, 102 KB of data (no-zstd !)
828 1090 files to transfer, 102 KB of data (no-zstd !)
829 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
829 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
830 1090 files to transfer, 98.8 KB of data (zstd !)
830 1090 files to transfer, 98.8 KB of data (zstd !)
831 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
831 transferred 98.8 KB in * seconds (* */sec) (glob) (zstd !)
832 searching for changes
832 searching for changes
833 no changes found
833 no changes found
834 updating to branch default
834 updating to branch default
835 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
835 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
836 $ hg -R phase-no-publish phase -r 'all()'
836 $ hg -R phase-no-publish phase -r 'all()'
837 0: public
837 0: public
838 1: public
838 1: public
839 2: public
839 2: public
840 #endif
840 #endif
841 #if stream-bundle2-v2
841 #if stream-bundle2-v2
842 $ hg clone --stream http://localhost:$HGPORT phase-no-publish
842 $ hg clone --stream http://localhost:$HGPORT phase-no-publish
843 streaming all changes
843 streaming all changes
844 1097 files to transfer, 102 KB of data (no-zstd !)
844 1097 files to transfer, 102 KB of data (no-zstd !)
845 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
845 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
846 1097 files to transfer, 99.1 KB of data (zstd !)
846 1097 files to transfer, 99.1 KB of data (zstd !)
847 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
847 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
848 updating to branch default
848 updating to branch default
849 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
849 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
850 $ hg -R phase-no-publish phase -r 'all()'
850 $ hg -R phase-no-publish phase -r 'all()'
851 0: draft
851 0: draft
852 1: draft
852 1: draft
853 2: draft
853 2: draft
854 #endif
854 #endif
855 #if stream-bundle2-v3
855 #if stream-bundle2-v3
856 $ hg clone --stream http://localhost:$HGPORT phase-no-publish
856 $ hg clone --stream http://localhost:$HGPORT phase-no-publish
857 streaming all changes
857 streaming all changes
858 1097 entries to transfer
858 1097 entries to transfer
859 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
859 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
860 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
860 transferred 99.1 KB in * seconds (* */sec) (glob) (zstd !)
861 updating to branch default
861 updating to branch default
862 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
862 1088 files updated, 0 files merged, 0 files removed, 0 files unresolved
863 $ hg -R phase-no-publish phase -r 'all()'
863 $ hg -R phase-no-publish phase -r 'all()'
864 0: draft
864 0: draft
865 1: draft
865 1: draft
866 2: draft
866 2: draft
867 #endif
867 #endif
868 $ hg verify -R phase-no-publish -q
868 $ hg verify -R phase-no-publish -q
869
869
870 $ killdaemons.py
870 $ killdaemons.py
871
871
872 #if stream-legacy
872 #if stream-legacy
873
873
874 With v1 of the stream protocol, changeset are always cloned as public. There's
874 With v1 of the stream protocol, changeset are always cloned as public. There's
875 no obsolescence markers exchange in stream v1.
875 no obsolescence markers exchange in stream v1.
876
876
877 #endif
877 #endif
878 #if stream-bundle2-v2
878 #if stream-bundle2-v2
879
879
880 Stream repository with obsolescence
880 Stream repository with obsolescence
881 -----------------------------------
881 -----------------------------------
882
882
883 Clone non-publishing with obsolescence
883 Clone non-publishing with obsolescence
884
884
885 $ cat >> $HGRCPATH << EOF
885 $ cat >> $HGRCPATH << EOF
886 > [experimental]
886 > [experimental]
887 > evolution=all
887 > evolution=all
888 > EOF
888 > EOF
889
889
890 $ cd server
890 $ cd server
891 $ echo foo > foo
891 $ echo foo > foo
892 $ hg -q commit -m 'about to be pruned'
892 $ hg -q commit -m 'about to be pruned'
893 $ hg debugobsolete `hg log -r . -T '{node}'` -d '0 0' -u test --record-parents
893 $ hg debugobsolete `hg log -r . -T '{node}'` -d '0 0' -u test --record-parents
894 1 new obsolescence markers
894 1 new obsolescence markers
895 obsoleted 1 changesets
895 obsoleted 1 changesets
896 $ hg up null -q
896 $ hg up null -q
897 $ hg log -T '{rev}: {phase}\n'
897 $ hg log -T '{rev}: {phase}\n'
898 2: draft
898 2: draft
899 1: draft
899 1: draft
900 0: draft
900 0: draft
901 $ hg serve -p $HGPORT -d --pid-file=hg.pid
901 $ hg serve -p $HGPORT -d --pid-file=hg.pid
902 $ cat hg.pid > $DAEMON_PIDS
902 $ cat hg.pid > $DAEMON_PIDS
903 $ cd ..
903 $ cd ..
904
904
905 $ hg clone -U --stream http://localhost:$HGPORT with-obsolescence
905 $ hg clone -U --stream http://localhost:$HGPORT with-obsolescence
906 streaming all changes
906 streaming all changes
907 1098 files to transfer, 102 KB of data (no-zstd !)
907 1098 files to transfer, 102 KB of data (no-zstd !)
908 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
908 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
909 1098 files to transfer, 99.5 KB of data (zstd !)
909 1098 files to transfer, 99.5 KB of data (zstd !)
910 transferred 99.5 KB in * seconds (* */sec) (glob) (zstd !)
910 transferred 99.5 KB in * seconds (* */sec) (glob) (zstd !)
911 $ hg -R with-obsolescence log -T '{rev}: {phase}\n'
911 $ hg -R with-obsolescence log -T '{rev}: {phase}\n'
912 2: draft
912 2: draft
913 1: draft
913 1: draft
914 0: draft
914 0: draft
915 $ hg debugobsolete -R with-obsolescence
915 $ hg debugobsolete -R with-obsolescence
916 8c206a663911c1f97f2f9d7382e417ae55872cfa 0 {5223b5e3265f0df40bb743da62249413d74ac70f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
916 8c206a663911c1f97f2f9d7382e417ae55872cfa 0 {5223b5e3265f0df40bb743da62249413d74ac70f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
917 $ hg verify -R with-obsolescence -q
917 $ hg verify -R with-obsolescence -q
918
918
919 $ hg clone -U --stream --config experimental.evolution=0 http://localhost:$HGPORT with-obsolescence-no-evolution
919 $ hg clone -U --stream --config experimental.evolution=0 http://localhost:$HGPORT with-obsolescence-no-evolution
920 streaming all changes
920 streaming all changes
921 remote: abort: server has obsolescence markers, but client cannot receive them via stream clone
921 remote: abort: server has obsolescence markers, but client cannot receive them via stream clone
922 abort: pull failed on remote
922 abort: pull failed on remote
923 [100]
923 [100]
924
924
925 $ killdaemons.py
925 $ killdaemons.py
926
926
927 #endif
927 #endif
928 #if stream-bundle2-v3
928 #if stream-bundle2-v3
929
929
930 Stream repository with obsolescence
930 Stream repository with obsolescence
931 -----------------------------------
931 -----------------------------------
932
932
933 Clone non-publishing with obsolescence
933 Clone non-publishing with obsolescence
934
934
935 $ cat >> $HGRCPATH << EOF
935 $ cat >> $HGRCPATH << EOF
936 > [experimental]
936 > [experimental]
937 > evolution=all
937 > evolution=all
938 > EOF
938 > EOF
939
939
940 $ cd server
940 $ cd server
941 $ echo foo > foo
941 $ echo foo > foo
942 $ hg -q commit -m 'about to be pruned'
942 $ hg -q commit -m 'about to be pruned'
943 $ hg debugobsolete `hg log -r . -T '{node}'` -d '0 0' -u test --record-parents
943 $ hg debugobsolete `hg log -r . -T '{node}'` -d '0 0' -u test --record-parents
944 1 new obsolescence markers
944 1 new obsolescence markers
945 obsoleted 1 changesets
945 obsoleted 1 changesets
946 $ hg up null -q
946 $ hg up null -q
947 $ hg log -T '{rev}: {phase}\n'
947 $ hg log -T '{rev}: {phase}\n'
948 2: draft
948 2: draft
949 1: draft
949 1: draft
950 0: draft
950 0: draft
951 $ hg serve -p $HGPORT -d --pid-file=hg.pid
951 $ hg serve -p $HGPORT -d --pid-file=hg.pid
952 $ cat hg.pid > $DAEMON_PIDS
952 $ cat hg.pid > $DAEMON_PIDS
953 $ cd ..
953 $ cd ..
954
954
955 $ hg clone -U --stream http://localhost:$HGPORT with-obsolescence
955 $ hg clone -U --stream http://localhost:$HGPORT with-obsolescence
956 streaming all changes
956 streaming all changes
957 1098 entries to transfer
957 1098 entries to transfer
958 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
958 transferred 102 KB in * seconds (* */sec) (glob) (no-zstd !)
959 transferred 99.5 KB in * seconds (* */sec) (glob) (zstd !)
959 transferred 99.5 KB in * seconds (* */sec) (glob) (zstd !)
960 $ hg -R with-obsolescence log -T '{rev}: {phase}\n'
960 $ hg -R with-obsolescence log -T '{rev}: {phase}\n'
961 2: draft
961 2: draft
962 1: draft
962 1: draft
963 0: draft
963 0: draft
964 $ hg debugobsolete -R with-obsolescence
964 $ hg debugobsolete -R with-obsolescence
965 8c206a663911c1f97f2f9d7382e417ae55872cfa 0 {5223b5e3265f0df40bb743da62249413d74ac70f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
965 8c206a663911c1f97f2f9d7382e417ae55872cfa 0 {5223b5e3265f0df40bb743da62249413d74ac70f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
966 $ hg verify -R with-obsolescence -q
966 $ hg verify -R with-obsolescence -q
967
967
968 $ hg clone -U --stream --config experimental.evolution=0 http://localhost:$HGPORT with-obsolescence-no-evolution
968 $ hg clone -U --stream --config experimental.evolution=0 http://localhost:$HGPORT with-obsolescence-no-evolution
969 streaming all changes
969 streaming all changes
970 remote: abort: server has obsolescence markers, but client cannot receive them via stream clone
970 remote: abort: server has obsolescence markers, but client cannot receive them via stream clone
971 abort: pull failed on remote
971 abort: pull failed on remote
972 [100]
972 [100]
973
973
974 $ killdaemons.py
974 $ killdaemons.py
975
975
976 #endif
976 #endif
977
977
978 Cloning a repo with no requirements doesn't give some obscure error
978 Cloning a repo with no requirements doesn't give some obscure error
979
979
980 $ mkdir -p empty-repo/.hg
980 $ mkdir -p empty-repo/.hg
981 $ hg clone -q --stream ssh://user@dummy/empty-repo empty-repo2
981 $ hg clone -q --stream ssh://user@dummy/empty-repo empty-repo2
982 $ hg --cwd empty-repo2 verify -q
982 $ hg --cwd empty-repo2 verify -q
983
984 Cloning a repo with an empty manifestlog doesn't give some weird error
985
986 $ rm -r empty-repo; hg init empty-repo
987 $ (cd empty-repo; touch x; hg commit -Am empty; hg debugstrip -r 0) > /dev/null
988 $ hg clone -q --stream ssh://user@dummy/empty-repo empty-repo3
989 $ hg --cwd empty-repo3 verify -q 2>&1 | grep -v warning
990 [1]
991
992 The warnings filtered out here are talking about zero-length 'orphan' data files.
993 Those are harmless, so that's fine.
994
General Comments 0
You need to be logged in to leave comments. Login now