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

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

@@ -1,209 +1,210 b''
1 1 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0 iD8DBQBEYmO2ywK+sNU5EO8RAnaYAKCO7x15xUn5mnhqWNXqk/ehlhRt2QCfRDfY0LrUq2q4oK/KypuJYPHgq1A=
2 2 2be3001847cb18a23c403439d9e7d0ace30804e9 0 iD8DBQBExUbjywK+sNU5EO8RAhzxAKCtyHAQUzcTSZTqlfJ0by6vhREwWQCghaQFHfkfN0l9/40EowNhuMOKnJk=
3 3 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0 iD8DBQBFfL2QywK+sNU5EO8RAjYFAKCoGlaWRTeMsjdmxAjUYx6diZxOBwCfY6IpBYsKvPTwB3oktnPt5Rmrlys=
4 4 27230c29bfec36d5540fbe1c976810aefecfd1d2 0 iD8DBQBFheweywK+sNU5EO8RAt7VAKCrqJQWT2/uo2RWf0ZI4bLp6v82jACgjrMdsaTbxRsypcmEsdPhlG6/8F4=
5 5 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0 iD8DBQBGgHicywK+sNU5EO8RAgNxAJ0VG8ixAaeudx4sZbhngI1syu49HQCeNUJQfWBgA8bkJ2pvsFpNxwYaX3I=
6 6 23889160905a1b09fffe1c07378e9fc1827606eb 0 iD8DBQBHGTzoywK+sNU5EO8RAr/UAJ0Y8s4jQtzgS+G9vM8z6CWBThZ8fwCcCT5XDj2XwxKkz/0s6UELwjsO3LU=
7 7 bae2e9c838e90a393bae3973a7850280413e091a 0 iD8DBQBH6DO5ywK+sNU5EO8RAsfrAJ0e4r9c9GF/MJsM7Xjd3NesLRC3+ACffj6+6HXdZf8cswAoFPO+DY00oD0=
8 8 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 0 iD8DBQBINdwsywK+sNU5EO8RAjIUAKCPmlFJSpsPAAUKF+iNHAwVnwmzeQCdEXrL27CWclXuUKdbQC8De7LICtE=
9 9 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 0 iD8DBQBIo1wpywK+sNU5EO8RAmRNAJ94x3OFt6blbqu/yBoypm/AJ44fuACfUaldXcV5z9tht97hSp22DVTEPGc=
10 10 2a67430f92f15ea5159c26b09ec4839a0c549a26 0 iEYEABECAAYFAkk1hykACgkQywK+sNU5EO85QACeNJNUanjc2tl4wUoPHNuv+lSj0ZMAoIm93wSTc/feyYnO2YCaQ1iyd9Nu
11 11 3773e510d433969e277b1863c317b674cbee2065 0 iEYEABECAAYFAklNbbAACgkQywK+sNU5EO8o+gCfeb2/lfIJZMvyDA1m+G1CsBAxfFsAoIa6iAMG8SBY7hW1Q85Yf/LXEvaE
12 12 11a4eb81fb4f4742451591489e2797dc47903277 0 iEYEABECAAYFAklcAnsACgkQywK+sNU5EO+uXwCbBVHNNsLy1g7BlAyQJwadYVyHOXoAoKvtAVO71+bv7EbVoukwTzT+P4Sx
13 13 11efa41037e280d08cfb07c09ad485df30fb0ea8 0 iEYEABECAAYFAkmvJRQACgkQywK+sNU5EO9XZwCeLMgDgPSMWMm6vgjL4lDs2pEc5+0AnRxfiFbpbBfuEFTqKz9nbzeyoBlx
14 14 02981000012e3adf40c4849bd7b3d5618f9ce82d 0 iEYEABECAAYFAknEH3wACgkQywK+sNU5EO+uXwCeI+LbLMmhjU1lKSfU3UWJHjjUC7oAoIZLvYDGOL/tNZFUuatc3RnZ2eje
15 15 196d40e7c885fa6e95f89134809b3ec7bdbca34b 0 iEYEABECAAYFAkpL2X4ACgkQywK+sNU5EO9FOwCfXJycjyKJXsvQqKkHrglwOQhEKS4An36GfKzptfN8b1qNc3+ya/5c2WOM
16 16 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 0 iEYEABECAAYFAkpopLIACgkQywK+sNU5EO8QSgCfZ0ztsd071rOa2lhmp9Fyue/WoI0AoLTei80/xrhRlB8L/rZEf2KBl8dA
17 17 31ec469f9b556f11819937cf68ee53f2be927ebf 0 iEYEABECAAYFAksBuxAACgkQywK+sNU5EO+mBwCfagB+A0txzWZ6dRpug3LEoK7Z1QsAoKpbk8vsLjv6/oRDicSk/qBu33+m
18 18 439d7ea6fe3aa4ab9ec274a68846779153789de9 0 iEYEABECAAYFAksVw0kACgkQywK+sNU5EO/oZwCfdfBEkgp38xq6wN2F4nj+SzofrJIAnjmxt04vaJSeOOeHylHvk6lzuQsw
19 19 296a0b14a68621f6990c54fdba0083f6f20935bf 0 iEYEABECAAYFAks+jCoACgkQywK+sNU5EO9J8wCeMUGF9E/gS2UBsqIz56WS4HMPRPUAoI5J95mwEIK8Clrl7qFRidNI6APq
20 20 4aa619c4c2c09907034d9824ebb1dd0e878206eb 0 iEYEABECAAYFAktm9IsACgkQywK+sNU5EO9XGgCgk4HclRQhexEtooPE5GcUCdB6M8EAn2ptOhMVbIoO+JncA+tNACPFXh0O
21 21 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 0 iEYEABECAAYFAkuRoSQACgkQywK+sNU5EO//3QCeJDc5r2uFyFCtAlpSA27DEE5rrxAAn2FSwTy9fhrB3QAdDQlwkEZcQzDh
22 22 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 0 iEYEABECAAYFAku1IwIACgkQywK+sNU5EO9MjgCdHLVwkTZlNHxhcznZKBL1rjN+J7cAoLLWi9LTL6f/TgBaPSKOy1ublbaW
23 23 39f725929f0c48c5fb3b90c071fc3066012456ca 0 iEYEABECAAYFAkvclvsACgkQywK+sNU5EO9FSwCeL9i5x8ALW/LE5+lCX6MFEAe4MhwAn1ev5o6SX6GrNdDfKweiemfO2VBk
24 24 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 0 iEYEABECAAYFAkvsKTkACgkQywK+sNU5EO9qEACgiSiRGvTG2vXGJ65tUSOIYihTuFAAnRzRIqEVSw8M8/RGeUXRps0IzaCO
25 25 24fe2629c6fd0c74c90bd066e77387c2b02e8437 0 iEYEABECAAYFAkwFLRsACgkQywK+sNU5EO+pJACgp13tPI+pbwKZV+LeMjcQ4H6tCZYAoJebzhd6a8yYx6qiwpJxA9BXZNXy
26 26 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 0 iEYEABECAAYFAkwsyxcACgkQywK+sNU5EO+crACfUpNAF57PmClkSri9nJcBjb2goN4AniPCNaKvnki7TnUsi1u2oxltpKKL
27 27 bf1774d95bde614af3956d92b20e2a0c68c5fec7 0 iEYEABECAAYFAkxVwccACgkQywK+sNU5EO+oFQCeJzwZ+we1fIIyBGCddHceOUAN++cAnjvT6A8ZWW0zV21NXIFF1qQmjxJd
28 28 c00f03a4982e467fb6b6bd45908767db6df4771d 0 iEYEABECAAYFAkxXDqsACgkQywK+sNU5EO/GJACfT9Rz4hZOxPQEs91JwtmfjevO84gAmwSmtfo5mmWSm8gtTUebCcdTv0Kf
29 29 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 0 iD8DBQBMdo+qywK+sNU5EO8RAqQpAJ975BL2CCAiWMz9SXthNQ9xG181IwCgp4O+KViHPkufZVFn2aTKMNvcr1A=
30 30 93d8bff78c96fe7e33237b257558ee97290048a4 0 iD8DBQBMpfvdywK+sNU5EO8RAsxVAJ0UaL1XB51C76JUBhafc9GBefuMxwCdEWkTOzwvE0SarJBe9i008jhbqW4=
31 31 333421b9e0f96c7bc788e5667c146a58a9440a55 0 iD8DBQBMz0HOywK+sNU5EO8RAlsEAJ0USh6yOG7OrWkADGunVt9QimBQnwCbBqeMnKgSbwEw8jZwE3Iz1mdrYlo=
32 32 4438875ec01bd0fc32be92b0872eb6daeed4d44f 0 iD8DBQBM4WYUywK+sNU5EO8RAhCVAJ0dJswachwFAHALmk1x0RJehxzqPQCbBNskP9n/X689jB+btNTZTyKU/fw=
33 33 6aff4f144ad356311318b0011df0bb21f2c97429 0 iD8DBQBM9uxXywK+sNU5EO8RAv+4AKCDj4qKP16GdPaq1tP6BUwpM/M1OACfRyzLPp/qiiN8xJTWoWYSe/XjJug=
34 34 e3bf16703e2601de99e563cdb3a5d50b64e6d320 0 iD8DBQBNH8WqywK+sNU5EO8RAiQTAJ9sBO+TeiGro4si77VVaQaA6jcRUgCfSA28dBbjj0oFoQwvPoZjANiZBH8=
35 35 a6c855c32ea081da3c3b8ff628f1847ff271482f 0 iD8DBQBNSJJ+ywK+sNU5EO8RAoJaAKCweDEF70fu+r1Zn7pYDXdlk5RuSgCeO9gK/eit8Lin/1n3pO7aYguFLok=
36 36 2b2155623ee2559caf288fd333f30475966c4525 0 iD8DBQBNSJeBywK+sNU5EO8RAm1KAJ4hW9Cm9nHaaGJguchBaPLlAr+O3wCgqgmMok8bdAS06N6PL60PSTM//Gg=
37 37 2616325766e3504c8ae7c84bd15ee610901fe91d 0 iD8DBQBNbWy9ywK+sNU5EO8RAlWCAJ4mW8HbzjJj9GpK98muX7k+7EvEHwCfaTLbC/DH3QEsZBhEP+M8tzL6RU4=
38 38 aa1f3be38ab127280761889d2dca906ca465b5f4 0 iD8DBQBNeQq7ywK+sNU5EO8RAlEOAJ4tlEDdetE9lKfjGgjbkcR8PrC3egCfXCfF3qNVvU/2YYjpgvRwevjvDy0=
39 39 b032bec2c0a651ca0ddecb65714bfe6770f67d70 0 iD8DBQBNlg5kywK+sNU5EO8RAnGEAJ9gmEx6MfaR4XcG2m/93vwtfyzs3gCgltzx8/YdHPwqDwRX/WbpYgi33is=
40 40 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 0 iD8DBQBNvTy4ywK+sNU5EO8RAmp8AJ9QnxK4jTJ7G722MyeBxf0UXEdGwACgtlM7BKtNQfbEH/fOW5y+45W88VI=
41 41 733af5d9f6b22387913e1d11350fb8cb7c1487dd 0 iD8DBQBN5q/8ywK+sNU5EO8RArRGAKCNGT94GKIYtSuwZ57z1sQbcw6uLACfffpbMV4NAPMl8womAwg+7ZPKnIU=
42 42 de9eb6b1da4fc522b1cab16d86ca166204c24f25 0 iD8DBQBODhfhywK+sNU5EO8RAr2+AJ4ugbAj8ae8/K0bYZzx3sascIAg1QCeK3b+zbbVVqd3b7CDpwFnaX8kTd4=
43 43 4a43e23b8c55b4566b8200bf69fe2158485a2634 0 iD8DBQBONzIMywK+sNU5EO8RAj5SAJ0aPS3+JHnyI6bHB2Fl0LImbDmagwCdGbDLp1S7TFobxXudOH49bX45Iik=
44 44 d629f1e89021103f1753addcef6b310e4435b184 0 iD8DBQBOWAsBywK+sNU5EO8RAht4AJwJl9oNFopuGkj5m8aKuf7bqPkoAQCeNrEm7UhFsZKYT5iUOjnMV7s2LaM=
45 45 351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg=
46 46 384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI=
47 47 41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4=
48 48 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo=
49 49 6344043924497cd06d781d9014c66802285072e4 0 iD8DBQBPALgmywK+sNU5EO8RAlfhAJ9nYOdWnhfVDHYtDTJAyJtXBAQS9wCgnefoSQt7QABkbGxM+Q85UYEBuD0=
50 50 db33555eafeaf9df1e18950e29439eaa706d399b 0 iD8DBQBPGdzxywK+sNU5EO8RAppkAJ9jOXhUVE/97CPgiMA0pMGiIYnesQCfengAszcBiSiKGugiI8Okc9ghU+Y=
51 51 2aa5b51f310fb3befd26bed99c02267f5c12c734 0 iD8DBQBPKZ9bywK+sNU5EO8RAt1TAJ45r1eJ0YqSkInzrrayg4TVCh0SnQCgm0GA/Ua74jnnDwVQ60lAwROuz1Q=
52 52 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 0 iD8DBQBPT/fvywK+sNU5EO8RAnfYAKCn7d0vwqIb100YfWm1F7nFD5B+FACeM02YHpQLSNsztrBCObtqcnfod7Q=
53 53 b9bd95e61b49c221c4cca24e6da7c946fc02f992 0 iD8DBQBPeLsIywK+sNU5EO8RAvpNAKCtKe2gitz8dYn52IRF0hFOPCR7AQCfRJL/RWCFweu2T1vH/mUOCf8SXXc=
54 54 d9e2f09d5488c395ae9ddbb320ceacd24757e055 0 iD8DBQBPju/dywK+sNU5EO8RArBYAJ9xtifdbk+hCOJO8OZa4JfHX8OYZQCeKPMBaBWiT8N/WHoOm1XU0q+iono=
55 55 00182b3d087909e3c3ae44761efecdde8f319ef3 0 iD8DBQBPoFhIywK+sNU5EO8RAhzhAKCBj1n2jxPTkZNJJ5pSp3soa+XHIgCgsZZpAQxOpXwCp0eCdNGe0+pmxmg=
56 56 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 0 iD8DBQBPovNWywK+sNU5EO8RAhgiAJ980T91FdPTRMmVONDhpkMsZwVIMACgg3bKvoWSeuCW28llUhAJtUjrMv0=
57 57 85a358df5bbbe404ca25730c9c459b34263441dc 0 iD8DBQBPyZsWywK+sNU5EO8RAnpLAJ48qrGDJRT+pteS0mSQ11haqHstPwCdG4ccGbk+0JHb7aNy8/NRGAOqn9w=
58 58 b013baa3898e117959984fc64c29d8c784d2f28b 0 iD8DBQBP8QOPywK+sNU5EO8RAqimAKCFRSx0lvG6y8vne2IhNG062Hn0dACeMLI5/zhpWpHBIVeAAquYfx2XFeA=
59 59 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 0 iD8DBQBQGiL8ywK+sNU5EO8RAq5oAJ4rMMCPx6O+OuzNXVOexogedWz/QgCeIiIxLd76I4pXO48tdXhr0hQcBuM=
60 60 072209ae4ddb654eb2d5fd35bff358c738414432 0 iD8DBQBQQkq0ywK+sNU5EO8RArDTAJ9nk5CySnNAjAXYvqvx4uWCw9ThZwCgqmFRehH/l+oTwj3f8nw8u8qTCdc=
61 61 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 0 iD8DBQBQamltywK+sNU5EO8RAlsqAJ4qF/m6aFu4mJCOKTiAP5RvZFK02ACfawYShUZO6OXEFfveU0aAxDR0M1k=
62 62 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 0 iD8DBQBQgPV5ywK+sNU5EO8RArylAJ0abcx5NlDjyv3ZDWpAfRIHyRsJtQCgn4TMuEayqgxzrvadQZHdTEU2g38=
63 63 195ad823b5d58c68903a6153a25e3fb4ed25239d 0 iD8DBQBQkuT9ywK+sNU5EO8RAhB4AKCeerItoK2Jipm2cVf4euGofAa/WACeJj3TVd4pFILpb+ogj7ebweFLJi0=
64 64 0c10cf8191469e7c3c8844922e17e71a176cb7cb 0 iD8DBQBQvQWoywK+sNU5EO8RAnq3AJoCn98u4geFx5YaQaeh99gFhCd7bQCgjoBwBSUyOvGd0yBy60E3Vv3VZhM=
65 65 a4765077b65e6ae29ba42bab7834717b5072d5ba 0 iD8DBQBQ486sywK+sNU5EO8RAhmJAJ90aLfLKZhmcZN7kqphigQJxiFOQACeJ5IUZxjGKH4xzi3MrgIcx9n+dB0=
66 66 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 0 iD8DBQBQ+yuYywK+sNU5EO8RAm9JAJoD/UciWvpGeKBcpGtZJBFJVcL/HACghDXSgQ+xQDjB+6uGrdgAQsRR1Lg=
67 67 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 0 iD8DBQBRDDROywK+sNU5EO8RAh75AJ9uJCGoCWnP0Lv/+XuYs4hvUl+sAgCcD36QgAnuw8IQXrvv684BAXAnHcA=
68 68 7511d4df752e61fe7ae4f3682e0a0008573b0402 0 iD8DBQBRFYaoywK+sNU5EO8RAuErAJoDyhXn+lptU3+AevVdwAIeNFyR2gCdHzPHyWd+JDeWCUR+pSOBi8O2ppM=
69 69 5b7175377babacce80a6c1e12366d8032a6d4340 0 iD8DBQBRMCYgywK+sNU5EO8RAq1/AKCWKlt9ysibyQgYwoxxIOZv5J8rpwCcDSHQaaf1fFZUTnQsOePwcM2Y/Sg=
70 70 50c922c1b5145dab8baefefb0437d363b6a6c21c 0 iD8DBQBRWnUnywK+sNU5EO8RAuQRAJwM42cJqJPeqJ0jVNdMqKMDqr4dSACeP0cRVGz1gitMuV0x8f3mrZrqc7I=
71 71 8a7bd2dccd44ed571afe7424cd7f95594f27c092 0 iD8DBQBRXfBvywK+sNU5EO8RAn+LAKCsMmflbuXjYRxlzFwId5ptm8TZcwCdGkyLbZcASBOkzQUm/WW1qfknJHU=
72 72 292cd385856d98bacb2c3086f8897bc660c2beea 0 iD8DBQBRcM0BywK+sNU5EO8RAjp4AKCJBykQbvXhKuvLSMxKx3a2TBiXcACfbr/kLg5GlZTF/XDPmY+PyHgI/GM=
73 73 23f785b38af38d2fca6b8f3db56b8007a84cd73a 0 iD8DBQBRgZwNywK+sNU5EO8RAmO4AJ4u2ILGuimRP6MJgE2t65LZ5dAdkACgiENEstIdrlFC80p+sWKD81kKIYI=
74 74 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 0 iD8DBQBRkswvywK+sNU5EO8RAiYYAJsHTHyHbJeAgmGvBTmDrfcKu4doUgCeLm7eGBjx7yAPUvEtxef8rAkQmXI=
75 75 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 0 iD8DBQBRqnFLywK+sNU5EO8RAsWNAJ9RR6t+y1DLFc2HeH0eN9VfZAKF9gCeJ8ezvhtKq/LMs0/nvcgKQc/d5jk=
76 76 009794acc6e37a650f0fae37872e733382ac1c0c 0 iD8DBQBR0guxywK+sNU5EO8RArNkAKCq9pMihVzP8Os5kCmgbWpe5C37wgCgqzuPZTHvAsXF5wTyaSTMVa9Ccq4=
77 77 f0d7721d7322dcfb5af33599c2543f27335334bb 0 iD8DBQBR8taaywK+sNU5EO8RAqeEAJ4idDhhDuEsgsUjeQgWNj498matHACfT67gSF5w0ylsrBx1Hb52HkGXDm0=
78 78 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 0 iD8DBQBR+ymFywK+sNU5EO8RAuSdAJkBMcd9DAZ3rWE9WGKPm2YZ8LBoXACfXn/wbEsVy7ZgJoUwiWmHSnQaWCI=
79 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=
80 80 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
@@ -1,222 +1,223 b''
1 1 d40cc5aacc31ed673d9b5b24f98bee78c283062c 0.4f
2 2 1c590d34bf61e2ea12c71738e5a746cd74586157 0.4e
3 3 7eca4cfa8aad5fce9a04f7d8acadcd0452e2f34e 0.4d
4 4 b4d0c3786ad3e47beacf8412157326a32b6d25a4 0.4c
5 5 f40273b0ad7b3a6d3012fd37736d0611f41ecf54 0.5
6 6 0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 0.5b
7 7 12e0fdbc57a0be78f0e817fd1d170a3615cd35da 0.6
8 8 4ccf3de52989b14c3d84e1097f59e39a992e00bd 0.6b
9 9 eac9c8efcd9bd8244e72fb6821f769f450457a32 0.6c
10 10 979c049974485125e1f9357f6bbe9c1b548a64c3 0.7
11 11 3a56574f329a368d645853e0f9e09472aee62349 0.8
12 12 6a03cff2b0f5d30281e6addefe96b993582f2eac 0.8.1
13 13 35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0.9
14 14 2be3001847cb18a23c403439d9e7d0ace30804e9 0.9.1
15 15 36a957364b1b89c150f2d0e60a99befe0ee08bd3 0.9.2
16 16 27230c29bfec36d5540fbe1c976810aefecfd1d2 0.9.3
17 17 fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0.9.4
18 18 23889160905a1b09fffe1c07378e9fc1827606eb 0.9.5
19 19 bae2e9c838e90a393bae3973a7850280413e091a 1.0
20 20 d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 1.0.1
21 21 d2375bbee6d47e62ba8e415c86e83a465dc4dce9 1.0.2
22 22 2a67430f92f15ea5159c26b09ec4839a0c549a26 1.1
23 23 3773e510d433969e277b1863c317b674cbee2065 1.1.1
24 24 11a4eb81fb4f4742451591489e2797dc47903277 1.1.2
25 25 11efa41037e280d08cfb07c09ad485df30fb0ea8 1.2
26 26 02981000012e3adf40c4849bd7b3d5618f9ce82d 1.2.1
27 27 196d40e7c885fa6e95f89134809b3ec7bdbca34b 1.3
28 28 3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 1.3.1
29 29 31ec469f9b556f11819937cf68ee53f2be927ebf 1.4
30 30 439d7ea6fe3aa4ab9ec274a68846779153789de9 1.4.1
31 31 296a0b14a68621f6990c54fdba0083f6f20935bf 1.4.2
32 32 4aa619c4c2c09907034d9824ebb1dd0e878206eb 1.4.3
33 33 ff2704a8ded37fbebd8b6eb5ec733731d725da8a 1.5
34 34 2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 1.5.1
35 35 39f725929f0c48c5fb3b90c071fc3066012456ca 1.5.2
36 36 fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 1.5.3
37 37 24fe2629c6fd0c74c90bd066e77387c2b02e8437 1.5.4
38 38 f786fc4b8764cd2a5526d259cf2f94d8a66924d9 1.6
39 39 bf1774d95bde614af3956d92b20e2a0c68c5fec7 1.6.1
40 40 c00f03a4982e467fb6b6bd45908767db6df4771d 1.6.2
41 41 ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 1.6.3
42 42 93d8bff78c96fe7e33237b257558ee97290048a4 1.6.4
43 43 333421b9e0f96c7bc788e5667c146a58a9440a55 1.7
44 44 4438875ec01bd0fc32be92b0872eb6daeed4d44f 1.7.1
45 45 6aff4f144ad356311318b0011df0bb21f2c97429 1.7.2
46 46 e3bf16703e2601de99e563cdb3a5d50b64e6d320 1.7.3
47 47 a6c855c32ea081da3c3b8ff628f1847ff271482f 1.7.4
48 48 2b2155623ee2559caf288fd333f30475966c4525 1.7.5
49 49 2616325766e3504c8ae7c84bd15ee610901fe91d 1.8
50 50 aa1f3be38ab127280761889d2dca906ca465b5f4 1.8.1
51 51 b032bec2c0a651ca0ddecb65714bfe6770f67d70 1.8.2
52 52 3cb1e95676ad089596bd81d0937cad37d6e3b7fb 1.8.3
53 53 733af5d9f6b22387913e1d11350fb8cb7c1487dd 1.8.4
54 54 de9eb6b1da4fc522b1cab16d86ca166204c24f25 1.9
55 55 4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1
56 56 d629f1e89021103f1753addcef6b310e4435b184 1.9.2
57 57 351a9292e430e35766c552066ed3e87c557b803b 1.9.3
58 58 384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
59 59 41453d55b481ddfcc1dacb445179649e24ca861d 2.0
60 60 195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1
61 61 6344043924497cd06d781d9014c66802285072e4 2.0.2
62 62 db33555eafeaf9df1e18950e29439eaa706d399b 2.1-rc
63 63 2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1
64 64 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1
65 65 b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2
66 66 d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc
67 67 00182b3d087909e3c3ae44761efecdde8f319ef3 2.2
68 68 5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 2.2.1
69 69 85a358df5bbbe404ca25730c9c459b34263441dc 2.2.2
70 70 b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3
71 71 a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc
72 72 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 2.3
73 73 072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1
74 74 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 2.3.2
75 75 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 2.4-rc
76 76 195ad823b5d58c68903a6153a25e3fb4ed25239d 2.4
77 77 0c10cf8191469e7c3c8844922e17e71a176cb7cb 2.4.1
78 78 a4765077b65e6ae29ba42bab7834717b5072d5ba 2.4.2
79 79 f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 2.5-rc
80 80 a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 2.5
81 81 7511d4df752e61fe7ae4f3682e0a0008573b0402 2.5.1
82 82 5b7175377babacce80a6c1e12366d8032a6d4340 2.5.2
83 83 50c922c1b5145dab8baefefb0437d363b6a6c21c 2.5.3
84 84 8a7bd2dccd44ed571afe7424cd7f95594f27c092 2.5.4
85 85 292cd385856d98bacb2c3086f8897bc660c2beea 2.6-rc
86 86 23f785b38af38d2fca6b8f3db56b8007a84cd73a 2.6
87 87 ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 2.6.1
88 88 cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 2.6.2
89 89 009794acc6e37a650f0fae37872e733382ac1c0c 2.6.3
90 90 f0d7721d7322dcfb5af33599c2543f27335334bb 2.7-rc
91 91 f37b5a17e6a0ee17afde2cdde5393dd74715fb58 2.7
92 92 335a558f81dc73afeab4d7be63617392b130117f 2.7.1
93 93 e7fa36d2ad3a7944a52dca126458d6f482db3524 2.7.2
94 94 1596f2d8f2421314b1ddead8f7d0c91009358994 2.8-rc
95 95 d825e4025e39d1c39db943cdc89818abd0a87c27 2.8
96 96 209e04a06467e2969c0cc6501335be0406d46ef0 2.8.1
97 97 ca387377df7a3a67dbb90b6336b781cdadc3ef41 2.8.2
98 98 8862469e16f9236208581b20de5f96bd13cc039d 2.9-rc
99 99 3cec5134e9c4bceab6a00c60f52a4f80677a78f2 2.9
100 100 b96cb15ec9e04d8ac5ee08b34fcbbe4200588965 2.9.1
101 101 3f83fc5cfe715d292069ee8417c83804f6c6c1e4 2.9.2
102 102 564f55b251224f16508dd1311452db7780dafe2b 3.0-rc
103 103 2195ac506c6ababe86985b932f4948837c0891b5 3.0
104 104 269c80ee5b3cb3684fa8edc61501b3506d02eb10 3.0.1
105 105 2d8cd3d0e83c7336c0cb45a9f88638363f993848 3.0.2
106 106 6c36dc6cd61a0e1b563f1d51e55bdf4dacf12162 3.1-rc
107 107 3178e49892020336491cdc6945885c4de26ffa8b 3.1
108 108 5dc91146f35369949ea56b40172308158b59063a 3.1.1
109 109 f768c888aaa68d12dd7f509dcc7f01c9584357d0 3.1.2
110 110 7f8d16af8cae246fa5a48e723d48d58b015aed94 3.2-rc
111 111 ced632394371a36953ce4d394f86278ae51a2aae 3.2
112 112 643c58303fb0ec020907af28b9e486be299ba043 3.2.1
113 113 902554884335e5ca3661d63be9978eb4aec3f68a 3.2.2
114 114 6dad422ecc5adb63d9fa649eeb8e05a5f9bc4900 3.2.3
115 115 1265a3a71d75396f5d4cf6935ae7d9ba5407a547 3.2.4
116 116 db8e3f7948b1fdeb9ad12d448fc3525759908b9f 3.3-rc
117 117 fbdd5195528fae4f41feebc1838215c110b25d6a 3.3
118 118 5b4ed033390bf6e2879c8f5c28c84e1ee3b87231 3.3.1
119 119 07a92bbd02e5e3a625e0820389b47786b02b2cea 3.3.2
120 120 2e2e9a0750f91a6fe0ad88e4de34f8efefdcab08 3.3.3
121 121 e89f909edffad558b56f4affa8239e4832f88de0 3.4-rc
122 122 8cc6036bca532e06681c5a8fa37efaa812de67b5 3.4
123 123 ed18f4acf435a2824c6f49fba40f42b9df5da7ad 3.4.1
124 124 540cd0ddac49c1125b2e013aa2ff18ecbd4dd954 3.4.2
125 125 96a38d44ba093bd1d1ecfd34119e94056030278b 3.5-rc
126 126 21aa1c313b05b1a85f8ffa1120d51579ddf6bf24 3.5
127 127 1a45e49a6bed023deb229102a8903234d18054d3 3.5.1
128 128 9a466b9f9792e3ad7ae3fc6c43c3ff2e136b718d 3.5.2
129 129 b66e3ca0b90c3095ea28dfd39aa24247bebf5c20 3.6-rc
130 130 47dd34f2e7272be9e3b2a5a83cd0d20be44293f4 3.6
131 131 1aa5083cbebbe7575c88f3402ab377539b484897 3.6.1
132 132 2d437a0f3355834a9485bbbeb30a52a052c98f19 3.6.2
133 133 ea389970c08449440587712117f178d33bab3f1e 3.6.3
134 134 158bdc8965720ca4061f8f8d806563cfc7cdb62e 3.7-rc
135 135 2408645de650d8a29a6ce9e7dce601d8dd0d1474 3.7
136 136 b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1
137 137 d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2
138 138 ae279d4a19e9683214cbd1fe8298cf0b50571432 3.7.3
139 139 740156eedf2c450aee58b1a90b0e826f47c5da64 3.8-rc
140 140 f85de28eae32e7d3064b1a1321309071bbaaa069 3.8
141 141 a56296f55a5e1038ea5016dace2076b693c28a56 3.8.1
142 142 aaabed77791a75968a12b8c43ad263631a23ee81 3.8.2
143 143 a9764ab80e11bcf6a37255db7dd079011f767c6c 3.8.3
144 144 26a5d605b8683a292bb89aea11f37a81b06ac016 3.8.4
145 145 519bb4f9d3a47a6e83c2b414d58811ed38f503c2 3.9-rc
146 146 299546f84e68dbb9bd026f0f3a974ce4bdb93686 3.9
147 147 ccd436f7db6d5d7b9af89715179b911d031d44f1 3.9.1
148 148 149433e68974eb5c63ccb03f794d8b57339a80c4 3.9.2
149 149 438173c415874f6ac653efc1099dec9c9150e90f 4.0-rc
150 150 eab27446995210c334c3d06f1a659e3b9b5da769 4.0
151 151 b3b1ae98f6a0e14c1e1ba806a6c18e193b6dae5c 4.0.1
152 152 e69874dc1f4e142746ff3df91e678a09c6fc208c 4.0.2
153 153 a1dd2c0c479e0550040542e392e87bc91262517e 4.1-rc
154 154 e1526da1e6d84e03146151c9b6e6950fe9a83d7d 4.1
155 155 25703b624d27e3917d978af56d6ad59331e0464a 4.1.1
156 156 ed5b25874d998ababb181a939dd37a16ea644435 4.1.2
157 157 77eaf9539499a1b8be259ffe7ada787d07857f80 4.1.3
158 158 616e788321cc4ae9975b7f0c54c849f36d82182b 4.2-rc
159 159 bb96d4a497432722623ae60d9bc734a1e360179e 4.2
160 160 c850f0ed54c1d42f9aa079ad528f8127e5775217 4.2.1
161 161 26c49ed51a698ec016d2b4c6b44ca3c3f73cc788 4.2.2
162 162 857876ebaed4e315f63157bd157d6ce553c7ab73 4.3-rc
163 163 5544af8622863796a0027566f6b646e10d522c4c 4.3
164 164 943c91326b23954e6e1c6960d0239511f9530258 4.2.3
165 165 3fee7f7d2da04226914c2258cc2884dc27384fd7 4.3.1
166 166 920977f72c7b70acfdaf56ab35360584d7845827 4.3.2
167 167 2f427b57bf9019c6dc3750baa539dc22c1be50f6 4.3.3
168 168 1e2454b60e5936f5e77498cab2648db469504487 4.4-rc
169 169 0ccb43d4cf01d013ae05917ec4f305509f851b2d 4.4
170 170 cabc840ffdee8a72f3689fb77dd74d04fdc2bc04 4.4.1
171 171 a92b9f8e11ba330614cdfd6af0e03b15c1ff3797 4.4.2
172 172 27b6df1b5adbdf647cf5c6675b40575e1b197c60 4.5-rc
173 173 d334afc585e29577f271c5eda03378736a16ca6b 4.5
174 174 369aadf7a3264b03c8b09efce715bc41e6ab4a9b 4.5.1
175 175 8bba684efde7f45add05f737952093bb2aa07155 4.5.2
176 176 7de7bd407251af2bc98e5b809c8598ee95830daf 4.5.3
177 177 ed5448edcbfa747b9154099e18630e49024fd47b 4.6rc0
178 178 1ec874717d8a93b19e0d50628443e0ee5efab3a9 4.6rc1
179 179 6614cac550aea66d19c601e45efd1b7bd08d7c40 4.6
180 180 9c5ced5276d6e7d54f7c3dadf5247b7ee98ec79c 4.6.1
181 181 0b63a6743010dfdbf8a8154186e119949bdaa1cc 4.6.2
182 182 e90130af47ce8dd53a3109aed9d15876b3e7dee8 4.7rc0
183 183 33ac6a72308a215e6086fbced347ec10aa963b0a 4.7
184 184 ede3bf31fe63677fdf5bd8db687977d4e3d792ed 4.7.1
185 185 5405cb1a79010ac50c58cd84e6f50c4556bf2a4c 4.7.2
186 186 956ec6f1320df26f3133ec40f3de866ea0695fd7 4.8rc0
187 187 a91a2837150bdcb27ae76b3646e6c93cd6a15904 4.8
188 188 1c8c54cf97256f4468da2eb4dbee24f7f3888e71 4.8.1
189 189 197f092b2cd9691e2a55d198f717b231af9be6f9 4.8.2
190 190 593718ff5844cad7a27ee3eb5adad89ac8550949 4.9rc0
191 191 83377b4b4ae0e9a6b8e579f7b0a693b8cf5c3b10 4.9
192 192 4ea21df312ec7159c5b3633096b6ecf68750b0dd 4.9.1
193 193 4a8d9ed864754837a185a642170cde24392f9abf 5.0rc0
194 194 07e479ef7c9639be0029f00e6a722b96dcc05fee 5.0
195 195 c3484ddbdb9621256d597ed86b90d229c59c2af9 5.0.1
196 196 97ada9b8d51bef24c5cb4cdca4243f0db694ab6e 5.0.2
197 197 e386b5f4f8360dbb43a576dd9b1368e386fefa5b 5.1rc0
198 198 e91930d712e8507d1bc1b2dffd96c83edc4cbed3 5.1
199 199 a4e32fd539ab41489a51b2aa88bda9a73b839562 5.1.1
200 200 181e52f2b62f4768aa0d988936c929dc7c4a41a0 5.1.2
201 201 59338f9561099de77c684c00f76507f11e46ebe8 5.2rc0
202 202 ca3dca416f8d5863ca6f5a4a6a6bb835dcd5feeb 5.2
203 203 a50fecefa691c9b72a99e49aa6fe9dd13943c2bf 5.2.1
204 204 b4c82b70418022e67cc0e69b1aa3c3aa43aa1d29 5.2.2
205 205 84a0102c05c7852c8215ef6cf21d809927586b69 5.3rc0
206 206 e4344e463c0c888a2f437b78b5982ecdf3f6650a 5.3rc1
207 207 7f5410dfc8a64bb587d19637deb95d378fd1eb5c 5.3
208 208 6d121acbb82e65fe4dd3c2318a1b61981b958492 5.3.1
209 209 8fca7e8449a847e3cf1054f2c07b51237699fad3 5.3.2
210 210 26ce8e7515036d3431a03aaeb7bc72dd96cb1112 5.4rc0
211 211 cf3e07d7648a4371ce584d15dd692e7a6845792f 5.4
212 212 065704cbdbdbb05dcd6bb814eb9bbdd982211b28 5.4.1
213 213 0ea9c86fac8974cd74dc12ea681c8986eb6da6c4 5.4.2
214 214 28163c5de797e5416f9b588940f4608269b4d50a 5.5rc0
215 215 7fc3c5fbc65f6fe85d70ea63923b8767dda4f2e0 5.5
216 216 f62bb5d07848ca598aa860a517394130b61bf2ee 5.5.1
217 217 07731064ac41dacdf0ec869ebd05c2e848c14fbf 5.5.2
218 218 0e06a7ab9e0d5c65af4e511aee1e0342998799df 5.6rc0
219 219 18c17d63fdabd009e70bf994e5efb7db422f4f7f 5.6
220 220 1d5189a57405ceca5aa244052c9f948977f4699b 5.6.1
221 221 9da65e3cf3706ff41e08b311381c588440c27baf 5.7rc0
222 222 0e2e7300f4302b02412b0b734717697049494c4c 5.7
223 d5d9177c0045d206db575bae6daa98e2cb2fe5bc 5.7.1
@@ -1,293 +1,291 b''
1 1 # filelog.py - file history class for mercurial
2 2 #
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 from .i18n import _
11 11 from .node import (
12 12 nullid,
13 13 nullrev,
14 14 )
15 15 from . import (
16 16 error,
17 17 revlog,
18 18 )
19 19 from .interfaces import (
20 20 repository,
21 21 util as interfaceutil,
22 22 )
23 23 from .utils import storageutil
24 24
25 25
26 26 @interfaceutil.implementer(repository.ifilestorage)
27 27 class filelog(object):
28 28 def __init__(self, opener, path):
29 29 self._revlog = revlog.revlog(
30 30 opener, b'/'.join((b'data', path + b'.i')), censorable=True
31 31 )
32 32 # Full name of the user visible file, relative to the repository root.
33 33 # Used by LFS.
34 34 self._revlog.filename = path
35 35
36 36 def __len__(self):
37 37 return len(self._revlog)
38 38
39 39 def __iter__(self):
40 40 return self._revlog.__iter__()
41 41
42 42 def hasnode(self, node):
43 43 if node in (nullid, nullrev):
44 44 return False
45 45
46 46 try:
47 47 self._revlog.rev(node)
48 48 return True
49 49 except (TypeError, ValueError, IndexError, error.LookupError):
50 50 return False
51 51
52 52 def revs(self, start=0, stop=None):
53 53 return self._revlog.revs(start=start, stop=stop)
54 54
55 55 def parents(self, node):
56 56 return self._revlog.parents(node)
57 57
58 58 def parentrevs(self, rev):
59 59 return self._revlog.parentrevs(rev)
60 60
61 61 def rev(self, node):
62 62 return self._revlog.rev(node)
63 63
64 64 def node(self, rev):
65 65 return self._revlog.node(rev)
66 66
67 67 def lookup(self, node):
68 68 return storageutil.fileidlookup(
69 69 self._revlog, node, self._revlog.indexfile
70 70 )
71 71
72 72 def linkrev(self, rev):
73 73 return self._revlog.linkrev(rev)
74 74
75 75 def commonancestorsheads(self, node1, node2):
76 76 return self._revlog.commonancestorsheads(node1, node2)
77 77
78 78 # Used by dagop.blockdescendants().
79 79 def descendants(self, revs):
80 80 return self._revlog.descendants(revs)
81 81
82 82 def heads(self, start=None, stop=None):
83 83 return self._revlog.heads(start, stop)
84 84
85 85 # Used by hgweb, children extension.
86 86 def children(self, node):
87 87 return self._revlog.children(node)
88 88
89 89 def iscensored(self, rev):
90 90 return self._revlog.iscensored(rev)
91 91
92 92 def revision(self, node, _df=None, raw=False):
93 93 return self._revlog.revision(node, _df=_df, raw=raw)
94 94
95 95 def rawdata(self, node, _df=None):
96 96 return self._revlog.rawdata(node, _df=_df)
97 97
98 98 def emitrevisions(
99 99 self,
100 100 nodes,
101 101 nodesorder=None,
102 102 revisiondata=False,
103 103 assumehaveparentrevisions=False,
104 104 deltamode=repository.CG_DELTAMODE_STD,
105 105 ):
106 106 return self._revlog.emitrevisions(
107 107 nodes,
108 108 nodesorder=nodesorder,
109 109 revisiondata=revisiondata,
110 110 assumehaveparentrevisions=assumehaveparentrevisions,
111 111 deltamode=deltamode,
112 112 )
113 113
114 114 def addrevision(
115 115 self,
116 116 revisiondata,
117 117 transaction,
118 118 linkrev,
119 119 p1,
120 120 p2,
121 121 node=None,
122 122 flags=revlog.REVIDX_DEFAULT_FLAGS,
123 123 cachedelta=None,
124 124 ):
125 125 return self._revlog.addrevision(
126 126 revisiondata,
127 127 transaction,
128 128 linkrev,
129 129 p1,
130 130 p2,
131 131 node=node,
132 132 flags=flags,
133 133 cachedelta=cachedelta,
134 134 )
135 135
136 136 def addgroup(
137 137 self,
138 138 deltas,
139 139 linkmapper,
140 140 transaction,
141 141 addrevisioncb=None,
142 142 duplicaterevisioncb=None,
143 143 maybemissingparents=False,
144 144 ):
145 145 if maybemissingparents:
146 146 raise error.Abort(
147 147 _(
148 148 b'revlog storage does not support missing '
149 149 b'parents write mode'
150 150 )
151 151 )
152 152
153 153 return self._revlog.addgroup(
154 154 deltas,
155 155 linkmapper,
156 156 transaction,
157 157 addrevisioncb=addrevisioncb,
158 158 duplicaterevisioncb=duplicaterevisioncb,
159 159 )
160 160
161 161 def getstrippoint(self, minlink):
162 162 return self._revlog.getstrippoint(minlink)
163 163
164 164 def strip(self, minlink, transaction):
165 165 return self._revlog.strip(minlink, transaction)
166 166
167 167 def censorrevision(self, tr, node, tombstone=b''):
168 168 return self._revlog.censorrevision(tr, node, tombstone=tombstone)
169 169
170 170 def files(self):
171 171 return self._revlog.files()
172 172
173 173 def read(self, node):
174 174 return storageutil.filtermetadata(self.revision(node))
175 175
176 176 def add(self, text, meta, transaction, link, p1=None, p2=None):
177 177 if meta or text.startswith(b'\1\n'):
178 178 text = storageutil.packmeta(meta, text)
179 179 rev = self.addrevision(text, transaction, link, p1, p2)
180 180 return self.node(rev)
181 181
182 182 def renamed(self, node):
183 183 return storageutil.filerevisioncopied(self, node)
184 184
185 185 def size(self, rev):
186 186 """return the size of a given revision"""
187 187
188 188 # for revisions with renames, we have to go the slow way
189 189 node = self.node(rev)
190 190 if self.renamed(node):
191 191 return len(self.read(node))
192 192 if self.iscensored(rev):
193 193 return 0
194 194
195 195 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
196 196 return self._revlog.size(rev)
197 197
198 198 def cmp(self, node, text):
199 199 """compare text with a given file revision
200 200
201 201 returns True if text is different than what is stored.
202 202 """
203 203 return not storageutil.filedataequivalent(self, node, text)
204 204
205 205 def verifyintegrity(self, state):
206 206 return self._revlog.verifyintegrity(state)
207 207
208 208 def storageinfo(
209 209 self,
210 210 exclusivefiles=False,
211 211 sharedfiles=False,
212 212 revisionscount=False,
213 213 trackedsize=False,
214 214 storedsize=False,
215 215 ):
216 216 return self._revlog.storageinfo(
217 217 exclusivefiles=exclusivefiles,
218 218 sharedfiles=sharedfiles,
219 219 revisionscount=revisionscount,
220 220 trackedsize=trackedsize,
221 221 storedsize=storedsize,
222 222 )
223 223
224 224 # TODO these aren't part of the interface and aren't internal methods.
225 225 # Callers should be fixed to not use them.
226 226
227 227 # Used by bundlefilelog, unionfilelog.
228 228 @property
229 229 def indexfile(self):
230 230 return self._revlog.indexfile
231 231
232 232 @indexfile.setter
233 233 def indexfile(self, value):
234 234 self._revlog.indexfile = value
235 235
236 236 # Used by repo upgrade.
237 237 def clone(self, tr, destrevlog, **kwargs):
238 238 if not isinstance(destrevlog, filelog):
239 239 raise error.ProgrammingError(b'expected filelog to clone()')
240 240
241 241 return self._revlog.clone(tr, destrevlog._revlog, **kwargs)
242 242
243 243
244 244 class narrowfilelog(filelog):
245 245 """Filelog variation to be used with narrow stores."""
246 246
247 247 def __init__(self, opener, path, narrowmatch):
248 248 super(narrowfilelog, self).__init__(opener, path)
249 249 self._narrowmatch = narrowmatch
250 250
251 251 def renamed(self, node):
252 252 res = super(narrowfilelog, self).renamed(node)
253 253
254 254 # Renames that come from outside the narrowspec are problematic
255 255 # because we may lack the base text for the rename. This can result
256 256 # in code attempting to walk the ancestry or compute a diff
257 257 # encountering a missing revision. We address this by silently
258 258 # removing rename metadata if the source file is outside the
259 259 # narrow spec.
260 260 #
261 261 # A better solution would be to see if the base revision is available,
262 262 # rather than assuming it isn't.
263 263 #
264 264 # An even better solution would be to teach all consumers of rename
265 265 # metadata that the base revision may not be available.
266 266 #
267 267 # TODO consider better ways of doing this.
268 268 if res and not self._narrowmatch(res[0]):
269 269 return None
270 270
271 271 return res
272 272
273 273 def size(self, rev):
274 274 # Because we have a custom renamed() that may lie, we need to call
275 275 # the base renamed() to report accurate results.
276 276 node = self.node(rev)
277 277 if super(narrowfilelog, self).renamed(node):
278 278 return len(self.read(node))
279 279 else:
280 280 return super(narrowfilelog, self).size(rev)
281 281
282 282 def cmp(self, node, text):
283 different = super(narrowfilelog, self).cmp(node, text)
283 # We don't call `super` because narrow parents can be buggy in case of a
284 # ambiguous dirstate. Always take the slow path until there is a better
285 # fix, see issue6150.
284 286
285 # Because renamed() may lie, we may get false positives for
286 # different content. Check for this by comparing against the original
287 # renamed() implementation.
288 if different:
289 if super(narrowfilelog, self).renamed(node):
290 t2 = self.read(node)
291 return t2 != text
287 # Censored files compare against the empty file.
288 if self.iscensored(self.rev(node)):
289 return text != b''
292 290
293 return different
291 return self.read(node) != text
@@ -1,3073 +1,3073 b''
1 1 The Mercurial system uses a set of configuration files to control
2 2 aspects of its behavior.
3 3
4 4 Troubleshooting
5 5 ===============
6 6
7 7 If you're having problems with your configuration,
8 8 :hg:`config --debug` can help you understand what is introducing
9 9 a setting into your environment.
10 10
11 11 See :hg:`help config.syntax` and :hg:`help config.files`
12 12 for information about how and where to override things.
13 13
14 14 Structure
15 15 =========
16 16
17 17 The configuration files use a simple ini-file format. A configuration
18 18 file consists of sections, led by a ``[section]`` header and followed
19 19 by ``name = value`` entries::
20 20
21 21 [ui]
22 22 username = Firstname Lastname <firstname.lastname@example.net>
23 23 verbose = True
24 24
25 25 The above entries will be referred to as ``ui.username`` and
26 26 ``ui.verbose``, respectively. See :hg:`help config.syntax`.
27 27
28 28 Files
29 29 =====
30 30
31 31 Mercurial reads configuration data from several files, if they exist.
32 32 These files do not exist by default and you will have to create the
33 33 appropriate configuration files yourself:
34 34
35 35 Local configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
36 36
37 37 Global configuration like the username setting is typically put into:
38 38
39 39 .. container:: windows
40 40
41 41 - ``%USERPROFILE%\mercurial.ini`` (on Windows)
42 42
43 43 .. container:: unix.plan9
44 44
45 45 - ``$HOME/.hgrc`` (on Unix, Plan9)
46 46
47 47 The names of these files depend on the system on which Mercurial is
48 48 installed. ``*.rc`` files from a single directory are read in
49 49 alphabetical order, later ones overriding earlier ones. Where multiple
50 50 paths are given below, settings from earlier paths override later
51 51 ones.
52 52
53 53 .. container:: verbose.unix
54 54
55 55 On Unix, the following files are consulted:
56 56
57 57 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
58 58 - ``<repo>/.hg/hgrc`` (per-repository)
59 59 - ``$HOME/.hgrc`` (per-user)
60 60 - ``${XDG_CONFIG_HOME:-$HOME/.config}/hg/hgrc`` (per-user)
61 61 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
62 62 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
63 63 - ``/etc/mercurial/hgrc`` (per-system)
64 64 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
65 65 - ``<internal>/*.rc`` (defaults)
66 66
67 67 .. container:: verbose.windows
68 68
69 69 On Windows, the following files are consulted:
70 70
71 71 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
72 72 - ``<repo>/.hg/hgrc`` (per-repository)
73 73 - ``%USERPROFILE%\.hgrc`` (per-user)
74 74 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
75 75 - ``%HOME%\.hgrc`` (per-user)
76 76 - ``%HOME%\Mercurial.ini`` (per-user)
77 77 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-system)
78 78 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
79 79 - ``<install-dir>\Mercurial.ini`` (per-installation)
80 80 - ``%PROGRAMDATA%\Mercurial\hgrc`` (per-system)
81 81 - ``%PROGRAMDATA%\Mercurial\Mercurial.ini`` (per-system)
82 82 - ``%PROGRAMDATA%\Mercurial\hgrc.d\*.rc`` (per-system)
83 83 - ``<internal>/*.rc`` (defaults)
84 84
85 85 .. note::
86 86
87 87 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
88 88 is used when running 32-bit Python on 64-bit Windows.
89 89
90 90 .. container:: verbose.plan9
91 91
92 92 On Plan9, the following files are consulted:
93 93
94 94 - ``<repo>/.hg/hgrc-not-shared`` (per-repository)
95 95 - ``<repo>/.hg/hgrc`` (per-repository)
96 96 - ``$home/lib/hgrc`` (per-user)
97 97 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
98 98 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
99 99 - ``/lib/mercurial/hgrc`` (per-system)
100 100 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
101 101 - ``<internal>/*.rc`` (defaults)
102 102
103 103 Per-repository configuration options only apply in a
104 104 particular repository. This file is not version-controlled, and
105 105 will not get transferred during a "clone" operation. Options in
106 106 this file override options in all other configuration files.
107 107
108 108 .. container:: unix.plan9
109 109
110 110 On Plan 9 and Unix, most of this file will be ignored if it doesn't
111 111 belong to a trusted user or to a trusted group. See
112 112 :hg:`help config.trusted` for more details.
113 113
114 114 Per-user configuration file(s) are for the user running Mercurial. Options
115 115 in these files apply to all Mercurial commands executed by this user in any
116 116 directory. Options in these files override per-system and per-installation
117 117 options.
118 118
119 119 Per-installation configuration files are searched for in the
120 120 directory where Mercurial is installed. ``<install-root>`` is the
121 121 parent directory of the **hg** executable (or symlink) being run.
122 122
123 123 .. container:: unix.plan9
124 124
125 125 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
126 126 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
127 127 files apply to all Mercurial commands executed by any user in any
128 128 directory.
129 129
130 130 Per-installation configuration files are for the system on
131 131 which Mercurial is running. Options in these files apply to all
132 132 Mercurial commands executed by any user in any directory. Registry
133 133 keys contain PATH-like strings, every part of which must reference
134 134 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
135 135 be read. Mercurial checks each of these locations in the specified
136 136 order until one or more configuration files are detected.
137 137
138 138 Per-system configuration files are for the system on which Mercurial
139 139 is running. Options in these files apply to all Mercurial commands
140 140 executed by any user in any directory. Options in these files
141 141 override per-installation options.
142 142
143 143 Mercurial comes with some default configuration. The default configuration
144 144 files are installed with Mercurial and will be overwritten on upgrades. Default
145 145 configuration files should never be edited by users or administrators but can
146 146 be overridden in other configuration files. So far the directory only contains
147 147 merge tool configuration but packagers can also put other default configuration
148 148 there.
149 149
150 150 On versions 5.7 and later, if share-safe functionality is enabled,
151 151 shares will read config file of share source too.
152 152 `<share-source/.hg/hgrc>` is read before reading `<repo/.hg/hgrc>`.
153 153
154 154 For configs which should not be shared, `<repo/.hg/hgrc-not-shared>`
155 155 should be used.
156 156
157 157 Syntax
158 158 ======
159 159
160 160 A configuration file consists of sections, led by a ``[section]`` header
161 161 and followed by ``name = value`` entries (sometimes called
162 162 ``configuration keys``)::
163 163
164 164 [spam]
165 165 eggs=ham
166 166 green=
167 167 eggs
168 168
169 169 Each line contains one entry. If the lines that follow are indented,
170 170 they are treated as continuations of that entry. Leading whitespace is
171 171 removed from values. Empty lines are skipped. Lines beginning with
172 172 ``#`` or ``;`` are ignored and may be used to provide comments.
173 173
174 174 Configuration keys can be set multiple times, in which case Mercurial
175 175 will use the value that was configured last. As an example::
176 176
177 177 [spam]
178 178 eggs=large
179 179 ham=serrano
180 180 eggs=small
181 181
182 182 This would set the configuration key named ``eggs`` to ``small``.
183 183
184 184 It is also possible to define a section multiple times. A section can
185 185 be redefined on the same and/or on different configuration files. For
186 186 example::
187 187
188 188 [foo]
189 189 eggs=large
190 190 ham=serrano
191 191 eggs=small
192 192
193 193 [bar]
194 194 eggs=ham
195 195 green=
196 196 eggs
197 197
198 198 [foo]
199 199 ham=prosciutto
200 200 eggs=medium
201 201 bread=toasted
202 202
203 203 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
204 204 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
205 205 respectively. As you can see there only thing that matters is the last
206 206 value that was set for each of the configuration keys.
207 207
208 208 If a configuration key is set multiple times in different
209 209 configuration files the final value will depend on the order in which
210 210 the different configuration files are read, with settings from earlier
211 211 paths overriding later ones as described on the ``Files`` section
212 212 above.
213 213
214 214 A line of the form ``%include file`` will include ``file`` into the
215 215 current configuration file. The inclusion is recursive, which means
216 216 that included files can include other files. Filenames are relative to
217 217 the configuration file in which the ``%include`` directive is found.
218 218 Environment variables and ``~user`` constructs are expanded in
219 219 ``file``. This lets you do something like::
220 220
221 221 %include ~/.hgrc.d/$HOST.rc
222 222
223 223 to include a different configuration file on each computer you use.
224 224
225 225 A line with ``%unset name`` will remove ``name`` from the current
226 226 section, if it has been set previously.
227 227
228 228 The values are either free-form text strings, lists of text strings,
229 229 or Boolean values. Boolean values can be set to true using any of "1",
230 230 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
231 231 (all case insensitive).
232 232
233 233 List values are separated by whitespace or comma, except when values are
234 234 placed in double quotation marks::
235 235
236 236 allow_read = "John Doe, PhD", brian, betty
237 237
238 238 Quotation marks can be escaped by prefixing them with a backslash. Only
239 239 quotation marks at the beginning of a word is counted as a quotation
240 240 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
241 241
242 242 Sections
243 243 ========
244 244
245 245 This section describes the different sections that may appear in a
246 246 Mercurial configuration file, the purpose of each section, its possible
247 247 keys, and their possible values.
248 248
249 249 ``alias``
250 250 ---------
251 251
252 252 Defines command aliases.
253 253
254 254 Aliases allow you to define your own commands in terms of other
255 255 commands (or aliases), optionally including arguments. Positional
256 256 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
257 257 are expanded by Mercurial before execution. Positional arguments not
258 258 already used by ``$N`` in the definition are put at the end of the
259 259 command to be executed.
260 260
261 261 Alias definitions consist of lines of the form::
262 262
263 263 <alias> = <command> [<argument>]...
264 264
265 265 For example, this definition::
266 266
267 267 latest = log --limit 5
268 268
269 269 creates a new command ``latest`` that shows only the five most recent
270 270 changesets. You can define subsequent aliases using earlier ones::
271 271
272 272 stable5 = latest -b stable
273 273
274 274 .. note::
275 275
276 276 It is possible to create aliases with the same names as
277 277 existing commands, which will then override the original
278 278 definitions. This is almost always a bad idea!
279 279
280 280 An alias can start with an exclamation point (``!``) to make it a
281 281 shell alias. A shell alias is executed with the shell and will let you
282 282 run arbitrary commands. As an example, ::
283 283
284 284 echo = !echo $@
285 285
286 286 will let you do ``hg echo foo`` to have ``foo`` printed in your
287 287 terminal. A better example might be::
288 288
289 289 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm -f
290 290
291 291 which will make ``hg purge`` delete all unknown files in the
292 292 repository in the same manner as the purge extension.
293 293
294 294 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
295 295 expand to the command arguments. Unmatched arguments are
296 296 removed. ``$0`` expands to the alias name and ``$@`` expands to all
297 297 arguments separated by a space. ``"$@"`` (with quotes) expands to all
298 298 arguments quoted individually and separated by a space. These expansions
299 299 happen before the command is passed to the shell.
300 300
301 301 Shell aliases are executed in an environment where ``$HG`` expands to
302 302 the path of the Mercurial that was used to execute the alias. This is
303 303 useful when you want to call further Mercurial commands in a shell
304 304 alias, as was done above for the purge alias. In addition,
305 305 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
306 306 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
307 307
308 308 .. note::
309 309
310 310 Some global configuration options such as ``-R`` are
311 311 processed before shell aliases and will thus not be passed to
312 312 aliases.
313 313
314 314
315 315 ``annotate``
316 316 ------------
317 317
318 318 Settings used when displaying file annotations. All values are
319 319 Booleans and default to False. See :hg:`help config.diff` for
320 320 related options for the diff command.
321 321
322 322 ``ignorews``
323 323 Ignore white space when comparing lines.
324 324
325 325 ``ignorewseol``
326 326 Ignore white space at the end of a line when comparing lines.
327 327
328 328 ``ignorewsamount``
329 329 Ignore changes in the amount of white space.
330 330
331 331 ``ignoreblanklines``
332 332 Ignore changes whose lines are all blank.
333 333
334 334
335 335 ``auth``
336 336 --------
337 337
338 338 Authentication credentials and other authentication-like configuration
339 339 for HTTP connections. This section allows you to store usernames and
340 340 passwords for use when logging *into* HTTP servers. See
341 341 :hg:`help config.web` if you want to configure *who* can login to
342 342 your HTTP server.
343 343
344 344 The following options apply to all hosts.
345 345
346 346 ``cookiefile``
347 347 Path to a file containing HTTP cookie lines. Cookies matching a
348 348 host will be sent automatically.
349 349
350 350 The file format uses the Mozilla cookies.txt format, which defines cookies
351 351 on their own lines. Each line contains 7 fields delimited by the tab
352 352 character (domain, is_domain_cookie, path, is_secure, expires, name,
353 353 value). For more info, do an Internet search for "Netscape cookies.txt
354 354 format."
355 355
356 356 Note: the cookies parser does not handle port numbers on domains. You
357 357 will need to remove ports from the domain for the cookie to be recognized.
358 358 This could result in a cookie being disclosed to an unwanted server.
359 359
360 360 The cookies file is read-only.
361 361
362 362 Other options in this section are grouped by name and have the following
363 363 format::
364 364
365 365 <name>.<argument> = <value>
366 366
367 367 where ``<name>`` is used to group arguments into authentication
368 368 entries. Example::
369 369
370 370 foo.prefix = hg.intevation.de/mercurial
371 371 foo.username = foo
372 372 foo.password = bar
373 373 foo.schemes = http https
374 374
375 375 bar.prefix = secure.example.org
376 376 bar.key = path/to/file.key
377 377 bar.cert = path/to/file.cert
378 378 bar.schemes = https
379 379
380 380 Supported arguments:
381 381
382 382 ``prefix``
383 383 Either ``*`` or a URI prefix with or without the scheme part.
384 384 The authentication entry with the longest matching prefix is used
385 385 (where ``*`` matches everything and counts as a match of length
386 386 1). If the prefix doesn't include a scheme, the match is performed
387 387 against the URI with its scheme stripped as well, and the schemes
388 388 argument, q.v., is then subsequently consulted.
389 389
390 390 ``username``
391 391 Optional. Username to authenticate with. If not given, and the
392 392 remote site requires basic or digest authentication, the user will
393 393 be prompted for it. Environment variables are expanded in the
394 394 username letting you do ``foo.username = $USER``. If the URI
395 395 includes a username, only ``[auth]`` entries with a matching
396 396 username or without a username will be considered.
397 397
398 398 ``password``
399 399 Optional. Password to authenticate with. If not given, and the
400 400 remote site requires basic or digest authentication, the user
401 401 will be prompted for it.
402 402
403 403 ``key``
404 404 Optional. PEM encoded client certificate key file. Environment
405 405 variables are expanded in the filename.
406 406
407 407 ``cert``
408 408 Optional. PEM encoded client certificate chain file. Environment
409 409 variables are expanded in the filename.
410 410
411 411 ``schemes``
412 412 Optional. Space separated list of URI schemes to use this
413 413 authentication entry with. Only used if the prefix doesn't include
414 414 a scheme. Supported schemes are http and https. They will match
415 415 static-http and static-https respectively, as well.
416 416 (default: https)
417 417
418 418 If no suitable authentication entry is found, the user is prompted
419 419 for credentials as usual if required by the remote.
420 420
421 421 ``cmdserver``
422 422 -------------
423 423
424 424 Controls command server settings. (ADVANCED)
425 425
426 426 ``message-encodings``
427 427 List of encodings for the ``m`` (message) channel. The first encoding
428 428 supported by the server will be selected and advertised in the hello
429 429 message. This is useful only when ``ui.message-output`` is set to
430 430 ``channel``. Supported encodings are ``cbor``.
431 431
432 432 ``shutdown-on-interrupt``
433 433 If set to false, the server's main loop will continue running after
434 434 SIGINT received. ``runcommand`` requests can still be interrupted by
435 435 SIGINT. Close the write end of the pipe to shut down the server
436 436 process gracefully.
437 437 (default: True)
438 438
439 439 ``color``
440 440 ---------
441 441
442 442 Configure the Mercurial color mode. For details about how to define your custom
443 443 effect and style see :hg:`help color`.
444 444
445 445 ``mode``
446 446 String: control the method used to output color. One of ``auto``, ``ansi``,
447 447 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
448 448 use ANSI mode by default (or win32 mode prior to Windows 10) if it detects a
449 449 terminal. Any invalid value will disable color.
450 450
451 451 ``pagermode``
452 452 String: optional override of ``color.mode`` used with pager.
453 453
454 454 On some systems, terminfo mode may cause problems when using
455 455 color with ``less -R`` as a pager program. less with the -R option
456 456 will only display ECMA-48 color codes, and terminfo mode may sometimes
457 457 emit codes that less doesn't understand. You can work around this by
458 458 either using ansi mode (or auto mode), or by using less -r (which will
459 459 pass through all terminal control codes, not just color control
460 460 codes).
461 461
462 462 On some systems (such as MSYS in Windows), the terminal may support
463 463 a different color mode than the pager program.
464 464
465 465 ``commands``
466 466 ------------
467 467
468 468 ``commit.post-status``
469 469 Show status of files in the working directory after successful commit.
470 470 (default: False)
471 471
472 472 ``merge.require-rev``
473 473 Require that the revision to merge the current commit with be specified on
474 474 the command line. If this is enabled and a revision is not specified, the
475 475 command aborts.
476 476 (default: False)
477 477
478 478 ``push.require-revs``
479 479 Require revisions to push be specified using one or more mechanisms such as
480 480 specifying them positionally on the command line, using ``-r``, ``-b``,
481 481 and/or ``-B`` on the command line, or using ``paths.<path>:pushrev`` in the
482 482 configuration. If this is enabled and revisions are not specified, the
483 483 command aborts.
484 484 (default: False)
485 485
486 486 ``resolve.confirm``
487 487 Confirm before performing action if no filename is passed.
488 488 (default: False)
489 489
490 490 ``resolve.explicit-re-merge``
491 491 Require uses of ``hg resolve`` to specify which action it should perform,
492 492 instead of re-merging files by default.
493 493 (default: False)
494 494
495 495 ``resolve.mark-check``
496 496 Determines what level of checking :hg:`resolve --mark` will perform before
497 497 marking files as resolved. Valid values are ``none`, ``warn``, and
498 498 ``abort``. ``warn`` will output a warning listing the file(s) that still
499 499 have conflict markers in them, but will still mark everything resolved.
500 500 ``abort`` will output the same warning but will not mark things as resolved.
501 501 If --all is passed and this is set to ``abort``, only a warning will be
502 502 shown (an error will not be raised).
503 503 (default: ``none``)
504 504
505 505 ``status.relative``
506 506 Make paths in :hg:`status` output relative to the current directory.
507 507 (default: False)
508 508
509 509 ``status.terse``
510 510 Default value for the --terse flag, which condenses status output.
511 511 (default: empty)
512 512
513 513 ``update.check``
514 514 Determines what level of checking :hg:`update` will perform before moving
515 515 to a destination revision. Valid values are ``abort``, ``none``,
516 516 ``linear``, and ``noconflict``. ``abort`` always fails if the working
517 517 directory has uncommitted changes. ``none`` performs no checking, and may
518 518 result in a merge with uncommitted changes. ``linear`` allows any update
519 519 as long as it follows a straight line in the revision history, and may
520 520 trigger a merge with uncommitted changes. ``noconflict`` will allow any
521 521 update which would not trigger a merge with uncommitted changes, if any
522 522 are present.
523 523 (default: ``linear``)
524 524
525 525 ``update.requiredest``
526 526 Require that the user pass a destination when running :hg:`update`.
527 527 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
528 528 will be disallowed.
529 529 (default: False)
530 530
531 531 ``committemplate``
532 532 ------------------
533 533
534 534 ``changeset``
535 535 String: configuration in this section is used as the template to
536 536 customize the text shown in the editor when committing.
537 537
538 538 In addition to pre-defined template keywords, commit log specific one
539 539 below can be used for customization:
540 540
541 541 ``extramsg``
542 542 String: Extra message (typically 'Leave message empty to abort
543 543 commit.'). This may be changed by some commands or extensions.
544 544
545 545 For example, the template configuration below shows as same text as
546 546 one shown by default::
547 547
548 548 [committemplate]
549 549 changeset = {desc}\n\n
550 550 HG: Enter commit message. Lines beginning with 'HG:' are removed.
551 551 HG: {extramsg}
552 552 HG: --
553 553 HG: user: {author}\n{ifeq(p2rev, "-1", "",
554 554 "HG: branch merge\n")
555 555 }HG: branch '{branch}'\n{if(activebookmark,
556 556 "HG: bookmark '{activebookmark}'\n") }{subrepos %
557 557 "HG: subrepo {subrepo}\n" }{file_adds %
558 558 "HG: added {file}\n" }{file_mods %
559 559 "HG: changed {file}\n" }{file_dels %
560 560 "HG: removed {file}\n" }{if(files, "",
561 561 "HG: no files changed\n")}
562 562
563 563 ``diff()``
564 564 String: show the diff (see :hg:`help templates` for detail)
565 565
566 566 Sometimes it is helpful to show the diff of the changeset in the editor without
567 567 having to prefix 'HG: ' to each line so that highlighting works correctly. For
568 568 this, Mercurial provides a special string which will ignore everything below
569 569 it::
570 570
571 571 HG: ------------------------ >8 ------------------------
572 572
573 573 For example, the template configuration below will show the diff below the
574 574 extra message::
575 575
576 576 [committemplate]
577 577 changeset = {desc}\n\n
578 578 HG: Enter commit message. Lines beginning with 'HG:' are removed.
579 579 HG: {extramsg}
580 580 HG: ------------------------ >8 ------------------------
581 581 HG: Do not touch the line above.
582 582 HG: Everything below will be removed.
583 583 {diff()}
584 584
585 585 .. note::
586 586
587 587 For some problematic encodings (see :hg:`help win32mbcs` for
588 588 detail), this customization should be configured carefully, to
589 589 avoid showing broken characters.
590 590
591 591 For example, if a multibyte character ending with backslash (0x5c) is
592 592 followed by the ASCII character 'n' in the customized template,
593 593 the sequence of backslash and 'n' is treated as line-feed unexpectedly
594 594 (and the multibyte character is broken, too).
595 595
596 596 Customized template is used for commands below (``--edit`` may be
597 597 required):
598 598
599 599 - :hg:`backout`
600 600 - :hg:`commit`
601 601 - :hg:`fetch` (for merge commit only)
602 602 - :hg:`graft`
603 603 - :hg:`histedit`
604 604 - :hg:`import`
605 605 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
606 606 - :hg:`rebase`
607 607 - :hg:`shelve`
608 608 - :hg:`sign`
609 609 - :hg:`tag`
610 610 - :hg:`transplant`
611 611
612 612 Configuring items below instead of ``changeset`` allows showing
613 613 customized message only for specific actions, or showing different
614 614 messages for each action.
615 615
616 616 - ``changeset.backout`` for :hg:`backout`
617 617 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
618 618 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
619 619 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
620 620 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
621 621 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
622 622 - ``changeset.gpg.sign`` for :hg:`sign`
623 623 - ``changeset.graft`` for :hg:`graft`
624 624 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
625 625 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
626 626 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
627 627 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
628 628 - ``changeset.import.bypass`` for :hg:`import --bypass`
629 629 - ``changeset.import.normal.merge`` for :hg:`import` on merges
630 630 - ``changeset.import.normal.normal`` for :hg:`import` on other
631 631 - ``changeset.mq.qnew`` for :hg:`qnew`
632 632 - ``changeset.mq.qfold`` for :hg:`qfold`
633 633 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
634 634 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
635 635 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
636 636 - ``changeset.rebase.normal`` for :hg:`rebase` on other
637 637 - ``changeset.shelve.shelve`` for :hg:`shelve`
638 638 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
639 639 - ``changeset.tag.remove`` for :hg:`tag --remove`
640 640 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
641 641 - ``changeset.transplant.normal`` for :hg:`transplant` on other
642 642
643 643 These dot-separated lists of names are treated as hierarchical ones.
644 644 For example, ``changeset.tag.remove`` customizes the commit message
645 645 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
646 646 commit message for :hg:`tag` regardless of ``--remove`` option.
647 647
648 648 When the external editor is invoked for a commit, the corresponding
649 649 dot-separated list of names without the ``changeset.`` prefix
650 650 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
651 651 variable.
652 652
653 653 In this section, items other than ``changeset`` can be referred from
654 654 others. For example, the configuration to list committed files up
655 655 below can be referred as ``{listupfiles}``::
656 656
657 657 [committemplate]
658 658 listupfiles = {file_adds %
659 659 "HG: added {file}\n" }{file_mods %
660 660 "HG: changed {file}\n" }{file_dels %
661 661 "HG: removed {file}\n" }{if(files, "",
662 662 "HG: no files changed\n")}
663 663
664 664 ``decode/encode``
665 665 -----------------
666 666
667 667 Filters for transforming files on checkout/checkin. This would
668 668 typically be used for newline processing or other
669 669 localization/canonicalization of files.
670 670
671 671 Filters consist of a filter pattern followed by a filter command.
672 672 Filter patterns are globs by default, rooted at the repository root.
673 673 For example, to match any file ending in ``.txt`` in the root
674 674 directory only, use the pattern ``*.txt``. To match any file ending
675 675 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
676 676 For each file only the first matching filter applies.
677 677
678 678 The filter command can start with a specifier, either ``pipe:`` or
679 679 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
680 680
681 681 A ``pipe:`` command must accept data on stdin and return the transformed
682 682 data on stdout.
683 683
684 684 Pipe example::
685 685
686 686 [encode]
687 687 # uncompress gzip files on checkin to improve delta compression
688 688 # note: not necessarily a good idea, just an example
689 689 *.gz = pipe: gunzip
690 690
691 691 [decode]
692 692 # recompress gzip files when writing them to the working dir (we
693 693 # can safely omit "pipe:", because it's the default)
694 694 *.gz = gzip
695 695
696 696 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
697 697 with the name of a temporary file that contains the data to be
698 698 filtered by the command. The string ``OUTFILE`` is replaced with the name
699 699 of an empty temporary file, where the filtered data must be written by
700 700 the command.
701 701
702 702 .. container:: windows
703 703
704 704 .. note::
705 705
706 706 The tempfile mechanism is recommended for Windows systems,
707 707 where the standard shell I/O redirection operators often have
708 708 strange effects and may corrupt the contents of your files.
709 709
710 710 This filter mechanism is used internally by the ``eol`` extension to
711 711 translate line ending characters between Windows (CRLF) and Unix (LF)
712 712 format. We suggest you use the ``eol`` extension for convenience.
713 713
714 714
715 715 ``defaults``
716 716 ------------
717 717
718 718 (defaults are deprecated. Don't use them. Use aliases instead.)
719 719
720 720 Use the ``[defaults]`` section to define command defaults, i.e. the
721 721 default options/arguments to pass to the specified commands.
722 722
723 723 The following example makes :hg:`log` run in verbose mode, and
724 724 :hg:`status` show only the modified files, by default::
725 725
726 726 [defaults]
727 727 log = -v
728 728 status = -m
729 729
730 730 The actual commands, instead of their aliases, must be used when
731 731 defining command defaults. The command defaults will also be applied
732 732 to the aliases of the commands defined.
733 733
734 734
735 735 ``diff``
736 736 --------
737 737
738 738 Settings used when displaying diffs. Everything except for ``unified``
739 739 is a Boolean and defaults to False. See :hg:`help config.annotate`
740 740 for related options for the annotate command.
741 741
742 742 ``git``
743 743 Use git extended diff format.
744 744
745 745 ``nobinary``
746 746 Omit git binary patches.
747 747
748 748 ``nodates``
749 749 Don't include dates in diff headers.
750 750
751 751 ``noprefix``
752 752 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
753 753
754 754 ``showfunc``
755 755 Show which function each change is in.
756 756
757 757 ``ignorews``
758 758 Ignore white space when comparing lines.
759 759
760 760 ``ignorewsamount``
761 761 Ignore changes in the amount of white space.
762 762
763 763 ``ignoreblanklines``
764 764 Ignore changes whose lines are all blank.
765 765
766 766 ``unified``
767 767 Number of lines of context to show.
768 768
769 769 ``word-diff``
770 770 Highlight changed words.
771 771
772 772 ``email``
773 773 ---------
774 774
775 775 Settings for extensions that send email messages.
776 776
777 777 ``from``
778 778 Optional. Email address to use in "From" header and SMTP envelope
779 779 of outgoing messages.
780 780
781 781 ``to``
782 782 Optional. Comma-separated list of recipients' email addresses.
783 783
784 784 ``cc``
785 785 Optional. Comma-separated list of carbon copy recipients'
786 786 email addresses.
787 787
788 788 ``bcc``
789 789 Optional. Comma-separated list of blind carbon copy recipients'
790 790 email addresses.
791 791
792 792 ``method``
793 793 Optional. Method to use to send email messages. If value is ``smtp``
794 794 (default), use SMTP (see the ``[smtp]`` section for configuration).
795 795 Otherwise, use as name of program to run that acts like sendmail
796 796 (takes ``-f`` option for sender, list of recipients on command line,
797 797 message on stdin). Normally, setting this to ``sendmail`` or
798 798 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
799 799
800 800 ``charsets``
801 801 Optional. Comma-separated list of character sets considered
802 802 convenient for recipients. Addresses, headers, and parts not
803 803 containing patches of outgoing messages will be encoded in the
804 804 first character set to which conversion from local encoding
805 805 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
806 806 conversion fails, the text in question is sent as is.
807 807 (default: '')
808 808
809 809 Order of outgoing email character sets:
810 810
811 811 1. ``us-ascii``: always first, regardless of settings
812 812 2. ``email.charsets``: in order given by user
813 813 3. ``ui.fallbackencoding``: if not in email.charsets
814 814 4. ``$HGENCODING``: if not in email.charsets
815 815 5. ``utf-8``: always last, regardless of settings
816 816
817 817 Email example::
818 818
819 819 [email]
820 820 from = Joseph User <joe.user@example.com>
821 821 method = /usr/sbin/sendmail
822 822 # charsets for western Europeans
823 823 # us-ascii, utf-8 omitted, as they are tried first and last
824 824 charsets = iso-8859-1, iso-8859-15, windows-1252
825 825
826 826
827 827 ``extensions``
828 828 --------------
829 829
830 830 Mercurial has an extension mechanism for adding new features. To
831 831 enable an extension, create an entry for it in this section.
832 832
833 833 If you know that the extension is already in Python's search path,
834 834 you can give the name of the module, followed by ``=``, with nothing
835 835 after the ``=``.
836 836
837 837 Otherwise, give a name that you choose, followed by ``=``, followed by
838 838 the path to the ``.py`` file (including the file name extension) that
839 839 defines the extension.
840 840
841 841 To explicitly disable an extension that is enabled in an hgrc of
842 842 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
843 843 or ``foo = !`` when path is not supplied.
844 844
845 845 Example for ``~/.hgrc``::
846 846
847 847 [extensions]
848 848 # (the churn extension will get loaded from Mercurial's path)
849 849 churn =
850 850 # (this extension will get loaded from the file specified)
851 851 myfeature = ~/.hgext/myfeature.py
852 852
853 853
854 854 ``format``
855 855 ----------
856 856
857 857 Configuration that controls the repository format. Newer format options are more
858 858 powerful, but incompatible with some older versions of Mercurial. Format options
859 859 are considered at repository initialization only. You need to make a new clone
860 860 for config changes to be taken into account.
861 861
862 862 For more details about repository format and version compatibility, see
863 863 https://www.mercurial-scm.org/wiki/MissingRequirement
864 864
865 865 ``usegeneraldelta``
866 866 Enable or disable the "generaldelta" repository format which improves
867 867 repository compression by allowing "revlog" to store deltas against
868 868 arbitrary revisions instead of the previously stored one. This provides
869 869 significant improvement for repositories with branches.
870 870
871 871 Repositories with this on-disk format require Mercurial version 1.9.
872 872
873 873 Enabled by default.
874 874
875 875 ``dotencode``
876 876 Enable or disable the "dotencode" repository format which enhances
877 877 the "fncache" repository format (which has to be enabled to use
878 878 dotencode) to avoid issues with filenames starting with "._" on
879 879 Mac OS X and spaces on Windows.
880 880
881 881 Repositories with this on-disk format require Mercurial version 1.7.
882 882
883 883 Enabled by default.
884 884
885 885 ``usefncache``
886 886 Enable or disable the "fncache" repository format which enhances
887 887 the "store" repository format (which has to be enabled to use
888 888 fncache) to allow longer filenames and avoids using Windows
889 889 reserved names, e.g. "nul".
890 890
891 891 Repositories with this on-disk format require Mercurial version 1.1.
892 892
893 893 Enabled by default.
894 894
895 895 ``use-persistent-nodemap``
896 896 Enable or disable the "persistent-nodemap" feature which improves
897 897 performance if the rust extensions are available.
898 898
899 899 The "persistence-nodemap" persist the "node -> rev" on disk removing the
900 900 need to dynamically build that mapping for each Mercurial invocation. This
901 901 significantly reduce the startup cost of various local and server-side
902 902 operation for larger repository.
903 903
904 904 The performance improving version of this feature is currently only
905 905 implemented in Rust, so people not using a version of Mercurial compiled
906 906 with the Rust part might actually suffer some slowdown. For this reason,
907 907 Such version will by default refuse to access such repositories. That
908 908 behavior can be controlled by configuration. Check
909 909 :hg:`help config.storage.revlog.persistent-nodemap.slowpath` for details.
910 910
911 911 Repository with this on-disk format require Mercurial version 5.4 or above.
912 912
913 913 Disabled by default.
914 914
915 915 ``use-share-safe``
916 916 Enforce "safe" behaviors for all "shares" that access this repository.
917 917
918 918 With this feature, "shares" using this repository as a source will:
919 919
920 920 * read the source repository's configuration (`<source>/.hg/hgrc`).
921 921 * read and use the source repository's "requirements"
922 922 (except the working copy specific one).
923 923
924 924 Without this feature, "shares" using this repository as a source will:
925 925
926 926 * keep tracking the repository "requirements" in the share only, ignoring
927 927 the source "requirements", possibly diverging from them.
928 928 * ignore source repository config. This can create problems, like silently
929 929 ignoring important hooks.
930 930
931 931 Beware that existing shares will not be upgraded/downgraded, and by
932 932 default, Mercurial will refuse to interact with them until the mismatch
933 933 is resolved. See :hg:`help config share.safe-mismatch.source-safe` and
934 934 :hg:`help config share.safe-mismatch.source-not-safe` for details.
935 935
936 936 Introduced in Mercurial 5.7.
937 937
938 938 Disabled by default.
939 939
940 940 ``usestore``
941 941 Enable or disable the "store" repository format which improves
942 942 compatibility with systems that fold case or otherwise mangle
943 943 filenames. Disabling this option will allow you to store longer filenames
944 944 in some situations at the expense of compatibility.
945 945
946 946 Repositories with this on-disk format require Mercurial version 0.9.4.
947 947
948 948 Enabled by default.
949 949
950 950 ``sparse-revlog``
951 951 Enable or disable the ``sparse-revlog`` delta strategy. This format improves
952 952 delta re-use inside revlog. For very branchy repositories, it results in a
953 953 smaller store. For repositories with many revisions, it also helps
954 954 performance (by using shortened delta chains.)
955 955
956 956 Repositories with this on-disk format require Mercurial version 4.7
957 957
958 958 Enabled by default.
959 959
960 960 ``revlog-compression``
961 961 Compression algorithm used by revlog. Supported values are `zlib` and
962 962 `zstd`. The `zlib` engine is the historical default of Mercurial. `zstd` is
963 963 a newer format that is usually a net win over `zlib`, operating faster at
964 964 better compression rates. Use `zstd` to reduce CPU usage. Multiple values
965 965 can be specified, the first available one will be used.
966 966
967 967 On some systems, the Mercurial installation may lack `zstd` support.
968 968
969 969 Default is `zlib`.
970 970
971 971 ``bookmarks-in-store``
972 972 Store bookmarks in .hg/store/. This means that bookmarks are shared when
973 973 using `hg share` regardless of the `-B` option.
974 974
975 975 Repositories with this on-disk format require Mercurial version 5.1.
976 976
977 977 Disabled by default.
978 978
979 979
980 980 ``graph``
981 981 ---------
982 982
983 983 Web graph view configuration. This section let you change graph
984 984 elements display properties by branches, for instance to make the
985 985 ``default`` branch stand out.
986 986
987 987 Each line has the following format::
988 988
989 989 <branch>.<argument> = <value>
990 990
991 991 where ``<branch>`` is the name of the branch being
992 992 customized. Example::
993 993
994 994 [graph]
995 995 # 2px width
996 996 default.width = 2
997 997 # red color
998 998 default.color = FF0000
999 999
1000 1000 Supported arguments:
1001 1001
1002 1002 ``width``
1003 1003 Set branch edges width in pixels.
1004 1004
1005 1005 ``color``
1006 1006 Set branch edges color in hexadecimal RGB notation.
1007 1007
1008 1008 ``hooks``
1009 1009 ---------
1010 1010
1011 1011 Commands or Python functions that get automatically executed by
1012 1012 various actions such as starting or finishing a commit. Multiple
1013 1013 hooks can be run for the same action by appending a suffix to the
1014 1014 action. Overriding a site-wide hook can be done by changing its
1015 1015 value or setting it to an empty string. Hooks can be prioritized
1016 1016 by adding a prefix of ``priority.`` to the hook name on a new line
1017 1017 and setting the priority. The default priority is 0.
1018 1018
1019 1019 Example ``.hg/hgrc``::
1020 1020
1021 1021 [hooks]
1022 1022 # update working directory after adding changesets
1023 1023 changegroup.update = hg update
1024 1024 # do not use the site-wide hook
1025 1025 incoming =
1026 1026 incoming.email = /my/email/hook
1027 1027 incoming.autobuild = /my/build/hook
1028 1028 # force autobuild hook to run before other incoming hooks
1029 1029 priority.incoming.autobuild = 1
1030 1030 ### control HGPLAIN setting when running autobuild hook
1031 1031 # HGPLAIN always set (default from Mercurial 5.7)
1032 1032 incoming.autobuild:run-with-plain = yes
1033 1033 # HGPLAIN never set
1034 1034 incoming.autobuild:run-with-plain = no
1035 # HGPLAIN inherited from environment (default before Mercurila 5.7)
1035 # HGPLAIN inherited from environment (default before Mercurial 5.7)
1036 1036 incoming.autobuild:run-with-plain = auto
1037 1037
1038 1038 Most hooks are run with environment variables set that give useful
1039 1039 additional information. For each hook below, the environment variables
1040 1040 it is passed are listed with names in the form ``$HG_foo``. The
1041 1041 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
1042 1042 They contain the type of hook which triggered the run and the full name
1043 1043 of the hook in the config, respectively. In the example above, this will
1044 1044 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
1045 1045
1046 1046 .. container:: windows
1047 1047
1048 1048 Some basic Unix syntax can be enabled for portability, including ``$VAR``
1049 1049 and ``${VAR}`` style variables. A ``~`` followed by ``\`` or ``/`` will
1050 1050 be expanded to ``%USERPROFILE%`` to simulate a subset of tilde expansion
1051 1051 on Unix. To use a literal ``$`` or ``~``, it must be escaped with a back
1052 1052 slash or inside of a strong quote. Strong quotes will be replaced by
1053 1053 double quotes after processing.
1054 1054
1055 1055 This feature is enabled by adding a prefix of ``tonative.`` to the hook
1056 1056 name on a new line, and setting it to ``True``. For example::
1057 1057
1058 1058 [hooks]
1059 1059 incoming.autobuild = /my/build/hook
1060 1060 # enable translation to cmd.exe syntax for autobuild hook
1061 1061 tonative.incoming.autobuild = True
1062 1062
1063 1063 ``changegroup``
1064 1064 Run after a changegroup has been added via push, pull or unbundle. The ID of
1065 1065 the first new changeset is in ``$HG_NODE`` and last is in ``$HG_NODE_LAST``.
1066 1066 The URL from which changes came is in ``$HG_URL``.
1067 1067
1068 1068 ``commit``
1069 1069 Run after a changeset has been created in the local repository. The ID
1070 1070 of the newly created changeset is in ``$HG_NODE``. Parent changeset
1071 1071 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1072 1072
1073 1073 ``incoming``
1074 1074 Run after a changeset has been pulled, pushed, or unbundled into
1075 1075 the local repository. The ID of the newly arrived changeset is in
1076 1076 ``$HG_NODE``. The URL that was source of the changes is in ``$HG_URL``.
1077 1077
1078 1078 ``outgoing``
1079 1079 Run after sending changes from the local repository to another. The ID of
1080 1080 first changeset sent is in ``$HG_NODE``. The source of operation is in
1081 1081 ``$HG_SOURCE``. Also see :hg:`help config.hooks.preoutgoing`.
1082 1082
1083 1083 ``post-<command>``
1084 1084 Run after successful invocations of the associated command. The
1085 1085 contents of the command line are passed as ``$HG_ARGS`` and the result
1086 1086 code in ``$HG_RESULT``. Parsed command line arguments are passed as
1087 1087 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
1088 1088 the python data internally passed to <command>. ``$HG_OPTS`` is a
1089 1089 dictionary of options (with unspecified options set to their defaults).
1090 1090 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
1091 1091
1092 1092 ``fail-<command>``
1093 1093 Run after a failed invocation of an associated command. The contents
1094 1094 of the command line are passed as ``$HG_ARGS``. Parsed command line
1095 1095 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
1096 1096 string representations of the python data internally passed to
1097 1097 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
1098 1098 options set to their defaults). ``$HG_PATS`` is a list of arguments.
1099 1099 Hook failure is ignored.
1100 1100
1101 1101 ``pre-<command>``
1102 1102 Run before executing the associated command. The contents of the
1103 1103 command line are passed as ``$HG_ARGS``. Parsed command line arguments
1104 1104 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
1105 1105 representations of the data internally passed to <command>. ``$HG_OPTS``
1106 1106 is a dictionary of options (with unspecified options set to their
1107 1107 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
1108 1108 failure, the command doesn't execute and Mercurial returns the failure
1109 1109 code.
1110 1110
1111 1111 ``prechangegroup``
1112 1112 Run before a changegroup is added via push, pull or unbundle. Exit
1113 1113 status 0 allows the changegroup to proceed. A non-zero status will
1114 1114 cause the push, pull or unbundle to fail. The URL from which changes
1115 1115 will come is in ``$HG_URL``.
1116 1116
1117 1117 ``precommit``
1118 1118 Run before starting a local commit. Exit status 0 allows the
1119 1119 commit to proceed. A non-zero status will cause the commit to fail.
1120 1120 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1121 1121
1122 1122 ``prelistkeys``
1123 1123 Run before listing pushkeys (like bookmarks) in the
1124 1124 repository. A non-zero status will cause failure. The key namespace is
1125 1125 in ``$HG_NAMESPACE``.
1126 1126
1127 1127 ``preoutgoing``
1128 1128 Run before collecting changes to send from the local repository to
1129 1129 another. A non-zero status will cause failure. This lets you prevent
1130 1130 pull over HTTP or SSH. It can also prevent propagating commits (via
1131 1131 local pull, push (outbound) or bundle commands), but not completely,
1132 1132 since you can just copy files instead. The source of operation is in
1133 1133 ``$HG_SOURCE``. If "serve", the operation is happening on behalf of a remote
1134 1134 SSH or HTTP repository. If "push", "pull" or "bundle", the operation
1135 1135 is happening on behalf of a repository on same system.
1136 1136
1137 1137 ``prepushkey``
1138 1138 Run before a pushkey (like a bookmark) is added to the
1139 1139 repository. A non-zero status will cause the key to be rejected. The
1140 1140 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
1141 1141 the old value (if any) is in ``$HG_OLD``, and the new value is in
1142 1142 ``$HG_NEW``.
1143 1143
1144 1144 ``pretag``
1145 1145 Run before creating a tag. Exit status 0 allows the tag to be
1146 1146 created. A non-zero status will cause the tag to fail. The ID of the
1147 1147 changeset to tag is in ``$HG_NODE``. The name of tag is in ``$HG_TAG``. The
1148 1148 tag is local if ``$HG_LOCAL=1``, or in the repository if ``$HG_LOCAL=0``.
1149 1149
1150 1150 ``pretxnopen``
1151 1151 Run before any new repository transaction is open. The reason for the
1152 1152 transaction will be in ``$HG_TXNNAME``, and a unique identifier for the
1153 1153 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
1154 1154 transaction from being opened.
1155 1155
1156 1156 ``pretxnclose``
1157 1157 Run right before the transaction is actually finalized. Any repository change
1158 1158 will be visible to the hook program. This lets you validate the transaction
1159 1159 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1160 1160 status will cause the transaction to be rolled back. The reason for the
1161 1161 transaction opening will be in ``$HG_TXNNAME``, and a unique identifier for
1162 1162 the transaction will be in ``HG_TXNID``. The rest of the available data will
1163 1163 vary according the transaction type. New changesets will add ``$HG_NODE``
1164 1164 (the ID of the first added changeset), ``$HG_NODE_LAST`` (the ID of the last
1165 1165 added changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables. Bookmark and
1166 1166 phase changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``
1167 1167 respectively, etc.
1168 1168
1169 1169 ``pretxnclose-bookmark``
1170 1170 Run right before a bookmark change is actually finalized. Any repository
1171 1171 change will be visible to the hook program. This lets you validate the
1172 1172 transaction content or change it. Exit status 0 allows the commit to
1173 1173 proceed. A non-zero status will cause the transaction to be rolled back.
1174 1174 The name of the bookmark will be available in ``$HG_BOOKMARK``, the new
1175 1175 bookmark location will be available in ``$HG_NODE`` while the previous
1176 1176 location will be available in ``$HG_OLDNODE``. In case of a bookmark
1177 1177 creation ``$HG_OLDNODE`` will be empty. In case of deletion ``$HG_NODE``
1178 1178 will be empty.
1179 1179 In addition, the reason for the transaction opening will be in
1180 1180 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1181 1181 ``HG_TXNID``.
1182 1182
1183 1183 ``pretxnclose-phase``
1184 1184 Run right before a phase change is actually finalized. Any repository change
1185 1185 will be visible to the hook program. This lets you validate the transaction
1186 1186 content or change it. Exit status 0 allows the commit to proceed. A non-zero
1187 1187 status will cause the transaction to be rolled back. The hook is called
1188 1188 multiple times, once for each revision affected by a phase change.
1189 1189 The affected node is available in ``$HG_NODE``, the phase in ``$HG_PHASE``
1190 1190 while the previous ``$HG_OLDPHASE``. In case of new node, ``$HG_OLDPHASE``
1191 1191 will be empty. In addition, the reason for the transaction opening will be in
1192 1192 ``$HG_TXNNAME``, and a unique identifier for the transaction will be in
1193 1193 ``HG_TXNID``. The hook is also run for newly added revisions. In this case
1194 1194 the ``$HG_OLDPHASE`` entry will be empty.
1195 1195
1196 1196 ``txnclose``
1197 1197 Run after any repository transaction has been committed. At this
1198 1198 point, the transaction can no longer be rolled back. The hook will run
1199 1199 after the lock is released. See :hg:`help config.hooks.pretxnclose` for
1200 1200 details about available variables.
1201 1201
1202 1202 ``txnclose-bookmark``
1203 1203 Run after any bookmark change has been committed. At this point, the
1204 1204 transaction can no longer be rolled back. The hook will run after the lock
1205 1205 is released. See :hg:`help config.hooks.pretxnclose-bookmark` for details
1206 1206 about available variables.
1207 1207
1208 1208 ``txnclose-phase``
1209 1209 Run after any phase change has been committed. At this point, the
1210 1210 transaction can no longer be rolled back. The hook will run after the lock
1211 1211 is released. See :hg:`help config.hooks.pretxnclose-phase` for details about
1212 1212 available variables.
1213 1213
1214 1214 ``txnabort``
1215 1215 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
1216 1216 for details about available variables.
1217 1217
1218 1218 ``pretxnchangegroup``
1219 1219 Run after a changegroup has been added via push, pull or unbundle, but before
1220 1220 the transaction has been committed. The changegroup is visible to the hook
1221 1221 program. This allows validation of incoming changes before accepting them.
1222 1222 The ID of the first new changeset is in ``$HG_NODE`` and last is in
1223 1223 ``$HG_NODE_LAST``. Exit status 0 allows the transaction to commit. A non-zero
1224 1224 status will cause the transaction to be rolled back, and the push, pull or
1225 1225 unbundle will fail. The URL that was the source of changes is in ``$HG_URL``.
1226 1226
1227 1227 ``pretxncommit``
1228 1228 Run after a changeset has been created, but before the transaction is
1229 1229 committed. The changeset is visible to the hook program. This allows
1230 1230 validation of the commit message and changes. Exit status 0 allows the
1231 1231 commit to proceed. A non-zero status will cause the transaction to
1232 1232 be rolled back. The ID of the new changeset is in ``$HG_NODE``. The parent
1233 1233 changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1234 1234
1235 1235 ``preupdate``
1236 1236 Run before updating the working directory. Exit status 0 allows
1237 1237 the update to proceed. A non-zero status will prevent the update.
1238 1238 The changeset ID of first new parent is in ``$HG_PARENT1``. If updating to a
1239 1239 merge, the ID of second new parent is in ``$HG_PARENT2``.
1240 1240
1241 1241 ``listkeys``
1242 1242 Run after listing pushkeys (like bookmarks) in the repository. The
1243 1243 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1244 1244 dictionary containing the keys and values.
1245 1245
1246 1246 ``pushkey``
1247 1247 Run after a pushkey (like a bookmark) is added to the
1248 1248 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1249 1249 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1250 1250 value is in ``$HG_NEW``.
1251 1251
1252 1252 ``tag``
1253 1253 Run after a tag is created. The ID of the tagged changeset is in ``$HG_NODE``.
1254 1254 The name of tag is in ``$HG_TAG``. The tag is local if ``$HG_LOCAL=1``, or in
1255 1255 the repository if ``$HG_LOCAL=0``.
1256 1256
1257 1257 ``update``
1258 1258 Run after updating the working directory. The changeset ID of first
1259 1259 new parent is in ``$HG_PARENT1``. If updating to a merge, the ID of second new
1260 1260 parent is in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1261 1261 update failed (e.g. because conflicts were not resolved), ``$HG_ERROR=1``.
1262 1262
1263 1263 .. note::
1264 1264
1265 1265 It is generally better to use standard hooks rather than the
1266 1266 generic pre- and post- command hooks, as they are guaranteed to be
1267 1267 called in the appropriate contexts for influencing transactions.
1268 1268 Also, hooks like "commit" will be called in all contexts that
1269 1269 generate a commit (e.g. tag) and not just the commit command.
1270 1270
1271 1271 .. note::
1272 1272
1273 1273 Environment variables with empty values may not be passed to
1274 1274 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1275 1275 will have an empty value under Unix-like platforms for non-merge
1276 1276 changesets, while it will not be available at all under Windows.
1277 1277
1278 1278 The syntax for Python hooks is as follows::
1279 1279
1280 1280 hookname = python:modulename.submodule.callable
1281 1281 hookname = python:/path/to/python/module.py:callable
1282 1282
1283 1283 Python hooks are run within the Mercurial process. Each hook is
1284 1284 called with at least three keyword arguments: a ui object (keyword
1285 1285 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1286 1286 keyword that tells what kind of hook is used. Arguments listed as
1287 1287 environment variables above are passed as keyword arguments, with no
1288 1288 ``HG_`` prefix, and names in lower case.
1289 1289
1290 1290 If a Python hook returns a "true" value or raises an exception, this
1291 1291 is treated as a failure.
1292 1292
1293 1293
1294 1294 ``hostfingerprints``
1295 1295 --------------------
1296 1296
1297 1297 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1298 1298
1299 1299 Fingerprints of the certificates of known HTTPS servers.
1300 1300
1301 1301 A HTTPS connection to a server with a fingerprint configured here will
1302 1302 only succeed if the servers certificate matches the fingerprint.
1303 1303 This is very similar to how ssh known hosts works.
1304 1304
1305 1305 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1306 1306 Multiple values can be specified (separated by spaces or commas). This can
1307 1307 be used to define both old and new fingerprints while a host transitions
1308 1308 to a new certificate.
1309 1309
1310 1310 The CA chain and web.cacerts is not used for servers with a fingerprint.
1311 1311
1312 1312 For example::
1313 1313
1314 1314 [hostfingerprints]
1315 1315 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1316 1316 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1317 1317
1318 1318 ``hostsecurity``
1319 1319 ----------------
1320 1320
1321 1321 Used to specify global and per-host security settings for connecting to
1322 1322 other machines.
1323 1323
1324 1324 The following options control default behavior for all hosts.
1325 1325
1326 1326 ``ciphers``
1327 1327 Defines the cryptographic ciphers to use for connections.
1328 1328
1329 1329 Value must be a valid OpenSSL Cipher List Format as documented at
1330 1330 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1331 1331
1332 1332 This setting is for advanced users only. Setting to incorrect values
1333 1333 can significantly lower connection security or decrease performance.
1334 1334 You have been warned.
1335 1335
1336 1336 This option requires Python 2.7.
1337 1337
1338 1338 ``minimumprotocol``
1339 1339 Defines the minimum channel encryption protocol to use.
1340 1340
1341 1341 By default, the highest version of TLS supported by both client and server
1342 1342 is used.
1343 1343
1344 1344 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1345 1345
1346 1346 When running on an old Python version, only ``tls1.0`` is allowed since
1347 1347 old versions of Python only support up to TLS 1.0.
1348 1348
1349 1349 When running a Python that supports modern TLS versions, the default is
1350 1350 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1351 1351 weakens security and should only be used as a feature of last resort if
1352 1352 a server does not support TLS 1.1+.
1353 1353
1354 1354 Options in the ``[hostsecurity]`` section can have the form
1355 1355 ``hostname``:``setting``. This allows multiple settings to be defined on a
1356 1356 per-host basis.
1357 1357
1358 1358 The following per-host settings can be defined.
1359 1359
1360 1360 ``ciphers``
1361 1361 This behaves like ``ciphers`` as described above except it only applies
1362 1362 to the host on which it is defined.
1363 1363
1364 1364 ``fingerprints``
1365 1365 A list of hashes of the DER encoded peer/remote certificate. Values have
1366 1366 the form ``algorithm``:``fingerprint``. e.g.
1367 1367 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1368 1368 In addition, colons (``:``) can appear in the fingerprint part.
1369 1369
1370 1370 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1371 1371 ``sha512``.
1372 1372
1373 1373 Use of ``sha256`` or ``sha512`` is preferred.
1374 1374
1375 1375 If a fingerprint is specified, the CA chain is not validated for this
1376 1376 host and Mercurial will require the remote certificate to match one
1377 1377 of the fingerprints specified. This means if the server updates its
1378 1378 certificate, Mercurial will abort until a new fingerprint is defined.
1379 1379 This can provide stronger security than traditional CA-based validation
1380 1380 at the expense of convenience.
1381 1381
1382 1382 This option takes precedence over ``verifycertsfile``.
1383 1383
1384 1384 ``minimumprotocol``
1385 1385 This behaves like ``minimumprotocol`` as described above except it
1386 1386 only applies to the host on which it is defined.
1387 1387
1388 1388 ``verifycertsfile``
1389 1389 Path to file a containing a list of PEM encoded certificates used to
1390 1390 verify the server certificate. Environment variables and ``~user``
1391 1391 constructs are expanded in the filename.
1392 1392
1393 1393 The server certificate or the certificate's certificate authority (CA)
1394 1394 must match a certificate from this file or certificate verification
1395 1395 will fail and connections to the server will be refused.
1396 1396
1397 1397 If defined, only certificates provided by this file will be used:
1398 1398 ``web.cacerts`` and any system/default certificates will not be
1399 1399 used.
1400 1400
1401 1401 This option has no effect if the per-host ``fingerprints`` option
1402 1402 is set.
1403 1403
1404 1404 The format of the file is as follows::
1405 1405
1406 1406 -----BEGIN CERTIFICATE-----
1407 1407 ... (certificate in base64 PEM encoding) ...
1408 1408 -----END CERTIFICATE-----
1409 1409 -----BEGIN CERTIFICATE-----
1410 1410 ... (certificate in base64 PEM encoding) ...
1411 1411 -----END CERTIFICATE-----
1412 1412
1413 1413 For example::
1414 1414
1415 1415 [hostsecurity]
1416 1416 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1417 1417 hg2.example.com:fingerprints = sha1:914f1aff87249c09b6859b88b1906d30756491ca, sha1:fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1418 1418 hg3.example.com:fingerprints = sha256:9a:b0:dc:e2:75:ad:8a:b7:84:58:e5:1f:07:32:f1:87:e6:bd:24:22:af:b7:ce:8e:9c:b4:10:cf:b9:f4:0e:d2
1419 1419 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1420 1420
1421 1421 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1422 1422 when connecting to ``hg.example.com``::
1423 1423
1424 1424 [hostsecurity]
1425 1425 minimumprotocol = tls1.2
1426 1426 hg.example.com:minimumprotocol = tls1.1
1427 1427
1428 1428 ``http_proxy``
1429 1429 --------------
1430 1430
1431 1431 Used to access web-based Mercurial repositories through a HTTP
1432 1432 proxy.
1433 1433
1434 1434 ``host``
1435 1435 Host name and (optional) port of the proxy server, for example
1436 1436 "myproxy:8000".
1437 1437
1438 1438 ``no``
1439 1439 Optional. Comma-separated list of host names that should bypass
1440 1440 the proxy.
1441 1441
1442 1442 ``passwd``
1443 1443 Optional. Password to authenticate with at the proxy server.
1444 1444
1445 1445 ``user``
1446 1446 Optional. User name to authenticate with at the proxy server.
1447 1447
1448 1448 ``always``
1449 1449 Optional. Always use the proxy, even for localhost and any entries
1450 1450 in ``http_proxy.no``. (default: False)
1451 1451
1452 1452 ``http``
1453 1453 ----------
1454 1454
1455 1455 Used to configure access to Mercurial repositories via HTTP.
1456 1456
1457 1457 ``timeout``
1458 1458 If set, blocking operations will timeout after that many seconds.
1459 1459 (default: None)
1460 1460
1461 1461 ``merge``
1462 1462 ---------
1463 1463
1464 1464 This section specifies behavior during merges and updates.
1465 1465
1466 1466 ``checkignored``
1467 1467 Controls behavior when an ignored file on disk has the same name as a tracked
1468 1468 file in the changeset being merged or updated to, and has different
1469 1469 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1470 1470 abort on such files. With ``warn``, warn on such files and back them up as
1471 1471 ``.orig``. With ``ignore``, don't print a warning and back them up as
1472 1472 ``.orig``. (default: ``abort``)
1473 1473
1474 1474 ``checkunknown``
1475 1475 Controls behavior when an unknown file that isn't ignored has the same name
1476 1476 as a tracked file in the changeset being merged or updated to, and has
1477 1477 different contents. Similar to ``merge.checkignored``, except for files that
1478 1478 are not ignored. (default: ``abort``)
1479 1479
1480 1480 ``on-failure``
1481 1481 When set to ``continue`` (the default), the merge process attempts to
1482 1482 merge all unresolved files using the merge chosen tool, regardless of
1483 1483 whether previous file merge attempts during the process succeeded or not.
1484 1484 Setting this to ``prompt`` will prompt after any merge failure continue
1485 1485 or halt the merge process. Setting this to ``halt`` will automatically
1486 1486 halt the merge process on any merge tool failure. The merge process
1487 1487 can be restarted by using the ``resolve`` command. When a merge is
1488 1488 halted, the repository is left in a normal ``unresolved`` merge state.
1489 1489 (default: ``continue``)
1490 1490
1491 1491 ``strict-capability-check``
1492 1492 Whether capabilities of internal merge tools are checked strictly
1493 1493 or not, while examining rules to decide merge tool to be used.
1494 1494 (default: False)
1495 1495
1496 1496 ``merge-patterns``
1497 1497 ------------------
1498 1498
1499 1499 This section specifies merge tools to associate with particular file
1500 1500 patterns. Tools matched here will take precedence over the default
1501 1501 merge tool. Patterns are globs by default, rooted at the repository
1502 1502 root.
1503 1503
1504 1504 Example::
1505 1505
1506 1506 [merge-patterns]
1507 1507 **.c = kdiff3
1508 1508 **.jpg = myimgmerge
1509 1509
1510 1510 ``merge-tools``
1511 1511 ---------------
1512 1512
1513 1513 This section configures external merge tools to use for file-level
1514 1514 merges. This section has likely been preconfigured at install time.
1515 1515 Use :hg:`config merge-tools` to check the existing configuration.
1516 1516 Also see :hg:`help merge-tools` for more details.
1517 1517
1518 1518 Example ``~/.hgrc``::
1519 1519
1520 1520 [merge-tools]
1521 1521 # Override stock tool location
1522 1522 kdiff3.executable = ~/bin/kdiff3
1523 1523 # Specify command line
1524 1524 kdiff3.args = $base $local $other -o $output
1525 1525 # Give higher priority
1526 1526 kdiff3.priority = 1
1527 1527
1528 1528 # Changing the priority of preconfigured tool
1529 1529 meld.priority = 0
1530 1530
1531 1531 # Disable a preconfigured tool
1532 1532 vimdiff.disabled = yes
1533 1533
1534 1534 # Define new tool
1535 1535 myHtmlTool.args = -m $local $other $base $output
1536 1536 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1537 1537 myHtmlTool.priority = 1
1538 1538
1539 1539 Supported arguments:
1540 1540
1541 1541 ``priority``
1542 1542 The priority in which to evaluate this tool.
1543 1543 (default: 0)
1544 1544
1545 1545 ``executable``
1546 1546 Either just the name of the executable or its pathname.
1547 1547
1548 1548 .. container:: windows
1549 1549
1550 1550 On Windows, the path can use environment variables with ${ProgramFiles}
1551 1551 syntax.
1552 1552
1553 1553 (default: the tool name)
1554 1554
1555 1555 ``args``
1556 1556 The arguments to pass to the tool executable. You can refer to the
1557 1557 files being merged as well as the output file through these
1558 1558 variables: ``$base``, ``$local``, ``$other``, ``$output``.
1559 1559
1560 1560 The meaning of ``$local`` and ``$other`` can vary depending on which action is
1561 1561 being performed. During an update or merge, ``$local`` represents the original
1562 1562 state of the file, while ``$other`` represents the commit you are updating to or
1563 1563 the commit you are merging with. During a rebase, ``$local`` represents the
1564 1564 destination of the rebase, and ``$other`` represents the commit being rebased.
1565 1565
1566 1566 Some operations define custom labels to assist with identifying the revisions,
1567 1567 accessible via ``$labellocal``, ``$labelother``, and ``$labelbase``. If custom
1568 1568 labels are not available, these will be ``local``, ``other``, and ``base``,
1569 1569 respectively.
1570 1570 (default: ``$local $base $other``)
1571 1571
1572 1572 ``premerge``
1573 1573 Attempt to run internal non-interactive 3-way merge tool before
1574 1574 launching external tool. Options are ``true``, ``false``, ``keep``,
1575 1575 ``keep-merge3``, or ``keep-mergediff`` (experimental). The ``keep`` option
1576 1576 will leave markers in the file if the premerge fails. The ``keep-merge3``
1577 1577 will do the same but include information about the base of the merge in the
1578 1578 marker (see internal :merge3 in :hg:`help merge-tools`). The
1579 1579 ``keep-mergediff`` option is similar but uses a different marker style
1580 1580 (see internal :merge3 in :hg:`help merge-tools`). (default: True)
1581 1581
1582 1582 ``binary``
1583 1583 This tool can merge binary files. (default: False, unless tool
1584 1584 was selected by file pattern match)
1585 1585
1586 1586 ``symlink``
1587 1587 This tool can merge symlinks. (default: False)
1588 1588
1589 1589 ``check``
1590 1590 A list of merge success-checking options:
1591 1591
1592 1592 ``changed``
1593 1593 Ask whether merge was successful when the merged file shows no changes.
1594 1594 ``conflicts``
1595 1595 Check whether there are conflicts even though the tool reported success.
1596 1596 ``prompt``
1597 1597 Always prompt for merge success, regardless of success reported by tool.
1598 1598
1599 1599 ``fixeol``
1600 1600 Attempt to fix up EOL changes caused by the merge tool.
1601 1601 (default: False)
1602 1602
1603 1603 ``gui``
1604 1604 This tool requires a graphical interface to run. (default: False)
1605 1605
1606 1606 ``mergemarkers``
1607 1607 Controls whether the labels passed via ``$labellocal``, ``$labelother``, and
1608 1608 ``$labelbase`` are ``detailed`` (respecting ``mergemarkertemplate``) or
1609 1609 ``basic``. If ``premerge`` is ``keep`` or ``keep-merge3``, the conflict
1610 1610 markers generated during premerge will be ``detailed`` if either this option or
1611 1611 the corresponding option in the ``[ui]`` section is ``detailed``.
1612 1612 (default: ``basic``)
1613 1613
1614 1614 ``mergemarkertemplate``
1615 1615 This setting can be used to override ``mergemarker`` from the
1616 1616 ``[command-templates]`` section on a per-tool basis; this applies to the
1617 1617 ``$label``-prefixed variables and to the conflict markers that are generated
1618 1618 if ``premerge`` is ``keep` or ``keep-merge3``. See the corresponding variable
1619 1619 in ``[ui]`` for more information.
1620 1620
1621 1621 .. container:: windows
1622 1622
1623 1623 ``regkey``
1624 1624 Windows registry key which describes install location of this
1625 1625 tool. Mercurial will search for this key first under
1626 1626 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1627 1627 (default: None)
1628 1628
1629 1629 ``regkeyalt``
1630 1630 An alternate Windows registry key to try if the first key is not
1631 1631 found. The alternate key uses the same ``regname`` and ``regappend``
1632 1632 semantics of the primary key. The most common use for this key
1633 1633 is to search for 32bit applications on 64bit operating systems.
1634 1634 (default: None)
1635 1635
1636 1636 ``regname``
1637 1637 Name of value to read from specified registry key.
1638 1638 (default: the unnamed (default) value)
1639 1639
1640 1640 ``regappend``
1641 1641 String to append to the value read from the registry, typically
1642 1642 the executable name of the tool.
1643 1643 (default: None)
1644 1644
1645 1645 ``pager``
1646 1646 ---------
1647 1647
1648 1648 Setting used to control when to paginate and with what external tool. See
1649 1649 :hg:`help pager` for details.
1650 1650
1651 1651 ``pager``
1652 1652 Define the external tool used as pager.
1653 1653
1654 1654 If no pager is set, Mercurial uses the environment variable $PAGER.
1655 1655 If neither pager.pager, nor $PAGER is set, a default pager will be
1656 1656 used, typically `less` on Unix and `more` on Windows. Example::
1657 1657
1658 1658 [pager]
1659 1659 pager = less -FRX
1660 1660
1661 1661 ``ignore``
1662 1662 List of commands to disable the pager for. Example::
1663 1663
1664 1664 [pager]
1665 1665 ignore = version, help, update
1666 1666
1667 1667 ``patch``
1668 1668 ---------
1669 1669
1670 1670 Settings used when applying patches, for instance through the 'import'
1671 1671 command or with Mercurial Queues extension.
1672 1672
1673 1673 ``eol``
1674 1674 When set to 'strict' patch content and patched files end of lines
1675 1675 are preserved. When set to ``lf`` or ``crlf``, both files end of
1676 1676 lines are ignored when patching and the result line endings are
1677 1677 normalized to either LF (Unix) or CRLF (Windows). When set to
1678 1678 ``auto``, end of lines are again ignored while patching but line
1679 1679 endings in patched files are normalized to their original setting
1680 1680 on a per-file basis. If target file does not exist or has no end
1681 1681 of line, patch line endings are preserved.
1682 1682 (default: strict)
1683 1683
1684 1684 ``fuzz``
1685 1685 The number of lines of 'fuzz' to allow when applying patches. This
1686 1686 controls how much context the patcher is allowed to ignore when
1687 1687 trying to apply a patch.
1688 1688 (default: 2)
1689 1689
1690 1690 ``paths``
1691 1691 ---------
1692 1692
1693 1693 Assigns symbolic names and behavior to repositories.
1694 1694
1695 1695 Options are symbolic names defining the URL or directory that is the
1696 1696 location of the repository. Example::
1697 1697
1698 1698 [paths]
1699 1699 my_server = https://example.com/my_repo
1700 1700 local_path = /home/me/repo
1701 1701
1702 1702 These symbolic names can be used from the command line. To pull
1703 1703 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1704 1704 :hg:`push local_path`.
1705 1705
1706 1706 Options containing colons (``:``) denote sub-options that can influence
1707 1707 behavior for that specific path. Example::
1708 1708
1709 1709 [paths]
1710 1710 my_server = https://example.com/my_path
1711 1711 my_server:pushurl = ssh://example.com/my_path
1712 1712
1713 1713 The following sub-options can be defined:
1714 1714
1715 1715 ``pushurl``
1716 1716 The URL to use for push operations. If not defined, the location
1717 1717 defined by the path's main entry is used.
1718 1718
1719 1719 ``pushrev``
1720 1720 A revset defining which revisions to push by default.
1721 1721
1722 1722 When :hg:`push` is executed without a ``-r`` argument, the revset
1723 1723 defined by this sub-option is evaluated to determine what to push.
1724 1724
1725 1725 For example, a value of ``.`` will push the working directory's
1726 1726 revision by default.
1727 1727
1728 1728 Revsets specifying bookmarks will not result in the bookmark being
1729 1729 pushed.
1730 1730
1731 1731 The following special named paths exist:
1732 1732
1733 1733 ``default``
1734 1734 The URL or directory to use when no source or remote is specified.
1735 1735
1736 1736 :hg:`clone` will automatically define this path to the location the
1737 1737 repository was cloned from.
1738 1738
1739 1739 ``default-push``
1740 1740 (deprecated) The URL or directory for the default :hg:`push` location.
1741 1741 ``default:pushurl`` should be used instead.
1742 1742
1743 1743 ``phases``
1744 1744 ----------
1745 1745
1746 1746 Specifies default handling of phases. See :hg:`help phases` for more
1747 1747 information about working with phases.
1748 1748
1749 1749 ``publish``
1750 1750 Controls draft phase behavior when working as a server. When true,
1751 1751 pushed changesets are set to public in both client and server and
1752 1752 pulled or cloned changesets are set to public in the client.
1753 1753 (default: True)
1754 1754
1755 1755 ``new-commit``
1756 1756 Phase of newly-created commits.
1757 1757 (default: draft)
1758 1758
1759 1759 ``checksubrepos``
1760 1760 Check the phase of the current revision of each subrepository. Allowed
1761 1761 values are "ignore", "follow" and "abort". For settings other than
1762 1762 "ignore", the phase of the current revision of each subrepository is
1763 1763 checked before committing the parent repository. If any of those phases is
1764 1764 greater than the phase of the parent repository (e.g. if a subrepo is in a
1765 1765 "secret" phase while the parent repo is in "draft" phase), the commit is
1766 1766 either aborted (if checksubrepos is set to "abort") or the higher phase is
1767 1767 used for the parent repository commit (if set to "follow").
1768 1768 (default: follow)
1769 1769
1770 1770
1771 1771 ``profiling``
1772 1772 -------------
1773 1773
1774 1774 Specifies profiling type, format, and file output. Two profilers are
1775 1775 supported: an instrumenting profiler (named ``ls``), and a sampling
1776 1776 profiler (named ``stat``).
1777 1777
1778 1778 In this section description, 'profiling data' stands for the raw data
1779 1779 collected during profiling, while 'profiling report' stands for a
1780 1780 statistical text report generated from the profiling data.
1781 1781
1782 1782 ``enabled``
1783 1783 Enable the profiler.
1784 1784 (default: false)
1785 1785
1786 1786 This is equivalent to passing ``--profile`` on the command line.
1787 1787
1788 1788 ``type``
1789 1789 The type of profiler to use.
1790 1790 (default: stat)
1791 1791
1792 1792 ``ls``
1793 1793 Use Python's built-in instrumenting profiler. This profiler
1794 1794 works on all platforms, but each line number it reports is the
1795 1795 first line of a function. This restriction makes it difficult to
1796 1796 identify the expensive parts of a non-trivial function.
1797 1797 ``stat``
1798 1798 Use a statistical profiler, statprof. This profiler is most
1799 1799 useful for profiling commands that run for longer than about 0.1
1800 1800 seconds.
1801 1801
1802 1802 ``format``
1803 1803 Profiling format. Specific to the ``ls`` instrumenting profiler.
1804 1804 (default: text)
1805 1805
1806 1806 ``text``
1807 1807 Generate a profiling report. When saving to a file, it should be
1808 1808 noted that only the report is saved, and the profiling data is
1809 1809 not kept.
1810 1810 ``kcachegrind``
1811 1811 Format profiling data for kcachegrind use: when saving to a
1812 1812 file, the generated file can directly be loaded into
1813 1813 kcachegrind.
1814 1814
1815 1815 ``statformat``
1816 1816 Profiling format for the ``stat`` profiler.
1817 1817 (default: hotpath)
1818 1818
1819 1819 ``hotpath``
1820 1820 Show a tree-based display containing the hot path of execution (where
1821 1821 most time was spent).
1822 1822 ``bymethod``
1823 1823 Show a table of methods ordered by how frequently they are active.
1824 1824 ``byline``
1825 1825 Show a table of lines in files ordered by how frequently they are active.
1826 1826 ``json``
1827 1827 Render profiling data as JSON.
1828 1828
1829 1829 ``frequency``
1830 1830 Sampling frequency. Specific to the ``stat`` sampling profiler.
1831 1831 (default: 1000)
1832 1832
1833 1833 ``output``
1834 1834 File path where profiling data or report should be saved. If the
1835 1835 file exists, it is replaced. (default: None, data is printed on
1836 1836 stderr)
1837 1837
1838 1838 ``sort``
1839 1839 Sort field. Specific to the ``ls`` instrumenting profiler.
1840 1840 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1841 1841 ``inlinetime``.
1842 1842 (default: inlinetime)
1843 1843
1844 1844 ``time-track``
1845 1845 Control if the stat profiler track ``cpu`` or ``real`` time.
1846 1846 (default: ``cpu`` on Windows, otherwise ``real``)
1847 1847
1848 1848 ``limit``
1849 1849 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1850 1850 (default: 30)
1851 1851
1852 1852 ``nested``
1853 1853 Show at most this number of lines of drill-down info after each main entry.
1854 1854 This can help explain the difference between Total and Inline.
1855 1855 Specific to the ``ls`` instrumenting profiler.
1856 1856 (default: 0)
1857 1857
1858 1858 ``showmin``
1859 1859 Minimum fraction of samples an entry must have for it to be displayed.
1860 1860 Can be specified as a float between ``0.0`` and ``1.0`` or can have a
1861 1861 ``%`` afterwards to allow values up to ``100``. e.g. ``5%``.
1862 1862
1863 1863 Only used by the ``stat`` profiler.
1864 1864
1865 1865 For the ``hotpath`` format, default is ``0.05``.
1866 1866 For the ``chrome`` format, default is ``0.005``.
1867 1867
1868 1868 The option is unused on other formats.
1869 1869
1870 1870 ``showmax``
1871 1871 Maximum fraction of samples an entry can have before it is ignored in
1872 1872 display. Values format is the same as ``showmin``.
1873 1873
1874 1874 Only used by the ``stat`` profiler.
1875 1875
1876 1876 For the ``chrome`` format, default is ``0.999``.
1877 1877
1878 1878 The option is unused on other formats.
1879 1879
1880 1880 ``showtime``
1881 1881 Show time taken as absolute durations, in addition to percentages.
1882 1882 Only used by the ``hotpath`` format.
1883 1883 (default: true)
1884 1884
1885 1885 ``progress``
1886 1886 ------------
1887 1887
1888 1888 Mercurial commands can draw progress bars that are as informative as
1889 1889 possible. Some progress bars only offer indeterminate information, while others
1890 1890 have a definite end point.
1891 1891
1892 1892 ``debug``
1893 1893 Whether to print debug info when updating the progress bar. (default: False)
1894 1894
1895 1895 ``delay``
1896 1896 Number of seconds (float) before showing the progress bar. (default: 3)
1897 1897
1898 1898 ``changedelay``
1899 1899 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1900 1900 that value will be used instead. (default: 1)
1901 1901
1902 1902 ``estimateinterval``
1903 1903 Maximum sampling interval in seconds for speed and estimated time
1904 1904 calculation. (default: 60)
1905 1905
1906 1906 ``refresh``
1907 1907 Time in seconds between refreshes of the progress bar. (default: 0.1)
1908 1908
1909 1909 ``format``
1910 1910 Format of the progress bar.
1911 1911
1912 1912 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1913 1913 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1914 1914 last 20 characters of the item, but this can be changed by adding either
1915 1915 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1916 1916 first num characters.
1917 1917
1918 1918 (default: topic bar number estimate)
1919 1919
1920 1920 ``width``
1921 1921 If set, the maximum width of the progress information (that is, min(width,
1922 1922 term width) will be used).
1923 1923
1924 1924 ``clear-complete``
1925 1925 Clear the progress bar after it's done. (default: True)
1926 1926
1927 1927 ``disable``
1928 1928 If true, don't show a progress bar.
1929 1929
1930 1930 ``assume-tty``
1931 1931 If true, ALWAYS show a progress bar, unless disable is given.
1932 1932
1933 1933 ``rebase``
1934 1934 ----------
1935 1935
1936 1936 ``evolution.allowdivergence``
1937 1937 Default to False, when True allow creating divergence when performing
1938 1938 rebase of obsolete changesets.
1939 1939
1940 1940 ``revsetalias``
1941 1941 ---------------
1942 1942
1943 1943 Alias definitions for revsets. See :hg:`help revsets` for details.
1944 1944
1945 1945 ``rewrite``
1946 1946 -----------
1947 1947
1948 1948 ``backup-bundle``
1949 1949 Whether to save stripped changesets to a bundle file. (default: True)
1950 1950
1951 1951 ``update-timestamp``
1952 1952 If true, updates the date and time of the changeset to current. It is only
1953 1953 applicable for `hg amend`, `hg commit --amend` and `hg uncommit` in the
1954 1954 current version.
1955 1955
1956 1956 ``empty-successor``
1957 1957
1958 1958 Control what happens with empty successors that are the result of rewrite
1959 1959 operations. If set to ``skip``, the successor is not created. If set to
1960 1960 ``keep``, the empty successor is created and kept.
1961 1961
1962 1962 Currently, only the rebase and absorb commands consider this configuration.
1963 1963 (EXPERIMENTAL)
1964 1964
1965 1965 ``share``
1966 1966 ---------
1967 1967
1968 1968 ``safe-mismatch.source-safe``
1969 1969
1970 1970 Controls what happens when the shared repository does not use the
1971 1971 share-safe mechanism but its source repository does.
1972 1972
1973 1973 Possible values are `abort` (default), `allow`, `upgrade-abort` and
1974 1974 `upgrade-abort`.
1975 1975
1976 1976 ``abort``
1977 1977 Disallows running any command and aborts
1978 1978 ``allow``
1979 1979 Respects the feature presence in the share source
1980 1980 ``upgrade-abort``
1981 1981 tries to upgrade the share to use share-safe; if it fails, aborts
1982 1982 ``upgrade-allow``
1983 1983 tries to upgrade the share; if it fails, continue by
1984 1984 respecting the share source setting
1985 1985
1986 1986 Check :hg:`help config format.use-share-safe` for details about the
1987 1987 share-safe feature.
1988 1988
1989 1989 ``safe-mismatch.source-safe.warn``
1990 1990 Shows a warning on operations if the shared repository does not use
1991 1991 share-safe, but the source repository does.
1992 1992 (default: True)
1993 1993
1994 1994 ``safe-mismatch.source-not-safe``
1995 1995
1996 1996 Controls what happens when the shared repository uses the share-safe
1997 1997 mechanism but its source does not.
1998 1998
1999 1999 Possible values are `abort` (default), `allow`, `downgrade-abort` and
2000 2000 `downgrade-abort`.
2001 2001
2002 2002 ``abort``
2003 2003 Disallows running any command and aborts
2004 2004 ``allow``
2005 2005 Respects the feature presence in the share source
2006 2006 ``downgrade-abort``
2007 2007 tries to downgrade the share to not use share-safe; if it fails, aborts
2008 2008 ``downgrade-allow``
2009 2009 tries to downgrade the share to not use share-safe;
2010 2010 if it fails, continue by respecting the shared source setting
2011 2011
2012 2012 Check :hg:`help config format.use-share-safe` for details about the
2013 2013 share-safe feature.
2014 2014
2015 2015 ``safe-mismatch.source-not-safe.warn``
2016 2016 Shows a warning on operations if the shared repository uses share-safe,
2017 2017 but the source repository does not.
2018 2018 (default: True)
2019 2019
2020 2020 ``storage``
2021 2021 -----------
2022 2022
2023 2023 Control the strategy Mercurial uses internally to store history. Options in this
2024 2024 category impact performance and repository size.
2025 2025
2026 2026 ``revlog.optimize-delta-parent-choice``
2027 2027 When storing a merge revision, both parents will be equally considered as
2028 2028 a possible delta base. This results in better delta selection and improved
2029 2029 revlog compression. This option is enabled by default.
2030 2030
2031 2031 Turning this option off can result in large increase of repository size for
2032 2032 repository with many merges.
2033 2033
2034 2034 ``revlog.persistent-nodemap.mmap``
2035 2035 Whether to use the Operating System "memory mapping" feature (when
2036 2036 possible) to access the persistent nodemap data. This improve performance
2037 2037 and reduce memory pressure.
2038 2038
2039 2039 Default to True.
2040 2040
2041 2041 For details on the "persistent-nodemap" feature, see:
2042 2042 :hg:`help config format.use-persistent-nodemap`.
2043 2043
2044 2044 ``revlog.persistent-nodemap.slow-path``
2045 2045 Control the behavior of Merucrial when using a repository with "persistent"
2046 2046 nodemap with an installation of Mercurial without a fast implementation for
2047 2047 the feature:
2048 2048
2049 2049 ``allow``: Silently use the slower implementation to access the repository.
2050 2050 ``warn``: Warn, but use the slower implementation to access the repository.
2051 2051 ``abort``: Prevent access to such repositories. (This is the default)
2052 2052
2053 2053 For details on the "persistent-nodemap" feature, see:
2054 2054 :hg:`help config format.use-persistent-nodemap`.
2055 2055
2056 2056 ``revlog.reuse-external-delta-parent``
2057 2057 Control the order in which delta parents are considered when adding new
2058 2058 revisions from an external source.
2059 2059 (typically: apply bundle from `hg pull` or `hg push`).
2060 2060
2061 2061 New revisions are usually provided as a delta against other revisions. By
2062 2062 default, Mercurial will try to reuse this delta first, therefore using the
2063 2063 same "delta parent" as the source. Directly using delta's from the source
2064 2064 reduces CPU usage and usually speeds up operation. However, in some case,
2065 2065 the source might have sub-optimal delta bases and forcing their reevaluation
2066 2066 is useful. For example, pushes from an old client could have sub-optimal
2067 2067 delta's parent that the server want to optimize. (lack of general delta, bad
2068 2068 parents, choice, lack of sparse-revlog, etc).
2069 2069
2070 2070 This option is enabled by default. Turning it off will ensure bad delta
2071 2071 parent choices from older client do not propagate to this repository, at
2072 2072 the cost of a small increase in CPU consumption.
2073 2073
2074 2074 Note: this option only control the order in which delta parents are
2075 2075 considered. Even when disabled, the existing delta from the source will be
2076 2076 reused if the same delta parent is selected.
2077 2077
2078 2078 ``revlog.reuse-external-delta``
2079 2079 Control the reuse of delta from external source.
2080 2080 (typically: apply bundle from `hg pull` or `hg push`).
2081 2081
2082 2082 New revisions are usually provided as a delta against another revision. By
2083 2083 default, Mercurial will not recompute the same delta again, trusting
2084 2084 externally provided deltas. There have been rare cases of small adjustment
2085 2085 to the diffing algorithm in the past. So in some rare case, recomputing
2086 2086 delta provided by ancient clients can provides better results. Disabling
2087 2087 this option means going through a full delta recomputation for all incoming
2088 2088 revisions. It means a large increase in CPU usage and will slow operations
2089 2089 down.
2090 2090
2091 2091 This option is enabled by default. When disabled, it also disables the
2092 2092 related ``storage.revlog.reuse-external-delta-parent`` option.
2093 2093
2094 2094 ``revlog.zlib.level``
2095 2095 Zlib compression level used when storing data into the repository. Accepted
2096 2096 Value range from 1 (lowest compression) to 9 (highest compression). Zlib
2097 2097 default value is 6.
2098 2098
2099 2099
2100 2100 ``revlog.zstd.level``
2101 2101 zstd compression level used when storing data into the repository. Accepted
2102 2102 Value range from 1 (lowest compression) to 22 (highest compression).
2103 2103 (default 3)
2104 2104
2105 2105 ``server``
2106 2106 ----------
2107 2107
2108 2108 Controls generic server settings.
2109 2109
2110 2110 ``bookmarks-pushkey-compat``
2111 2111 Trigger pushkey hook when being pushed bookmark updates. This config exist
2112 2112 for compatibility purpose (default to True)
2113 2113
2114 2114 If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark
2115 2115 movement we recommend you migrate them to ``txnclose-bookmark`` and
2116 2116 ``pretxnclose-bookmark``.
2117 2117
2118 2118 ``compressionengines``
2119 2119 List of compression engines and their relative priority to advertise
2120 2120 to clients.
2121 2121
2122 2122 The order of compression engines determines their priority, the first
2123 2123 having the highest priority. If a compression engine is not listed
2124 2124 here, it won't be advertised to clients.
2125 2125
2126 2126 If not set (the default), built-in defaults are used. Run
2127 2127 :hg:`debuginstall` to list available compression engines and their
2128 2128 default wire protocol priority.
2129 2129
2130 2130 Older Mercurial clients only support zlib compression and this setting
2131 2131 has no effect for legacy clients.
2132 2132
2133 2133 ``uncompressed``
2134 2134 Whether to allow clients to clone a repository using the
2135 2135 uncompressed streaming protocol. This transfers about 40% more
2136 2136 data than a regular clone, but uses less memory and CPU on both
2137 2137 server and client. Over a LAN (100 Mbps or better) or a very fast
2138 2138 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
2139 2139 regular clone. Over most WAN connections (anything slower than
2140 2140 about 6 Mbps), uncompressed streaming is slower, because of the
2141 2141 extra data transfer overhead. This mode will also temporarily hold
2142 2142 the write lock while determining what data to transfer.
2143 2143 (default: True)
2144 2144
2145 2145 ``uncompressedallowsecret``
2146 2146 Whether to allow stream clones when the repository contains secret
2147 2147 changesets. (default: False)
2148 2148
2149 2149 ``preferuncompressed``
2150 2150 When set, clients will try to use the uncompressed streaming
2151 2151 protocol. (default: False)
2152 2152
2153 2153 ``disablefullbundle``
2154 2154 When set, servers will refuse attempts to do pull-based clones.
2155 2155 If this option is set, ``preferuncompressed`` and/or clone bundles
2156 2156 are highly recommended. Partial clones will still be allowed.
2157 2157 (default: False)
2158 2158
2159 2159 ``streamunbundle``
2160 2160 When set, servers will apply data sent from the client directly,
2161 2161 otherwise it will be written to a temporary file first. This option
2162 2162 effectively prevents concurrent pushes.
2163 2163
2164 2164 ``pullbundle``
2165 2165 When set, the server will check pullbundle.manifest for bundles
2166 2166 covering the requested heads and common nodes. The first matching
2167 2167 entry will be streamed to the client.
2168 2168
2169 2169 For HTTP transport, the stream will still use zlib compression
2170 2170 for older clients.
2171 2171
2172 2172 ``concurrent-push-mode``
2173 2173 Level of allowed race condition between two pushing clients.
2174 2174
2175 2175 - 'strict': push is abort if another client touched the repository
2176 2176 while the push was preparing.
2177 2177 - 'check-related': push is only aborted if it affects head that got also
2178 2178 affected while the push was preparing. (default since 5.4)
2179 2179
2180 2180 'check-related' only takes effect for compatible clients (version
2181 2181 4.3 and later). Older clients will use 'strict'.
2182 2182
2183 2183 ``validate``
2184 2184 Whether to validate the completeness of pushed changesets by
2185 2185 checking that all new file revisions specified in manifests are
2186 2186 present. (default: False)
2187 2187
2188 2188 ``maxhttpheaderlen``
2189 2189 Instruct HTTP clients not to send request headers longer than this
2190 2190 many bytes. (default: 1024)
2191 2191
2192 2192 ``bundle1``
2193 2193 Whether to allow clients to push and pull using the legacy bundle1
2194 2194 exchange format. (default: True)
2195 2195
2196 2196 ``bundle1gd``
2197 2197 Like ``bundle1`` but only used if the repository is using the
2198 2198 *generaldelta* storage format. (default: True)
2199 2199
2200 2200 ``bundle1.push``
2201 2201 Whether to allow clients to push using the legacy bundle1 exchange
2202 2202 format. (default: True)
2203 2203
2204 2204 ``bundle1gd.push``
2205 2205 Like ``bundle1.push`` but only used if the repository is using the
2206 2206 *generaldelta* storage format. (default: True)
2207 2207
2208 2208 ``bundle1.pull``
2209 2209 Whether to allow clients to pull using the legacy bundle1 exchange
2210 2210 format. (default: True)
2211 2211
2212 2212 ``bundle1gd.pull``
2213 2213 Like ``bundle1.pull`` but only used if the repository is using the
2214 2214 *generaldelta* storage format. (default: True)
2215 2215
2216 2216 Large repositories using the *generaldelta* storage format should
2217 2217 consider setting this option because converting *generaldelta*
2218 2218 repositories to the exchange format required by the bundle1 data
2219 2219 format can consume a lot of CPU.
2220 2220
2221 2221 ``bundle2.stream``
2222 2222 Whether to allow clients to pull using the bundle2 streaming protocol.
2223 2223 (default: True)
2224 2224
2225 2225 ``zliblevel``
2226 2226 Integer between ``-1`` and ``9`` that controls the zlib compression level
2227 2227 for wire protocol commands that send zlib compressed output (notably the
2228 2228 commands that send repository history data).
2229 2229
2230 2230 The default (``-1``) uses the default zlib compression level, which is
2231 2231 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
2232 2232 maximum compression.
2233 2233
2234 2234 Setting this option allows server operators to make trade-offs between
2235 2235 bandwidth and CPU used. Lowering the compression lowers CPU utilization
2236 2236 but sends more bytes to clients.
2237 2237
2238 2238 This option only impacts the HTTP server.
2239 2239
2240 2240 ``zstdlevel``
2241 2241 Integer between ``1`` and ``22`` that controls the zstd compression level
2242 2242 for wire protocol commands. ``1`` is the minimal amount of compression and
2243 2243 ``22`` is the highest amount of compression.
2244 2244
2245 2245 The default (``3``) should be significantly faster than zlib while likely
2246 2246 delivering better compression ratios.
2247 2247
2248 2248 This option only impacts the HTTP server.
2249 2249
2250 2250 See also ``server.zliblevel``.
2251 2251
2252 2252 ``view``
2253 2253 Repository filter used when exchanging revisions with the peer.
2254 2254
2255 2255 The default view (``served``) excludes secret and hidden changesets.
2256 2256 Another useful value is ``immutable`` (no draft, secret or hidden
2257 2257 changesets). (EXPERIMENTAL)
2258 2258
2259 2259 ``smtp``
2260 2260 --------
2261 2261
2262 2262 Configuration for extensions that need to send email messages.
2263 2263
2264 2264 ``host``
2265 2265 Host name of mail server, e.g. "mail.example.com".
2266 2266
2267 2267 ``port``
2268 2268 Optional. Port to connect to on mail server. (default: 465 if
2269 2269 ``tls`` is smtps; 25 otherwise)
2270 2270
2271 2271 ``tls``
2272 2272 Optional. Method to enable TLS when connecting to mail server: starttls,
2273 2273 smtps or none. (default: none)
2274 2274
2275 2275 ``username``
2276 2276 Optional. User name for authenticating with the SMTP server.
2277 2277 (default: None)
2278 2278
2279 2279 ``password``
2280 2280 Optional. Password for authenticating with the SMTP server. If not
2281 2281 specified, interactive sessions will prompt the user for a
2282 2282 password; non-interactive sessions will fail. (default: None)
2283 2283
2284 2284 ``local_hostname``
2285 2285 Optional. The hostname that the sender can use to identify
2286 2286 itself to the MTA.
2287 2287
2288 2288
2289 2289 ``subpaths``
2290 2290 ------------
2291 2291
2292 2292 Subrepository source URLs can go stale if a remote server changes name
2293 2293 or becomes temporarily unavailable. This section lets you define
2294 2294 rewrite rules of the form::
2295 2295
2296 2296 <pattern> = <replacement>
2297 2297
2298 2298 where ``pattern`` is a regular expression matching a subrepository
2299 2299 source URL and ``replacement`` is the replacement string used to
2300 2300 rewrite it. Groups can be matched in ``pattern`` and referenced in
2301 2301 ``replacements``. For instance::
2302 2302
2303 2303 http://server/(.*)-hg/ = http://hg.server/\1/
2304 2304
2305 2305 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
2306 2306
2307 2307 Relative subrepository paths are first made absolute, and the
2308 2308 rewrite rules are then applied on the full (absolute) path. If ``pattern``
2309 2309 doesn't match the full path, an attempt is made to apply it on the
2310 2310 relative path alone. The rules are applied in definition order.
2311 2311
2312 2312 ``subrepos``
2313 2313 ------------
2314 2314
2315 2315 This section contains options that control the behavior of the
2316 2316 subrepositories feature. See also :hg:`help subrepos`.
2317 2317
2318 2318 Security note: auditing in Mercurial is known to be insufficient to
2319 2319 prevent clone-time code execution with carefully constructed Git
2320 2320 subrepos. It is unknown if a similar detect is present in Subversion
2321 2321 subrepos. Both Git and Subversion subrepos are disabled by default
2322 2322 out of security concerns. These subrepo types can be enabled using
2323 2323 the respective options below.
2324 2324
2325 2325 ``allowed``
2326 2326 Whether subrepositories are allowed in the working directory.
2327 2327
2328 2328 When false, commands involving subrepositories (like :hg:`update`)
2329 2329 will fail for all subrepository types.
2330 2330 (default: true)
2331 2331
2332 2332 ``hg:allowed``
2333 2333 Whether Mercurial subrepositories are allowed in the working
2334 2334 directory. This option only has an effect if ``subrepos.allowed``
2335 2335 is true.
2336 2336 (default: true)
2337 2337
2338 2338 ``git:allowed``
2339 2339 Whether Git subrepositories are allowed in the working directory.
2340 2340 This option only has an effect if ``subrepos.allowed`` is true.
2341 2341
2342 2342 See the security note above before enabling Git subrepos.
2343 2343 (default: false)
2344 2344
2345 2345 ``svn:allowed``
2346 2346 Whether Subversion subrepositories are allowed in the working
2347 2347 directory. This option only has an effect if ``subrepos.allowed``
2348 2348 is true.
2349 2349
2350 2350 See the security note above before enabling Subversion subrepos.
2351 2351 (default: false)
2352 2352
2353 2353 ``templatealias``
2354 2354 -----------------
2355 2355
2356 2356 Alias definitions for templates. See :hg:`help templates` for details.
2357 2357
2358 2358 ``templates``
2359 2359 -------------
2360 2360
2361 2361 Use the ``[templates]`` section to define template strings.
2362 2362 See :hg:`help templates` for details.
2363 2363
2364 2364 ``trusted``
2365 2365 -----------
2366 2366
2367 2367 Mercurial will not use the settings in the
2368 2368 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
2369 2369 user or to a trusted group, as various hgrc features allow arbitrary
2370 2370 commands to be run. This issue is often encountered when configuring
2371 2371 hooks or extensions for shared repositories or servers. However,
2372 2372 the web interface will use some safe settings from the ``[web]``
2373 2373 section.
2374 2374
2375 2375 This section specifies what users and groups are trusted. The
2376 2376 current user is always trusted. To trust everybody, list a user or a
2377 2377 group with name ``*``. These settings must be placed in an
2378 2378 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
2379 2379 user or service running Mercurial.
2380 2380
2381 2381 ``users``
2382 2382 Comma-separated list of trusted users.
2383 2383
2384 2384 ``groups``
2385 2385 Comma-separated list of trusted groups.
2386 2386
2387 2387
2388 2388 ``ui``
2389 2389 ------
2390 2390
2391 2391 User interface controls.
2392 2392
2393 2393 ``archivemeta``
2394 2394 Whether to include the .hg_archival.txt file containing meta data
2395 2395 (hashes for the repository base and for tip) in archives created
2396 2396 by the :hg:`archive` command or downloaded via hgweb.
2397 2397 (default: True)
2398 2398
2399 2399 ``askusername``
2400 2400 Whether to prompt for a username when committing. If True, and
2401 2401 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
2402 2402 be prompted to enter a username. If no username is entered, the
2403 2403 default ``USER@HOST`` is used instead.
2404 2404 (default: False)
2405 2405
2406 2406 ``clonebundles``
2407 2407 Whether the "clone bundles" feature is enabled.
2408 2408
2409 2409 When enabled, :hg:`clone` may download and apply a server-advertised
2410 2410 bundle file from a URL instead of using the normal exchange mechanism.
2411 2411
2412 2412 This can likely result in faster and more reliable clones.
2413 2413
2414 2414 (default: True)
2415 2415
2416 2416 ``clonebundlefallback``
2417 2417 Whether failure to apply an advertised "clone bundle" from a server
2418 2418 should result in fallback to a regular clone.
2419 2419
2420 2420 This is disabled by default because servers advertising "clone
2421 2421 bundles" often do so to reduce server load. If advertised bundles
2422 2422 start mass failing and clients automatically fall back to a regular
2423 2423 clone, this would add significant and unexpected load to the server
2424 2424 since the server is expecting clone operations to be offloaded to
2425 2425 pre-generated bundles. Failing fast (the default behavior) ensures
2426 2426 clients don't overwhelm the server when "clone bundle" application
2427 2427 fails.
2428 2428
2429 2429 (default: False)
2430 2430
2431 2431 ``clonebundleprefers``
2432 2432 Defines preferences for which "clone bundles" to use.
2433 2433
2434 2434 Servers advertising "clone bundles" may advertise multiple available
2435 2435 bundles. Each bundle may have different attributes, such as the bundle
2436 2436 type and compression format. This option is used to prefer a particular
2437 2437 bundle over another.
2438 2438
2439 2439 The following keys are defined by Mercurial:
2440 2440
2441 2441 BUNDLESPEC
2442 2442 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
2443 2443 e.g. ``gzip-v2`` or ``bzip2-v1``.
2444 2444
2445 2445 COMPRESSION
2446 2446 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
2447 2447
2448 2448 Server operators may define custom keys.
2449 2449
2450 2450 Example values: ``COMPRESSION=bzip2``,
2451 2451 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
2452 2452
2453 2453 By default, the first bundle advertised by the server is used.
2454 2454
2455 2455 ``color``
2456 2456 When to colorize output. Possible value are Boolean ("yes" or "no"), or
2457 2457 "debug", or "always". (default: "yes"). "yes" will use color whenever it
2458 2458 seems possible. See :hg:`help color` for details.
2459 2459
2460 2460 ``commitsubrepos``
2461 2461 Whether to commit modified subrepositories when committing the
2462 2462 parent repository. If False and one subrepository has uncommitted
2463 2463 changes, abort the commit.
2464 2464 (default: False)
2465 2465
2466 2466 ``debug``
2467 2467 Print debugging information. (default: False)
2468 2468
2469 2469 ``editor``
2470 2470 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
2471 2471
2472 2472 ``fallbackencoding``
2473 2473 Encoding to try if it's not possible to decode the changelog using
2474 2474 UTF-8. (default: ISO-8859-1)
2475 2475
2476 2476 ``graphnodetemplate``
2477 2477 (DEPRECATED) Use ``command-templates.graphnode`` instead.
2478 2478
2479 2479 ``ignore``
2480 2480 A file to read per-user ignore patterns from. This file should be
2481 2481 in the same format as a repository-wide .hgignore file. Filenames
2482 2482 are relative to the repository root. This option supports hook syntax,
2483 2483 so if you want to specify multiple ignore files, you can do so by
2484 2484 setting something like ``ignore.other = ~/.hgignore2``. For details
2485 2485 of the ignore file format, see the ``hgignore(5)`` man page.
2486 2486
2487 2487 ``interactive``
2488 2488 Allow to prompt the user. (default: True)
2489 2489
2490 2490 ``interface``
2491 2491 Select the default interface for interactive features (default: text).
2492 2492 Possible values are 'text' and 'curses'.
2493 2493
2494 2494 ``interface.chunkselector``
2495 2495 Select the interface for change recording (e.g. :hg:`commit -i`).
2496 2496 Possible values are 'text' and 'curses'.
2497 2497 This config overrides the interface specified by ui.interface.
2498 2498
2499 2499 ``large-file-limit``
2500 2500 Largest file size that gives no memory use warning.
2501 2501 Possible values are integers or 0 to disable the check.
2502 2502 (default: 10000000)
2503 2503
2504 2504 ``logtemplate``
2505 2505 (DEPRECATED) Use ``command-templates.log`` instead.
2506 2506
2507 2507 ``merge``
2508 2508 The conflict resolution program to use during a manual merge.
2509 2509 For more information on merge tools see :hg:`help merge-tools`.
2510 2510 For configuring merge tools see the ``[merge-tools]`` section.
2511 2511
2512 2512 ``mergemarkers``
2513 2513 Sets the merge conflict marker label styling. The ``detailed`` style
2514 2514 uses the ``command-templates.mergemarker`` setting to style the labels.
2515 2515 The ``basic`` style just uses 'local' and 'other' as the marker label.
2516 2516 One of ``basic`` or ``detailed``.
2517 2517 (default: ``basic``)
2518 2518
2519 2519 ``mergemarkertemplate``
2520 2520 (DEPRECATED) Use ``command-templates.mergemarker`` instead.
2521 2521
2522 2522 ``message-output``
2523 2523 Where to write status and error messages. (default: ``stdio``)
2524 2524
2525 2525 ``channel``
2526 2526 Use separate channel for structured output. (Command-server only)
2527 2527 ``stderr``
2528 2528 Everything to stderr.
2529 2529 ``stdio``
2530 2530 Status to stdout, and error to stderr.
2531 2531
2532 2532 ``origbackuppath``
2533 2533 The path to a directory used to store generated .orig files. If the path is
2534 2534 not a directory, one will be created. If set, files stored in this
2535 2535 directory have the same name as the original file and do not have a .orig
2536 2536 suffix.
2537 2537
2538 2538 ``paginate``
2539 2539 Control the pagination of command output (default: True). See :hg:`help pager`
2540 2540 for details.
2541 2541
2542 2542 ``patch``
2543 2543 An optional external tool that ``hg import`` and some extensions
2544 2544 will use for applying patches. By default Mercurial uses an
2545 2545 internal patch utility. The external tool must work as the common
2546 2546 Unix ``patch`` program. In particular, it must accept a ``-p``
2547 2547 argument to strip patch headers, a ``-d`` argument to specify the
2548 2548 current directory, a file name to patch, and a patch file to take
2549 2549 from stdin.
2550 2550
2551 2551 It is possible to specify a patch tool together with extra
2552 2552 arguments. For example, setting this option to ``patch --merge``
2553 2553 will use the ``patch`` program with its 2-way merge option.
2554 2554
2555 2555 ``portablefilenames``
2556 2556 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
2557 2557 (default: ``warn``)
2558 2558
2559 2559 ``warn``
2560 2560 Print a warning message on POSIX platforms, if a file with a non-portable
2561 2561 filename is added (e.g. a file with a name that can't be created on
2562 2562 Windows because it contains reserved parts like ``AUX``, reserved
2563 2563 characters like ``:``, or would cause a case collision with an existing
2564 2564 file).
2565 2565
2566 2566 ``ignore``
2567 2567 Don't print a warning.
2568 2568
2569 2569 ``abort``
2570 2570 The command is aborted.
2571 2571
2572 2572 ``true``
2573 2573 Alias for ``warn``.
2574 2574
2575 2575 ``false``
2576 2576 Alias for ``ignore``.
2577 2577
2578 2578 .. container:: windows
2579 2579
2580 2580 On Windows, this configuration option is ignored and the command aborted.
2581 2581
2582 2582 ``pre-merge-tool-output-template``
2583 2583 (DEPRECATED) Use ``command-template.pre-merge-tool-output`` instead.
2584 2584
2585 2585 ``quiet``
2586 2586 Reduce the amount of output printed.
2587 2587 (default: False)
2588 2588
2589 2589 ``relative-paths``
2590 2590 Prefer relative paths in the UI.
2591 2591
2592 2592 ``remotecmd``
2593 2593 Remote command to use for clone/push/pull operations.
2594 2594 (default: ``hg``)
2595 2595
2596 2596 ``report_untrusted``
2597 2597 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2598 2598 trusted user or group.
2599 2599 (default: True)
2600 2600
2601 2601 ``slash``
2602 2602 (Deprecated. Use ``slashpath`` template filter instead.)
2603 2603
2604 2604 Display paths using a slash (``/``) as the path separator. This
2605 2605 only makes a difference on systems where the default path
2606 2606 separator is not the slash character (e.g. Windows uses the
2607 2607 backslash character (``\``)).
2608 2608 (default: False)
2609 2609
2610 2610 ``statuscopies``
2611 2611 Display copies in the status command.
2612 2612
2613 2613 ``ssh``
2614 2614 Command to use for SSH connections. (default: ``ssh``)
2615 2615
2616 2616 ``ssherrorhint``
2617 2617 A hint shown to the user in the case of SSH error (e.g.
2618 2618 ``Please see http://company/internalwiki/ssh.html``)
2619 2619
2620 2620 ``strict``
2621 2621 Require exact command names, instead of allowing unambiguous
2622 2622 abbreviations. (default: False)
2623 2623
2624 2624 ``style``
2625 2625 Name of style to use for command output.
2626 2626
2627 2627 ``supportcontact``
2628 2628 A URL where users should report a Mercurial traceback. Use this if you are a
2629 2629 large organisation with its own Mercurial deployment process and crash
2630 2630 reports should be addressed to your internal support.
2631 2631
2632 2632 ``textwidth``
2633 2633 Maximum width of help text. A longer line generated by ``hg help`` or
2634 2634 ``hg subcommand --help`` will be broken after white space to get this
2635 2635 width or the terminal width, whichever comes first.
2636 2636 A non-positive value will disable this and the terminal width will be
2637 2637 used. (default: 78)
2638 2638
2639 2639 ``timeout``
2640 2640 The timeout used when a lock is held (in seconds), a negative value
2641 2641 means no timeout. (default: 600)
2642 2642
2643 2643 ``timeout.warn``
2644 2644 Time (in seconds) before a warning is printed about held lock. A negative
2645 2645 value means no warning. (default: 0)
2646 2646
2647 2647 ``traceback``
2648 2648 Mercurial always prints a traceback when an unknown exception
2649 2649 occurs. Setting this to True will make Mercurial print a traceback
2650 2650 on all exceptions, even those recognized by Mercurial (such as
2651 2651 IOError or MemoryError). (default: False)
2652 2652
2653 2653 ``tweakdefaults``
2654 2654
2655 2655 By default Mercurial's behavior changes very little from release
2656 2656 to release, but over time the recommended config settings
2657 2657 shift. Enable this config to opt in to get automatic tweaks to
2658 2658 Mercurial's behavior over time. This config setting will have no
2659 2659 effect if ``HGPLAIN`` is set or ``HGPLAINEXCEPT`` is set and does
2660 2660 not include ``tweakdefaults``. (default: False)
2661 2661
2662 2662 It currently means::
2663 2663
2664 2664 .. tweakdefaultsmarker
2665 2665
2666 2666 ``username``
2667 2667 The committer of a changeset created when running "commit".
2668 2668 Typically a person's name and email address, e.g. ``Fred Widget
2669 2669 <fred@example.com>``. Environment variables in the
2670 2670 username are expanded.
2671 2671
2672 2672 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2673 2673 hgrc is empty, e.g. if the system admin set ``username =`` in the
2674 2674 system hgrc, it has to be specified manually or in a different
2675 2675 hgrc file)
2676 2676
2677 2677 ``verbose``
2678 2678 Increase the amount of output printed. (default: False)
2679 2679
2680 2680
2681 2681 ``command-templates``
2682 2682 ---------------------
2683 2683
2684 2684 Templates used for customizing the output of commands.
2685 2685
2686 2686 ``graphnode``
2687 2687 The template used to print changeset nodes in an ASCII revision graph.
2688 2688 (default: ``{graphnode}``)
2689 2689
2690 2690 ``log``
2691 2691 Template string for commands that print changesets.
2692 2692
2693 2693 ``mergemarker``
2694 2694 The template used to print the commit description next to each conflict
2695 2695 marker during merge conflicts. See :hg:`help templates` for the template
2696 2696 format.
2697 2697
2698 2698 Defaults to showing the hash, tags, branches, bookmarks, author, and
2699 2699 the first line of the commit description.
2700 2700
2701 2701 If you use non-ASCII characters in names for tags, branches, bookmarks,
2702 2702 authors, and/or commit descriptions, you must pay attention to encodings of
2703 2703 managed files. At template expansion, non-ASCII characters use the encoding
2704 2704 specified by the ``--encoding`` global option, ``HGENCODING`` or other
2705 2705 environment variables that govern your locale. If the encoding of the merge
2706 2706 markers is different from the encoding of the merged files,
2707 2707 serious problems may occur.
2708 2708
2709 2709 Can be overridden per-merge-tool, see the ``[merge-tools]`` section.
2710 2710
2711 2711 ``oneline-summary``
2712 2712 A template used by `hg rebase` and other commands for showing a one-line
2713 2713 summary of a commit. If the template configured here is longer than one
2714 2714 line, then only the first line is used.
2715 2715
2716 2716 The template can be overridden per command by defining a template in
2717 2717 `oneline-summary.<command>`, where `<command>` can be e.g. "rebase".
2718 2718
2719 2719 ``pre-merge-tool-output``
2720 2720 A template that is printed before executing an external merge tool. This can
2721 2721 be used to print out additional context that might be useful to have during
2722 2722 the conflict resolution, such as the description of the various commits
2723 2723 involved or bookmarks/tags.
2724 2724
2725 2725 Additional information is available in the ``local`, ``base``, and ``other``
2726 2726 dicts. For example: ``{local.label}``, ``{base.name}``, or
2727 2727 ``{other.islink}``.
2728 2728
2729 2729
2730 2730 ``web``
2731 2731 -------
2732 2732
2733 2733 Web interface configuration. The settings in this section apply to
2734 2734 both the builtin webserver (started by :hg:`serve`) and the script you
2735 2735 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2736 2736 and WSGI).
2737 2737
2738 2738 The Mercurial webserver does no authentication (it does not prompt for
2739 2739 usernames and passwords to validate *who* users are), but it does do
2740 2740 authorization (it grants or denies access for *authenticated users*
2741 2741 based on settings in this section). You must either configure your
2742 2742 webserver to do authentication for you, or disable the authorization
2743 2743 checks.
2744 2744
2745 2745 For a quick setup in a trusted environment, e.g., a private LAN, where
2746 2746 you want it to accept pushes from anybody, you can use the following
2747 2747 command line::
2748 2748
2749 2749 $ hg --config web.allow-push=* --config web.push_ssl=False serve
2750 2750
2751 2751 Note that this will allow anybody to push anything to the server and
2752 2752 that this should not be used for public servers.
2753 2753
2754 2754 The full set of options is:
2755 2755
2756 2756 ``accesslog``
2757 2757 Where to output the access log. (default: stdout)
2758 2758
2759 2759 ``address``
2760 2760 Interface address to bind to. (default: all)
2761 2761
2762 2762 ``allow-archive``
2763 2763 List of archive format (bz2, gz, zip) allowed for downloading.
2764 2764 (default: empty)
2765 2765
2766 2766 ``allowbz2``
2767 2767 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2768 2768 revisions.
2769 2769 (default: False)
2770 2770
2771 2771 ``allowgz``
2772 2772 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2773 2773 revisions.
2774 2774 (default: False)
2775 2775
2776 2776 ``allow-pull``
2777 2777 Whether to allow pulling from the repository. (default: True)
2778 2778
2779 2779 ``allow-push``
2780 2780 Whether to allow pushing to the repository. If empty or not set,
2781 2781 pushing is not allowed. If the special value ``*``, any remote
2782 2782 user can push, including unauthenticated users. Otherwise, the
2783 2783 remote user must have been authenticated, and the authenticated
2784 2784 user name must be present in this list. The contents of the
2785 2785 allow-push list are examined after the deny_push list.
2786 2786
2787 2787 ``allow_read``
2788 2788 If the user has not already been denied repository access due to
2789 2789 the contents of deny_read, this list determines whether to grant
2790 2790 repository access to the user. If this list is not empty, and the
2791 2791 user is unauthenticated or not present in the list, then access is
2792 2792 denied for the user. If the list is empty or not set, then access
2793 2793 is permitted to all users by default. Setting allow_read to the
2794 2794 special value ``*`` is equivalent to it not being set (i.e. access
2795 2795 is permitted to all users). The contents of the allow_read list are
2796 2796 examined after the deny_read list.
2797 2797
2798 2798 ``allowzip``
2799 2799 (DEPRECATED) Whether to allow .zip downloading of repository
2800 2800 revisions. This feature creates temporary files.
2801 2801 (default: False)
2802 2802
2803 2803 ``archivesubrepos``
2804 2804 Whether to recurse into subrepositories when archiving.
2805 2805 (default: False)
2806 2806
2807 2807 ``baseurl``
2808 2808 Base URL to use when publishing URLs in other locations, so
2809 2809 third-party tools like email notification hooks can construct
2810 2810 URLs. Example: ``http://hgserver/repos/``.
2811 2811
2812 2812 ``cacerts``
2813 2813 Path to file containing a list of PEM encoded certificate
2814 2814 authority certificates. Environment variables and ``~user``
2815 2815 constructs are expanded in the filename. If specified on the
2816 2816 client, then it will verify the identity of remote HTTPS servers
2817 2817 with these certificates.
2818 2818
2819 2819 To disable SSL verification temporarily, specify ``--insecure`` from
2820 2820 command line.
2821 2821
2822 2822 You can use OpenSSL's CA certificate file if your platform has
2823 2823 one. On most Linux systems this will be
2824 2824 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2825 2825 generate this file manually. The form must be as follows::
2826 2826
2827 2827 -----BEGIN CERTIFICATE-----
2828 2828 ... (certificate in base64 PEM encoding) ...
2829 2829 -----END CERTIFICATE-----
2830 2830 -----BEGIN CERTIFICATE-----
2831 2831 ... (certificate in base64 PEM encoding) ...
2832 2832 -----END CERTIFICATE-----
2833 2833
2834 2834 ``cache``
2835 2835 Whether to support caching in hgweb. (default: True)
2836 2836
2837 2837 ``certificate``
2838 2838 Certificate to use when running :hg:`serve`.
2839 2839
2840 2840 ``collapse``
2841 2841 With ``descend`` enabled, repositories in subdirectories are shown at
2842 2842 a single level alongside repositories in the current path. With
2843 2843 ``collapse`` also enabled, repositories residing at a deeper level than
2844 2844 the current path are grouped behind navigable directory entries that
2845 2845 lead to the locations of these repositories. In effect, this setting
2846 2846 collapses each collection of repositories found within a subdirectory
2847 2847 into a single entry for that subdirectory. (default: False)
2848 2848
2849 2849 ``comparisoncontext``
2850 2850 Number of lines of context to show in side-by-side file comparison. If
2851 2851 negative or the value ``full``, whole files are shown. (default: 5)
2852 2852
2853 2853 This setting can be overridden by a ``context`` request parameter to the
2854 2854 ``comparison`` command, taking the same values.
2855 2855
2856 2856 ``contact``
2857 2857 Name or email address of the person in charge of the repository.
2858 2858 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2859 2859
2860 2860 ``csp``
2861 2861 Send a ``Content-Security-Policy`` HTTP header with this value.
2862 2862
2863 2863 The value may contain a special string ``%nonce%``, which will be replaced
2864 2864 by a randomly-generated one-time use value. If the value contains
2865 2865 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2866 2866 one-time property of the nonce. This nonce will also be inserted into
2867 2867 ``<script>`` elements containing inline JavaScript.
2868 2868
2869 2869 Note: lots of HTML content sent by the server is derived from repository
2870 2870 data. Please consider the potential for malicious repository data to
2871 2871 "inject" itself into generated HTML content as part of your security
2872 2872 threat model.
2873 2873
2874 2874 ``deny_push``
2875 2875 Whether to deny pushing to the repository. If empty or not set,
2876 2876 push is not denied. If the special value ``*``, all remote users are
2877 2877 denied push. Otherwise, unauthenticated users are all denied, and
2878 2878 any authenticated user name present in this list is also denied. The
2879 2879 contents of the deny_push list are examined before the allow-push list.
2880 2880
2881 2881 ``deny_read``
2882 2882 Whether to deny reading/viewing of the repository. If this list is
2883 2883 not empty, unauthenticated users are all denied, and any
2884 2884 authenticated user name present in this list is also denied access to
2885 2885 the repository. If set to the special value ``*``, all remote users
2886 2886 are denied access (rarely needed ;). If deny_read is empty or not set,
2887 2887 the determination of repository access depends on the presence and
2888 2888 content of the allow_read list (see description). If both
2889 2889 deny_read and allow_read are empty or not set, then access is
2890 2890 permitted to all users by default. If the repository is being
2891 2891 served via hgwebdir, denied users will not be able to see it in
2892 2892 the list of repositories. The contents of the deny_read list have
2893 2893 priority over (are examined before) the contents of the allow_read
2894 2894 list.
2895 2895
2896 2896 ``descend``
2897 2897 hgwebdir indexes will not descend into subdirectories. Only repositories
2898 2898 directly in the current path will be shown (other repositories are still
2899 2899 available from the index corresponding to their containing path).
2900 2900
2901 2901 ``description``
2902 2902 Textual description of the repository's purpose or contents.
2903 2903 (default: "unknown")
2904 2904
2905 2905 ``encoding``
2906 2906 Character encoding name. (default: the current locale charset)
2907 2907 Example: "UTF-8".
2908 2908
2909 2909 ``errorlog``
2910 2910 Where to output the error log. (default: stderr)
2911 2911
2912 2912 ``guessmime``
2913 2913 Control MIME types for raw download of file content.
2914 2914 Set to True to let hgweb guess the content type from the file
2915 2915 extension. This will serve HTML files as ``text/html`` and might
2916 2916 allow cross-site scripting attacks when serving untrusted
2917 2917 repositories. (default: False)
2918 2918
2919 2919 ``hidden``
2920 2920 Whether to hide the repository in the hgwebdir index.
2921 2921 (default: False)
2922 2922
2923 2923 ``ipv6``
2924 2924 Whether to use IPv6. (default: False)
2925 2925
2926 2926 ``labels``
2927 2927 List of string *labels* associated with the repository.
2928 2928
2929 2929 Labels are exposed as a template keyword and can be used to customize
2930 2930 output. e.g. the ``index`` template can group or filter repositories
2931 2931 by labels and the ``summary`` template can display additional content
2932 2932 if a specific label is present.
2933 2933
2934 2934 ``logoimg``
2935 2935 File name of the logo image that some templates display on each page.
2936 2936 The file name is relative to ``staticurl``. That is, the full path to
2937 2937 the logo image is "staticurl/logoimg".
2938 2938 If unset, ``hglogo.png`` will be used.
2939 2939
2940 2940 ``logourl``
2941 2941 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2942 2942 will be used.
2943 2943
2944 2944 ``maxchanges``
2945 2945 Maximum number of changes to list on the changelog. (default: 10)
2946 2946
2947 2947 ``maxfiles``
2948 2948 Maximum number of files to list per changeset. (default: 10)
2949 2949
2950 2950 ``maxshortchanges``
2951 2951 Maximum number of changes to list on the shortlog, graph or filelog
2952 2952 pages. (default: 60)
2953 2953
2954 2954 ``name``
2955 2955 Repository name to use in the web interface.
2956 2956 (default: current working directory)
2957 2957
2958 2958 ``port``
2959 2959 Port to listen on. (default: 8000)
2960 2960
2961 2961 ``prefix``
2962 2962 Prefix path to serve from. (default: '' (server root))
2963 2963
2964 2964 ``push_ssl``
2965 2965 Whether to require that inbound pushes be transported over SSL to
2966 2966 prevent password sniffing. (default: True)
2967 2967
2968 2968 ``refreshinterval``
2969 2969 How frequently directory listings re-scan the filesystem for new
2970 2970 repositories, in seconds. This is relevant when wildcards are used
2971 2971 to define paths. Depending on how much filesystem traversal is
2972 2972 required, refreshing may negatively impact performance.
2973 2973
2974 2974 Values less than or equal to 0 always refresh.
2975 2975 (default: 20)
2976 2976
2977 2977 ``server-header``
2978 2978 Value for HTTP ``Server`` response header.
2979 2979
2980 2980 ``static``
2981 2981 Directory where static files are served from.
2982 2982
2983 2983 ``staticurl``
2984 2984 Base URL to use for static files. If unset, static files (e.g. the
2985 2985 hgicon.png favicon) will be served by the CGI script itself. Use
2986 2986 this setting to serve them directly with the HTTP server.
2987 2987 Example: ``http://hgserver/static/``.
2988 2988
2989 2989 ``stripes``
2990 2990 How many lines a "zebra stripe" should span in multi-line output.
2991 2991 Set to 0 to disable. (default: 1)
2992 2992
2993 2993 ``style``
2994 2994 Which template map style to use. The available options are the names of
2995 2995 subdirectories in the HTML templates path. (default: ``paper``)
2996 2996 Example: ``monoblue``.
2997 2997
2998 2998 ``templates``
2999 2999 Where to find the HTML templates. The default path to the HTML templates
3000 3000 can be obtained from ``hg debuginstall``.
3001 3001
3002 3002 ``websub``
3003 3003 ----------
3004 3004
3005 3005 Web substitution filter definition. You can use this section to
3006 3006 define a set of regular expression substitution patterns which
3007 3007 let you automatically modify the hgweb server output.
3008 3008
3009 3009 The default hgweb templates only apply these substitution patterns
3010 3010 on the revision description fields. You can apply them anywhere
3011 3011 you want when you create your own templates by adding calls to the
3012 3012 "websub" filter (usually after calling the "escape" filter).
3013 3013
3014 3014 This can be used, for example, to convert issue references to links
3015 3015 to your issue tracker, or to convert "markdown-like" syntax into
3016 3016 HTML (see the examples below).
3017 3017
3018 3018 Each entry in this section names a substitution filter.
3019 3019 The value of each entry defines the substitution expression itself.
3020 3020 The websub expressions follow the old interhg extension syntax,
3021 3021 which in turn imitates the Unix sed replacement syntax::
3022 3022
3023 3023 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
3024 3024
3025 3025 You can use any separator other than "/". The final "i" is optional
3026 3026 and indicates that the search must be case insensitive.
3027 3027
3028 3028 Examples::
3029 3029
3030 3030 [websub]
3031 3031 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
3032 3032 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
3033 3033 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
3034 3034
3035 3035 ``worker``
3036 3036 ----------
3037 3037
3038 3038 Parallel master/worker configuration. We currently perform working
3039 3039 directory updates in parallel on Unix-like systems, which greatly
3040 3040 helps performance.
3041 3041
3042 3042 ``enabled``
3043 3043 Whether to enable workers code to be used.
3044 3044 (default: true)
3045 3045
3046 3046 ``numcpus``
3047 3047 Number of CPUs to use for parallel operations. A zero or
3048 3048 negative value is treated as ``use the default``.
3049 3049 (default: 4 or the number of CPUs on the system, whichever is larger)
3050 3050
3051 3051 ``backgroundclose``
3052 3052 Whether to enable closing file handles on background threads during certain
3053 3053 operations. Some platforms aren't very efficient at closing file
3054 3054 handles that have been written or appended to. By performing file closing
3055 3055 on background threads, file write rate can increase substantially.
3056 3056 (default: true on Windows, false elsewhere)
3057 3057
3058 3058 ``backgroundcloseminfilecount``
3059 3059 Minimum number of files required to trigger background file closing.
3060 3060 Operations not writing this many files won't start background close
3061 3061 threads.
3062 3062 (default: 2048)
3063 3063
3064 3064 ``backgroundclosemaxqueue``
3065 3065 The maximum number of opened file handles waiting to be closed in the
3066 3066 background. This option only has an effect if ``backgroundclose`` is
3067 3067 enabled.
3068 3068 (default: 384)
3069 3069
3070 3070 ``backgroundclosethreadcount``
3071 3071 Number of threads to process background file closes. Only relevant if
3072 3072 ``backgroundclose`` is enabled.
3073 3073 (default: 4)
@@ -1,3698 +1,3698 b''
1 1 # localrepo.py - read/write repository class for mercurial
2 2 #
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 import errno
11 11 import functools
12 12 import os
13 13 import random
14 14 import sys
15 15 import time
16 16 import weakref
17 17
18 18 from .i18n import _
19 19 from .node import (
20 20 bin,
21 21 hex,
22 22 nullid,
23 23 nullrev,
24 24 short,
25 25 )
26 26 from .pycompat import (
27 27 delattr,
28 28 getattr,
29 29 )
30 30 from . import (
31 31 bookmarks,
32 32 branchmap,
33 33 bundle2,
34 34 bundlecaches,
35 35 changegroup,
36 36 color,
37 37 commit,
38 38 context,
39 39 dirstate,
40 40 dirstateguard,
41 41 discovery,
42 42 encoding,
43 43 error,
44 44 exchange,
45 45 extensions,
46 46 filelog,
47 47 hook,
48 48 lock as lockmod,
49 49 match as matchmod,
50 50 mergestate as mergestatemod,
51 51 mergeutil,
52 52 namespaces,
53 53 narrowspec,
54 54 obsolete,
55 55 pathutil,
56 56 phases,
57 57 pushkey,
58 58 pycompat,
59 59 rcutil,
60 60 repoview,
61 61 requirements as requirementsmod,
62 62 revlog,
63 63 revset,
64 64 revsetlang,
65 65 scmutil,
66 66 sparse,
67 67 store as storemod,
68 68 subrepoutil,
69 69 tags as tagsmod,
70 70 transaction,
71 71 txnutil,
72 72 util,
73 73 vfs as vfsmod,
74 74 )
75 75
76 76 from .interfaces import (
77 77 repository,
78 78 util as interfaceutil,
79 79 )
80 80
81 81 from .utils import (
82 82 hashutil,
83 83 procutil,
84 84 stringutil,
85 85 )
86 86
87 87 from .revlogutils import (
88 88 concurrency_checker as revlogchecker,
89 89 constants as revlogconst,
90 90 )
91 91
92 92 release = lockmod.release
93 93 urlerr = util.urlerr
94 94 urlreq = util.urlreq
95 95
96 96 # set of (path, vfs-location) tuples. vfs-location is:
97 97 # - 'plain for vfs relative paths
98 98 # - '' for svfs relative paths
99 99 _cachedfiles = set()
100 100
101 101
102 102 class _basefilecache(scmutil.filecache):
103 103 """All filecache usage on repo are done for logic that should be unfiltered"""
104 104
105 105 def __get__(self, repo, type=None):
106 106 if repo is None:
107 107 return self
108 108 # proxy to unfiltered __dict__ since filtered repo has no entry
109 109 unfi = repo.unfiltered()
110 110 try:
111 111 return unfi.__dict__[self.sname]
112 112 except KeyError:
113 113 pass
114 114 return super(_basefilecache, self).__get__(unfi, type)
115 115
116 116 def set(self, repo, value):
117 117 return super(_basefilecache, self).set(repo.unfiltered(), value)
118 118
119 119
120 120 class repofilecache(_basefilecache):
121 121 """filecache for files in .hg but outside of .hg/store"""
122 122
123 123 def __init__(self, *paths):
124 124 super(repofilecache, self).__init__(*paths)
125 125 for path in paths:
126 126 _cachedfiles.add((path, b'plain'))
127 127
128 128 def join(self, obj, fname):
129 129 return obj.vfs.join(fname)
130 130
131 131
132 132 class storecache(_basefilecache):
133 133 """filecache for files in the store"""
134 134
135 135 def __init__(self, *paths):
136 136 super(storecache, self).__init__(*paths)
137 137 for path in paths:
138 138 _cachedfiles.add((path, b''))
139 139
140 140 def join(self, obj, fname):
141 141 return obj.sjoin(fname)
142 142
143 143
144 144 class mixedrepostorecache(_basefilecache):
145 145 """filecache for a mix files in .hg/store and outside"""
146 146
147 147 def __init__(self, *pathsandlocations):
148 148 # scmutil.filecache only uses the path for passing back into our
149 149 # join(), so we can safely pass a list of paths and locations
150 150 super(mixedrepostorecache, self).__init__(*pathsandlocations)
151 151 _cachedfiles.update(pathsandlocations)
152 152
153 153 def join(self, obj, fnameandlocation):
154 154 fname, location = fnameandlocation
155 155 if location == b'plain':
156 156 return obj.vfs.join(fname)
157 157 else:
158 158 if location != b'':
159 159 raise error.ProgrammingError(
160 160 b'unexpected location: %s' % location
161 161 )
162 162 return obj.sjoin(fname)
163 163
164 164
165 165 def isfilecached(repo, name):
166 166 """check if a repo has already cached "name" filecache-ed property
167 167
168 168 This returns (cachedobj-or-None, iscached) tuple.
169 169 """
170 170 cacheentry = repo.unfiltered()._filecache.get(name, None)
171 171 if not cacheentry:
172 172 return None, False
173 173 return cacheentry.obj, True
174 174
175 175
176 176 class unfilteredpropertycache(util.propertycache):
177 177 """propertycache that apply to unfiltered repo only"""
178 178
179 179 def __get__(self, repo, type=None):
180 180 unfi = repo.unfiltered()
181 181 if unfi is repo:
182 182 return super(unfilteredpropertycache, self).__get__(unfi)
183 183 return getattr(unfi, self.name)
184 184
185 185
186 186 class filteredpropertycache(util.propertycache):
187 187 """propertycache that must take filtering in account"""
188 188
189 189 def cachevalue(self, obj, value):
190 190 object.__setattr__(obj, self.name, value)
191 191
192 192
193 193 def hasunfilteredcache(repo, name):
194 194 """check if a repo has an unfilteredpropertycache value for <name>"""
195 195 return name in vars(repo.unfiltered())
196 196
197 197
198 198 def unfilteredmethod(orig):
199 199 """decorate method that always need to be run on unfiltered version"""
200 200
201 201 @functools.wraps(orig)
202 202 def wrapper(repo, *args, **kwargs):
203 203 return orig(repo.unfiltered(), *args, **kwargs)
204 204
205 205 return wrapper
206 206
207 207
208 208 moderncaps = {
209 209 b'lookup',
210 210 b'branchmap',
211 211 b'pushkey',
212 212 b'known',
213 213 b'getbundle',
214 214 b'unbundle',
215 215 }
216 216 legacycaps = moderncaps.union({b'changegroupsubset'})
217 217
218 218
219 219 @interfaceutil.implementer(repository.ipeercommandexecutor)
220 220 class localcommandexecutor(object):
221 221 def __init__(self, peer):
222 222 self._peer = peer
223 223 self._sent = False
224 224 self._closed = False
225 225
226 226 def __enter__(self):
227 227 return self
228 228
229 229 def __exit__(self, exctype, excvalue, exctb):
230 230 self.close()
231 231
232 232 def callcommand(self, command, args):
233 233 if self._sent:
234 234 raise error.ProgrammingError(
235 235 b'callcommand() cannot be used after sendcommands()'
236 236 )
237 237
238 238 if self._closed:
239 239 raise error.ProgrammingError(
240 240 b'callcommand() cannot be used after close()'
241 241 )
242 242
243 243 # We don't need to support anything fancy. Just call the named
244 244 # method on the peer and return a resolved future.
245 245 fn = getattr(self._peer, pycompat.sysstr(command))
246 246
247 247 f = pycompat.futures.Future()
248 248
249 249 try:
250 250 result = fn(**pycompat.strkwargs(args))
251 251 except Exception:
252 252 pycompat.future_set_exception_info(f, sys.exc_info()[1:])
253 253 else:
254 254 f.set_result(result)
255 255
256 256 return f
257 257
258 258 def sendcommands(self):
259 259 self._sent = True
260 260
261 261 def close(self):
262 262 self._closed = True
263 263
264 264
265 265 @interfaceutil.implementer(repository.ipeercommands)
266 266 class localpeer(repository.peer):
267 267 '''peer for a local repo; reflects only the most recent API'''
268 268
269 269 def __init__(self, repo, caps=None):
270 270 super(localpeer, self).__init__()
271 271
272 272 if caps is None:
273 273 caps = moderncaps.copy()
274 274 self._repo = repo.filtered(b'served')
275 275 self.ui = repo.ui
276 276 self._caps = repo._restrictcapabilities(caps)
277 277
278 278 # Begin of _basepeer interface.
279 279
280 280 def url(self):
281 281 return self._repo.url()
282 282
283 283 def local(self):
284 284 return self._repo
285 285
286 286 def peer(self):
287 287 return self
288 288
289 289 def canpush(self):
290 290 return True
291 291
292 292 def close(self):
293 293 self._repo.close()
294 294
295 295 # End of _basepeer interface.
296 296
297 297 # Begin of _basewirecommands interface.
298 298
299 299 def branchmap(self):
300 300 return self._repo.branchmap()
301 301
302 302 def capabilities(self):
303 303 return self._caps
304 304
305 305 def clonebundles(self):
306 306 return self._repo.tryread(bundlecaches.CB_MANIFEST_FILE)
307 307
308 308 def debugwireargs(self, one, two, three=None, four=None, five=None):
309 309 """Used to test argument passing over the wire"""
310 310 return b"%s %s %s %s %s" % (
311 311 one,
312 312 two,
313 313 pycompat.bytestr(three),
314 314 pycompat.bytestr(four),
315 315 pycompat.bytestr(five),
316 316 )
317 317
318 318 def getbundle(
319 319 self, source, heads=None, common=None, bundlecaps=None, **kwargs
320 320 ):
321 321 chunks = exchange.getbundlechunks(
322 322 self._repo,
323 323 source,
324 324 heads=heads,
325 325 common=common,
326 326 bundlecaps=bundlecaps,
327 327 **kwargs
328 328 )[1]
329 329 cb = util.chunkbuffer(chunks)
330 330
331 331 if exchange.bundle2requested(bundlecaps):
332 332 # When requesting a bundle2, getbundle returns a stream to make the
333 333 # wire level function happier. We need to build a proper object
334 334 # from it in local peer.
335 335 return bundle2.getunbundler(self.ui, cb)
336 336 else:
337 337 return changegroup.getunbundler(b'01', cb, None)
338 338
339 339 def heads(self):
340 340 return self._repo.heads()
341 341
342 342 def known(self, nodes):
343 343 return self._repo.known(nodes)
344 344
345 345 def listkeys(self, namespace):
346 346 return self._repo.listkeys(namespace)
347 347
348 348 def lookup(self, key):
349 349 return self._repo.lookup(key)
350 350
351 351 def pushkey(self, namespace, key, old, new):
352 352 return self._repo.pushkey(namespace, key, old, new)
353 353
354 354 def stream_out(self):
355 355 raise error.Abort(_(b'cannot perform stream clone against local peer'))
356 356
357 357 def unbundle(self, bundle, heads, url):
358 358 """apply a bundle on a repo
359 359
360 360 This function handles the repo locking itself."""
361 361 try:
362 362 try:
363 363 bundle = exchange.readbundle(self.ui, bundle, None)
364 364 ret = exchange.unbundle(self._repo, bundle, heads, b'push', url)
365 365 if util.safehasattr(ret, b'getchunks'):
366 366 # This is a bundle20 object, turn it into an unbundler.
367 367 # This little dance should be dropped eventually when the
368 368 # API is finally improved.
369 369 stream = util.chunkbuffer(ret.getchunks())
370 370 ret = bundle2.getunbundler(self.ui, stream)
371 371 return ret
372 372 except Exception as exc:
373 373 # If the exception contains output salvaged from a bundle2
374 374 # reply, we need to make sure it is printed before continuing
375 375 # to fail. So we build a bundle2 with such output and consume
376 376 # it directly.
377 377 #
378 378 # This is not very elegant but allows a "simple" solution for
379 379 # issue4594
380 380 output = getattr(exc, '_bundle2salvagedoutput', ())
381 381 if output:
382 382 bundler = bundle2.bundle20(self._repo.ui)
383 383 for out in output:
384 384 bundler.addpart(out)
385 385 stream = util.chunkbuffer(bundler.getchunks())
386 386 b = bundle2.getunbundler(self.ui, stream)
387 387 bundle2.processbundle(self._repo, b)
388 388 raise
389 389 except error.PushRaced as exc:
390 390 raise error.ResponseError(
391 391 _(b'push failed:'), stringutil.forcebytestr(exc)
392 392 )
393 393
394 394 # End of _basewirecommands interface.
395 395
396 396 # Begin of peer interface.
397 397
398 398 def commandexecutor(self):
399 399 return localcommandexecutor(self)
400 400
401 401 # End of peer interface.
402 402
403 403
404 404 @interfaceutil.implementer(repository.ipeerlegacycommands)
405 405 class locallegacypeer(localpeer):
406 406 """peer extension which implements legacy methods too; used for tests with
407 407 restricted capabilities"""
408 408
409 409 def __init__(self, repo):
410 410 super(locallegacypeer, self).__init__(repo, caps=legacycaps)
411 411
412 412 # Begin of baselegacywirecommands interface.
413 413
414 414 def between(self, pairs):
415 415 return self._repo.between(pairs)
416 416
417 417 def branches(self, nodes):
418 418 return self._repo.branches(nodes)
419 419
420 420 def changegroup(self, nodes, source):
421 421 outgoing = discovery.outgoing(
422 422 self._repo, missingroots=nodes, ancestorsof=self._repo.heads()
423 423 )
424 424 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
425 425
426 426 def changegroupsubset(self, bases, heads, source):
427 427 outgoing = discovery.outgoing(
428 428 self._repo, missingroots=bases, ancestorsof=heads
429 429 )
430 430 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
431 431
432 432 # End of baselegacywirecommands interface.
433 433
434 434
435 435 # Functions receiving (ui, features) that extensions can register to impact
436 436 # the ability to load repositories with custom requirements. Only
437 437 # functions defined in loaded extensions are called.
438 438 #
439 439 # The function receives a set of requirement strings that the repository
440 440 # is capable of opening. Functions will typically add elements to the
441 441 # set to reflect that the extension knows how to handle that requirements.
442 442 featuresetupfuncs = set()
443 443
444 444
445 445 def _getsharedvfs(hgvfs, requirements):
446 446 """returns the vfs object pointing to root of shared source
447 447 repo for a shared repository
448 448
449 449 hgvfs is vfs pointing at .hg/ of current repo (shared one)
450 450 requirements is a set of requirements of current repo (shared one)
451 451 """
452 452 # The ``shared`` or ``relshared`` requirements indicate the
453 453 # store lives in the path contained in the ``.hg/sharedpath`` file.
454 454 # This is an absolute path for ``shared`` and relative to
455 455 # ``.hg/`` for ``relshared``.
456 456 sharedpath = hgvfs.read(b'sharedpath').rstrip(b'\n')
457 457 if requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements:
458 458 sharedpath = hgvfs.join(sharedpath)
459 459
460 460 sharedvfs = vfsmod.vfs(sharedpath, realpath=True)
461 461
462 462 if not sharedvfs.exists():
463 463 raise error.RepoError(
464 464 _(b'.hg/sharedpath points to nonexistent directory %s')
465 465 % sharedvfs.base
466 466 )
467 467 return sharedvfs
468 468
469 469
470 470 def _readrequires(vfs, allowmissing):
471 471 """reads the require file present at root of this vfs
472 472 and return a set of requirements
473 473
474 474 If allowmissing is True, we suppress ENOENT if raised"""
475 475 # requires file contains a newline-delimited list of
476 476 # features/capabilities the opener (us) must have in order to use
477 477 # the repository. This file was introduced in Mercurial 0.9.2,
478 478 # which means very old repositories may not have one. We assume
479 479 # a missing file translates to no requirements.
480 480 try:
481 481 requirements = set(vfs.read(b'requires').splitlines())
482 482 except IOError as e:
483 483 if not (allowmissing and e.errno == errno.ENOENT):
484 484 raise
485 485 requirements = set()
486 486 return requirements
487 487
488 488
489 489 def makelocalrepository(baseui, path, intents=None):
490 490 """Create a local repository object.
491 491
492 492 Given arguments needed to construct a local repository, this function
493 493 performs various early repository loading functionality (such as
494 494 reading the ``.hg/requires`` and ``.hg/hgrc`` files), validates that
495 495 the repository can be opened, derives a type suitable for representing
496 496 that repository, and returns an instance of it.
497 497
498 498 The returned object conforms to the ``repository.completelocalrepository``
499 499 interface.
500 500
501 501 The repository type is derived by calling a series of factory functions
502 502 for each aspect/interface of the final repository. These are defined by
503 503 ``REPO_INTERFACES``.
504 504
505 505 Each factory function is called to produce a type implementing a specific
506 506 interface. The cumulative list of returned types will be combined into a
507 507 new type and that type will be instantiated to represent the local
508 508 repository.
509 509
510 510 The factory functions each receive various state that may be consulted
511 511 as part of deriving a type.
512 512
513 513 Extensions should wrap these factory functions to customize repository type
514 514 creation. Note that an extension's wrapped function may be called even if
515 515 that extension is not loaded for the repo being constructed. Extensions
516 516 should check if their ``__name__`` appears in the
517 517 ``extensionmodulenames`` set passed to the factory function and no-op if
518 518 not.
519 519 """
520 520 ui = baseui.copy()
521 521 # Prevent copying repo configuration.
522 522 ui.copy = baseui.copy
523 523
524 524 # Working directory VFS rooted at repository root.
525 525 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
526 526
527 527 # Main VFS for .hg/ directory.
528 528 hgpath = wdirvfs.join(b'.hg')
529 529 hgvfs = vfsmod.vfs(hgpath, cacheaudited=True)
530 530 # Whether this repository is shared one or not
531 531 shared = False
532 532 # If this repository is shared, vfs pointing to shared repo
533 533 sharedvfs = None
534 534
535 535 # The .hg/ path should exist and should be a directory. All other
536 536 # cases are errors.
537 537 if not hgvfs.isdir():
538 538 try:
539 539 hgvfs.stat()
540 540 except OSError as e:
541 541 if e.errno != errno.ENOENT:
542 542 raise
543 543 except ValueError as e:
544 544 # Can be raised on Python 3.8 when path is invalid.
545 545 raise error.Abort(
546 _(b'invalid path %s: %s') % (path, pycompat.bytestr(e))
546 _(b'invalid path %s: %s') % (path, stringutil.forcebytestr(e))
547 547 )
548 548
549 549 raise error.RepoError(_(b'repository %s not found') % path)
550 550
551 551 requirements = _readrequires(hgvfs, True)
552 552 shared = (
553 553 requirementsmod.SHARED_REQUIREMENT in requirements
554 554 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
555 555 )
556 556 storevfs = None
557 557 if shared:
558 558 # This is a shared repo
559 559 sharedvfs = _getsharedvfs(hgvfs, requirements)
560 560 storevfs = vfsmod.vfs(sharedvfs.join(b'store'))
561 561 else:
562 562 storevfs = vfsmod.vfs(hgvfs.join(b'store'))
563 563
564 564 # if .hg/requires contains the sharesafe requirement, it means
565 565 # there exists a `.hg/store/requires` too and we should read it
566 566 # NOTE: presence of SHARESAFE_REQUIREMENT imply that store requirement
567 567 # is present. We never write SHARESAFE_REQUIREMENT for a repo if store
568 568 # is not present, refer checkrequirementscompat() for that
569 569 #
570 570 # However, if SHARESAFE_REQUIREMENT is not present, it means that the
571 571 # repository was shared the old way. We check the share source .hg/requires
572 572 # for SHARESAFE_REQUIREMENT to detect whether the current repository needs
573 573 # to be reshared
574 hint = _("see `hg help config.format.use-share-safe` for more information")
574 hint = _(b"see `hg help config.format.use-share-safe` for more information")
575 575 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
576 576
577 577 if (
578 578 shared
579 579 and requirementsmod.SHARESAFE_REQUIREMENT
580 580 not in _readrequires(sharedvfs, True)
581 581 ):
582 582 mismatch_warn = ui.configbool(
583 583 b'share', b'safe-mismatch.source-not-safe.warn'
584 584 )
585 585 mismatch_config = ui.config(
586 586 b'share', b'safe-mismatch.source-not-safe'
587 587 )
588 588 if mismatch_config in (
589 589 b'downgrade-allow',
590 590 b'allow',
591 591 b'downgrade-abort',
592 592 ):
593 593 # prevent cyclic import localrepo -> upgrade -> localrepo
594 594 from . import upgrade
595 595
596 596 upgrade.downgrade_share_to_non_safe(
597 597 ui,
598 598 hgvfs,
599 599 sharedvfs,
600 600 requirements,
601 601 mismatch_config,
602 602 mismatch_warn,
603 603 )
604 604 elif mismatch_config == b'abort':
605 605 raise error.Abort(
606 606 _(b"share source does not support share-safe requirement"),
607 607 hint=hint,
608 608 )
609 609 else:
610 610 raise error.Abort(
611 611 _(
612 612 b"share-safe mismatch with source.\nUnrecognized"
613 613 b" value '%s' of `share.safe-mismatch.source-not-safe`"
614 614 b" set."
615 615 )
616 616 % mismatch_config,
617 617 hint=hint,
618 618 )
619 619 else:
620 620 requirements |= _readrequires(storevfs, False)
621 621 elif shared:
622 622 sourcerequires = _readrequires(sharedvfs, False)
623 623 if requirementsmod.SHARESAFE_REQUIREMENT in sourcerequires:
624 624 mismatch_config = ui.config(b'share', b'safe-mismatch.source-safe')
625 625 mismatch_warn = ui.configbool(
626 626 b'share', b'safe-mismatch.source-safe.warn'
627 627 )
628 628 if mismatch_config in (
629 629 b'upgrade-allow',
630 630 b'allow',
631 631 b'upgrade-abort',
632 632 ):
633 633 # prevent cyclic import localrepo -> upgrade -> localrepo
634 634 from . import upgrade
635 635
636 636 upgrade.upgrade_share_to_safe(
637 637 ui,
638 638 hgvfs,
639 639 storevfs,
640 640 requirements,
641 641 mismatch_config,
642 642 mismatch_warn,
643 643 )
644 644 elif mismatch_config == b'abort':
645 645 raise error.Abort(
646 646 _(
647 647 b'version mismatch: source uses share-safe'
648 648 b' functionality while the current share does not'
649 649 ),
650 650 hint=hint,
651 651 )
652 652 else:
653 653 raise error.Abort(
654 654 _(
655 655 b"share-safe mismatch with source.\nUnrecognized"
656 656 b" value '%s' of `share.safe-mismatch.source-safe` set."
657 657 )
658 658 % mismatch_config,
659 659 hint=hint,
660 660 )
661 661
662 662 # The .hg/hgrc file may load extensions or contain config options
663 663 # that influence repository construction. Attempt to load it and
664 664 # process any new extensions that it may have pulled in.
665 665 if loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs):
666 666 afterhgrcload(ui, wdirvfs, hgvfs, requirements)
667 667 extensions.loadall(ui)
668 668 extensions.populateui(ui)
669 669
670 670 # Set of module names of extensions loaded for this repository.
671 671 extensionmodulenames = {m.__name__ for n, m in extensions.extensions(ui)}
672 672
673 673 supportedrequirements = gathersupportedrequirements(ui)
674 674
675 675 # We first validate the requirements are known.
676 676 ensurerequirementsrecognized(requirements, supportedrequirements)
677 677
678 678 # Then we validate that the known set is reasonable to use together.
679 679 ensurerequirementscompatible(ui, requirements)
680 680
681 681 # TODO there are unhandled edge cases related to opening repositories with
682 682 # shared storage. If storage is shared, we should also test for requirements
683 683 # compatibility in the pointed-to repo. This entails loading the .hg/hgrc in
684 684 # that repo, as that repo may load extensions needed to open it. This is a
685 685 # bit complicated because we don't want the other hgrc to overwrite settings
686 686 # in this hgrc.
687 687 #
688 688 # This bug is somewhat mitigated by the fact that we copy the .hg/requires
689 689 # file when sharing repos. But if a requirement is added after the share is
690 690 # performed, thereby introducing a new requirement for the opener, we may
691 691 # will not see that and could encounter a run-time error interacting with
692 692 # that shared store since it has an unknown-to-us requirement.
693 693
694 694 # At this point, we know we should be capable of opening the repository.
695 695 # Now get on with doing that.
696 696
697 697 features = set()
698 698
699 699 # The "store" part of the repository holds versioned data. How it is
700 700 # accessed is determined by various requirements. If `shared` or
701 701 # `relshared` requirements are present, this indicates current repository
702 702 # is a share and store exists in path mentioned in `.hg/sharedpath`
703 703 if shared:
704 704 storebasepath = sharedvfs.base
705 705 cachepath = sharedvfs.join(b'cache')
706 706 features.add(repository.REPO_FEATURE_SHARED_STORAGE)
707 707 else:
708 708 storebasepath = hgvfs.base
709 709 cachepath = hgvfs.join(b'cache')
710 710 wcachepath = hgvfs.join(b'wcache')
711 711
712 712 # The store has changed over time and the exact layout is dictated by
713 713 # requirements. The store interface abstracts differences across all
714 714 # of them.
715 715 store = makestore(
716 716 requirements,
717 717 storebasepath,
718 718 lambda base: vfsmod.vfs(base, cacheaudited=True),
719 719 )
720 720 hgvfs.createmode = store.createmode
721 721
722 722 storevfs = store.vfs
723 723 storevfs.options = resolvestorevfsoptions(ui, requirements, features)
724 724
725 725 # The cache vfs is used to manage cache files.
726 726 cachevfs = vfsmod.vfs(cachepath, cacheaudited=True)
727 727 cachevfs.createmode = store.createmode
728 728 # The cache vfs is used to manage cache files related to the working copy
729 729 wcachevfs = vfsmod.vfs(wcachepath, cacheaudited=True)
730 730 wcachevfs.createmode = store.createmode
731 731
732 732 # Now resolve the type for the repository object. We do this by repeatedly
733 733 # calling a factory function to produces types for specific aspects of the
734 734 # repo's operation. The aggregate returned types are used as base classes
735 735 # for a dynamically-derived type, which will represent our new repository.
736 736
737 737 bases = []
738 738 extrastate = {}
739 739
740 740 for iface, fn in REPO_INTERFACES:
741 741 # We pass all potentially useful state to give extensions tons of
742 742 # flexibility.
743 743 typ = fn()(
744 744 ui=ui,
745 745 intents=intents,
746 746 requirements=requirements,
747 747 features=features,
748 748 wdirvfs=wdirvfs,
749 749 hgvfs=hgvfs,
750 750 store=store,
751 751 storevfs=storevfs,
752 752 storeoptions=storevfs.options,
753 753 cachevfs=cachevfs,
754 754 wcachevfs=wcachevfs,
755 755 extensionmodulenames=extensionmodulenames,
756 756 extrastate=extrastate,
757 757 baseclasses=bases,
758 758 )
759 759
760 760 if not isinstance(typ, type):
761 761 raise error.ProgrammingError(
762 762 b'unable to construct type for %s' % iface
763 763 )
764 764
765 765 bases.append(typ)
766 766
767 767 # type() allows you to use characters in type names that wouldn't be
768 768 # recognized as Python symbols in source code. We abuse that to add
769 769 # rich information about our constructed repo.
770 770 name = pycompat.sysstr(
771 771 b'derivedrepo:%s<%s>' % (wdirvfs.base, b','.join(sorted(requirements)))
772 772 )
773 773
774 774 cls = type(name, tuple(bases), {})
775 775
776 776 return cls(
777 777 baseui=baseui,
778 778 ui=ui,
779 779 origroot=path,
780 780 wdirvfs=wdirvfs,
781 781 hgvfs=hgvfs,
782 782 requirements=requirements,
783 783 supportedrequirements=supportedrequirements,
784 784 sharedpath=storebasepath,
785 785 store=store,
786 786 cachevfs=cachevfs,
787 787 wcachevfs=wcachevfs,
788 788 features=features,
789 789 intents=intents,
790 790 )
791 791
792 792
793 793 def loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs=None):
794 794 """Load hgrc files/content into a ui instance.
795 795
796 796 This is called during repository opening to load any additional
797 797 config files or settings relevant to the current repository.
798 798
799 799 Returns a bool indicating whether any additional configs were loaded.
800 800
801 801 Extensions should monkeypatch this function to modify how per-repo
802 802 configs are loaded. For example, an extension may wish to pull in
803 803 configs from alternate files or sources.
804 804
805 805 sharedvfs is vfs object pointing to source repo if the current one is a
806 806 shared one
807 807 """
808 808 if not rcutil.use_repo_hgrc():
809 809 return False
810 810
811 811 ret = False
812 812 # first load config from shared source if we has to
813 813 if requirementsmod.SHARESAFE_REQUIREMENT in requirements and sharedvfs:
814 814 try:
815 815 ui.readconfig(sharedvfs.join(b'hgrc'), root=sharedvfs.base)
816 816 ret = True
817 817 except IOError:
818 818 pass
819 819
820 820 try:
821 821 ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base)
822 822 ret = True
823 823 except IOError:
824 824 pass
825 825
826 826 try:
827 827 ui.readconfig(hgvfs.join(b'hgrc-not-shared'), root=wdirvfs.base)
828 828 ret = True
829 829 except IOError:
830 830 pass
831 831
832 832 return ret
833 833
834 834
835 835 def afterhgrcload(ui, wdirvfs, hgvfs, requirements):
836 836 """Perform additional actions after .hg/hgrc is loaded.
837 837
838 838 This function is called during repository loading immediately after
839 839 the .hg/hgrc file is loaded and before per-repo extensions are loaded.
840 840
841 841 The function can be used to validate configs, automatically add
842 842 options (including extensions) based on requirements, etc.
843 843 """
844 844
845 845 # Map of requirements to list of extensions to load automatically when
846 846 # requirement is present.
847 847 autoextensions = {
848 848 b'git': [b'git'],
849 849 b'largefiles': [b'largefiles'],
850 850 b'lfs': [b'lfs'],
851 851 }
852 852
853 853 for requirement, names in sorted(autoextensions.items()):
854 854 if requirement not in requirements:
855 855 continue
856 856
857 857 for name in names:
858 858 if not ui.hasconfig(b'extensions', name):
859 859 ui.setconfig(b'extensions', name, b'', source=b'autoload')
860 860
861 861
862 862 def gathersupportedrequirements(ui):
863 863 """Determine the complete set of recognized requirements."""
864 864 # Start with all requirements supported by this file.
865 865 supported = set(localrepository._basesupported)
866 866
867 867 # Execute ``featuresetupfuncs`` entries if they belong to an extension
868 868 # relevant to this ui instance.
869 869 modules = {m.__name__ for n, m in extensions.extensions(ui)}
870 870
871 871 for fn in featuresetupfuncs:
872 872 if fn.__module__ in modules:
873 873 fn(ui, supported)
874 874
875 875 # Add derived requirements from registered compression engines.
876 876 for name in util.compengines:
877 877 engine = util.compengines[name]
878 878 if engine.available() and engine.revlogheader():
879 879 supported.add(b'exp-compression-%s' % name)
880 880 if engine.name() == b'zstd':
881 881 supported.add(b'revlog-compression-zstd')
882 882
883 883 return supported
884 884
885 885
886 886 def ensurerequirementsrecognized(requirements, supported):
887 887 """Validate that a set of local requirements is recognized.
888 888
889 889 Receives a set of requirements. Raises an ``error.RepoError`` if there
890 890 exists any requirement in that set that currently loaded code doesn't
891 891 recognize.
892 892
893 893 Returns a set of supported requirements.
894 894 """
895 895 missing = set()
896 896
897 897 for requirement in requirements:
898 898 if requirement in supported:
899 899 continue
900 900
901 901 if not requirement or not requirement[0:1].isalnum():
902 902 raise error.RequirementError(_(b'.hg/requires file is corrupt'))
903 903
904 904 missing.add(requirement)
905 905
906 906 if missing:
907 907 raise error.RequirementError(
908 908 _(b'repository requires features unknown to this Mercurial: %s')
909 909 % b' '.join(sorted(missing)),
910 910 hint=_(
911 911 b'see https://mercurial-scm.org/wiki/MissingRequirement '
912 912 b'for more information'
913 913 ),
914 914 )
915 915
916 916
917 917 def ensurerequirementscompatible(ui, requirements):
918 918 """Validates that a set of recognized requirements is mutually compatible.
919 919
920 920 Some requirements may not be compatible with others or require
921 921 config options that aren't enabled. This function is called during
922 922 repository opening to ensure that the set of requirements needed
923 923 to open a repository is sane and compatible with config options.
924 924
925 925 Extensions can monkeypatch this function to perform additional
926 926 checking.
927 927
928 928 ``error.RepoError`` should be raised on failure.
929 929 """
930 930 if (
931 931 requirementsmod.SPARSE_REQUIREMENT in requirements
932 932 and not sparse.enabled
933 933 ):
934 934 raise error.RepoError(
935 935 _(
936 936 b'repository is using sparse feature but '
937 937 b'sparse is not enabled; enable the '
938 938 b'"sparse" extensions to access'
939 939 )
940 940 )
941 941
942 942
943 943 def makestore(requirements, path, vfstype):
944 944 """Construct a storage object for a repository."""
945 945 if requirementsmod.STORE_REQUIREMENT in requirements:
946 946 if requirementsmod.FNCACHE_REQUIREMENT in requirements:
947 947 dotencode = requirementsmod.DOTENCODE_REQUIREMENT in requirements
948 948 return storemod.fncachestore(path, vfstype, dotencode)
949 949
950 950 return storemod.encodedstore(path, vfstype)
951 951
952 952 return storemod.basicstore(path, vfstype)
953 953
954 954
955 955 def resolvestorevfsoptions(ui, requirements, features):
956 956 """Resolve the options to pass to the store vfs opener.
957 957
958 958 The returned dict is used to influence behavior of the storage layer.
959 959 """
960 960 options = {}
961 961
962 962 if requirementsmod.TREEMANIFEST_REQUIREMENT in requirements:
963 963 options[b'treemanifest'] = True
964 964
965 965 # experimental config: format.manifestcachesize
966 966 manifestcachesize = ui.configint(b'format', b'manifestcachesize')
967 967 if manifestcachesize is not None:
968 968 options[b'manifestcachesize'] = manifestcachesize
969 969
970 970 # In the absence of another requirement superseding a revlog-related
971 971 # requirement, we have to assume the repo is using revlog version 0.
972 972 # This revlog format is super old and we don't bother trying to parse
973 973 # opener options for it because those options wouldn't do anything
974 974 # meaningful on such old repos.
975 975 if (
976 976 requirementsmod.REVLOGV1_REQUIREMENT in requirements
977 977 or requirementsmod.REVLOGV2_REQUIREMENT in requirements
978 978 ):
979 979 options.update(resolverevlogstorevfsoptions(ui, requirements, features))
980 980 else: # explicitly mark repo as using revlogv0
981 981 options[b'revlogv0'] = True
982 982
983 983 if requirementsmod.COPIESSDC_REQUIREMENT in requirements:
984 984 options[b'copies-storage'] = b'changeset-sidedata'
985 985 else:
986 986 writecopiesto = ui.config(b'experimental', b'copies.write-to')
987 987 copiesextramode = (b'changeset-only', b'compatibility')
988 988 if writecopiesto in copiesextramode:
989 989 options[b'copies-storage'] = b'extra'
990 990
991 991 return options
992 992
993 993
994 994 def resolverevlogstorevfsoptions(ui, requirements, features):
995 995 """Resolve opener options specific to revlogs."""
996 996
997 997 options = {}
998 998 options[b'flagprocessors'] = {}
999 999
1000 1000 if requirementsmod.REVLOGV1_REQUIREMENT in requirements:
1001 1001 options[b'revlogv1'] = True
1002 1002 if requirementsmod.REVLOGV2_REQUIREMENT in requirements:
1003 1003 options[b'revlogv2'] = True
1004 1004
1005 1005 if requirementsmod.GENERALDELTA_REQUIREMENT in requirements:
1006 1006 options[b'generaldelta'] = True
1007 1007
1008 1008 # experimental config: format.chunkcachesize
1009 1009 chunkcachesize = ui.configint(b'format', b'chunkcachesize')
1010 1010 if chunkcachesize is not None:
1011 1011 options[b'chunkcachesize'] = chunkcachesize
1012 1012
1013 1013 deltabothparents = ui.configbool(
1014 1014 b'storage', b'revlog.optimize-delta-parent-choice'
1015 1015 )
1016 1016 options[b'deltabothparents'] = deltabothparents
1017 1017
1018 1018 lazydelta = ui.configbool(b'storage', b'revlog.reuse-external-delta')
1019 1019 lazydeltabase = False
1020 1020 if lazydelta:
1021 1021 lazydeltabase = ui.configbool(
1022 1022 b'storage', b'revlog.reuse-external-delta-parent'
1023 1023 )
1024 1024 if lazydeltabase is None:
1025 1025 lazydeltabase = not scmutil.gddeltaconfig(ui)
1026 1026 options[b'lazydelta'] = lazydelta
1027 1027 options[b'lazydeltabase'] = lazydeltabase
1028 1028
1029 1029 chainspan = ui.configbytes(b'experimental', b'maxdeltachainspan')
1030 1030 if 0 <= chainspan:
1031 1031 options[b'maxdeltachainspan'] = chainspan
1032 1032
1033 1033 mmapindexthreshold = ui.configbytes(b'experimental', b'mmapindexthreshold')
1034 1034 if mmapindexthreshold is not None:
1035 1035 options[b'mmapindexthreshold'] = mmapindexthreshold
1036 1036
1037 1037 withsparseread = ui.configbool(b'experimental', b'sparse-read')
1038 1038 srdensitythres = float(
1039 1039 ui.config(b'experimental', b'sparse-read.density-threshold')
1040 1040 )
1041 1041 srmingapsize = ui.configbytes(b'experimental', b'sparse-read.min-gap-size')
1042 1042 options[b'with-sparse-read'] = withsparseread
1043 1043 options[b'sparse-read-density-threshold'] = srdensitythres
1044 1044 options[b'sparse-read-min-gap-size'] = srmingapsize
1045 1045
1046 1046 sparserevlog = requirementsmod.SPARSEREVLOG_REQUIREMENT in requirements
1047 1047 options[b'sparse-revlog'] = sparserevlog
1048 1048 if sparserevlog:
1049 1049 options[b'generaldelta'] = True
1050 1050
1051 1051 sidedata = requirementsmod.SIDEDATA_REQUIREMENT in requirements
1052 1052 options[b'side-data'] = sidedata
1053 1053
1054 1054 maxchainlen = None
1055 1055 if sparserevlog:
1056 1056 maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
1057 1057 # experimental config: format.maxchainlen
1058 1058 maxchainlen = ui.configint(b'format', b'maxchainlen', maxchainlen)
1059 1059 if maxchainlen is not None:
1060 1060 options[b'maxchainlen'] = maxchainlen
1061 1061
1062 1062 for r in requirements:
1063 1063 # we allow multiple compression engine requirement to co-exist because
1064 1064 # strickly speaking, revlog seems to support mixed compression style.
1065 1065 #
1066 1066 # The compression used for new entries will be "the last one"
1067 1067 prefix = r.startswith
1068 1068 if prefix(b'revlog-compression-') or prefix(b'exp-compression-'):
1069 1069 options[b'compengine'] = r.split(b'-', 2)[2]
1070 1070
1071 1071 options[b'zlib.level'] = ui.configint(b'storage', b'revlog.zlib.level')
1072 1072 if options[b'zlib.level'] is not None:
1073 1073 if not (0 <= options[b'zlib.level'] <= 9):
1074 1074 msg = _(b'invalid value for `storage.revlog.zlib.level` config: %d')
1075 1075 raise error.Abort(msg % options[b'zlib.level'])
1076 1076 options[b'zstd.level'] = ui.configint(b'storage', b'revlog.zstd.level')
1077 1077 if options[b'zstd.level'] is not None:
1078 1078 if not (0 <= options[b'zstd.level'] <= 22):
1079 1079 msg = _(b'invalid value for `storage.revlog.zstd.level` config: %d')
1080 1080 raise error.Abort(msg % options[b'zstd.level'])
1081 1081
1082 1082 if requirementsmod.NARROW_REQUIREMENT in requirements:
1083 1083 options[b'enableellipsis'] = True
1084 1084
1085 1085 if ui.configbool(b'experimental', b'rust.index'):
1086 1086 options[b'rust.index'] = True
1087 1087 if requirementsmod.NODEMAP_REQUIREMENT in requirements:
1088 1088 slow_path = ui.config(
1089 1089 b'storage', b'revlog.persistent-nodemap.slow-path'
1090 1090 )
1091 1091 if slow_path not in (b'allow', b'warn', b'abort'):
1092 1092 default = ui.config_default(
1093 1093 b'storage', b'revlog.persistent-nodemap.slow-path'
1094 1094 )
1095 1095 msg = _(
1096 1096 b'unknown value for config '
1097 1097 b'"storage.revlog.persistent-nodemap.slow-path": "%s"\n'
1098 1098 )
1099 1099 ui.warn(msg % slow_path)
1100 1100 if not ui.quiet:
1101 1101 ui.warn(_(b'falling back to default value: %s\n') % default)
1102 1102 slow_path = default
1103 1103
1104 1104 msg = _(
1105 1105 b"accessing `persistent-nodemap` repository without associated "
1106 1106 b"fast implementation."
1107 1107 )
1108 1108 hint = _(
1109 1109 b"check `hg help config.format.use-persistent-nodemap` "
1110 1110 b"for details"
1111 1111 )
1112 1112 if not revlog.HAS_FAST_PERSISTENT_NODEMAP:
1113 1113 if slow_path == b'warn':
1114 1114 msg = b"warning: " + msg + b'\n'
1115 1115 ui.warn(msg)
1116 1116 if not ui.quiet:
1117 1117 hint = b'(' + hint + b')\n'
1118 1118 ui.warn(hint)
1119 1119 if slow_path == b'abort':
1120 1120 raise error.Abort(msg, hint=hint)
1121 1121 options[b'persistent-nodemap'] = True
1122 1122 if ui.configbool(b'storage', b'revlog.persistent-nodemap.mmap'):
1123 1123 options[b'persistent-nodemap.mmap'] = True
1124 1124 if ui.configbool(b'devel', b'persistent-nodemap'):
1125 1125 options[b'devel-force-nodemap'] = True
1126 1126
1127 1127 return options
1128 1128
1129 1129
1130 1130 def makemain(**kwargs):
1131 1131 """Produce a type conforming to ``ilocalrepositorymain``."""
1132 1132 return localrepository
1133 1133
1134 1134
1135 1135 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
1136 1136 class revlogfilestorage(object):
1137 1137 """File storage when using revlogs."""
1138 1138
1139 1139 def file(self, path):
1140 if path[0] == b'/':
1140 if path.startswith(b'/'):
1141 1141 path = path[1:]
1142 1142
1143 1143 return filelog.filelog(self.svfs, path)
1144 1144
1145 1145
1146 1146 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
1147 1147 class revlognarrowfilestorage(object):
1148 1148 """File storage when using revlogs and narrow files."""
1149 1149
1150 1150 def file(self, path):
1151 if path[0] == b'/':
1151 if path.startswith(b'/'):
1152 1152 path = path[1:]
1153 1153
1154 1154 return filelog.narrowfilelog(self.svfs, path, self._storenarrowmatch)
1155 1155
1156 1156
1157 1157 def makefilestorage(requirements, features, **kwargs):
1158 1158 """Produce a type conforming to ``ilocalrepositoryfilestorage``."""
1159 1159 features.add(repository.REPO_FEATURE_REVLOG_FILE_STORAGE)
1160 1160 features.add(repository.REPO_FEATURE_STREAM_CLONE)
1161 1161
1162 1162 if requirementsmod.NARROW_REQUIREMENT in requirements:
1163 1163 return revlognarrowfilestorage
1164 1164 else:
1165 1165 return revlogfilestorage
1166 1166
1167 1167
1168 1168 # List of repository interfaces and factory functions for them. Each
1169 1169 # will be called in order during ``makelocalrepository()`` to iteratively
1170 1170 # derive the final type for a local repository instance. We capture the
1171 1171 # function as a lambda so we don't hold a reference and the module-level
1172 1172 # functions can be wrapped.
1173 1173 REPO_INTERFACES = [
1174 1174 (repository.ilocalrepositorymain, lambda: makemain),
1175 1175 (repository.ilocalrepositoryfilestorage, lambda: makefilestorage),
1176 1176 ]
1177 1177
1178 1178
1179 1179 @interfaceutil.implementer(repository.ilocalrepositorymain)
1180 1180 class localrepository(object):
1181 1181 """Main class for representing local repositories.
1182 1182
1183 1183 All local repositories are instances of this class.
1184 1184
1185 1185 Constructed on its own, instances of this class are not usable as
1186 1186 repository objects. To obtain a usable repository object, call
1187 1187 ``hg.repository()``, ``localrepo.instance()``, or
1188 1188 ``localrepo.makelocalrepository()``. The latter is the lowest-level.
1189 1189 ``instance()`` adds support for creating new repositories.
1190 1190 ``hg.repository()`` adds more extension integration, including calling
1191 1191 ``reposetup()``. Generally speaking, ``hg.repository()`` should be
1192 1192 used.
1193 1193 """
1194 1194
1195 1195 # obsolete experimental requirements:
1196 1196 # - manifestv2: An experimental new manifest format that allowed
1197 1197 # for stem compression of long paths. Experiment ended up not
1198 1198 # being successful (repository sizes went up due to worse delta
1199 1199 # chains), and the code was deleted in 4.6.
1200 1200 supportedformats = {
1201 1201 requirementsmod.REVLOGV1_REQUIREMENT,
1202 1202 requirementsmod.GENERALDELTA_REQUIREMENT,
1203 1203 requirementsmod.TREEMANIFEST_REQUIREMENT,
1204 1204 requirementsmod.COPIESSDC_REQUIREMENT,
1205 1205 requirementsmod.REVLOGV2_REQUIREMENT,
1206 1206 requirementsmod.SIDEDATA_REQUIREMENT,
1207 1207 requirementsmod.SPARSEREVLOG_REQUIREMENT,
1208 1208 requirementsmod.NODEMAP_REQUIREMENT,
1209 1209 bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
1210 1210 requirementsmod.SHARESAFE_REQUIREMENT,
1211 1211 }
1212 1212 _basesupported = supportedformats | {
1213 1213 requirementsmod.STORE_REQUIREMENT,
1214 1214 requirementsmod.FNCACHE_REQUIREMENT,
1215 1215 requirementsmod.SHARED_REQUIREMENT,
1216 1216 requirementsmod.RELATIVE_SHARED_REQUIREMENT,
1217 1217 requirementsmod.DOTENCODE_REQUIREMENT,
1218 1218 requirementsmod.SPARSE_REQUIREMENT,
1219 1219 requirementsmod.INTERNAL_PHASE_REQUIREMENT,
1220 1220 }
1221 1221
1222 1222 # list of prefix for file which can be written without 'wlock'
1223 1223 # Extensions should extend this list when needed
1224 1224 _wlockfreeprefix = {
1225 1225 # We migh consider requiring 'wlock' for the next
1226 1226 # two, but pretty much all the existing code assume
1227 1227 # wlock is not needed so we keep them excluded for
1228 1228 # now.
1229 1229 b'hgrc',
1230 1230 b'requires',
1231 1231 # XXX cache is a complicatged business someone
1232 1232 # should investigate this in depth at some point
1233 1233 b'cache/',
1234 1234 # XXX shouldn't be dirstate covered by the wlock?
1235 1235 b'dirstate',
1236 1236 # XXX bisect was still a bit too messy at the time
1237 1237 # this changeset was introduced. Someone should fix
1238 1238 # the remainig bit and drop this line
1239 1239 b'bisect.state',
1240 1240 }
1241 1241
1242 1242 def __init__(
1243 1243 self,
1244 1244 baseui,
1245 1245 ui,
1246 1246 origroot,
1247 1247 wdirvfs,
1248 1248 hgvfs,
1249 1249 requirements,
1250 1250 supportedrequirements,
1251 1251 sharedpath,
1252 1252 store,
1253 1253 cachevfs,
1254 1254 wcachevfs,
1255 1255 features,
1256 1256 intents=None,
1257 1257 ):
1258 1258 """Create a new local repository instance.
1259 1259
1260 1260 Most callers should use ``hg.repository()``, ``localrepo.instance()``,
1261 1261 or ``localrepo.makelocalrepository()`` for obtaining a new repository
1262 1262 object.
1263 1263
1264 1264 Arguments:
1265 1265
1266 1266 baseui
1267 1267 ``ui.ui`` instance that ``ui`` argument was based off of.
1268 1268
1269 1269 ui
1270 1270 ``ui.ui`` instance for use by the repository.
1271 1271
1272 1272 origroot
1273 1273 ``bytes`` path to working directory root of this repository.
1274 1274
1275 1275 wdirvfs
1276 1276 ``vfs.vfs`` rooted at the working directory.
1277 1277
1278 1278 hgvfs
1279 1279 ``vfs.vfs`` rooted at .hg/
1280 1280
1281 1281 requirements
1282 1282 ``set`` of bytestrings representing repository opening requirements.
1283 1283
1284 1284 supportedrequirements
1285 1285 ``set`` of bytestrings representing repository requirements that we
1286 1286 know how to open. May be a supetset of ``requirements``.
1287 1287
1288 1288 sharedpath
1289 1289 ``bytes`` Defining path to storage base directory. Points to a
1290 1290 ``.hg/`` directory somewhere.
1291 1291
1292 1292 store
1293 1293 ``store.basicstore`` (or derived) instance providing access to
1294 1294 versioned storage.
1295 1295
1296 1296 cachevfs
1297 1297 ``vfs.vfs`` used for cache files.
1298 1298
1299 1299 wcachevfs
1300 1300 ``vfs.vfs`` used for cache files related to the working copy.
1301 1301
1302 1302 features
1303 1303 ``set`` of bytestrings defining features/capabilities of this
1304 1304 instance.
1305 1305
1306 1306 intents
1307 1307 ``set`` of system strings indicating what this repo will be used
1308 1308 for.
1309 1309 """
1310 1310 self.baseui = baseui
1311 1311 self.ui = ui
1312 1312 self.origroot = origroot
1313 1313 # vfs rooted at working directory.
1314 1314 self.wvfs = wdirvfs
1315 1315 self.root = wdirvfs.base
1316 1316 # vfs rooted at .hg/. Used to access most non-store paths.
1317 1317 self.vfs = hgvfs
1318 1318 self.path = hgvfs.base
1319 1319 self.requirements = requirements
1320 1320 self.supported = supportedrequirements
1321 1321 self.sharedpath = sharedpath
1322 1322 self.store = store
1323 1323 self.cachevfs = cachevfs
1324 1324 self.wcachevfs = wcachevfs
1325 1325 self.features = features
1326 1326
1327 1327 self.filtername = None
1328 1328
1329 1329 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
1330 1330 b'devel', b'check-locks'
1331 1331 ):
1332 1332 self.vfs.audit = self._getvfsward(self.vfs.audit)
1333 1333 # A list of callback to shape the phase if no data were found.
1334 1334 # Callback are in the form: func(repo, roots) --> processed root.
1335 1335 # This list it to be filled by extension during repo setup
1336 1336 self._phasedefaults = []
1337 1337
1338 1338 color.setup(self.ui)
1339 1339
1340 1340 self.spath = self.store.path
1341 1341 self.svfs = self.store.vfs
1342 1342 self.sjoin = self.store.join
1343 1343 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
1344 1344 b'devel', b'check-locks'
1345 1345 ):
1346 1346 if util.safehasattr(self.svfs, b'vfs'): # this is filtervfs
1347 1347 self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit)
1348 1348 else: # standard vfs
1349 1349 self.svfs.audit = self._getsvfsward(self.svfs.audit)
1350 1350
1351 1351 self._dirstatevalidatewarned = False
1352 1352
1353 1353 self._branchcaches = branchmap.BranchMapCache()
1354 1354 self._revbranchcache = None
1355 1355 self._filterpats = {}
1356 1356 self._datafilters = {}
1357 1357 self._transref = self._lockref = self._wlockref = None
1358 1358
1359 1359 # A cache for various files under .hg/ that tracks file changes,
1360 1360 # (used by the filecache decorator)
1361 1361 #
1362 1362 # Maps a property name to its util.filecacheentry
1363 1363 self._filecache = {}
1364 1364
1365 1365 # hold sets of revision to be filtered
1366 1366 # should be cleared when something might have changed the filter value:
1367 1367 # - new changesets,
1368 1368 # - phase change,
1369 1369 # - new obsolescence marker,
1370 1370 # - working directory parent change,
1371 1371 # - bookmark changes
1372 1372 self.filteredrevcache = {}
1373 1373
1374 1374 # post-dirstate-status hooks
1375 1375 self._postdsstatus = []
1376 1376
1377 1377 # generic mapping between names and nodes
1378 1378 self.names = namespaces.namespaces()
1379 1379
1380 1380 # Key to signature value.
1381 1381 self._sparsesignaturecache = {}
1382 1382 # Signature to cached matcher instance.
1383 1383 self._sparsematchercache = {}
1384 1384
1385 1385 self._extrafilterid = repoview.extrafilter(ui)
1386 1386
1387 1387 self.filecopiesmode = None
1388 1388 if requirementsmod.COPIESSDC_REQUIREMENT in self.requirements:
1389 1389 self.filecopiesmode = b'changeset-sidedata'
1390 1390
1391 1391 def _getvfsward(self, origfunc):
1392 1392 """build a ward for self.vfs"""
1393 1393 rref = weakref.ref(self)
1394 1394
1395 1395 def checkvfs(path, mode=None):
1396 1396 ret = origfunc(path, mode=mode)
1397 1397 repo = rref()
1398 1398 if (
1399 1399 repo is None
1400 1400 or not util.safehasattr(repo, b'_wlockref')
1401 1401 or not util.safehasattr(repo, b'_lockref')
1402 1402 ):
1403 1403 return
1404 1404 if mode in (None, b'r', b'rb'):
1405 1405 return
1406 1406 if path.startswith(repo.path):
1407 1407 # truncate name relative to the repository (.hg)
1408 1408 path = path[len(repo.path) + 1 :]
1409 1409 if path.startswith(b'cache/'):
1410 1410 msg = b'accessing cache with vfs instead of cachevfs: "%s"'
1411 1411 repo.ui.develwarn(msg % path, stacklevel=3, config=b"cache-vfs")
1412 1412 # path prefixes covered by 'lock'
1413 1413 vfs_path_prefixes = (
1414 1414 b'journal.',
1415 1415 b'undo.',
1416 1416 b'strip-backup/',
1417 1417 b'cache/',
1418 1418 )
1419 1419 if any(path.startswith(prefix) for prefix in vfs_path_prefixes):
1420 1420 if repo._currentlock(repo._lockref) is None:
1421 1421 repo.ui.develwarn(
1422 1422 b'write with no lock: "%s"' % path,
1423 1423 stacklevel=3,
1424 1424 config=b'check-locks',
1425 1425 )
1426 1426 elif repo._currentlock(repo._wlockref) is None:
1427 1427 # rest of vfs files are covered by 'wlock'
1428 1428 #
1429 1429 # exclude special files
1430 1430 for prefix in self._wlockfreeprefix:
1431 1431 if path.startswith(prefix):
1432 1432 return
1433 1433 repo.ui.develwarn(
1434 1434 b'write with no wlock: "%s"' % path,
1435 1435 stacklevel=3,
1436 1436 config=b'check-locks',
1437 1437 )
1438 1438 return ret
1439 1439
1440 1440 return checkvfs
1441 1441
1442 1442 def _getsvfsward(self, origfunc):
1443 1443 """build a ward for self.svfs"""
1444 1444 rref = weakref.ref(self)
1445 1445
1446 1446 def checksvfs(path, mode=None):
1447 1447 ret = origfunc(path, mode=mode)
1448 1448 repo = rref()
1449 1449 if repo is None or not util.safehasattr(repo, b'_lockref'):
1450 1450 return
1451 1451 if mode in (None, b'r', b'rb'):
1452 1452 return
1453 1453 if path.startswith(repo.sharedpath):
1454 1454 # truncate name relative to the repository (.hg)
1455 1455 path = path[len(repo.sharedpath) + 1 :]
1456 1456 if repo._currentlock(repo._lockref) is None:
1457 1457 repo.ui.develwarn(
1458 1458 b'write with no lock: "%s"' % path, stacklevel=4
1459 1459 )
1460 1460 return ret
1461 1461
1462 1462 return checksvfs
1463 1463
1464 1464 def close(self):
1465 1465 self._writecaches()
1466 1466
1467 1467 def _writecaches(self):
1468 1468 if self._revbranchcache:
1469 1469 self._revbranchcache.write()
1470 1470
1471 1471 def _restrictcapabilities(self, caps):
1472 1472 if self.ui.configbool(b'experimental', b'bundle2-advertise'):
1473 1473 caps = set(caps)
1474 1474 capsblob = bundle2.encodecaps(
1475 1475 bundle2.getrepocaps(self, role=b'client')
1476 1476 )
1477 1477 caps.add(b'bundle2=' + urlreq.quote(capsblob))
1478 1478 return caps
1479 1479
1480 1480 # Don't cache auditor/nofsauditor, or you'll end up with reference cycle:
1481 1481 # self -> auditor -> self._checknested -> self
1482 1482
1483 1483 @property
1484 1484 def auditor(self):
1485 1485 # This is only used by context.workingctx.match in order to
1486 1486 # detect files in subrepos.
1487 1487 return pathutil.pathauditor(self.root, callback=self._checknested)
1488 1488
1489 1489 @property
1490 1490 def nofsauditor(self):
1491 1491 # This is only used by context.basectx.match in order to detect
1492 1492 # files in subrepos.
1493 1493 return pathutil.pathauditor(
1494 1494 self.root, callback=self._checknested, realfs=False, cached=True
1495 1495 )
1496 1496
1497 1497 def _checknested(self, path):
1498 1498 """Determine if path is a legal nested repository."""
1499 1499 if not path.startswith(self.root):
1500 1500 return False
1501 1501 subpath = path[len(self.root) + 1 :]
1502 1502 normsubpath = util.pconvert(subpath)
1503 1503
1504 1504 # XXX: Checking against the current working copy is wrong in
1505 1505 # the sense that it can reject things like
1506 1506 #
1507 1507 # $ hg cat -r 10 sub/x.txt
1508 1508 #
1509 1509 # if sub/ is no longer a subrepository in the working copy
1510 1510 # parent revision.
1511 1511 #
1512 1512 # However, it can of course also allow things that would have
1513 1513 # been rejected before, such as the above cat command if sub/
1514 1514 # is a subrepository now, but was a normal directory before.
1515 1515 # The old path auditor would have rejected by mistake since it
1516 1516 # panics when it sees sub/.hg/.
1517 1517 #
1518 1518 # All in all, checking against the working copy seems sensible
1519 1519 # since we want to prevent access to nested repositories on
1520 1520 # the filesystem *now*.
1521 1521 ctx = self[None]
1522 1522 parts = util.splitpath(subpath)
1523 1523 while parts:
1524 1524 prefix = b'/'.join(parts)
1525 1525 if prefix in ctx.substate:
1526 1526 if prefix == normsubpath:
1527 1527 return True
1528 1528 else:
1529 1529 sub = ctx.sub(prefix)
1530 1530 return sub.checknested(subpath[len(prefix) + 1 :])
1531 1531 else:
1532 1532 parts.pop()
1533 1533 return False
1534 1534
1535 1535 def peer(self):
1536 1536 return localpeer(self) # not cached to avoid reference cycle
1537 1537
1538 1538 def unfiltered(self):
1539 1539 """Return unfiltered version of the repository
1540 1540
1541 1541 Intended to be overwritten by filtered repo."""
1542 1542 return self
1543 1543
1544 1544 def filtered(self, name, visibilityexceptions=None):
1545 1545 """Return a filtered version of a repository
1546 1546
1547 1547 The `name` parameter is the identifier of the requested view. This
1548 1548 will return a repoview object set "exactly" to the specified view.
1549 1549
1550 1550 This function does not apply recursive filtering to a repository. For
1551 1551 example calling `repo.filtered("served")` will return a repoview using
1552 1552 the "served" view, regardless of the initial view used by `repo`.
1553 1553
1554 1554 In other word, there is always only one level of `repoview` "filtering".
1555 1555 """
1556 1556 if self._extrafilterid is not None and b'%' not in name:
1557 1557 name = name + b'%' + self._extrafilterid
1558 1558
1559 1559 cls = repoview.newtype(self.unfiltered().__class__)
1560 1560 return cls(self, name, visibilityexceptions)
1561 1561
1562 1562 @mixedrepostorecache(
1563 1563 (b'bookmarks', b'plain'),
1564 1564 (b'bookmarks.current', b'plain'),
1565 1565 (b'bookmarks', b''),
1566 1566 (b'00changelog.i', b''),
1567 1567 )
1568 1568 def _bookmarks(self):
1569 1569 # Since the multiple files involved in the transaction cannot be
1570 1570 # written atomically (with current repository format), there is a race
1571 1571 # condition here.
1572 1572 #
1573 1573 # 1) changelog content A is read
1574 1574 # 2) outside transaction update changelog to content B
1575 1575 # 3) outside transaction update bookmark file referring to content B
1576 1576 # 4) bookmarks file content is read and filtered against changelog-A
1577 1577 #
1578 1578 # When this happens, bookmarks against nodes missing from A are dropped.
1579 1579 #
1580 1580 # Having this happening during read is not great, but it become worse
1581 1581 # when this happen during write because the bookmarks to the "unknown"
1582 1582 # nodes will be dropped for good. However, writes happen within locks.
1583 1583 # This locking makes it possible to have a race free consistent read.
1584 1584 # For this purpose data read from disc before locking are
1585 1585 # "invalidated" right after the locks are taken. This invalidations are
1586 1586 # "light", the `filecache` mechanism keep the data in memory and will
1587 1587 # reuse them if the underlying files did not changed. Not parsing the
1588 1588 # same data multiple times helps performances.
1589 1589 #
1590 1590 # Unfortunately in the case describe above, the files tracked by the
1591 1591 # bookmarks file cache might not have changed, but the in-memory
1592 1592 # content is still "wrong" because we used an older changelog content
1593 1593 # to process the on-disk data. So after locking, the changelog would be
1594 1594 # refreshed but `_bookmarks` would be preserved.
1595 1595 # Adding `00changelog.i` to the list of tracked file is not
1596 1596 # enough, because at the time we build the content for `_bookmarks` in
1597 1597 # (4), the changelog file has already diverged from the content used
1598 1598 # for loading `changelog` in (1)
1599 1599 #
1600 1600 # To prevent the issue, we force the changelog to be explicitly
1601 1601 # reloaded while computing `_bookmarks`. The data race can still happen
1602 1602 # without the lock (with a narrower window), but it would no longer go
1603 1603 # undetected during the lock time refresh.
1604 1604 #
1605 1605 # The new schedule is as follow
1606 1606 #
1607 1607 # 1) filecache logic detect that `_bookmarks` needs to be computed
1608 1608 # 2) cachestat for `bookmarks` and `changelog` are captured (for book)
1609 1609 # 3) We force `changelog` filecache to be tested
1610 1610 # 4) cachestat for `changelog` are captured (for changelog)
1611 1611 # 5) `_bookmarks` is computed and cached
1612 1612 #
1613 1613 # The step in (3) ensure we have a changelog at least as recent as the
1614 1614 # cache stat computed in (1). As a result at locking time:
1615 1615 # * if the changelog did not changed since (1) -> we can reuse the data
1616 1616 # * otherwise -> the bookmarks get refreshed.
1617 1617 self._refreshchangelog()
1618 1618 return bookmarks.bmstore(self)
1619 1619
1620 1620 def _refreshchangelog(self):
1621 1621 """make sure the in memory changelog match the on-disk one"""
1622 1622 if 'changelog' in vars(self) and self.currenttransaction() is None:
1623 1623 del self.changelog
1624 1624
1625 1625 @property
1626 1626 def _activebookmark(self):
1627 1627 return self._bookmarks.active
1628 1628
1629 1629 # _phasesets depend on changelog. what we need is to call
1630 1630 # _phasecache.invalidate() if '00changelog.i' was changed, but it
1631 1631 # can't be easily expressed in filecache mechanism.
1632 1632 @storecache(b'phaseroots', b'00changelog.i')
1633 1633 def _phasecache(self):
1634 1634 return phases.phasecache(self, self._phasedefaults)
1635 1635
1636 1636 @storecache(b'obsstore')
1637 1637 def obsstore(self):
1638 1638 return obsolete.makestore(self.ui, self)
1639 1639
1640 1640 @storecache(b'00changelog.i')
1641 1641 def changelog(self):
1642 1642 # load dirstate before changelog to avoid race see issue6303
1643 1643 self.dirstate.prefetch_parents()
1644 1644 return self.store.changelog(
1645 1645 txnutil.mayhavepending(self.root),
1646 1646 concurrencychecker=revlogchecker.get_checker(self.ui, b'changelog'),
1647 1647 )
1648 1648
1649 1649 @storecache(b'00manifest.i')
1650 1650 def manifestlog(self):
1651 1651 return self.store.manifestlog(self, self._storenarrowmatch)
1652 1652
1653 1653 @repofilecache(b'dirstate')
1654 1654 def dirstate(self):
1655 1655 return self._makedirstate()
1656 1656
1657 1657 def _makedirstate(self):
1658 1658 """Extension point for wrapping the dirstate per-repo."""
1659 1659 sparsematchfn = lambda: sparse.matcher(self)
1660 1660
1661 1661 return dirstate.dirstate(
1662 1662 self.vfs, self.ui, self.root, self._dirstatevalidate, sparsematchfn
1663 1663 )
1664 1664
1665 1665 def _dirstatevalidate(self, node):
1666 1666 try:
1667 1667 self.changelog.rev(node)
1668 1668 return node
1669 1669 except error.LookupError:
1670 1670 if not self._dirstatevalidatewarned:
1671 1671 self._dirstatevalidatewarned = True
1672 1672 self.ui.warn(
1673 1673 _(b"warning: ignoring unknown working parent %s!\n")
1674 1674 % short(node)
1675 1675 )
1676 1676 return nullid
1677 1677
1678 1678 @storecache(narrowspec.FILENAME)
1679 1679 def narrowpats(self):
1680 1680 """matcher patterns for this repository's narrowspec
1681 1681
1682 1682 A tuple of (includes, excludes).
1683 1683 """
1684 1684 return narrowspec.load(self)
1685 1685
1686 1686 @storecache(narrowspec.FILENAME)
1687 1687 def _storenarrowmatch(self):
1688 1688 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
1689 1689 return matchmod.always()
1690 1690 include, exclude = self.narrowpats
1691 1691 return narrowspec.match(self.root, include=include, exclude=exclude)
1692 1692
1693 1693 @storecache(narrowspec.FILENAME)
1694 1694 def _narrowmatch(self):
1695 1695 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
1696 1696 return matchmod.always()
1697 1697 narrowspec.checkworkingcopynarrowspec(self)
1698 1698 include, exclude = self.narrowpats
1699 1699 return narrowspec.match(self.root, include=include, exclude=exclude)
1700 1700
1701 1701 def narrowmatch(self, match=None, includeexact=False):
1702 1702 """matcher corresponding the the repo's narrowspec
1703 1703
1704 1704 If `match` is given, then that will be intersected with the narrow
1705 1705 matcher.
1706 1706
1707 1707 If `includeexact` is True, then any exact matches from `match` will
1708 1708 be included even if they're outside the narrowspec.
1709 1709 """
1710 1710 if match:
1711 1711 if includeexact and not self._narrowmatch.always():
1712 1712 # do not exclude explicitly-specified paths so that they can
1713 1713 # be warned later on
1714 1714 em = matchmod.exact(match.files())
1715 1715 nm = matchmod.unionmatcher([self._narrowmatch, em])
1716 1716 return matchmod.intersectmatchers(match, nm)
1717 1717 return matchmod.intersectmatchers(match, self._narrowmatch)
1718 1718 return self._narrowmatch
1719 1719
1720 1720 def setnarrowpats(self, newincludes, newexcludes):
1721 1721 narrowspec.save(self, newincludes, newexcludes)
1722 1722 self.invalidate(clearfilecache=True)
1723 1723
1724 1724 @unfilteredpropertycache
1725 1725 def _quick_access_changeid_null(self):
1726 1726 return {
1727 1727 b'null': (nullrev, nullid),
1728 1728 nullrev: (nullrev, nullid),
1729 1729 nullid: (nullrev, nullid),
1730 1730 }
1731 1731
1732 1732 @unfilteredpropertycache
1733 1733 def _quick_access_changeid_wc(self):
1734 1734 # also fast path access to the working copy parents
1735 1735 # however, only do it for filter that ensure wc is visible.
1736 1736 quick = self._quick_access_changeid_null.copy()
1737 1737 cl = self.unfiltered().changelog
1738 1738 for node in self.dirstate.parents():
1739 1739 if node == nullid:
1740 1740 continue
1741 1741 rev = cl.index.get_rev(node)
1742 1742 if rev is None:
1743 1743 # unknown working copy parent case:
1744 1744 #
1745 1745 # skip the fast path and let higher code deal with it
1746 1746 continue
1747 1747 pair = (rev, node)
1748 1748 quick[rev] = pair
1749 1749 quick[node] = pair
1750 1750 # also add the parents of the parents
1751 1751 for r in cl.parentrevs(rev):
1752 1752 if r == nullrev:
1753 1753 continue
1754 1754 n = cl.node(r)
1755 1755 pair = (r, n)
1756 1756 quick[r] = pair
1757 1757 quick[n] = pair
1758 1758 p1node = self.dirstate.p1()
1759 1759 if p1node != nullid:
1760 1760 quick[b'.'] = quick[p1node]
1761 1761 return quick
1762 1762
1763 1763 @unfilteredmethod
1764 1764 def _quick_access_changeid_invalidate(self):
1765 1765 if '_quick_access_changeid_wc' in vars(self):
1766 1766 del self.__dict__['_quick_access_changeid_wc']
1767 1767
1768 1768 @property
1769 1769 def _quick_access_changeid(self):
1770 1770 """an helper dictionnary for __getitem__ calls
1771 1771
1772 1772 This contains a list of symbol we can recognise right away without
1773 1773 further processing.
1774 1774 """
1775 1775 if self.filtername in repoview.filter_has_wc:
1776 1776 return self._quick_access_changeid_wc
1777 1777 return self._quick_access_changeid_null
1778 1778
1779 1779 def __getitem__(self, changeid):
1780 1780 # dealing with special cases
1781 1781 if changeid is None:
1782 1782 return context.workingctx(self)
1783 1783 if isinstance(changeid, context.basectx):
1784 1784 return changeid
1785 1785
1786 1786 # dealing with multiple revisions
1787 1787 if isinstance(changeid, slice):
1788 1788 # wdirrev isn't contiguous so the slice shouldn't include it
1789 1789 return [
1790 1790 self[i]
1791 1791 for i in pycompat.xrange(*changeid.indices(len(self)))
1792 1792 if i not in self.changelog.filteredrevs
1793 1793 ]
1794 1794
1795 1795 # dealing with some special values
1796 1796 quick_access = self._quick_access_changeid.get(changeid)
1797 1797 if quick_access is not None:
1798 1798 rev, node = quick_access
1799 1799 return context.changectx(self, rev, node, maybe_filtered=False)
1800 1800 if changeid == b'tip':
1801 1801 node = self.changelog.tip()
1802 1802 rev = self.changelog.rev(node)
1803 1803 return context.changectx(self, rev, node)
1804 1804
1805 1805 # dealing with arbitrary values
1806 1806 try:
1807 1807 if isinstance(changeid, int):
1808 1808 node = self.changelog.node(changeid)
1809 1809 rev = changeid
1810 1810 elif changeid == b'.':
1811 1811 # this is a hack to delay/avoid loading obsmarkers
1812 1812 # when we know that '.' won't be hidden
1813 1813 node = self.dirstate.p1()
1814 1814 rev = self.unfiltered().changelog.rev(node)
1815 1815 elif len(changeid) == 20:
1816 1816 try:
1817 1817 node = changeid
1818 1818 rev = self.changelog.rev(changeid)
1819 1819 except error.FilteredLookupError:
1820 1820 changeid = hex(changeid) # for the error message
1821 1821 raise
1822 1822 except LookupError:
1823 1823 # check if it might have come from damaged dirstate
1824 1824 #
1825 1825 # XXX we could avoid the unfiltered if we had a recognizable
1826 1826 # exception for filtered changeset access
1827 1827 if (
1828 1828 self.local()
1829 1829 and changeid in self.unfiltered().dirstate.parents()
1830 1830 ):
1831 1831 msg = _(b"working directory has unknown parent '%s'!")
1832 1832 raise error.Abort(msg % short(changeid))
1833 1833 changeid = hex(changeid) # for the error message
1834 1834 raise
1835 1835
1836 1836 elif len(changeid) == 40:
1837 1837 node = bin(changeid)
1838 1838 rev = self.changelog.rev(node)
1839 1839 else:
1840 1840 raise error.ProgrammingError(
1841 1841 b"unsupported changeid '%s' of type %s"
1842 1842 % (changeid, pycompat.bytestr(type(changeid)))
1843 1843 )
1844 1844
1845 1845 return context.changectx(self, rev, node)
1846 1846
1847 1847 except (error.FilteredIndexError, error.FilteredLookupError):
1848 1848 raise error.FilteredRepoLookupError(
1849 1849 _(b"filtered revision '%s'") % pycompat.bytestr(changeid)
1850 1850 )
1851 1851 except (IndexError, LookupError):
1852 1852 raise error.RepoLookupError(
1853 1853 _(b"unknown revision '%s'") % pycompat.bytestr(changeid)
1854 1854 )
1855 1855 except error.WdirUnsupported:
1856 1856 return context.workingctx(self)
1857 1857
1858 1858 def __contains__(self, changeid):
1859 1859 """True if the given changeid exists"""
1860 1860 try:
1861 1861 self[changeid]
1862 1862 return True
1863 1863 except error.RepoLookupError:
1864 1864 return False
1865 1865
1866 1866 def __nonzero__(self):
1867 1867 return True
1868 1868
1869 1869 __bool__ = __nonzero__
1870 1870
1871 1871 def __len__(self):
1872 1872 # no need to pay the cost of repoview.changelog
1873 1873 unfi = self.unfiltered()
1874 1874 return len(unfi.changelog)
1875 1875
1876 1876 def __iter__(self):
1877 1877 return iter(self.changelog)
1878 1878
1879 1879 def revs(self, expr, *args):
1880 1880 """Find revisions matching a revset.
1881 1881
1882 1882 The revset is specified as a string ``expr`` that may contain
1883 1883 %-formatting to escape certain types. See ``revsetlang.formatspec``.
1884 1884
1885 1885 Revset aliases from the configuration are not expanded. To expand
1886 1886 user aliases, consider calling ``scmutil.revrange()`` or
1887 1887 ``repo.anyrevs([expr], user=True)``.
1888 1888
1889 1889 Returns a smartset.abstractsmartset, which is a list-like interface
1890 1890 that contains integer revisions.
1891 1891 """
1892 1892 tree = revsetlang.spectree(expr, *args)
1893 1893 return revset.makematcher(tree)(self)
1894 1894
1895 1895 def set(self, expr, *args):
1896 1896 """Find revisions matching a revset and emit changectx instances.
1897 1897
1898 1898 This is a convenience wrapper around ``revs()`` that iterates the
1899 1899 result and is a generator of changectx instances.
1900 1900
1901 1901 Revset aliases from the configuration are not expanded. To expand
1902 1902 user aliases, consider calling ``scmutil.revrange()``.
1903 1903 """
1904 1904 for r in self.revs(expr, *args):
1905 1905 yield self[r]
1906 1906
1907 1907 def anyrevs(self, specs, user=False, localalias=None):
1908 1908 """Find revisions matching one of the given revsets.
1909 1909
1910 1910 Revset aliases from the configuration are not expanded by default. To
1911 1911 expand user aliases, specify ``user=True``. To provide some local
1912 1912 definitions overriding user aliases, set ``localalias`` to
1913 1913 ``{name: definitionstring}``.
1914 1914 """
1915 1915 if specs == [b'null']:
1916 1916 return revset.baseset([nullrev])
1917 1917 if specs == [b'.']:
1918 1918 quick_data = self._quick_access_changeid.get(b'.')
1919 1919 if quick_data is not None:
1920 1920 return revset.baseset([quick_data[0]])
1921 1921 if user:
1922 1922 m = revset.matchany(
1923 1923 self.ui,
1924 1924 specs,
1925 1925 lookup=revset.lookupfn(self),
1926 1926 localalias=localalias,
1927 1927 )
1928 1928 else:
1929 1929 m = revset.matchany(None, specs, localalias=localalias)
1930 1930 return m(self)
1931 1931
1932 1932 def url(self):
1933 1933 return b'file:' + self.root
1934 1934
1935 1935 def hook(self, name, throw=False, **args):
1936 1936 """Call a hook, passing this repo instance.
1937 1937
1938 1938 This a convenience method to aid invoking hooks. Extensions likely
1939 1939 won't call this unless they have registered a custom hook or are
1940 1940 replacing code that is expected to call a hook.
1941 1941 """
1942 1942 return hook.hook(self.ui, self, name, throw, **args)
1943 1943
1944 1944 @filteredpropertycache
1945 1945 def _tagscache(self):
1946 1946 """Returns a tagscache object that contains various tags related
1947 1947 caches."""
1948 1948
1949 1949 # This simplifies its cache management by having one decorated
1950 1950 # function (this one) and the rest simply fetch things from it.
1951 1951 class tagscache(object):
1952 1952 def __init__(self):
1953 1953 # These two define the set of tags for this repository. tags
1954 1954 # maps tag name to node; tagtypes maps tag name to 'global' or
1955 1955 # 'local'. (Global tags are defined by .hgtags across all
1956 1956 # heads, and local tags are defined in .hg/localtags.)
1957 1957 # They constitute the in-memory cache of tags.
1958 1958 self.tags = self.tagtypes = None
1959 1959
1960 1960 self.nodetagscache = self.tagslist = None
1961 1961
1962 1962 cache = tagscache()
1963 1963 cache.tags, cache.tagtypes = self._findtags()
1964 1964
1965 1965 return cache
1966 1966
1967 1967 def tags(self):
1968 1968 '''return a mapping of tag to node'''
1969 1969 t = {}
1970 1970 if self.changelog.filteredrevs:
1971 1971 tags, tt = self._findtags()
1972 1972 else:
1973 1973 tags = self._tagscache.tags
1974 1974 rev = self.changelog.rev
1975 1975 for k, v in pycompat.iteritems(tags):
1976 1976 try:
1977 1977 # ignore tags to unknown nodes
1978 1978 rev(v)
1979 1979 t[k] = v
1980 1980 except (error.LookupError, ValueError):
1981 1981 pass
1982 1982 return t
1983 1983
1984 1984 def _findtags(self):
1985 1985 """Do the hard work of finding tags. Return a pair of dicts
1986 1986 (tags, tagtypes) where tags maps tag name to node, and tagtypes
1987 1987 maps tag name to a string like \'global\' or \'local\'.
1988 1988 Subclasses or extensions are free to add their own tags, but
1989 1989 should be aware that the returned dicts will be retained for the
1990 1990 duration of the localrepo object."""
1991 1991
1992 1992 # XXX what tagtype should subclasses/extensions use? Currently
1993 1993 # mq and bookmarks add tags, but do not set the tagtype at all.
1994 1994 # Should each extension invent its own tag type? Should there
1995 1995 # be one tagtype for all such "virtual" tags? Or is the status
1996 1996 # quo fine?
1997 1997
1998 1998 # map tag name to (node, hist)
1999 1999 alltags = tagsmod.findglobaltags(self.ui, self)
2000 2000 # map tag name to tag type
2001 2001 tagtypes = {tag: b'global' for tag in alltags}
2002 2002
2003 2003 tagsmod.readlocaltags(self.ui, self, alltags, tagtypes)
2004 2004
2005 2005 # Build the return dicts. Have to re-encode tag names because
2006 2006 # the tags module always uses UTF-8 (in order not to lose info
2007 2007 # writing to the cache), but the rest of Mercurial wants them in
2008 2008 # local encoding.
2009 2009 tags = {}
2010 2010 for (name, (node, hist)) in pycompat.iteritems(alltags):
2011 2011 if node != nullid:
2012 2012 tags[encoding.tolocal(name)] = node
2013 2013 tags[b'tip'] = self.changelog.tip()
2014 2014 tagtypes = {
2015 2015 encoding.tolocal(name): value
2016 2016 for (name, value) in pycompat.iteritems(tagtypes)
2017 2017 }
2018 2018 return (tags, tagtypes)
2019 2019
2020 2020 def tagtype(self, tagname):
2021 2021 """
2022 2022 return the type of the given tag. result can be:
2023 2023
2024 2024 'local' : a local tag
2025 2025 'global' : a global tag
2026 2026 None : tag does not exist
2027 2027 """
2028 2028
2029 2029 return self._tagscache.tagtypes.get(tagname)
2030 2030
2031 2031 def tagslist(self):
2032 2032 '''return a list of tags ordered by revision'''
2033 2033 if not self._tagscache.tagslist:
2034 2034 l = []
2035 2035 for t, n in pycompat.iteritems(self.tags()):
2036 2036 l.append((self.changelog.rev(n), t, n))
2037 2037 self._tagscache.tagslist = [(t, n) for r, t, n in sorted(l)]
2038 2038
2039 2039 return self._tagscache.tagslist
2040 2040
2041 2041 def nodetags(self, node):
2042 2042 '''return the tags associated with a node'''
2043 2043 if not self._tagscache.nodetagscache:
2044 2044 nodetagscache = {}
2045 2045 for t, n in pycompat.iteritems(self._tagscache.tags):
2046 2046 nodetagscache.setdefault(n, []).append(t)
2047 2047 for tags in pycompat.itervalues(nodetagscache):
2048 2048 tags.sort()
2049 2049 self._tagscache.nodetagscache = nodetagscache
2050 2050 return self._tagscache.nodetagscache.get(node, [])
2051 2051
2052 2052 def nodebookmarks(self, node):
2053 2053 """return the list of bookmarks pointing to the specified node"""
2054 2054 return self._bookmarks.names(node)
2055 2055
2056 2056 def branchmap(self):
2057 2057 """returns a dictionary {branch: [branchheads]} with branchheads
2058 2058 ordered by increasing revision number"""
2059 2059 return self._branchcaches[self]
2060 2060
2061 2061 @unfilteredmethod
2062 2062 def revbranchcache(self):
2063 2063 if not self._revbranchcache:
2064 2064 self._revbranchcache = branchmap.revbranchcache(self.unfiltered())
2065 2065 return self._revbranchcache
2066 2066
2067 2067 def register_changeset(self, rev, changelogrevision):
2068 2068 self.revbranchcache().setdata(rev, changelogrevision)
2069 2069
2070 2070 def branchtip(self, branch, ignoremissing=False):
2071 2071 """return the tip node for a given branch
2072 2072
2073 2073 If ignoremissing is True, then this method will not raise an error.
2074 2074 This is helpful for callers that only expect None for a missing branch
2075 2075 (e.g. namespace).
2076 2076
2077 2077 """
2078 2078 try:
2079 2079 return self.branchmap().branchtip(branch)
2080 2080 except KeyError:
2081 2081 if not ignoremissing:
2082 2082 raise error.RepoLookupError(_(b"unknown branch '%s'") % branch)
2083 2083 else:
2084 2084 pass
2085 2085
2086 2086 def lookup(self, key):
2087 2087 node = scmutil.revsymbol(self, key).node()
2088 2088 if node is None:
2089 2089 raise error.RepoLookupError(_(b"unknown revision '%s'") % key)
2090 2090 return node
2091 2091
2092 2092 def lookupbranch(self, key):
2093 2093 if self.branchmap().hasbranch(key):
2094 2094 return key
2095 2095
2096 2096 return scmutil.revsymbol(self, key).branch()
2097 2097
2098 2098 def known(self, nodes):
2099 2099 cl = self.changelog
2100 2100 get_rev = cl.index.get_rev
2101 2101 filtered = cl.filteredrevs
2102 2102 result = []
2103 2103 for n in nodes:
2104 2104 r = get_rev(n)
2105 2105 resp = not (r is None or r in filtered)
2106 2106 result.append(resp)
2107 2107 return result
2108 2108
2109 2109 def local(self):
2110 2110 return self
2111 2111
2112 2112 def publishing(self):
2113 2113 # it's safe (and desirable) to trust the publish flag unconditionally
2114 2114 # so that we don't finalize changes shared between users via ssh or nfs
2115 2115 return self.ui.configbool(b'phases', b'publish', untrusted=True)
2116 2116
2117 2117 def cancopy(self):
2118 2118 # so statichttprepo's override of local() works
2119 2119 if not self.local():
2120 2120 return False
2121 2121 if not self.publishing():
2122 2122 return True
2123 2123 # if publishing we can't copy if there is filtered content
2124 2124 return not self.filtered(b'visible').changelog.filteredrevs
2125 2125
2126 2126 def shared(self):
2127 2127 '''the type of shared repository (None if not shared)'''
2128 2128 if self.sharedpath != self.path:
2129 2129 return b'store'
2130 2130 return None
2131 2131
2132 2132 def wjoin(self, f, *insidef):
2133 2133 return self.vfs.reljoin(self.root, f, *insidef)
2134 2134
2135 2135 def setparents(self, p1, p2=nullid):
2136 2136 self[None].setparents(p1, p2)
2137 2137 self._quick_access_changeid_invalidate()
2138 2138
2139 2139 def filectx(self, path, changeid=None, fileid=None, changectx=None):
2140 2140 """changeid must be a changeset revision, if specified.
2141 2141 fileid can be a file revision or node."""
2142 2142 return context.filectx(
2143 2143 self, path, changeid, fileid, changectx=changectx
2144 2144 )
2145 2145
2146 2146 def getcwd(self):
2147 2147 return self.dirstate.getcwd()
2148 2148
2149 2149 def pathto(self, f, cwd=None):
2150 2150 return self.dirstate.pathto(f, cwd)
2151 2151
2152 2152 def _loadfilter(self, filter):
2153 2153 if filter not in self._filterpats:
2154 2154 l = []
2155 2155 for pat, cmd in self.ui.configitems(filter):
2156 2156 if cmd == b'!':
2157 2157 continue
2158 2158 mf = matchmod.match(self.root, b'', [pat])
2159 2159 fn = None
2160 2160 params = cmd
2161 2161 for name, filterfn in pycompat.iteritems(self._datafilters):
2162 2162 if cmd.startswith(name):
2163 2163 fn = filterfn
2164 2164 params = cmd[len(name) :].lstrip()
2165 2165 break
2166 2166 if not fn:
2167 2167 fn = lambda s, c, **kwargs: procutil.filter(s, c)
2168 2168 fn.__name__ = 'commandfilter'
2169 2169 # Wrap old filters not supporting keyword arguments
2170 2170 if not pycompat.getargspec(fn)[2]:
2171 2171 oldfn = fn
2172 2172 fn = lambda s, c, oldfn=oldfn, **kwargs: oldfn(s, c)
2173 2173 fn.__name__ = 'compat-' + oldfn.__name__
2174 2174 l.append((mf, fn, params))
2175 2175 self._filterpats[filter] = l
2176 2176 return self._filterpats[filter]
2177 2177
2178 2178 def _filter(self, filterpats, filename, data):
2179 2179 for mf, fn, cmd in filterpats:
2180 2180 if mf(filename):
2181 2181 self.ui.debug(
2182 2182 b"filtering %s through %s\n"
2183 2183 % (filename, cmd or pycompat.sysbytes(fn.__name__))
2184 2184 )
2185 2185 data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
2186 2186 break
2187 2187
2188 2188 return data
2189 2189
2190 2190 @unfilteredpropertycache
2191 2191 def _encodefilterpats(self):
2192 2192 return self._loadfilter(b'encode')
2193 2193
2194 2194 @unfilteredpropertycache
2195 2195 def _decodefilterpats(self):
2196 2196 return self._loadfilter(b'decode')
2197 2197
2198 2198 def adddatafilter(self, name, filter):
2199 2199 self._datafilters[name] = filter
2200 2200
2201 2201 def wread(self, filename):
2202 2202 if self.wvfs.islink(filename):
2203 2203 data = self.wvfs.readlink(filename)
2204 2204 else:
2205 2205 data = self.wvfs.read(filename)
2206 2206 return self._filter(self._encodefilterpats, filename, data)
2207 2207
2208 2208 def wwrite(self, filename, data, flags, backgroundclose=False, **kwargs):
2209 2209 """write ``data`` into ``filename`` in the working directory
2210 2210
2211 2211 This returns length of written (maybe decoded) data.
2212 2212 """
2213 2213 data = self._filter(self._decodefilterpats, filename, data)
2214 2214 if b'l' in flags:
2215 2215 self.wvfs.symlink(data, filename)
2216 2216 else:
2217 2217 self.wvfs.write(
2218 2218 filename, data, backgroundclose=backgroundclose, **kwargs
2219 2219 )
2220 2220 if b'x' in flags:
2221 2221 self.wvfs.setflags(filename, False, True)
2222 2222 else:
2223 2223 self.wvfs.setflags(filename, False, False)
2224 2224 return len(data)
2225 2225
2226 2226 def wwritedata(self, filename, data):
2227 2227 return self._filter(self._decodefilterpats, filename, data)
2228 2228
2229 2229 def currenttransaction(self):
2230 2230 """return the current transaction or None if non exists"""
2231 2231 if self._transref:
2232 2232 tr = self._transref()
2233 2233 else:
2234 2234 tr = None
2235 2235
2236 2236 if tr and tr.running():
2237 2237 return tr
2238 2238 return None
2239 2239
2240 2240 def transaction(self, desc, report=None):
2241 2241 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
2242 2242 b'devel', b'check-locks'
2243 2243 ):
2244 2244 if self._currentlock(self._lockref) is None:
2245 2245 raise error.ProgrammingError(b'transaction requires locking')
2246 2246 tr = self.currenttransaction()
2247 2247 if tr is not None:
2248 2248 return tr.nest(name=desc)
2249 2249
2250 2250 # abort here if the journal already exists
2251 2251 if self.svfs.exists(b"journal"):
2252 2252 raise error.RepoError(
2253 2253 _(b"abandoned transaction found"),
2254 2254 hint=_(b"run 'hg recover' to clean up transaction"),
2255 2255 )
2256 2256
2257 2257 idbase = b"%.40f#%f" % (random.random(), time.time())
2258 2258 ha = hex(hashutil.sha1(idbase).digest())
2259 2259 txnid = b'TXN:' + ha
2260 2260 self.hook(b'pretxnopen', throw=True, txnname=desc, txnid=txnid)
2261 2261
2262 2262 self._writejournal(desc)
2263 2263 renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
2264 2264 if report:
2265 2265 rp = report
2266 2266 else:
2267 2267 rp = self.ui.warn
2268 2268 vfsmap = {b'plain': self.vfs, b'store': self.svfs} # root of .hg/
2269 2269 # we must avoid cyclic reference between repo and transaction.
2270 2270 reporef = weakref.ref(self)
2271 2271 # Code to track tag movement
2272 2272 #
2273 2273 # Since tags are all handled as file content, it is actually quite hard
2274 2274 # to track these movement from a code perspective. So we fallback to a
2275 2275 # tracking at the repository level. One could envision to track changes
2276 2276 # to the '.hgtags' file through changegroup apply but that fails to
2277 2277 # cope with case where transaction expose new heads without changegroup
2278 2278 # being involved (eg: phase movement).
2279 2279 #
2280 2280 # For now, We gate the feature behind a flag since this likely comes
2281 2281 # with performance impacts. The current code run more often than needed
2282 2282 # and do not use caches as much as it could. The current focus is on
2283 2283 # the behavior of the feature so we disable it by default. The flag
2284 2284 # will be removed when we are happy with the performance impact.
2285 2285 #
2286 2286 # Once this feature is no longer experimental move the following
2287 2287 # documentation to the appropriate help section:
2288 2288 #
2289 2289 # The ``HG_TAG_MOVED`` variable will be set if the transaction touched
2290 2290 # tags (new or changed or deleted tags). In addition the details of
2291 2291 # these changes are made available in a file at:
2292 2292 # ``REPOROOT/.hg/changes/tags.changes``.
2293 2293 # Make sure you check for HG_TAG_MOVED before reading that file as it
2294 2294 # might exist from a previous transaction even if no tag were touched
2295 2295 # in this one. Changes are recorded in a line base format::
2296 2296 #
2297 2297 # <action> <hex-node> <tag-name>\n
2298 2298 #
2299 2299 # Actions are defined as follow:
2300 2300 # "-R": tag is removed,
2301 2301 # "+A": tag is added,
2302 2302 # "-M": tag is moved (old value),
2303 2303 # "+M": tag is moved (new value),
2304 2304 tracktags = lambda x: None
2305 2305 # experimental config: experimental.hook-track-tags
2306 2306 shouldtracktags = self.ui.configbool(
2307 2307 b'experimental', b'hook-track-tags'
2308 2308 )
2309 2309 if desc != b'strip' and shouldtracktags:
2310 2310 oldheads = self.changelog.headrevs()
2311 2311
2312 2312 def tracktags(tr2):
2313 2313 repo = reporef()
2314 2314 oldfnodes = tagsmod.fnoderevs(repo.ui, repo, oldheads)
2315 2315 newheads = repo.changelog.headrevs()
2316 2316 newfnodes = tagsmod.fnoderevs(repo.ui, repo, newheads)
2317 2317 # notes: we compare lists here.
2318 2318 # As we do it only once buiding set would not be cheaper
2319 2319 changes = tagsmod.difftags(repo.ui, repo, oldfnodes, newfnodes)
2320 2320 if changes:
2321 2321 tr2.hookargs[b'tag_moved'] = b'1'
2322 2322 with repo.vfs(
2323 2323 b'changes/tags.changes', b'w', atomictemp=True
2324 2324 ) as changesfile:
2325 2325 # note: we do not register the file to the transaction
2326 2326 # because we needs it to still exist on the transaction
2327 2327 # is close (for txnclose hooks)
2328 2328 tagsmod.writediff(changesfile, changes)
2329 2329
2330 2330 def validate(tr2):
2331 2331 """will run pre-closing hooks"""
2332 2332 # XXX the transaction API is a bit lacking here so we take a hacky
2333 2333 # path for now
2334 2334 #
2335 2335 # We cannot add this as a "pending" hooks since the 'tr.hookargs'
2336 2336 # dict is copied before these run. In addition we needs the data
2337 2337 # available to in memory hooks too.
2338 2338 #
2339 2339 # Moreover, we also need to make sure this runs before txnclose
2340 2340 # hooks and there is no "pending" mechanism that would execute
2341 2341 # logic only if hooks are about to run.
2342 2342 #
2343 2343 # Fixing this limitation of the transaction is also needed to track
2344 2344 # other families of changes (bookmarks, phases, obsolescence).
2345 2345 #
2346 2346 # This will have to be fixed before we remove the experimental
2347 2347 # gating.
2348 2348 tracktags(tr2)
2349 2349 repo = reporef()
2350 2350
2351 2351 singleheadopt = (b'experimental', b'single-head-per-branch')
2352 2352 singlehead = repo.ui.configbool(*singleheadopt)
2353 2353 if singlehead:
2354 2354 singleheadsub = repo.ui.configsuboptions(*singleheadopt)[1]
2355 2355 accountclosed = singleheadsub.get(
2356 2356 b"account-closed-heads", False
2357 2357 )
2358 2358 if singleheadsub.get(b"public-changes-only", False):
2359 2359 filtername = b"immutable"
2360 2360 else:
2361 2361 filtername = b"visible"
2362 2362 scmutil.enforcesinglehead(
2363 2363 repo, tr2, desc, accountclosed, filtername
2364 2364 )
2365 2365 if hook.hashook(repo.ui, b'pretxnclose-bookmark'):
2366 2366 for name, (old, new) in sorted(
2367 2367 tr.changes[b'bookmarks'].items()
2368 2368 ):
2369 2369 args = tr.hookargs.copy()
2370 2370 args.update(bookmarks.preparehookargs(name, old, new))
2371 2371 repo.hook(
2372 2372 b'pretxnclose-bookmark',
2373 2373 throw=True,
2374 2374 **pycompat.strkwargs(args)
2375 2375 )
2376 2376 if hook.hashook(repo.ui, b'pretxnclose-phase'):
2377 2377 cl = repo.unfiltered().changelog
2378 2378 for revs, (old, new) in tr.changes[b'phases']:
2379 2379 for rev in revs:
2380 2380 args = tr.hookargs.copy()
2381 2381 node = hex(cl.node(rev))
2382 2382 args.update(phases.preparehookargs(node, old, new))
2383 2383 repo.hook(
2384 2384 b'pretxnclose-phase',
2385 2385 throw=True,
2386 2386 **pycompat.strkwargs(args)
2387 2387 )
2388 2388
2389 2389 repo.hook(
2390 2390 b'pretxnclose', throw=True, **pycompat.strkwargs(tr.hookargs)
2391 2391 )
2392 2392
2393 2393 def releasefn(tr, success):
2394 2394 repo = reporef()
2395 2395 if repo is None:
2396 2396 # If the repo has been GC'd (and this release function is being
2397 2397 # called from transaction.__del__), there's not much we can do,
2398 2398 # so just leave the unfinished transaction there and let the
2399 2399 # user run `hg recover`.
2400 2400 return
2401 2401 if success:
2402 2402 # this should be explicitly invoked here, because
2403 2403 # in-memory changes aren't written out at closing
2404 2404 # transaction, if tr.addfilegenerator (via
2405 2405 # dirstate.write or so) isn't invoked while
2406 2406 # transaction running
2407 2407 repo.dirstate.write(None)
2408 2408 else:
2409 2409 # discard all changes (including ones already written
2410 2410 # out) in this transaction
2411 2411 narrowspec.restorebackup(self, b'journal.narrowspec')
2412 2412 narrowspec.restorewcbackup(self, b'journal.narrowspec.dirstate')
2413 2413 repo.dirstate.restorebackup(None, b'journal.dirstate')
2414 2414
2415 2415 repo.invalidate(clearfilecache=True)
2416 2416
2417 2417 tr = transaction.transaction(
2418 2418 rp,
2419 2419 self.svfs,
2420 2420 vfsmap,
2421 2421 b"journal",
2422 2422 b"undo",
2423 2423 aftertrans(renames),
2424 2424 self.store.createmode,
2425 2425 validator=validate,
2426 2426 releasefn=releasefn,
2427 2427 checkambigfiles=_cachedfiles,
2428 2428 name=desc,
2429 2429 )
2430 2430 tr.changes[b'origrepolen'] = len(self)
2431 2431 tr.changes[b'obsmarkers'] = set()
2432 2432 tr.changes[b'phases'] = []
2433 2433 tr.changes[b'bookmarks'] = {}
2434 2434
2435 2435 tr.hookargs[b'txnid'] = txnid
2436 2436 tr.hookargs[b'txnname'] = desc
2437 2437 tr.hookargs[b'changes'] = tr.changes
2438 2438 # note: writing the fncache only during finalize mean that the file is
2439 2439 # outdated when running hooks. As fncache is used for streaming clone,
2440 2440 # this is not expected to break anything that happen during the hooks.
2441 2441 tr.addfinalize(b'flush-fncache', self.store.write)
2442 2442
2443 2443 def txnclosehook(tr2):
2444 2444 """To be run if transaction is successful, will schedule a hook run"""
2445 2445 # Don't reference tr2 in hook() so we don't hold a reference.
2446 2446 # This reduces memory consumption when there are multiple
2447 2447 # transactions per lock. This can likely go away if issue5045
2448 2448 # fixes the function accumulation.
2449 2449 hookargs = tr2.hookargs
2450 2450
2451 2451 def hookfunc(unused_success):
2452 2452 repo = reporef()
2453 2453 if hook.hashook(repo.ui, b'txnclose-bookmark'):
2454 2454 bmchanges = sorted(tr.changes[b'bookmarks'].items())
2455 2455 for name, (old, new) in bmchanges:
2456 2456 args = tr.hookargs.copy()
2457 2457 args.update(bookmarks.preparehookargs(name, old, new))
2458 2458 repo.hook(
2459 2459 b'txnclose-bookmark',
2460 2460 throw=False,
2461 2461 **pycompat.strkwargs(args)
2462 2462 )
2463 2463
2464 2464 if hook.hashook(repo.ui, b'txnclose-phase'):
2465 2465 cl = repo.unfiltered().changelog
2466 2466 phasemv = sorted(
2467 2467 tr.changes[b'phases'], key=lambda r: r[0][0]
2468 2468 )
2469 2469 for revs, (old, new) in phasemv:
2470 2470 for rev in revs:
2471 2471 args = tr.hookargs.copy()
2472 2472 node = hex(cl.node(rev))
2473 2473 args.update(phases.preparehookargs(node, old, new))
2474 2474 repo.hook(
2475 2475 b'txnclose-phase',
2476 2476 throw=False,
2477 2477 **pycompat.strkwargs(args)
2478 2478 )
2479 2479
2480 2480 repo.hook(
2481 2481 b'txnclose', throw=False, **pycompat.strkwargs(hookargs)
2482 2482 )
2483 2483
2484 2484 reporef()._afterlock(hookfunc)
2485 2485
2486 2486 tr.addfinalize(b'txnclose-hook', txnclosehook)
2487 2487 # Include a leading "-" to make it happen before the transaction summary
2488 2488 # reports registered via scmutil.registersummarycallback() whose names
2489 2489 # are 00-txnreport etc. That way, the caches will be warm when the
2490 2490 # callbacks run.
2491 2491 tr.addpostclose(b'-warm-cache', self._buildcacheupdater(tr))
2492 2492
2493 2493 def txnaborthook(tr2):
2494 2494 """To be run if transaction is aborted"""
2495 2495 reporef().hook(
2496 2496 b'txnabort', throw=False, **pycompat.strkwargs(tr2.hookargs)
2497 2497 )
2498 2498
2499 2499 tr.addabort(b'txnabort-hook', txnaborthook)
2500 2500 # avoid eager cache invalidation. in-memory data should be identical
2501 2501 # to stored data if transaction has no error.
2502 2502 tr.addpostclose(b'refresh-filecachestats', self._refreshfilecachestats)
2503 2503 self._transref = weakref.ref(tr)
2504 2504 scmutil.registersummarycallback(self, tr, desc)
2505 2505 return tr
2506 2506
2507 2507 def _journalfiles(self):
2508 2508 return (
2509 2509 (self.svfs, b'journal'),
2510 2510 (self.svfs, b'journal.narrowspec'),
2511 2511 (self.vfs, b'journal.narrowspec.dirstate'),
2512 2512 (self.vfs, b'journal.dirstate'),
2513 2513 (self.vfs, b'journal.branch'),
2514 2514 (self.vfs, b'journal.desc'),
2515 2515 (bookmarks.bookmarksvfs(self), b'journal.bookmarks'),
2516 2516 (self.svfs, b'journal.phaseroots'),
2517 2517 )
2518 2518
2519 2519 def undofiles(self):
2520 2520 return [(vfs, undoname(x)) for vfs, x in self._journalfiles()]
2521 2521
2522 2522 @unfilteredmethod
2523 2523 def _writejournal(self, desc):
2524 2524 self.dirstate.savebackup(None, b'journal.dirstate')
2525 2525 narrowspec.savewcbackup(self, b'journal.narrowspec.dirstate')
2526 2526 narrowspec.savebackup(self, b'journal.narrowspec')
2527 2527 self.vfs.write(
2528 2528 b"journal.branch", encoding.fromlocal(self.dirstate.branch())
2529 2529 )
2530 2530 self.vfs.write(b"journal.desc", b"%d\n%s\n" % (len(self), desc))
2531 2531 bookmarksvfs = bookmarks.bookmarksvfs(self)
2532 2532 bookmarksvfs.write(
2533 2533 b"journal.bookmarks", bookmarksvfs.tryread(b"bookmarks")
2534 2534 )
2535 2535 self.svfs.write(b"journal.phaseroots", self.svfs.tryread(b"phaseroots"))
2536 2536
2537 2537 def recover(self):
2538 2538 with self.lock():
2539 2539 if self.svfs.exists(b"journal"):
2540 2540 self.ui.status(_(b"rolling back interrupted transaction\n"))
2541 2541 vfsmap = {
2542 2542 b'': self.svfs,
2543 2543 b'plain': self.vfs,
2544 2544 }
2545 2545 transaction.rollback(
2546 2546 self.svfs,
2547 2547 vfsmap,
2548 2548 b"journal",
2549 2549 self.ui.warn,
2550 2550 checkambigfiles=_cachedfiles,
2551 2551 )
2552 2552 self.invalidate()
2553 2553 return True
2554 2554 else:
2555 2555 self.ui.warn(_(b"no interrupted transaction available\n"))
2556 2556 return False
2557 2557
2558 2558 def rollback(self, dryrun=False, force=False):
2559 2559 wlock = lock = dsguard = None
2560 2560 try:
2561 2561 wlock = self.wlock()
2562 2562 lock = self.lock()
2563 2563 if self.svfs.exists(b"undo"):
2564 2564 dsguard = dirstateguard.dirstateguard(self, b'rollback')
2565 2565
2566 2566 return self._rollback(dryrun, force, dsguard)
2567 2567 else:
2568 2568 self.ui.warn(_(b"no rollback information available\n"))
2569 2569 return 1
2570 2570 finally:
2571 2571 release(dsguard, lock, wlock)
2572 2572
2573 2573 @unfilteredmethod # Until we get smarter cache management
2574 2574 def _rollback(self, dryrun, force, dsguard):
2575 2575 ui = self.ui
2576 2576 try:
2577 2577 args = self.vfs.read(b'undo.desc').splitlines()
2578 2578 (oldlen, desc, detail) = (int(args[0]), args[1], None)
2579 2579 if len(args) >= 3:
2580 2580 detail = args[2]
2581 2581 oldtip = oldlen - 1
2582 2582
2583 2583 if detail and ui.verbose:
2584 2584 msg = _(
2585 2585 b'repository tip rolled back to revision %d'
2586 2586 b' (undo %s: %s)\n'
2587 2587 ) % (oldtip, desc, detail)
2588 2588 else:
2589 2589 msg = _(
2590 2590 b'repository tip rolled back to revision %d (undo %s)\n'
2591 2591 ) % (oldtip, desc)
2592 2592 except IOError:
2593 2593 msg = _(b'rolling back unknown transaction\n')
2594 2594 desc = None
2595 2595
2596 2596 if not force and self[b'.'] != self[b'tip'] and desc == b'commit':
2597 2597 raise error.Abort(
2598 2598 _(
2599 2599 b'rollback of last commit while not checked out '
2600 2600 b'may lose data'
2601 2601 ),
2602 2602 hint=_(b'use -f to force'),
2603 2603 )
2604 2604
2605 2605 ui.status(msg)
2606 2606 if dryrun:
2607 2607 return 0
2608 2608
2609 2609 parents = self.dirstate.parents()
2610 2610 self.destroying()
2611 2611 vfsmap = {b'plain': self.vfs, b'': self.svfs}
2612 2612 transaction.rollback(
2613 2613 self.svfs, vfsmap, b'undo', ui.warn, checkambigfiles=_cachedfiles
2614 2614 )
2615 2615 bookmarksvfs = bookmarks.bookmarksvfs(self)
2616 2616 if bookmarksvfs.exists(b'undo.bookmarks'):
2617 2617 bookmarksvfs.rename(
2618 2618 b'undo.bookmarks', b'bookmarks', checkambig=True
2619 2619 )
2620 2620 if self.svfs.exists(b'undo.phaseroots'):
2621 2621 self.svfs.rename(b'undo.phaseroots', b'phaseroots', checkambig=True)
2622 2622 self.invalidate()
2623 2623
2624 2624 has_node = self.changelog.index.has_node
2625 2625 parentgone = any(not has_node(p) for p in parents)
2626 2626 if parentgone:
2627 2627 # prevent dirstateguard from overwriting already restored one
2628 2628 dsguard.close()
2629 2629
2630 2630 narrowspec.restorebackup(self, b'undo.narrowspec')
2631 2631 narrowspec.restorewcbackup(self, b'undo.narrowspec.dirstate')
2632 2632 self.dirstate.restorebackup(None, b'undo.dirstate')
2633 2633 try:
2634 2634 branch = self.vfs.read(b'undo.branch')
2635 2635 self.dirstate.setbranch(encoding.tolocal(branch))
2636 2636 except IOError:
2637 2637 ui.warn(
2638 2638 _(
2639 2639 b'named branch could not be reset: '
2640 2640 b'current branch is still \'%s\'\n'
2641 2641 )
2642 2642 % self.dirstate.branch()
2643 2643 )
2644 2644
2645 2645 parents = tuple([p.rev() for p in self[None].parents()])
2646 2646 if len(parents) > 1:
2647 2647 ui.status(
2648 2648 _(
2649 2649 b'working directory now based on '
2650 2650 b'revisions %d and %d\n'
2651 2651 )
2652 2652 % parents
2653 2653 )
2654 2654 else:
2655 2655 ui.status(
2656 2656 _(b'working directory now based on revision %d\n') % parents
2657 2657 )
2658 2658 mergestatemod.mergestate.clean(self)
2659 2659
2660 2660 # TODO: if we know which new heads may result from this rollback, pass
2661 2661 # them to destroy(), which will prevent the branchhead cache from being
2662 2662 # invalidated.
2663 2663 self.destroyed()
2664 2664 return 0
2665 2665
2666 2666 def _buildcacheupdater(self, newtransaction):
2667 2667 """called during transaction to build the callback updating cache
2668 2668
2669 2669 Lives on the repository to help extension who might want to augment
2670 2670 this logic. For this purpose, the created transaction is passed to the
2671 2671 method.
2672 2672 """
2673 2673 # we must avoid cyclic reference between repo and transaction.
2674 2674 reporef = weakref.ref(self)
2675 2675
2676 2676 def updater(tr):
2677 2677 repo = reporef()
2678 2678 repo.updatecaches(tr)
2679 2679
2680 2680 return updater
2681 2681
2682 2682 @unfilteredmethod
2683 2683 def updatecaches(self, tr=None, full=False):
2684 2684 """warm appropriate caches
2685 2685
2686 2686 If this function is called after a transaction closed. The transaction
2687 2687 will be available in the 'tr' argument. This can be used to selectively
2688 2688 update caches relevant to the changes in that transaction.
2689 2689
2690 2690 If 'full' is set, make sure all caches the function knows about have
2691 2691 up-to-date data. Even the ones usually loaded more lazily.
2692 2692 """
2693 2693 if tr is not None and tr.hookargs.get(b'source') == b'strip':
2694 2694 # During strip, many caches are invalid but
2695 2695 # later call to `destroyed` will refresh them.
2696 2696 return
2697 2697
2698 2698 if tr is None or tr.changes[b'origrepolen'] < len(self):
2699 2699 # accessing the 'served' branchmap should refresh all the others,
2700 2700 self.ui.debug(b'updating the branch cache\n')
2701 2701 self.filtered(b'served').branchmap()
2702 2702 self.filtered(b'served.hidden').branchmap()
2703 2703
2704 2704 if full:
2705 2705 unfi = self.unfiltered()
2706 2706
2707 2707 self.changelog.update_caches(transaction=tr)
2708 2708 self.manifestlog.update_caches(transaction=tr)
2709 2709
2710 2710 rbc = unfi.revbranchcache()
2711 2711 for r in unfi.changelog:
2712 2712 rbc.branchinfo(r)
2713 2713 rbc.write()
2714 2714
2715 2715 # ensure the working copy parents are in the manifestfulltextcache
2716 2716 for ctx in self[b'.'].parents():
2717 2717 ctx.manifest() # accessing the manifest is enough
2718 2718
2719 2719 # accessing fnode cache warms the cache
2720 2720 tagsmod.fnoderevs(self.ui, unfi, unfi.changelog.revs())
2721 2721 # accessing tags warm the cache
2722 2722 self.tags()
2723 2723 self.filtered(b'served').tags()
2724 2724
2725 2725 # The `full` arg is documented as updating even the lazily-loaded
2726 2726 # caches immediately, so we're forcing a write to cause these caches
2727 2727 # to be warmed up even if they haven't explicitly been requested
2728 2728 # yet (if they've never been used by hg, they won't ever have been
2729 2729 # written, even if they're a subset of another kind of cache that
2730 2730 # *has* been used).
2731 2731 for filt in repoview.filtertable.keys():
2732 2732 filtered = self.filtered(filt)
2733 2733 filtered.branchmap().write(filtered)
2734 2734
2735 2735 def invalidatecaches(self):
2736 2736
2737 2737 if '_tagscache' in vars(self):
2738 2738 # can't use delattr on proxy
2739 2739 del self.__dict__['_tagscache']
2740 2740
2741 2741 self._branchcaches.clear()
2742 2742 self.invalidatevolatilesets()
2743 2743 self._sparsesignaturecache.clear()
2744 2744
2745 2745 def invalidatevolatilesets(self):
2746 2746 self.filteredrevcache.clear()
2747 2747 obsolete.clearobscaches(self)
2748 2748 self._quick_access_changeid_invalidate()
2749 2749
2750 2750 def invalidatedirstate(self):
2751 2751 """Invalidates the dirstate, causing the next call to dirstate
2752 2752 to check if it was modified since the last time it was read,
2753 2753 rereading it if it has.
2754 2754
2755 2755 This is different to dirstate.invalidate() that it doesn't always
2756 2756 rereads the dirstate. Use dirstate.invalidate() if you want to
2757 2757 explicitly read the dirstate again (i.e. restoring it to a previous
2758 2758 known good state)."""
2759 2759 if hasunfilteredcache(self, 'dirstate'):
2760 2760 for k in self.dirstate._filecache:
2761 2761 try:
2762 2762 delattr(self.dirstate, k)
2763 2763 except AttributeError:
2764 2764 pass
2765 2765 delattr(self.unfiltered(), 'dirstate')
2766 2766
2767 2767 def invalidate(self, clearfilecache=False):
2768 2768 """Invalidates both store and non-store parts other than dirstate
2769 2769
2770 2770 If a transaction is running, invalidation of store is omitted,
2771 2771 because discarding in-memory changes might cause inconsistency
2772 2772 (e.g. incomplete fncache causes unintentional failure, but
2773 2773 redundant one doesn't).
2774 2774 """
2775 2775 unfiltered = self.unfiltered() # all file caches are stored unfiltered
2776 2776 for k in list(self._filecache.keys()):
2777 2777 # dirstate is invalidated separately in invalidatedirstate()
2778 2778 if k == b'dirstate':
2779 2779 continue
2780 2780 if (
2781 2781 k == b'changelog'
2782 2782 and self.currenttransaction()
2783 2783 and self.changelog._delayed
2784 2784 ):
2785 2785 # The changelog object may store unwritten revisions. We don't
2786 2786 # want to lose them.
2787 2787 # TODO: Solve the problem instead of working around it.
2788 2788 continue
2789 2789
2790 2790 if clearfilecache:
2791 2791 del self._filecache[k]
2792 2792 try:
2793 2793 delattr(unfiltered, k)
2794 2794 except AttributeError:
2795 2795 pass
2796 2796 self.invalidatecaches()
2797 2797 if not self.currenttransaction():
2798 2798 # TODO: Changing contents of store outside transaction
2799 2799 # causes inconsistency. We should make in-memory store
2800 2800 # changes detectable, and abort if changed.
2801 2801 self.store.invalidatecaches()
2802 2802
2803 2803 def invalidateall(self):
2804 2804 """Fully invalidates both store and non-store parts, causing the
2805 2805 subsequent operation to reread any outside changes."""
2806 2806 # extension should hook this to invalidate its caches
2807 2807 self.invalidate()
2808 2808 self.invalidatedirstate()
2809 2809
2810 2810 @unfilteredmethod
2811 2811 def _refreshfilecachestats(self, tr):
2812 2812 """Reload stats of cached files so that they are flagged as valid"""
2813 2813 for k, ce in self._filecache.items():
2814 2814 k = pycompat.sysstr(k)
2815 2815 if k == 'dirstate' or k not in self.__dict__:
2816 2816 continue
2817 2817 ce.refresh()
2818 2818
2819 2819 def _lock(
2820 2820 self,
2821 2821 vfs,
2822 2822 lockname,
2823 2823 wait,
2824 2824 releasefn,
2825 2825 acquirefn,
2826 2826 desc,
2827 2827 ):
2828 2828 timeout = 0
2829 2829 warntimeout = 0
2830 2830 if wait:
2831 2831 timeout = self.ui.configint(b"ui", b"timeout")
2832 2832 warntimeout = self.ui.configint(b"ui", b"timeout.warn")
2833 2833 # internal config: ui.signal-safe-lock
2834 2834 signalsafe = self.ui.configbool(b'ui', b'signal-safe-lock')
2835 2835
2836 2836 l = lockmod.trylock(
2837 2837 self.ui,
2838 2838 vfs,
2839 2839 lockname,
2840 2840 timeout,
2841 2841 warntimeout,
2842 2842 releasefn=releasefn,
2843 2843 acquirefn=acquirefn,
2844 2844 desc=desc,
2845 2845 signalsafe=signalsafe,
2846 2846 )
2847 2847 return l
2848 2848
2849 2849 def _afterlock(self, callback):
2850 2850 """add a callback to be run when the repository is fully unlocked
2851 2851
2852 2852 The callback will be executed when the outermost lock is released
2853 2853 (with wlock being higher level than 'lock')."""
2854 2854 for ref in (self._wlockref, self._lockref):
2855 2855 l = ref and ref()
2856 2856 if l and l.held:
2857 2857 l.postrelease.append(callback)
2858 2858 break
2859 2859 else: # no lock have been found.
2860 2860 callback(True)
2861 2861
2862 2862 def lock(self, wait=True):
2863 2863 """Lock the repository store (.hg/store) and return a weak reference
2864 2864 to the lock. Use this before modifying the store (e.g. committing or
2865 2865 stripping). If you are opening a transaction, get a lock as well.)
2866 2866
2867 2867 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
2868 2868 'wlock' first to avoid a dead-lock hazard."""
2869 2869 l = self._currentlock(self._lockref)
2870 2870 if l is not None:
2871 2871 l.lock()
2872 2872 return l
2873 2873
2874 2874 l = self._lock(
2875 2875 vfs=self.svfs,
2876 2876 lockname=b"lock",
2877 2877 wait=wait,
2878 2878 releasefn=None,
2879 2879 acquirefn=self.invalidate,
2880 2880 desc=_(b'repository %s') % self.origroot,
2881 2881 )
2882 2882 self._lockref = weakref.ref(l)
2883 2883 return l
2884 2884
2885 2885 def wlock(self, wait=True):
2886 2886 """Lock the non-store parts of the repository (everything under
2887 2887 .hg except .hg/store) and return a weak reference to the lock.
2888 2888
2889 2889 Use this before modifying files in .hg.
2890 2890
2891 2891 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
2892 2892 'wlock' first to avoid a dead-lock hazard."""
2893 2893 l = self._wlockref and self._wlockref()
2894 2894 if l is not None and l.held:
2895 2895 l.lock()
2896 2896 return l
2897 2897
2898 2898 # We do not need to check for non-waiting lock acquisition. Such
2899 2899 # acquisition would not cause dead-lock as they would just fail.
2900 2900 if wait and (
2901 2901 self.ui.configbool(b'devel', b'all-warnings')
2902 2902 or self.ui.configbool(b'devel', b'check-locks')
2903 2903 ):
2904 2904 if self._currentlock(self._lockref) is not None:
2905 2905 self.ui.develwarn(b'"wlock" acquired after "lock"')
2906 2906
2907 2907 def unlock():
2908 2908 if self.dirstate.pendingparentchange():
2909 2909 self.dirstate.invalidate()
2910 2910 else:
2911 2911 self.dirstate.write(None)
2912 2912
2913 2913 self._filecache[b'dirstate'].refresh()
2914 2914
2915 2915 l = self._lock(
2916 2916 self.vfs,
2917 2917 b"wlock",
2918 2918 wait,
2919 2919 unlock,
2920 2920 self.invalidatedirstate,
2921 2921 _(b'working directory of %s') % self.origroot,
2922 2922 )
2923 2923 self._wlockref = weakref.ref(l)
2924 2924 return l
2925 2925
2926 2926 def _currentlock(self, lockref):
2927 2927 """Returns the lock if it's held, or None if it's not."""
2928 2928 if lockref is None:
2929 2929 return None
2930 2930 l = lockref()
2931 2931 if l is None or not l.held:
2932 2932 return None
2933 2933 return l
2934 2934
2935 2935 def currentwlock(self):
2936 2936 """Returns the wlock if it's held, or None if it's not."""
2937 2937 return self._currentlock(self._wlockref)
2938 2938
2939 2939 def checkcommitpatterns(self, wctx, match, status, fail):
2940 2940 """check for commit arguments that aren't committable"""
2941 2941 if match.isexact() or match.prefix():
2942 2942 matched = set(status.modified + status.added + status.removed)
2943 2943
2944 2944 for f in match.files():
2945 2945 f = self.dirstate.normalize(f)
2946 2946 if f == b'.' or f in matched or f in wctx.substate:
2947 2947 continue
2948 2948 if f in status.deleted:
2949 2949 fail(f, _(b'file not found!'))
2950 2950 # Is it a directory that exists or used to exist?
2951 2951 if self.wvfs.isdir(f) or wctx.p1().hasdir(f):
2952 2952 d = f + b'/'
2953 2953 for mf in matched:
2954 2954 if mf.startswith(d):
2955 2955 break
2956 2956 else:
2957 2957 fail(f, _(b"no match under directory!"))
2958 2958 elif f not in self.dirstate:
2959 2959 fail(f, _(b"file not tracked!"))
2960 2960
2961 2961 @unfilteredmethod
2962 2962 def commit(
2963 2963 self,
2964 2964 text=b"",
2965 2965 user=None,
2966 2966 date=None,
2967 2967 match=None,
2968 2968 force=False,
2969 2969 editor=None,
2970 2970 extra=None,
2971 2971 ):
2972 2972 """Add a new revision to current repository.
2973 2973
2974 2974 Revision information is gathered from the working directory,
2975 2975 match can be used to filter the committed files. If editor is
2976 2976 supplied, it is called to get a commit message.
2977 2977 """
2978 2978 if extra is None:
2979 2979 extra = {}
2980 2980
2981 2981 def fail(f, msg):
2982 2982 raise error.InputError(b'%s: %s' % (f, msg))
2983 2983
2984 2984 if not match:
2985 2985 match = matchmod.always()
2986 2986
2987 2987 if not force:
2988 2988 match.bad = fail
2989 2989
2990 2990 # lock() for recent changelog (see issue4368)
2991 2991 with self.wlock(), self.lock():
2992 2992 wctx = self[None]
2993 2993 merge = len(wctx.parents()) > 1
2994 2994
2995 2995 if not force and merge and not match.always():
2996 2996 raise error.Abort(
2997 2997 _(
2998 2998 b'cannot partially commit a merge '
2999 2999 b'(do not specify files or patterns)'
3000 3000 )
3001 3001 )
3002 3002
3003 3003 status = self.status(match=match, clean=force)
3004 3004 if force:
3005 3005 status.modified.extend(
3006 3006 status.clean
3007 3007 ) # mq may commit clean files
3008 3008
3009 3009 # check subrepos
3010 3010 subs, commitsubs, newstate = subrepoutil.precommit(
3011 3011 self.ui, wctx, status, match, force=force
3012 3012 )
3013 3013
3014 3014 # make sure all explicit patterns are matched
3015 3015 if not force:
3016 3016 self.checkcommitpatterns(wctx, match, status, fail)
3017 3017
3018 3018 cctx = context.workingcommitctx(
3019 3019 self, status, text, user, date, extra
3020 3020 )
3021 3021
3022 3022 ms = mergestatemod.mergestate.read(self)
3023 3023 mergeutil.checkunresolved(ms)
3024 3024
3025 3025 # internal config: ui.allowemptycommit
3026 3026 if cctx.isempty() and not self.ui.configbool(
3027 3027 b'ui', b'allowemptycommit'
3028 3028 ):
3029 3029 self.ui.debug(b'nothing to commit, clearing merge state\n')
3030 3030 ms.reset()
3031 3031 return None
3032 3032
3033 3033 if merge and cctx.deleted():
3034 3034 raise error.Abort(_(b"cannot commit merge with missing files"))
3035 3035
3036 3036 if editor:
3037 3037 cctx._text = editor(self, cctx, subs)
3038 3038 edited = text != cctx._text
3039 3039
3040 3040 # Save commit message in case this transaction gets rolled back
3041 3041 # (e.g. by a pretxncommit hook). Leave the content alone on
3042 3042 # the assumption that the user will use the same editor again.
3043 3043 msgfn = self.savecommitmessage(cctx._text)
3044 3044
3045 3045 # commit subs and write new state
3046 3046 if subs:
3047 3047 uipathfn = scmutil.getuipathfn(self)
3048 3048 for s in sorted(commitsubs):
3049 3049 sub = wctx.sub(s)
3050 3050 self.ui.status(
3051 3051 _(b'committing subrepository %s\n')
3052 3052 % uipathfn(subrepoutil.subrelpath(sub))
3053 3053 )
3054 3054 sr = sub.commit(cctx._text, user, date)
3055 3055 newstate[s] = (newstate[s][0], sr)
3056 3056 subrepoutil.writestate(self, newstate)
3057 3057
3058 3058 p1, p2 = self.dirstate.parents()
3059 3059 hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or b'')
3060 3060 try:
3061 3061 self.hook(
3062 3062 b"precommit", throw=True, parent1=hookp1, parent2=hookp2
3063 3063 )
3064 3064 with self.transaction(b'commit'):
3065 3065 ret = self.commitctx(cctx, True)
3066 3066 # update bookmarks, dirstate and mergestate
3067 3067 bookmarks.update(self, [p1, p2], ret)
3068 3068 cctx.markcommitted(ret)
3069 3069 ms.reset()
3070 3070 except: # re-raises
3071 3071 if edited:
3072 3072 self.ui.write(
3073 3073 _(b'note: commit message saved in %s\n') % msgfn
3074 3074 )
3075 3075 self.ui.write(
3076 3076 _(
3077 3077 b"note: use 'hg commit --logfile "
3078 3078 b".hg/last-message.txt --edit' to reuse it\n"
3079 3079 )
3080 3080 )
3081 3081 raise
3082 3082
3083 3083 def commithook(unused_success):
3084 3084 # hack for command that use a temporary commit (eg: histedit)
3085 3085 # temporary commit got stripped before hook release
3086 3086 if self.changelog.hasnode(ret):
3087 3087 self.hook(
3088 3088 b"commit", node=hex(ret), parent1=hookp1, parent2=hookp2
3089 3089 )
3090 3090
3091 3091 self._afterlock(commithook)
3092 3092 return ret
3093 3093
3094 3094 @unfilteredmethod
3095 3095 def commitctx(self, ctx, error=False, origctx=None):
3096 3096 return commit.commitctx(self, ctx, error=error, origctx=origctx)
3097 3097
3098 3098 @unfilteredmethod
3099 3099 def destroying(self):
3100 3100 """Inform the repository that nodes are about to be destroyed.
3101 3101 Intended for use by strip and rollback, so there's a common
3102 3102 place for anything that has to be done before destroying history.
3103 3103
3104 3104 This is mostly useful for saving state that is in memory and waiting
3105 3105 to be flushed when the current lock is released. Because a call to
3106 3106 destroyed is imminent, the repo will be invalidated causing those
3107 3107 changes to stay in memory (waiting for the next unlock), or vanish
3108 3108 completely.
3109 3109 """
3110 3110 # When using the same lock to commit and strip, the phasecache is left
3111 3111 # dirty after committing. Then when we strip, the repo is invalidated,
3112 3112 # causing those changes to disappear.
3113 3113 if '_phasecache' in vars(self):
3114 3114 self._phasecache.write()
3115 3115
3116 3116 @unfilteredmethod
3117 3117 def destroyed(self):
3118 3118 """Inform the repository that nodes have been destroyed.
3119 3119 Intended for use by strip and rollback, so there's a common
3120 3120 place for anything that has to be done after destroying history.
3121 3121 """
3122 3122 # When one tries to:
3123 3123 # 1) destroy nodes thus calling this method (e.g. strip)
3124 3124 # 2) use phasecache somewhere (e.g. commit)
3125 3125 #
3126 3126 # then 2) will fail because the phasecache contains nodes that were
3127 3127 # removed. We can either remove phasecache from the filecache,
3128 3128 # causing it to reload next time it is accessed, or simply filter
3129 3129 # the removed nodes now and write the updated cache.
3130 3130 self._phasecache.filterunknown(self)
3131 3131 self._phasecache.write()
3132 3132
3133 3133 # refresh all repository caches
3134 3134 self.updatecaches()
3135 3135
3136 3136 # Ensure the persistent tag cache is updated. Doing it now
3137 3137 # means that the tag cache only has to worry about destroyed
3138 3138 # heads immediately after a strip/rollback. That in turn
3139 3139 # guarantees that "cachetip == currenttip" (comparing both rev
3140 3140 # and node) always means no nodes have been added or destroyed.
3141 3141
3142 3142 # XXX this is suboptimal when qrefresh'ing: we strip the current
3143 3143 # head, refresh the tag cache, then immediately add a new head.
3144 3144 # But I think doing it this way is necessary for the "instant
3145 3145 # tag cache retrieval" case to work.
3146 3146 self.invalidate()
3147 3147
3148 3148 def status(
3149 3149 self,
3150 3150 node1=b'.',
3151 3151 node2=None,
3152 3152 match=None,
3153 3153 ignored=False,
3154 3154 clean=False,
3155 3155 unknown=False,
3156 3156 listsubrepos=False,
3157 3157 ):
3158 3158 '''a convenience method that calls node1.status(node2)'''
3159 3159 return self[node1].status(
3160 3160 node2, match, ignored, clean, unknown, listsubrepos
3161 3161 )
3162 3162
3163 3163 def addpostdsstatus(self, ps):
3164 3164 """Add a callback to run within the wlock, at the point at which status
3165 3165 fixups happen.
3166 3166
3167 3167 On status completion, callback(wctx, status) will be called with the
3168 3168 wlock held, unless the dirstate has changed from underneath or the wlock
3169 3169 couldn't be grabbed.
3170 3170
3171 3171 Callbacks should not capture and use a cached copy of the dirstate --
3172 3172 it might change in the meanwhile. Instead, they should access the
3173 3173 dirstate via wctx.repo().dirstate.
3174 3174
3175 3175 This list is emptied out after each status run -- extensions should
3176 3176 make sure it adds to this list each time dirstate.status is called.
3177 3177 Extensions should also make sure they don't call this for statuses
3178 3178 that don't involve the dirstate.
3179 3179 """
3180 3180
3181 3181 # The list is located here for uniqueness reasons -- it is actually
3182 3182 # managed by the workingctx, but that isn't unique per-repo.
3183 3183 self._postdsstatus.append(ps)
3184 3184
3185 3185 def postdsstatus(self):
3186 3186 """Used by workingctx to get the list of post-dirstate-status hooks."""
3187 3187 return self._postdsstatus
3188 3188
3189 3189 def clearpostdsstatus(self):
3190 3190 """Used by workingctx to clear post-dirstate-status hooks."""
3191 3191 del self._postdsstatus[:]
3192 3192
3193 3193 def heads(self, start=None):
3194 3194 if start is None:
3195 3195 cl = self.changelog
3196 3196 headrevs = reversed(cl.headrevs())
3197 3197 return [cl.node(rev) for rev in headrevs]
3198 3198
3199 3199 heads = self.changelog.heads(start)
3200 3200 # sort the output in rev descending order
3201 3201 return sorted(heads, key=self.changelog.rev, reverse=True)
3202 3202
3203 3203 def branchheads(self, branch=None, start=None, closed=False):
3204 3204 """return a (possibly filtered) list of heads for the given branch
3205 3205
3206 3206 Heads are returned in topological order, from newest to oldest.
3207 3207 If branch is None, use the dirstate branch.
3208 3208 If start is not None, return only heads reachable from start.
3209 3209 If closed is True, return heads that are marked as closed as well.
3210 3210 """
3211 3211 if branch is None:
3212 3212 branch = self[None].branch()
3213 3213 branches = self.branchmap()
3214 3214 if not branches.hasbranch(branch):
3215 3215 return []
3216 3216 # the cache returns heads ordered lowest to highest
3217 3217 bheads = list(reversed(branches.branchheads(branch, closed=closed)))
3218 3218 if start is not None:
3219 3219 # filter out the heads that cannot be reached from startrev
3220 3220 fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
3221 3221 bheads = [h for h in bheads if h in fbheads]
3222 3222 return bheads
3223 3223
3224 3224 def branches(self, nodes):
3225 3225 if not nodes:
3226 3226 nodes = [self.changelog.tip()]
3227 3227 b = []
3228 3228 for n in nodes:
3229 3229 t = n
3230 3230 while True:
3231 3231 p = self.changelog.parents(n)
3232 3232 if p[1] != nullid or p[0] == nullid:
3233 3233 b.append((t, n, p[0], p[1]))
3234 3234 break
3235 3235 n = p[0]
3236 3236 return b
3237 3237
3238 3238 def between(self, pairs):
3239 3239 r = []
3240 3240
3241 3241 for top, bottom in pairs:
3242 3242 n, l, i = top, [], 0
3243 3243 f = 1
3244 3244
3245 3245 while n != bottom and n != nullid:
3246 3246 p = self.changelog.parents(n)[0]
3247 3247 if i == f:
3248 3248 l.append(n)
3249 3249 f = f * 2
3250 3250 n = p
3251 3251 i += 1
3252 3252
3253 3253 r.append(l)
3254 3254
3255 3255 return r
3256 3256
3257 3257 def checkpush(self, pushop):
3258 3258 """Extensions can override this function if additional checks have
3259 3259 to be performed before pushing, or call it if they override push
3260 3260 command.
3261 3261 """
3262 3262
3263 3263 @unfilteredpropertycache
3264 3264 def prepushoutgoinghooks(self):
3265 3265 """Return util.hooks consists of a pushop with repo, remote, outgoing
3266 3266 methods, which are called before pushing changesets.
3267 3267 """
3268 3268 return util.hooks()
3269 3269
3270 3270 def pushkey(self, namespace, key, old, new):
3271 3271 try:
3272 3272 tr = self.currenttransaction()
3273 3273 hookargs = {}
3274 3274 if tr is not None:
3275 3275 hookargs.update(tr.hookargs)
3276 3276 hookargs = pycompat.strkwargs(hookargs)
3277 3277 hookargs['namespace'] = namespace
3278 3278 hookargs['key'] = key
3279 3279 hookargs['old'] = old
3280 3280 hookargs['new'] = new
3281 3281 self.hook(b'prepushkey', throw=True, **hookargs)
3282 3282 except error.HookAbort as exc:
3283 3283 self.ui.write_err(_(b"pushkey-abort: %s\n") % exc)
3284 3284 if exc.hint:
3285 3285 self.ui.write_err(_(b"(%s)\n") % exc.hint)
3286 3286 return False
3287 3287 self.ui.debug(b'pushing key for "%s:%s"\n' % (namespace, key))
3288 3288 ret = pushkey.push(self, namespace, key, old, new)
3289 3289
3290 3290 def runhook(unused_success):
3291 3291 self.hook(
3292 3292 b'pushkey',
3293 3293 namespace=namespace,
3294 3294 key=key,
3295 3295 old=old,
3296 3296 new=new,
3297 3297 ret=ret,
3298 3298 )
3299 3299
3300 3300 self._afterlock(runhook)
3301 3301 return ret
3302 3302
3303 3303 def listkeys(self, namespace):
3304 3304 self.hook(b'prelistkeys', throw=True, namespace=namespace)
3305 3305 self.ui.debug(b'listing keys for "%s"\n' % namespace)
3306 3306 values = pushkey.list(self, namespace)
3307 3307 self.hook(b'listkeys', namespace=namespace, values=values)
3308 3308 return values
3309 3309
3310 3310 def debugwireargs(self, one, two, three=None, four=None, five=None):
3311 3311 '''used to test argument passing over the wire'''
3312 3312 return b"%s %s %s %s %s" % (
3313 3313 one,
3314 3314 two,
3315 3315 pycompat.bytestr(three),
3316 3316 pycompat.bytestr(four),
3317 3317 pycompat.bytestr(five),
3318 3318 )
3319 3319
3320 3320 def savecommitmessage(self, text):
3321 3321 fp = self.vfs(b'last-message.txt', b'wb')
3322 3322 try:
3323 3323 fp.write(text)
3324 3324 finally:
3325 3325 fp.close()
3326 3326 return self.pathto(fp.name[len(self.root) + 1 :])
3327 3327
3328 3328
3329 3329 # used to avoid circular references so destructors work
3330 3330 def aftertrans(files):
3331 3331 renamefiles = [tuple(t) for t in files]
3332 3332
3333 3333 def a():
3334 3334 for vfs, src, dest in renamefiles:
3335 3335 # if src and dest refer to a same file, vfs.rename is a no-op,
3336 3336 # leaving both src and dest on disk. delete dest to make sure
3337 3337 # the rename couldn't be such a no-op.
3338 3338 vfs.tryunlink(dest)
3339 3339 try:
3340 3340 vfs.rename(src, dest)
3341 3341 except OSError: # journal file does not yet exist
3342 3342 pass
3343 3343
3344 3344 return a
3345 3345
3346 3346
3347 3347 def undoname(fn):
3348 3348 base, name = os.path.split(fn)
3349 3349 assert name.startswith(b'journal')
3350 3350 return os.path.join(base, name.replace(b'journal', b'undo', 1))
3351 3351
3352 3352
3353 3353 def instance(ui, path, create, intents=None, createopts=None):
3354 3354 localpath = util.urllocalpath(path)
3355 3355 if create:
3356 3356 createrepository(ui, localpath, createopts=createopts)
3357 3357
3358 3358 return makelocalrepository(ui, localpath, intents=intents)
3359 3359
3360 3360
3361 3361 def islocal(path):
3362 3362 return True
3363 3363
3364 3364
3365 3365 def defaultcreateopts(ui, createopts=None):
3366 3366 """Populate the default creation options for a repository.
3367 3367
3368 3368 A dictionary of explicitly requested creation options can be passed
3369 3369 in. Missing keys will be populated.
3370 3370 """
3371 3371 createopts = dict(createopts or {})
3372 3372
3373 3373 if b'backend' not in createopts:
3374 3374 # experimental config: storage.new-repo-backend
3375 3375 createopts[b'backend'] = ui.config(b'storage', b'new-repo-backend')
3376 3376
3377 3377 return createopts
3378 3378
3379 3379
3380 3380 def newreporequirements(ui, createopts):
3381 3381 """Determine the set of requirements for a new local repository.
3382 3382
3383 3383 Extensions can wrap this function to specify custom requirements for
3384 3384 new repositories.
3385 3385 """
3386 3386 # If the repo is being created from a shared repository, we copy
3387 3387 # its requirements.
3388 3388 if b'sharedrepo' in createopts:
3389 3389 requirements = set(createopts[b'sharedrepo'].requirements)
3390 3390 if createopts.get(b'sharedrelative'):
3391 3391 requirements.add(requirementsmod.RELATIVE_SHARED_REQUIREMENT)
3392 3392 else:
3393 3393 requirements.add(requirementsmod.SHARED_REQUIREMENT)
3394 3394
3395 3395 return requirements
3396 3396
3397 3397 if b'backend' not in createopts:
3398 3398 raise error.ProgrammingError(
3399 3399 b'backend key not present in createopts; '
3400 3400 b'was defaultcreateopts() called?'
3401 3401 )
3402 3402
3403 3403 if createopts[b'backend'] != b'revlogv1':
3404 3404 raise error.Abort(
3405 3405 _(
3406 3406 b'unable to determine repository requirements for '
3407 3407 b'storage backend: %s'
3408 3408 )
3409 3409 % createopts[b'backend']
3410 3410 )
3411 3411
3412 3412 requirements = {requirementsmod.REVLOGV1_REQUIREMENT}
3413 3413 if ui.configbool(b'format', b'usestore'):
3414 3414 requirements.add(requirementsmod.STORE_REQUIREMENT)
3415 3415 if ui.configbool(b'format', b'usefncache'):
3416 3416 requirements.add(requirementsmod.FNCACHE_REQUIREMENT)
3417 3417 if ui.configbool(b'format', b'dotencode'):
3418 3418 requirements.add(requirementsmod.DOTENCODE_REQUIREMENT)
3419 3419
3420 3420 compengines = ui.configlist(b'format', b'revlog-compression')
3421 3421 for compengine in compengines:
3422 3422 if compengine in util.compengines:
3423 3423 break
3424 3424 else:
3425 3425 raise error.Abort(
3426 3426 _(
3427 3427 b'compression engines %s defined by '
3428 3428 b'format.revlog-compression not available'
3429 3429 )
3430 3430 % b', '.join(b'"%s"' % e for e in compengines),
3431 3431 hint=_(
3432 3432 b'run "hg debuginstall" to list available '
3433 3433 b'compression engines'
3434 3434 ),
3435 3435 )
3436 3436
3437 3437 # zlib is the historical default and doesn't need an explicit requirement.
3438 3438 if compengine == b'zstd':
3439 3439 requirements.add(b'revlog-compression-zstd')
3440 3440 elif compengine != b'zlib':
3441 3441 requirements.add(b'exp-compression-%s' % compengine)
3442 3442
3443 3443 if scmutil.gdinitconfig(ui):
3444 3444 requirements.add(requirementsmod.GENERALDELTA_REQUIREMENT)
3445 3445 if ui.configbool(b'format', b'sparse-revlog'):
3446 3446 requirements.add(requirementsmod.SPARSEREVLOG_REQUIREMENT)
3447 3447
3448 3448 # experimental config: format.exp-use-side-data
3449 3449 if ui.configbool(b'format', b'exp-use-side-data'):
3450 3450 requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
3451 3451 # experimental config: format.exp-use-copies-side-data-changeset
3452 3452 if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
3453 3453 requirements.add(requirementsmod.SIDEDATA_REQUIREMENT)
3454 3454 requirements.add(requirementsmod.COPIESSDC_REQUIREMENT)
3455 3455 if ui.configbool(b'experimental', b'treemanifest'):
3456 3456 requirements.add(requirementsmod.TREEMANIFEST_REQUIREMENT)
3457 3457
3458 3458 revlogv2 = ui.config(b'experimental', b'revlogv2')
3459 3459 if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
3460 3460 requirements.remove(requirementsmod.REVLOGV1_REQUIREMENT)
3461 3461 # generaldelta is implied by revlogv2.
3462 3462 requirements.discard(requirementsmod.GENERALDELTA_REQUIREMENT)
3463 3463 requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
3464 3464 # experimental config: format.internal-phase
3465 3465 if ui.configbool(b'format', b'internal-phase'):
3466 3466 requirements.add(requirementsmod.INTERNAL_PHASE_REQUIREMENT)
3467 3467
3468 3468 if createopts.get(b'narrowfiles'):
3469 3469 requirements.add(requirementsmod.NARROW_REQUIREMENT)
3470 3470
3471 3471 if createopts.get(b'lfs'):
3472 3472 requirements.add(b'lfs')
3473 3473
3474 3474 if ui.configbool(b'format', b'bookmarks-in-store'):
3475 3475 requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
3476 3476
3477 3477 if ui.configbool(b'format', b'use-persistent-nodemap'):
3478 3478 requirements.add(requirementsmod.NODEMAP_REQUIREMENT)
3479 3479
3480 3480 # if share-safe is enabled, let's create the new repository with the new
3481 3481 # requirement
3482 3482 if ui.configbool(b'format', b'use-share-safe'):
3483 3483 requirements.add(requirementsmod.SHARESAFE_REQUIREMENT)
3484 3484
3485 3485 return requirements
3486 3486
3487 3487
3488 3488 def checkrequirementscompat(ui, requirements):
3489 3489 """Checks compatibility of repository requirements enabled and disabled.
3490 3490
3491 3491 Returns a set of requirements which needs to be dropped because dependend
3492 3492 requirements are not enabled. Also warns users about it"""
3493 3493
3494 3494 dropped = set()
3495 3495
3496 3496 if requirementsmod.STORE_REQUIREMENT not in requirements:
3497 3497 if bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT in requirements:
3498 3498 ui.warn(
3499 3499 _(
3500 3500 b'ignoring enabled \'format.bookmarks-in-store\' config '
3501 3501 b'beacuse it is incompatible with disabled '
3502 3502 b'\'format.usestore\' config\n'
3503 3503 )
3504 3504 )
3505 3505 dropped.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
3506 3506
3507 3507 if (
3508 3508 requirementsmod.SHARED_REQUIREMENT in requirements
3509 3509 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
3510 3510 ):
3511 3511 raise error.Abort(
3512 3512 _(
3513 3513 b"cannot create shared repository as source was created"
3514 3514 b" with 'format.usestore' config disabled"
3515 3515 )
3516 3516 )
3517 3517
3518 3518 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
3519 3519 ui.warn(
3520 3520 _(
3521 3521 b"ignoring enabled 'format.use-share-safe' config because "
3522 3522 b"it is incompatible with disabled 'format.usestore'"
3523 3523 b" config\n"
3524 3524 )
3525 3525 )
3526 3526 dropped.add(requirementsmod.SHARESAFE_REQUIREMENT)
3527 3527
3528 3528 return dropped
3529 3529
3530 3530
3531 3531 def filterknowncreateopts(ui, createopts):
3532 3532 """Filters a dict of repo creation options against options that are known.
3533 3533
3534 3534 Receives a dict of repo creation options and returns a dict of those
3535 3535 options that we don't know how to handle.
3536 3536
3537 3537 This function is called as part of repository creation. If the
3538 3538 returned dict contains any items, repository creation will not
3539 3539 be allowed, as it means there was a request to create a repository
3540 3540 with options not recognized by loaded code.
3541 3541
3542 3542 Extensions can wrap this function to filter out creation options
3543 3543 they know how to handle.
3544 3544 """
3545 3545 known = {
3546 3546 b'backend',
3547 3547 b'lfs',
3548 3548 b'narrowfiles',
3549 3549 b'sharedrepo',
3550 3550 b'sharedrelative',
3551 3551 b'shareditems',
3552 3552 b'shallowfilestore',
3553 3553 }
3554 3554
3555 3555 return {k: v for k, v in createopts.items() if k not in known}
3556 3556
3557 3557
3558 3558 def createrepository(ui, path, createopts=None):
3559 3559 """Create a new repository in a vfs.
3560 3560
3561 3561 ``path`` path to the new repo's working directory.
3562 3562 ``createopts`` options for the new repository.
3563 3563
3564 3564 The following keys for ``createopts`` are recognized:
3565 3565
3566 3566 backend
3567 3567 The storage backend to use.
3568 3568 lfs
3569 3569 Repository will be created with ``lfs`` requirement. The lfs extension
3570 3570 will automatically be loaded when the repository is accessed.
3571 3571 narrowfiles
3572 3572 Set up repository to support narrow file storage.
3573 3573 sharedrepo
3574 3574 Repository object from which storage should be shared.
3575 3575 sharedrelative
3576 3576 Boolean indicating if the path to the shared repo should be
3577 3577 stored as relative. By default, the pointer to the "parent" repo
3578 3578 is stored as an absolute path.
3579 3579 shareditems
3580 3580 Set of items to share to the new repository (in addition to storage).
3581 3581 shallowfilestore
3582 3582 Indicates that storage for files should be shallow (not all ancestor
3583 3583 revisions are known).
3584 3584 """
3585 3585 createopts = defaultcreateopts(ui, createopts=createopts)
3586 3586
3587 3587 unknownopts = filterknowncreateopts(ui, createopts)
3588 3588
3589 3589 if not isinstance(unknownopts, dict):
3590 3590 raise error.ProgrammingError(
3591 3591 b'filterknowncreateopts() did not return a dict'
3592 3592 )
3593 3593
3594 3594 if unknownopts:
3595 3595 raise error.Abort(
3596 3596 _(
3597 3597 b'unable to create repository because of unknown '
3598 3598 b'creation option: %s'
3599 3599 )
3600 3600 % b', '.join(sorted(unknownopts)),
3601 3601 hint=_(b'is a required extension not loaded?'),
3602 3602 )
3603 3603
3604 3604 requirements = newreporequirements(ui, createopts=createopts)
3605 3605 requirements -= checkrequirementscompat(ui, requirements)
3606 3606
3607 3607 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
3608 3608
3609 3609 hgvfs = vfsmod.vfs(wdirvfs.join(b'.hg'))
3610 3610 if hgvfs.exists():
3611 3611 raise error.RepoError(_(b'repository %s already exists') % path)
3612 3612
3613 3613 if b'sharedrepo' in createopts:
3614 3614 sharedpath = createopts[b'sharedrepo'].sharedpath
3615 3615
3616 3616 if createopts.get(b'sharedrelative'):
3617 3617 try:
3618 3618 sharedpath = os.path.relpath(sharedpath, hgvfs.base)
3619 3619 except (IOError, ValueError) as e:
3620 3620 # ValueError is raised on Windows if the drive letters differ
3621 3621 # on each path.
3622 3622 raise error.Abort(
3623 3623 _(b'cannot calculate relative path'),
3624 3624 hint=stringutil.forcebytestr(e),
3625 3625 )
3626 3626
3627 3627 if not wdirvfs.exists():
3628 3628 wdirvfs.makedirs()
3629 3629
3630 3630 hgvfs.makedir(notindexed=True)
3631 3631 if b'sharedrepo' not in createopts:
3632 3632 hgvfs.mkdir(b'cache')
3633 3633 hgvfs.mkdir(b'wcache')
3634 3634
3635 3635 has_store = requirementsmod.STORE_REQUIREMENT in requirements
3636 3636 if has_store and b'sharedrepo' not in createopts:
3637 3637 hgvfs.mkdir(b'store')
3638 3638
3639 3639 # We create an invalid changelog outside the store so very old
3640 3640 # Mercurial versions (which didn't know about the requirements
3641 3641 # file) encounter an error on reading the changelog. This
3642 3642 # effectively locks out old clients and prevents them from
3643 3643 # mucking with a repo in an unknown format.
3644 3644 #
3645 3645 # The revlog header has version 65535, which won't be recognized by
3646 3646 # such old clients.
3647 3647 hgvfs.append(
3648 3648 b'00changelog.i',
3649 3649 b'\0\0\xFF\xFF dummy changelog to prevent using the old repo '
3650 3650 b'layout',
3651 3651 )
3652 3652
3653 3653 # Filter the requirements into working copy and store ones
3654 3654 wcreq, storereq = scmutil.filterrequirements(requirements)
3655 3655 # write working copy ones
3656 3656 scmutil.writerequires(hgvfs, wcreq)
3657 3657 # If there are store requirements and the current repository
3658 3658 # is not a shared one, write stored requirements
3659 3659 # For new shared repository, we don't need to write the store
3660 3660 # requirements as they are already present in store requires
3661 3661 if storereq and b'sharedrepo' not in createopts:
3662 3662 storevfs = vfsmod.vfs(hgvfs.join(b'store'), cacheaudited=True)
3663 3663 scmutil.writerequires(storevfs, storereq)
3664 3664
3665 3665 # Write out file telling readers where to find the shared store.
3666 3666 if b'sharedrepo' in createopts:
3667 3667 hgvfs.write(b'sharedpath', sharedpath)
3668 3668
3669 3669 if createopts.get(b'shareditems'):
3670 3670 shared = b'\n'.join(sorted(createopts[b'shareditems'])) + b'\n'
3671 3671 hgvfs.write(b'shared', shared)
3672 3672
3673 3673
3674 3674 def poisonrepository(repo):
3675 3675 """Poison a repository instance so it can no longer be used."""
3676 3676 # Perform any cleanup on the instance.
3677 3677 repo.close()
3678 3678
3679 3679 # Our strategy is to replace the type of the object with one that
3680 3680 # has all attribute lookups result in error.
3681 3681 #
3682 3682 # But we have to allow the close() method because some constructors
3683 3683 # of repos call close() on repo references.
3684 3684 class poisonedrepository(object):
3685 3685 def __getattribute__(self, item):
3686 3686 if item == 'close':
3687 3687 return object.__getattribute__(self, item)
3688 3688
3689 3689 raise error.ProgrammingError(
3690 3690 b'repo instances should not be used after unshare'
3691 3691 )
3692 3692
3693 3693 def close(self):
3694 3694 pass
3695 3695
3696 3696 # We may have a repoview, which intercepts __setattr__. So be sure
3697 3697 # we operate at the lowest level possible.
3698 3698 object.__setattr__(repo, '__class__', poisonedrepository)
@@ -1,1250 +1,1250 b''
1 1 # logcmdutil.py - utility for log-like commands
2 2 #
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 import itertools
11 11 import os
12 12 import posixpath
13 13
14 14 from .i18n import _
15 15 from .node import (
16 16 nullid,
17 17 wdirid,
18 18 wdirrev,
19 19 )
20 20
21 21 from .thirdparty import attr
22 22
23 23 from . import (
24 24 dagop,
25 25 error,
26 26 formatter,
27 27 graphmod,
28 28 match as matchmod,
29 29 mdiff,
30 30 merge,
31 31 patch,
32 32 pathutil,
33 33 pycompat,
34 34 revset,
35 35 revsetlang,
36 36 scmutil,
37 37 smartset,
38 38 templatekw,
39 39 templater,
40 40 util,
41 41 )
42 42 from .utils import (
43 43 dateutil,
44 44 stringutil,
45 45 )
46 46
47 47
48 48 if pycompat.TYPE_CHECKING:
49 49 from typing import (
50 50 Any,
51 51 Callable,
52 52 Dict,
53 53 List,
54 54 Optional,
55 55 Tuple,
56 56 )
57 57
58 58 for t in (Any, Callable, Dict, List, Optional, Tuple):
59 59 assert t
60 60
61 61
62 62 def getlimit(opts):
63 63 """get the log limit according to option -l/--limit"""
64 64 limit = opts.get(b'limit')
65 65 if limit:
66 66 try:
67 67 limit = int(limit)
68 68 except ValueError:
69 69 raise error.Abort(_(b'limit must be a positive integer'))
70 70 if limit <= 0:
71 71 raise error.Abort(_(b'limit must be positive'))
72 72 else:
73 73 limit = None
74 74 return limit
75 75
76 76
77 77 def diff_parent(ctx):
78 78 """get the context object to use as parent when diffing
79 79
80 80
81 81 If diff.merge is enabled, an overlayworkingctx of the auto-merged parents will be returned.
82 82 """
83 83 repo = ctx.repo()
84 84 if repo.ui.configbool(b"diff", b"merge") and ctx.p2().node() != nullid:
85 85 # avoid cycle context -> subrepo -> cmdutil -> logcmdutil
86 86 from . import context
87 87
88 88 wctx = context.overlayworkingctx(repo)
89 89 wctx.setbase(ctx.p1())
90 90 with repo.ui.configoverride(
91 91 {
92 92 (
93 93 b"ui",
94 94 b"forcemerge",
95 95 ): b"internal:merge3-lie-about-conflicts",
96 96 },
97 97 b"merge-diff",
98 98 ):
99 99 repo.ui.pushbuffer()
100 100 merge.merge(ctx.p2(), wc=wctx)
101 101 repo.ui.popbuffer()
102 102 return wctx
103 103 else:
104 104 return ctx.p1()
105 105
106 106
107 107 def diffordiffstat(
108 108 ui,
109 109 repo,
110 110 diffopts,
111 111 ctx1,
112 112 ctx2,
113 113 match,
114 114 changes=None,
115 115 stat=False,
116 116 fp=None,
117 117 graphwidth=0,
118 118 prefix=b'',
119 119 root=b'',
120 120 listsubrepos=False,
121 121 hunksfilterfn=None,
122 122 ):
123 123 '''show diff or diffstat.'''
124 124 if root:
125 125 relroot = pathutil.canonpath(repo.root, repo.getcwd(), root)
126 126 else:
127 127 relroot = b''
128 128 copysourcematch = None
129 129
130 130 def compose(f, g):
131 131 return lambda x: f(g(x))
132 132
133 133 def pathfn(f):
134 134 return posixpath.join(prefix, f)
135 135
136 136 if relroot != b'':
137 137 # XXX relative roots currently don't work if the root is within a
138 138 # subrepo
139 139 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
140 140 uirelroot = uipathfn(pathfn(relroot))
141 141 relroot += b'/'
142 142 for matchroot in match.files():
143 143 if not matchroot.startswith(relroot):
144 144 ui.warn(
145 145 _(b'warning: %s not inside relative root %s\n')
146 146 % (uipathfn(pathfn(matchroot)), uirelroot)
147 147 )
148 148
149 149 relrootmatch = scmutil.match(ctx2, pats=[relroot], default=b'path')
150 150 match = matchmod.intersectmatchers(match, relrootmatch)
151 151 copysourcematch = relrootmatch
152 152
153 153 checkroot = repo.ui.configbool(
154 154 b'devel', b'all-warnings'
155 155 ) or repo.ui.configbool(b'devel', b'check-relroot')
156 156
157 157 def relrootpathfn(f):
158 158 if checkroot and not f.startswith(relroot):
159 159 raise AssertionError(
160 160 b"file %s doesn't start with relroot %s" % (f, relroot)
161 161 )
162 162 return f[len(relroot) :]
163 163
164 164 pathfn = compose(relrootpathfn, pathfn)
165 165
166 166 if stat:
167 167 diffopts = diffopts.copy(context=0, noprefix=False)
168 168 width = 80
169 169 if not ui.plain():
170 170 width = ui.termwidth() - graphwidth
171 171 # If an explicit --root was given, don't respect ui.relative-paths
172 172 if not relroot:
173 173 pathfn = compose(scmutil.getuipathfn(repo), pathfn)
174 174
175 175 chunks = ctx2.diff(
176 176 ctx1,
177 177 match,
178 178 changes,
179 179 opts=diffopts,
180 180 pathfn=pathfn,
181 181 copysourcematch=copysourcematch,
182 182 hunksfilterfn=hunksfilterfn,
183 183 )
184 184
185 185 if fp is not None or ui.canwritewithoutlabels():
186 186 out = fp or ui
187 187 if stat:
188 188 chunks = [patch.diffstat(util.iterlines(chunks), width=width)]
189 189 for chunk in util.filechunkiter(util.chunkbuffer(chunks)):
190 190 out.write(chunk)
191 191 else:
192 192 if stat:
193 193 chunks = patch.diffstatui(util.iterlines(chunks), width=width)
194 194 else:
195 195 chunks = patch.difflabel(
196 196 lambda chunks, **kwargs: chunks, chunks, opts=diffopts
197 197 )
198 198 if ui.canbatchlabeledwrites():
199 199
200 200 def gen():
201 201 for chunk, label in chunks:
202 202 yield ui.label(chunk, label=label)
203 203
204 204 for chunk in util.filechunkiter(util.chunkbuffer(gen())):
205 205 ui.write(chunk)
206 206 else:
207 207 for chunk, label in chunks:
208 208 ui.write(chunk, label=label)
209 209
210 210 node2 = ctx2.node()
211 211 for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
212 212 tempnode2 = node2
213 213 try:
214 214 if node2 is not None:
215 215 tempnode2 = ctx2.substate[subpath][1]
216 216 except KeyError:
217 217 # A subrepo that existed in node1 was deleted between node1 and
218 218 # node2 (inclusive). Thus, ctx2's substate won't contain that
219 219 # subpath. The best we can do is to ignore it.
220 220 tempnode2 = None
221 221 submatch = matchmod.subdirmatcher(subpath, match)
222 222 subprefix = repo.wvfs.reljoin(prefix, subpath)
223 223 if listsubrepos or match.exact(subpath) or any(submatch.files()):
224 224 sub.diff(
225 225 ui,
226 226 diffopts,
227 227 tempnode2,
228 228 submatch,
229 229 changes=changes,
230 230 stat=stat,
231 231 fp=fp,
232 232 prefix=subprefix,
233 233 )
234 234
235 235
236 236 class changesetdiffer(object):
237 237 """Generate diff of changeset with pre-configured filtering functions"""
238 238
239 239 def _makefilematcher(self, ctx):
240 240 return scmutil.matchall(ctx.repo())
241 241
242 242 def _makehunksfilter(self, ctx):
243 243 return None
244 244
245 245 def showdiff(self, ui, ctx, diffopts, graphwidth=0, stat=False):
246 246 diffordiffstat(
247 247 ui,
248 248 ctx.repo(),
249 249 diffopts,
250 250 diff_parent(ctx),
251 251 ctx,
252 252 match=self._makefilematcher(ctx),
253 253 stat=stat,
254 254 graphwidth=graphwidth,
255 255 hunksfilterfn=self._makehunksfilter(ctx),
256 256 )
257 257
258 258
259 259 def changesetlabels(ctx):
260 260 labels = [b'log.changeset', b'changeset.%s' % ctx.phasestr()]
261 261 if ctx.obsolete():
262 262 labels.append(b'changeset.obsolete')
263 263 if ctx.isunstable():
264 264 labels.append(b'changeset.unstable')
265 265 for instability in ctx.instabilities():
266 266 labels.append(b'instability.%s' % instability)
267 267 return b' '.join(labels)
268 268
269 269
270 270 class changesetprinter(object):
271 271 '''show changeset information when templating not requested.'''
272 272
273 273 def __init__(self, ui, repo, differ=None, diffopts=None, buffered=False):
274 274 self.ui = ui
275 275 self.repo = repo
276 276 self.buffered = buffered
277 277 self._differ = differ or changesetdiffer()
278 278 self._diffopts = patch.diffallopts(ui, diffopts)
279 279 self._includestat = diffopts and diffopts.get(b'stat')
280 280 self._includediff = diffopts and diffopts.get(b'patch')
281 281 self.header = {}
282 282 self.hunk = {}
283 283 self.lastheader = None
284 284 self.footer = None
285 285 self._columns = templatekw.getlogcolumns()
286 286
287 287 def flush(self, ctx):
288 288 rev = ctx.rev()
289 289 if rev in self.header:
290 290 h = self.header[rev]
291 291 if h != self.lastheader:
292 292 self.lastheader = h
293 293 self.ui.write(h)
294 294 del self.header[rev]
295 295 if rev in self.hunk:
296 296 self.ui.write(self.hunk[rev])
297 297 del self.hunk[rev]
298 298
299 299 def close(self):
300 300 if self.footer:
301 301 self.ui.write(self.footer)
302 302
303 303 def show(self, ctx, copies=None, **props):
304 304 props = pycompat.byteskwargs(props)
305 305 if self.buffered:
306 306 self.ui.pushbuffer(labeled=True)
307 307 self._show(ctx, copies, props)
308 308 self.hunk[ctx.rev()] = self.ui.popbuffer()
309 309 else:
310 310 self._show(ctx, copies, props)
311 311
312 312 def _show(self, ctx, copies, props):
313 313 '''show a single changeset or file revision'''
314 314 changenode = ctx.node()
315 315 graphwidth = props.get(b'graphwidth', 0)
316 316
317 317 if self.ui.quiet:
318 318 self.ui.write(
319 319 b"%s\n" % scmutil.formatchangeid(ctx), label=b'log.node'
320 320 )
321 321 return
322 322
323 323 columns = self._columns
324 324 self.ui.write(
325 325 columns[b'changeset'] % scmutil.formatchangeid(ctx),
326 326 label=changesetlabels(ctx),
327 327 )
328 328
329 329 # branches are shown first before any other names due to backwards
330 330 # compatibility
331 331 branch = ctx.branch()
332 332 # don't show the default branch name
333 333 if branch != b'default':
334 334 self.ui.write(columns[b'branch'] % branch, label=b'log.branch')
335 335
336 336 for nsname, ns in pycompat.iteritems(self.repo.names):
337 337 # branches has special logic already handled above, so here we just
338 338 # skip it
339 339 if nsname == b'branches':
340 340 continue
341 341 # we will use the templatename as the color name since those two
342 342 # should be the same
343 343 for name in ns.names(self.repo, changenode):
344 344 self.ui.write(ns.logfmt % name, label=b'log.%s' % ns.colorname)
345 345 if self.ui.debugflag:
346 346 self.ui.write(
347 347 columns[b'phase'] % ctx.phasestr(), label=b'log.phase'
348 348 )
349 349 for pctx in scmutil.meaningfulparents(self.repo, ctx):
350 350 label = b'log.parent changeset.%s' % pctx.phasestr()
351 351 self.ui.write(
352 352 columns[b'parent'] % scmutil.formatchangeid(pctx), label=label
353 353 )
354 354
355 355 if self.ui.debugflag:
356 356 mnode = ctx.manifestnode()
357 357 if mnode is None:
358 358 mnode = wdirid
359 359 mrev = wdirrev
360 360 else:
361 361 mrev = self.repo.manifestlog.rev(mnode)
362 362 self.ui.write(
363 363 columns[b'manifest']
364 364 % scmutil.formatrevnode(self.ui, mrev, mnode),
365 365 label=b'ui.debug log.manifest',
366 366 )
367 367 self.ui.write(columns[b'user'] % ctx.user(), label=b'log.user')
368 368 self.ui.write(
369 369 columns[b'date'] % dateutil.datestr(ctx.date()), label=b'log.date'
370 370 )
371 371
372 372 if ctx.isunstable():
373 373 instabilities = ctx.instabilities()
374 374 self.ui.write(
375 375 columns[b'instability'] % b', '.join(instabilities),
376 376 label=b'log.instability',
377 377 )
378 378
379 379 elif ctx.obsolete():
380 380 self._showobsfate(ctx)
381 381
382 382 self._exthook(ctx)
383 383
384 384 if self.ui.debugflag:
385 385 files = ctx.p1().status(ctx)
386 386 for key, value in zip(
387 387 [b'files', b'files+', b'files-'],
388 388 [files.modified, files.added, files.removed],
389 389 ):
390 390 if value:
391 391 self.ui.write(
392 392 columns[key] % b" ".join(value),
393 393 label=b'ui.debug log.files',
394 394 )
395 395 elif ctx.files() and self.ui.verbose:
396 396 self.ui.write(
397 397 columns[b'files'] % b" ".join(ctx.files()),
398 398 label=b'ui.note log.files',
399 399 )
400 400 if copies and self.ui.verbose:
401 401 copies = [b'%s (%s)' % c for c in copies]
402 402 self.ui.write(
403 403 columns[b'copies'] % b' '.join(copies),
404 404 label=b'ui.note log.copies',
405 405 )
406 406
407 407 extra = ctx.extra()
408 408 if extra and self.ui.debugflag:
409 409 for key, value in sorted(extra.items()):
410 410 self.ui.write(
411 411 columns[b'extra'] % (key, stringutil.escapestr(value)),
412 412 label=b'ui.debug log.extra',
413 413 )
414 414
415 415 description = ctx.description().strip()
416 416 if description:
417 417 if self.ui.verbose:
418 418 self.ui.write(
419 419 _(b"description:\n"), label=b'ui.note log.description'
420 420 )
421 421 self.ui.write(description, label=b'ui.note log.description')
422 422 self.ui.write(b"\n\n")
423 423 else:
424 424 self.ui.write(
425 425 columns[b'summary'] % description.splitlines()[0],
426 426 label=b'log.summary',
427 427 )
428 428 self.ui.write(b"\n")
429 429
430 430 self._showpatch(ctx, graphwidth)
431 431
432 432 def _showobsfate(self, ctx):
433 433 # TODO: do not depend on templater
434 434 tres = formatter.templateresources(self.repo.ui, self.repo)
435 435 t = formatter.maketemplater(
436 436 self.repo.ui,
437 437 b'{join(obsfate, "\n")}',
438 438 defaults=templatekw.keywords,
439 439 resources=tres,
440 440 )
441 441 obsfate = t.renderdefault({b'ctx': ctx}).splitlines()
442 442
443 443 if obsfate:
444 444 for obsfateline in obsfate:
445 445 self.ui.write(
446 446 self._columns[b'obsolete'] % obsfateline,
447 447 label=b'log.obsfate',
448 448 )
449 449
450 450 def _exthook(self, ctx):
451 451 """empty method used by extension as a hook point"""
452 452
453 453 def _showpatch(self, ctx, graphwidth=0):
454 454 if self._includestat:
455 455 self._differ.showdiff(
456 456 self.ui, ctx, self._diffopts, graphwidth, stat=True
457 457 )
458 458 if self._includestat and self._includediff:
459 459 self.ui.write(b"\n")
460 460 if self._includediff:
461 461 self._differ.showdiff(
462 462 self.ui, ctx, self._diffopts, graphwidth, stat=False
463 463 )
464 464 if self._includestat or self._includediff:
465 465 self.ui.write(b"\n")
466 466
467 467
468 468 class changesetformatter(changesetprinter):
469 469 """Format changeset information by generic formatter"""
470 470
471 471 def __init__(
472 472 self, ui, repo, fm, differ=None, diffopts=None, buffered=False
473 473 ):
474 474 changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
475 475 self._diffopts = patch.difffeatureopts(ui, diffopts, git=True)
476 476 self._fm = fm
477 477
478 478 def close(self):
479 479 self._fm.end()
480 480
481 481 def _show(self, ctx, copies, props):
482 482 '''show a single changeset or file revision'''
483 483 fm = self._fm
484 484 fm.startitem()
485 485 fm.context(ctx=ctx)
486 486 fm.data(rev=scmutil.intrev(ctx), node=fm.hexfunc(scmutil.binnode(ctx)))
487 487
488 488 datahint = fm.datahint()
489 489 if self.ui.quiet and not datahint:
490 490 return
491 491
492 492 fm.data(
493 493 branch=ctx.branch(),
494 494 phase=ctx.phasestr(),
495 495 user=ctx.user(),
496 496 date=fm.formatdate(ctx.date()),
497 497 desc=ctx.description(),
498 498 bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'),
499 499 tags=fm.formatlist(ctx.tags(), name=b'tag'),
500 500 parents=fm.formatlist(
501 501 [fm.hexfunc(c.node()) for c in ctx.parents()], name=b'node'
502 502 ),
503 503 )
504 504
505 505 if self.ui.debugflag or b'manifest' in datahint:
506 506 fm.data(manifest=fm.hexfunc(ctx.manifestnode() or wdirid))
507 507 if self.ui.debugflag or b'extra' in datahint:
508 508 fm.data(extra=fm.formatdict(ctx.extra()))
509 509
510 510 if (
511 511 self.ui.debugflag
512 512 or b'modified' in datahint
513 513 or b'added' in datahint
514 514 or b'removed' in datahint
515 515 ):
516 516 files = ctx.p1().status(ctx)
517 517 fm.data(
518 518 modified=fm.formatlist(files.modified, name=b'file'),
519 519 added=fm.formatlist(files.added, name=b'file'),
520 520 removed=fm.formatlist(files.removed, name=b'file'),
521 521 )
522 522
523 523 verbose = not self.ui.debugflag and self.ui.verbose
524 524 if verbose or b'files' in datahint:
525 525 fm.data(files=fm.formatlist(ctx.files(), name=b'file'))
526 526 if verbose and copies or b'copies' in datahint:
527 527 fm.data(
528 528 copies=fm.formatdict(copies or {}, key=b'name', value=b'source')
529 529 )
530 530
531 531 if self._includestat or b'diffstat' in datahint:
532 532 self.ui.pushbuffer()
533 533 self._differ.showdiff(self.ui, ctx, self._diffopts, stat=True)
534 534 fm.data(diffstat=self.ui.popbuffer())
535 535 if self._includediff or b'diff' in datahint:
536 536 self.ui.pushbuffer()
537 537 self._differ.showdiff(self.ui, ctx, self._diffopts, stat=False)
538 538 fm.data(diff=self.ui.popbuffer())
539 539
540 540
541 541 class changesettemplater(changesetprinter):
542 542 """format changeset information.
543 543
544 544 Note: there are a variety of convenience functions to build a
545 545 changesettemplater for common cases. See functions such as:
546 546 maketemplater, changesetdisplayer, buildcommittemplate, or other
547 547 functions that use changesest_templater.
548 548 """
549 549
550 550 # Arguments before "buffered" used to be positional. Consider not
551 551 # adding/removing arguments before "buffered" to not break callers.
552 552 def __init__(
553 553 self, ui, repo, tmplspec, differ=None, diffopts=None, buffered=False
554 554 ):
555 555 changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
556 556 # tres is shared with _graphnodeformatter()
557 557 self._tresources = tres = formatter.templateresources(ui, repo)
558 558 self.t = formatter.loadtemplater(
559 559 ui,
560 560 tmplspec,
561 561 defaults=templatekw.keywords,
562 562 resources=tres,
563 563 cache=templatekw.defaulttempl,
564 564 )
565 565 self._counter = itertools.count()
566 566
567 567 self._tref = tmplspec.ref
568 568 self._parts = {
569 569 b'header': b'',
570 570 b'footer': b'',
571 571 tmplspec.ref: tmplspec.ref,
572 572 b'docheader': b'',
573 573 b'docfooter': b'',
574 574 b'separator': b'',
575 575 }
576 576 if tmplspec.mapfile:
577 577 # find correct templates for current mode, for backward
578 578 # compatibility with 'log -v/-q/--debug' using a mapfile
579 579 tmplmodes = [
580 580 (True, b''),
581 581 (self.ui.verbose, b'_verbose'),
582 582 (self.ui.quiet, b'_quiet'),
583 583 (self.ui.debugflag, b'_debug'),
584 584 ]
585 585 for mode, postfix in tmplmodes:
586 586 for t in self._parts:
587 587 cur = t + postfix
588 588 if mode and cur in self.t:
589 589 self._parts[t] = cur
590 590 else:
591 591 partnames = [p for p in self._parts.keys() if p != tmplspec.ref]
592 592 m = formatter.templatepartsmap(tmplspec, self.t, partnames)
593 593 self._parts.update(m)
594 594
595 595 if self._parts[b'docheader']:
596 596 self.ui.write(self.t.render(self._parts[b'docheader'], {}))
597 597
598 598 def close(self):
599 599 if self._parts[b'docfooter']:
600 600 if not self.footer:
601 601 self.footer = b""
602 602 self.footer += self.t.render(self._parts[b'docfooter'], {})
603 603 return super(changesettemplater, self).close()
604 604
605 605 def _show(self, ctx, copies, props):
606 606 '''show a single changeset or file revision'''
607 607 props = props.copy()
608 608 props[b'ctx'] = ctx
609 609 props[b'index'] = index = next(self._counter)
610 610 props[b'revcache'] = {b'copies': copies}
611 611 graphwidth = props.get(b'graphwidth', 0)
612 612
613 613 # write separator, which wouldn't work well with the header part below
614 614 # since there's inherently a conflict between header (across items) and
615 615 # separator (per item)
616 616 if self._parts[b'separator'] and index > 0:
617 617 self.ui.write(self.t.render(self._parts[b'separator'], {}))
618 618
619 619 # write header
620 620 if self._parts[b'header']:
621 621 h = self.t.render(self._parts[b'header'], props)
622 622 if self.buffered:
623 623 self.header[ctx.rev()] = h
624 624 else:
625 625 if self.lastheader != h:
626 626 self.lastheader = h
627 627 self.ui.write(h)
628 628
629 629 # write changeset metadata, then patch if requested
630 630 key = self._parts[self._tref]
631 631 self.ui.write(self.t.render(key, props))
632 632 self._exthook(ctx)
633 633 self._showpatch(ctx, graphwidth)
634 634
635 635 if self._parts[b'footer']:
636 636 if not self.footer:
637 637 self.footer = self.t.render(self._parts[b'footer'], props)
638 638
639 639
640 640 def templatespec(tmpl, mapfile):
641 641 assert not (tmpl and mapfile)
642 642 if mapfile:
643 643 return formatter.mapfile_templatespec(b'changeset', mapfile)
644 644 else:
645 645 return formatter.literal_templatespec(tmpl)
646 646
647 647
648 648 def _lookuptemplate(ui, tmpl, style):
649 649 """Find the template matching the given template spec or style
650 650
651 651 See formatter.lookuptemplate() for details.
652 652 """
653 653
654 654 # ui settings
655 655 if not tmpl and not style: # template are stronger than style
656 656 tmpl = ui.config(b'command-templates', b'log')
657 657 if tmpl:
658 658 return formatter.literal_templatespec(templater.unquotestring(tmpl))
659 659 else:
660 660 style = util.expandpath(ui.config(b'ui', b'style'))
661 661
662 662 if not tmpl and style:
663 663 mapfile = style
664 664 fp = None
665 665 if not os.path.split(mapfile)[0]:
666 666 (mapname, fp) = templater.try_open_template(
667 667 b'map-cmdline.' + mapfile
668 668 ) or templater.try_open_template(mapfile)
669 669 if mapname:
670 670 mapfile = mapname
671 671 return formatter.mapfile_templatespec(b'changeset', mapfile, fp)
672 672
673 673 return formatter.lookuptemplate(ui, b'changeset', tmpl)
674 674
675 675
676 676 def maketemplater(ui, repo, tmpl, buffered=False):
677 677 """Create a changesettemplater from a literal template 'tmpl'
678 678 byte-string."""
679 679 spec = formatter.literal_templatespec(tmpl)
680 680 return changesettemplater(ui, repo, spec, buffered=buffered)
681 681
682 682
683 683 def changesetdisplayer(ui, repo, opts, differ=None, buffered=False):
684 684 """show one changeset using template or regular display.
685 685
686 686 Display format will be the first non-empty hit of:
687 687 1. option 'template'
688 688 2. option 'style'
689 689 3. [command-templates] setting 'log'
690 690 4. [ui] setting 'style'
691 691 If all of these values are either the unset or the empty string,
692 692 regular display via changesetprinter() is done.
693 693 """
694 694 postargs = (differ, opts, buffered)
695 695 spec = _lookuptemplate(ui, opts.get(b'template'), opts.get(b'style'))
696 696
697 697 # machine-readable formats have slightly different keyword set than
698 698 # plain templates, which are handled by changesetformatter.
699 699 # note that {b'pickle', b'debug'} can also be added to the list if needed.
700 700 if spec.ref in {b'cbor', b'json'}:
701 701 fm = ui.formatter(b'log', opts)
702 702 return changesetformatter(ui, repo, fm, *postargs)
703 703
704 704 if not spec.ref and not spec.tmpl and not spec.mapfile:
705 705 return changesetprinter(ui, repo, *postargs)
706 706
707 707 return changesettemplater(ui, repo, spec, *postargs)
708 708
709 709
710 710 @attr.s
711 711 class walkopts(object):
712 712 """Options to configure a set of revisions and file matcher factory
713 713 to scan revision/file history
714 714 """
715 715
716 716 # raw command-line parameters, which a matcher will be built from
717 717 pats = attr.ib() # type: List[bytes]
718 718 opts = attr.ib() # type: Dict[bytes, Any]
719 719
720 720 # a list of revset expressions to be traversed; if follow, it specifies
721 721 # the start revisions
722 722 revspec = attr.ib() # type: List[bytes]
723 723
724 724 # miscellaneous queries to filter revisions (see "hg help log" for details)
725 725 bookmarks = attr.ib(default=attr.Factory(list)) # type: List[bytes]
726 726 branches = attr.ib(default=attr.Factory(list)) # type: List[bytes]
727 727 date = attr.ib(default=None) # type: Optional[bytes]
728 728 keywords = attr.ib(default=attr.Factory(list)) # type: List[bytes]
729 729 no_merges = attr.ib(default=False) # type: bool
730 730 only_merges = attr.ib(default=False) # type: bool
731 731 prune_ancestors = attr.ib(default=attr.Factory(list)) # type: List[bytes]
732 732 users = attr.ib(default=attr.Factory(list)) # type: List[bytes]
733 733
734 734 # miscellaneous matcher arguments
735 735 include_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes]
736 736 exclude_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes]
737 737
738 738 # 0: no follow, 1: follow first, 2: follow both parents
739 739 follow = attr.ib(default=0) # type: int
740 740
741 741 # do not attempt filelog-based traversal, which may be fast but cannot
742 742 # include revisions where files were removed
743 743 force_changelog_traversal = attr.ib(default=False) # type: bool
744 744
745 745 # filter revisions by file patterns, which should be disabled only if
746 746 # you want to include revisions where files were unmodified
747 747 filter_revisions_by_pats = attr.ib(default=True) # type: bool
748 748
749 749 # sort revisions prior to traversal: 'desc', 'topo', or None
750 750 sort_revisions = attr.ib(default=None) # type: Optional[bytes]
751 751
752 752 # limit number of changes displayed; None means unlimited
753 753 limit = attr.ib(default=None) # type: Optional[int]
754 754
755 755
756 756 def parseopts(ui, pats, opts):
757 757 # type: (Any, List[bytes], Dict[bytes, Any]) -> walkopts
758 758 """Parse log command options into walkopts
759 759
760 760 The returned walkopts will be passed in to getrevs() or makewalker().
761 761 """
762 762 if opts.get(b'follow_first'):
763 763 follow = 1
764 764 elif opts.get(b'follow'):
765 765 follow = 2
766 766 else:
767 767 follow = 0
768 768
769 769 if opts.get(b'graph'):
770 770 if ui.configbool(b'experimental', b'log.topo'):
771 771 sort_revisions = b'topo'
772 772 else:
773 773 sort_revisions = b'desc'
774 774 else:
775 775 sort_revisions = None
776 776
777 777 return walkopts(
778 778 pats=pats,
779 779 opts=opts,
780 780 revspec=opts.get(b'rev', []),
781 781 bookmarks=opts.get(b'bookmark', []),
782 782 # branch and only_branch are really aliases and must be handled at
783 783 # the same time
784 784 branches=opts.get(b'branch', []) + opts.get(b'only_branch', []),
785 785 date=opts.get(b'date'),
786 786 keywords=opts.get(b'keyword', []),
787 787 no_merges=bool(opts.get(b'no_merges')),
788 788 only_merges=bool(opts.get(b'only_merges')),
789 789 prune_ancestors=opts.get(b'prune', []),
790 790 users=opts.get(b'user', []),
791 791 include_pats=opts.get(b'include', []),
792 792 exclude_pats=opts.get(b'exclude', []),
793 793 follow=follow,
794 794 force_changelog_traversal=bool(opts.get(b'removed')),
795 795 sort_revisions=sort_revisions,
796 796 limit=getlimit(opts),
797 797 )
798 798
799 799
800 800 def _makematcher(repo, revs, wopts):
801 801 """Build matcher and expanded patterns from log options
802 802
803 803 If --follow, revs are the revisions to follow from.
804 804
805 805 Returns (match, pats, slowpath) where
806 806 - match: a matcher built from the given pats and -I/-X opts
807 807 - pats: patterns used (globs are expanded on Windows)
808 808 - slowpath: True if patterns aren't as simple as scanning filelogs
809 809 """
810 810 # pats/include/exclude are passed to match.match() directly in
811 811 # _matchfiles() revset, but a log-like command should build its matcher
812 812 # with scmutil.match(). The difference is input pats are globbed on
813 813 # platforms without shell expansion (windows).
814 814 wctx = repo[None]
815 815 match, pats = scmutil.matchandpats(wctx, wopts.pats, wopts.opts)
816 816 slowpath = match.anypats() or (
817 817 not match.always() and wopts.force_changelog_traversal
818 818 )
819 819 if not slowpath:
820 820 if wopts.follow and wopts.revspec:
821 821 # There may be the case that a path doesn't exist in some (but
822 822 # not all) of the specified start revisions, but let's consider
823 823 # the path is valid. Missing files will be warned by the matcher.
824 824 startctxs = [repo[r] for r in revs]
825 825 for f in match.files():
826 826 found = False
827 827 for c in startctxs:
828 828 if f in c:
829 829 found = True
830 830 elif c.hasdir(f):
831 831 # If a directory exists in any of the start revisions,
832 832 # take the slow path.
833 833 found = slowpath = True
834 834 if not found:
835 835 raise error.Abort(
836 836 _(
837 837 b'cannot follow file not in any of the specified '
838 838 b'revisions: "%s"'
839 839 )
840 840 % f
841 841 )
842 842 elif wopts.follow:
843 843 for f in match.files():
844 844 if f not in wctx:
845 845 # If the file exists, it may be a directory, so let it
846 846 # take the slow path.
847 847 if os.path.exists(repo.wjoin(f)):
848 848 slowpath = True
849 849 continue
850 850 else:
851 851 raise error.Abort(
852 852 _(
853 853 b'cannot follow file not in parent '
854 854 b'revision: "%s"'
855 855 )
856 856 % f
857 857 )
858 858 filelog = repo.file(f)
859 859 if not filelog:
860 860 # A file exists in wdir but not in history, which means
861 861 # the file isn't committed yet.
862 862 raise error.Abort(
863 863 _(b'cannot follow nonexistent file: "%s"') % f
864 864 )
865 865 else:
866 866 for f in match.files():
867 867 filelog = repo.file(f)
868 868 if not filelog:
869 869 # A zero count may be a directory or deleted file, so
870 870 # try to find matching entries on the slow path.
871 871 slowpath = True
872 872
873 873 # We decided to fall back to the slowpath because at least one
874 874 # of the paths was not a file. Check to see if at least one of them
875 875 # existed in history - in that case, we'll continue down the
876 876 # slowpath; otherwise, we can turn off the slowpath
877 877 if slowpath:
878 878 for path in match.files():
879 if path == b'.' or path in repo.store:
879 if not path or path in repo.store:
880 880 break
881 881 else:
882 882 slowpath = False
883 883
884 884 return match, pats, slowpath
885 885
886 886
887 887 def _fileancestors(repo, revs, match, followfirst):
888 888 fctxs = []
889 889 for r in revs:
890 890 ctx = repo[r]
891 891 fctxs.extend(ctx[f].introfilectx() for f in ctx.walk(match))
892 892
893 893 # When displaying a revision with --patch --follow FILE, we have
894 894 # to know which file of the revision must be diffed. With
895 895 # --follow, we want the names of the ancestors of FILE in the
896 896 # revision, stored in "fcache". "fcache" is populated as a side effect
897 897 # of the graph traversal.
898 898 fcache = {}
899 899
900 900 def filematcher(ctx):
901 901 return scmutil.matchfiles(repo, fcache.get(scmutil.intrev(ctx), []))
902 902
903 903 def revgen():
904 904 for rev, cs in dagop.filectxancestors(fctxs, followfirst=followfirst):
905 905 fcache[rev] = [c.path() for c in cs]
906 906 yield rev
907 907
908 908 return smartset.generatorset(revgen(), iterasc=False), filematcher
909 909
910 910
911 911 def _makenofollowfilematcher(repo, pats, opts):
912 912 '''hook for extensions to override the filematcher for non-follow cases'''
913 913 return None
914 914
915 915
916 916 _opt2logrevset = {
917 917 b'no_merges': (b'not merge()', None),
918 918 b'only_merges': (b'merge()', None),
919 919 b'_matchfiles': (None, b'_matchfiles(%ps)'),
920 920 b'date': (b'date(%s)', None),
921 921 b'branch': (b'branch(%s)', b'%lr'),
922 922 b'_patslog': (b'filelog(%s)', b'%lr'),
923 923 b'keyword': (b'keyword(%s)', b'%lr'),
924 924 b'prune': (b'ancestors(%s)', b'not %lr'),
925 925 b'user': (b'user(%s)', b'%lr'),
926 926 }
927 927
928 928
929 929 def _makerevset(repo, wopts, slowpath):
930 930 """Return a revset string built from log options and file patterns"""
931 931 opts = {
932 932 b'branch': [b'literal:' + repo.lookupbranch(b) for b in wopts.branches],
933 933 b'date': wopts.date,
934 934 b'keyword': wopts.keywords,
935 935 b'no_merges': wopts.no_merges,
936 936 b'only_merges': wopts.only_merges,
937 937 b'prune': wopts.prune_ancestors,
938 938 b'user': [b'literal:' + v for v in wopts.users],
939 939 }
940 940
941 941 if wopts.filter_revisions_by_pats and slowpath:
942 942 # pats/include/exclude cannot be represented as separate
943 943 # revset expressions as their filtering logic applies at file
944 944 # level. For instance "-I a -X b" matches a revision touching
945 945 # "a" and "b" while "file(a) and not file(b)" does
946 946 # not. Besides, filesets are evaluated against the working
947 947 # directory.
948 948 matchargs = [b'r:', b'd:relpath']
949 949 for p in wopts.pats:
950 950 matchargs.append(b'p:' + p)
951 951 for p in wopts.include_pats:
952 952 matchargs.append(b'i:' + p)
953 953 for p in wopts.exclude_pats:
954 954 matchargs.append(b'x:' + p)
955 955 opts[b'_matchfiles'] = matchargs
956 956 elif wopts.filter_revisions_by_pats and not wopts.follow:
957 957 opts[b'_patslog'] = list(wopts.pats)
958 958
959 959 expr = []
960 960 for op, val in sorted(pycompat.iteritems(opts)):
961 961 if not val:
962 962 continue
963 963 revop, listop = _opt2logrevset[op]
964 964 if revop and b'%' not in revop:
965 965 expr.append(revop)
966 966 elif not listop:
967 967 expr.append(revsetlang.formatspec(revop, val))
968 968 else:
969 969 if revop:
970 970 val = [revsetlang.formatspec(revop, v) for v in val]
971 971 expr.append(revsetlang.formatspec(listop, val))
972 972
973 973 if wopts.bookmarks:
974 974 expr.append(
975 975 revsetlang.formatspec(
976 976 b'%lr',
977 977 [scmutil.format_bookmark_revspec(v) for v in wopts.bookmarks],
978 978 )
979 979 )
980 980
981 981 if expr:
982 982 expr = b'(' + b' and '.join(expr) + b')'
983 983 else:
984 984 expr = None
985 985 return expr
986 986
987 987
988 988 def _initialrevs(repo, wopts):
989 989 """Return the initial set of revisions to be filtered or followed"""
990 990 if wopts.revspec:
991 991 revs = scmutil.revrange(repo, wopts.revspec)
992 992 elif wopts.follow and repo.dirstate.p1() == nullid:
993 993 revs = smartset.baseset()
994 994 elif wopts.follow:
995 995 revs = repo.revs(b'.')
996 996 else:
997 997 revs = smartset.spanset(repo)
998 998 revs.reverse()
999 999 return revs
1000 1000
1001 1001
1002 1002 def makewalker(repo, wopts):
1003 1003 # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[Callable[[Any], matchmod.basematcher]]]
1004 1004 """Build (revs, makefilematcher) to scan revision/file history
1005 1005
1006 1006 - revs is the smartset to be traversed.
1007 1007 - makefilematcher is a function to map ctx to a matcher for that revision
1008 1008 """
1009 1009 revs = _initialrevs(repo, wopts)
1010 1010 if not revs:
1011 1011 return smartset.baseset(), None
1012 1012 # TODO: might want to merge slowpath with wopts.force_changelog_traversal
1013 1013 match, pats, slowpath = _makematcher(repo, revs, wopts)
1014 1014 wopts = attr.evolve(wopts, pats=pats)
1015 1015
1016 1016 filematcher = None
1017 1017 if wopts.follow:
1018 1018 if slowpath or match.always():
1019 1019 revs = dagop.revancestors(repo, revs, followfirst=wopts.follow == 1)
1020 1020 else:
1021 1021 assert not wopts.force_changelog_traversal
1022 1022 revs, filematcher = _fileancestors(
1023 1023 repo, revs, match, followfirst=wopts.follow == 1
1024 1024 )
1025 1025 revs.reverse()
1026 1026 if filematcher is None:
1027 1027 filematcher = _makenofollowfilematcher(repo, wopts.pats, wopts.opts)
1028 1028 if filematcher is None:
1029 1029
1030 1030 def filematcher(ctx):
1031 1031 return match
1032 1032
1033 1033 expr = _makerevset(repo, wopts, slowpath)
1034 1034 if wopts.sort_revisions:
1035 1035 assert wopts.sort_revisions in {b'topo', b'desc'}
1036 1036 if wopts.sort_revisions == b'topo':
1037 1037 if not revs.istopo():
1038 1038 revs = dagop.toposort(revs, repo.changelog.parentrevs)
1039 1039 # TODO: try to iterate the set lazily
1040 1040 revs = revset.baseset(list(revs), istopo=True)
1041 1041 elif not (revs.isdescending() or revs.istopo()):
1042 1042 # User-specified revs might be unsorted
1043 1043 revs.sort(reverse=True)
1044 1044 if expr:
1045 1045 matcher = revset.match(None, expr)
1046 1046 revs = matcher(repo, revs)
1047 1047 if wopts.limit is not None:
1048 1048 revs = revs.slice(0, wopts.limit)
1049 1049
1050 1050 return revs, filematcher
1051 1051
1052 1052
1053 1053 def getrevs(repo, wopts):
1054 1054 # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]]
1055 1055 """Return (revs, differ) where revs is a smartset
1056 1056
1057 1057 differ is a changesetdiffer with pre-configured file matcher.
1058 1058 """
1059 1059 revs, filematcher = makewalker(repo, wopts)
1060 1060 if not revs:
1061 1061 return revs, None
1062 1062 differ = changesetdiffer()
1063 1063 differ._makefilematcher = filematcher
1064 1064 return revs, differ
1065 1065
1066 1066
1067 1067 def _parselinerangeopt(repo, opts):
1068 1068 """Parse --line-range log option and return a list of tuples (filename,
1069 1069 (fromline, toline)).
1070 1070 """
1071 1071 linerangebyfname = []
1072 1072 for pat in opts.get(b'line_range', []):
1073 1073 try:
1074 1074 pat, linerange = pat.rsplit(b',', 1)
1075 1075 except ValueError:
1076 1076 raise error.Abort(_(b'malformatted line-range pattern %s') % pat)
1077 1077 try:
1078 1078 fromline, toline = map(int, linerange.split(b':'))
1079 1079 except ValueError:
1080 1080 raise error.Abort(_(b"invalid line range for %s") % pat)
1081 1081 msg = _(b"line range pattern '%s' must match exactly one file") % pat
1082 1082 fname = scmutil.parsefollowlinespattern(repo, None, pat, msg)
1083 1083 linerangebyfname.append(
1084 1084 (fname, util.processlinerange(fromline, toline))
1085 1085 )
1086 1086 return linerangebyfname
1087 1087
1088 1088
1089 1089 def getlinerangerevs(repo, userrevs, opts):
1090 1090 """Return (revs, differ).
1091 1091
1092 1092 "revs" are revisions obtained by processing "line-range" log options and
1093 1093 walking block ancestors of each specified file/line-range.
1094 1094
1095 1095 "differ" is a changesetdiffer with pre-configured file matcher and hunks
1096 1096 filter.
1097 1097 """
1098 1098 wctx = repo[None]
1099 1099
1100 1100 # Two-levels map of "rev -> file ctx -> [line range]".
1101 1101 linerangesbyrev = {}
1102 1102 for fname, (fromline, toline) in _parselinerangeopt(repo, opts):
1103 1103 if fname not in wctx:
1104 1104 raise error.Abort(
1105 1105 _(b'cannot follow file not in parent revision: "%s"') % fname
1106 1106 )
1107 1107 fctx = wctx.filectx(fname)
1108 1108 for fctx, linerange in dagop.blockancestors(fctx, fromline, toline):
1109 1109 rev = fctx.introrev()
1110 1110 if rev is None:
1111 1111 rev = wdirrev
1112 1112 if rev not in userrevs:
1113 1113 continue
1114 1114 linerangesbyrev.setdefault(rev, {}).setdefault(
1115 1115 fctx.path(), []
1116 1116 ).append(linerange)
1117 1117
1118 1118 def nofilterhunksfn(fctx, hunks):
1119 1119 return hunks
1120 1120
1121 1121 def hunksfilter(ctx):
1122 1122 fctxlineranges = linerangesbyrev.get(scmutil.intrev(ctx))
1123 1123 if fctxlineranges is None:
1124 1124 return nofilterhunksfn
1125 1125
1126 1126 def filterfn(fctx, hunks):
1127 1127 lineranges = fctxlineranges.get(fctx.path())
1128 1128 if lineranges is not None:
1129 1129 for hr, lines in hunks:
1130 1130 if hr is None: # binary
1131 1131 yield hr, lines
1132 1132 continue
1133 1133 if any(mdiff.hunkinrange(hr[2:], lr) for lr in lineranges):
1134 1134 yield hr, lines
1135 1135 else:
1136 1136 for hunk in hunks:
1137 1137 yield hunk
1138 1138
1139 1139 return filterfn
1140 1140
1141 1141 def filematcher(ctx):
1142 1142 files = list(linerangesbyrev.get(scmutil.intrev(ctx), []))
1143 1143 return scmutil.matchfiles(repo, files)
1144 1144
1145 1145 revs = sorted(linerangesbyrev, reverse=True)
1146 1146
1147 1147 differ = changesetdiffer()
1148 1148 differ._makefilematcher = filematcher
1149 1149 differ._makehunksfilter = hunksfilter
1150 1150 return smartset.baseset(revs), differ
1151 1151
1152 1152
1153 1153 def _graphnodeformatter(ui, displayer):
1154 1154 spec = ui.config(b'command-templates', b'graphnode')
1155 1155 if not spec:
1156 1156 return templatekw.getgraphnode # fast path for "{graphnode}"
1157 1157
1158 1158 spec = templater.unquotestring(spec)
1159 1159 if isinstance(displayer, changesettemplater):
1160 1160 # reuse cache of slow templates
1161 1161 tres = displayer._tresources
1162 1162 else:
1163 1163 tres = formatter.templateresources(ui)
1164 1164 templ = formatter.maketemplater(
1165 1165 ui, spec, defaults=templatekw.keywords, resources=tres
1166 1166 )
1167 1167
1168 1168 def formatnode(repo, ctx, cache):
1169 1169 props = {b'ctx': ctx, b'repo': repo}
1170 1170 return templ.renderdefault(props)
1171 1171
1172 1172 return formatnode
1173 1173
1174 1174
1175 1175 def displaygraph(ui, repo, dag, displayer, edgefn, getcopies=None, props=None):
1176 1176 props = props or {}
1177 1177 formatnode = _graphnodeformatter(ui, displayer)
1178 1178 state = graphmod.asciistate()
1179 1179 styles = state.styles
1180 1180
1181 1181 # only set graph styling if HGPLAIN is not set.
1182 1182 if ui.plain(b'graph'):
1183 1183 # set all edge styles to |, the default pre-3.8 behaviour
1184 1184 styles.update(dict.fromkeys(styles, b'|'))
1185 1185 else:
1186 1186 edgetypes = {
1187 1187 b'parent': graphmod.PARENT,
1188 1188 b'grandparent': graphmod.GRANDPARENT,
1189 1189 b'missing': graphmod.MISSINGPARENT,
1190 1190 }
1191 1191 for name, key in edgetypes.items():
1192 1192 # experimental config: experimental.graphstyle.*
1193 1193 styles[key] = ui.config(
1194 1194 b'experimental', b'graphstyle.%s' % name, styles[key]
1195 1195 )
1196 1196 if not styles[key]:
1197 1197 styles[key] = None
1198 1198
1199 1199 # experimental config: experimental.graphshorten
1200 1200 state.graphshorten = ui.configbool(b'experimental', b'graphshorten')
1201 1201
1202 1202 formatnode_cache = {}
1203 1203 for rev, type, ctx, parents in dag:
1204 1204 char = formatnode(repo, ctx, formatnode_cache)
1205 1205 copies = getcopies(ctx) if getcopies else None
1206 1206 edges = edgefn(type, char, state, rev, parents)
1207 1207 firstedge = next(edges)
1208 1208 width = firstedge[2]
1209 1209 displayer.show(
1210 1210 ctx, copies=copies, graphwidth=width, **pycompat.strkwargs(props)
1211 1211 )
1212 1212 lines = displayer.hunk.pop(rev).split(b'\n')
1213 1213 if not lines[-1]:
1214 1214 del lines[-1]
1215 1215 displayer.flush(ctx)
1216 1216 for type, char, width, coldata in itertools.chain([firstedge], edges):
1217 1217 graphmod.ascii(ui, state, type, char, lines, coldata)
1218 1218 lines = []
1219 1219 displayer.close()
1220 1220
1221 1221
1222 1222 def displaygraphrevs(ui, repo, revs, displayer, getrenamed):
1223 1223 revdag = graphmod.dagwalker(repo, revs)
1224 1224 displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges, getrenamed)
1225 1225
1226 1226
1227 1227 def displayrevs(ui, repo, revs, displayer, getcopies):
1228 1228 for rev in revs:
1229 1229 ctx = repo[rev]
1230 1230 copies = getcopies(ctx) if getcopies else None
1231 1231 displayer.show(ctx, copies=copies)
1232 1232 displayer.flush(ctx)
1233 1233 displayer.close()
1234 1234
1235 1235
1236 1236 def checkunsupportedgraphflags(pats, opts):
1237 1237 for op in [b"newest_first"]:
1238 1238 if op in opts and opts[op]:
1239 1239 raise error.Abort(
1240 1240 _(b"-G/--graph option is incompatible with --%s")
1241 1241 % op.replace(b"_", b"-")
1242 1242 )
1243 1243
1244 1244
1245 1245 def graphrevs(repo, nodes, opts):
1246 1246 limit = getlimit(opts)
1247 1247 nodes.reverse()
1248 1248 if limit is not None:
1249 1249 nodes = nodes[:limit]
1250 1250 return graphmod.nodes(repo, nodes)
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now