##// END OF EJS Templates
branching: merge stable into default
Raphaël Gomès -
r52207:7e6aae03 merge default
parent child Browse files
Show More
@@ -1,256 +1,257 b''
1 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,272 +1,273 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 223 d5d9177c0045d206db575bae6daa98e2cb2fe5bc 5.7.1
224 224 f67b8946bb1b6cfa8328dbf8d6a9128b69ccdcb4 5.8rc0
225 225 8d2b62d716b095507effaa8d56f87cd27ba659ab 5.8rc1
226 226 067f2c53fb24506c9e9fb4639871b13b19a85f8a 5.8
227 227 411dc27fd9fd076d6a031a08fcaace659afe2fe3 5.8.1
228 228 d7515d29761d5ada7d9c765f517db67db75dea9a 5.9rc0
229 229 2813d406b03607cdb8c06cb04c44efcc9a79d9a2 5.9rc1
230 230 53221078e0de65d1a821ce5311dec45a7a978301 5.9
231 231 86a60679cf619e14cee9442f865fcf31b142cb9f 5.9.1
232 232 750920b18aaaddd654756be40dec59d90f2643be 5.9.2
233 233 6ee0244fc1cf889ae543d2ce0ec45201ae0be6e1 5.9.3
234 234 a44bb185f6bdbecc754996d8386722e2f0123b0a 6.0rc0
235 235 5d08b289e2e526259d7d5ea32b70fe76d5b327d7 6.0
236 236 799fdf4cca80cb9ae40537a90995e6bd163ebc0b 6.0.1
237 237 75676122c2bf7594ac732b7388db4c74c648b365 6.0.2
238 238 dcec16e799ddb6d33fcd11b04af530250a417a58 6.0.3
239 239 c00d3ce4e94bb0ee8d809e25e1dcb2a5fab84e2c 6.1rc0
240 240 d4486810a1795fba9521449b8885ced034f3a6dd 6.1
241 241 5bd6bcd31dd1ebb63b8914b00064f96297267af7 6.1.1
242 242 0ddd5e1f5f67438af85d12e4ce6c39021dde9916 6.1.2
243 243 6b10151b962108f65bfa12b3918b1021ca334f73 6.1.3
244 244 0cc5f74ff7f0f4ac2427096bddbe102dbc2453ae 6.1.4
245 245 288de6f5d724bba7bf1669e2838f196962bb7528 6.2rc0
246 246 094a5fa3cf52f936e0de3f1e507c818bee5ece6b 6.2
247 247 f69bffd00abe3a1b94d1032eb2c92e611d16a192 6.2.1
248 248 b5c8524827d20fe2e0ca8fb1234a0fe35a1a36c7 6.2.2
249 249 dbdee8ac3e3fcdda1fa55b90c0a235125b7f8e6f 6.2.3
250 250 a3356ab610fc50000cf0ba55c424a4d96da11db7 6.3rc0
251 251 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
252 252 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3
253 253 04f1dba53c961dfdb875c8469adc96fa999cfbed 6.3.0
254 254 0000000000000000000000000000000000000000 6.3.0
255 255 c890d8b8bc59b18e5febf60caada629df5356ee2 6.3.1
256 256 59466b13a3ae0e29a5d4f485393e516cfbb057d0 6.3.2
257 257 8830004967ad865ead89c28a410405a6e71e0796 6.3.3
258 258 05de4896508e8ec387b33eb30d8aab78d1c8e9e4 6.4rc0
259 259 f14864fffdcab725d9eac6d4f4c07be05a35f59a 6.4
260 260 83ea6ce48b4fd09fb79c4e34cc5750c805699a53 6.4.1
261 261 f952be90b0514a576dcc8bbe758ce3847faba9bb 6.4.2
262 262 fc445f8abcf90b33db7c463816a1b3560681767f 6.4.3
263 263 da372c745e0f053bb7a64e74cccd15810d96341d 6.4.4
264 264 271a4ab29605ffa0bae5d3208eaa21a95427ff92 6.4.5
265 265 bb42988c7e156931b0ff1e93732b98173ebbcb7f 6.5rc0
266 266 3ffc7209bbae5804a53084c9dc2d41139e88c867 6.5
267 267 787af4e0e8b787e1b77a8059926b123730a4cd01 6.5.1
268 268 5a8b5420103937fca97c584c5162178eed828ada 6.5.2
269 269 c083d9776cb2fb6056715b2988d1ea48055f3162 6.5.3
270 270 27055614b68538576fb0439007009acf93fe0a49 6.6rc0
271 271 26c57e7a0890b96e2c473b394de380d6753c9230 6.6
272 272 71bd09bebbe36a09569cbfb388f371433360056b 6.6.1
273 136902b3a95db38854ebaf5198a627641065c2ea 6.6.2
@@ -1,160 +1,182 b''
1 1 # narrowwirepeer.py - passes narrow spec with unbundle command
2 2 #
3 3 # Copyright 2017 Google, Inc.
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
9 from mercurial.i18n import _
10
11 from mercurial.utils import stringutil
12
9 13 from mercurial import (
10 14 bundle2,
11 15 error,
12 16 exchange,
13 17 extensions,
14 18 hg,
15 19 narrowspec,
16 20 wireprototypes,
17 21 wireprotov1peer,
18 22 wireprotov1server,
19 23 )
20 24
21 25 from . import narrowbundle2
22 26
23 27
24 28 def uisetup():
25 29 wireprotov1peer.wirepeer.narrow_widen = peernarrowwiden
26 30
27 31
28 32 def reposetup(repo):
29 33 def wirereposetup(ui, peer):
30 34 def wrapped(orig, cmd, *args, **kwargs):
31 35 if cmd == b'unbundle':
32 36 # TODO: don't blindly add include/exclude wireproto
33 37 # arguments to unbundle.
34 38 include, exclude = repo.narrowpats
35 39 kwargs["includepats"] = b','.join(include)
36 40 kwargs["excludepats"] = b','.join(exclude)
37 41 return orig(cmd, *args, **kwargs)
38 42
39 43 extensions.wrapfunction(peer, '_calltwowaystream', wrapped)
40 44
41 45 hg.wirepeersetupfuncs.append(wirereposetup)
42 46
43 47
44 48 @wireprotov1server.wireprotocommand(
45 49 b'narrow_widen',
46 50 b'oldincludes oldexcludes'
47 51 b' newincludes newexcludes'
48 52 b' commonheads cgversion'
49 53 b' known ellipses',
50 54 permission=b'pull',
51 55 )
52 56 def narrow_widen(
53 57 repo,
54 58 proto,
55 59 oldincludes,
56 60 oldexcludes,
57 61 newincludes,
58 62 newexcludes,
59 63 commonheads,
60 64 cgversion,
61 65 known,
62 66 ellipses,
63 67 ):
64 68 """wireprotocol command to send data when a narrow clone is widen. We will
65 69 be sending a changegroup here.
66 70
67 71 The current set of arguments which are required:
68 72 oldincludes: the old includes of the narrow copy
69 73 oldexcludes: the old excludes of the narrow copy
70 74 newincludes: the new includes of the narrow copy
71 75 newexcludes: the new excludes of the narrow copy
72 76 commonheads: list of heads which are common between the server and client
73 77 cgversion(maybe): the changegroup version to produce
74 78 known: list of nodes which are known on the client (used in ellipses cases)
75 79 ellipses: whether to send ellipses data or not
76 80 """
77 81
78 82 preferuncompressed = False
79 83 try:
80 84
81 85 def splitpaths(data):
82 86 # work around ''.split(',') => ['']
83 87 return data.split(b',') if data else []
84 88
85 oldincludes = splitpaths(oldincludes)
86 newincludes = splitpaths(newincludes)
87 oldexcludes = splitpaths(oldexcludes)
88 newexcludes = splitpaths(newexcludes)
89 oldincludes = set(splitpaths(oldincludes))
90 newincludes = set(splitpaths(newincludes))
91 oldexcludes = set(splitpaths(oldexcludes))
92 newexcludes = set(splitpaths(newexcludes))
89 93
90 94 # enforce narrow acl if set
91 95 if repo.ui.has_section(exchange._NARROWACL_SECTION):
92 exchange.applynarrowacl(repo, {'includepats': newincludes})
96 kwargs = exchange.applynarrowacl(
97 repo, {'includepats': newincludes, 'excludepats': newexcludes}
98 )
99 newincludes = kwargs['includepats']
100 requiredexcludes = kwargs['excludepats'] - newexcludes
101 if requiredexcludes:
102 # XXX: The below code to get the username was copied from exchange.py,
103 # where it is noted that this is technically a layering violation for
104 # assuming the existence of HTTP. Using it anyway to make the error
105 # message consistent with the error message for invalid includes.
106 ui = repo.ui
107 username = ui.shortuser(
108 ui.environ.get(b'REMOTE_USER') or ui.username()
109 )
110 raise error.Abort(
111 _(b"The following excludes cannot be removed for %s: %s")
112 % (username, stringutil.pprint(list(requiredexcludes)))
113 )
114 newexcludes = kwargs['excludepats']
93 115
94 116 # validate the patterns
95 narrowspec.validatepatterns(set(oldincludes))
96 narrowspec.validatepatterns(set(newincludes))
97 narrowspec.validatepatterns(set(oldexcludes))
98 narrowspec.validatepatterns(set(newexcludes))
117 narrowspec.validatepatterns(oldincludes)
118 narrowspec.validatepatterns(newincludes)
119 narrowspec.validatepatterns(oldexcludes)
120 narrowspec.validatepatterns(newexcludes)
99 121
100 122 common = wireprototypes.decodelist(commonheads)
101 123 known = wireprototypes.decodelist(known)
102 124 if ellipses == b'0':
103 125 ellipses = False
104 126 else:
105 127 ellipses = bool(ellipses)
106 128 cgversion = cgversion
107 129
108 130 bundler = bundle2.bundle20(repo.ui)
109 131 newmatch = narrowspec.match(
110 132 repo.root, include=newincludes, exclude=newexcludes
111 133 )
112 134 oldmatch = narrowspec.match(
113 135 repo.root, include=oldincludes, exclude=oldexcludes
114 136 )
115 137 if not ellipses:
116 138 bundle2.widen_bundle(
117 139 bundler,
118 140 repo,
119 141 oldmatch,
120 142 newmatch,
121 143 common,
122 144 known,
123 145 cgversion,
124 146 ellipses,
125 147 )
126 148 else:
127 149 narrowbundle2.generate_ellipses_bundle2_for_widening(
128 150 bundler,
129 151 repo,
130 152 oldmatch,
131 153 newmatch,
132 154 cgversion,
133 155 common,
134 156 known,
135 157 )
136 158 except error.Abort as exc:
137 159 bundler = bundle2.bundle20(repo.ui)
138 160 manargs = [(b'message', exc.message)]
139 161 advargs = []
140 162 if exc.hint is not None:
141 163 advargs.append((b'hint', exc.hint))
142 164 bundler.addpart(bundle2.bundlepart(b'error:abort', manargs, advargs))
143 165 preferuncompressed = True
144 166
145 167 chunks = bundler.getchunks()
146 168 return wireprototypes.streamres(
147 169 gen=chunks, prefer_uncompressed=preferuncompressed
148 170 )
149 171
150 172
151 173 def peernarrowwiden(remote, **kwargs):
152 174 for ch in ('commonheads', 'known'):
153 175 kwargs[ch] = wireprototypes.encodelist(kwargs[ch])
154 176
155 177 for ch in ('oldincludes', 'newincludes', 'oldexcludes', 'newexcludes'):
156 178 kwargs[ch] = b','.join(kwargs[ch])
157 179
158 180 kwargs['ellipses'] = b'%i' % bool(kwargs['ellipses'])
159 181 f = remote._callcompressable(b'narrow_widen', **kwargs)
160 182 return bundle2.getunbundler(remote.ui, f)
@@ -1,8053 +1,8058 b''
1 1 # commands.py - command processing for mercurial
2 2 #
3 3 # Copyright 2005-2007 Olivia Mackall <olivia@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
9 9 import os
10 10 import re
11 11 import sys
12 12
13 13 from .i18n import _
14 14 from .node import (
15 15 hex,
16 16 nullid,
17 17 nullrev,
18 18 short,
19 19 wdirrev,
20 20 )
21 21 from . import (
22 22 admin_commands as admin_commands_mod,
23 23 archival,
24 24 bookmarks,
25 25 bundle2,
26 26 bundlecaches,
27 27 changegroup,
28 28 cmdutil,
29 29 copies,
30 30 debugcommands as debugcommandsmod,
31 31 destutil,
32 32 diffutil,
33 33 discovery,
34 34 encoding,
35 35 error,
36 36 exchange,
37 37 extensions,
38 38 filemerge,
39 39 formatter,
40 40 graphmod,
41 41 grep as grepmod,
42 42 hbisect,
43 43 help,
44 44 hg,
45 45 logcmdutil,
46 46 merge as mergemod,
47 47 mergestate as mergestatemod,
48 48 narrowspec,
49 49 obsolete,
50 50 obsutil,
51 51 patch,
52 52 phases,
53 53 pycompat,
54 54 rcutil,
55 55 registrar,
56 56 requirements,
57 57 revsetlang,
58 58 rewriteutil,
59 59 scmutil,
60 60 server,
61 61 shelve as shelvemod,
62 62 state as statemod,
63 63 streamclone,
64 64 tags as tagsmod,
65 65 ui as uimod,
66 66 util,
67 67 verify as verifymod,
68 68 vfs as vfsmod,
69 69 wireprotoserver,
70 70 )
71 71 from .utils import (
72 72 dateutil,
73 73 procutil,
74 74 stringutil,
75 75 urlutil,
76 76 )
77 77
78 78 table = {}
79 79 table.update(debugcommandsmod.command._table)
80 80 table.update(admin_commands_mod.command._table)
81 81
82 82 command = registrar.command(table)
83 83 INTENT_READONLY = registrar.INTENT_READONLY
84 84
85 85 # common command options
86 86
87 87 globalopts = [
88 88 (
89 89 b'R',
90 90 b'repository',
91 91 b'',
92 92 _(b'repository root directory or name of overlay bundle file'),
93 93 _(b'REPO'),
94 94 ),
95 95 (b'', b'cwd', b'', _(b'change working directory'), _(b'DIR')),
96 96 (
97 97 b'y',
98 98 b'noninteractive',
99 99 None,
100 100 _(
101 101 b'do not prompt, automatically pick the first choice for all prompts'
102 102 ),
103 103 ),
104 104 (b'q', b'quiet', None, _(b'suppress output')),
105 105 (b'v', b'verbose', None, _(b'enable additional output')),
106 106 (
107 107 b'',
108 108 b'color',
109 109 b'',
110 110 # i18n: 'always', 'auto', 'never', and 'debug' are keywords
111 111 # and should not be translated
112 112 _(b"when to colorize (boolean, always, auto, never, or debug)"),
113 113 _(b'TYPE'),
114 114 ),
115 115 (
116 116 b'',
117 117 b'config',
118 118 [],
119 119 _(b'set/override config option (use \'section.name=value\')'),
120 120 _(b'CONFIG'),
121 121 ),
122 122 (b'', b'debug', None, _(b'enable debugging output')),
123 123 (b'', b'debugger', None, _(b'start debugger')),
124 124 (
125 125 b'',
126 126 b'encoding',
127 127 encoding.encoding,
128 128 _(b'set the charset encoding'),
129 129 _(b'ENCODE'),
130 130 ),
131 131 (
132 132 b'',
133 133 b'encodingmode',
134 134 encoding.encodingmode,
135 135 _(b'set the charset encoding mode'),
136 136 _(b'MODE'),
137 137 ),
138 138 (b'', b'traceback', None, _(b'always print a traceback on exception')),
139 139 (b'', b'time', None, _(b'time how long the command takes')),
140 140 (b'', b'profile', None, _(b'print command execution profile')),
141 141 (b'', b'version', None, _(b'output version information and exit')),
142 142 (b'h', b'help', None, _(b'display help and exit')),
143 143 (b'', b'hidden', False, _(b'consider hidden changesets')),
144 144 (
145 145 b'',
146 146 b'pager',
147 147 b'auto',
148 148 _(b"when to paginate (boolean, always, auto, or never)"),
149 149 _(b'TYPE'),
150 150 ),
151 151 ]
152 152
153 153 dryrunopts = cmdutil.dryrunopts
154 154 remoteopts = cmdutil.remoteopts
155 155 walkopts = cmdutil.walkopts
156 156 commitopts = cmdutil.commitopts
157 157 commitopts2 = cmdutil.commitopts2
158 158 commitopts3 = cmdutil.commitopts3
159 159 formatteropts = cmdutil.formatteropts
160 160 templateopts = cmdutil.templateopts
161 161 logopts = cmdutil.logopts
162 162 diffopts = cmdutil.diffopts
163 163 diffwsopts = cmdutil.diffwsopts
164 164 diffopts2 = cmdutil.diffopts2
165 165 mergetoolopts = cmdutil.mergetoolopts
166 166 similarityopts = cmdutil.similarityopts
167 167 subrepoopts = cmdutil.subrepoopts
168 168 debugrevlogopts = cmdutil.debugrevlogopts
169 169
170 170 # Commands start here, listed alphabetically
171 171
172 172
173 173 @command(
174 174 b'abort',
175 175 dryrunopts,
176 176 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
177 177 helpbasic=True,
178 178 )
179 179 def abort(ui, repo, **opts):
180 180 """abort an unfinished operation (EXPERIMENTAL)
181 181
182 182 Aborts a multistep operation like graft, histedit, rebase, merge,
183 183 and unshelve if they are in an unfinished state.
184 184
185 185 use --dry-run/-n to dry run the command.
186 186 """
187 187 dryrun = opts.get('dry_run')
188 188 abortstate = cmdutil.getunfinishedstate(repo)
189 189 if not abortstate:
190 190 raise error.StateError(_(b'no operation in progress'))
191 191 if not abortstate.abortfunc:
192 192 raise error.InputError(
193 193 (
194 194 _(b"%s in progress but does not support 'hg abort'")
195 195 % (abortstate._opname)
196 196 ),
197 197 hint=abortstate.hint(),
198 198 )
199 199 if dryrun:
200 200 ui.status(
201 201 _(b'%s in progress, will be aborted\n') % (abortstate._opname)
202 202 )
203 203 return
204 204 return abortstate.abortfunc(ui, repo)
205 205
206 206
207 207 @command(
208 208 b'add',
209 209 walkopts + subrepoopts + dryrunopts,
210 210 _(b'[OPTION]... [FILE]...'),
211 211 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
212 212 helpbasic=True,
213 213 inferrepo=True,
214 214 )
215 215 def add(ui, repo, *pats, **opts):
216 216 """add the specified files on the next commit
217 217
218 218 Schedule files to be version controlled and added to the
219 219 repository.
220 220
221 221 The files will be added to the repository at the next commit. To
222 222 undo an add before that, see :hg:`forget`.
223 223
224 224 If no names are given, add all files to the repository (except
225 225 files matching ``.hgignore``).
226 226
227 227 .. container:: verbose
228 228
229 229 Examples:
230 230
231 231 - New (unknown) files are added
232 232 automatically by :hg:`add`::
233 233
234 234 $ ls
235 235 foo.c
236 236 $ hg status
237 237 ? foo.c
238 238 $ hg add
239 239 adding foo.c
240 240 $ hg status
241 241 A foo.c
242 242
243 243 - Specific files to be added can be specified::
244 244
245 245 $ ls
246 246 bar.c foo.c
247 247 $ hg status
248 248 ? bar.c
249 249 ? foo.c
250 250 $ hg add bar.c
251 251 $ hg status
252 252 A bar.c
253 253 ? foo.c
254 254
255 255 Returns 0 if all files are successfully added.
256 256 """
257 257
258 258 with repo.wlock(), repo.dirstate.changing_files(repo):
259 259 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
260 260 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
261 261 rejected = cmdutil.add(ui, repo, m, b"", uipathfn, False, **opts)
262 262 return rejected and 1 or 0
263 263
264 264
265 265 @command(
266 266 b'addremove',
267 267 similarityopts + subrepoopts + walkopts + dryrunopts,
268 268 _(b'[OPTION]... [FILE]...'),
269 269 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
270 270 inferrepo=True,
271 271 )
272 272 def addremove(ui, repo, *pats, **opts):
273 273 """add all new files, delete all missing files
274 274
275 275 Add all new files and remove all missing files from the
276 276 repository.
277 277
278 278 Unless names are given, new files are ignored if they match any of
279 279 the patterns in ``.hgignore``. As with add, these changes take
280 280 effect at the next commit.
281 281
282 282 Use the -s/--similarity option to detect renamed files. This
283 283 option takes a percentage between 0 (disabled) and 100 (files must
284 284 be identical) as its parameter. With a parameter greater than 0,
285 285 this compares every removed file with every added file and records
286 286 those similar enough as renames. Detecting renamed files this way
287 287 can be expensive. After using this option, :hg:`status -C` can be
288 288 used to check which files were identified as moved or renamed. If
289 289 not specified, -s/--similarity defaults to 100 and only renames of
290 290 identical files are detected.
291 291
292 292 .. container:: verbose
293 293
294 294 Examples:
295 295
296 296 - A number of files (bar.c and foo.c) are new,
297 297 while foobar.c has been removed (without using :hg:`remove`)
298 298 from the repository::
299 299
300 300 $ ls
301 301 bar.c foo.c
302 302 $ hg status
303 303 ! foobar.c
304 304 ? bar.c
305 305 ? foo.c
306 306 $ hg addremove
307 307 adding bar.c
308 308 adding foo.c
309 309 removing foobar.c
310 310 $ hg status
311 311 A bar.c
312 312 A foo.c
313 313 R foobar.c
314 314
315 315 - A file foobar.c was moved to foo.c without using :hg:`rename`.
316 316 Afterwards, it was edited slightly::
317 317
318 318 $ ls
319 319 foo.c
320 320 $ hg status
321 321 ! foobar.c
322 322 ? foo.c
323 323 $ hg addremove --similarity 90
324 324 removing foobar.c
325 325 adding foo.c
326 326 recording removal of foobar.c as rename to foo.c (94% similar)
327 327 $ hg status -C
328 328 A foo.c
329 329 foobar.c
330 330 R foobar.c
331 331
332 332 Returns 0 if all files are successfully added.
333 333 """
334 334 opts = pycompat.byteskwargs(opts)
335 335 if not opts.get(b'similarity'):
336 336 opts[b'similarity'] = b'100'
337 337 with repo.wlock(), repo.dirstate.changing_files(repo):
338 338 matcher = scmutil.match(repo[None], pats, opts)
339 339 relative = scmutil.anypats(pats, opts)
340 340 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=relative)
341 341 return scmutil.addremove(repo, matcher, b"", uipathfn, opts)
342 342
343 343
344 344 @command(
345 345 b'annotate|blame',
346 346 [
347 347 (b'r', b'rev', b'', _(b'annotate the specified revision'), _(b'REV')),
348 348 (
349 349 b'',
350 350 b'follow',
351 351 None,
352 352 _(b'follow copies/renames and list the filename (DEPRECATED)'),
353 353 ),
354 354 (b'', b'no-follow', None, _(b"don't follow copies and renames")),
355 355 (b'a', b'text', None, _(b'treat all files as text')),
356 356 (b'u', b'user', None, _(b'list the author (long with -v)')),
357 357 (b'f', b'file', None, _(b'list the filename')),
358 358 (b'd', b'date', None, _(b'list the date (short with -q)')),
359 359 (b'n', b'number', None, _(b'list the revision number (default)')),
360 360 (b'c', b'changeset', None, _(b'list the changeset')),
361 361 (
362 362 b'l',
363 363 b'line-number',
364 364 None,
365 365 _(b'show line number at the first appearance'),
366 366 ),
367 367 (
368 368 b'',
369 369 b'skip',
370 370 [],
371 371 _(b'revset to not display (EXPERIMENTAL)'),
372 372 _(b'REV'),
373 373 ),
374 374 ]
375 375 + diffwsopts
376 376 + walkopts
377 377 + formatteropts,
378 378 _(b'[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
379 379 helpcategory=command.CATEGORY_FILE_CONTENTS,
380 380 helpbasic=True,
381 381 inferrepo=True,
382 382 )
383 383 def annotate(ui, repo, *pats, **opts):
384 384 """show changeset information by line for each file
385 385
386 386 List changes in files, showing the revision id responsible for
387 387 each line.
388 388
389 389 This command is useful for discovering when a change was made and
390 390 by whom.
391 391
392 392 If you include --file, --user, or --date, the revision number is
393 393 suppressed unless you also include --number.
394 394
395 395 Without the -a/--text option, annotate will avoid processing files
396 396 it detects as binary. With -a, annotate will annotate the file
397 397 anyway, although the results will probably be neither useful
398 398 nor desirable.
399 399
400 400 .. container:: verbose
401 401
402 402 Template:
403 403
404 404 The following keywords are supported in addition to the common template
405 405 keywords and functions. See also :hg:`help templates`.
406 406
407 407 :lines: List of lines with annotation data.
408 408 :path: String. Repository-absolute path of the specified file.
409 409
410 410 And each entry of ``{lines}`` provides the following sub-keywords in
411 411 addition to ``{date}``, ``{node}``, ``{rev}``, ``{user}``, etc.
412 412
413 413 :line: String. Line content.
414 414 :lineno: Integer. Line number at that revision.
415 415 :path: String. Repository-absolute path of the file at that revision.
416 416
417 417 See :hg:`help templates.operators` for the list expansion syntax.
418 418
419 419 Returns 0 on success.
420 420 """
421 421 opts = pycompat.byteskwargs(opts)
422 422 if not pats:
423 423 raise error.InputError(
424 424 _(b'at least one filename or pattern is required')
425 425 )
426 426
427 427 if opts.get(b'follow'):
428 428 # --follow is deprecated and now just an alias for -f/--file
429 429 # to mimic the behavior of Mercurial before version 1.5
430 430 opts[b'file'] = True
431 431
432 432 if (
433 433 not opts.get(b'user')
434 434 and not opts.get(b'changeset')
435 435 and not opts.get(b'date')
436 436 and not opts.get(b'file')
437 437 ):
438 438 opts[b'number'] = True
439 439
440 440 linenumber = opts.get(b'line_number') is not None
441 441 if (
442 442 linenumber
443 443 and (not opts.get(b'changeset'))
444 444 and (not opts.get(b'number'))
445 445 ):
446 446 raise error.InputError(_(b'at least one of -n/-c is required for -l'))
447 447
448 448 rev = opts.get(b'rev')
449 449 if rev:
450 450 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
451 451 ctx = logcmdutil.revsingle(repo, rev)
452 452
453 453 ui.pager(b'annotate')
454 454 rootfm = ui.formatter(b'annotate', opts)
455 455 if ui.debugflag:
456 456 shorthex = pycompat.identity
457 457 else:
458 458
459 459 def shorthex(h):
460 460 return h[:12]
461 461
462 462 if ui.quiet:
463 463 datefunc = dateutil.shortdate
464 464 else:
465 465 datefunc = dateutil.datestr
466 466 if ctx.rev() is None:
467 467 if opts.get(b'changeset'):
468 468 # omit "+" suffix which is appended to node hex
469 469 def formatrev(rev):
470 470 if rev == wdirrev:
471 471 return b'%d' % ctx.p1().rev()
472 472 else:
473 473 return b'%d' % rev
474 474
475 475 else:
476 476
477 477 def formatrev(rev):
478 478 if rev == wdirrev:
479 479 return b'%d+' % ctx.p1().rev()
480 480 else:
481 481 return b'%d ' % rev
482 482
483 483 def formathex(h):
484 484 if h == repo.nodeconstants.wdirhex:
485 485 return b'%s+' % shorthex(hex(ctx.p1().node()))
486 486 else:
487 487 return b'%s ' % shorthex(h)
488 488
489 489 else:
490 490 formatrev = b'%d'.__mod__
491 491 formathex = shorthex
492 492
493 493 opmap = [
494 494 (b'user', b' ', lambda x: x.fctx.user(), ui.shortuser),
495 495 (b'rev', b' ', lambda x: scmutil.intrev(x.fctx), formatrev),
496 496 (b'node', b' ', lambda x: hex(scmutil.binnode(x.fctx)), formathex),
497 497 (b'date', b' ', lambda x: x.fctx.date(), util.cachefunc(datefunc)),
498 498 (b'path', b' ', lambda x: x.fctx.path(), pycompat.bytestr),
499 499 (b'lineno', b':', lambda x: x.lineno, pycompat.bytestr),
500 500 ]
501 501 opnamemap = {
502 502 b'rev': b'number',
503 503 b'node': b'changeset',
504 504 b'path': b'file',
505 505 b'lineno': b'line_number',
506 506 }
507 507
508 508 if rootfm.isplain():
509 509
510 510 def makefunc(get, fmt):
511 511 return lambda x: fmt(get(x))
512 512
513 513 else:
514 514
515 515 def makefunc(get, fmt):
516 516 return get
517 517
518 518 datahint = rootfm.datahint()
519 519 funcmap = [
520 520 (makefunc(get, fmt), sep)
521 521 for fn, sep, get, fmt in opmap
522 522 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
523 523 ]
524 524 funcmap[0] = (funcmap[0][0], b'') # no separator in front of first column
525 525 fields = b' '.join(
526 526 fn
527 527 for fn, sep, get, fmt in opmap
528 528 if opts.get(opnamemap.get(fn, fn)) or fn in datahint
529 529 )
530 530
531 531 def bad(x, y):
532 532 raise error.InputError(b"%s: %s" % (x, y))
533 533
534 534 m = scmutil.match(ctx, pats, opts, badfn=bad)
535 535
536 536 follow = not opts.get(b'no_follow')
537 537 diffopts = patch.difffeatureopts(
538 538 ui, opts, section=b'annotate', whitespace=True
539 539 )
540 540 skiprevs = opts.get(b'skip')
541 541 if skiprevs:
542 542 skiprevs = logcmdutil.revrange(repo, skiprevs)
543 543
544 544 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
545 545 for abs in ctx.walk(m):
546 546 fctx = ctx[abs]
547 547 rootfm.startitem()
548 548 rootfm.data(path=abs)
549 549 if not opts.get(b'text') and fctx.isbinary():
550 550 rootfm.plain(_(b"%s: binary file\n") % uipathfn(abs))
551 551 continue
552 552
553 553 fm = rootfm.nested(b'lines', tmpl=b'{rev}: {line}')
554 554 lines = fctx.annotate(
555 555 follow=follow, skiprevs=skiprevs, diffopts=diffopts
556 556 )
557 557 if not lines:
558 558 fm.end()
559 559 continue
560 560 formats = []
561 561 pieces = []
562 562
563 563 for f, sep in funcmap:
564 564 l = [f(n) for n in lines]
565 565 if fm.isplain():
566 566 sizes = [encoding.colwidth(x) for x in l]
567 567 ml = max(sizes)
568 568 formats.append([sep + b' ' * (ml - w) + b'%s' for w in sizes])
569 569 else:
570 570 formats.append([b'%s'] * len(l))
571 571 pieces.append(l)
572 572
573 573 for f, p, n in zip(zip(*formats), zip(*pieces), lines):
574 574 fm.startitem()
575 575 fm.context(fctx=n.fctx)
576 576 fm.write(fields, b"".join(f), *p)
577 577 if n.skip:
578 578 fmt = b"* %s"
579 579 else:
580 580 fmt = b": %s"
581 581 fm.write(b'line', fmt, n.text)
582 582
583 583 if not lines[-1].text.endswith(b'\n'):
584 584 fm.plain(b'\n')
585 585 fm.end()
586 586
587 587 rootfm.end()
588 588
589 589
590 590 @command(
591 591 b'archive',
592 592 [
593 593 (b'', b'no-decode', None, _(b'do not pass files through decoders')),
594 594 (
595 595 b'p',
596 596 b'prefix',
597 597 b'',
598 598 _(b'directory prefix for files in archive'),
599 599 _(b'PREFIX'),
600 600 ),
601 601 (b'r', b'rev', b'', _(b'revision to distribute'), _(b'REV')),
602 602 (b't', b'type', b'', _(b'type of distribution to create'), _(b'TYPE')),
603 603 ]
604 604 + subrepoopts
605 605 + walkopts,
606 606 _(b'[OPTION]... DEST'),
607 607 helpcategory=command.CATEGORY_IMPORT_EXPORT,
608 608 )
609 609 def archive(ui, repo, dest, **opts):
610 610 """create an unversioned archive of a repository revision
611 611
612 612 By default, the revision used is the parent of the working
613 613 directory; use -r/--rev to specify a different revision.
614 614
615 615 The archive type is automatically detected based on file
616 616 extension (to override, use -t/--type).
617 617
618 618 .. container:: verbose
619 619
620 620 Examples:
621 621
622 622 - create a zip file containing the 1.0 release::
623 623
624 624 hg archive -r 1.0 project-1.0.zip
625 625
626 626 - create a tarball excluding .hg files::
627 627
628 628 hg archive project.tar.gz -X ".hg*"
629 629
630 630 Valid types are:
631 631
632 632 :``files``: a directory full of files (default)
633 633 :``tar``: tar archive, uncompressed
634 634 :``tbz2``: tar archive, compressed using bzip2
635 635 :``tgz``: tar archive, compressed using gzip
636 636 :``txz``: tar archive, compressed using lzma (only in Python 3)
637 637 :``uzip``: zip archive, uncompressed
638 638 :``zip``: zip archive, compressed using deflate
639 639
640 640 The exact name of the destination archive or directory is given
641 641 using a format string; see :hg:`help export` for details.
642 642
643 643 Each member added to an archive file has a directory prefix
644 644 prepended. Use -p/--prefix to specify a format string for the
645 645 prefix. The default is the basename of the archive, with suffixes
646 646 removed.
647 647
648 648 Returns 0 on success.
649 649 """
650 650
651 651 rev = opts.get('rev')
652 652 if rev:
653 653 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
654 654 ctx = logcmdutil.revsingle(repo, rev)
655 655 if not ctx:
656 656 raise error.InputError(
657 657 _(b'no working directory: please specify a revision')
658 658 )
659 659 node = ctx.node()
660 660 dest = cmdutil.makefilename(ctx, dest)
661 661 if os.path.realpath(dest) == repo.root:
662 662 raise error.InputError(_(b'repository root cannot be destination'))
663 663
664 664 kind = opts.get('type') or archival.guesskind(dest) or b'files'
665 665 prefix = opts.get('prefix')
666 666
667 667 if dest == b'-':
668 668 if kind == b'files':
669 669 raise error.InputError(_(b'cannot archive plain files to stdout'))
670 670 dest = cmdutil.makefileobj(ctx, dest)
671 671 if not prefix:
672 672 prefix = os.path.basename(repo.root) + b'-%h'
673 673
674 674 prefix = cmdutil.makefilename(ctx, prefix)
675 675 match = scmutil.match(ctx, [], pycompat.byteskwargs(opts))
676 676 archival.archive(
677 677 repo,
678 678 dest,
679 679 node,
680 680 kind,
681 681 not opts.get('no_decode'),
682 682 match,
683 683 prefix,
684 684 subrepos=opts.get('subrepos'),
685 685 )
686 686
687 687
688 688 @command(
689 689 b'backout',
690 690 [
691 691 (
692 692 b'',
693 693 b'merge',
694 694 None,
695 695 _(b'merge with old dirstate parent after backout'),
696 696 ),
697 697 (
698 698 b'',
699 699 b'commit',
700 700 None,
701 701 _(b'commit if no conflicts were encountered (DEPRECATED)'),
702 702 ),
703 703 (b'', b'no-commit', None, _(b'do not commit')),
704 704 (
705 705 b'',
706 706 b'parent',
707 707 b'',
708 708 _(b'parent to choose when backing out merge (DEPRECATED)'),
709 709 _(b'REV'),
710 710 ),
711 711 (b'r', b'rev', b'', _(b'revision to backout'), _(b'REV')),
712 712 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
713 713 ]
714 714 + mergetoolopts
715 715 + walkopts
716 716 + commitopts
717 717 + commitopts2,
718 718 _(b'[OPTION]... [-r] REV'),
719 719 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
720 720 )
721 721 def backout(ui, repo, node=None, rev=None, **opts):
722 722 """reverse effect of earlier changeset
723 723
724 724 Prepare a new changeset with the effect of REV undone in the
725 725 current working directory. If no conflicts were encountered,
726 726 it will be committed immediately.
727 727
728 728 If REV is the parent of the working directory, then this new changeset
729 729 is committed automatically (unless --no-commit is specified).
730 730
731 731 .. note::
732 732
733 733 :hg:`backout` cannot be used to fix either an unwanted or
734 734 incorrect merge.
735 735
736 736 .. container:: verbose
737 737
738 738 Examples:
739 739
740 740 - Reverse the effect of the parent of the working directory.
741 741 This backout will be committed immediately::
742 742
743 743 hg backout -r .
744 744
745 745 - Reverse the effect of previous bad revision 23::
746 746
747 747 hg backout -r 23
748 748
749 749 - Reverse the effect of previous bad revision 23 and
750 750 leave changes uncommitted::
751 751
752 752 hg backout -r 23 --no-commit
753 753 hg commit -m "Backout revision 23"
754 754
755 755 By default, the pending changeset will have one parent,
756 756 maintaining a linear history. With --merge, the pending
757 757 changeset will instead have two parents: the old parent of the
758 758 working directory and a new child of REV that simply undoes REV.
759 759
760 760 Before version 1.7, the behavior without --merge was equivalent
761 761 to specifying --merge followed by :hg:`update --clean .` to
762 762 cancel the merge and leave the child of REV as a head to be
763 763 merged separately.
764 764
765 765 See :hg:`help dates` for a list of formats valid for -d/--date.
766 766
767 767 See :hg:`help revert` for a way to restore files to the state
768 768 of another revision.
769 769
770 770 Returns 0 on success, 1 if nothing to backout or there are unresolved
771 771 files.
772 772 """
773 773 with repo.wlock(), repo.lock():
774 774 return _dobackout(ui, repo, node, rev, **opts)
775 775
776 776
777 777 def _dobackout(ui, repo, node=None, rev=None, **opts):
778 778 cmdutil.check_incompatible_arguments(opts, 'no_commit', ['commit', 'merge'])
779 779
780 780 if rev and node:
781 781 raise error.InputError(_(b"please specify just one revision"))
782 782
783 783 if not rev:
784 784 rev = node
785 785
786 786 if not rev:
787 787 raise error.InputError(_(b"please specify a revision to backout"))
788 788
789 789 date = opts.get('date')
790 790 if date:
791 791 opts['date'] = dateutil.parsedate(date)
792 792
793 793 cmdutil.checkunfinished(repo)
794 794 cmdutil.bailifchanged(repo)
795 795 ctx = logcmdutil.revsingle(repo, rev)
796 796 node = ctx.node()
797 797
798 798 op1, op2 = repo.dirstate.parents()
799 799 if not repo.changelog.isancestor(node, op1):
800 800 raise error.InputError(
801 801 _(b'cannot backout change that is not an ancestor')
802 802 )
803 803
804 804 p1, p2 = repo.changelog.parents(node)
805 805 if p1 == repo.nullid:
806 806 raise error.InputError(_(b'cannot backout a change with no parents'))
807 807 if p2 != repo.nullid:
808 808 if not opts.get('parent'):
809 809 raise error.InputError(_(b'cannot backout a merge changeset'))
810 810 p = repo.lookup(opts['parent'])
811 811 if p not in (p1, p2):
812 812 raise error.InputError(
813 813 _(b'%s is not a parent of %s') % (short(p), short(node))
814 814 )
815 815 parent = p
816 816 else:
817 817 if opts.get('parent'):
818 818 raise error.InputError(
819 819 _(b'cannot use --parent on non-merge changeset')
820 820 )
821 821 parent = p1
822 822
823 823 # the backout should appear on the same branch
824 824 branch = repo.dirstate.branch()
825 825 bheads = repo.branchheads(branch)
826 826 rctx = scmutil.revsingle(repo, hex(parent))
827 827 if not opts.get('merge') and op1 != node:
828 828 with repo.transaction(b"backout"):
829 829 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
830 830 with ui.configoverride(overrides, b'backout'):
831 831 stats = mergemod.back_out(ctx, parent=repo[parent])
832 832 repo.setparents(op1, op2)
833 833 hg._showstats(repo, stats)
834 834 if stats.unresolvedcount:
835 835 repo.ui.status(
836 836 _(b"use 'hg resolve' to retry unresolved file merges\n")
837 837 )
838 838 return 1
839 839 else:
840 840 hg.clean(repo, node, show_stats=False)
841 841 repo.dirstate.setbranch(branch, repo.currenttransaction())
842 842 cmdutil.revert(ui, repo, rctx)
843 843
844 844 if opts.get('no_commit'):
845 845 msg = _(b"changeset %s backed out, don't forget to commit.\n")
846 846 ui.status(msg % short(node))
847 847 return 0
848 848
849 849 def commitfunc(ui, repo, message, match, opts):
850 850 editform = b'backout'
851 851 e = cmdutil.getcommiteditor(
852 852 editform=editform, **pycompat.strkwargs(opts)
853 853 )
854 854 if not message:
855 855 # we don't translate commit messages
856 856 message = b"Backed out changeset %s" % short(node)
857 857 e = cmdutil.getcommiteditor(edit=True, editform=editform)
858 858 return repo.commit(
859 859 message, opts.get(b'user'), opts.get(b'date'), match, editor=e
860 860 )
861 861
862 862 # save to detect changes
863 863 tip = repo.changelog.tip()
864 864
865 865 newnode = cmdutil.commit(
866 866 ui, repo, commitfunc, [], pycompat.byteskwargs(opts)
867 867 )
868 868 if not newnode:
869 869 ui.status(_(b"nothing changed\n"))
870 870 return 1
871 871 cmdutil.commitstatus(repo, newnode, branch, bheads, tip)
872 872
873 873 def nice(node):
874 874 return b'%d:%s' % (repo.changelog.rev(node), short(node))
875 875
876 876 ui.status(
877 877 _(b'changeset %s backs out changeset %s\n')
878 878 % (nice(newnode), nice(node))
879 879 )
880 880 if opts.get('merge') and op1 != node:
881 881 hg.clean(repo, op1, show_stats=False)
882 882 ui.status(_(b'merging with changeset %s\n') % nice(newnode))
883 883 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
884 884 with ui.configoverride(overrides, b'backout'):
885 885 return hg.merge(repo[b'tip'])
886 886 return 0
887 887
888 888
889 889 @command(
890 890 b'bisect',
891 891 [
892 892 (b'r', b'reset', False, _(b'reset bisect state')),
893 893 (b'g', b'good', False, _(b'mark changeset good')),
894 894 (b'b', b'bad', False, _(b'mark changeset bad')),
895 895 (b's', b'skip', False, _(b'skip testing changeset')),
896 896 (b'e', b'extend', False, _(b'extend the bisect range')),
897 897 (
898 898 b'c',
899 899 b'command',
900 900 b'',
901 901 _(b'use command to check changeset state'),
902 902 _(b'CMD'),
903 903 ),
904 904 (b'U', b'noupdate', False, _(b'do not update to target')),
905 905 ],
906 906 _(b"[-gbsr] [-U] [-c CMD] [REV]"),
907 907 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
908 908 )
909 909 def bisect(
910 910 ui,
911 911 repo,
912 912 positional_1=None,
913 913 positional_2=None,
914 914 command=None,
915 915 reset=None,
916 916 good=None,
917 917 bad=None,
918 918 skip=None,
919 919 extend=None,
920 920 noupdate=None,
921 921 ):
922 922 """subdivision search of changesets
923 923
924 924 This command helps to find changesets which introduce problems. To
925 925 use, mark the earliest changeset you know exhibits the problem as
926 926 bad, then mark the latest changeset which is free from the problem
927 927 as good. Bisect will update your working directory to a revision
928 928 for testing (unless the -U/--noupdate option is specified). Once
929 929 you have performed tests, mark the working directory as good or
930 930 bad, and bisect will either update to another candidate changeset
931 931 or announce that it has found the bad revision.
932 932
933 933 As a shortcut, you can also use the revision argument to mark a
934 934 revision as good or bad without checking it out first.
935 935
936 936 If you supply a command, it will be used for automatic bisection.
937 937 The environment variable HG_NODE will contain the ID of the
938 938 changeset being tested. The exit status of the command will be
939 939 used to mark revisions as good or bad: status 0 means good, 125
940 940 means to skip the revision, 127 (command not found) will abort the
941 941 bisection, and any other non-zero exit status means the revision
942 942 is bad.
943 943
944 944 .. container:: verbose
945 945
946 946 Some examples:
947 947
948 948 - start a bisection with known bad revision 34, and good revision 12::
949 949
950 950 hg bisect --bad 34
951 951 hg bisect --good 12
952 952
953 953 - advance the current bisection by marking current revision as good or
954 954 bad::
955 955
956 956 hg bisect --good
957 957 hg bisect --bad
958 958
959 959 - mark the current revision, or a known revision, to be skipped (e.g. if
960 960 that revision is not usable because of another issue)::
961 961
962 962 hg bisect --skip
963 963 hg bisect --skip 23
964 964
965 965 - skip all revisions that do not touch directories ``foo`` or ``bar``::
966 966
967 967 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
968 968
969 969 - forget the current bisection::
970 970
971 971 hg bisect --reset
972 972
973 973 - use 'make && make tests' to automatically find the first broken
974 974 revision::
975 975
976 976 hg bisect --reset
977 977 hg bisect --bad 34
978 978 hg bisect --good 12
979 979 hg bisect --command "make && make tests"
980 980
981 981 - see all changesets whose states are already known in the current
982 982 bisection::
983 983
984 984 hg log -r "bisect(pruned)"
985 985
986 986 - see the changeset currently being bisected (especially useful
987 987 if running with -U/--noupdate)::
988 988
989 989 hg log -r "bisect(current)"
990 990
991 991 - see all changesets that took part in the current bisection::
992 992
993 993 hg log -r "bisect(range)"
994 994
995 995 - you can even get a nice graph::
996 996
997 997 hg log --graph -r "bisect(range)"
998 998
999 999 See :hg:`help revisions.bisect` for more about the `bisect()` predicate.
1000 1000
1001 1001 Returns 0 on success.
1002 1002 """
1003 1003 rev = []
1004 1004 # backward compatibility
1005 1005 if positional_1 in (b"good", b"bad", b"reset", b"init"):
1006 1006 ui.warn(_(b"(use of 'hg bisect <cmd>' is deprecated)\n"))
1007 1007 cmd = positional_1
1008 1008 rev.append(positional_2)
1009 1009 if cmd == b"good":
1010 1010 good = True
1011 1011 elif cmd == b"bad":
1012 1012 bad = True
1013 1013 else:
1014 1014 reset = True
1015 1015 elif positional_2:
1016 1016 raise error.InputError(_(b'incompatible arguments'))
1017 1017 elif positional_1 is not None:
1018 1018 rev.append(positional_1)
1019 1019
1020 1020 incompatibles = {
1021 1021 b'--bad': bad,
1022 1022 b'--command': bool(command),
1023 1023 b'--extend': extend,
1024 1024 b'--good': good,
1025 1025 b'--reset': reset,
1026 1026 b'--skip': skip,
1027 1027 }
1028 1028
1029 1029 enabled = [x for x in incompatibles if incompatibles[x]]
1030 1030
1031 1031 if len(enabled) > 1:
1032 1032 raise error.InputError(
1033 1033 _(b'%s and %s are incompatible') % tuple(sorted(enabled)[0:2])
1034 1034 )
1035 1035
1036 1036 if reset:
1037 1037 hbisect.resetstate(repo)
1038 1038 return
1039 1039
1040 1040 state = hbisect.load_state(repo)
1041 1041
1042 1042 if rev:
1043 1043 revs = logcmdutil.revrange(repo, rev)
1044 1044 goodnodes = state[b'good']
1045 1045 badnodes = state[b'bad']
1046 1046 if goodnodes and badnodes:
1047 1047 candidates = repo.revs(b'(%ln)::(%ln)', goodnodes, badnodes)
1048 1048 candidates += repo.revs(b'(%ln)::(%ln)', badnodes, goodnodes)
1049 1049 revs = candidates & revs
1050 1050 nodes = [repo.changelog.node(i) for i in revs]
1051 1051 else:
1052 1052 nodes = [repo.lookup(b'.')]
1053 1053
1054 1054 # update state
1055 1055 if good or bad or skip:
1056 1056 if good:
1057 1057 state[b'good'] += nodes
1058 1058 elif bad:
1059 1059 state[b'bad'] += nodes
1060 1060 elif skip:
1061 1061 state[b'skip'] += nodes
1062 1062 hbisect.save_state(repo, state)
1063 1063 if not (state[b'good'] and state[b'bad']):
1064 1064 return
1065 1065
1066 1066 def mayupdate(repo, node, show_stats=True):
1067 1067 """common used update sequence"""
1068 1068 if noupdate:
1069 1069 return
1070 1070 cmdutil.checkunfinished(repo)
1071 1071 cmdutil.bailifchanged(repo)
1072 1072 return hg.clean(repo, node, show_stats=show_stats)
1073 1073
1074 1074 displayer = logcmdutil.changesetdisplayer(ui, repo, {})
1075 1075
1076 1076 if command:
1077 1077 changesets = 1
1078 1078 if noupdate:
1079 1079 try:
1080 1080 node = state[b'current'][0]
1081 1081 except LookupError:
1082 1082 raise error.StateError(
1083 1083 _(
1084 1084 b'current bisect revision is unknown - '
1085 1085 b'start a new bisect to fix'
1086 1086 )
1087 1087 )
1088 1088 else:
1089 1089 node, p2 = repo.dirstate.parents()
1090 1090 if p2 != repo.nullid:
1091 1091 raise error.StateError(_(b'current bisect revision is a merge'))
1092 1092 if rev:
1093 1093 if not nodes:
1094 1094 raise error.InputError(_(b'empty revision set'))
1095 1095 node = repo[nodes[-1]].node()
1096 1096 with hbisect.restore_state(repo, state, node):
1097 1097 while changesets:
1098 1098 # update state
1099 1099 state[b'current'] = [node]
1100 1100 hbisect.save_state(repo, state)
1101 1101 status = ui.system(
1102 1102 command,
1103 1103 environ={b'HG_NODE': hex(node)},
1104 1104 blockedtag=b'bisect_check',
1105 1105 )
1106 1106 if status == 125:
1107 1107 transition = b"skip"
1108 1108 elif status == 0:
1109 1109 transition = b"good"
1110 1110 # status < 0 means process was killed
1111 1111 elif status == 127:
1112 1112 raise error.Abort(_(b"failed to execute %s") % command)
1113 1113 elif status < 0:
1114 1114 raise error.Abort(_(b"%s killed") % command)
1115 1115 else:
1116 1116 transition = b"bad"
1117 1117 state[transition].append(node)
1118 1118 ctx = repo[node]
1119 1119 summary = cmdutil.format_changeset_summary(ui, ctx, b'bisect')
1120 1120 ui.status(_(b'changeset %s: %s\n') % (summary, transition))
1121 1121 hbisect.checkstate(state)
1122 1122 # bisect
1123 1123 nodes, changesets, bgood = hbisect.bisect(repo, state)
1124 1124 # update to next check
1125 1125 node = nodes[0]
1126 1126 mayupdate(repo, node, show_stats=False)
1127 1127 hbisect.printresult(ui, repo, state, displayer, nodes, bgood)
1128 1128 return
1129 1129
1130 1130 hbisect.checkstate(state)
1131 1131
1132 1132 # actually bisect
1133 1133 nodes, changesets, good = hbisect.bisect(repo, state)
1134 1134 if extend:
1135 1135 if not changesets:
1136 1136 extendctx = hbisect.extendrange(repo, state, nodes, good)
1137 1137 if extendctx is not None:
1138 1138 ui.write(
1139 1139 _(b"Extending search to changeset %s\n")
1140 1140 % cmdutil.format_changeset_summary(ui, extendctx, b'bisect')
1141 1141 )
1142 1142 state[b'current'] = [extendctx.node()]
1143 1143 hbisect.save_state(repo, state)
1144 1144 return mayupdate(repo, extendctx.node())
1145 1145 raise error.StateError(_(b"nothing to extend"))
1146 1146
1147 1147 if changesets == 0:
1148 1148 hbisect.printresult(ui, repo, state, displayer, nodes, good)
1149 1149 else:
1150 1150 assert len(nodes) == 1 # only a single node can be tested next
1151 1151 node = nodes[0]
1152 1152 # compute the approximate number of remaining tests
1153 1153 tests, size = 0, 2
1154 1154 while size <= changesets:
1155 1155 tests, size = tests + 1, size * 2
1156 1156 rev = repo.changelog.rev(node)
1157 1157 summary = cmdutil.format_changeset_summary(ui, repo[rev], b'bisect')
1158 1158 ui.write(
1159 1159 _(
1160 1160 b"Testing changeset %s "
1161 1161 b"(%d changesets remaining, ~%d tests)\n"
1162 1162 )
1163 1163 % (summary, changesets, tests)
1164 1164 )
1165 1165 state[b'current'] = [node]
1166 1166 hbisect.save_state(repo, state)
1167 1167 return mayupdate(repo, node)
1168 1168
1169 1169
1170 1170 @command(
1171 1171 b'bookmarks|bookmark',
1172 1172 [
1173 1173 (b'f', b'force', False, _(b'force')),
1174 1174 (b'r', b'rev', b'', _(b'revision for bookmark action'), _(b'REV')),
1175 1175 (b'd', b'delete', False, _(b'delete a given bookmark')),
1176 1176 (b'm', b'rename', b'', _(b'rename a given bookmark'), _(b'OLD')),
1177 1177 (b'i', b'inactive', False, _(b'mark a bookmark inactive')),
1178 1178 (b'l', b'list', False, _(b'list existing bookmarks')),
1179 1179 ]
1180 1180 + formatteropts,
1181 1181 _(b'hg bookmarks [OPTIONS]... [NAME]...'),
1182 1182 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1183 1183 )
1184 1184 def bookmark(ui, repo, *names, **opts):
1185 1185 """create a new bookmark or list existing bookmarks
1186 1186
1187 1187 Bookmarks are labels on changesets to help track lines of development.
1188 1188 Bookmarks are unversioned and can be moved, renamed and deleted.
1189 1189 Deleting or moving a bookmark has no effect on the associated changesets.
1190 1190
1191 1191 Creating or updating to a bookmark causes it to be marked as 'active'.
1192 1192 The active bookmark is indicated with a '*'.
1193 1193 When a commit is made, the active bookmark will advance to the new commit.
1194 1194 A plain :hg:`update` will also advance an active bookmark, if possible.
1195 1195 Updating away from a bookmark will cause it to be deactivated.
1196 1196
1197 1197 Bookmarks can be pushed and pulled between repositories (see
1198 1198 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
1199 1199 diverged, a new 'divergent bookmark' of the form 'name@path' will
1200 1200 be created. Using :hg:`merge` will resolve the divergence.
1201 1201
1202 1202 Specifying bookmark as '.' to -m/-d/-l options is equivalent to specifying
1203 1203 the active bookmark's name.
1204 1204
1205 1205 A bookmark named '@' has the special property that :hg:`clone` will
1206 1206 check it out by default if it exists.
1207 1207
1208 1208 .. container:: verbose
1209 1209
1210 1210 Template:
1211 1211
1212 1212 The following keywords are supported in addition to the common template
1213 1213 keywords and functions such as ``{bookmark}``. See also
1214 1214 :hg:`help templates`.
1215 1215
1216 1216 :active: Boolean. True if the bookmark is active.
1217 1217
1218 1218 Examples:
1219 1219
1220 1220 - create an active bookmark for a new line of development::
1221 1221
1222 1222 hg book new-feature
1223 1223
1224 1224 - create an inactive bookmark as a place marker::
1225 1225
1226 1226 hg book -i reviewed
1227 1227
1228 1228 - create an inactive bookmark on another changeset::
1229 1229
1230 1230 hg book -r .^ tested
1231 1231
1232 1232 - rename bookmark turkey to dinner::
1233 1233
1234 1234 hg book -m turkey dinner
1235 1235
1236 1236 - move the '@' bookmark from another branch::
1237 1237
1238 1238 hg book -f @
1239 1239
1240 1240 - print only the active bookmark name::
1241 1241
1242 1242 hg book -ql .
1243 1243 """
1244 1244 force = opts.get('force')
1245 1245 rev = opts.get('rev')
1246 1246 inactive = opts.get('inactive') # meaning add/rename to inactive bookmark
1247 1247
1248 1248 action = cmdutil.check_at_most_one_arg(opts, 'delete', 'rename', 'list')
1249 1249 if action:
1250 1250 cmdutil.check_incompatible_arguments(opts, action, ['rev'])
1251 1251 elif names or rev:
1252 1252 action = 'add'
1253 1253 elif inactive:
1254 1254 action = 'inactive' # meaning deactivate
1255 1255 else:
1256 1256 action = 'list'
1257 1257
1258 1258 cmdutil.check_incompatible_arguments(opts, 'inactive', ['delete', 'list'])
1259 1259 if not names and action in {'add', 'delete'}:
1260 1260 raise error.InputError(_(b"bookmark name required"))
1261 1261
1262 1262 if action in {'add', 'delete', 'rename', 'inactive'}:
1263 1263 with repo.wlock(), repo.lock(), repo.transaction(b'bookmark') as tr:
1264 1264 if action == 'delete':
1265 1265 names = pycompat.maplist(repo._bookmarks.expandname, names)
1266 1266 bookmarks.delete(repo, tr, names)
1267 1267 elif action == 'rename':
1268 1268 if not names:
1269 1269 raise error.InputError(_(b"new bookmark name required"))
1270 1270 elif len(names) > 1:
1271 1271 raise error.InputError(
1272 1272 _(b"only one new bookmark name allowed")
1273 1273 )
1274 1274 oldname = repo._bookmarks.expandname(opts['rename'])
1275 1275 bookmarks.rename(repo, tr, oldname, names[0], force, inactive)
1276 1276 elif action == 'add':
1277 1277 bookmarks.addbookmarks(repo, tr, names, rev, force, inactive)
1278 1278 elif action == 'inactive':
1279 1279 if len(repo._bookmarks) == 0:
1280 1280 ui.status(_(b"no bookmarks set\n"))
1281 1281 elif not repo._activebookmark:
1282 1282 ui.status(_(b"no active bookmark\n"))
1283 1283 else:
1284 1284 bookmarks.deactivate(repo)
1285 1285 elif action == 'list':
1286 1286 names = pycompat.maplist(repo._bookmarks.expandname, names)
1287 1287 with ui.formatter(b'bookmarks', pycompat.byteskwargs(opts)) as fm:
1288 1288 bookmarks.printbookmarks(ui, repo, fm, names)
1289 1289 else:
1290 1290 raise error.ProgrammingError(
1291 1291 b'invalid action: %s' % pycompat.sysbytes(action)
1292 1292 )
1293 1293
1294 1294
1295 1295 @command(
1296 1296 b'branch',
1297 1297 [
1298 1298 (
1299 1299 b'f',
1300 1300 b'force',
1301 1301 None,
1302 1302 _(b'set branch name even if it shadows an existing branch'),
1303 1303 ),
1304 1304 (b'C', b'clean', None, _(b'reset branch name to parent branch name')),
1305 1305 (
1306 1306 b'r',
1307 1307 b'rev',
1308 1308 [],
1309 1309 _(b'change branches of the given revs (EXPERIMENTAL)'),
1310 1310 ),
1311 1311 ],
1312 1312 _(b'[-fC] [NAME]'),
1313 1313 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1314 1314 )
1315 1315 def branch(ui, repo, label=None, **opts):
1316 1316 """set or show the current branch name
1317 1317
1318 1318 .. note::
1319 1319
1320 1320 Branch names are permanent and global. Use :hg:`bookmark` to create a
1321 1321 light-weight bookmark instead. See :hg:`help glossary` for more
1322 1322 information about named branches and bookmarks.
1323 1323
1324 1324 With no argument, show the current branch name. With one argument,
1325 1325 set the working directory branch name (the branch will not exist
1326 1326 in the repository until the next commit). Standard practice
1327 1327 recommends that primary development take place on the 'default'
1328 1328 branch.
1329 1329
1330 1330 Unless -f/--force is specified, branch will not let you set a
1331 1331 branch name that already exists.
1332 1332
1333 1333 Use -C/--clean to reset the working directory branch to that of
1334 1334 the parent of the working directory, negating a previous branch
1335 1335 change.
1336 1336
1337 1337 Use the command :hg:`update` to switch to an existing branch. Use
1338 1338 :hg:`commit --close-branch` to mark this branch head as closed.
1339 1339 When all heads of a branch are closed, the branch will be
1340 1340 considered closed.
1341 1341
1342 1342 Returns 0 on success.
1343 1343 """
1344 1344 revs = opts.get('rev')
1345 1345 if label:
1346 1346 label = label.strip()
1347 1347
1348 1348 if not opts.get('clean') and not label:
1349 1349 if revs:
1350 1350 raise error.InputError(
1351 1351 _(b"no branch name specified for the revisions")
1352 1352 )
1353 1353 ui.write(b"%s\n" % repo.dirstate.branch())
1354 1354 return
1355 1355
1356 1356 with repo.wlock():
1357 1357 if opts.get('clean'):
1358 1358 label = repo[b'.'].branch()
1359 1359 repo.dirstate.setbranch(label, repo.currenttransaction())
1360 1360 ui.status(_(b'reset working directory to branch %s\n') % label)
1361 1361 elif label:
1362 1362
1363 1363 scmutil.checknewlabel(repo, label, b'branch')
1364 1364 if revs:
1365 1365 return cmdutil.changebranch(ui, repo, revs, label, **opts)
1366 1366
1367 1367 if not opts.get('force') and label in repo.branchmap():
1368 1368 if label not in [p.branch() for p in repo[None].parents()]:
1369 1369 raise error.InputError(
1370 1370 _(b'a branch of the same name already exists'),
1371 1371 # i18n: "it" refers to an existing branch
1372 1372 hint=_(b"use 'hg update' to switch to it"),
1373 1373 )
1374 1374
1375 1375 repo.dirstate.setbranch(label, repo.currenttransaction())
1376 1376 ui.status(_(b'marked working directory as branch %s\n') % label)
1377 1377
1378 1378 # find any open named branches aside from default
1379 1379 for n, h, t, c in repo.branchmap().iterbranches():
1380 1380 if n != b"default" and not c:
1381 1381 return 0
1382 1382 ui.status(
1383 1383 _(
1384 1384 b'(branches are permanent and global, '
1385 1385 b'did you want a bookmark?)\n'
1386 1386 )
1387 1387 )
1388 1388
1389 1389
1390 1390 @command(
1391 1391 b'branches',
1392 1392 [
1393 1393 (
1394 1394 b'a',
1395 1395 b'active',
1396 1396 False,
1397 1397 _(b'show only branches that have unmerged heads (DEPRECATED)'),
1398 1398 ),
1399 1399 (b'c', b'closed', False, _(b'show normal and closed branches')),
1400 1400 (b'r', b'rev', [], _(b'show branch name(s) of the given rev')),
1401 1401 ]
1402 1402 + formatteropts,
1403 1403 _(b'[-c]'),
1404 1404 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
1405 1405 intents={INTENT_READONLY},
1406 1406 )
1407 1407 def branches(ui, repo, active=False, closed=False, **opts):
1408 1408 """list repository named branches
1409 1409
1410 1410 List the repository's named branches, indicating which ones are
1411 1411 inactive. If -c/--closed is specified, also list branches which have
1412 1412 been marked closed (see :hg:`commit --close-branch`).
1413 1413
1414 1414 Use the command :hg:`update` to switch to an existing branch.
1415 1415
1416 1416 .. container:: verbose
1417 1417
1418 1418 Template:
1419 1419
1420 1420 The following keywords are supported in addition to the common template
1421 1421 keywords and functions such as ``{branch}``. See also
1422 1422 :hg:`help templates`.
1423 1423
1424 1424 :active: Boolean. True if the branch is active.
1425 1425 :closed: Boolean. True if the branch is closed.
1426 1426 :current: Boolean. True if it is the current branch.
1427 1427
1428 1428 Returns 0.
1429 1429 """
1430 1430
1431 1431 revs = opts.get('rev')
1432 1432 selectedbranches = None
1433 1433 if revs:
1434 1434 revs = logcmdutil.revrange(repo, revs)
1435 1435 getbi = repo.revbranchcache().branchinfo
1436 1436 selectedbranches = {getbi(r)[0] for r in revs}
1437 1437
1438 1438 ui.pager(b'branches')
1439 1439 fm = ui.formatter(b'branches', pycompat.byteskwargs(opts))
1440 1440 hexfunc = fm.hexfunc
1441 1441
1442 1442 allheads = set(repo.heads())
1443 1443 branches = []
1444 1444 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1445 1445 if selectedbranches is not None and tag not in selectedbranches:
1446 1446 continue
1447 1447 isactive = False
1448 1448 if not isclosed:
1449 1449 openheads = set(repo.branchmap().iteropen(heads))
1450 1450 isactive = bool(openheads & allheads)
1451 1451 branches.append((tag, repo[tip], isactive, not isclosed))
1452 1452 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]), reverse=True)
1453 1453
1454 1454 for tag, ctx, isactive, isopen in branches:
1455 1455 if active and not isactive:
1456 1456 continue
1457 1457 if isactive:
1458 1458 label = b'branches.active'
1459 1459 notice = b''
1460 1460 elif not isopen:
1461 1461 if not closed:
1462 1462 continue
1463 1463 label = b'branches.closed'
1464 1464 notice = _(b' (closed)')
1465 1465 else:
1466 1466 label = b'branches.inactive'
1467 1467 notice = _(b' (inactive)')
1468 1468 current = tag == repo.dirstate.branch()
1469 1469 if current:
1470 1470 label = b'branches.current'
1471 1471
1472 1472 fm.startitem()
1473 1473 fm.write(b'branch', b'%s', tag, label=label)
1474 1474 rev = ctx.rev()
1475 1475 padsize = max(31 - len(b"%d" % rev) - encoding.colwidth(tag), 0)
1476 1476 fmt = b' ' * padsize + b' %d:%s'
1477 1477 fm.condwrite(
1478 1478 not ui.quiet,
1479 1479 b'rev node',
1480 1480 fmt,
1481 1481 rev,
1482 1482 hexfunc(ctx.node()),
1483 1483 label=b'log.changeset changeset.%s' % ctx.phasestr(),
1484 1484 )
1485 1485 fm.context(ctx=ctx)
1486 1486 fm.data(active=isactive, closed=not isopen, current=current)
1487 1487 if not ui.quiet:
1488 1488 fm.plain(notice)
1489 1489 fm.plain(b'\n')
1490 1490 fm.end()
1491 1491
1492 1492
1493 1493 @command(
1494 1494 b'bundle',
1495 1495 [
1496 1496 (
1497 1497 b'',
1498 1498 b'exact',
1499 1499 None,
1500 1500 _(b'compute the base from the revision specified'),
1501 1501 ),
1502 1502 (
1503 1503 b'f',
1504 1504 b'force',
1505 1505 None,
1506 1506 _(b'run even when the destination is unrelated'),
1507 1507 ),
1508 1508 (
1509 1509 b'r',
1510 1510 b'rev',
1511 1511 [],
1512 1512 _(b'a changeset intended to be added to the destination'),
1513 1513 _(b'REV'),
1514 1514 ),
1515 1515 (
1516 1516 b'b',
1517 1517 b'branch',
1518 1518 [],
1519 1519 _(b'a specific branch you would like to bundle'),
1520 1520 _(b'BRANCH'),
1521 1521 ),
1522 1522 (
1523 1523 b'',
1524 1524 b'base',
1525 1525 [],
1526 1526 _(b'a base changeset assumed to be available at the destination'),
1527 1527 _(b'REV'),
1528 1528 ),
1529 1529 (b'a', b'all', None, _(b'bundle all changesets in the repository')),
1530 1530 (
1531 1531 b't',
1532 1532 b'type',
1533 1533 b'bzip2',
1534 1534 _(b'bundle compression type to use'),
1535 1535 _(b'TYPE'),
1536 1536 ),
1537 1537 ]
1538 1538 + remoteopts,
1539 1539 _(b'[-f] [-t BUNDLESPEC] [-a] [-r REV]... [--base REV]... FILE [DEST]...'),
1540 1540 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1541 1541 )
1542 1542 def bundle(ui, repo, fname, *dests, **opts):
1543 1543 """create a bundle file
1544 1544
1545 1545 Generate a bundle file containing data to be transferred to another
1546 1546 repository.
1547 1547
1548 1548 To create a bundle containing all changesets, use -a/--all
1549 1549 (or --base null). Otherwise, hg assumes the destination will have
1550 1550 all the nodes you specify with --base parameters. Otherwise, hg
1551 1551 will assume the repository has all the nodes in destination, or
1552 1552 default-push/default if no destination is specified, where destination
1553 1553 is the repositories you provide through DEST option.
1554 1554
1555 1555 You can change bundle format with the -t/--type option. See
1556 1556 :hg:`help bundlespec` for documentation on this format. By default,
1557 1557 the most appropriate format is used and compression defaults to
1558 1558 bzip2.
1559 1559
1560 1560 The bundle file can then be transferred using conventional means
1561 1561 and applied to another repository with the unbundle or pull
1562 1562 command. This is useful when direct push and pull are not
1563 1563 available or when exporting an entire repository is undesirable.
1564 1564
1565 1565 Applying bundles preserves all changeset contents including
1566 1566 permissions, copy/rename information, and revision history.
1567 1567
1568 1568 Returns 0 on success, 1 if no changes found.
1569 1569 """
1570 1570
1571 1571 revs = None
1572 1572 if 'rev' in opts:
1573 1573 revstrings = opts['rev']
1574 1574 revs = logcmdutil.revrange(repo, revstrings)
1575 1575 if revstrings and not revs:
1576 1576 raise error.InputError(_(b'no commits to bundle'))
1577 1577
1578 1578 bundletype = opts.get('type', b'bzip2').lower()
1579 1579 try:
1580 1580 bundlespec = bundlecaches.parsebundlespec(
1581 1581 repo, bundletype, strict=False
1582 1582 )
1583 1583 except error.UnsupportedBundleSpecification as e:
1584 1584 raise error.InputError(
1585 1585 pycompat.bytestr(e),
1586 1586 hint=_(b"see 'hg help bundlespec' for supported values for --type"),
1587 1587 )
1588 1588 cgversion = bundlespec.params[b"cg.version"]
1589 1589
1590 1590 # Packed bundles are a pseudo bundle format for now.
1591 1591 if cgversion == b's1':
1592 1592 raise error.InputError(
1593 1593 _(b'packed bundles cannot be produced by "hg bundle"'),
1594 1594 hint=_(b"use 'hg debugcreatestreamclonebundle'"),
1595 1595 )
1596
1596 base_opt = opts.get('base')
1597 1597 if opts.get('all'):
1598 1598 if dests:
1599 1599 raise error.InputError(
1600 1600 _(b"--all is incompatible with specifying destinations")
1601 1601 )
1602 if opts.get('base'):
1602 if base_opt:
1603 1603 ui.warn(_(b"ignoring --base because --all was specified\n"))
1604 1604 if opts.get('exact'):
1605 1605 ui.warn(_(b"ignoring --exact because --all was specified\n"))
1606 1606 base = [nullrev]
1607 1607 elif opts.get('exact'):
1608 1608 if dests:
1609 1609 raise error.InputError(
1610 1610 _(b"--exact is incompatible with specifying destinations")
1611 1611 )
1612 if opts.get('base'):
1612 if base_opt:
1613 1613 ui.warn(_(b"ignoring --base because --exact was specified\n"))
1614 1614 base = repo.revs(b'parents(%ld) - %ld', revs, revs)
1615 1615 if not base:
1616 1616 base = [nullrev]
1617 elif base_opt:
1618 base = logcmdutil.revrange(repo, base_opt)
1619 if not base:
1620 # base specified, but nothing was selected
1621 base = [nullrev]
1617 1622 else:
1618 base = logcmdutil.revrange(repo, opts.get('base'))
1623 base = None
1619 1624 if cgversion not in changegroup.supportedoutgoingversions(repo):
1620 1625 raise error.Abort(
1621 1626 _(b"repository does not support bundle version %s") % cgversion
1622 1627 )
1623 1628
1624 if base:
1629 if base is not None:
1625 1630 if dests:
1626 1631 raise error.InputError(
1627 1632 _(b"--base is incompatible with specifying destinations")
1628 1633 )
1629 1634 cl = repo.changelog
1630 1635 common = [cl.node(rev) for rev in base]
1631 1636 heads = [cl.node(r) for r in revs] if revs else None
1632 1637 outgoing = discovery.outgoing(repo, common, heads)
1633 1638 missing = outgoing.missing
1634 1639 excluded = outgoing.excluded
1635 1640 else:
1636 1641 missing = set()
1637 1642 excluded = set()
1638 1643 for path in urlutil.get_push_paths(repo, ui, dests):
1639 1644 other = hg.peer(repo, pycompat.byteskwargs(opts), path)
1640 1645 if revs is not None:
1641 1646 hex_revs = [repo[r].hex() for r in revs]
1642 1647 else:
1643 1648 hex_revs = None
1644 1649 branches = (path.branch, [])
1645 1650 head_revs, checkout = hg.addbranchrevs(
1646 1651 repo, repo, branches, hex_revs
1647 1652 )
1648 1653 heads = (
1649 1654 head_revs
1650 1655 and pycompat.maplist(repo.lookup, head_revs)
1651 1656 or head_revs
1652 1657 )
1653 1658 outgoing = discovery.findcommonoutgoing(
1654 1659 repo,
1655 1660 other,
1656 1661 onlyheads=heads,
1657 1662 force=opts.get('force'),
1658 1663 portable=True,
1659 1664 )
1660 1665 missing.update(outgoing.missing)
1661 1666 excluded.update(outgoing.excluded)
1662 1667
1663 1668 if not missing:
1664 1669 scmutil.nochangesfound(ui, repo, not base and excluded)
1665 1670 return 1
1666 1671
1667 1672 # internal changeset are internal implementation details that should not
1668 1673 # leave the repository. Bundling with `hg bundle` create such risk.
1669 1674 bundled_internal = repo.revs(b"%ln and _internal()", missing)
1670 1675 if bundled_internal:
1671 1676 msg = _(b"cannot bundle internal changesets")
1672 1677 hint = _(b"%d internal changesets selected") % len(bundled_internal)
1673 1678 raise error.Abort(msg, hint=hint)
1674 1679
1675 1680 if heads:
1676 1681 outgoing = discovery.outgoing(
1677 1682 repo, missingroots=missing, ancestorsof=heads
1678 1683 )
1679 1684 else:
1680 1685 outgoing = discovery.outgoing(repo, missingroots=missing)
1681 1686 outgoing.excluded = sorted(excluded)
1682 1687
1683 1688 if cgversion == b'01': # bundle1
1684 1689 bversion = b'HG10' + bundlespec.wirecompression
1685 1690 bcompression = None
1686 1691 elif cgversion in (b'02', b'03'):
1687 1692 bversion = b'HG20'
1688 1693 bcompression = bundlespec.wirecompression
1689 1694 else:
1690 1695 raise error.ProgrammingError(
1691 1696 b'bundle: unexpected changegroup version %s' % cgversion
1692 1697 )
1693 1698
1694 1699 # TODO compression options should be derived from bundlespec parsing.
1695 1700 # This is a temporary hack to allow adjusting bundle compression
1696 1701 # level without a) formalizing the bundlespec changes to declare it
1697 1702 # b) introducing a command flag.
1698 1703 compopts = {}
1699 1704 complevel = ui.configint(
1700 1705 b'experimental', b'bundlecomplevel.' + bundlespec.compression
1701 1706 )
1702 1707 if complevel is None:
1703 1708 complevel = ui.configint(b'experimental', b'bundlecomplevel')
1704 1709 if complevel is not None:
1705 1710 compopts[b'level'] = complevel
1706 1711
1707 1712 compthreads = ui.configint(
1708 1713 b'experimental', b'bundlecompthreads.' + bundlespec.compression
1709 1714 )
1710 1715 if compthreads is None:
1711 1716 compthreads = ui.configint(b'experimental', b'bundlecompthreads')
1712 1717 if compthreads is not None:
1713 1718 compopts[b'threads'] = compthreads
1714 1719
1715 1720 # Bundling of obsmarker and phases is optional as not all clients
1716 1721 # support the necessary features.
1717 1722 cfg = ui.configbool
1718 1723 obsolescence_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker')
1719 1724 bundlespec.set_param(b'obsolescence', obsolescence_cfg, overwrite=False)
1720 1725 obs_mand_cfg = cfg(b'experimental', b'evolution.bundle-obsmarker:mandatory')
1721 1726 bundlespec.set_param(
1722 1727 b'obsolescence-mandatory', obs_mand_cfg, overwrite=False
1723 1728 )
1724 1729 if not bundlespec.params.get(b'phases', False):
1725 1730 phases_cfg = cfg(b'experimental', b'bundle-phases')
1726 1731 bundlespec.set_param(b'phases', phases_cfg, overwrite=False)
1727 1732
1728 1733 bundle2.writenewbundle(
1729 1734 ui,
1730 1735 repo,
1731 1736 b'bundle',
1732 1737 fname,
1733 1738 bversion,
1734 1739 outgoing,
1735 1740 bundlespec.params,
1736 1741 compression=bcompression,
1737 1742 compopts=compopts,
1738 1743 )
1739 1744
1740 1745
1741 1746 @command(
1742 1747 b'cat',
1743 1748 [
1744 1749 (
1745 1750 b'o',
1746 1751 b'output',
1747 1752 b'',
1748 1753 _(b'print output to file with formatted name'),
1749 1754 _(b'FORMAT'),
1750 1755 ),
1751 1756 (b'r', b'rev', b'', _(b'print the given revision'), _(b'REV')),
1752 1757 (b'', b'decode', None, _(b'apply any matching decode filter')),
1753 1758 ]
1754 1759 + walkopts
1755 1760 + formatteropts,
1756 1761 _(b'[OPTION]... FILE...'),
1757 1762 helpcategory=command.CATEGORY_FILE_CONTENTS,
1758 1763 inferrepo=True,
1759 1764 intents={INTENT_READONLY},
1760 1765 )
1761 1766 def cat(ui, repo, file1, *pats, **opts):
1762 1767 """output the current or given revision of files
1763 1768
1764 1769 Print the specified files as they were at the given revision. If
1765 1770 no revision is given, the parent of the working directory is used.
1766 1771
1767 1772 Output may be to a file, in which case the name of the file is
1768 1773 given using a template string. See :hg:`help templates`. In addition
1769 1774 to the common template keywords, the following formatting rules are
1770 1775 supported:
1771 1776
1772 1777 :``%%``: literal "%" character
1773 1778 :``%s``: basename of file being printed
1774 1779 :``%d``: dirname of file being printed, or '.' if in repository root
1775 1780 :``%p``: root-relative path name of file being printed
1776 1781 :``%H``: changeset hash (40 hexadecimal digits)
1777 1782 :``%R``: changeset revision number
1778 1783 :``%h``: short-form changeset hash (12 hexadecimal digits)
1779 1784 :``%r``: zero-padded changeset revision number
1780 1785 :``%b``: basename of the exporting repository
1781 1786 :``\\``: literal "\\" character
1782 1787
1783 1788 .. container:: verbose
1784 1789
1785 1790 Template:
1786 1791
1787 1792 The following keywords are supported in addition to the common template
1788 1793 keywords and functions. See also :hg:`help templates`.
1789 1794
1790 1795 :data: String. File content.
1791 1796 :path: String. Repository-absolute path of the file.
1792 1797
1793 1798 Returns 0 on success.
1794 1799 """
1795 1800 rev = opts.get('rev')
1796 1801 if rev:
1797 1802 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
1798 1803 ctx = logcmdutil.revsingle(repo, rev)
1799 1804 m = scmutil.match(ctx, (file1,) + pats, pycompat.byteskwargs(opts))
1800 1805 fntemplate = opts.pop('output', b'')
1801 1806 if cmdutil.isstdiofilename(fntemplate):
1802 1807 fntemplate = b''
1803 1808
1804 1809 if fntemplate:
1805 1810 fm = formatter.nullformatter(ui, b'cat', pycompat.byteskwargs(opts))
1806 1811 else:
1807 1812 ui.pager(b'cat')
1808 1813 fm = ui.formatter(b'cat', pycompat.byteskwargs(opts))
1809 1814 with fm:
1810 1815 return cmdutil.cat(ui, repo, ctx, m, fm, fntemplate, b'', **opts)
1811 1816
1812 1817
1813 1818 @command(
1814 1819 b'clone',
1815 1820 [
1816 1821 (
1817 1822 b'U',
1818 1823 b'noupdate',
1819 1824 None,
1820 1825 _(
1821 1826 b'the clone will include an empty working '
1822 1827 b'directory (only a repository)'
1823 1828 ),
1824 1829 ),
1825 1830 (
1826 1831 b'u',
1827 1832 b'updaterev',
1828 1833 b'',
1829 1834 _(b'revision, tag, or branch to check out'),
1830 1835 _(b'REV'),
1831 1836 ),
1832 1837 (
1833 1838 b'r',
1834 1839 b'rev',
1835 1840 [],
1836 1841 _(
1837 1842 b'do not clone everything, but include this changeset'
1838 1843 b' and its ancestors'
1839 1844 ),
1840 1845 _(b'REV'),
1841 1846 ),
1842 1847 (
1843 1848 b'b',
1844 1849 b'branch',
1845 1850 [],
1846 1851 _(
1847 1852 b'do not clone everything, but include this branch\'s'
1848 1853 b' changesets and their ancestors'
1849 1854 ),
1850 1855 _(b'BRANCH'),
1851 1856 ),
1852 1857 (b'', b'pull', None, _(b'use pull protocol to copy metadata')),
1853 1858 (b'', b'uncompressed', None, _(b'an alias to --stream (DEPRECATED)')),
1854 1859 (b'', b'stream', None, _(b'clone with minimal data processing')),
1855 1860 ]
1856 1861 + remoteopts,
1857 1862 _(b'[OPTION]... SOURCE [DEST]'),
1858 1863 helpcategory=command.CATEGORY_REPO_CREATION,
1859 1864 helpbasic=True,
1860 1865 norepo=True,
1861 1866 )
1862 1867 def clone(ui, source, dest=None, **opts):
1863 1868 """make a copy of an existing repository
1864 1869
1865 1870 Create a copy of an existing repository in a new directory.
1866 1871
1867 1872 If no destination directory name is specified, it defaults to the
1868 1873 basename of the source.
1869 1874
1870 1875 The location of the source is added to the new repository's
1871 1876 ``.hg/hgrc`` file, as the default to be used for future pulls.
1872 1877
1873 1878 Only local paths and ``ssh://`` URLs are supported as
1874 1879 destinations. For ``ssh://`` destinations, no working directory or
1875 1880 ``.hg/hgrc`` will be created on the remote side.
1876 1881
1877 1882 If the source repository has a bookmark called '@' set, that
1878 1883 revision will be checked out in the new repository by default.
1879 1884
1880 1885 To check out a particular version, use -u/--update, or
1881 1886 -U/--noupdate to create a clone with no working directory.
1882 1887
1883 1888 To pull only a subset of changesets, specify one or more revisions
1884 1889 identifiers with -r/--rev or branches with -b/--branch. The
1885 1890 resulting clone will contain only the specified changesets and
1886 1891 their ancestors. These options (or 'clone src#rev dest') imply
1887 1892 --pull, even for local source repositories.
1888 1893
1889 1894 In normal clone mode, the remote normalizes repository data into a common
1890 1895 exchange format and the receiving end translates this data into its local
1891 1896 storage format. --stream activates a different clone mode that essentially
1892 1897 copies repository files from the remote with minimal data processing. This
1893 1898 significantly reduces the CPU cost of a clone both remotely and locally.
1894 1899 However, it often increases the transferred data size by 30-40%. This can
1895 1900 result in substantially faster clones where I/O throughput is plentiful,
1896 1901 especially for larger repositories. A side-effect of --stream clones is
1897 1902 that storage settings and requirements on the remote are applied locally:
1898 1903 a modern client may inherit legacy or inefficient storage used by the
1899 1904 remote or a legacy Mercurial client may not be able to clone from a
1900 1905 modern Mercurial remote.
1901 1906
1902 1907 .. note::
1903 1908
1904 1909 Specifying a tag will include the tagged changeset but not the
1905 1910 changeset containing the tag.
1906 1911
1907 1912 .. container:: verbose
1908 1913
1909 1914 For efficiency, hardlinks are used for cloning whenever the
1910 1915 source and destination are on the same filesystem (note this
1911 1916 applies only to the repository data, not to the working
1912 1917 directory). Some filesystems, such as AFS, implement hardlinking
1913 1918 incorrectly, but do not report errors. In these cases, use the
1914 1919 --pull option to avoid hardlinking.
1915 1920
1916 1921 Mercurial will update the working directory to the first applicable
1917 1922 revision from this list:
1918 1923
1919 1924 a) null if -U or the source repository has no changesets
1920 1925 b) if -u . and the source repository is local, the first parent of
1921 1926 the source repository's working directory
1922 1927 c) the changeset specified with -u (if a branch name, this means the
1923 1928 latest head of that branch)
1924 1929 d) the changeset specified with -r
1925 1930 e) the tipmost head specified with -b
1926 1931 f) the tipmost head specified with the url#branch source syntax
1927 1932 g) the revision marked with the '@' bookmark, if present
1928 1933 h) the tipmost head of the default branch
1929 1934 i) tip
1930 1935
1931 1936 When cloning from servers that support it, Mercurial may fetch
1932 1937 pre-generated data from a server-advertised URL or inline from the
1933 1938 same stream. When this is done, hooks operating on incoming changesets
1934 1939 and changegroups may fire more than once, once for each pre-generated
1935 1940 bundle and as well as for any additional remaining data. In addition,
1936 1941 if an error occurs, the repository may be rolled back to a partial
1937 1942 clone. This behavior may change in future releases.
1938 1943 See :hg:`help -e clonebundles` for more.
1939 1944
1940 1945 Examples:
1941 1946
1942 1947 - clone a remote repository to a new directory named hg/::
1943 1948
1944 1949 hg clone https://www.mercurial-scm.org/repo/hg/
1945 1950
1946 1951 - create a lightweight local clone::
1947 1952
1948 1953 hg clone project/ project-feature/
1949 1954
1950 1955 - clone from an absolute path on an ssh server (note double-slash)::
1951 1956
1952 1957 hg clone ssh://user@server//home/projects/alpha/
1953 1958
1954 1959 - do a streaming clone while checking out a specified version::
1955 1960
1956 1961 hg clone --stream http://server/repo -u 1.5
1957 1962
1958 1963 - create a repository without changesets after a particular revision::
1959 1964
1960 1965 hg clone -r 04e544 experimental/ good/
1961 1966
1962 1967 - clone (and track) a particular named branch::
1963 1968
1964 1969 hg clone https://www.mercurial-scm.org/repo/hg/#stable
1965 1970
1966 1971 See :hg:`help urls` for details on specifying URLs.
1967 1972
1968 1973 Returns 0 on success.
1969 1974 """
1970 1975 cmdutil.check_at_most_one_arg(opts, 'noupdate', 'updaterev')
1971 1976
1972 1977 # --include/--exclude can come from narrow or sparse.
1973 1978 includepats, excludepats = None, None
1974 1979
1975 1980 # hg.clone() differentiates between None and an empty set. So make sure
1976 1981 # patterns are sets if narrow is requested without patterns.
1977 1982 if opts.get('narrow'):
1978 1983 includepats = set()
1979 1984 excludepats = set()
1980 1985
1981 1986 if opts.get('include'):
1982 1987 includepats = narrowspec.parsepatterns(opts.get('include'))
1983 1988 if opts.get('exclude'):
1984 1989 excludepats = narrowspec.parsepatterns(opts.get('exclude'))
1985 1990
1986 1991 r = hg.clone(
1987 1992 ui,
1988 1993 pycompat.byteskwargs(opts),
1989 1994 source,
1990 1995 dest,
1991 1996 pull=opts.get('pull'),
1992 1997 stream=opts.get('stream') or opts.get('uncompressed'),
1993 1998 revs=opts.get('rev'),
1994 1999 update=opts.get('updaterev') or not opts.get('noupdate'),
1995 2000 branch=opts.get('branch'),
1996 2001 shareopts=opts.get('shareopts'),
1997 2002 storeincludepats=includepats,
1998 2003 storeexcludepats=excludepats,
1999 2004 depth=opts.get('depth') or None,
2000 2005 )
2001 2006
2002 2007 return r is None
2003 2008
2004 2009
2005 2010 @command(
2006 2011 b'commit|ci',
2007 2012 [
2008 2013 (
2009 2014 b'A',
2010 2015 b'addremove',
2011 2016 None,
2012 2017 _(b'mark new/missing files as added/removed before committing'),
2013 2018 ),
2014 2019 (b'', b'close-branch', None, _(b'mark a branch head as closed')),
2015 2020 (b'', b'amend', None, _(b'amend the parent of the working directory')),
2016 2021 (b's', b'secret', None, _(b'use the secret phase for committing')),
2017 2022 (b'', b'draft', None, _(b'use the draft phase for committing')),
2018 2023 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
2019 2024 (
2020 2025 b'',
2021 2026 b'force-close-branch',
2022 2027 None,
2023 2028 _(b'forcibly close branch from a non-head changeset (ADVANCED)'),
2024 2029 ),
2025 2030 (b'i', b'interactive', None, _(b'use interactive mode')),
2026 2031 ]
2027 2032 + walkopts
2028 2033 + commitopts
2029 2034 + commitopts2
2030 2035 + subrepoopts,
2031 2036 _(b'[OPTION]... [FILE]...'),
2032 2037 helpcategory=command.CATEGORY_COMMITTING,
2033 2038 helpbasic=True,
2034 2039 inferrepo=True,
2035 2040 )
2036 2041 def commit(ui, repo, *pats, **opts):
2037 2042 """commit the specified files or all outstanding changes
2038 2043
2039 2044 Commit changes to the given files into the repository. Unlike a
2040 2045 centralized SCM, this operation is a local operation. See
2041 2046 :hg:`push` for a way to actively distribute your changes.
2042 2047
2043 2048 If a list of files is omitted, all changes reported by :hg:`status`
2044 2049 will be committed.
2045 2050
2046 2051 If you are committing the result of a merge, do not provide any
2047 2052 filenames or -I/-X filters.
2048 2053
2049 2054 If no commit message is specified, Mercurial starts your
2050 2055 configured editor where you can enter a message. In case your
2051 2056 commit fails, you will find a backup of your message in
2052 2057 ``.hg/last-message.txt``.
2053 2058
2054 2059 The --close-branch flag can be used to mark the current branch
2055 2060 head closed. When all heads of a branch are closed, the branch
2056 2061 will be considered closed and no longer listed.
2057 2062
2058 2063 The --amend flag can be used to amend the parent of the
2059 2064 working directory with a new commit that contains the changes
2060 2065 in the parent in addition to those currently reported by :hg:`status`,
2061 2066 if there are any. The old commit is stored in a backup bundle in
2062 2067 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
2063 2068 on how to restore it).
2064 2069
2065 2070 Message, user and date are taken from the amended commit unless
2066 2071 specified. When a message isn't specified on the command line,
2067 2072 the editor will open with the message of the amended commit.
2068 2073
2069 2074 It is not possible to amend public changesets (see :hg:`help phases`)
2070 2075 or changesets that have children.
2071 2076
2072 2077 See :hg:`help dates` for a list of formats valid for -d/--date.
2073 2078
2074 2079 Returns 0 on success, 1 if nothing changed.
2075 2080
2076 2081 .. container:: verbose
2077 2082
2078 2083 Examples:
2079 2084
2080 2085 - commit all files ending in .py::
2081 2086
2082 2087 hg commit --include "set:**.py"
2083 2088
2084 2089 - commit all non-binary files::
2085 2090
2086 2091 hg commit --exclude "set:binary()"
2087 2092
2088 2093 - amend the current commit and set the date to now::
2089 2094
2090 2095 hg commit --amend --date now
2091 2096 """
2092 2097 cmdutil.check_at_most_one_arg(opts, 'draft', 'secret')
2093 2098 cmdutil.check_incompatible_arguments(opts, 'subrepos', ['amend'])
2094 2099 with repo.wlock(), repo.lock():
2095 2100 return _docommit(ui, repo, *pats, **opts)
2096 2101
2097 2102
2098 2103 def _docommit(ui, repo, *pats, **opts):
2099 2104 if opts.get('interactive'):
2100 2105 opts.pop('interactive')
2101 2106 ret = cmdutil.dorecord(
2102 2107 ui, repo, commit, None, False, cmdutil.recordfilter, *pats, **opts
2103 2108 )
2104 2109 # ret can be 0 (no changes to record) or the value returned by
2105 2110 # commit(), 1 if nothing changed or None on success.
2106 2111 return 1 if ret == 0 else ret
2107 2112
2108 2113 if opts.get('subrepos'):
2109 2114 # Let --subrepos on the command line override config setting.
2110 2115 ui.setconfig(b'ui', b'commitsubrepos', True, b'commit')
2111 2116
2112 2117 cmdutil.checkunfinished(repo, commit=True)
2113 2118
2114 2119 branch = repo[None].branch()
2115 2120 bheads = repo.branchheads(branch)
2116 2121 tip = repo.changelog.tip()
2117 2122
2118 2123 extra = {}
2119 2124 if opts.get('close_branch') or opts.get('force_close_branch'):
2120 2125 extra[b'close'] = b'1'
2121 2126
2122 2127 if repo[b'.'].closesbranch():
2123 2128 # Not ideal, but let us do an extra status early to prevent early
2124 2129 # bail out.
2125 2130 matcher = scmutil.match(
2126 2131 repo[None], pats, pycompat.byteskwargs(opts)
2127 2132 )
2128 2133 s = repo.status(match=matcher)
2129 2134 if s.modified or s.added or s.removed:
2130 2135 bheads = repo.branchheads(branch, closed=True)
2131 2136 else:
2132 2137 msg = _(b'current revision is already a branch closing head')
2133 2138 raise error.InputError(msg)
2134 2139
2135 2140 if not bheads:
2136 2141 raise error.InputError(
2137 2142 _(b'branch "%s" has no heads to close') % branch
2138 2143 )
2139 2144 elif (
2140 2145 branch == repo[b'.'].branch()
2141 2146 and repo[b'.'].node() not in bheads
2142 2147 and not opts.get('force_close_branch')
2143 2148 ):
2144 2149 hint = _(
2145 2150 b'use --force-close-branch to close branch from a non-head'
2146 2151 b' changeset'
2147 2152 )
2148 2153 raise error.InputError(_(b'can only close branch heads'), hint=hint)
2149 2154 elif opts.get('amend'):
2150 2155 if (
2151 2156 repo[b'.'].p1().branch() != branch
2152 2157 and repo[b'.'].p2().branch() != branch
2153 2158 ):
2154 2159 raise error.InputError(_(b'can only close branch heads'))
2155 2160
2156 2161 if opts.get('amend'):
2157 2162 if ui.configbool(b'ui', b'commitsubrepos'):
2158 2163 raise error.InputError(
2159 2164 _(b'cannot amend with ui.commitsubrepos enabled')
2160 2165 )
2161 2166
2162 2167 old = repo[b'.']
2163 2168 rewriteutil.precheck(repo, [old.rev()], b'amend')
2164 2169
2165 2170 # Currently histedit gets confused if an amend happens while histedit
2166 2171 # is in progress. Since we have a checkunfinished command, we are
2167 2172 # temporarily honoring it.
2168 2173 #
2169 2174 # Note: eventually this guard will be removed. Please do not expect
2170 2175 # this behavior to remain.
2171 2176 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
2172 2177 cmdutil.checkunfinished(repo)
2173 2178
2174 2179 node = cmdutil.amend(ui, repo, old, extra, pats, opts)
2175 2180 if node == old.node():
2176 2181 ui.status(_(b"nothing changed\n"))
2177 2182 return 1
2178 2183 else:
2179 2184
2180 2185 def commitfunc(ui, repo, message, match, opts):
2181 2186 overrides = {}
2182 2187 if opts.get(b'secret'):
2183 2188 overrides[(b'phases', b'new-commit')] = b'secret'
2184 2189 elif opts.get(b'draft'):
2185 2190 overrides[(b'phases', b'new-commit')] = b'draft'
2186 2191
2187 2192 baseui = repo.baseui
2188 2193 with baseui.configoverride(overrides, b'commit'):
2189 2194 with ui.configoverride(overrides, b'commit'):
2190 2195 editform = cmdutil.mergeeditform(
2191 2196 repo[None], b'commit.normal'
2192 2197 )
2193 2198 editor = cmdutil.getcommiteditor(
2194 2199 editform=editform, **pycompat.strkwargs(opts)
2195 2200 )
2196 2201 return repo.commit(
2197 2202 message,
2198 2203 opts.get(b'user'),
2199 2204 opts.get(b'date'),
2200 2205 match,
2201 2206 editor=editor,
2202 2207 extra=extra,
2203 2208 )
2204 2209
2205 2210 node = cmdutil.commit(
2206 2211 ui, repo, commitfunc, pats, pycompat.byteskwargs(opts)
2207 2212 )
2208 2213
2209 2214 if not node:
2210 2215 stat = cmdutil.postcommitstatus(
2211 2216 repo, pats, pycompat.byteskwargs(opts)
2212 2217 )
2213 2218 if stat.deleted:
2214 2219 ui.status(
2215 2220 _(
2216 2221 b"nothing changed (%d missing files, see "
2217 2222 b"'hg status')\n"
2218 2223 )
2219 2224 % len(stat.deleted)
2220 2225 )
2221 2226 else:
2222 2227 ui.status(_(b"nothing changed\n"))
2223 2228 return 1
2224 2229
2225 2230 cmdutil.commitstatus(repo, node, branch, bheads, tip, **opts)
2226 2231
2227 2232 if not ui.quiet and ui.configbool(b'commands', b'commit.post-status'):
2228 2233 status(
2229 2234 ui,
2230 2235 repo,
2231 2236 modified=True,
2232 2237 added=True,
2233 2238 removed=True,
2234 2239 deleted=True,
2235 2240 unknown=True,
2236 2241 subrepos=opts.get('subrepos'),
2237 2242 )
2238 2243
2239 2244
2240 2245 @command(
2241 2246 b'config|showconfig|debugconfig',
2242 2247 [
2243 2248 (b'u', b'untrusted', None, _(b'show untrusted configuration options')),
2244 2249 # This is experimental because we need
2245 2250 # * reasonable behavior around aliases,
2246 2251 # * decide if we display [debug] [experimental] and [devel] section par
2247 2252 # default
2248 2253 # * some way to display "generic" config entry (the one matching
2249 2254 # regexp,
2250 2255 # * proper display of the different value type
2251 2256 # * a better way to handle <DYNAMIC> values (and variable types),
2252 2257 # * maybe some type information ?
2253 2258 (
2254 2259 b'',
2255 2260 b'exp-all-known',
2256 2261 None,
2257 2262 _(b'show all known config option (EXPERIMENTAL)'),
2258 2263 ),
2259 2264 (b'e', b'edit', None, _(b'edit user config')),
2260 2265 (b'l', b'local', None, _(b'edit repository config')),
2261 2266 (b'', b'source', None, _(b'show source of configuration value')),
2262 2267 (
2263 2268 b'',
2264 2269 b'shared',
2265 2270 None,
2266 2271 _(b'edit shared source repository config (EXPERIMENTAL)'),
2267 2272 ),
2268 2273 (b'', b'non-shared', None, _(b'edit non shared config (EXPERIMENTAL)')),
2269 2274 (b'g', b'global', None, _(b'edit global config')),
2270 2275 ]
2271 2276 + formatteropts,
2272 2277 _(b'[-u] [NAME]...'),
2273 2278 helpcategory=command.CATEGORY_HELP,
2274 2279 optionalrepo=True,
2275 2280 intents={INTENT_READONLY},
2276 2281 )
2277 2282 def config(ui, repo, *values, **opts):
2278 2283 """show combined config settings from all hgrc files
2279 2284
2280 2285 With no arguments, print names and values of all config items.
2281 2286
2282 2287 With one argument of the form section.name, print just the value
2283 2288 of that config item.
2284 2289
2285 2290 With multiple arguments, print names and values of all config
2286 2291 items with matching section names or section.names.
2287 2292
2288 2293 With --edit, start an editor on the user-level config file. With
2289 2294 --global, edit the system-wide config file. With --local, edit the
2290 2295 repository-level config file.
2291 2296
2292 2297 With --source, the source (filename and line number) is printed
2293 2298 for each config item.
2294 2299
2295 2300 See :hg:`help config` for more information about config files.
2296 2301
2297 2302 .. container:: verbose
2298 2303
2299 2304 --non-shared flag is used to edit `.hg/hgrc-not-shared` config file.
2300 2305 This file is not shared across shares when in share-safe mode.
2301 2306
2302 2307 Template:
2303 2308
2304 2309 The following keywords are supported. See also :hg:`help templates`.
2305 2310
2306 2311 :name: String. Config name.
2307 2312 :source: String. Filename and line number where the item is defined.
2308 2313 :value: String. Config value.
2309 2314
2310 2315 The --shared flag can be used to edit the config file of shared source
2311 2316 repository. It only works when you have shared using the experimental
2312 2317 share safe feature.
2313 2318
2314 2319 Returns 0 on success, 1 if NAME does not exist.
2315 2320
2316 2321 """
2317 2322
2318 2323 editopts = ('edit', 'local', 'global', 'shared', 'non_shared')
2319 2324 if any(opts.get(o) for o in editopts):
2320 2325 cmdutil.check_at_most_one_arg(opts, *editopts[1:])
2321 2326 if opts.get('local'):
2322 2327 if not repo:
2323 2328 raise error.InputError(
2324 2329 _(b"can't use --local outside a repository")
2325 2330 )
2326 2331 paths = [repo.vfs.join(b'hgrc')]
2327 2332 elif opts.get('global'):
2328 2333 paths = rcutil.systemrcpath()
2329 2334 elif opts.get('shared'):
2330 2335 if not repo.shared():
2331 2336 raise error.InputError(
2332 2337 _(b"repository is not shared; can't use --shared")
2333 2338 )
2334 2339 if requirements.SHARESAFE_REQUIREMENT not in repo.requirements:
2335 2340 raise error.InputError(
2336 2341 _(
2337 2342 b"share safe feature not enabled; "
2338 2343 b"unable to edit shared source repository config"
2339 2344 )
2340 2345 )
2341 2346 paths = [vfsmod.vfs(repo.sharedpath).join(b'hgrc')]
2342 2347 elif opts.get('non_shared'):
2343 2348 paths = [repo.vfs.join(b'hgrc-not-shared')]
2344 2349 else:
2345 2350 paths = rcutil.userrcpath()
2346 2351
2347 2352 for f in paths:
2348 2353 if os.path.exists(f):
2349 2354 break
2350 2355 else:
2351 2356 if opts.get('global'):
2352 2357 samplehgrc = uimod.samplehgrcs[b'global']
2353 2358 elif opts.get('local'):
2354 2359 samplehgrc = uimod.samplehgrcs[b'local']
2355 2360 else:
2356 2361 samplehgrc = uimod.samplehgrcs[b'user']
2357 2362
2358 2363 f = paths[0]
2359 2364 util.writefile(f, util.tonativeeol(samplehgrc))
2360 2365
2361 2366 editor = ui.geteditor()
2362 2367 ui.system(
2363 2368 b"%s \"%s\"" % (editor, f),
2364 2369 onerr=error.InputError,
2365 2370 errprefix=_(b"edit failed"),
2366 2371 blockedtag=b'config_edit',
2367 2372 )
2368 2373 return
2369 2374 ui.pager(b'config')
2370 2375 fm = ui.formatter(b'config', pycompat.byteskwargs(opts))
2371 2376 for t, f in rcutil.rccomponents():
2372 2377 if t == b'path':
2373 2378 ui.debug(b'read config from: %s\n' % f)
2374 2379 elif t == b'resource':
2375 2380 ui.debug(b'read config from: resource:%s.%s\n' % (f[0], f[1]))
2376 2381 elif t == b'items':
2377 2382 # Don't print anything for 'items'.
2378 2383 pass
2379 2384 else:
2380 2385 raise error.ProgrammingError(b'unknown rctype: %s' % t)
2381 2386 untrusted = bool(opts.get('untrusted'))
2382 2387
2383 2388 selsections = selentries = []
2384 2389 if values:
2385 2390 selsections = [v for v in values if b'.' not in v]
2386 2391 selentries = [v for v in values if b'.' in v]
2387 2392 uniquesel = len(selentries) == 1 and not selsections
2388 2393 selsections = set(selsections)
2389 2394 selentries = set(selentries)
2390 2395
2391 2396 matched = False
2392 2397 all_known = opts['exp_all_known']
2393 2398 show_source = ui.debugflag or opts.get('source')
2394 2399 entries = ui.walkconfig(untrusted=untrusted, all_known=all_known)
2395 2400 for section, name, value in entries:
2396 2401 source = ui.configsource(section, name, untrusted)
2397 2402 value = pycompat.bytestr(value)
2398 2403 defaultvalue = ui.configdefault(section, name)
2399 2404 if fm.isplain():
2400 2405 source = source or b'none'
2401 2406 value = value.replace(b'\n', b'\\n')
2402 2407 entryname = section + b'.' + name
2403 2408 if values and not (section in selsections or entryname in selentries):
2404 2409 continue
2405 2410 fm.startitem()
2406 2411 fm.condwrite(show_source, b'source', b'%s: ', source)
2407 2412 if uniquesel:
2408 2413 fm.data(name=entryname)
2409 2414 fm.write(b'value', b'%s\n', value)
2410 2415 else:
2411 2416 fm.write(b'name value', b'%s=%s\n', entryname, value)
2412 2417 if formatter.isprintable(defaultvalue):
2413 2418 fm.data(defaultvalue=defaultvalue)
2414 2419 elif isinstance(defaultvalue, list) and all(
2415 2420 formatter.isprintable(e) for e in defaultvalue
2416 2421 ):
2417 2422 fm.data(defaultvalue=fm.formatlist(defaultvalue, name=b'value'))
2418 2423 # TODO: no idea how to process unsupported defaultvalue types
2419 2424 matched = True
2420 2425 fm.end()
2421 2426 if matched:
2422 2427 return 0
2423 2428 return 1
2424 2429
2425 2430
2426 2431 @command(
2427 2432 b'continue',
2428 2433 dryrunopts,
2429 2434 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2430 2435 helpbasic=True,
2431 2436 )
2432 2437 def continuecmd(ui, repo, **opts):
2433 2438 """resumes an interrupted operation (EXPERIMENTAL)
2434 2439
2435 2440 Finishes a multistep operation like graft, histedit, rebase, merge,
2436 2441 and unshelve if they are in an interrupted state.
2437 2442
2438 2443 use --dry-run/-n to dry run the command.
2439 2444 """
2440 2445 dryrun = opts.get('dry_run')
2441 2446 contstate = cmdutil.getunfinishedstate(repo)
2442 2447 if not contstate:
2443 2448 raise error.StateError(_(b'no operation in progress'))
2444 2449 if not contstate.continuefunc:
2445 2450 raise error.StateError(
2446 2451 (
2447 2452 _(b"%s in progress but does not support 'hg continue'")
2448 2453 % (contstate._opname)
2449 2454 ),
2450 2455 hint=contstate.continuemsg(),
2451 2456 )
2452 2457 if dryrun:
2453 2458 ui.status(_(b'%s in progress, will be resumed\n') % (contstate._opname))
2454 2459 return
2455 2460 return contstate.continuefunc(ui, repo)
2456 2461
2457 2462
2458 2463 @command(
2459 2464 b'copy|cp',
2460 2465 [
2461 2466 (b'', b'forget', None, _(b'unmark a destination file as copied')),
2462 2467 (b'A', b'after', None, _(b'record a copy that has already occurred')),
2463 2468 (
2464 2469 b'',
2465 2470 b'at-rev',
2466 2471 b'',
2467 2472 _(b'(un)mark copies in the given revision (EXPERIMENTAL)'),
2468 2473 _(b'REV'),
2469 2474 ),
2470 2475 (
2471 2476 b'f',
2472 2477 b'force',
2473 2478 None,
2474 2479 _(b'forcibly copy over an existing managed file'),
2475 2480 ),
2476 2481 ]
2477 2482 + walkopts
2478 2483 + dryrunopts,
2479 2484 _(b'[OPTION]... (SOURCE... DEST | --forget DEST...)'),
2480 2485 helpcategory=command.CATEGORY_FILE_CONTENTS,
2481 2486 )
2482 2487 def copy(ui, repo, *pats, **opts):
2483 2488 """mark files as copied for the next commit
2484 2489
2485 2490 Mark dest as having copies of source files. If dest is a
2486 2491 directory, copies are put in that directory. If dest is a file,
2487 2492 the source must be a single file.
2488 2493
2489 2494 By default, this command copies the contents of files as they
2490 2495 exist in the working directory. If invoked with -A/--after, the
2491 2496 operation is recorded, but no copying is performed.
2492 2497
2493 2498 To undo marking a destination file as copied, use --forget. With that
2494 2499 option, all given (positional) arguments are unmarked as copies. The
2495 2500 destination file(s) will be left in place (still tracked). Note that
2496 2501 :hg:`copy --forget` behaves the same way as :hg:`rename --forget`.
2497 2502
2498 2503 This command takes effect with the next commit by default.
2499 2504
2500 2505 Returns 0 on success, 1 if errors are encountered.
2501 2506 """
2502 2507
2503 2508 context = lambda repo: repo.dirstate.changing_files(repo)
2504 2509 rev = opts.get('at_rev')
2505 2510
2506 2511 if rev:
2507 2512 ctx = logcmdutil.revsingle(repo, rev)
2508 2513 if ctx.rev() is not None:
2509 2514
2510 2515 def context(repo):
2511 2516 return util.nullcontextmanager()
2512 2517
2513 2518 opts['at_rev'] = ctx.rev()
2514 2519 with repo.wlock(), context(repo):
2515 2520 return cmdutil.copy(ui, repo, pats, pycompat.byteskwargs(opts))
2516 2521
2517 2522
2518 2523 @command(
2519 2524 b'debugcommands',
2520 2525 [],
2521 2526 _(b'[COMMAND]'),
2522 2527 helpcategory=command.CATEGORY_HELP,
2523 2528 norepo=True,
2524 2529 )
2525 2530 def debugcommands(ui, cmd=b'', *args):
2526 2531 """list all available commands and options"""
2527 2532 for cmd, vals in sorted(table.items()):
2528 2533 cmd = cmd.split(b'|')[0]
2529 2534 opts = b', '.join([i[1] for i in vals[1]])
2530 2535 ui.write(b'%s: %s\n' % (cmd, opts))
2531 2536
2532 2537
2533 2538 @command(
2534 2539 b'debugcomplete',
2535 2540 [(b'o', b'options', None, _(b'show the command options'))],
2536 2541 _(b'[-o] CMD'),
2537 2542 helpcategory=command.CATEGORY_HELP,
2538 2543 norepo=True,
2539 2544 )
2540 2545 def debugcomplete(ui, cmd=b'', **opts):
2541 2546 """returns the completion list associated with the given command"""
2542 2547
2543 2548 if opts.get('options'):
2544 2549 options = []
2545 2550 otables = [globalopts]
2546 2551 if cmd:
2547 2552 aliases, entry = cmdutil.findcmd(cmd, table, False)
2548 2553 otables.append(entry[1])
2549 2554 for t in otables:
2550 2555 for o in t:
2551 2556 if b"(DEPRECATED)" in o[3]:
2552 2557 continue
2553 2558 if o[0]:
2554 2559 options.append(b'-%s' % o[0])
2555 2560 options.append(b'--%s' % o[1])
2556 2561 ui.write(b"%s\n" % b"\n".join(options))
2557 2562 return
2558 2563
2559 2564 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2560 2565 if ui.verbose:
2561 2566 cmdlist = [b' '.join(c[0]) for c in cmdlist.values()]
2562 2567 ui.write(b"%s\n" % b"\n".join(sorted(cmdlist)))
2563 2568
2564 2569
2565 2570 @command(
2566 2571 b'diff',
2567 2572 [
2568 2573 (b'r', b'rev', [], _(b'revision (DEPRECATED)'), _(b'REV')),
2569 2574 (b'', b'from', b'', _(b'revision to diff from'), _(b'REV1')),
2570 2575 (b'', b'to', b'', _(b'revision to diff to'), _(b'REV2')),
2571 2576 (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
2572 2577 ]
2573 2578 + diffopts
2574 2579 + diffopts2
2575 2580 + walkopts
2576 2581 + subrepoopts,
2577 2582 _(b'[OPTION]... ([-c REV] | [--from REV1] [--to REV2]) [FILE]...'),
2578 2583 helpcategory=command.CATEGORY_FILE_CONTENTS,
2579 2584 helpbasic=True,
2580 2585 inferrepo=True,
2581 2586 intents={INTENT_READONLY},
2582 2587 )
2583 2588 def diff(ui, repo, *pats, **opts):
2584 2589 """diff repository (or selected files)
2585 2590
2586 2591 Show differences between revisions for the specified files.
2587 2592
2588 2593 Differences between files are shown using the unified diff format.
2589 2594
2590 2595 .. note::
2591 2596
2592 2597 :hg:`diff` may generate unexpected results for merges, as it will
2593 2598 default to comparing against the working directory's first
2594 2599 parent changeset if no revisions are specified. To diff against the
2595 2600 conflict regions, you can use `--config diff.merge=yes`.
2596 2601
2597 2602 By default, the working directory files are compared to its first parent. To
2598 2603 see the differences from another revision, use --from. To see the difference
2599 2604 to another revision, use --to. For example, :hg:`diff --from .^` will show
2600 2605 the differences from the working copy's grandparent to the working copy,
2601 2606 :hg:`diff --to .` will show the diff from the working copy to its parent
2602 2607 (i.e. the reverse of the default), and :hg:`diff --from 1.0 --to 1.2` will
2603 2608 show the diff between those two revisions.
2604 2609
2605 2610 Alternatively you can specify -c/--change with a revision to see the changes
2606 2611 in that changeset relative to its first parent (i.e. :hg:`diff -c 42` is
2607 2612 equivalent to :hg:`diff --from 42^ --to 42`)
2608 2613
2609 2614 Without the -a/--text option, diff will avoid generating diffs of
2610 2615 files it detects as binary. With -a, diff will generate a diff
2611 2616 anyway, probably with undesirable results.
2612 2617
2613 2618 Use the -g/--git option to generate diffs in the git extended diff
2614 2619 format. For more information, read :hg:`help diffs`.
2615 2620
2616 2621 .. container:: verbose
2617 2622
2618 2623 Examples:
2619 2624
2620 2625 - compare a file in the current working directory to its parent::
2621 2626
2622 2627 hg diff foo.c
2623 2628
2624 2629 - compare two historical versions of a directory, with rename info::
2625 2630
2626 2631 hg diff --git --from 1.0 --to 1.2 lib/
2627 2632
2628 2633 - get change stats relative to the last change on some date::
2629 2634
2630 2635 hg diff --stat --from "date('may 2')"
2631 2636
2632 2637 - diff all newly-added files that contain a keyword::
2633 2638
2634 2639 hg diff "set:added() and grep(GNU)"
2635 2640
2636 2641 - compare a revision and its parents::
2637 2642
2638 2643 hg diff -c 9353 # compare against first parent
2639 2644 hg diff --from 9353^ --to 9353 # same using revset syntax
2640 2645 hg diff --from 9353^2 --to 9353 # compare against the second parent
2641 2646
2642 2647 Returns 0 on success.
2643 2648 """
2644 2649
2645 2650 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
2646 2651 opts = pycompat.byteskwargs(opts)
2647 2652 revs = opts.get(b'rev')
2648 2653 change = opts.get(b'change')
2649 2654 from_rev = opts.get(b'from')
2650 2655 to_rev = opts.get(b'to')
2651 2656 stat = opts.get(b'stat')
2652 2657 reverse = opts.get(b'reverse')
2653 2658
2654 2659 cmdutil.check_incompatible_arguments(opts, b'from', [b'rev', b'change'])
2655 2660 cmdutil.check_incompatible_arguments(opts, b'to', [b'rev', b'change'])
2656 2661 if change:
2657 2662 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
2658 2663 ctx2 = logcmdutil.revsingle(repo, change, None)
2659 2664 ctx1 = diffutil.diff_parent(ctx2)
2660 2665 elif from_rev or to_rev:
2661 2666 repo = scmutil.unhidehashlikerevs(
2662 2667 repo, [from_rev] + [to_rev], b'nowarn'
2663 2668 )
2664 2669 ctx1 = logcmdutil.revsingle(repo, from_rev, None)
2665 2670 ctx2 = logcmdutil.revsingle(repo, to_rev, None)
2666 2671 else:
2667 2672 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
2668 2673 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
2669 2674
2670 2675 if reverse:
2671 2676 ctxleft = ctx2
2672 2677 ctxright = ctx1
2673 2678 else:
2674 2679 ctxleft = ctx1
2675 2680 ctxright = ctx2
2676 2681
2677 2682 diffopts = patch.diffallopts(ui, opts)
2678 2683 m = scmutil.match(ctx2, pats, opts)
2679 2684 m = repo.narrowmatch(m)
2680 2685 ui.pager(b'diff')
2681 2686 logcmdutil.diffordiffstat(
2682 2687 ui,
2683 2688 repo,
2684 2689 diffopts,
2685 2690 ctxleft,
2686 2691 ctxright,
2687 2692 m,
2688 2693 stat=stat,
2689 2694 listsubrepos=opts.get(b'subrepos'),
2690 2695 root=opts.get(b'root'),
2691 2696 )
2692 2697
2693 2698
2694 2699 @command(
2695 2700 b'export',
2696 2701 [
2697 2702 (
2698 2703 b'B',
2699 2704 b'bookmark',
2700 2705 b'',
2701 2706 _(b'export changes only reachable by given bookmark'),
2702 2707 _(b'BOOKMARK'),
2703 2708 ),
2704 2709 (
2705 2710 b'o',
2706 2711 b'output',
2707 2712 b'',
2708 2713 _(b'print output to file with formatted name'),
2709 2714 _(b'FORMAT'),
2710 2715 ),
2711 2716 (b'', b'switch-parent', None, _(b'diff against the second parent')),
2712 2717 (b'r', b'rev', [], _(b'revisions to export'), _(b'REV')),
2713 2718 ]
2714 2719 + diffopts
2715 2720 + formatteropts,
2716 2721 _(b'[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'),
2717 2722 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2718 2723 helpbasic=True,
2719 2724 intents={INTENT_READONLY},
2720 2725 )
2721 2726 def export(ui, repo, *changesets, **opts):
2722 2727 """dump the header and diffs for one or more changesets
2723 2728
2724 2729 Print the changeset header and diffs for one or more revisions.
2725 2730 If no revision is given, the parent of the working directory is used.
2726 2731
2727 2732 The information shown in the changeset header is: author, date,
2728 2733 branch name (if non-default), changeset hash, parent(s) and commit
2729 2734 comment.
2730 2735
2731 2736 .. note::
2732 2737
2733 2738 :hg:`export` may generate unexpected diff output for merge
2734 2739 changesets, as it will compare the merge changeset against its
2735 2740 first parent only.
2736 2741
2737 2742 Output may be to a file, in which case the name of the file is
2738 2743 given using a template string. See :hg:`help templates`. In addition
2739 2744 to the common template keywords, the following formatting rules are
2740 2745 supported:
2741 2746
2742 2747 :``%%``: literal "%" character
2743 2748 :``%H``: changeset hash (40 hexadecimal digits)
2744 2749 :``%N``: number of patches being generated
2745 2750 :``%R``: changeset revision number
2746 2751 :``%b``: basename of the exporting repository
2747 2752 :``%h``: short-form changeset hash (12 hexadecimal digits)
2748 2753 :``%m``: first line of the commit message (only alphanumeric characters)
2749 2754 :``%n``: zero-padded sequence number, starting at 1
2750 2755 :``%r``: zero-padded changeset revision number
2751 2756 :``\\``: literal "\\" character
2752 2757
2753 2758 Without the -a/--text option, export will avoid generating diffs
2754 2759 of files it detects as binary. With -a, export will generate a
2755 2760 diff anyway, probably with undesirable results.
2756 2761
2757 2762 With -B/--bookmark changesets reachable by the given bookmark are
2758 2763 selected.
2759 2764
2760 2765 Use the -g/--git option to generate diffs in the git extended diff
2761 2766 format. See :hg:`help diffs` for more information.
2762 2767
2763 2768 With the --switch-parent option, the diff will be against the
2764 2769 second parent. It can be useful to review a merge.
2765 2770
2766 2771 .. container:: verbose
2767 2772
2768 2773 Template:
2769 2774
2770 2775 The following keywords are supported in addition to the common template
2771 2776 keywords and functions. See also :hg:`help templates`.
2772 2777
2773 2778 :diff: String. Diff content.
2774 2779 :parents: List of strings. Parent nodes of the changeset.
2775 2780
2776 2781 Examples:
2777 2782
2778 2783 - use export and import to transplant a bugfix to the current
2779 2784 branch::
2780 2785
2781 2786 hg export -r 9353 | hg import -
2782 2787
2783 2788 - export all the changesets between two revisions to a file with
2784 2789 rename information::
2785 2790
2786 2791 hg export --git -r 123:150 > changes.txt
2787 2792
2788 2793 - split outgoing changes into a series of patches with
2789 2794 descriptive names::
2790 2795
2791 2796 hg export -r "outgoing()" -o "%n-%m.patch"
2792 2797
2793 2798 Returns 0 on success.
2794 2799 """
2795 2800 opts = pycompat.byteskwargs(opts)
2796 2801 bookmark = opts.get(b'bookmark')
2797 2802 changesets += tuple(opts.get(b'rev', []))
2798 2803
2799 2804 cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
2800 2805
2801 2806 if bookmark:
2802 2807 if bookmark not in repo._bookmarks:
2803 2808 raise error.InputError(_(b"bookmark '%s' not found") % bookmark)
2804 2809
2805 2810 revs = scmutil.bookmarkrevs(repo, bookmark)
2806 2811 else:
2807 2812 if not changesets:
2808 2813 changesets = [b'.']
2809 2814
2810 2815 repo = scmutil.unhidehashlikerevs(repo, changesets, b'nowarn')
2811 2816 revs = logcmdutil.revrange(repo, changesets)
2812 2817
2813 2818 if not revs:
2814 2819 raise error.InputError(_(b"export requires at least one changeset"))
2815 2820 if len(revs) > 1:
2816 2821 ui.note(_(b'exporting patches:\n'))
2817 2822 else:
2818 2823 ui.note(_(b'exporting patch:\n'))
2819 2824
2820 2825 fntemplate = opts.get(b'output')
2821 2826 if cmdutil.isstdiofilename(fntemplate):
2822 2827 fntemplate = b''
2823 2828
2824 2829 if fntemplate:
2825 2830 fm = formatter.nullformatter(ui, b'export', opts)
2826 2831 else:
2827 2832 ui.pager(b'export')
2828 2833 fm = ui.formatter(b'export', opts)
2829 2834 with fm:
2830 2835 cmdutil.export(
2831 2836 repo,
2832 2837 revs,
2833 2838 fm,
2834 2839 fntemplate=fntemplate,
2835 2840 switch_parent=opts.get(b'switch_parent'),
2836 2841 opts=patch.diffallopts(ui, opts),
2837 2842 )
2838 2843
2839 2844
2840 2845 @command(
2841 2846 b'files',
2842 2847 [
2843 2848 (
2844 2849 b'r',
2845 2850 b'rev',
2846 2851 b'',
2847 2852 _(b'search the repository as it is in REV'),
2848 2853 _(b'REV'),
2849 2854 ),
2850 2855 (
2851 2856 b'0',
2852 2857 b'print0',
2853 2858 None,
2854 2859 _(b'end filenames with NUL, for use with xargs'),
2855 2860 ),
2856 2861 ]
2857 2862 + walkopts
2858 2863 + formatteropts
2859 2864 + subrepoopts,
2860 2865 _(b'[OPTION]... [FILE]...'),
2861 2866 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2862 2867 intents={INTENT_READONLY},
2863 2868 )
2864 2869 def files(ui, repo, *pats, **opts):
2865 2870 """list tracked files
2866 2871
2867 2872 Print files under Mercurial control in the working directory or
2868 2873 specified revision for given files (excluding removed files).
2869 2874 Files can be specified as filenames or filesets.
2870 2875
2871 2876 If no files are given to match, this command prints the names
2872 2877 of all files under Mercurial control.
2873 2878
2874 2879 .. container:: verbose
2875 2880
2876 2881 Template:
2877 2882
2878 2883 The following keywords are supported in addition to the common template
2879 2884 keywords and functions. See also :hg:`help templates`.
2880 2885
2881 2886 :flags: String. Character denoting file's symlink and executable bits.
2882 2887 :path: String. Repository-absolute path of the file.
2883 2888 :size: Integer. Size of the file in bytes.
2884 2889
2885 2890 Examples:
2886 2891
2887 2892 - list all files under the current directory::
2888 2893
2889 2894 hg files .
2890 2895
2891 2896 - shows sizes and flags for current revision::
2892 2897
2893 2898 hg files -vr .
2894 2899
2895 2900 - list all files named README::
2896 2901
2897 2902 hg files -I "**/README"
2898 2903
2899 2904 - list all binary files::
2900 2905
2901 2906 hg files "set:binary()"
2902 2907
2903 2908 - find files containing a regular expression::
2904 2909
2905 2910 hg files "set:grep('bob')"
2906 2911
2907 2912 - search tracked file contents with xargs and grep::
2908 2913
2909 2914 hg files -0 | xargs -0 grep foo
2910 2915
2911 2916 See :hg:`help patterns` and :hg:`help filesets` for more information
2912 2917 on specifying file patterns.
2913 2918
2914 2919 Returns 0 if a match is found, 1 otherwise.
2915 2920
2916 2921 """
2917 2922
2918 2923 opts = pycompat.byteskwargs(opts)
2919 2924 rev = opts.get(b'rev')
2920 2925 if rev:
2921 2926 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
2922 2927 ctx = logcmdutil.revsingle(repo, rev, None)
2923 2928
2924 2929 end = b'\n'
2925 2930 if opts.get(b'print0'):
2926 2931 end = b'\0'
2927 2932 fmt = b'%s' + end
2928 2933
2929 2934 m = scmutil.match(ctx, pats, opts)
2930 2935 ui.pager(b'files')
2931 2936 uipathfn = scmutil.getuipathfn(ctx.repo(), legacyrelativevalue=True)
2932 2937 with ui.formatter(b'files', opts) as fm:
2933 2938 return cmdutil.files(
2934 2939 ui, ctx, m, uipathfn, fm, fmt, opts.get(b'subrepos')
2935 2940 )
2936 2941
2937 2942
2938 2943 @command(
2939 2944 b'forget',
2940 2945 [
2941 2946 (b'i', b'interactive', None, _(b'use interactive mode')),
2942 2947 ]
2943 2948 + walkopts
2944 2949 + dryrunopts,
2945 2950 _(b'[OPTION]... FILE...'),
2946 2951 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
2947 2952 helpbasic=True,
2948 2953 inferrepo=True,
2949 2954 )
2950 2955 def forget(ui, repo, *pats, **opts):
2951 2956 """forget the specified files on the next commit
2952 2957
2953 2958 Mark the specified files so they will no longer be tracked
2954 2959 after the next commit.
2955 2960
2956 2961 This only removes files from the current branch, not from the
2957 2962 entire project history, and it does not delete them from the
2958 2963 working directory.
2959 2964
2960 2965 To delete the file from the working directory, see :hg:`remove`.
2961 2966
2962 2967 To undo a forget before the next commit, see :hg:`add`.
2963 2968
2964 2969 .. container:: verbose
2965 2970
2966 2971 Examples:
2967 2972
2968 2973 - forget newly-added binary files::
2969 2974
2970 2975 hg forget "set:added() and binary()"
2971 2976
2972 2977 - forget files that would be excluded by .hgignore::
2973 2978
2974 2979 hg forget "set:hgignore()"
2975 2980
2976 2981 Returns 0 on success.
2977 2982 """
2978 2983
2979 2984 if not pats:
2980 2985 raise error.InputError(_(b'no files specified'))
2981 2986
2982 2987 with repo.wlock(), repo.dirstate.changing_files(repo):
2983 2988 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
2984 2989 dryrun, interactive = opts.get('dry_run'), opts.get('interactive')
2985 2990 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
2986 2991 rejected = cmdutil.forget(
2987 2992 ui,
2988 2993 repo,
2989 2994 m,
2990 2995 prefix=b"",
2991 2996 uipathfn=uipathfn,
2992 2997 explicitonly=False,
2993 2998 dryrun=dryrun,
2994 2999 interactive=interactive,
2995 3000 )[0]
2996 3001 return rejected and 1 or 0
2997 3002
2998 3003
2999 3004 @command(
3000 3005 b'graft',
3001 3006 [
3002 3007 (b'r', b'rev', [], _(b'revisions to graft'), _(b'REV')),
3003 3008 (
3004 3009 b'',
3005 3010 b'base',
3006 3011 b'',
3007 3012 _(b'base revision when doing the graft merge (ADVANCED)'),
3008 3013 _(b'REV'),
3009 3014 ),
3010 3015 (b'c', b'continue', False, _(b'resume interrupted graft')),
3011 3016 (b'', b'stop', False, _(b'stop interrupted graft')),
3012 3017 (b'', b'abort', False, _(b'abort interrupted graft')),
3013 3018 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
3014 3019 (b'', b'log', None, _(b'append graft info to log message')),
3015 3020 (
3016 3021 b'',
3017 3022 b'no-commit',
3018 3023 None,
3019 3024 _(b"don't commit, just apply the changes in working directory"),
3020 3025 ),
3021 3026 (b'f', b'force', False, _(b'force graft')),
3022 3027 (
3023 3028 b'D',
3024 3029 b'currentdate',
3025 3030 False,
3026 3031 _(b'record the current date as commit date'),
3027 3032 ),
3028 3033 (
3029 3034 b'U',
3030 3035 b'currentuser',
3031 3036 False,
3032 3037 _(b'record the current user as committer'),
3033 3038 ),
3034 3039 ]
3035 3040 + commitopts2
3036 3041 + mergetoolopts
3037 3042 + dryrunopts,
3038 3043 _(b'[OPTION]... [-r REV]... REV...'),
3039 3044 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
3040 3045 )
3041 3046 def graft(ui, repo, *revs, **opts):
3042 3047 """copy changes from other branches onto the current branch
3043 3048
3044 3049 This command uses Mercurial's merge logic to copy individual
3045 3050 changes from other branches without merging branches in the
3046 3051 history graph. This is sometimes known as 'backporting' or
3047 3052 'cherry-picking'. By default, graft will copy user, date, and
3048 3053 description from the source changesets.
3049 3054
3050 3055 Changesets that are ancestors of the current revision, that have
3051 3056 already been grafted, or that are merges will be skipped.
3052 3057
3053 3058 If --log is specified, log messages will have a comment appended
3054 3059 of the form::
3055 3060
3056 3061 (grafted from CHANGESETHASH)
3057 3062
3058 3063 If --force is specified, revisions will be grafted even if they
3059 3064 are already ancestors of, or have been grafted to, the destination.
3060 3065 This is useful when the revisions have since been backed out.
3061 3066
3062 3067 If a graft merge results in conflicts, the graft process is
3063 3068 interrupted so that the current merge can be manually resolved.
3064 3069 Once all conflicts are addressed, the graft process can be
3065 3070 continued with the -c/--continue option.
3066 3071
3067 3072 The -c/--continue option reapplies all the earlier options.
3068 3073
3069 3074 .. container:: verbose
3070 3075
3071 3076 The --base option exposes more of how graft internally uses merge with a
3072 3077 custom base revision. --base can be used to specify another ancestor than
3073 3078 the first and only parent.
3074 3079
3075 3080 The command::
3076 3081
3077 3082 hg graft -r 345 --base 234
3078 3083
3079 3084 is thus pretty much the same as::
3080 3085
3081 3086 hg diff --from 234 --to 345 | hg import
3082 3087
3083 3088 but using merge to resolve conflicts and track moved files.
3084 3089
3085 3090 The result of a merge can thus be backported as a single commit by
3086 3091 specifying one of the merge parents as base, and thus effectively
3087 3092 grafting the changes from the other side.
3088 3093
3089 3094 It is also possible to collapse multiple changesets and clean up history
3090 3095 by specifying another ancestor as base, much like rebase --collapse
3091 3096 --keep.
3092 3097
3093 3098 The commit message can be tweaked after the fact using commit --amend .
3094 3099
3095 3100 For using non-ancestors as the base to backout changes, see the backout
3096 3101 command and the hidden --parent option.
3097 3102
3098 3103 .. container:: verbose
3099 3104
3100 3105 Examples:
3101 3106
3102 3107 - copy a single change to the stable branch and edit its description::
3103 3108
3104 3109 hg update stable
3105 3110 hg graft --edit 9393
3106 3111
3107 3112 - graft a range of changesets with one exception, updating dates::
3108 3113
3109 3114 hg graft -D "2085::2093 and not 2091"
3110 3115
3111 3116 - continue a graft after resolving conflicts::
3112 3117
3113 3118 hg graft -c
3114 3119
3115 3120 - show the source of a grafted changeset::
3116 3121
3117 3122 hg log --debug -r .
3118 3123
3119 3124 - show revisions sorted by date::
3120 3125
3121 3126 hg log -r "sort(all(), date)"
3122 3127
3123 3128 - backport the result of a merge as a single commit::
3124 3129
3125 3130 hg graft -r 123 --base 123^
3126 3131
3127 3132 - land a feature branch as one changeset::
3128 3133
3129 3134 hg up -cr default
3130 3135 hg graft -r featureX --base "ancestor('featureX', 'default')"
3131 3136
3132 3137 See :hg:`help revisions` for more about specifying revisions.
3133 3138
3134 3139 Returns 0 on successful completion, 1 if there are unresolved files.
3135 3140 """
3136 3141 with repo.wlock():
3137 3142 return _dograft(ui, repo, *revs, **opts)
3138 3143
3139 3144
3140 3145 def _dograft(ui, repo, *revs, **opts):
3141 3146 if revs and opts.get('rev'):
3142 3147 ui.warn(
3143 3148 _(
3144 3149 b'warning: inconsistent use of --rev might give unexpected '
3145 3150 b'revision ordering!\n'
3146 3151 )
3147 3152 )
3148 3153
3149 3154 revs = list(revs)
3150 3155 revs.extend(opts.get('rev'))
3151 3156 # a dict of data to be stored in state file
3152 3157 statedata = {}
3153 3158 # list of new nodes created by ongoing graft
3154 3159 statedata[b'newnodes'] = []
3155 3160
3156 3161 cmdutil.resolve_commit_options(ui, opts)
3157 3162
3158 3163 editor = cmdutil.getcommiteditor(editform=b'graft', **opts)
3159 3164
3160 3165 cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
3161 3166
3162 3167 cont = False
3163 3168 if opts.get('no_commit'):
3164 3169 cmdutil.check_incompatible_arguments(
3165 3170 opts,
3166 3171 'no_commit',
3167 3172 ['edit', 'currentuser', 'currentdate', 'log'],
3168 3173 )
3169 3174
3170 3175 graftstate = statemod.cmdstate(repo, b'graftstate')
3171 3176
3172 3177 if opts.get('stop'):
3173 3178 cmdutil.check_incompatible_arguments(
3174 3179 opts,
3175 3180 'stop',
3176 3181 [
3177 3182 'edit',
3178 3183 'log',
3179 3184 'user',
3180 3185 'date',
3181 3186 'currentdate',
3182 3187 'currentuser',
3183 3188 'rev',
3184 3189 ],
3185 3190 )
3186 3191 return _stopgraft(ui, repo, graftstate)
3187 3192 elif opts.get('abort'):
3188 3193 cmdutil.check_incompatible_arguments(
3189 3194 opts,
3190 3195 'abort',
3191 3196 [
3192 3197 'edit',
3193 3198 'log',
3194 3199 'user',
3195 3200 'date',
3196 3201 'currentdate',
3197 3202 'currentuser',
3198 3203 'rev',
3199 3204 ],
3200 3205 )
3201 3206 return cmdutil.abortgraft(ui, repo, graftstate)
3202 3207 elif opts.get('continue'):
3203 3208 cont = True
3204 3209 if revs:
3205 3210 raise error.InputError(_(b"can't specify --continue and revisions"))
3206 3211 # read in unfinished revisions
3207 3212 if graftstate.exists():
3208 3213 statedata = cmdutil.readgraftstate(repo, graftstate)
3209 3214 if statedata.get(b'date'):
3210 3215 opts['date'] = statedata[b'date']
3211 3216 if statedata.get(b'user'):
3212 3217 opts['user'] = statedata[b'user']
3213 3218 if statedata.get(b'log'):
3214 3219 opts['log'] = True
3215 3220 if statedata.get(b'no_commit'):
3216 3221 opts['no_commit'] = statedata.get(b'no_commit')
3217 3222 if statedata.get(b'base'):
3218 3223 opts['base'] = statedata.get(b'base')
3219 3224 nodes = statedata[b'nodes']
3220 3225 revs = [repo[node].rev() for node in nodes]
3221 3226 else:
3222 3227 cmdutil.wrongtooltocontinue(repo, _(b'graft'))
3223 3228 else:
3224 3229 if not revs:
3225 3230 raise error.InputError(_(b'no revisions specified'))
3226 3231 cmdutil.checkunfinished(repo)
3227 3232 cmdutil.bailifchanged(repo)
3228 3233 revs = logcmdutil.revrange(repo, revs)
3229 3234
3230 3235 skipped = set()
3231 3236 basectx = None
3232 3237 if opts.get('base'):
3233 3238 basectx = logcmdutil.revsingle(repo, opts['base'], None)
3234 3239 if basectx is None:
3235 3240 # check for merges
3236 3241 for rev in repo.revs(b'%ld and merge()', revs):
3237 3242 ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
3238 3243 skipped.add(rev)
3239 3244 revs = [r for r in revs if r not in skipped]
3240 3245 if not revs:
3241 3246 return -1
3242 3247 if basectx is not None and len(revs) != 1:
3243 3248 raise error.InputError(_(b'only one revision allowed with --base '))
3244 3249
3245 3250 # Don't check in the --continue case, in effect retaining --force across
3246 3251 # --continues. That's because without --force, any revisions we decided to
3247 3252 # skip would have been filtered out here, so they wouldn't have made their
3248 3253 # way to the graftstate. With --force, any revisions we would have otherwise
3249 3254 # skipped would not have been filtered out, and if they hadn't been applied
3250 3255 # already, they'd have been in the graftstate.
3251 3256 if not (cont or opts.get('force')) and basectx is None:
3252 3257 # check for ancestors of dest branch
3253 3258 ancestors = repo.revs(b'%ld & (::.)', revs)
3254 3259 for rev in ancestors:
3255 3260 ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
3256 3261
3257 3262 revs = [r for r in revs if r not in ancestors]
3258 3263
3259 3264 if not revs:
3260 3265 return -1
3261 3266
3262 3267 # analyze revs for earlier grafts
3263 3268 ids = {}
3264 3269 for ctx in repo.set(b"%ld", revs):
3265 3270 ids[ctx.hex()] = ctx.rev()
3266 3271 n = ctx.extra().get(b'source')
3267 3272 if n:
3268 3273 ids[n] = ctx.rev()
3269 3274
3270 3275 # check ancestors for earlier grafts
3271 3276 ui.debug(b'scanning for duplicate grafts\n')
3272 3277
3273 3278 # The only changesets we can be sure doesn't contain grafts of any
3274 3279 # revs, are the ones that are common ancestors of *all* revs:
3275 3280 for rev in repo.revs(b'only(%d,ancestor(%ld))', repo[b'.'].rev(), revs):
3276 3281 ctx = repo[rev]
3277 3282 n = ctx.extra().get(b'source')
3278 3283 if n in ids:
3279 3284 try:
3280 3285 r = repo[n].rev()
3281 3286 except error.RepoLookupError:
3282 3287 r = None
3283 3288 if r in revs:
3284 3289 ui.warn(
3285 3290 _(
3286 3291 b'skipping revision %d:%s '
3287 3292 b'(already grafted to %d:%s)\n'
3288 3293 )
3289 3294 % (r, repo[r], rev, ctx)
3290 3295 )
3291 3296 revs.remove(r)
3292 3297 elif ids[n] in revs:
3293 3298 if r is None:
3294 3299 ui.warn(
3295 3300 _(
3296 3301 b'skipping already grafted revision %d:%s '
3297 3302 b'(%d:%s also has unknown origin %s)\n'
3298 3303 )
3299 3304 % (ids[n], repo[ids[n]], rev, ctx, n[:12])
3300 3305 )
3301 3306 else:
3302 3307 ui.warn(
3303 3308 _(
3304 3309 b'skipping already grafted revision %d:%s '
3305 3310 b'(%d:%s also has origin %d:%s)\n'
3306 3311 )
3307 3312 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
3308 3313 )
3309 3314 revs.remove(ids[n])
3310 3315 elif ctx.hex() in ids:
3311 3316 r = ids[ctx.hex()]
3312 3317 if r in revs:
3313 3318 ui.warn(
3314 3319 _(
3315 3320 b'skipping already grafted revision %d:%s '
3316 3321 b'(was grafted from %d:%s)\n'
3317 3322 )
3318 3323 % (r, repo[r], rev, ctx)
3319 3324 )
3320 3325 revs.remove(r)
3321 3326 if not revs:
3322 3327 return -1
3323 3328
3324 3329 if opts.get('no_commit'):
3325 3330 statedata[b'no_commit'] = True
3326 3331 if opts.get('base'):
3327 3332 statedata[b'base'] = opts['base']
3328 3333 for pos, ctx in enumerate(repo.set(b"%ld", revs)):
3329 3334 desc = b'%d:%s "%s"' % (
3330 3335 ctx.rev(),
3331 3336 ctx,
3332 3337 ctx.description().split(b'\n', 1)[0],
3333 3338 )
3334 3339 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3335 3340 if names:
3336 3341 desc += b' (%s)' % b' '.join(names)
3337 3342 ui.status(_(b'grafting %s\n') % desc)
3338 3343 if opts.get('dry_run'):
3339 3344 continue
3340 3345
3341 3346 source = ctx.extra().get(b'source')
3342 3347 extra = {}
3343 3348 if source:
3344 3349 extra[b'source'] = source
3345 3350 extra[b'intermediate-source'] = ctx.hex()
3346 3351 else:
3347 3352 extra[b'source'] = ctx.hex()
3348 3353 user = ctx.user()
3349 3354 if opts.get('user'):
3350 3355 user = opts['user']
3351 3356 statedata[b'user'] = user
3352 3357 date = ctx.date()
3353 3358 if opts.get('date'):
3354 3359 date = opts['date']
3355 3360 statedata[b'date'] = date
3356 3361 message = ctx.description()
3357 3362 if opts.get('log'):
3358 3363 message += b'\n(grafted from %s)' % ctx.hex()
3359 3364 statedata[b'log'] = True
3360 3365
3361 3366 # we don't merge the first commit when continuing
3362 3367 if not cont:
3363 3368 # perform the graft merge with p1(rev) as 'ancestor'
3364 3369 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
3365 3370 base = ctx.p1() if basectx is None else basectx
3366 3371 with ui.configoverride(overrides, b'graft'):
3367 3372 stats = mergemod.graft(
3368 3373 repo, ctx, base, [b'local', b'graft', b'parent of graft']
3369 3374 )
3370 3375 # report any conflicts
3371 3376 if stats.unresolvedcount > 0:
3372 3377 # write out state for --continue
3373 3378 nodes = [repo[rev].hex() for rev in revs[pos:]]
3374 3379 statedata[b'nodes'] = nodes
3375 3380 stateversion = 1
3376 3381 graftstate.save(stateversion, statedata)
3377 3382 ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
3378 3383 ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
3379 3384 return 1
3380 3385 else:
3381 3386 cont = False
3382 3387
3383 3388 # commit if --no-commit is false
3384 3389 if not opts.get('no_commit'):
3385 3390 node = repo.commit(
3386 3391 text=message, user=user, date=date, extra=extra, editor=editor
3387 3392 )
3388 3393 if node is None:
3389 3394 ui.warn(
3390 3395 _(b'note: graft of %d:%s created no changes to commit\n')
3391 3396 % (ctx.rev(), ctx)
3392 3397 )
3393 3398 # checking that newnodes exist because old state files won't have it
3394 3399 elif statedata.get(b'newnodes') is not None:
3395 3400 nn = statedata[b'newnodes']
3396 3401 assert isinstance(nn, list) # list of bytes
3397 3402 nn.append(node)
3398 3403
3399 3404 # remove state when we complete successfully
3400 3405 if not opts.get('dry_run'):
3401 3406 graftstate.delete()
3402 3407
3403 3408 return 0
3404 3409
3405 3410
3406 3411 def _stopgraft(ui, repo, graftstate):
3407 3412 """stop the interrupted graft"""
3408 3413 if not graftstate.exists():
3409 3414 raise error.StateError(_(b"no interrupted graft found"))
3410 3415 pctx = repo[b'.']
3411 3416 mergemod.clean_update(pctx)
3412 3417 graftstate.delete()
3413 3418 ui.status(_(b"stopped the interrupted graft\n"))
3414 3419 ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
3415 3420 return 0
3416 3421
3417 3422
3418 3423 statemod.addunfinished(
3419 3424 b'graft',
3420 3425 fname=b'graftstate',
3421 3426 clearable=True,
3422 3427 stopflag=True,
3423 3428 continueflag=True,
3424 3429 abortfunc=cmdutil.hgabortgraft,
3425 3430 cmdhint=_(b"use 'hg graft --continue' or 'hg graft --stop' to stop"),
3426 3431 )
3427 3432
3428 3433
3429 3434 @command(
3430 3435 b'grep',
3431 3436 [
3432 3437 (b'0', b'print0', None, _(b'end fields with NUL')),
3433 3438 (b'', b'all', None, _(b'an alias to --diff (DEPRECATED)')),
3434 3439 (
3435 3440 b'',
3436 3441 b'diff',
3437 3442 None,
3438 3443 _(
3439 3444 b'search revision differences for when the pattern was added '
3440 3445 b'or removed'
3441 3446 ),
3442 3447 ),
3443 3448 (b'a', b'text', None, _(b'treat all files as text')),
3444 3449 (
3445 3450 b'f',
3446 3451 b'follow',
3447 3452 None,
3448 3453 _(
3449 3454 b'follow changeset history,'
3450 3455 b' or file history across copies and renames'
3451 3456 ),
3452 3457 ),
3453 3458 (b'i', b'ignore-case', None, _(b'ignore case when matching')),
3454 3459 (
3455 3460 b'l',
3456 3461 b'files-with-matches',
3457 3462 None,
3458 3463 _(b'print only filenames and revisions that match'),
3459 3464 ),
3460 3465 (b'n', b'line-number', None, _(b'print matching line numbers')),
3461 3466 (
3462 3467 b'r',
3463 3468 b'rev',
3464 3469 [],
3465 3470 _(b'search files changed within revision range'),
3466 3471 _(b'REV'),
3467 3472 ),
3468 3473 (
3469 3474 b'',
3470 3475 b'all-files',
3471 3476 None,
3472 3477 _(
3473 3478 b'include all files in the changeset while grepping (DEPRECATED)'
3474 3479 ),
3475 3480 ),
3476 3481 (b'u', b'user', None, _(b'list the author (long with -v)')),
3477 3482 (b'd', b'date', None, _(b'list the date (short with -q)')),
3478 3483 ]
3479 3484 + formatteropts
3480 3485 + walkopts,
3481 3486 _(b'[--diff] [OPTION]... PATTERN [FILE]...'),
3482 3487 helpcategory=command.CATEGORY_FILE_CONTENTS,
3483 3488 inferrepo=True,
3484 3489 intents={INTENT_READONLY},
3485 3490 )
3486 3491 def grep(ui, repo, pattern, *pats, **opts):
3487 3492 """search for a pattern in specified files
3488 3493
3489 3494 Search the working directory or revision history for a regular
3490 3495 expression in the specified files for the entire repository.
3491 3496
3492 3497 By default, grep searches the repository files in the working
3493 3498 directory and prints the files where it finds a match. To specify
3494 3499 historical revisions instead of the working directory, use the
3495 3500 --rev flag.
3496 3501
3497 3502 To search instead historical revision differences that contains a
3498 3503 change in match status ("-" for a match that becomes a non-match,
3499 3504 or "+" for a non-match that becomes a match), use the --diff flag.
3500 3505
3501 3506 PATTERN can be any Python (roughly Perl-compatible) regular
3502 3507 expression.
3503 3508
3504 3509 If no FILEs are specified and the --rev flag isn't supplied, all
3505 3510 files in the working directory are searched. When using the --rev
3506 3511 flag and specifying FILEs, use the --follow argument to also
3507 3512 follow the specified FILEs across renames and copies.
3508 3513
3509 3514 .. container:: verbose
3510 3515
3511 3516 Template:
3512 3517
3513 3518 The following keywords are supported in addition to the common template
3514 3519 keywords and functions. See also :hg:`help templates`.
3515 3520
3516 3521 :change: String. Character denoting insertion ``+`` or removal ``-``.
3517 3522 Available if ``--diff`` is specified.
3518 3523 :lineno: Integer. Line number of the match.
3519 3524 :path: String. Repository-absolute path of the file.
3520 3525 :texts: List of text chunks.
3521 3526
3522 3527 And each entry of ``{texts}`` provides the following sub-keywords.
3523 3528
3524 3529 :matched: Boolean. True if the chunk matches the specified pattern.
3525 3530 :text: String. Chunk content.
3526 3531
3527 3532 See :hg:`help templates.operators` for the list expansion syntax.
3528 3533
3529 3534 Returns 0 if a match is found, 1 otherwise.
3530 3535
3531 3536 """
3532 3537 cmdutil.check_incompatible_arguments(opts, 'all_files', ['all', 'diff'])
3533 3538
3534 3539 diff = opts.get('all') or opts.get('diff')
3535 3540 follow = opts.get('follow')
3536 3541 if opts.get('all_files') is None and not diff:
3537 3542 opts['all_files'] = True
3538 3543 plaingrep = (
3539 3544 opts.get('all_files') and not opts.get('rev') and not opts.get('follow')
3540 3545 )
3541 3546 all_files = opts.get('all_files')
3542 3547 if plaingrep:
3543 3548 opts['rev'] = [b'wdir()']
3544 3549
3545 3550 reflags = re.M
3546 3551 if opts.get('ignore_case'):
3547 3552 reflags |= re.I
3548 3553 try:
3549 3554 regexp = util.re.compile(pattern, reflags)
3550 3555 except re.error as inst:
3551 3556 ui.warn(
3552 3557 _(b"grep: invalid match pattern: %s\n")
3553 3558 % stringutil.forcebytestr(inst)
3554 3559 )
3555 3560 return 1
3556 3561 sep, eol = b':', b'\n'
3557 3562 if opts.get('print0'):
3558 3563 sep = eol = b'\0'
3559 3564
3560 3565 searcher = grepmod.grepsearcher(
3561 3566 ui, repo, regexp, all_files=all_files, diff=diff, follow=follow
3562 3567 )
3563 3568
3564 3569 getfile = searcher._getfile
3565 3570
3566 3571 uipathfn = scmutil.getuipathfn(repo)
3567 3572
3568 3573 def display(fm, fn, ctx, pstates, states):
3569 3574 rev = scmutil.intrev(ctx)
3570 3575 if fm.isplain():
3571 3576 formatuser = ui.shortuser
3572 3577 else:
3573 3578 formatuser = pycompat.bytestr
3574 3579 if ui.quiet:
3575 3580 datefmt = b'%Y-%m-%d'
3576 3581 else:
3577 3582 datefmt = b'%a %b %d %H:%M:%S %Y %1%2'
3578 3583 found = False
3579 3584
3580 3585 @util.cachefunc
3581 3586 def binary():
3582 3587 flog = getfile(fn)
3583 3588 try:
3584 3589 return stringutil.binary(flog.read(ctx.filenode(fn)))
3585 3590 except error.WdirUnsupported:
3586 3591 return ctx[fn].isbinary()
3587 3592
3588 3593 fieldnamemap = {b'linenumber': b'lineno'}
3589 3594 if diff:
3590 3595 iter = grepmod.difflinestates(pstates, states)
3591 3596 else:
3592 3597 iter = [(b'', l) for l in states]
3593 3598 for change, l in iter:
3594 3599 fm.startitem()
3595 3600 fm.context(ctx=ctx)
3596 3601 fm.data(node=fm.hexfunc(scmutil.binnode(ctx)), path=fn)
3597 3602 fm.plain(uipathfn(fn), label=b'grep.filename')
3598 3603
3599 3604 cols = [
3600 3605 (b'rev', b'%d', rev, not plaingrep, b''),
3601 3606 (
3602 3607 b'linenumber',
3603 3608 b'%d',
3604 3609 l.linenum,
3605 3610 opts.get('line_number'),
3606 3611 b'',
3607 3612 ),
3608 3613 ]
3609 3614 if diff:
3610 3615 cols.append(
3611 3616 (
3612 3617 b'change',
3613 3618 b'%s',
3614 3619 change,
3615 3620 True,
3616 3621 b'grep.inserted '
3617 3622 if change == b'+'
3618 3623 else b'grep.deleted ',
3619 3624 )
3620 3625 )
3621 3626 cols.extend(
3622 3627 [
3623 3628 (
3624 3629 b'user',
3625 3630 b'%s',
3626 3631 formatuser(ctx.user()),
3627 3632 opts.get('user'),
3628 3633 b'',
3629 3634 ),
3630 3635 (
3631 3636 b'date',
3632 3637 b'%s',
3633 3638 fm.formatdate(ctx.date(), datefmt),
3634 3639 opts.get('date'),
3635 3640 b'',
3636 3641 ),
3637 3642 ]
3638 3643 )
3639 3644 for name, fmt, data, cond, extra_label in cols:
3640 3645 if cond:
3641 3646 fm.plain(sep, label=b'grep.sep')
3642 3647 field = fieldnamemap.get(name, name)
3643 3648 label = extra_label + (b'grep.%s' % name)
3644 3649 fm.condwrite(cond, field, fmt, data, label=label)
3645 3650 if not opts.get('files_with_matches'):
3646 3651 fm.plain(sep, label=b'grep.sep')
3647 3652 if not opts.get('text') and binary():
3648 3653 fm.plain(_(b" Binary file matches"))
3649 3654 else:
3650 3655 displaymatches(fm.nested(b'texts', tmpl=b'{text}'), l)
3651 3656 fm.plain(eol)
3652 3657 found = True
3653 3658 if opts.get('files_with_matches'):
3654 3659 break
3655 3660 return found
3656 3661
3657 3662 def displaymatches(fm, l):
3658 3663 p = 0
3659 3664 for s, e in l.findpos(regexp):
3660 3665 if p < s:
3661 3666 fm.startitem()
3662 3667 fm.write(b'text', b'%s', l.line[p:s])
3663 3668 fm.data(matched=False)
3664 3669 fm.startitem()
3665 3670 fm.write(b'text', b'%s', l.line[s:e], label=b'grep.match')
3666 3671 fm.data(matched=True)
3667 3672 p = e
3668 3673 if p < len(l.line):
3669 3674 fm.startitem()
3670 3675 fm.write(b'text', b'%s', l.line[p:])
3671 3676 fm.data(matched=False)
3672 3677 fm.end()
3673 3678
3674 3679 found = False
3675 3680
3676 3681 wopts = logcmdutil.walkopts(
3677 3682 pats=pats,
3678 3683 opts=opts,
3679 3684 revspec=opts['rev'],
3680 3685 include_pats=opts['include'],
3681 3686 exclude_pats=opts['exclude'],
3682 3687 follow=follow,
3683 3688 force_changelog_traversal=all_files,
3684 3689 filter_revisions_by_pats=not all_files,
3685 3690 )
3686 3691 revs, makefilematcher = logcmdutil.makewalker(repo, wopts)
3687 3692
3688 3693 ui.pager(b'grep')
3689 3694 fm = ui.formatter(b'grep', pycompat.byteskwargs(opts))
3690 3695 for fn, ctx, pstates, states in searcher.searchfiles(revs, makefilematcher):
3691 3696 r = display(fm, fn, ctx, pstates, states)
3692 3697 found = found or r
3693 3698 if r and not diff and not all_files:
3694 3699 searcher.skipfile(fn, ctx.rev())
3695 3700 fm.end()
3696 3701
3697 3702 return not found
3698 3703
3699 3704
3700 3705 @command(
3701 3706 b'heads',
3702 3707 [
3703 3708 (
3704 3709 b'r',
3705 3710 b'rev',
3706 3711 b'',
3707 3712 _(b'show only heads which are descendants of STARTREV'),
3708 3713 _(b'STARTREV'),
3709 3714 ),
3710 3715 (b't', b'topo', False, _(b'show topological heads only')),
3711 3716 (
3712 3717 b'a',
3713 3718 b'active',
3714 3719 False,
3715 3720 _(b'show active branchheads only (DEPRECATED)'),
3716 3721 ),
3717 3722 (b'c', b'closed', False, _(b'show normal and closed branch heads')),
3718 3723 ]
3719 3724 + templateopts,
3720 3725 _(b'[-ct] [-r STARTREV] [REV]...'),
3721 3726 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3722 3727 intents={INTENT_READONLY},
3723 3728 )
3724 3729 def heads(ui, repo, *branchrevs, **opts):
3725 3730 """show branch heads
3726 3731
3727 3732 With no arguments, show all open branch heads in the repository.
3728 3733 Branch heads are changesets that have no descendants on the
3729 3734 same branch. They are where development generally takes place and
3730 3735 are the usual targets for update and merge operations.
3731 3736
3732 3737 If one or more REVs are given, only open branch heads on the
3733 3738 branches associated with the specified changesets are shown. This
3734 3739 means that you can use :hg:`heads .` to see the heads on the
3735 3740 currently checked-out branch.
3736 3741
3737 3742 If -c/--closed is specified, also show branch heads marked closed
3738 3743 (see :hg:`commit --close-branch`).
3739 3744
3740 3745 If STARTREV is specified, only those heads that are descendants of
3741 3746 STARTREV will be displayed.
3742 3747
3743 3748 If -t/--topo is specified, named branch mechanics will be ignored and only
3744 3749 topological heads (changesets with no children) will be shown.
3745 3750
3746 3751 Returns 0 if matching heads are found, 1 if not.
3747 3752 """
3748 3753
3749 3754 start = None
3750 3755 rev = opts.get('rev')
3751 3756 if rev:
3752 3757 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3753 3758 start = logcmdutil.revsingle(repo, rev, None).node()
3754 3759
3755 3760 if opts.get('topo'):
3756 3761 heads = [repo[h] for h in repo.heads(start)]
3757 3762 else:
3758 3763 heads = []
3759 3764 for branch in repo.branchmap():
3760 3765 heads += repo.branchheads(branch, start, opts.get('closed'))
3761 3766 heads = [repo[h] for h in heads]
3762 3767
3763 3768 if branchrevs:
3764 3769 branches = {
3765 3770 repo[r].branch() for r in logcmdutil.revrange(repo, branchrevs)
3766 3771 }
3767 3772 heads = [h for h in heads if h.branch() in branches]
3768 3773
3769 3774 if opts.get('active') and branchrevs:
3770 3775 dagheads = repo.heads(start)
3771 3776 heads = [h for h in heads if h.node() in dagheads]
3772 3777
3773 3778 if branchrevs:
3774 3779 haveheads = {h.branch() for h in heads}
3775 3780 if branches - haveheads:
3776 3781 headless = b', '.join(b for b in branches - haveheads)
3777 3782 msg = _(b'no open branch heads found on branches %s')
3778 3783 if opts.get('rev'):
3779 3784 msg += _(b' (started at %s)') % opts['rev']
3780 3785 ui.warn((msg + b'\n') % headless)
3781 3786
3782 3787 if not heads:
3783 3788 return 1
3784 3789
3785 3790 ui.pager(b'heads')
3786 3791 heads = sorted(heads, key=lambda x: -(x.rev()))
3787 3792 displayer = logcmdutil.changesetdisplayer(
3788 3793 ui, repo, pycompat.byteskwargs(opts)
3789 3794 )
3790 3795 for ctx in heads:
3791 3796 displayer.show(ctx)
3792 3797 displayer.close()
3793 3798
3794 3799
3795 3800 @command(
3796 3801 b'help',
3797 3802 [
3798 3803 (b'e', b'extension', None, _(b'show only help for extensions')),
3799 3804 (b'c', b'command', None, _(b'show only help for commands')),
3800 3805 (b'k', b'keyword', None, _(b'show topics matching keyword')),
3801 3806 (
3802 3807 b's',
3803 3808 b'system',
3804 3809 [],
3805 3810 _(b'show help for specific platform(s)'),
3806 3811 _(b'PLATFORM'),
3807 3812 ),
3808 3813 ],
3809 3814 _(b'[-eck] [-s PLATFORM] [TOPIC]'),
3810 3815 helpcategory=command.CATEGORY_HELP,
3811 3816 norepo=True,
3812 3817 intents={INTENT_READONLY},
3813 3818 )
3814 3819 def help_(ui, name=None, **opts):
3815 3820 """show help for a given topic or a help overview
3816 3821
3817 3822 With no arguments, print a list of commands with short help messages.
3818 3823
3819 3824 Given a topic, extension, or command name, print help for that
3820 3825 topic.
3821 3826
3822 3827 Returns 0 if successful.
3823 3828 """
3824 3829
3825 3830 keep = opts.get('system') or []
3826 3831 if len(keep) == 0:
3827 3832 if pycompat.sysplatform.startswith(b'win'):
3828 3833 keep.append(b'windows')
3829 3834 elif pycompat.sysplatform == b'OpenVMS':
3830 3835 keep.append(b'vms')
3831 3836 elif pycompat.sysplatform == b'plan9':
3832 3837 keep.append(b'plan9')
3833 3838 else:
3834 3839 keep.append(b'unix')
3835 3840 keep.append(pycompat.sysplatform.lower())
3836 3841 if ui.verbose:
3837 3842 keep.append(b'verbose')
3838 3843
3839 3844 commands = sys.modules[__name__]
3840 3845 formatted = help.formattedhelp(ui, commands, name, keep=keep, **opts)
3841 3846 ui.pager(b'help')
3842 3847 ui.write(formatted)
3843 3848
3844 3849
3845 3850 @command(
3846 3851 b'identify|id',
3847 3852 [
3848 3853 (b'r', b'rev', b'', _(b'identify the specified revision'), _(b'REV')),
3849 3854 (b'n', b'num', None, _(b'show local revision number')),
3850 3855 (b'i', b'id', None, _(b'show global revision id')),
3851 3856 (b'b', b'branch', None, _(b'show branch')),
3852 3857 (b't', b'tags', None, _(b'show tags')),
3853 3858 (b'B', b'bookmarks', None, _(b'show bookmarks')),
3854 3859 ]
3855 3860 + remoteopts
3856 3861 + formatteropts,
3857 3862 _(b'[-nibtB] [-r REV] [SOURCE]'),
3858 3863 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
3859 3864 optionalrepo=True,
3860 3865 intents={INTENT_READONLY},
3861 3866 )
3862 3867 def identify(
3863 3868 ui,
3864 3869 repo,
3865 3870 source=None,
3866 3871 rev=None,
3867 3872 num=None,
3868 3873 id=None,
3869 3874 branch=None,
3870 3875 tags=None,
3871 3876 bookmarks=None,
3872 3877 **opts
3873 3878 ):
3874 3879 """identify the working directory or specified revision
3875 3880
3876 3881 Print a summary identifying the repository state at REV using one or
3877 3882 two parent hash identifiers, followed by a "+" if the working
3878 3883 directory has uncommitted changes, the branch name (if not default),
3879 3884 a list of tags, and a list of bookmarks.
3880 3885
3881 3886 When REV is not given, print a summary of the current state of the
3882 3887 repository including the working directory. Specify -r. to get information
3883 3888 of the working directory parent without scanning uncommitted changes.
3884 3889
3885 3890 Specifying a path to a repository root or Mercurial bundle will
3886 3891 cause lookup to operate on that repository/bundle.
3887 3892
3888 3893 .. container:: verbose
3889 3894
3890 3895 Template:
3891 3896
3892 3897 The following keywords are supported in addition to the common template
3893 3898 keywords and functions. See also :hg:`help templates`.
3894 3899
3895 3900 :dirty: String. Character ``+`` denoting if the working directory has
3896 3901 uncommitted changes.
3897 3902 :id: String. One or two nodes, optionally followed by ``+``.
3898 3903 :parents: List of strings. Parent nodes of the changeset.
3899 3904
3900 3905 Examples:
3901 3906
3902 3907 - generate a build identifier for the working directory::
3903 3908
3904 3909 hg id --id > build-id.dat
3905 3910
3906 3911 - find the revision corresponding to a tag::
3907 3912
3908 3913 hg id -n -r 1.3
3909 3914
3910 3915 - check the most recent revision of a remote repository::
3911 3916
3912 3917 hg id -r tip https://www.mercurial-scm.org/repo/hg/
3913 3918
3914 3919 See :hg:`log` for generating more information about specific revisions,
3915 3920 including full hash identifiers.
3916 3921
3917 3922 Returns 0 if successful.
3918 3923 """
3919 3924
3920 3925 opts = pycompat.byteskwargs(opts)
3921 3926 if not repo and not source:
3922 3927 raise error.InputError(
3923 3928 _(b"there is no Mercurial repository here (.hg not found)")
3924 3929 )
3925 3930
3926 3931 default = not (num or id or branch or tags or bookmarks)
3927 3932 output = []
3928 3933 revs = []
3929 3934
3930 3935 peer = None
3931 3936 try:
3932 3937 if source:
3933 3938 path = urlutil.get_unique_pull_path_obj(b'identify', ui, source)
3934 3939 # only pass ui when no repo
3935 3940 peer = hg.peer(repo or ui, opts, path)
3936 3941 repo = peer.local()
3937 3942 branches = (path.branch, [])
3938 3943 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3939 3944
3940 3945 fm = ui.formatter(b'identify', opts)
3941 3946 fm.startitem()
3942 3947
3943 3948 if not repo:
3944 3949 if num or branch or tags:
3945 3950 raise error.InputError(
3946 3951 _(b"can't query remote revision number, branch, or tags")
3947 3952 )
3948 3953 if not rev and revs:
3949 3954 rev = revs[0]
3950 3955 if not rev:
3951 3956 rev = b"tip"
3952 3957
3953 3958 remoterev = peer.lookup(rev)
3954 3959 hexrev = fm.hexfunc(remoterev)
3955 3960 if default or id:
3956 3961 output = [hexrev]
3957 3962 fm.data(id=hexrev)
3958 3963
3959 3964 @util.cachefunc
3960 3965 def getbms():
3961 3966 bms = []
3962 3967
3963 3968 if b'bookmarks' in peer.listkeys(b'namespaces'):
3964 3969 hexremoterev = hex(remoterev)
3965 3970 bms = [
3966 3971 bm
3967 3972 for bm, bmr in peer.listkeys(b'bookmarks').items()
3968 3973 if bmr == hexremoterev
3969 3974 ]
3970 3975
3971 3976 return sorted(bms)
3972 3977
3973 3978 if fm.isplain():
3974 3979 if bookmarks:
3975 3980 output.extend(getbms())
3976 3981 elif default and not ui.quiet:
3977 3982 # multiple bookmarks for a single parent separated by '/'
3978 3983 bm = b'/'.join(getbms())
3979 3984 if bm:
3980 3985 output.append(bm)
3981 3986 else:
3982 3987 fm.data(node=hex(remoterev))
3983 3988 if bookmarks or b'bookmarks' in fm.datahint():
3984 3989 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3985 3990 else:
3986 3991 if rev:
3987 3992 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3988 3993 ctx = logcmdutil.revsingle(repo, rev, None)
3989 3994
3990 3995 if ctx.rev() is None:
3991 3996 ctx = repo[None]
3992 3997 parents = ctx.parents()
3993 3998 taglist = []
3994 3999 for p in parents:
3995 4000 taglist.extend(p.tags())
3996 4001
3997 4002 dirty = b""
3998 4003 if ctx.dirty(missing=True, merge=False, branch=False):
3999 4004 dirty = b'+'
4000 4005 fm.data(dirty=dirty)
4001 4006
4002 4007 hexoutput = [fm.hexfunc(p.node()) for p in parents]
4003 4008 if default or id:
4004 4009 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
4005 4010 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
4006 4011
4007 4012 if num:
4008 4013 numoutput = [b"%d" % p.rev() for p in parents]
4009 4014 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
4010 4015
4011 4016 fm.data(
4012 4017 parents=fm.formatlist(
4013 4018 [fm.hexfunc(p.node()) for p in parents], name=b'node'
4014 4019 )
4015 4020 )
4016 4021 else:
4017 4022 hexoutput = fm.hexfunc(ctx.node())
4018 4023 if default or id:
4019 4024 output = [hexoutput]
4020 4025 fm.data(id=hexoutput)
4021 4026
4022 4027 if num:
4023 4028 output.append(pycompat.bytestr(ctx.rev()))
4024 4029 taglist = ctx.tags()
4025 4030
4026 4031 if default and not ui.quiet:
4027 4032 b = ctx.branch()
4028 4033 if b != b'default':
4029 4034 output.append(b"(%s)" % b)
4030 4035
4031 4036 # multiple tags for a single parent separated by '/'
4032 4037 t = b'/'.join(taglist)
4033 4038 if t:
4034 4039 output.append(t)
4035 4040
4036 4041 # multiple bookmarks for a single parent separated by '/'
4037 4042 bm = b'/'.join(ctx.bookmarks())
4038 4043 if bm:
4039 4044 output.append(bm)
4040 4045 else:
4041 4046 if branch:
4042 4047 output.append(ctx.branch())
4043 4048
4044 4049 if tags:
4045 4050 output.extend(taglist)
4046 4051
4047 4052 if bookmarks:
4048 4053 output.extend(ctx.bookmarks())
4049 4054
4050 4055 fm.data(node=ctx.hex())
4051 4056 fm.data(branch=ctx.branch())
4052 4057 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
4053 4058 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
4054 4059 fm.context(ctx=ctx)
4055 4060
4056 4061 fm.plain(b"%s\n" % b' '.join(output))
4057 4062 fm.end()
4058 4063 finally:
4059 4064 if peer:
4060 4065 peer.close()
4061 4066
4062 4067
4063 4068 @command(
4064 4069 b'import|patch',
4065 4070 [
4066 4071 (
4067 4072 b'p',
4068 4073 b'strip',
4069 4074 1,
4070 4075 _(
4071 4076 b'directory strip option for patch. This has the same '
4072 4077 b'meaning as the corresponding patch option'
4073 4078 ),
4074 4079 _(b'NUM'),
4075 4080 ),
4076 4081 (b'b', b'base', b'', _(b'base path (DEPRECATED)'), _(b'PATH')),
4077 4082 (b'', b'secret', None, _(b'use the secret phase for committing')),
4078 4083 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
4079 4084 (
4080 4085 b'f',
4081 4086 b'force',
4082 4087 None,
4083 4088 _(b'skip check for outstanding uncommitted changes (DEPRECATED)'),
4084 4089 ),
4085 4090 (
4086 4091 b'',
4087 4092 b'no-commit',
4088 4093 None,
4089 4094 _(b"don't commit, just update the working directory"),
4090 4095 ),
4091 4096 (
4092 4097 b'',
4093 4098 b'bypass',
4094 4099 None,
4095 4100 _(b"apply patch without touching the working directory"),
4096 4101 ),
4097 4102 (b'', b'partial', None, _(b'commit even if some hunks fail')),
4098 4103 (b'', b'exact', None, _(b'abort if patch would apply lossily')),
4099 4104 (b'', b'prefix', b'', _(b'apply patch to subdirectory'), _(b'DIR')),
4100 4105 (
4101 4106 b'',
4102 4107 b'import-branch',
4103 4108 None,
4104 4109 _(b'use any branch information in patch (implied by --exact)'),
4105 4110 ),
4106 4111 ]
4107 4112 + commitopts
4108 4113 + commitopts2
4109 4114 + similarityopts,
4110 4115 _(b'[OPTION]... PATCH...'),
4111 4116 helpcategory=command.CATEGORY_IMPORT_EXPORT,
4112 4117 )
4113 4118 def import_(ui, repo, patch1=None, *patches, **opts):
4114 4119 """import an ordered set of patches
4115 4120
4116 4121 Import a list of patches and commit them individually (unless
4117 4122 --no-commit is specified).
4118 4123
4119 4124 To read a patch from standard input (stdin), use "-" as the patch
4120 4125 name. If a URL is specified, the patch will be downloaded from
4121 4126 there.
4122 4127
4123 4128 Import first applies changes to the working directory (unless
4124 4129 --bypass is specified), import will abort if there are outstanding
4125 4130 changes.
4126 4131
4127 4132 Use --bypass to apply and commit patches directly to the
4128 4133 repository, without affecting the working directory. Without
4129 4134 --exact, patches will be applied on top of the working directory
4130 4135 parent revision.
4131 4136
4132 4137 You can import a patch straight from a mail message. Even patches
4133 4138 as attachments work (to use the body part, it must have type
4134 4139 text/plain or text/x-patch). From and Subject headers of email
4135 4140 message are used as default committer and commit message. All
4136 4141 text/plain body parts before first diff are added to the commit
4137 4142 message.
4138 4143
4139 4144 If the imported patch was generated by :hg:`export`, user and
4140 4145 description from patch override values from message headers and
4141 4146 body. Values given on command line with -m/--message and -u/--user
4142 4147 override these.
4143 4148
4144 4149 If --exact is specified, import will set the working directory to
4145 4150 the parent of each patch before applying it, and will abort if the
4146 4151 resulting changeset has a different ID than the one recorded in
4147 4152 the patch. This will guard against various ways that portable
4148 4153 patch formats and mail systems might fail to transfer Mercurial
4149 4154 data or metadata. See :hg:`bundle` for lossless transmission.
4150 4155
4151 4156 Use --partial to ensure a changeset will be created from the patch
4152 4157 even if some hunks fail to apply. Hunks that fail to apply will be
4153 4158 written to a <target-file>.rej file. Conflicts can then be resolved
4154 4159 by hand before :hg:`commit --amend` is run to update the created
4155 4160 changeset. This flag exists to let people import patches that
4156 4161 partially apply without losing the associated metadata (author,
4157 4162 date, description, ...).
4158 4163
4159 4164 .. note::
4160 4165
4161 4166 When no hunks apply cleanly, :hg:`import --partial` will create
4162 4167 an empty changeset, importing only the patch metadata.
4163 4168
4164 4169 With -s/--similarity, hg will attempt to discover renames and
4165 4170 copies in the patch in the same way as :hg:`addremove`.
4166 4171
4167 4172 It is possible to use external patch programs to perform the patch
4168 4173 by setting the ``ui.patch`` configuration option. For the default
4169 4174 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4170 4175 See :hg:`help config` for more information about configuration
4171 4176 files and how to use these options.
4172 4177
4173 4178 See :hg:`help dates` for a list of formats valid for -d/--date.
4174 4179
4175 4180 .. container:: verbose
4176 4181
4177 4182 Examples:
4178 4183
4179 4184 - import a traditional patch from a website and detect renames::
4180 4185
4181 4186 hg import -s 80 http://example.com/bugfix.patch
4182 4187
4183 4188 - import a changeset from an hgweb server::
4184 4189
4185 4190 hg import https://www.mercurial-scm.org/repo/hg/rev/5ca8c111e9aa
4186 4191
4187 4192 - import all the patches in an Unix-style mbox::
4188 4193
4189 4194 hg import incoming-patches.mbox
4190 4195
4191 4196 - import patches from stdin::
4192 4197
4193 4198 hg import -
4194 4199
4195 4200 - attempt to exactly restore an exported changeset (not always
4196 4201 possible)::
4197 4202
4198 4203 hg import --exact proposed-fix.patch
4199 4204
4200 4205 - use an external tool to apply a patch which is too fuzzy for
4201 4206 the default internal tool.
4202 4207
4203 4208 hg import --config ui.patch="patch --merge" fuzzy.patch
4204 4209
4205 4210 - change the default fuzzing from 2 to a less strict 7
4206 4211
4207 4212 hg import --config ui.fuzz=7 fuzz.patch
4208 4213
4209 4214 Returns 0 on success, 1 on partial success (see --partial).
4210 4215 """
4211 4216
4212 4217 cmdutil.check_incompatible_arguments(
4213 4218 opts, 'no_commit', ['bypass', 'secret']
4214 4219 )
4215 4220 cmdutil.check_incompatible_arguments(opts, 'exact', ['edit', 'prefix'])
4216 4221
4217 4222 if not patch1:
4218 4223 raise error.InputError(_(b'need at least one patch to import'))
4219 4224
4220 4225 patches = (patch1,) + patches
4221 4226
4222 4227 date = opts.get('date')
4223 4228 if date:
4224 4229 opts['date'] = dateutil.parsedate(date)
4225 4230
4226 4231 exact = opts.get('exact')
4227 4232 update = not opts.get('bypass')
4228 4233 try:
4229 4234 sim = float(opts.get('similarity') or 0)
4230 4235 except ValueError:
4231 4236 raise error.InputError(_(b'similarity must be a number'))
4232 4237 if sim < 0 or sim > 100:
4233 4238 raise error.InputError(_(b'similarity must be between 0 and 100'))
4234 4239 if sim and not update:
4235 4240 raise error.InputError(_(b'cannot use --similarity with --bypass'))
4236 4241
4237 4242 base = opts["base"]
4238 4243 msgs = []
4239 4244 ret = 0
4240 4245
4241 4246 with repo.wlock():
4242 4247 if update:
4243 4248 cmdutil.checkunfinished(repo)
4244 4249 if exact or not opts.get('force'):
4245 4250 cmdutil.bailifchanged(repo)
4246 4251
4247 4252 if not opts.get('no_commit'):
4248 4253 lock = repo.lock
4249 4254 tr = lambda: repo.transaction(b'import')
4250 4255 else:
4251 4256 lock = util.nullcontextmanager
4252 4257 tr = util.nullcontextmanager
4253 4258 with lock(), tr():
4254 4259 parents = repo[None].parents()
4255 4260 for patchurl in patches:
4256 4261 if patchurl == b'-':
4257 4262 ui.status(_(b'applying patch from stdin\n'))
4258 4263 patchfile = ui.fin
4259 4264 patchurl = b'stdin' # for error message
4260 4265 else:
4261 4266 patchurl = os.path.join(base, patchurl)
4262 4267 ui.status(_(b'applying %s\n') % patchurl)
4263 4268 patchfile = hg.openpath(ui, patchurl, sendaccept=False)
4264 4269
4265 4270 haspatch = False
4266 4271 for hunk in patch.split(patchfile):
4267 4272 with patch.extract(ui, hunk) as patchdata:
4268 4273 msg, node, rej = cmdutil.tryimportone(
4269 4274 ui,
4270 4275 repo,
4271 4276 patchdata,
4272 4277 parents,
4273 4278 pycompat.byteskwargs(opts),
4274 4279 msgs,
4275 4280 hg.clean,
4276 4281 )
4277 4282 if msg:
4278 4283 haspatch = True
4279 4284 ui.note(msg + b'\n')
4280 4285 if update or exact:
4281 4286 parents = repo[None].parents()
4282 4287 else:
4283 4288 parents = [repo[node]]
4284 4289 if rej:
4285 4290 ui.write_err(_(b"patch applied partially\n"))
4286 4291 ui.write_err(
4287 4292 _(
4288 4293 b"(fix the .rej files and run "
4289 4294 b"`hg commit --amend`)\n"
4290 4295 )
4291 4296 )
4292 4297 ret = 1
4293 4298 break
4294 4299
4295 4300 if not haspatch:
4296 4301 raise error.InputError(_(b'%s: no diffs found') % patchurl)
4297 4302
4298 4303 if msgs:
4299 4304 repo.savecommitmessage(b'\n* * *\n'.join(msgs))
4300 4305 return ret
4301 4306
4302 4307
4303 4308 @command(
4304 4309 b'incoming|in',
4305 4310 [
4306 4311 (
4307 4312 b'f',
4308 4313 b'force',
4309 4314 None,
4310 4315 _(b'run even if remote repository is unrelated'),
4311 4316 ),
4312 4317 (b'n', b'newest-first', None, _(b'show newest record first')),
4313 4318 (b'', b'bundle', b'', _(b'file to store the bundles into'), _(b'FILE')),
4314 4319 (
4315 4320 b'r',
4316 4321 b'rev',
4317 4322 [],
4318 4323 _(b'a remote changeset intended to be added'),
4319 4324 _(b'REV'),
4320 4325 ),
4321 4326 (b'B', b'bookmarks', False, _(b"compare bookmarks")),
4322 4327 (
4323 4328 b'b',
4324 4329 b'branch',
4325 4330 [],
4326 4331 _(b'a specific branch you would like to pull'),
4327 4332 _(b'BRANCH'),
4328 4333 ),
4329 4334 ]
4330 4335 + logopts
4331 4336 + remoteopts
4332 4337 + subrepoopts,
4333 4338 _(b'[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'),
4334 4339 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
4335 4340 )
4336 4341 def incoming(ui, repo, source=b"default", **opts):
4337 4342 """show new changesets found in source
4338 4343
4339 4344 Show new changesets found in the specified path/URL or the default
4340 4345 pull location. These are the changesets that would have been pulled
4341 4346 by :hg:`pull` at the time you issued this command.
4342 4347
4343 4348 See pull for valid source format details.
4344 4349
4345 4350 .. container:: verbose
4346 4351
4347 4352 With -B/--bookmarks, the result of bookmark comparison between
4348 4353 local and remote repositories is displayed. With -v/--verbose,
4349 4354 status is also displayed for each bookmark like below::
4350 4355
4351 4356 BM1 01234567890a added
4352 4357 BM2 1234567890ab advanced
4353 4358 BM3 234567890abc diverged
4354 4359 BM4 34567890abcd changed
4355 4360
4356 4361 The action taken locally when pulling depends on the
4357 4362 status of each bookmark:
4358 4363
4359 4364 :``added``: pull will create it
4360 4365 :``advanced``: pull will update it
4361 4366 :``diverged``: pull will create a divergent bookmark
4362 4367 :``changed``: result depends on remote changesets
4363 4368
4364 4369 From the point of view of pulling behavior, bookmark
4365 4370 existing only in the remote repository are treated as ``added``,
4366 4371 even if it is in fact locally deleted.
4367 4372
4368 4373 .. container:: verbose
4369 4374
4370 4375 For remote repository, using --bundle avoids downloading the
4371 4376 changesets twice if the incoming is followed by a pull.
4372 4377
4373 4378 Examples:
4374 4379
4375 4380 - show incoming changes with patches and full description::
4376 4381
4377 4382 hg incoming -vp
4378 4383
4379 4384 - show incoming changes excluding merges, store a bundle::
4380 4385
4381 4386 hg in -vpM --bundle incoming.hg
4382 4387 hg pull incoming.hg
4383 4388
4384 4389 - briefly list changes inside a bundle::
4385 4390
4386 4391 hg in changes.hg -T "{desc|firstline}\\n"
4387 4392
4388 4393 Returns 0 if there are incoming changes, 1 otherwise.
4389 4394 """
4390 4395 opts = pycompat.byteskwargs(opts)
4391 4396 if opts.get(b'graph'):
4392 4397 logcmdutil.checkunsupportedgraphflags([], opts)
4393 4398
4394 4399 def display(other, chlist, displayer):
4395 4400 revdag = logcmdutil.graphrevs(other, chlist, opts)
4396 4401 logcmdutil.displaygraph(
4397 4402 ui, repo, revdag, displayer, graphmod.asciiedges
4398 4403 )
4399 4404
4400 4405 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4401 4406 return 0
4402 4407
4403 4408 cmdutil.check_incompatible_arguments(opts, b'subrepos', [b'bundle'])
4404 4409
4405 4410 if opts.get(b'bookmarks'):
4406 4411 srcs = urlutil.get_pull_paths(repo, ui, [source])
4407 4412 for path in srcs:
4408 4413 # XXX the "branches" options are not used. Should it be used?
4409 4414 other = hg.peer(repo, opts, path)
4410 4415 try:
4411 4416 if b'bookmarks' not in other.listkeys(b'namespaces'):
4412 4417 ui.warn(_(b"remote doesn't support bookmarks\n"))
4413 4418 return 0
4414 4419 ui.pager(b'incoming')
4415 4420 ui.status(
4416 4421 _(b'comparing with %s\n') % urlutil.hidepassword(path.loc)
4417 4422 )
4418 4423 return bookmarks.incoming(
4419 4424 ui, repo, other, mode=path.bookmarks_mode
4420 4425 )
4421 4426 finally:
4422 4427 other.close()
4423 4428
4424 4429 return hg.incoming(ui, repo, source, opts)
4425 4430
4426 4431
4427 4432 @command(
4428 4433 b'init',
4429 4434 remoteopts,
4430 4435 _(b'[-e CMD] [--remotecmd CMD] [DEST]'),
4431 4436 helpcategory=command.CATEGORY_REPO_CREATION,
4432 4437 helpbasic=True,
4433 4438 norepo=True,
4434 4439 )
4435 4440 def init(ui, dest=b".", **opts):
4436 4441 """create a new repository in the given directory
4437 4442
4438 4443 Initialize a new repository in the given directory. If the given
4439 4444 directory does not exist, it will be created.
4440 4445
4441 4446 If no directory is given, the current directory is used.
4442 4447
4443 4448 It is possible to specify an ``ssh://`` URL as the destination.
4444 4449 See :hg:`help urls` for more information.
4445 4450
4446 4451 Returns 0 on success.
4447 4452 """
4448 4453 opts = pycompat.byteskwargs(opts)
4449 4454 path = urlutil.get_clone_path_obj(ui, dest)
4450 4455 peer = hg.peer(ui, opts, path, create=True)
4451 4456 peer.close()
4452 4457
4453 4458
4454 4459 @command(
4455 4460 b'locate',
4456 4461 [
4457 4462 (
4458 4463 b'r',
4459 4464 b'rev',
4460 4465 b'',
4461 4466 _(b'search the repository as it is in REV'),
4462 4467 _(b'REV'),
4463 4468 ),
4464 4469 (
4465 4470 b'0',
4466 4471 b'print0',
4467 4472 None,
4468 4473 _(b'end filenames with NUL, for use with xargs'),
4469 4474 ),
4470 4475 (
4471 4476 b'f',
4472 4477 b'fullpath',
4473 4478 None,
4474 4479 _(b'print complete paths from the filesystem root'),
4475 4480 ),
4476 4481 ]
4477 4482 + walkopts,
4478 4483 _(b'[OPTION]... [PATTERN]...'),
4479 4484 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
4480 4485 )
4481 4486 def locate(ui, repo, *pats, **opts):
4482 4487 """locate files matching specific patterns (DEPRECATED)
4483 4488
4484 4489 Print files under Mercurial control in the working directory whose
4485 4490 names match the given patterns.
4486 4491
4487 4492 By default, this command searches all directories in the working
4488 4493 directory. To search just the current directory and its
4489 4494 subdirectories, use "--include .".
4490 4495
4491 4496 If no patterns are given to match, this command prints the names
4492 4497 of all files under Mercurial control in the working directory.
4493 4498
4494 4499 If you want to feed the output of this command into the "xargs"
4495 4500 command, use the -0 option to both this command and "xargs". This
4496 4501 will avoid the problem of "xargs" treating single filenames that
4497 4502 contain whitespace as multiple filenames.
4498 4503
4499 4504 See :hg:`help files` for a more versatile command.
4500 4505
4501 4506 Returns 0 if a match is found, 1 otherwise.
4502 4507 """
4503 4508 if opts.get('print0'):
4504 4509 end = b'\0'
4505 4510 else:
4506 4511 end = b'\n'
4507 4512 ctx = logcmdutil.revsingle(repo, opts.get('rev'), None)
4508 4513
4509 4514 ret = 1
4510 4515 m = scmutil.match(
4511 4516 ctx,
4512 4517 pats,
4513 4518 pycompat.byteskwargs(opts),
4514 4519 default=b'relglob',
4515 4520 badfn=lambda x, y: False,
4516 4521 )
4517 4522
4518 4523 ui.pager(b'locate')
4519 4524 if ctx.rev() is None:
4520 4525 # When run on the working copy, "locate" includes removed files, so
4521 4526 # we get the list of files from the dirstate.
4522 4527 filesgen = sorted(repo.dirstate.matches(m))
4523 4528 else:
4524 4529 filesgen = ctx.matches(m)
4525 4530 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=bool(pats))
4526 4531 for abs in filesgen:
4527 4532 if opts.get('fullpath'):
4528 4533 ui.write(repo.wjoin(abs), end)
4529 4534 else:
4530 4535 ui.write(uipathfn(abs), end)
4531 4536 ret = 0
4532 4537
4533 4538 return ret
4534 4539
4535 4540
4536 4541 @command(
4537 4542 b'log|history',
4538 4543 [
4539 4544 (
4540 4545 b'f',
4541 4546 b'follow',
4542 4547 None,
4543 4548 _(
4544 4549 b'follow changeset history, or file history across copies and renames'
4545 4550 ),
4546 4551 ),
4547 4552 (
4548 4553 b'',
4549 4554 b'follow-first',
4550 4555 None,
4551 4556 _(b'only follow the first parent of merge changesets (DEPRECATED)'),
4552 4557 ),
4553 4558 (
4554 4559 b'd',
4555 4560 b'date',
4556 4561 b'',
4557 4562 _(b'show revisions matching date spec'),
4558 4563 _(b'DATE'),
4559 4564 ),
4560 4565 (b'C', b'copies', None, _(b'show copied files')),
4561 4566 (
4562 4567 b'k',
4563 4568 b'keyword',
4564 4569 [],
4565 4570 _(b'do case-insensitive search for a given text'),
4566 4571 _(b'TEXT'),
4567 4572 ),
4568 4573 (
4569 4574 b'r',
4570 4575 b'rev',
4571 4576 [],
4572 4577 _(b'revisions to select or follow from'),
4573 4578 _(b'REV'),
4574 4579 ),
4575 4580 (
4576 4581 b'L',
4577 4582 b'line-range',
4578 4583 [],
4579 4584 _(b'follow line range of specified file (EXPERIMENTAL)'),
4580 4585 _(b'FILE,RANGE'),
4581 4586 ),
4582 4587 (
4583 4588 b'',
4584 4589 b'removed',
4585 4590 None,
4586 4591 _(b'include revisions where files were removed'),
4587 4592 ),
4588 4593 (
4589 4594 b'm',
4590 4595 b'only-merges',
4591 4596 None,
4592 4597 _(b'show only merges (DEPRECATED) (use -r "merge()" instead)'),
4593 4598 ),
4594 4599 (b'u', b'user', [], _(b'revisions committed by user'), _(b'USER')),
4595 4600 (
4596 4601 b'',
4597 4602 b'only-branch',
4598 4603 [],
4599 4604 _(
4600 4605 b'show only changesets within the given named branch (DEPRECATED)'
4601 4606 ),
4602 4607 _(b'BRANCH'),
4603 4608 ),
4604 4609 (
4605 4610 b'b',
4606 4611 b'branch',
4607 4612 [],
4608 4613 _(b'show changesets within the given named branch'),
4609 4614 _(b'BRANCH'),
4610 4615 ),
4611 4616 (
4612 4617 b'B',
4613 4618 b'bookmark',
4614 4619 [],
4615 4620 _(b"show changesets within the given bookmark"),
4616 4621 _(b'BOOKMARK'),
4617 4622 ),
4618 4623 (
4619 4624 b'P',
4620 4625 b'prune',
4621 4626 [],
4622 4627 _(b'do not display revision or any of its ancestors'),
4623 4628 _(b'REV'),
4624 4629 ),
4625 4630 ]
4626 4631 + logopts
4627 4632 + walkopts,
4628 4633 _(b'[OPTION]... [FILE]'),
4629 4634 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
4630 4635 helpbasic=True,
4631 4636 inferrepo=True,
4632 4637 intents={INTENT_READONLY},
4633 4638 )
4634 4639 def log(ui, repo, *pats, **opts):
4635 4640 """show revision history of entire repository or files
4636 4641
4637 4642 Print the revision history of the specified files or the entire
4638 4643 project.
4639 4644
4640 4645 If no revision range is specified, the default is ``tip:0`` unless
4641 4646 --follow is set.
4642 4647
4643 4648 File history is shown without following rename or copy history of
4644 4649 files. Use -f/--follow with a filename to follow history across
4645 4650 renames and copies. --follow without a filename will only show
4646 4651 ancestors of the starting revisions. The starting revisions can be
4647 4652 specified by -r/--rev, which default to the working directory parent.
4648 4653
4649 4654 By default this command prints revision number and changeset id,
4650 4655 tags, non-trivial parents, user, date and time, and a summary for
4651 4656 each commit. When the -v/--verbose switch is used, the list of
4652 4657 changed files and full commit message are shown.
4653 4658
4654 4659 With --graph the revisions are shown as an ASCII art DAG with the most
4655 4660 recent changeset at the top.
4656 4661 'o' is a changeset, '@' is a working directory parent, '%' is a changeset
4657 4662 involved in an unresolved merge conflict, '_' closes a branch,
4658 4663 'x' is obsolete, '*' is unstable, and '+' represents a fork where the
4659 4664 changeset from the lines below is a parent of the 'o' merge on the same
4660 4665 line.
4661 4666 Paths in the DAG are represented with '|', '/' and so forth. ':' in place
4662 4667 of a '|' indicates one or more revisions in a path are omitted.
4663 4668
4664 4669 .. container:: verbose
4665 4670
4666 4671 Use -L/--line-range FILE,M:N options to follow the history of lines
4667 4672 from M to N in FILE. With -p/--patch only diff hunks affecting
4668 4673 specified line range will be shown. This option requires --follow;
4669 4674 it can be specified multiple times. Currently, this option is not
4670 4675 compatible with --graph. This option is experimental.
4671 4676
4672 4677 .. note::
4673 4678
4674 4679 :hg:`log --patch` may generate unexpected diff output for merge
4675 4680 changesets, as it will only compare the merge changeset against
4676 4681 its first parent. Also, only files different from BOTH parents
4677 4682 will appear in files:.
4678 4683
4679 4684 .. note::
4680 4685
4681 4686 For performance reasons, :hg:`log FILE` may omit duplicate changes
4682 4687 made on branches and will not show removals or mode changes. To
4683 4688 see all such changes, use the --removed switch.
4684 4689
4685 4690 .. container:: verbose
4686 4691
4687 4692 .. note::
4688 4693
4689 4694 The history resulting from -L/--line-range options depends on diff
4690 4695 options; for instance if white-spaces are ignored, respective changes
4691 4696 with only white-spaces in specified line range will not be listed.
4692 4697
4693 4698 .. container:: verbose
4694 4699
4695 4700 Some examples:
4696 4701
4697 4702 - changesets with full descriptions and file lists::
4698 4703
4699 4704 hg log -v
4700 4705
4701 4706 - changesets ancestral to the working directory::
4702 4707
4703 4708 hg log -f
4704 4709
4705 4710 - last 10 commits on the current branch::
4706 4711
4707 4712 hg log -l 10 -b .
4708 4713
4709 4714 - changesets showing all modifications of a file, including removals::
4710 4715
4711 4716 hg log --removed file.c
4712 4717
4713 4718 - all changesets that touch a directory, with diffs, excluding merges::
4714 4719
4715 4720 hg log -Mp lib/
4716 4721
4717 4722 - all revision numbers that match a keyword::
4718 4723
4719 4724 hg log -k bug --template "{rev}\\n"
4720 4725
4721 4726 - the full hash identifier of the working directory parent::
4722 4727
4723 4728 hg log -r . --template "{node}\\n"
4724 4729
4725 4730 - list available log templates::
4726 4731
4727 4732 hg log -T list
4728 4733
4729 4734 - check if a given changeset is included in a tagged release::
4730 4735
4731 4736 hg log -r "a21ccf and ancestor(1.9)"
4732 4737
4733 4738 - find all changesets by some user in a date range::
4734 4739
4735 4740 hg log -k alice -d "may 2008 to jul 2008"
4736 4741
4737 4742 - summary of all changesets after the last tag::
4738 4743
4739 4744 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4740 4745
4741 4746 - changesets touching lines 13 to 23 for file.c::
4742 4747
4743 4748 hg log -L file.c,13:23
4744 4749
4745 4750 - changesets touching lines 13 to 23 for file.c and lines 2 to 6 of
4746 4751 main.c with patch::
4747 4752
4748 4753 hg log -L file.c,13:23 -L main.c,2:6 -p
4749 4754
4750 4755 See :hg:`help dates` for a list of formats valid for -d/--date.
4751 4756
4752 4757 See :hg:`help revisions` for more about specifying and ordering
4753 4758 revisions.
4754 4759
4755 4760 See :hg:`help templates` for more about pre-packaged styles and
4756 4761 specifying custom templates. The default template used by the log
4757 4762 command can be customized via the ``command-templates.log`` configuration
4758 4763 setting.
4759 4764
4760 4765 Returns 0 on success.
4761 4766
4762 4767 """
4763 4768 opts = pycompat.byteskwargs(opts)
4764 4769 linerange = opts.get(b'line_range')
4765 4770
4766 4771 if linerange and not opts.get(b'follow'):
4767 4772 raise error.InputError(_(b'--line-range requires --follow'))
4768 4773
4769 4774 if linerange and pats:
4770 4775 # TODO: take pats as patterns with no line-range filter
4771 4776 raise error.InputError(
4772 4777 _(b'FILE arguments are not compatible with --line-range option')
4773 4778 )
4774 4779
4775 4780 repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
4776 4781 walk_opts = logcmdutil.parseopts(ui, pats, opts)
4777 4782 revs, differ = logcmdutil.getrevs(repo, walk_opts)
4778 4783 if linerange:
4779 4784 # TODO: should follow file history from logcmdutil._initialrevs(),
4780 4785 # then filter the result by logcmdutil._makerevset() and --limit
4781 4786 revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
4782 4787
4783 4788 getcopies = None
4784 4789 if opts.get(b'copies'):
4785 4790 endrev = None
4786 4791 if revs:
4787 4792 endrev = revs.max() + 1
4788 4793 getcopies = scmutil.getcopiesfn(repo, endrev=endrev)
4789 4794
4790 4795 ui.pager(b'log')
4791 4796 displayer = logcmdutil.changesetdisplayer(
4792 4797 ui, repo, opts, differ, buffered=True
4793 4798 )
4794 4799 if opts.get(b'graph'):
4795 4800 displayfn = logcmdutil.displaygraphrevs
4796 4801 else:
4797 4802 displayfn = logcmdutil.displayrevs
4798 4803 displayfn(ui, repo, revs, displayer, getcopies)
4799 4804
4800 4805
4801 4806 @command(
4802 4807 b'manifest',
4803 4808 [
4804 4809 (b'r', b'rev', b'', _(b'revision to display'), _(b'REV')),
4805 4810 (b'', b'all', False, _(b"list files from all revisions")),
4806 4811 ]
4807 4812 + formatteropts,
4808 4813 _(b'[-r REV]'),
4809 4814 helpcategory=command.CATEGORY_MAINTENANCE,
4810 4815 intents={INTENT_READONLY},
4811 4816 )
4812 4817 def manifest(ui, repo, node=None, rev=None, **opts):
4813 4818 """output the current or given revision of the project manifest
4814 4819
4815 4820 Print a list of version controlled files for the given revision.
4816 4821 If no revision is given, the first parent of the working directory
4817 4822 is used, or the null revision if no revision is checked out.
4818 4823
4819 4824 With -v, print file permissions, symlink and executable bits.
4820 4825 With --debug, print file revision hashes.
4821 4826
4822 4827 If option --all is specified, the list of all files from all revisions
4823 4828 is printed. This includes deleted and renamed files.
4824 4829
4825 4830 Returns 0 on success.
4826 4831 """
4827 4832 fm = ui.formatter(b'manifest', pycompat.byteskwargs(opts))
4828 4833
4829 4834 if opts.get('all'):
4830 4835 if rev or node:
4831 4836 raise error.InputError(_(b"can't specify a revision with --all"))
4832 4837
4833 4838 res = set()
4834 4839 for rev in repo:
4835 4840 ctx = repo[rev]
4836 4841 res |= set(ctx.files())
4837 4842
4838 4843 ui.pager(b'manifest')
4839 4844 for f in sorted(res):
4840 4845 fm.startitem()
4841 4846 fm.write(b"path", b'%s\n', f)
4842 4847 fm.end()
4843 4848 return
4844 4849
4845 4850 if rev and node:
4846 4851 raise error.InputError(_(b"please specify just one revision"))
4847 4852
4848 4853 if not node:
4849 4854 node = rev
4850 4855
4851 4856 char = {b'l': b'@', b'x': b'*', b'': b'', b't': b'd'}
4852 4857 mode = {b'l': b'644', b'x': b'755', b'': b'644', b't': b'755'}
4853 4858 if node:
4854 4859 repo = scmutil.unhidehashlikerevs(repo, [node], b'nowarn')
4855 4860 ctx = logcmdutil.revsingle(repo, node)
4856 4861 mf = ctx.manifest()
4857 4862 ui.pager(b'manifest')
4858 4863 for f in ctx:
4859 4864 fm.startitem()
4860 4865 fm.context(ctx=ctx)
4861 4866 fl = ctx[f].flags()
4862 4867 fm.condwrite(ui.debugflag, b'hash', b'%s ', hex(mf[f]))
4863 4868 fm.condwrite(ui.verbose, b'mode type', b'%s %1s ', mode[fl], char[fl])
4864 4869 fm.write(b'path', b'%s\n', f)
4865 4870 fm.end()
4866 4871
4867 4872
4868 4873 @command(
4869 4874 b'merge',
4870 4875 [
4871 4876 (
4872 4877 b'f',
4873 4878 b'force',
4874 4879 None,
4875 4880 _(b'force a merge including outstanding changes (DEPRECATED)'),
4876 4881 ),
4877 4882 (b'r', b'rev', b'', _(b'revision to merge'), _(b'REV')),
4878 4883 (
4879 4884 b'P',
4880 4885 b'preview',
4881 4886 None,
4882 4887 _(b'review revisions to merge (no merge is performed)'),
4883 4888 ),
4884 4889 (b'', b'abort', None, _(b'abort the ongoing merge')),
4885 4890 ]
4886 4891 + mergetoolopts,
4887 4892 _(b'[-P] [[-r] REV]'),
4888 4893 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
4889 4894 helpbasic=True,
4890 4895 )
4891 4896 def merge(ui, repo, node=None, **opts):
4892 4897 """merge another revision into working directory
4893 4898
4894 4899 The current working directory is updated with all changes made in
4895 4900 the requested revision since the last common predecessor revision.
4896 4901
4897 4902 Files that changed between either parent are marked as changed for
4898 4903 the next commit and a commit must be performed before any further
4899 4904 updates to the repository are allowed. The next commit will have
4900 4905 two parents.
4901 4906
4902 4907 ``--tool`` can be used to specify the merge tool used for file
4903 4908 merges. It overrides the HGMERGE environment variable and your
4904 4909 configuration files. See :hg:`help merge-tools` for options.
4905 4910
4906 4911 If no revision is specified, the working directory's parent is a
4907 4912 head revision, and the current branch contains exactly one other
4908 4913 head, the other head is merged with by default. Otherwise, an
4909 4914 explicit revision with which to merge must be provided.
4910 4915
4911 4916 See :hg:`help resolve` for information on handling file conflicts.
4912 4917
4913 4918 To undo an uncommitted merge, use :hg:`merge --abort` which
4914 4919 will check out a clean copy of the original merge parent, losing
4915 4920 all changes.
4916 4921
4917 4922 Returns 0 on success, 1 if there are unresolved files.
4918 4923 """
4919 4924
4920 4925 abort = opts.get('abort')
4921 4926 if abort and repo.dirstate.p2() == repo.nullid:
4922 4927 cmdutil.wrongtooltocontinue(repo, _(b'merge'))
4923 4928 cmdutil.check_incompatible_arguments(opts, 'abort', ['rev', 'preview'])
4924 4929 if abort:
4925 4930 state = cmdutil.getunfinishedstate(repo)
4926 4931 if state and state._opname != b'merge':
4927 4932 raise error.StateError(
4928 4933 _(b'cannot abort merge with %s in progress') % (state._opname),
4929 4934 hint=state.hint(),
4930 4935 )
4931 4936 if node:
4932 4937 raise error.InputError(_(b"cannot specify a node with --abort"))
4933 4938 return hg.abortmerge(repo.ui, repo)
4934 4939
4935 4940 if opts.get('rev') and node:
4936 4941 raise error.InputError(_(b"please specify just one revision"))
4937 4942 if not node:
4938 4943 node = opts.get('rev')
4939 4944
4940 4945 if node:
4941 4946 ctx = logcmdutil.revsingle(repo, node)
4942 4947 else:
4943 4948 if ui.configbool(b'commands', b'merge.require-rev'):
4944 4949 raise error.InputError(
4945 4950 _(
4946 4951 b'configuration requires specifying revision to merge '
4947 4952 b'with'
4948 4953 )
4949 4954 )
4950 4955 ctx = repo[destutil.destmerge(repo)]
4951 4956
4952 4957 if ctx.node() is None:
4953 4958 raise error.InputError(
4954 4959 _(b'merging with the working copy has no effect')
4955 4960 )
4956 4961
4957 4962 if opts.get('preview'):
4958 4963 # find nodes that are ancestors of p2 but not of p1
4959 4964 p1 = repo[b'.'].node()
4960 4965 p2 = ctx.node()
4961 4966 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4962 4967
4963 4968 displayer = logcmdutil.changesetdisplayer(
4964 4969 ui, repo, pycompat.byteskwargs(opts)
4965 4970 )
4966 4971 for node in nodes:
4967 4972 displayer.show(repo[node])
4968 4973 displayer.close()
4969 4974 return 0
4970 4975
4971 4976 # ui.forcemerge is an internal variable, do not document
4972 4977 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
4973 4978 with ui.configoverride(overrides, b'merge'):
4974 4979 force = opts.get('force')
4975 4980 labels = [b'working copy', b'merge rev', b'common ancestor']
4976 4981 return hg.merge(ctx, force=force, labels=labels)
4977 4982
4978 4983
4979 4984 statemod.addunfinished(
4980 4985 b'merge',
4981 4986 fname=None,
4982 4987 clearable=True,
4983 4988 allowcommit=True,
4984 4989 cmdmsg=_(b'outstanding uncommitted merge'),
4985 4990 abortfunc=hg.abortmerge,
4986 4991 statushint=_(
4987 4992 b'To continue: hg commit\nTo abort: hg merge --abort'
4988 4993 ),
4989 4994 cmdhint=_(b"use 'hg commit' or 'hg merge --abort'"),
4990 4995 )
4991 4996
4992 4997
4993 4998 @command(
4994 4999 b'outgoing|out',
4995 5000 [
4996 5001 (
4997 5002 b'f',
4998 5003 b'force',
4999 5004 None,
5000 5005 _(b'run even when the destination is unrelated'),
5001 5006 ),
5002 5007 (
5003 5008 b'r',
5004 5009 b'rev',
5005 5010 [],
5006 5011 _(b'a changeset intended to be included in the destination'),
5007 5012 _(b'REV'),
5008 5013 ),
5009 5014 (b'n', b'newest-first', None, _(b'show newest record first')),
5010 5015 (b'B', b'bookmarks', False, _(b'compare bookmarks')),
5011 5016 (
5012 5017 b'b',
5013 5018 b'branch',
5014 5019 [],
5015 5020 _(b'a specific branch you would like to push'),
5016 5021 _(b'BRANCH'),
5017 5022 ),
5018 5023 ]
5019 5024 + logopts
5020 5025 + remoteopts
5021 5026 + subrepoopts,
5022 5027 _(b'[-M] [-p] [-n] [-f] [-r REV]... [DEST]...'),
5023 5028 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5024 5029 )
5025 5030 def outgoing(ui, repo, *dests, **opts):
5026 5031 """show changesets not found in the destination
5027 5032
5028 5033 Show changesets not found in the specified destination repository
5029 5034 or the default push location. These are the changesets that would
5030 5035 be pushed if a push was requested.
5031 5036
5032 5037 See pull for details of valid destination formats.
5033 5038
5034 5039 .. container:: verbose
5035 5040
5036 5041 With -B/--bookmarks, the result of bookmark comparison between
5037 5042 local and remote repositories is displayed. With -v/--verbose,
5038 5043 status is also displayed for each bookmark like below::
5039 5044
5040 5045 BM1 01234567890a added
5041 5046 BM2 deleted
5042 5047 BM3 234567890abc advanced
5043 5048 BM4 34567890abcd diverged
5044 5049 BM5 4567890abcde changed
5045 5050
5046 5051 The action taken when pushing depends on the
5047 5052 status of each bookmark:
5048 5053
5049 5054 :``added``: push with ``-B`` will create it
5050 5055 :``deleted``: push with ``-B`` will delete it
5051 5056 :``advanced``: push will update it
5052 5057 :``diverged``: push with ``-B`` will update it
5053 5058 :``changed``: push with ``-B`` will update it
5054 5059
5055 5060 From the point of view of pushing behavior, bookmarks
5056 5061 existing only in the remote repository are treated as
5057 5062 ``deleted``, even if it is in fact added remotely.
5058 5063
5059 5064 Returns 0 if there are outgoing changes, 1 otherwise.
5060 5065 """
5061 5066 opts = pycompat.byteskwargs(opts)
5062 5067 if opts.get(b'bookmarks'):
5063 5068 for path in urlutil.get_push_paths(repo, ui, dests):
5064 5069 other = hg.peer(repo, opts, path)
5065 5070 try:
5066 5071 if b'bookmarks' not in other.listkeys(b'namespaces'):
5067 5072 ui.warn(_(b"remote doesn't support bookmarks\n"))
5068 5073 return 0
5069 5074 ui.status(
5070 5075 _(b'comparing with %s\n') % urlutil.hidepassword(path.loc)
5071 5076 )
5072 5077 ui.pager(b'outgoing')
5073 5078 return bookmarks.outgoing(ui, repo, other)
5074 5079 finally:
5075 5080 other.close()
5076 5081
5077 5082 return hg.outgoing(ui, repo, dests, opts)
5078 5083
5079 5084
5080 5085 @command(
5081 5086 b'parents',
5082 5087 [
5083 5088 (
5084 5089 b'r',
5085 5090 b'rev',
5086 5091 b'',
5087 5092 _(b'show parents of the specified revision'),
5088 5093 _(b'REV'),
5089 5094 ),
5090 5095 ]
5091 5096 + templateopts,
5092 5097 _(b'[-r REV] [FILE]'),
5093 5098 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
5094 5099 inferrepo=True,
5095 5100 )
5096 5101 def parents(ui, repo, file_=None, **opts):
5097 5102 """show the parents of the working directory or revision (DEPRECATED)
5098 5103
5099 5104 Print the working directory's parent revisions. If a revision is
5100 5105 given via -r/--rev, the parent of that revision will be printed.
5101 5106 If a file argument is given, the revision in which the file was
5102 5107 last changed (before the working directory revision or the
5103 5108 argument to --rev if given) is printed.
5104 5109
5105 5110 This command is equivalent to::
5106 5111
5107 5112 hg log -r "p1()+p2()" or
5108 5113 hg log -r "p1(REV)+p2(REV)" or
5109 5114 hg log -r "max(::p1() and file(FILE))+max(::p2() and file(FILE))" or
5110 5115 hg log -r "max(::p1(REV) and file(FILE))+max(::p2(REV) and file(FILE))"
5111 5116
5112 5117 See :hg:`summary` and :hg:`help revsets` for related information.
5113 5118
5114 5119 Returns 0 on success.
5115 5120 """
5116 5121
5117 5122 opts = pycompat.byteskwargs(opts)
5118 5123 rev = opts.get(b'rev')
5119 5124 if rev:
5120 5125 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
5121 5126 ctx = logcmdutil.revsingle(repo, rev, None)
5122 5127
5123 5128 if file_:
5124 5129 m = scmutil.match(ctx, (file_,), opts)
5125 5130 if m.anypats() or len(m.files()) != 1:
5126 5131 raise error.InputError(_(b'can only specify an explicit filename'))
5127 5132 file_ = m.files()[0]
5128 5133 filenodes = []
5129 5134 for cp in ctx.parents():
5130 5135 if not cp:
5131 5136 continue
5132 5137 try:
5133 5138 filenodes.append(cp.filenode(file_))
5134 5139 except error.LookupError:
5135 5140 pass
5136 5141 if not filenodes:
5137 5142 raise error.InputError(_(b"'%s' not found in manifest") % file_)
5138 5143 p = []
5139 5144 for fn in filenodes:
5140 5145 fctx = repo.filectx(file_, fileid=fn)
5141 5146 p.append(fctx.node())
5142 5147 else:
5143 5148 p = [cp.node() for cp in ctx.parents()]
5144 5149
5145 5150 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
5146 5151 for n in p:
5147 5152 if n != repo.nullid:
5148 5153 displayer.show(repo[n])
5149 5154 displayer.close()
5150 5155
5151 5156
5152 5157 @command(
5153 5158 b'paths',
5154 5159 formatteropts,
5155 5160 _(b'[NAME]'),
5156 5161 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5157 5162 optionalrepo=True,
5158 5163 intents={INTENT_READONLY},
5159 5164 )
5160 5165 def paths(ui, repo, search=None, **opts):
5161 5166 """show aliases for remote repositories
5162 5167
5163 5168 Show definition of symbolic path name NAME. If no name is given,
5164 5169 show definition of all available names.
5165 5170
5166 5171 Option -q/--quiet suppresses all output when searching for NAME
5167 5172 and shows only the path names when listing all definitions.
5168 5173
5169 5174 Path names are defined in the [paths] section of your
5170 5175 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5171 5176 repository, ``.hg/hgrc`` is used, too.
5172 5177
5173 5178 The path names ``default`` and ``default-push`` have a special
5174 5179 meaning. When performing a push or pull operation, they are used
5175 5180 as fallbacks if no location is specified on the command-line.
5176 5181 When ``default-push`` is set, it will be used for push and
5177 5182 ``default`` will be used for pull; otherwise ``default`` is used
5178 5183 as the fallback for both. When cloning a repository, the clone
5179 5184 source is written as ``default`` in ``.hg/hgrc``.
5180 5185
5181 5186 .. note::
5182 5187
5183 5188 ``default`` and ``default-push`` apply to all inbound (e.g.
5184 5189 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email`
5185 5190 and :hg:`bundle`) operations.
5186 5191
5187 5192 See :hg:`help urls` for more information.
5188 5193
5189 5194 .. container:: verbose
5190 5195
5191 5196 Template:
5192 5197
5193 5198 The following keywords are supported. See also :hg:`help templates`.
5194 5199
5195 5200 :name: String. Symbolic name of the path alias.
5196 5201 :pushurl: String. URL for push operations.
5197 5202 :url: String. URL or directory path for the other operations.
5198 5203
5199 5204 Returns 0 on success.
5200 5205 """
5201 5206
5202 5207 pathitems = urlutil.list_paths(ui, search)
5203 5208 ui.pager(b'paths')
5204 5209
5205 5210 fm = ui.formatter(b'paths', pycompat.byteskwargs(opts))
5206 5211 if fm.isplain():
5207 5212 hidepassword = urlutil.hidepassword
5208 5213 else:
5209 5214 hidepassword = bytes
5210 5215 if ui.quiet:
5211 5216 namefmt = b'%s\n'
5212 5217 else:
5213 5218 namefmt = b'%s = '
5214 5219 showsubopts = not search and not ui.quiet
5215 5220
5216 5221 for name, path in pathitems:
5217 5222 fm.startitem()
5218 5223 fm.condwrite(not search, b'name', namefmt, name)
5219 5224 fm.condwrite(not ui.quiet, b'url', b'%s\n', hidepassword(path.rawloc))
5220 5225 for subopt, value in sorted(path.suboptions.items()):
5221 5226 assert subopt not in (b'name', b'url')
5222 5227 if showsubopts:
5223 5228 fm.plain(b'%s:%s = ' % (name, subopt))
5224 5229 display = urlutil.path_suboptions_display[subopt]
5225 5230 value = display(value)
5226 5231 fm.condwrite(showsubopts, subopt, b'%s\n', value)
5227 5232
5228 5233 fm.end()
5229 5234
5230 5235 if search and not pathitems:
5231 5236 if not ui.quiet:
5232 5237 ui.warn(_(b"not found!\n"))
5233 5238 return 1
5234 5239 else:
5235 5240 return 0
5236 5241
5237 5242
5238 5243 @command(
5239 5244 b'phase',
5240 5245 [
5241 5246 (b'p', b'public', False, _(b'set changeset phase to public')),
5242 5247 (b'd', b'draft', False, _(b'set changeset phase to draft')),
5243 5248 (b's', b'secret', False, _(b'set changeset phase to secret')),
5244 5249 (b'f', b'force', False, _(b'allow to move boundary backward')),
5245 5250 (b'r', b'rev', [], _(b'target revision'), _(b'REV')),
5246 5251 ],
5247 5252 _(b'[-p|-d|-s] [-f] [-r] [REV...]'),
5248 5253 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
5249 5254 )
5250 5255 def phase(ui, repo, *revs, **opts):
5251 5256 """set or show the current phase name
5252 5257
5253 5258 With no argument, show the phase name of the current revision(s).
5254 5259
5255 5260 With one of -p/--public, -d/--draft or -s/--secret, change the
5256 5261 phase value of the specified revisions.
5257 5262
5258 5263 Unless -f/--force is specified, :hg:`phase` won't move changesets from a
5259 5264 lower phase to a higher phase. Phases are ordered as follows::
5260 5265
5261 5266 public < draft < secret
5262 5267
5263 5268 Returns 0 on success, 1 if some phases could not be changed.
5264 5269
5265 5270 (For more information about the phases concept, see :hg:`help phases`.)
5266 5271 """
5267 5272 opts = pycompat.byteskwargs(opts)
5268 5273 # search for a unique phase argument
5269 5274 targetphase = None
5270 5275 for idx, name in enumerate(phases.cmdphasenames):
5271 5276 if opts[name]:
5272 5277 if targetphase is not None:
5273 5278 raise error.InputError(_(b'only one phase can be specified'))
5274 5279 targetphase = idx
5275 5280
5276 5281 # look for specified revision
5277 5282 revs = list(revs)
5278 5283 revs.extend(opts[b'rev'])
5279 5284 if revs:
5280 5285 revs = logcmdutil.revrange(repo, revs)
5281 5286 else:
5282 5287 # display both parents as the second parent phase can influence
5283 5288 # the phase of a merge commit
5284 5289 revs = [c.rev() for c in repo[None].parents()]
5285 5290
5286 5291 ret = 0
5287 5292 if targetphase is None:
5288 5293 # display
5289 5294 for r in revs:
5290 5295 ctx = repo[r]
5291 5296 ui.write(b'%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5292 5297 else:
5293 5298 with repo.lock(), repo.transaction(b"phase") as tr:
5294 5299 # set phase
5295 5300 if not revs:
5296 5301 raise error.InputError(_(b'empty revision set'))
5297 5302 nodes = [repo[r].node() for r in revs]
5298 5303 # moving revision from public to draft may hide them
5299 5304 # We have to check result on an unfiltered repository
5300 5305 unfi = repo.unfiltered()
5301 5306 getphase = unfi._phasecache.phase
5302 5307 olddata = [getphase(unfi, r) for r in unfi]
5303 5308 phases.advanceboundary(repo, tr, targetphase, nodes)
5304 5309 if opts[b'force']:
5305 5310 phases.retractboundary(repo, tr, targetphase, nodes)
5306 5311 getphase = unfi._phasecache.phase
5307 5312 newdata = [getphase(unfi, r) for r in unfi]
5308 5313 changes = sum(newdata[r] != olddata[r] for r in unfi)
5309 5314 cl = unfi.changelog
5310 5315 rejected = [n for n in nodes if newdata[cl.rev(n)] < targetphase]
5311 5316 if rejected:
5312 5317 ui.warn(
5313 5318 _(
5314 5319 b'cannot move %i changesets to a higher '
5315 5320 b'phase, use --force\n'
5316 5321 )
5317 5322 % len(rejected)
5318 5323 )
5319 5324 ret = 1
5320 5325 if changes:
5321 5326 msg = _(b'phase changed for %i changesets\n') % changes
5322 5327 if ret:
5323 5328 ui.status(msg)
5324 5329 else:
5325 5330 ui.note(msg)
5326 5331 else:
5327 5332 ui.warn(_(b'no phases changed\n'))
5328 5333 return ret
5329 5334
5330 5335
5331 5336 def postincoming(ui, repo, modheads, optupdate, checkout, brev):
5332 5337 """Run after a changegroup has been added via pull/unbundle
5333 5338
5334 5339 This takes arguments below:
5335 5340
5336 5341 :modheads: change of heads by pull/unbundle
5337 5342 :optupdate: updating working directory is needed or not
5338 5343 :checkout: update destination revision (or None to default destination)
5339 5344 :brev: a name, which might be a bookmark to be activated after updating
5340 5345
5341 5346 return True if update raise any conflict, False otherwise.
5342 5347 """
5343 5348 if modheads == 0:
5344 5349 return False
5345 5350 if optupdate:
5346 5351 try:
5347 5352 return hg.updatetotally(ui, repo, checkout, brev)
5348 5353 except error.UpdateAbort as inst:
5349 5354 msg = _(b"not updating: %s") % stringutil.forcebytestr(inst)
5350 5355 hint = inst.hint
5351 5356 raise error.UpdateAbort(msg, hint=hint)
5352 5357 if modheads is not None and modheads > 1:
5353 5358 currentbranchheads = len(repo.branchheads())
5354 5359 if currentbranchheads == modheads:
5355 5360 ui.status(
5356 5361 _(b"(run 'hg heads' to see heads, 'hg merge' to merge)\n")
5357 5362 )
5358 5363 elif currentbranchheads > 1:
5359 5364 ui.status(
5360 5365 _(b"(run 'hg heads .' to see heads, 'hg merge' to merge)\n")
5361 5366 )
5362 5367 else:
5363 5368 ui.status(_(b"(run 'hg heads' to see heads)\n"))
5364 5369 elif not ui.configbool(b'commands', b'update.requiredest'):
5365 5370 ui.status(_(b"(run 'hg update' to get a working copy)\n"))
5366 5371 return False
5367 5372
5368 5373
5369 5374 @command(
5370 5375 b'pull',
5371 5376 [
5372 5377 (
5373 5378 b'u',
5374 5379 b'update',
5375 5380 None,
5376 5381 _(b'update to new branch head if new descendants were pulled'),
5377 5382 ),
5378 5383 (
5379 5384 b'f',
5380 5385 b'force',
5381 5386 None,
5382 5387 _(b'run even when remote repository is unrelated'),
5383 5388 ),
5384 5389 (
5385 5390 b'',
5386 5391 b'confirm',
5387 5392 None,
5388 5393 _(b'confirm pull before applying changes'),
5389 5394 ),
5390 5395 (
5391 5396 b'r',
5392 5397 b'rev',
5393 5398 [],
5394 5399 _(b'a remote changeset intended to be added'),
5395 5400 _(b'REV'),
5396 5401 ),
5397 5402 (b'B', b'bookmark', [], _(b"bookmark to pull"), _(b'BOOKMARK')),
5398 5403 (
5399 5404 b'b',
5400 5405 b'branch',
5401 5406 [],
5402 5407 _(b'a specific branch you would like to pull'),
5403 5408 _(b'BRANCH'),
5404 5409 ),
5405 5410 (
5406 5411 b'',
5407 5412 b'remote-hidden',
5408 5413 False,
5409 5414 _(b"include changesets hidden on the remote (EXPERIMENTAL)"),
5410 5415 ),
5411 5416 ]
5412 5417 + remoteopts,
5413 5418 _(b'[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]...'),
5414 5419 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5415 5420 helpbasic=True,
5416 5421 )
5417 5422 def pull(ui, repo, *sources, **opts):
5418 5423 """pull changes from the specified source
5419 5424
5420 5425 Pull changes from a remote repository to a local one.
5421 5426
5422 5427 This finds all changes from the repository at the specified path
5423 5428 or URL and adds them to a local repository (the current one unless
5424 5429 -R is specified). By default, this does not update the copy of the
5425 5430 project in the working directory.
5426 5431
5427 5432 When cloning from servers that support it, Mercurial may fetch
5428 5433 pre-generated data. When this is done, hooks operating on incoming
5429 5434 changesets and changegroups may fire more than once, once for each
5430 5435 pre-generated bundle and as well as for any additional remaining
5431 5436 data. See :hg:`help -e clonebundles` for more.
5432 5437
5433 5438 Use :hg:`incoming` if you want to see what would have been added
5434 5439 by a pull at the time you issued this command. If you then decide
5435 5440 to add those changes to the repository, you should use :hg:`pull
5436 5441 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5437 5442
5438 5443 If SOURCE is omitted, the 'default' path will be used.
5439 5444 See :hg:`help urls` for more information.
5440 5445
5441 5446 If multiple sources are specified, they will be pulled sequentially as if
5442 5447 the command was run multiple time. If --update is specify and the command
5443 5448 will stop at the first failed --update.
5444 5449
5445 5450 Specifying bookmark as ``.`` is equivalent to specifying the active
5446 5451 bookmark's name.
5447 5452
5448 5453 .. container:: verbose
5449 5454
5450 5455 One can use the `--remote-hidden` flag to pull changesets
5451 5456 hidden on the remote. This flag is "best effort", and will only
5452 5457 work if the server supports the feature and is configured to
5453 5458 allow the user to access hidden changesets. This option is
5454 5459 experimental and backwards compatibility is not garanteed.
5455 5460
5456 5461 Returns 0 on success, 1 if an update had unresolved files.
5457 5462 """
5458 5463
5459 5464 if ui.configbool(b'commands', b'update.requiredest') and opts.get('update'):
5460 5465 msg = _(b'update destination required by configuration')
5461 5466 hint = _(b'use hg pull followed by hg update DEST')
5462 5467 raise error.InputError(msg, hint=hint)
5463 5468
5464 5469 update_conflict = None
5465 5470
5466 5471 for path in urlutil.get_pull_paths(repo, ui, sources):
5467 5472 ui.status(_(b'pulling from %s\n') % urlutil.hidepassword(path.loc))
5468 5473 ui.flush()
5469 5474 other = hg.peer(
5470 5475 repo,
5471 5476 pycompat.byteskwargs(opts),
5472 5477 path,
5473 5478 remotehidden=opts['remote_hidden'],
5474 5479 )
5475 5480 update_conflict = None
5476 5481 try:
5477 5482 branches = (path.branch, opts.get('branch', []))
5478 5483 revs, checkout = hg.addbranchrevs(
5479 5484 repo,
5480 5485 other,
5481 5486 branches,
5482 5487 opts.get('rev'),
5483 5488 remotehidden=opts['remote_hidden'],
5484 5489 )
5485 5490
5486 5491 pullopargs = {}
5487 5492
5488 5493 nodes = None
5489 5494 if opts.get('bookmark') or revs:
5490 5495 # The list of bookmark used here is the same used to actually update
5491 5496 # the bookmark names, to avoid the race from issue 4689 and we do
5492 5497 # all lookup and bookmark queries in one go so they see the same
5493 5498 # version of the server state (issue 4700).
5494 5499 nodes = []
5495 5500 fnodes = []
5496 5501 revs = revs or []
5497 5502 if revs and not other.capable(b'lookup'):
5498 5503 err = _(
5499 5504 b"other repository doesn't support revision lookup, "
5500 5505 b"so a rev cannot be specified."
5501 5506 )
5502 5507 raise error.Abort(err)
5503 5508 with other.commandexecutor() as e:
5504 5509 fremotebookmarks = e.callcommand(
5505 5510 b'listkeys', {b'namespace': b'bookmarks'}
5506 5511 )
5507 5512 for r in revs:
5508 5513 fnodes.append(e.callcommand(b'lookup', {b'key': r}))
5509 5514 remotebookmarks = fremotebookmarks.result()
5510 5515 remotebookmarks = bookmarks.unhexlifybookmarks(remotebookmarks)
5511 5516 pullopargs[b'remotebookmarks'] = remotebookmarks
5512 5517 for b in opts.get('bookmark', []):
5513 5518 b = repo._bookmarks.expandname(b)
5514 5519 if b not in remotebookmarks:
5515 5520 raise error.InputError(
5516 5521 _(b'remote bookmark %s not found!') % b
5517 5522 )
5518 5523 nodes.append(remotebookmarks[b])
5519 5524 for i, rev in enumerate(revs):
5520 5525 node = fnodes[i].result()
5521 5526 nodes.append(node)
5522 5527 if rev == checkout:
5523 5528 checkout = node
5524 5529
5525 5530 wlock = util.nullcontextmanager()
5526 5531 if opts.get('update'):
5527 5532 wlock = repo.wlock()
5528 5533 with wlock:
5529 5534 pullopargs.update(opts.get('opargs', {}))
5530 5535 modheads = exchange.pull(
5531 5536 repo,
5532 5537 other,
5533 5538 path=path,
5534 5539 heads=nodes,
5535 5540 force=opts.get('force'),
5536 5541 bookmarks=opts.get('bookmark', ()),
5537 5542 opargs=pullopargs,
5538 5543 confirm=opts.get('confirm'),
5539 5544 ).cgresult
5540 5545
5541 5546 # brev is a name, which might be a bookmark to be activated at
5542 5547 # the end of the update. In other words, it is an explicit
5543 5548 # destination of the update
5544 5549 brev = None
5545 5550
5546 5551 if checkout:
5547 5552 checkout = repo.unfiltered().changelog.rev(checkout)
5548 5553
5549 5554 # order below depends on implementation of
5550 5555 # hg.addbranchrevs(). opts['bookmark'] is ignored,
5551 5556 # because 'checkout' is determined without it.
5552 5557 if opts.get('rev'):
5553 5558 brev = opts['rev'][0]
5554 5559 elif opts.get('branch'):
5555 5560 brev = opts['branch'][0]
5556 5561 else:
5557 5562 brev = path.branch
5558 5563
5559 5564 # XXX path: we are losing the `path` object here. Keeping it
5560 5565 # would be valuable. For example as a "variant" as we do
5561 5566 # for pushes.
5562 5567 repo._subtoppath = path.loc
5563 5568 try:
5564 5569 update_conflict = postincoming(
5565 5570 ui, repo, modheads, opts.get('update'), checkout, brev
5566 5571 )
5567 5572 except error.FilteredRepoLookupError as exc:
5568 5573 msg = _(b'cannot update to target: %s') % exc.args[0]
5569 5574 exc.args = (msg,) + exc.args[1:]
5570 5575 raise
5571 5576 finally:
5572 5577 del repo._subtoppath
5573 5578
5574 5579 finally:
5575 5580 other.close()
5576 5581 # skip the remaining pull source if they are some conflict.
5577 5582 if update_conflict:
5578 5583 break
5579 5584 if update_conflict:
5580 5585 return 1
5581 5586 else:
5582 5587 return 0
5583 5588
5584 5589
5585 5590 @command(
5586 5591 b'purge|clean',
5587 5592 [
5588 5593 (b'a', b'abort-on-err', None, _(b'abort if an error occurs')),
5589 5594 (b'', b'all', None, _(b'purge ignored files too')),
5590 5595 (b'i', b'ignored', None, _(b'purge only ignored files')),
5591 5596 (b'', b'dirs', None, _(b'purge empty directories')),
5592 5597 (b'', b'files', None, _(b'purge files')),
5593 5598 (b'p', b'print', None, _(b'print filenames instead of deleting them')),
5594 5599 (
5595 5600 b'0',
5596 5601 b'print0',
5597 5602 None,
5598 5603 _(
5599 5604 b'end filenames with NUL, for use with xargs'
5600 5605 b' (implies -p/--print)'
5601 5606 ),
5602 5607 ),
5603 5608 (b'', b'confirm', None, _(b'ask before permanently deleting files')),
5604 5609 ]
5605 5610 + cmdutil.walkopts,
5606 5611 _(b'hg purge [OPTION]... [DIR]...'),
5607 5612 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5608 5613 )
5609 5614 def purge(ui, repo, *dirs, **opts):
5610 5615 """removes files not tracked by Mercurial
5611 5616
5612 5617 Delete files not known to Mercurial. This is useful to test local
5613 5618 and uncommitted changes in an otherwise-clean source tree.
5614 5619
5615 5620 This means that purge will delete the following by default:
5616 5621
5617 5622 - Unknown files: files marked with "?" by :hg:`status`
5618 5623 - Empty directories: in fact Mercurial ignores directories unless
5619 5624 they contain files under source control management
5620 5625
5621 5626 But it will leave untouched:
5622 5627
5623 5628 - Modified and unmodified tracked files
5624 5629 - Ignored files (unless -i or --all is specified)
5625 5630 - New files added to the repository (with :hg:`add`)
5626 5631
5627 5632 The --files and --dirs options can be used to direct purge to delete
5628 5633 only files, only directories, or both. If neither option is given,
5629 5634 both will be deleted.
5630 5635
5631 5636 If directories are given on the command line, only files in these
5632 5637 directories are considered.
5633 5638
5634 5639 Be careful with purge, as you could irreversibly delete some files
5635 5640 you forgot to add to the repository. If you only want to print the
5636 5641 list of files that this program would delete, use the --print
5637 5642 option.
5638 5643 """
5639 5644 cmdutil.check_at_most_one_arg(opts, 'all', 'ignored')
5640 5645
5641 5646 act = not opts.get('print')
5642 5647 eol = b'\n'
5643 5648 if opts.get('print0'):
5644 5649 eol = b'\0'
5645 5650 act = False # --print0 implies --print
5646 5651 if opts.get('all', False):
5647 5652 ignored = True
5648 5653 unknown = True
5649 5654 else:
5650 5655 ignored = opts.get('ignored', False)
5651 5656 unknown = not ignored
5652 5657
5653 5658 removefiles = opts.get('files')
5654 5659 removedirs = opts.get('dirs')
5655 5660 confirm = opts.get('confirm')
5656 5661 if confirm is None:
5657 5662 try:
5658 5663 extensions.find(b'purge')
5659 5664 confirm = False
5660 5665 except KeyError:
5661 5666 confirm = True
5662 5667
5663 5668 if not removefiles and not removedirs:
5664 5669 removefiles = True
5665 5670 removedirs = True
5666 5671
5667 5672 match = scmutil.match(repo[None], dirs, pycompat.byteskwargs(opts))
5668 5673
5669 5674 paths = mergemod.purge(
5670 5675 repo,
5671 5676 match,
5672 5677 unknown=unknown,
5673 5678 ignored=ignored,
5674 5679 removeemptydirs=removedirs,
5675 5680 removefiles=removefiles,
5676 5681 abortonerror=opts.get('abort_on_err'),
5677 5682 noop=not act,
5678 5683 confirm=confirm,
5679 5684 )
5680 5685
5681 5686 for path in paths:
5682 5687 if not act:
5683 5688 ui.write(b'%s%s' % (path, eol))
5684 5689
5685 5690
5686 5691 @command(
5687 5692 b'push',
5688 5693 [
5689 5694 (b'f', b'force', None, _(b'force push')),
5690 5695 (
5691 5696 b'r',
5692 5697 b'rev',
5693 5698 [],
5694 5699 _(b'a changeset intended to be included in the destination'),
5695 5700 _(b'REV'),
5696 5701 ),
5697 5702 (b'B', b'bookmark', [], _(b"bookmark to push"), _(b'BOOKMARK')),
5698 5703 (b'', b'all-bookmarks', None, _(b"push all bookmarks (EXPERIMENTAL)")),
5699 5704 (
5700 5705 b'b',
5701 5706 b'branch',
5702 5707 [],
5703 5708 _(b'a specific branch you would like to push'),
5704 5709 _(b'BRANCH'),
5705 5710 ),
5706 5711 (b'', b'new-branch', False, _(b'allow pushing a new branch')),
5707 5712 (
5708 5713 b'',
5709 5714 b'pushvars',
5710 5715 [],
5711 5716 _(b'variables that can be sent to server (ADVANCED)'),
5712 5717 ),
5713 5718 (
5714 5719 b'',
5715 5720 b'publish',
5716 5721 False,
5717 5722 _(b'push the changeset as public (EXPERIMENTAL)'),
5718 5723 ),
5719 5724 ]
5720 5725 + remoteopts,
5721 5726 _(b'[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]...'),
5722 5727 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
5723 5728 helpbasic=True,
5724 5729 )
5725 5730 def push(ui, repo, *dests, **opts):
5726 5731 """push changes to the specified destination
5727 5732
5728 5733 Push changesets from the local repository to the specified
5729 5734 destination.
5730 5735
5731 5736 This operation is symmetrical to pull: it is identical to a pull
5732 5737 in the destination repository from the current one.
5733 5738
5734 5739 By default, push will not allow creation of new heads at the
5735 5740 destination, since multiple heads would make it unclear which head
5736 5741 to use. In this situation, it is recommended to pull and merge
5737 5742 before pushing.
5738 5743
5739 5744 Use --new-branch if you want to allow push to create a new named
5740 5745 branch that is not present at the destination. This allows you to
5741 5746 only create a new branch without forcing other changes.
5742 5747
5743 5748 .. note::
5744 5749
5745 5750 Extra care should be taken with the -f/--force option,
5746 5751 which will push all new heads on all branches, an action which will
5747 5752 almost always cause confusion for collaborators.
5748 5753
5749 5754 If -r/--rev is used, the specified revision and all its ancestors
5750 5755 will be pushed to the remote repository.
5751 5756
5752 5757 If -B/--bookmark is used, the specified bookmarked revision, its
5753 5758 ancestors, and the bookmark will be pushed to the remote
5754 5759 repository. Specifying ``.`` is equivalent to specifying the active
5755 5760 bookmark's name. Use the --all-bookmarks option for pushing all
5756 5761 current bookmarks.
5757 5762
5758 5763 Please see :hg:`help urls` for important details about ``ssh://``
5759 5764 URLs. If DESTINATION is omitted, a default path will be used.
5760 5765
5761 5766 When passed multiple destinations, push will process them one after the
5762 5767 other, but stop should an error occur.
5763 5768
5764 5769 .. container:: verbose
5765 5770
5766 5771 The --pushvars option sends strings to the server that become
5767 5772 environment variables prepended with ``HG_USERVAR_``. For example,
5768 5773 ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with
5769 5774 ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment.
5770 5775
5771 5776 pushvars can provide for user-overridable hooks as well as set debug
5772 5777 levels. One example is having a hook that blocks commits containing
5773 5778 conflict markers, but enables the user to override the hook if the file
5774 5779 is using conflict markers for testing purposes or the file format has
5775 5780 strings that look like conflict markers.
5776 5781
5777 5782 By default, servers will ignore `--pushvars`. To enable it add the
5778 5783 following to your configuration file::
5779 5784
5780 5785 [push]
5781 5786 pushvars.server = true
5782 5787
5783 5788 Returns 0 if push was successful, 1 if nothing to push.
5784 5789 """
5785 5790
5786 5791 opts = pycompat.byteskwargs(opts)
5787 5792
5788 5793 if opts.get(b'all_bookmarks'):
5789 5794 cmdutil.check_incompatible_arguments(
5790 5795 opts,
5791 5796 b'all_bookmarks',
5792 5797 [b'bookmark', b'rev'],
5793 5798 )
5794 5799 opts[b'bookmark'] = list(repo._bookmarks)
5795 5800
5796 5801 if opts.get(b'bookmark'):
5797 5802 ui.setconfig(b'bookmarks', b'pushing', opts[b'bookmark'], b'push')
5798 5803 for b in opts[b'bookmark']:
5799 5804 # translate -B options to -r so changesets get pushed
5800 5805 b = repo._bookmarks.expandname(b)
5801 5806 if b in repo._bookmarks:
5802 5807 opts.setdefault(b'rev', []).append(b)
5803 5808 else:
5804 5809 # if we try to push a deleted bookmark, translate it to null
5805 5810 # this lets simultaneous -r, -b options continue working
5806 5811 opts.setdefault(b'rev', []).append(b"null")
5807 5812
5808 5813 some_pushed = False
5809 5814 result = 0
5810 5815 for path in urlutil.get_push_paths(repo, ui, dests):
5811 5816 dest = path.loc
5812 5817 branches = (path.branch, opts.get(b'branch') or [])
5813 5818 ui.status(_(b'pushing to %s\n') % urlutil.hidepassword(dest))
5814 5819 revs, checkout = hg.addbranchrevs(
5815 5820 repo, repo, branches, opts.get(b'rev')
5816 5821 )
5817 5822 other = hg.peer(repo, opts, dest)
5818 5823
5819 5824 try:
5820 5825 if revs:
5821 5826 revs = [repo[r].node() for r in logcmdutil.revrange(repo, revs)]
5822 5827 if not revs:
5823 5828 raise error.InputError(
5824 5829 _(b"specified revisions evaluate to an empty set"),
5825 5830 hint=_(b"use different revision arguments"),
5826 5831 )
5827 5832 elif path.pushrev:
5828 5833 # It doesn't make any sense to specify ancestor revisions. So limit
5829 5834 # to DAG heads to make discovery simpler.
5830 5835 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5831 5836 revs = scmutil.revrange(repo, [expr])
5832 5837 revs = [repo[rev].node() for rev in revs]
5833 5838 if not revs:
5834 5839 raise error.InputError(
5835 5840 _(
5836 5841 b'default push revset for path evaluates to an empty set'
5837 5842 )
5838 5843 )
5839 5844 elif ui.configbool(b'commands', b'push.require-revs'):
5840 5845 raise error.InputError(
5841 5846 _(b'no revisions specified to push'),
5842 5847 hint=_(b'did you mean "hg push -r ."?'),
5843 5848 )
5844 5849
5845 5850 repo._subtoppath = dest
5846 5851 try:
5847 5852 # push subrepos depth-first for coherent ordering
5848 5853 c = repo[b'.']
5849 5854 subs = c.substate # only repos that are committed
5850 5855 for s in sorted(subs):
5851 5856 sub_result = c.sub(s).push(opts)
5852 5857 if sub_result == 0:
5853 5858 return 1
5854 5859 finally:
5855 5860 del repo._subtoppath
5856 5861
5857 5862 opargs = dict(
5858 5863 opts.get(b'opargs', {})
5859 5864 ) # copy opargs since we may mutate it
5860 5865 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5861 5866
5862 5867 pushop = exchange.push(
5863 5868 repo,
5864 5869 other,
5865 5870 opts.get(b'force'),
5866 5871 revs=revs,
5867 5872 newbranch=opts.get(b'new_branch'),
5868 5873 bookmarks=opts.get(b'bookmark', ()),
5869 5874 publish=opts.get(b'publish'),
5870 5875 opargs=opargs,
5871 5876 )
5872 5877
5873 5878 if pushop.cgresult == 0:
5874 5879 result = 1
5875 5880 elif pushop.cgresult is not None:
5876 5881 some_pushed = True
5877 5882
5878 5883 if pushop.bkresult is not None:
5879 5884 if pushop.bkresult == 2:
5880 5885 result = 2
5881 5886 elif not result and pushop.bkresult:
5882 5887 result = 2
5883 5888
5884 5889 if result:
5885 5890 break
5886 5891
5887 5892 finally:
5888 5893 other.close()
5889 5894 if result == 0 and not some_pushed:
5890 5895 result = 1
5891 5896 return result
5892 5897
5893 5898
5894 5899 @command(
5895 5900 b'recover',
5896 5901 [
5897 5902 (b'', b'verify', False, b"run `hg verify` after successful recover"),
5898 5903 ],
5899 5904 helpcategory=command.CATEGORY_MAINTENANCE,
5900 5905 )
5901 5906 def recover(ui, repo, **opts):
5902 5907 """roll back an interrupted transaction
5903 5908
5904 5909 Recover from an interrupted commit or pull.
5905 5910
5906 5911 This command tries to fix the repository status after an
5907 5912 interrupted operation. It should only be necessary when Mercurial
5908 5913 suggests it.
5909 5914
5910 5915 Returns 0 if successful, 1 if nothing to recover or verify fails.
5911 5916 """
5912 5917 ret = repo.recover()
5913 5918 if ret:
5914 5919 if opts['verify']:
5915 5920 return hg.verify(repo)
5916 5921 else:
5917 5922 msg = _(
5918 5923 b"(verify step skipped, run `hg verify` to check your "
5919 5924 b"repository content)\n"
5920 5925 )
5921 5926 ui.warn(msg)
5922 5927 return 0
5923 5928 return 1
5924 5929
5925 5930
5926 5931 @command(
5927 5932 b'remove|rm',
5928 5933 [
5929 5934 (b'A', b'after', None, _(b'record delete for missing files')),
5930 5935 (b'f', b'force', None, _(b'forget added files, delete modified files')),
5931 5936 ]
5932 5937 + subrepoopts
5933 5938 + walkopts
5934 5939 + dryrunopts,
5935 5940 _(b'[OPTION]... FILE...'),
5936 5941 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
5937 5942 helpbasic=True,
5938 5943 inferrepo=True,
5939 5944 )
5940 5945 def remove(ui, repo, *pats, **opts):
5941 5946 """remove the specified files on the next commit
5942 5947
5943 5948 Schedule the indicated files for removal from the current branch.
5944 5949
5945 5950 This command schedules the files to be removed at the next commit.
5946 5951 To undo a remove before that, see :hg:`revert`. To undo added
5947 5952 files, see :hg:`forget`.
5948 5953
5949 5954 .. container:: verbose
5950 5955
5951 5956 -A/--after can be used to remove only files that have already
5952 5957 been deleted, -f/--force can be used to force deletion, and -Af
5953 5958 can be used to remove files from the next revision without
5954 5959 deleting them from the working directory.
5955 5960
5956 5961 The following table details the behavior of remove for different
5957 5962 file states (columns) and option combinations (rows). The file
5958 5963 states are Added [A], Clean [C], Modified [M] and Missing [!]
5959 5964 (as reported by :hg:`status`). The actions are Warn, Remove
5960 5965 (from branch) and Delete (from disk):
5961 5966
5962 5967 ========= == == == ==
5963 5968 opt/state A C M !
5964 5969 ========= == == == ==
5965 5970 none W RD W R
5966 5971 -f R RD RD R
5967 5972 -A W W W R
5968 5973 -Af R R R R
5969 5974 ========= == == == ==
5970 5975
5971 5976 .. note::
5972 5977
5973 5978 :hg:`remove` never deletes files in Added [A] state from the
5974 5979 working directory, not even if ``--force`` is specified.
5975 5980
5976 5981 Returns 0 on success, 1 if any warnings encountered.
5977 5982 """
5978 5983
5979 5984 after, force = opts.get('after'), opts.get('force')
5980 5985 dryrun = opts.get('dry_run')
5981 5986 if not pats and not after:
5982 5987 raise error.InputError(_(b'no files specified'))
5983 5988
5984 5989 with repo.wlock(), repo.dirstate.changing_files(repo):
5985 5990 m = scmutil.match(repo[None], pats, pycompat.byteskwargs(opts))
5986 5991 subrepos = opts.get('subrepos')
5987 5992 uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
5988 5993 return cmdutil.remove(
5989 5994 ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun
5990 5995 )
5991 5996
5992 5997
5993 5998 @command(
5994 5999 b'rename|move|mv',
5995 6000 [
5996 6001 (b'', b'forget', None, _(b'unmark a destination file as renamed')),
5997 6002 (b'A', b'after', None, _(b'record a rename that has already occurred')),
5998 6003 (
5999 6004 b'',
6000 6005 b'at-rev',
6001 6006 b'',
6002 6007 _(b'(un)mark renames in the given revision (EXPERIMENTAL)'),
6003 6008 _(b'REV'),
6004 6009 ),
6005 6010 (
6006 6011 b'f',
6007 6012 b'force',
6008 6013 None,
6009 6014 _(b'forcibly move over an existing managed file'),
6010 6015 ),
6011 6016 ]
6012 6017 + walkopts
6013 6018 + dryrunopts,
6014 6019 _(b'[OPTION]... SOURCE... DEST'),
6015 6020 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6016 6021 )
6017 6022 def rename(ui, repo, *pats, **opts):
6018 6023 """rename files; equivalent of copy + remove
6019 6024
6020 6025 Mark dest as copies of sources; mark sources for deletion. If dest
6021 6026 is a directory, copies are put in that directory. If dest is a
6022 6027 file, there can only be one source.
6023 6028
6024 6029 By default, this command copies the contents of files as they
6025 6030 exist in the working directory. If invoked with -A/--after, the
6026 6031 operation is recorded, but no copying is performed.
6027 6032
6028 6033 To undo marking a destination file as renamed, use --forget. With that
6029 6034 option, all given (positional) arguments are unmarked as renames. The
6030 6035 destination file(s) will be left in place (still tracked). The source
6031 6036 file(s) will not be restored. Note that :hg:`rename --forget` behaves
6032 6037 the same way as :hg:`copy --forget`.
6033 6038
6034 6039 This command takes effect with the next commit by default.
6035 6040
6036 6041 Returns 0 on success, 1 if errors are encountered.
6037 6042 """
6038 6043 context = lambda repo: repo.dirstate.changing_files(repo)
6039 6044 rev = opts.get('at_rev')
6040 6045
6041 6046 if rev:
6042 6047 ctx = logcmdutil.revsingle(repo, rev)
6043 6048 if ctx.rev() is not None:
6044 6049
6045 6050 def context(repo):
6046 6051 return util.nullcontextmanager()
6047 6052
6048 6053 opts['at_rev'] = ctx.rev()
6049 6054 with repo.wlock(), context(repo):
6050 6055 return cmdutil.copy(
6051 6056 ui, repo, pats, pycompat.byteskwargs(opts), rename=True
6052 6057 )
6053 6058
6054 6059
6055 6060 @command(
6056 6061 b'resolve',
6057 6062 [
6058 6063 (b'a', b'all', None, _(b'select all unresolved files')),
6059 6064 (b'l', b'list', None, _(b'list state of files needing merge')),
6060 6065 (b'm', b'mark', None, _(b'mark files as resolved')),
6061 6066 (b'u', b'unmark', None, _(b'mark files as unresolved')),
6062 6067 (b'n', b'no-status', None, _(b'hide status prefix')),
6063 6068 (b'', b're-merge', None, _(b're-merge files')),
6064 6069 ]
6065 6070 + mergetoolopts
6066 6071 + walkopts
6067 6072 + formatteropts,
6068 6073 _(b'[OPTION]... [FILE]...'),
6069 6074 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6070 6075 inferrepo=True,
6071 6076 )
6072 6077 def resolve(ui, repo, *pats, **opts):
6073 6078 """redo merges or set/view the merge status of files
6074 6079
6075 6080 Merges with unresolved conflicts are often the result of
6076 6081 non-interactive merging using the ``internal:merge`` configuration
6077 6082 setting, or a command-line merge tool like ``diff3``. The resolve
6078 6083 command is used to manage the files involved in a merge, after
6079 6084 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
6080 6085 working directory must have two parents). See :hg:`help
6081 6086 merge-tools` for information on configuring merge tools.
6082 6087
6083 6088 The resolve command can be used in the following ways:
6084 6089
6085 6090 - :hg:`resolve [--re-merge] [--tool TOOL] FILE...`: attempt to re-merge
6086 6091 the specified files, discarding any previous merge attempts. Re-merging
6087 6092 is not performed for files already marked as resolved. Use ``--all/-a``
6088 6093 to select all unresolved files. ``--tool`` can be used to specify
6089 6094 the merge tool used for the given files. It overrides the HGMERGE
6090 6095 environment variable and your configuration files. Previous file
6091 6096 contents are saved with a ``.orig`` suffix.
6092 6097
6093 6098 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
6094 6099 (e.g. after having manually fixed-up the files). The default is
6095 6100 to mark all unresolved files.
6096 6101
6097 6102 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
6098 6103 default is to mark all resolved files.
6099 6104
6100 6105 - :hg:`resolve -l`: list files which had or still have conflicts.
6101 6106 In the printed list, ``U`` = unresolved and ``R`` = resolved.
6102 6107 You can use ``set:unresolved()`` or ``set:resolved()`` to filter
6103 6108 the list. See :hg:`help filesets` for details.
6104 6109
6105 6110 .. note::
6106 6111
6107 6112 Mercurial will not let you commit files with unresolved merge
6108 6113 conflicts. You must use :hg:`resolve -m ...` before you can
6109 6114 commit after a conflicting merge.
6110 6115
6111 6116 .. container:: verbose
6112 6117
6113 6118 Template:
6114 6119
6115 6120 The following keywords are supported in addition to the common template
6116 6121 keywords and functions. See also :hg:`help templates`.
6117 6122
6118 6123 :mergestatus: String. Character denoting merge conflicts, ``U`` or ``R``.
6119 6124 :path: String. Repository-absolute path of the file.
6120 6125
6121 6126 Returns 0 on success, 1 if any files fail a resolve attempt.
6122 6127 """
6123 6128
6124 6129 opts = pycompat.byteskwargs(opts)
6125 6130 confirm = ui.configbool(b'commands', b'resolve.confirm')
6126 6131 flaglist = b'all mark unmark list no_status re_merge'.split()
6127 6132 all, mark, unmark, show, nostatus, remerge = [opts.get(o) for o in flaglist]
6128 6133
6129 6134 actioncount = len(list(filter(None, [show, mark, unmark, remerge])))
6130 6135 if actioncount > 1:
6131 6136 raise error.InputError(_(b"too many actions specified"))
6132 6137 elif actioncount == 0 and ui.configbool(
6133 6138 b'commands', b'resolve.explicit-re-merge'
6134 6139 ):
6135 6140 hint = _(b'use --mark, --unmark, --list or --re-merge')
6136 6141 raise error.InputError(_(b'no action specified'), hint=hint)
6137 6142 if pats and all:
6138 6143 raise error.InputError(_(b"can't specify --all and patterns"))
6139 6144 if not (all or pats or show or mark or unmark):
6140 6145 raise error.InputError(
6141 6146 _(b'no files or directories specified'),
6142 6147 hint=b'use --all to re-merge all unresolved files',
6143 6148 )
6144 6149
6145 6150 if confirm:
6146 6151 if all:
6147 6152 if ui.promptchoice(
6148 6153 _(b're-merge all unresolved files (yn)?$$ &Yes $$ &No')
6149 6154 ):
6150 6155 raise error.CanceledError(_(b'user quit'))
6151 6156 if mark and not pats:
6152 6157 if ui.promptchoice(
6153 6158 _(
6154 6159 b'mark all unresolved files as resolved (yn)?'
6155 6160 b'$$ &Yes $$ &No'
6156 6161 )
6157 6162 ):
6158 6163 raise error.CanceledError(_(b'user quit'))
6159 6164 if unmark and not pats:
6160 6165 if ui.promptchoice(
6161 6166 _(
6162 6167 b'mark all resolved files as unresolved (yn)?'
6163 6168 b'$$ &Yes $$ &No'
6164 6169 )
6165 6170 ):
6166 6171 raise error.CanceledError(_(b'user quit'))
6167 6172
6168 6173 uipathfn = scmutil.getuipathfn(repo)
6169 6174
6170 6175 if show:
6171 6176 ui.pager(b'resolve')
6172 6177 fm = ui.formatter(b'resolve', opts)
6173 6178 ms = mergestatemod.mergestate.read(repo)
6174 6179 wctx = repo[None]
6175 6180 m = scmutil.match(wctx, pats, opts)
6176 6181
6177 6182 # Labels and keys based on merge state. Unresolved path conflicts show
6178 6183 # as 'P'. Resolved path conflicts show as 'R', the same as normal
6179 6184 # resolved conflicts.
6180 6185 mergestateinfo = {
6181 6186 mergestatemod.MERGE_RECORD_UNRESOLVED: (
6182 6187 b'resolve.unresolved',
6183 6188 b'U',
6184 6189 ),
6185 6190 mergestatemod.MERGE_RECORD_RESOLVED: (b'resolve.resolved', b'R'),
6186 6191 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH: (
6187 6192 b'resolve.unresolved',
6188 6193 b'P',
6189 6194 ),
6190 6195 mergestatemod.MERGE_RECORD_RESOLVED_PATH: (
6191 6196 b'resolve.resolved',
6192 6197 b'R',
6193 6198 ),
6194 6199 }
6195 6200
6196 6201 for f in ms:
6197 6202 if not m(f):
6198 6203 continue
6199 6204
6200 6205 label, key = mergestateinfo[ms[f]]
6201 6206 fm.startitem()
6202 6207 fm.context(ctx=wctx)
6203 6208 fm.condwrite(not nostatus, b'mergestatus', b'%s ', key, label=label)
6204 6209 fm.data(path=f)
6205 6210 fm.plain(b'%s\n' % uipathfn(f), label=label)
6206 6211 fm.end()
6207 6212 return 0
6208 6213
6209 6214 with repo.wlock():
6210 6215 ms = mergestatemod.mergestate.read(repo)
6211 6216
6212 6217 if not (ms.active() or repo.dirstate.p2() != repo.nullid):
6213 6218 raise error.StateError(
6214 6219 _(b'resolve command not applicable when not merging')
6215 6220 )
6216 6221
6217 6222 wctx = repo[None]
6218 6223 m = scmutil.match(wctx, pats, opts)
6219 6224 ret = 0
6220 6225 didwork = False
6221 6226
6222 6227 hasconflictmarkers = []
6223 6228 if mark:
6224 6229 markcheck = ui.config(b'commands', b'resolve.mark-check')
6225 6230 if markcheck not in [b'warn', b'abort']:
6226 6231 # Treat all invalid / unrecognized values as 'none'.
6227 6232 markcheck = False
6228 6233 for f in ms:
6229 6234 if not m(f):
6230 6235 continue
6231 6236
6232 6237 didwork = True
6233 6238
6234 6239 # path conflicts must be resolved manually
6235 6240 if ms[f] in (
6236 6241 mergestatemod.MERGE_RECORD_UNRESOLVED_PATH,
6237 6242 mergestatemod.MERGE_RECORD_RESOLVED_PATH,
6238 6243 ):
6239 6244 if mark:
6240 6245 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED_PATH)
6241 6246 elif unmark:
6242 6247 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED_PATH)
6243 6248 elif ms[f] == mergestatemod.MERGE_RECORD_UNRESOLVED_PATH:
6244 6249 ui.warn(
6245 6250 _(b'%s: path conflict must be resolved manually\n')
6246 6251 % uipathfn(f)
6247 6252 )
6248 6253 continue
6249 6254
6250 6255 if mark:
6251 6256 if markcheck:
6252 6257 fdata = repo.wvfs.tryread(f)
6253 6258 if (
6254 6259 filemerge.hasconflictmarkers(fdata)
6255 6260 and ms[f] != mergestatemod.MERGE_RECORD_RESOLVED
6256 6261 ):
6257 6262 hasconflictmarkers.append(f)
6258 6263 ms.mark(f, mergestatemod.MERGE_RECORD_RESOLVED)
6259 6264 elif unmark:
6260 6265 ms.mark(f, mergestatemod.MERGE_RECORD_UNRESOLVED)
6261 6266 else:
6262 6267 # backup pre-resolve (merge uses .orig for its own purposes)
6263 6268 a = repo.wjoin(f)
6264 6269 try:
6265 6270 util.copyfile(a, a + b".resolve")
6266 6271 except FileNotFoundError:
6267 6272 pass
6268 6273
6269 6274 try:
6270 6275 # preresolve file
6271 6276 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
6272 6277 with ui.configoverride(overrides, b'resolve'):
6273 6278 r = ms.resolve(f, wctx)
6274 6279 if r:
6275 6280 ret = 1
6276 6281 finally:
6277 6282 ms.commit()
6278 6283
6279 6284 # replace filemerge's .orig file with our resolve file
6280 6285 try:
6281 6286 util.rename(
6282 6287 a + b".resolve", scmutil.backuppath(ui, repo, f)
6283 6288 )
6284 6289 except FileNotFoundError:
6285 6290 pass
6286 6291
6287 6292 if hasconflictmarkers:
6288 6293 ui.warn(
6289 6294 _(
6290 6295 b'warning: the following files still have conflict '
6291 6296 b'markers:\n'
6292 6297 )
6293 6298 + b''.join(
6294 6299 b' ' + uipathfn(f) + b'\n' for f in hasconflictmarkers
6295 6300 )
6296 6301 )
6297 6302 if markcheck == b'abort' and not all and not pats:
6298 6303 raise error.StateError(
6299 6304 _(b'conflict markers detected'),
6300 6305 hint=_(b'use --all to mark anyway'),
6301 6306 )
6302 6307
6303 6308 ms.commit()
6304 6309 branchmerge = repo.dirstate.p2() != repo.nullid
6305 6310 # resolve is not doing a parent change here, however, `record updates`
6306 6311 # will call some dirstate API that at intended for parent changes call.
6307 6312 # Ideally we would not need this and could implement a lighter version
6308 6313 # of the recordupdateslogic that will not have to deal with the part
6309 6314 # related to parent changes. However this would requires that:
6310 6315 # - we are sure we passed around enough information at update/merge
6311 6316 # time to no longer needs it at `hg resolve time`
6312 6317 # - we are sure we store that information well enough to be able to reuse it
6313 6318 # - we are the necessary logic to reuse it right.
6314 6319 #
6315 6320 # All this should eventually happens, but in the mean time, we use this
6316 6321 # context manager slightly out of the context it should be.
6317 6322 with repo.dirstate.changing_parents(repo):
6318 6323 mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None)
6319 6324
6320 6325 if not didwork and pats:
6321 6326 hint = None
6322 6327 if not any([p for p in pats if p.find(b':') >= 0]):
6323 6328 pats = [b'path:%s' % p for p in pats]
6324 6329 m = scmutil.match(wctx, pats, opts)
6325 6330 for f in ms:
6326 6331 if not m(f):
6327 6332 continue
6328 6333
6329 6334 def flag(o):
6330 6335 if o == b're_merge':
6331 6336 return b'--re-merge '
6332 6337 return b'-%s ' % o[0:1]
6333 6338
6334 6339 flags = b''.join([flag(o) for o in flaglist if opts.get(o)])
6335 6340 hint = _(b"(try: hg resolve %s%s)\n") % (
6336 6341 flags,
6337 6342 b' '.join(pats),
6338 6343 )
6339 6344 break
6340 6345 ui.warn(_(b"arguments do not match paths that need resolving\n"))
6341 6346 if hint:
6342 6347 ui.warn(hint)
6343 6348
6344 6349 unresolvedf = ms.unresolvedcount()
6345 6350 if not unresolvedf:
6346 6351 ui.status(_(b'(no more unresolved files)\n'))
6347 6352 cmdutil.checkafterresolved(repo)
6348 6353
6349 6354 return ret
6350 6355
6351 6356
6352 6357 @command(
6353 6358 b'revert',
6354 6359 [
6355 6360 (b'a', b'all', None, _(b'revert all changes when no arguments given')),
6356 6361 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
6357 6362 (b'r', b'rev', b'', _(b'revert to the specified revision'), _(b'REV')),
6358 6363 (b'C', b'no-backup', None, _(b'do not save backup copies of files')),
6359 6364 (b'i', b'interactive', None, _(b'interactively select the changes')),
6360 6365 ]
6361 6366 + walkopts
6362 6367 + dryrunopts,
6363 6368 _(b'[OPTION]... [-r REV] [NAME]...'),
6364 6369 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6365 6370 )
6366 6371 def revert(ui, repo, *pats, **opts):
6367 6372 """restore files to their checkout state
6368 6373
6369 6374 .. note::
6370 6375
6371 6376 To check out earlier revisions, you should use :hg:`update REV`.
6372 6377 To cancel an uncommitted merge (and lose your changes),
6373 6378 use :hg:`merge --abort`.
6374 6379
6375 6380 With no revision specified, revert the specified files or directories
6376 6381 to the contents they had in the parent of the working directory.
6377 6382 This restores the contents of files to an unmodified
6378 6383 state and unschedules adds, removes, copies, and renames. If the
6379 6384 working directory has two parents, you must explicitly specify a
6380 6385 revision.
6381 6386
6382 6387 Using the -r/--rev or -d/--date options, revert the given files or
6383 6388 directories to their states as of a specific revision. Because
6384 6389 revert does not change the working directory parents, this will
6385 6390 cause these files to appear modified. This can be helpful to "back
6386 6391 out" some or all of an earlier change. See :hg:`backout` for a
6387 6392 related method.
6388 6393
6389 6394 Modified files are saved with a .orig suffix before reverting.
6390 6395 To disable these backups, use --no-backup. It is possible to store
6391 6396 the backup files in a custom directory relative to the root of the
6392 6397 repository by setting the ``ui.origbackuppath`` configuration
6393 6398 option.
6394 6399
6395 6400 See :hg:`help dates` for a list of formats valid for -d/--date.
6396 6401
6397 6402 See :hg:`help backout` for a way to reverse the effect of an
6398 6403 earlier changeset.
6399 6404
6400 6405 Returns 0 on success.
6401 6406 """
6402 6407
6403 6408 if opts.get("date"):
6404 6409 cmdutil.check_incompatible_arguments(opts, 'date', ['rev'])
6405 6410 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
6406 6411
6407 6412 parent, p2 = repo.dirstate.parents()
6408 6413 if not opts.get('rev') and p2 != repo.nullid:
6409 6414 # revert after merge is a trap for new users (issue2915)
6410 6415 raise error.InputError(
6411 6416 _(b'uncommitted merge with no revision specified'),
6412 6417 hint=_(b"use 'hg update' or see 'hg help revert'"),
6413 6418 )
6414 6419
6415 6420 rev = opts.get('rev')
6416 6421 if rev:
6417 6422 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
6418 6423 ctx = logcmdutil.revsingle(repo, rev)
6419 6424
6420 6425 if not (
6421 6426 pats
6422 6427 or opts.get('include')
6423 6428 or opts.get('exclude')
6424 6429 or opts.get('all')
6425 6430 or opts.get('interactive')
6426 6431 ):
6427 6432 msg = _(b"no files or directories specified")
6428 6433 if p2 != repo.nullid:
6429 6434 hint = _(
6430 6435 b"uncommitted merge, use --all to discard all changes,"
6431 6436 b" or 'hg update -C .' to abort the merge"
6432 6437 )
6433 6438 raise error.InputError(msg, hint=hint)
6434 6439 dirty = any(repo.status())
6435 6440 node = ctx.node()
6436 6441 if node != parent:
6437 6442 if dirty:
6438 6443 hint = (
6439 6444 _(
6440 6445 b"uncommitted changes, use --all to discard all"
6441 6446 b" changes, or 'hg update %d' to update"
6442 6447 )
6443 6448 % ctx.rev()
6444 6449 )
6445 6450 else:
6446 6451 hint = (
6447 6452 _(
6448 6453 b"use --all to revert all files,"
6449 6454 b" or 'hg update %d' to update"
6450 6455 )
6451 6456 % ctx.rev()
6452 6457 )
6453 6458 elif dirty:
6454 6459 hint = _(b"uncommitted changes, use --all to discard all changes")
6455 6460 else:
6456 6461 hint = _(b"use --all to revert all files")
6457 6462 raise error.InputError(msg, hint=hint)
6458 6463
6459 6464 return cmdutil.revert(ui, repo, ctx, *pats, **opts)
6460 6465
6461 6466
6462 6467 @command(
6463 6468 b'rollback',
6464 6469 dryrunopts + [(b'f', b'force', False, _(b'ignore safety measures'))],
6465 6470 helpcategory=command.CATEGORY_MAINTENANCE,
6466 6471 )
6467 6472 def rollback(ui, repo, **opts):
6468 6473 """roll back the last transaction (DANGEROUS) (DEPRECATED)
6469 6474
6470 6475 Please use :hg:`commit --amend` instead of rollback to correct
6471 6476 mistakes in the last commit.
6472 6477
6473 6478 This command should be used with care. There is only one level of
6474 6479 rollback, and there is no way to undo a rollback. It will also
6475 6480 restore the dirstate at the time of the last transaction, losing
6476 6481 any dirstate changes since that time. This command does not alter
6477 6482 the working directory.
6478 6483
6479 6484 Transactions are used to encapsulate the effects of all commands
6480 6485 that create new changesets or propagate existing changesets into a
6481 6486 repository.
6482 6487
6483 6488 .. container:: verbose
6484 6489
6485 6490 For example, the following commands are transactional, and their
6486 6491 effects can be rolled back:
6487 6492
6488 6493 - commit
6489 6494 - import
6490 6495 - pull
6491 6496 - push (with this repository as the destination)
6492 6497 - unbundle
6493 6498
6494 6499 To avoid permanent data loss, rollback will refuse to rollback a
6495 6500 commit transaction if it isn't checked out. Use --force to
6496 6501 override this protection.
6497 6502
6498 6503 The rollback command can be entirely disabled by setting the
6499 6504 ``ui.rollback`` configuration setting to false. If you're here
6500 6505 because you want to use rollback and it's disabled, you can
6501 6506 re-enable the command by setting ``ui.rollback`` to true.
6502 6507
6503 6508 This command is not intended for use on public repositories. Once
6504 6509 changes are visible for pull by other users, rolling a transaction
6505 6510 back locally is ineffective (someone else may already have pulled
6506 6511 the changes). Furthermore, a race is possible with readers of the
6507 6512 repository; for example an in-progress pull from the repository
6508 6513 may fail if a rollback is performed.
6509 6514
6510 6515 Returns 0 on success, 1 if no rollback data is available.
6511 6516 """
6512 6517 if not ui.configbool(b'ui', b'rollback'):
6513 6518 raise error.Abort(
6514 6519 _(b'rollback is disabled because it is unsafe'),
6515 6520 hint=b'see `hg help -v rollback` for information',
6516 6521 )
6517 6522 return repo.rollback(dryrun=opts.get('dry_run'), force=opts.get('force'))
6518 6523
6519 6524
6520 6525 @command(
6521 6526 b'root',
6522 6527 [] + formatteropts,
6523 6528 intents={INTENT_READONLY},
6524 6529 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6525 6530 )
6526 6531 def root(ui, repo, **opts):
6527 6532 """print the root (top) of the current working directory
6528 6533
6529 6534 Print the root directory of the current repository.
6530 6535
6531 6536 .. container:: verbose
6532 6537
6533 6538 Template:
6534 6539
6535 6540 The following keywords are supported in addition to the common template
6536 6541 keywords and functions. See also :hg:`help templates`.
6537 6542
6538 6543 :hgpath: String. Path to the .hg directory.
6539 6544 :storepath: String. Path to the directory holding versioned data.
6540 6545
6541 6546 Returns 0 on success.
6542 6547 """
6543 6548 opts = pycompat.byteskwargs(opts)
6544 6549 with ui.formatter(b'root', opts) as fm:
6545 6550 fm.startitem()
6546 6551 fm.write(b'reporoot', b'%s\n', repo.root)
6547 6552 fm.data(hgpath=repo.path, storepath=repo.spath)
6548 6553
6549 6554
6550 6555 @command(
6551 6556 b'serve',
6552 6557 [
6553 6558 (
6554 6559 b'A',
6555 6560 b'accesslog',
6556 6561 b'',
6557 6562 _(b'name of access log file to write to'),
6558 6563 _(b'FILE'),
6559 6564 ),
6560 6565 (b'd', b'daemon', None, _(b'run server in background')),
6561 6566 (b'', b'daemon-postexec', [], _(b'used internally by daemon mode')),
6562 6567 (
6563 6568 b'E',
6564 6569 b'errorlog',
6565 6570 b'',
6566 6571 _(b'name of error log file to write to'),
6567 6572 _(b'FILE'),
6568 6573 ),
6569 6574 # use string type, then we can check if something was passed
6570 6575 (
6571 6576 b'p',
6572 6577 b'port',
6573 6578 b'',
6574 6579 _(b'port to listen on (default: 8000)'),
6575 6580 _(b'PORT'),
6576 6581 ),
6577 6582 (
6578 6583 b'a',
6579 6584 b'address',
6580 6585 b'',
6581 6586 _(b'address to listen on (default: all interfaces)'),
6582 6587 _(b'ADDR'),
6583 6588 ),
6584 6589 (
6585 6590 b'',
6586 6591 b'prefix',
6587 6592 b'',
6588 6593 _(b'prefix path to serve from (default: server root)'),
6589 6594 _(b'PREFIX'),
6590 6595 ),
6591 6596 (
6592 6597 b'n',
6593 6598 b'name',
6594 6599 b'',
6595 6600 _(b'name to show in web pages (default: working directory)'),
6596 6601 _(b'NAME'),
6597 6602 ),
6598 6603 (
6599 6604 b'',
6600 6605 b'web-conf',
6601 6606 b'',
6602 6607 _(b"name of the hgweb config file (see 'hg help hgweb')"),
6603 6608 _(b'FILE'),
6604 6609 ),
6605 6610 (
6606 6611 b'',
6607 6612 b'webdir-conf',
6608 6613 b'',
6609 6614 _(b'name of the hgweb config file (DEPRECATED)'),
6610 6615 _(b'FILE'),
6611 6616 ),
6612 6617 (
6613 6618 b'',
6614 6619 b'pid-file',
6615 6620 b'',
6616 6621 _(b'name of file to write process ID to'),
6617 6622 _(b'FILE'),
6618 6623 ),
6619 6624 (b'', b'stdio', None, _(b'for remote clients (ADVANCED)')),
6620 6625 (
6621 6626 b'',
6622 6627 b'cmdserver',
6623 6628 b'',
6624 6629 _(b'for remote clients (ADVANCED)'),
6625 6630 _(b'MODE'),
6626 6631 ),
6627 6632 (b't', b'templates', b'', _(b'web templates to use'), _(b'TEMPLATE')),
6628 6633 (b'', b'style', b'', _(b'template style to use'), _(b'STYLE')),
6629 6634 (b'6', b'ipv6', None, _(b'use IPv6 instead of IPv4')),
6630 6635 (b'', b'certificate', b'', _(b'SSL certificate file'), _(b'FILE')),
6631 6636 (b'', b'print-url', None, _(b'start and print only the URL')),
6632 6637 ]
6633 6638 + subrepoopts,
6634 6639 _(b'[OPTION]...'),
6635 6640 helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
6636 6641 helpbasic=True,
6637 6642 optionalrepo=True,
6638 6643 )
6639 6644 def serve(ui, repo, **opts):
6640 6645 """start stand-alone webserver
6641 6646
6642 6647 Start a local HTTP repository browser and pull server. You can use
6643 6648 this for ad-hoc sharing and browsing of repositories. It is
6644 6649 recommended to use a real web server to serve a repository for
6645 6650 longer periods of time.
6646 6651
6647 6652 Please note that the server does not implement access control.
6648 6653 This means that, by default, anybody can read from the server and
6649 6654 nobody can write to it by default. Set the ``web.allow-push``
6650 6655 option to ``*`` to allow everybody to push to the server. You
6651 6656 should use a real web server if you need to authenticate users.
6652 6657
6653 6658 By default, the server logs accesses to stdout and errors to
6654 6659 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
6655 6660 files.
6656 6661
6657 6662 To have the server choose a free port number to listen on, specify
6658 6663 a port number of 0; in this case, the server will print the port
6659 6664 number it uses.
6660 6665
6661 6666 Returns 0 on success.
6662 6667 """
6663 6668
6664 6669 cmdutil.check_incompatible_arguments(opts, 'stdio', ['cmdserver'])
6665 6670 opts = pycompat.byteskwargs(opts)
6666 6671 if opts[b"print_url"] and ui.verbose:
6667 6672 raise error.InputError(_(b"cannot use --print-url with --verbose"))
6668 6673
6669 6674 if opts[b"stdio"]:
6670 6675 if repo is None:
6671 6676 raise error.RepoError(
6672 6677 _(b"there is no Mercurial repository here (.hg not found)")
6673 6678 )
6674 6679 accesshidden = False
6675 6680 if repo.filtername is None:
6676 6681 allow = ui.configlist(
6677 6682 b'experimental', b'server.allow-hidden-access'
6678 6683 )
6679 6684 user = procutil.getuser()
6680 6685 if allow and scmutil.ismember(ui, user, allow):
6681 6686 accesshidden = True
6682 6687 else:
6683 6688 msg = (
6684 6689 _(
6685 6690 b'ignoring request to access hidden changeset by '
6686 6691 b'unauthorized user: %s\n'
6687 6692 )
6688 6693 % user
6689 6694 )
6690 6695 ui.warn(msg)
6691 6696
6692 6697 s = wireprotoserver.sshserver(ui, repo, accesshidden=accesshidden)
6693 6698 s.serve_forever()
6694 6699 return
6695 6700
6696 6701 service = server.createservice(ui, repo, opts)
6697 6702 return server.runservice(opts, initfn=service.init, runfn=service.run)
6698 6703
6699 6704
6700 6705 @command(
6701 6706 b'shelve',
6702 6707 [
6703 6708 (
6704 6709 b'A',
6705 6710 b'addremove',
6706 6711 None,
6707 6712 _(b'mark new/missing files as added/removed before shelving'),
6708 6713 ),
6709 6714 (b'u', b'unknown', None, _(b'store unknown files in the shelve')),
6710 6715 (b'', b'cleanup', None, _(b'delete all shelved changes')),
6711 6716 (
6712 6717 b'',
6713 6718 b'date',
6714 6719 b'',
6715 6720 _(b'shelve with the specified commit date'),
6716 6721 _(b'DATE'),
6717 6722 ),
6718 6723 (b'd', b'delete', None, _(b'delete the named shelved change(s)')),
6719 6724 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
6720 6725 (
6721 6726 b'k',
6722 6727 b'keep',
6723 6728 False,
6724 6729 _(b'shelve, but keep changes in the working directory'),
6725 6730 ),
6726 6731 (b'l', b'list', None, _(b'list current shelves')),
6727 6732 (b'm', b'message', b'', _(b'use text as shelve message'), _(b'TEXT')),
6728 6733 (
6729 6734 b'n',
6730 6735 b'name',
6731 6736 b'',
6732 6737 _(b'use the given name for the shelved commit'),
6733 6738 _(b'NAME'),
6734 6739 ),
6735 6740 (
6736 6741 b'p',
6737 6742 b'patch',
6738 6743 None,
6739 6744 _(
6740 6745 b'output patches for changes (provide the names of the shelved '
6741 6746 b'changes as positional arguments)'
6742 6747 ),
6743 6748 ),
6744 6749 (b'i', b'interactive', None, _(b'interactive mode')),
6745 6750 (
6746 6751 b'',
6747 6752 b'stat',
6748 6753 None,
6749 6754 _(
6750 6755 b'output diffstat-style summary of changes (provide the names of '
6751 6756 b'the shelved changes as positional arguments)'
6752 6757 ),
6753 6758 ),
6754 6759 ]
6755 6760 + cmdutil.walkopts,
6756 6761 _(b'hg shelve [OPTION]... [FILE]...'),
6757 6762 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6758 6763 )
6759 6764 def shelve(ui, repo, *pats, **opts):
6760 6765 """save and set aside changes from the working directory
6761 6766
6762 6767 Shelving takes files that "hg status" reports as not clean, saves
6763 6768 the modifications to a bundle (a shelved change), and reverts the
6764 6769 files so that their state in the working directory becomes clean.
6765 6770
6766 6771 To restore these changes to the working directory, using "hg
6767 6772 unshelve"; this will work even if you switch to a different
6768 6773 commit.
6769 6774
6770 6775 When no files are specified, "hg shelve" saves all not-clean
6771 6776 files. If specific files or directories are named, only changes to
6772 6777 those files are shelved.
6773 6778
6774 6779 In bare shelve (when no files are specified, without interactive,
6775 6780 include and exclude option), shelving remembers information if the
6776 6781 working directory was on newly created branch, in other words working
6777 6782 directory was on different branch than its first parent. In this
6778 6783 situation unshelving restores branch information to the working directory.
6779 6784
6780 6785 Each shelved change has a name that makes it easier to find later.
6781 6786 The name of a shelved change defaults to being based on the active
6782 6787 bookmark, or if there is no active bookmark, the current named
6783 6788 branch. To specify a different name, use ``--name``.
6784 6789
6785 6790 To see a list of existing shelved changes, use the ``--list``
6786 6791 option. For each shelved change, this will print its name, age,
6787 6792 and description; use ``--patch`` or ``--stat`` for more details.
6788 6793
6789 6794 To delete specific shelved changes, use ``--delete``. To delete
6790 6795 all shelved changes, use ``--cleanup``.
6791 6796 """
6792 6797 opts = pycompat.byteskwargs(opts)
6793 6798 allowables = [
6794 6799 (b'addremove', {b'create'}), # 'create' is pseudo action
6795 6800 (b'unknown', {b'create'}),
6796 6801 (b'cleanup', {b'cleanup'}),
6797 6802 # ('date', {'create'}), # ignored for passing '--date "0 0"' in tests
6798 6803 (b'delete', {b'delete'}),
6799 6804 (b'edit', {b'create'}),
6800 6805 (b'keep', {b'create'}),
6801 6806 (b'list', {b'list'}),
6802 6807 (b'message', {b'create'}),
6803 6808 (b'name', {b'create'}),
6804 6809 (b'patch', {b'patch', b'list'}),
6805 6810 (b'stat', {b'stat', b'list'}),
6806 6811 ]
6807 6812
6808 6813 def checkopt(opt):
6809 6814 if opts.get(opt):
6810 6815 for i, allowable in allowables:
6811 6816 if opts[i] and opt not in allowable:
6812 6817 raise error.InputError(
6813 6818 _(
6814 6819 b"options '--%s' and '--%s' may not be "
6815 6820 b"used together"
6816 6821 )
6817 6822 % (opt, i)
6818 6823 )
6819 6824 return True
6820 6825
6821 6826 if checkopt(b'cleanup'):
6822 6827 if pats:
6823 6828 raise error.InputError(
6824 6829 _(b"cannot specify names when using '--cleanup'")
6825 6830 )
6826 6831 return shelvemod.cleanupcmd(ui, repo)
6827 6832 elif checkopt(b'delete'):
6828 6833 return shelvemod.deletecmd(ui, repo, pats)
6829 6834 elif checkopt(b'list'):
6830 6835 return shelvemod.listcmd(ui, repo, pats, opts)
6831 6836 elif checkopt(b'patch') or checkopt(b'stat'):
6832 6837 return shelvemod.patchcmds(ui, repo, pats, opts)
6833 6838 else:
6834 6839 return shelvemod.createcmd(ui, repo, pats, opts)
6835 6840
6836 6841
6837 6842 _NOTTERSE = b'nothing'
6838 6843
6839 6844
6840 6845 @command(
6841 6846 b'status|st',
6842 6847 [
6843 6848 (b'A', b'all', None, _(b'show status of all files')),
6844 6849 (b'm', b'modified', None, _(b'show only modified files')),
6845 6850 (b'a', b'added', None, _(b'show only added files')),
6846 6851 (b'r', b'removed', None, _(b'show only removed files')),
6847 6852 (b'd', b'deleted', None, _(b'show only missing files')),
6848 6853 (b'c', b'clean', None, _(b'show only files without changes')),
6849 6854 (b'u', b'unknown', None, _(b'show only unknown (not tracked) files')),
6850 6855 (b'i', b'ignored', None, _(b'show only ignored files')),
6851 6856 (b'n', b'no-status', None, _(b'hide status prefix')),
6852 6857 (b't', b'terse', _NOTTERSE, _(b'show the terse output (EXPERIMENTAL)')),
6853 6858 (
6854 6859 b'C',
6855 6860 b'copies',
6856 6861 None,
6857 6862 _(b'show source of copied files (DEFAULT: ui.statuscopies)'),
6858 6863 ),
6859 6864 (
6860 6865 b'0',
6861 6866 b'print0',
6862 6867 None,
6863 6868 _(b'end filenames with NUL, for use with xargs'),
6864 6869 ),
6865 6870 (b'', b'rev', [], _(b'show difference from revision'), _(b'REV')),
6866 6871 (
6867 6872 b'',
6868 6873 b'change',
6869 6874 b'',
6870 6875 _(b'list the changed files of a revision'),
6871 6876 _(b'REV'),
6872 6877 ),
6873 6878 ]
6874 6879 + walkopts
6875 6880 + subrepoopts
6876 6881 + formatteropts,
6877 6882 _(b'[OPTION]... [FILE]...'),
6878 6883 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
6879 6884 helpbasic=True,
6880 6885 inferrepo=True,
6881 6886 intents={INTENT_READONLY},
6882 6887 )
6883 6888 def status(ui, repo, *pats, **opts):
6884 6889 """show changed files in the working directory
6885 6890
6886 6891 Show status of files in the repository. If names are given, only
6887 6892 files that match are shown. Files that are clean or ignored or
6888 6893 the source of a copy/move operation, are not listed unless
6889 6894 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
6890 6895 Unless options described with "show only ..." are given, the
6891 6896 options -mardu are used.
6892 6897
6893 6898 Option -q/--quiet hides untracked (unknown and ignored) files
6894 6899 unless explicitly requested with -u/--unknown or -i/--ignored.
6895 6900
6896 6901 .. note::
6897 6902
6898 6903 :hg:`status` may appear to disagree with diff if permissions have
6899 6904 changed or a merge has occurred. The standard diff format does
6900 6905 not report permission changes and diff only reports changes
6901 6906 relative to one merge parent.
6902 6907
6903 6908 If one revision is given, it is used as the base revision.
6904 6909 If two revisions are given, the differences between them are
6905 6910 shown. The --change option can also be used as a shortcut to list
6906 6911 the changed files of a revision from its first parent.
6907 6912
6908 6913 The codes used to show the status of files are::
6909 6914
6910 6915 M = modified
6911 6916 A = added
6912 6917 R = removed
6913 6918 C = clean
6914 6919 ! = missing (deleted by non-hg command, but still tracked)
6915 6920 ? = not tracked
6916 6921 I = ignored
6917 6922 = origin of the previous file (with --copies)
6918 6923
6919 6924 .. container:: verbose
6920 6925
6921 6926 The -t/--terse option abbreviates the output by showing only the directory
6922 6927 name if all the files in it share the same status. The option takes an
6923 6928 argument indicating the statuses to abbreviate: 'm' for 'modified', 'a'
6924 6929 for 'added', 'r' for 'removed', 'd' for 'deleted', 'u' for 'unknown', 'i'
6925 6930 for 'ignored' and 'c' for clean.
6926 6931
6927 6932 It abbreviates only those statuses which are passed. Note that clean and
6928 6933 ignored files are not displayed with '--terse ic' unless the -c/--clean
6929 6934 and -i/--ignored options are also used.
6930 6935
6931 6936 The -v/--verbose option shows information when the repository is in an
6932 6937 unfinished merge, shelve, rebase state etc. You can have this behavior
6933 6938 turned on by default by enabling the ``commands.status.verbose`` option.
6934 6939
6935 6940 You can skip displaying some of these states by setting
6936 6941 ``commands.status.skipstates`` to one or more of: 'bisect', 'graft',
6937 6942 'histedit', 'merge', 'rebase', or 'unshelve'.
6938 6943
6939 6944 Template:
6940 6945
6941 6946 The following keywords are supported in addition to the common template
6942 6947 keywords and functions. See also :hg:`help templates`.
6943 6948
6944 6949 :path: String. Repository-absolute path of the file.
6945 6950 :source: String. Repository-absolute path of the file originated from.
6946 6951 Available if ``--copies`` is specified.
6947 6952 :status: String. Character denoting file's status.
6948 6953
6949 6954 Examples:
6950 6955
6951 6956 - show changes in the working directory relative to a
6952 6957 changeset::
6953 6958
6954 6959 hg status --rev 9353
6955 6960
6956 6961 - show changes in the working directory relative to the
6957 6962 current directory (see :hg:`help patterns` for more information)::
6958 6963
6959 6964 hg status re:
6960 6965
6961 6966 - show all changes including copies in an existing changeset::
6962 6967
6963 6968 hg status --copies --change 9353
6964 6969
6965 6970 - get a NUL separated list of added files, suitable for xargs::
6966 6971
6967 6972 hg status -an0
6968 6973
6969 6974 - show more information about the repository status, abbreviating
6970 6975 added, removed, modified, deleted, and untracked paths::
6971 6976
6972 6977 hg status -v -t mardu
6973 6978
6974 6979 Returns 0 on success.
6975 6980
6976 6981 """
6977 6982
6978 6983 cmdutil.check_at_most_one_arg(opts, 'rev', 'change')
6979 6984 opts = pycompat.byteskwargs(opts)
6980 6985 revs = opts.get(b'rev', [])
6981 6986 change = opts.get(b'change', b'')
6982 6987 terse = opts.get(b'terse', _NOTTERSE)
6983 6988 if terse is _NOTTERSE:
6984 6989 if revs:
6985 6990 terse = b''
6986 6991 else:
6987 6992 terse = ui.config(b'commands', b'status.terse')
6988 6993
6989 6994 if revs and terse:
6990 6995 msg = _(b'cannot use --terse with --rev')
6991 6996 raise error.InputError(msg)
6992 6997 elif change:
6993 6998 repo = scmutil.unhidehashlikerevs(repo, [change], b'nowarn')
6994 6999 ctx2 = logcmdutil.revsingle(repo, change, None)
6995 7000 ctx1 = ctx2.p1()
6996 7001 else:
6997 7002 repo = scmutil.unhidehashlikerevs(repo, revs, b'nowarn')
6998 7003 ctx1, ctx2 = logcmdutil.revpair(repo, revs)
6999 7004
7000 7005 forcerelativevalue = None
7001 7006 if ui.hasconfig(b'commands', b'status.relative'):
7002 7007 forcerelativevalue = ui.configbool(b'commands', b'status.relative')
7003 7008 uipathfn = scmutil.getuipathfn(
7004 7009 repo,
7005 7010 legacyrelativevalue=bool(pats),
7006 7011 forcerelativevalue=forcerelativevalue,
7007 7012 )
7008 7013
7009 7014 if opts.get(b'print0'):
7010 7015 end = b'\0'
7011 7016 else:
7012 7017 end = b'\n'
7013 7018 states = b'modified added removed deleted unknown ignored clean'.split()
7014 7019 show = [k for k in states if opts.get(k)]
7015 7020 if opts.get(b'all'):
7016 7021 show += ui.quiet and (states[:4] + [b'clean']) or states
7017 7022
7018 7023 if not show:
7019 7024 if ui.quiet:
7020 7025 show = states[:4]
7021 7026 else:
7022 7027 show = states[:5]
7023 7028
7024 7029 m = scmutil.match(ctx2, pats, opts)
7025 7030 if terse:
7026 7031 # we need to compute clean and unknown to terse
7027 7032 stat = repo.status(
7028 7033 ctx1.node(),
7029 7034 ctx2.node(),
7030 7035 m,
7031 7036 b'ignored' in show or b'i' in terse,
7032 7037 clean=True,
7033 7038 unknown=True,
7034 7039 listsubrepos=opts.get(b'subrepos'),
7035 7040 )
7036 7041
7037 7042 stat = cmdutil.tersedir(stat, terse)
7038 7043 else:
7039 7044 stat = repo.status(
7040 7045 ctx1.node(),
7041 7046 ctx2.node(),
7042 7047 m,
7043 7048 b'ignored' in show,
7044 7049 b'clean' in show,
7045 7050 b'unknown' in show,
7046 7051 opts.get(b'subrepos'),
7047 7052 )
7048 7053
7049 7054 changestates = zip(
7050 7055 states,
7051 7056 pycompat.iterbytestr(b'MAR!?IC'),
7052 7057 [getattr(stat, s.decode('utf8')) for s in states],
7053 7058 )
7054 7059
7055 7060 copy = {}
7056 7061 show_copies = ui.configbool(b'ui', b'statuscopies')
7057 7062 if opts.get(b'copies') is not None:
7058 7063 show_copies = opts.get(b'copies')
7059 7064 show_copies = (show_copies or opts.get(b'all')) and not opts.get(
7060 7065 b'no_status'
7061 7066 )
7062 7067 if show_copies:
7063 7068 copy = copies.pathcopies(ctx1, ctx2, m)
7064 7069
7065 7070 morestatus = None
7066 7071 if (
7067 7072 (ui.verbose or ui.configbool(b'commands', b'status.verbose'))
7068 7073 and not ui.plain()
7069 7074 and not opts.get(b'print0')
7070 7075 ):
7071 7076 morestatus = cmdutil.readmorestatus(repo)
7072 7077
7073 7078 ui.pager(b'status')
7074 7079 fm = ui.formatter(b'status', opts)
7075 7080 fmt = b'%s' + end
7076 7081 showchar = not opts.get(b'no_status')
7077 7082
7078 7083 for state, char, files in changestates:
7079 7084 if state in show:
7080 7085 label = b'status.' + state
7081 7086 for f in files:
7082 7087 fm.startitem()
7083 7088 fm.context(ctx=ctx2)
7084 7089 fm.data(itemtype=b'file', path=f)
7085 7090 fm.condwrite(showchar, b'status', b'%s ', char, label=label)
7086 7091 fm.plain(fmt % uipathfn(f), label=label)
7087 7092 if f in copy:
7088 7093 fm.data(source=copy[f])
7089 7094 fm.plain(
7090 7095 (b' %s' + end) % uipathfn(copy[f]),
7091 7096 label=b'status.copied',
7092 7097 )
7093 7098 if morestatus:
7094 7099 morestatus.formatfile(f, fm)
7095 7100
7096 7101 if morestatus:
7097 7102 morestatus.formatfooter(fm)
7098 7103 fm.end()
7099 7104
7100 7105
7101 7106 @command(
7102 7107 b'summary|sum',
7103 7108 [(b'', b'remote', None, _(b'check for push and pull'))],
7104 7109 b'[--remote]',
7105 7110 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7106 7111 helpbasic=True,
7107 7112 intents={INTENT_READONLY},
7108 7113 )
7109 7114 def summary(ui, repo, **opts):
7110 7115 """summarize working directory state
7111 7116
7112 7117 This generates a brief summary of the working directory state,
7113 7118 including parents, branch, commit status, phase and available updates.
7114 7119
7115 7120 With the --remote option, this will check the default paths for
7116 7121 incoming and outgoing changes. This can be time-consuming.
7117 7122
7118 7123 Returns 0 on success.
7119 7124 """
7120 7125
7121 7126 ui.pager(b'summary')
7122 7127 ctx = repo[None]
7123 7128 parents = ctx.parents()
7124 7129 pnode = parents[0].node()
7125 7130 marks = []
7126 7131
7127 7132 try:
7128 7133 ms = mergestatemod.mergestate.read(repo)
7129 7134 except error.UnsupportedMergeRecords as e:
7130 7135 s = b' '.join(e.recordtypes)
7131 7136 ui.warn(
7132 7137 _(b'warning: merge state has unsupported record types: %s\n') % s
7133 7138 )
7134 7139 unresolved = []
7135 7140 else:
7136 7141 unresolved = list(ms.unresolved())
7137 7142
7138 7143 for p in parents:
7139 7144 # label with log.changeset (instead of log.parent) since this
7140 7145 # shows a working directory parent *changeset*:
7141 7146 # i18n: column positioning for "hg summary"
7142 7147 ui.write(
7143 7148 _(b'parent: %d:%s ') % (p.rev(), p),
7144 7149 label=logcmdutil.changesetlabels(p),
7145 7150 )
7146 7151 ui.write(b' '.join(p.tags()), label=b'log.tag')
7147 7152 if p.bookmarks():
7148 7153 marks.extend(p.bookmarks())
7149 7154 if p.rev() == -1:
7150 7155 if not len(repo):
7151 7156 ui.write(_(b' (empty repository)'))
7152 7157 else:
7153 7158 ui.write(_(b' (no revision checked out)'))
7154 7159 if p.obsolete():
7155 7160 ui.write(_(b' (obsolete)'))
7156 7161 if p.isunstable():
7157 7162 instabilities = (
7158 7163 ui.label(instability, b'trouble.%s' % instability)
7159 7164 for instability in p.instabilities()
7160 7165 )
7161 7166 ui.write(b' (' + b', '.join(instabilities) + b')')
7162 7167 ui.write(b'\n')
7163 7168 if p.description():
7164 7169 ui.status(
7165 7170 b' ' + p.description().splitlines()[0].strip() + b'\n',
7166 7171 label=b'log.summary',
7167 7172 )
7168 7173
7169 7174 branch = ctx.branch()
7170 7175 bheads = repo.branchheads(branch)
7171 7176 # i18n: column positioning for "hg summary"
7172 7177 m = _(b'branch: %s\n') % branch
7173 7178 if branch != b'default':
7174 7179 ui.write(m, label=b'log.branch')
7175 7180 else:
7176 7181 ui.status(m, label=b'log.branch')
7177 7182
7178 7183 if marks:
7179 7184 active = repo._activebookmark
7180 7185 # i18n: column positioning for "hg summary"
7181 7186 ui.write(_(b'bookmarks:'), label=b'log.bookmark')
7182 7187 if active is not None:
7183 7188 if active in marks:
7184 7189 ui.write(b' *' + active, label=bookmarks.activebookmarklabel)
7185 7190 marks.remove(active)
7186 7191 else:
7187 7192 ui.write(b' [%s]' % active, label=bookmarks.activebookmarklabel)
7188 7193 for m in marks:
7189 7194 ui.write(b' ' + m, label=b'log.bookmark')
7190 7195 ui.write(b'\n', label=b'log.bookmark')
7191 7196
7192 7197 status = repo.status(unknown=True)
7193 7198
7194 7199 c = repo.dirstate.copies()
7195 7200 copied, renamed = [], []
7196 7201 for d, s in c.items():
7197 7202 if s in status.removed:
7198 7203 status.removed.remove(s)
7199 7204 renamed.append(d)
7200 7205 else:
7201 7206 copied.append(d)
7202 7207 if d in status.added:
7203 7208 status.added.remove(d)
7204 7209
7205 7210 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
7206 7211
7207 7212 labels = [
7208 7213 (ui.label(_(b'%d modified'), b'status.modified'), status.modified),
7209 7214 (ui.label(_(b'%d added'), b'status.added'), status.added),
7210 7215 (ui.label(_(b'%d removed'), b'status.removed'), status.removed),
7211 7216 (ui.label(_(b'%d renamed'), b'status.copied'), renamed),
7212 7217 (ui.label(_(b'%d copied'), b'status.copied'), copied),
7213 7218 (ui.label(_(b'%d deleted'), b'status.deleted'), status.deleted),
7214 7219 (ui.label(_(b'%d unknown'), b'status.unknown'), status.unknown),
7215 7220 (ui.label(_(b'%d unresolved'), b'resolve.unresolved'), unresolved),
7216 7221 (ui.label(_(b'%d subrepos'), b'status.modified'), subs),
7217 7222 ]
7218 7223 t = []
7219 7224 for l, s in labels:
7220 7225 if s:
7221 7226 t.append(l % len(s))
7222 7227
7223 7228 t = b', '.join(t)
7224 7229 cleanworkdir = False
7225 7230
7226 7231 if repo.vfs.exists(b'graftstate'):
7227 7232 t += _(b' (graft in progress)')
7228 7233 if repo.vfs.exists(b'updatestate'):
7229 7234 t += _(b' (interrupted update)')
7230 7235 elif len(parents) > 1:
7231 7236 t += _(b' (merge)')
7232 7237 elif branch != parents[0].branch():
7233 7238 t += _(b' (new branch)')
7234 7239 elif parents[0].closesbranch() and pnode in repo.branchheads(
7235 7240 branch, closed=True
7236 7241 ):
7237 7242 t += _(b' (head closed)')
7238 7243 elif not (
7239 7244 status.modified
7240 7245 or status.added
7241 7246 or status.removed
7242 7247 or renamed
7243 7248 or copied
7244 7249 or subs
7245 7250 ):
7246 7251 t += _(b' (clean)')
7247 7252 cleanworkdir = True
7248 7253 elif pnode not in bheads:
7249 7254 t += _(b' (new branch head)')
7250 7255
7251 7256 if parents:
7252 7257 pendingphase = max(p.phase() for p in parents)
7253 7258 else:
7254 7259 pendingphase = phases.public
7255 7260
7256 7261 if pendingphase > phases.newcommitphase(ui):
7257 7262 t += b' (%s)' % phases.phasenames[pendingphase]
7258 7263
7259 7264 if cleanworkdir:
7260 7265 # i18n: column positioning for "hg summary"
7261 7266 ui.status(_(b'commit: %s\n') % t.strip())
7262 7267 else:
7263 7268 # i18n: column positioning for "hg summary"
7264 7269 ui.write(_(b'commit: %s\n') % t.strip())
7265 7270
7266 7271 # all ancestors of branch heads - all ancestors of parent = new csets
7267 7272 new = len(
7268 7273 repo.changelog.findmissing([pctx.node() for pctx in parents], bheads)
7269 7274 )
7270 7275
7271 7276 if new == 0:
7272 7277 # i18n: column positioning for "hg summary"
7273 7278 ui.status(_(b'update: (current)\n'))
7274 7279 elif pnode not in bheads:
7275 7280 # i18n: column positioning for "hg summary"
7276 7281 ui.write(_(b'update: %d new changesets (update)\n') % new)
7277 7282 else:
7278 7283 # i18n: column positioning for "hg summary"
7279 7284 ui.write(
7280 7285 _(b'update: %d new changesets, %d branch heads (merge)\n')
7281 7286 % (new, len(bheads))
7282 7287 )
7283 7288
7284 7289 t = []
7285 7290 draft = len(repo.revs(b'draft()'))
7286 7291 if draft:
7287 7292 t.append(_(b'%d draft') % draft)
7288 7293 secret = len(repo.revs(b'secret()'))
7289 7294 if secret:
7290 7295 t.append(_(b'%d secret') % secret)
7291 7296
7292 7297 if draft or secret:
7293 7298 ui.status(_(b'phases: %s\n') % b', '.join(t))
7294 7299
7295 7300 if obsolete.isenabled(repo, obsolete.createmarkersopt):
7296 7301 for trouble in (b"orphan", b"contentdivergent", b"phasedivergent"):
7297 7302 numtrouble = len(repo.revs(trouble + b"()"))
7298 7303 # We write all the possibilities to ease translation
7299 7304 troublemsg = {
7300 7305 b"orphan": _(b"orphan: %d changesets"),
7301 7306 b"contentdivergent": _(b"content-divergent: %d changesets"),
7302 7307 b"phasedivergent": _(b"phase-divergent: %d changesets"),
7303 7308 }
7304 7309 if numtrouble > 0:
7305 7310 ui.status(troublemsg[trouble] % numtrouble + b"\n")
7306 7311
7307 7312 cmdutil.summaryhooks(ui, repo)
7308 7313
7309 7314 if opts.get('remote'):
7310 7315 needsincoming, needsoutgoing = True, True
7311 7316 else:
7312 7317 needsincoming, needsoutgoing = False, False
7313 7318 for i, o in cmdutil.summaryremotehooks(
7314 7319 ui, repo, pycompat.byteskwargs(opts), None
7315 7320 ):
7316 7321 if i:
7317 7322 needsincoming = True
7318 7323 if o:
7319 7324 needsoutgoing = True
7320 7325 if not needsincoming and not needsoutgoing:
7321 7326 return
7322 7327
7323 7328 def getincoming():
7324 7329 # XXX We should actually skip this if no default is specified, instead
7325 7330 # of passing "default" which will resolve as "./default/" if no default
7326 7331 # path is defined.
7327 7332 path = urlutil.get_unique_pull_path_obj(b'summary', ui, b'default')
7328 7333 sbranch = path.branch
7329 7334 try:
7330 7335 other = hg.peer(repo, {}, path)
7331 7336 except error.RepoError:
7332 7337 if opts.get('remote'):
7333 7338 raise
7334 7339 return path.loc, sbranch, None, None, None
7335 7340 branches = (path.branch, [])
7336 7341 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
7337 7342 if revs:
7338 7343 revs = [other.lookup(rev) for rev in revs]
7339 7344 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(path.loc))
7340 7345 with repo.ui.silent():
7341 7346 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
7342 7347 return path.loc, sbranch, other, commoninc, commoninc[1]
7343 7348
7344 7349 if needsincoming:
7345 7350 source, sbranch, sother, commoninc, incoming = getincoming()
7346 7351 else:
7347 7352 source = sbranch = sother = commoninc = incoming = None
7348 7353
7349 7354 def getoutgoing():
7350 7355 # XXX We should actually skip this if no default is specified, instead
7351 7356 # of passing "default" which will resolve as "./default/" if no default
7352 7357 # path is defined.
7353 7358 d = None
7354 7359 if b'default-push' in ui.paths:
7355 7360 d = b'default-push'
7356 7361 elif b'default' in ui.paths:
7357 7362 d = b'default'
7358 7363 path = None
7359 7364 if d is not None:
7360 7365 path = urlutil.get_unique_push_path(b'summary', repo, ui, d)
7361 7366 dest = path.loc
7362 7367 dbranch = path.branch
7363 7368 else:
7364 7369 dest = b'default'
7365 7370 dbranch = None
7366 7371 revs, checkout = hg.addbranchrevs(repo, repo, (dbranch, []), None)
7367 7372 if source != dest:
7368 7373 try:
7369 7374 dother = hg.peer(repo, {}, path if path is not None else dest)
7370 7375 except error.RepoError:
7371 7376 if opts.get('remote'):
7372 7377 raise
7373 7378 return dest, dbranch, None, None
7374 7379 ui.debug(b'comparing with %s\n' % urlutil.hidepassword(dest))
7375 7380 elif sother is None:
7376 7381 # there is no explicit destination peer, but source one is invalid
7377 7382 return dest, dbranch, None, None
7378 7383 else:
7379 7384 dother = sother
7380 7385 if source != dest or (sbranch is not None and sbranch != dbranch):
7381 7386 common = None
7382 7387 else:
7383 7388 common = commoninc
7384 7389 if revs:
7385 7390 revs = [repo.lookup(rev) for rev in revs]
7386 7391 with repo.ui.silent():
7387 7392 outgoing = discovery.findcommonoutgoing(
7388 7393 repo, dother, onlyheads=revs, commoninc=common
7389 7394 )
7390 7395 return dest, dbranch, dother, outgoing
7391 7396
7392 7397 if needsoutgoing:
7393 7398 dest, dbranch, dother, outgoing = getoutgoing()
7394 7399 else:
7395 7400 dest = dbranch = dother = outgoing = None
7396 7401
7397 7402 if opts.get('remote'):
7398 7403 # Help pytype. --remote sets both `needsincoming` and `needsoutgoing`.
7399 7404 # The former always sets `sother` (or raises an exception if it can't);
7400 7405 # the latter always sets `outgoing`.
7401 7406 assert sother is not None
7402 7407 assert outgoing is not None
7403 7408
7404 7409 t = []
7405 7410 if incoming:
7406 7411 t.append(_(b'1 or more incoming'))
7407 7412 o = outgoing.missing
7408 7413 if o:
7409 7414 t.append(_(b'%d outgoing') % len(o))
7410 7415 other = dother or sother
7411 7416 if b'bookmarks' in other.listkeys(b'namespaces'):
7412 7417 counts = bookmarks.summary(repo, other)
7413 7418 if counts[0] > 0:
7414 7419 t.append(_(b'%d incoming bookmarks') % counts[0])
7415 7420 if counts[1] > 0:
7416 7421 t.append(_(b'%d outgoing bookmarks') % counts[1])
7417 7422
7418 7423 if t:
7419 7424 # i18n: column positioning for "hg summary"
7420 7425 ui.write(_(b'remote: %s\n') % (b', '.join(t)))
7421 7426 else:
7422 7427 # i18n: column positioning for "hg summary"
7423 7428 ui.status(_(b'remote: (synced)\n'))
7424 7429
7425 7430 cmdutil.summaryremotehooks(
7426 7431 ui,
7427 7432 repo,
7428 7433 pycompat.byteskwargs(opts),
7429 7434 (
7430 7435 (source, sbranch, sother, commoninc),
7431 7436 (dest, dbranch, dother, outgoing),
7432 7437 ),
7433 7438 )
7434 7439
7435 7440
7436 7441 @command(
7437 7442 b'tag',
7438 7443 [
7439 7444 (b'f', b'force', None, _(b'force tag')),
7440 7445 (b'l', b'local', None, _(b'make the tag local')),
7441 7446 (b'r', b'rev', b'', _(b'revision to tag'), _(b'REV')),
7442 7447 (b'', b'remove', None, _(b'remove a tag')),
7443 7448 # -l/--local is already there, commitopts cannot be used
7444 7449 (b'e', b'edit', None, _(b'invoke editor on commit messages')),
7445 7450 (b'm', b'message', b'', _(b'use text as commit message'), _(b'TEXT')),
7446 7451 ]
7447 7452 + commitopts2,
7448 7453 _(b'[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'),
7449 7454 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7450 7455 )
7451 7456 def tag(ui, repo, name1, *names, **opts):
7452 7457 """add one or more tags for the current or given revision
7453 7458
7454 7459 Name a particular revision using <name>.
7455 7460
7456 7461 Tags are used to name particular revisions of the repository and are
7457 7462 very useful to compare different revisions, to go back to significant
7458 7463 earlier versions or to mark branch points as releases, etc. Changing
7459 7464 an existing tag is normally disallowed; use -f/--force to override.
7460 7465
7461 7466 If no revision is given, the parent of the working directory is
7462 7467 used.
7463 7468
7464 7469 To facilitate version control, distribution, and merging of tags,
7465 7470 they are stored as a file named ".hgtags" which is managed similarly
7466 7471 to other project files and can be hand-edited if necessary. This
7467 7472 also means that tagging creates a new commit. The file
7468 7473 ".hg/localtags" is used for local tags (not shared among
7469 7474 repositories).
7470 7475
7471 7476 Tag commits are usually made at the head of a branch. If the parent
7472 7477 of the working directory is not a branch head, :hg:`tag` aborts; use
7473 7478 -f/--force to force the tag commit to be based on a non-head
7474 7479 changeset.
7475 7480
7476 7481 See :hg:`help dates` for a list of formats valid for -d/--date.
7477 7482
7478 7483 Since tag names have priority over branch names during revision
7479 7484 lookup, using an existing branch name as a tag name is discouraged.
7480 7485
7481 7486 Returns 0 on success.
7482 7487 """
7483 7488 cmdutil.check_incompatible_arguments(opts, 'remove', ['rev'])
7484 7489
7485 7490 with repo.wlock(), repo.lock():
7486 7491 rev_ = b"."
7487 7492 names = [t.strip() for t in (name1,) + names]
7488 7493 if len(names) != len(set(names)):
7489 7494 raise error.InputError(_(b'tag names must be unique'))
7490 7495 for n in names:
7491 7496 scmutil.checknewlabel(repo, n, b'tag')
7492 7497 if not n:
7493 7498 raise error.InputError(
7494 7499 _(b'tag names cannot consist entirely of whitespace')
7495 7500 )
7496 7501 if opts.get('rev'):
7497 7502 rev_ = opts['rev']
7498 7503 message = opts.get('message')
7499 7504 if opts.get('remove'):
7500 7505 if opts.get('local'):
7501 7506 expectedtype = b'local'
7502 7507 else:
7503 7508 expectedtype = b'global'
7504 7509
7505 7510 for n in names:
7506 7511 if repo.tagtype(n) == b'global':
7507 7512 alltags = tagsmod.findglobaltags(ui, repo)
7508 7513 if alltags[n][0] == repo.nullid:
7509 7514 raise error.InputError(
7510 7515 _(b"tag '%s' is already removed") % n
7511 7516 )
7512 7517 if not repo.tagtype(n):
7513 7518 raise error.InputError(_(b"tag '%s' does not exist") % n)
7514 7519 if repo.tagtype(n) != expectedtype:
7515 7520 if expectedtype == b'global':
7516 7521 raise error.InputError(
7517 7522 _(b"tag '%s' is not a global tag") % n
7518 7523 )
7519 7524 else:
7520 7525 raise error.InputError(
7521 7526 _(b"tag '%s' is not a local tag") % n
7522 7527 )
7523 7528 rev_ = b'null'
7524 7529 if not message:
7525 7530 # we don't translate commit messages
7526 7531 message = b'Removed tag %s' % b', '.join(names)
7527 7532 elif not opts.get('force'):
7528 7533 for n in names:
7529 7534 if n in repo.tags():
7530 7535 raise error.InputError(
7531 7536 _(b"tag '%s' already exists (use -f to force)") % n
7532 7537 )
7533 7538 if not opts.get('local'):
7534 7539 p1, p2 = repo.dirstate.parents()
7535 7540 if p2 != repo.nullid:
7536 7541 raise error.StateError(_(b'uncommitted merge'))
7537 7542 bheads = repo.branchheads()
7538 7543 if not opts.get('force') and bheads and p1 not in bheads:
7539 7544 raise error.InputError(
7540 7545 _(
7541 7546 b'working directory is not at a branch head '
7542 7547 b'(use -f to force)'
7543 7548 )
7544 7549 )
7545 7550 node = logcmdutil.revsingle(repo, rev_).node()
7546 7551
7547 7552 # don't allow tagging the null rev or the working directory
7548 7553 if node is None:
7549 7554 raise error.InputError(_(b"cannot tag working directory"))
7550 7555 elif not opts.get('remove') and node == nullid:
7551 7556 raise error.InputError(_(b"cannot tag null revision"))
7552 7557
7553 7558 if not message:
7554 7559 # we don't translate commit messages
7555 7560 message = b'Added tag %s for changeset %s' % (
7556 7561 b', '.join(names),
7557 7562 short(node),
7558 7563 )
7559 7564
7560 7565 date = opts.get('date')
7561 7566 if date:
7562 7567 date = dateutil.parsedate(date)
7563 7568
7564 7569 if opts.get('remove'):
7565 7570 editform = b'tag.remove'
7566 7571 else:
7567 7572 editform = b'tag.add'
7568 7573 editor = cmdutil.getcommiteditor(editform=editform, **opts)
7569 7574
7570 7575 tagsmod.tag(
7571 7576 repo,
7572 7577 names,
7573 7578 node,
7574 7579 message,
7575 7580 opts.get('local'),
7576 7581 opts.get('user'),
7577 7582 date,
7578 7583 editor=editor,
7579 7584 )
7580 7585
7581 7586
7582 7587 @command(
7583 7588 b'tags',
7584 7589 formatteropts,
7585 7590 b'',
7586 7591 helpcategory=command.CATEGORY_CHANGE_ORGANIZATION,
7587 7592 intents={INTENT_READONLY},
7588 7593 )
7589 7594 def tags(ui, repo, **opts):
7590 7595 """list repository tags
7591 7596
7592 7597 This lists both regular and local tags. When the -v/--verbose
7593 7598 switch is used, a third column "local" is printed for local tags.
7594 7599 When the -q/--quiet switch is used, only the tag name is printed.
7595 7600
7596 7601 .. container:: verbose
7597 7602
7598 7603 Template:
7599 7604
7600 7605 The following keywords are supported in addition to the common template
7601 7606 keywords and functions such as ``{tag}``. See also
7602 7607 :hg:`help templates`.
7603 7608
7604 7609 :type: String. ``local`` for local tags.
7605 7610
7606 7611 Returns 0 on success.
7607 7612 """
7608 7613
7609 7614 ui.pager(b'tags')
7610 7615 fm = ui.formatter(b'tags', pycompat.byteskwargs(opts))
7611 7616 hexfunc = fm.hexfunc
7612 7617
7613 7618 for t, n in reversed(repo.tagslist()):
7614 7619 hn = hexfunc(n)
7615 7620 label = b'tags.normal'
7616 7621 tagtype = repo.tagtype(t)
7617 7622 if not tagtype or tagtype == b'global':
7618 7623 tagtype = b''
7619 7624 else:
7620 7625 label = b'tags.' + tagtype
7621 7626
7622 7627 fm.startitem()
7623 7628 fm.context(repo=repo)
7624 7629 fm.write(b'tag', b'%s', t, label=label)
7625 7630 fmt = b" " * (30 - encoding.colwidth(t)) + b' %5d:%s'
7626 7631 fm.condwrite(
7627 7632 not ui.quiet,
7628 7633 b'rev node',
7629 7634 fmt,
7630 7635 repo.changelog.rev(n),
7631 7636 hn,
7632 7637 label=label,
7633 7638 )
7634 7639 fm.condwrite(
7635 7640 ui.verbose and tagtype, b'type', b' %s', tagtype, label=label
7636 7641 )
7637 7642 fm.plain(b'\n')
7638 7643 fm.end()
7639 7644
7640 7645
7641 7646 @command(
7642 7647 b'tip',
7643 7648 [
7644 7649 (b'p', b'patch', None, _(b'show patch')),
7645 7650 (b'g', b'git', None, _(b'use git extended diff format')),
7646 7651 ]
7647 7652 + templateopts,
7648 7653 _(b'[-p] [-g]'),
7649 7654 helpcategory=command.CATEGORY_CHANGE_NAVIGATION,
7650 7655 )
7651 7656 def tip(ui, repo, **opts):
7652 7657 """show the tip revision (DEPRECATED)
7653 7658
7654 7659 The tip revision (usually just called the tip) is the changeset
7655 7660 most recently added to the repository (and therefore the most
7656 7661 recently changed head).
7657 7662
7658 7663 If you have just made a commit, that commit will be the tip. If
7659 7664 you have just pulled changes from another repository, the tip of
7660 7665 that repository becomes the current tip. The "tip" tag is special
7661 7666 and cannot be renamed or assigned to a different changeset.
7662 7667
7663 7668 This command is deprecated, please use :hg:`heads` instead.
7664 7669
7665 7670 Returns 0 on success.
7666 7671 """
7667 7672 opts = pycompat.byteskwargs(opts)
7668 7673 displayer = logcmdutil.changesetdisplayer(ui, repo, opts)
7669 7674 displayer.show(repo[b'tip'])
7670 7675 displayer.close()
7671 7676
7672 7677
7673 7678 @command(
7674 7679 b'unbundle',
7675 7680 [
7676 7681 (
7677 7682 b'u',
7678 7683 b'update',
7679 7684 None,
7680 7685 _(b'update to new branch head if changesets were unbundled'),
7681 7686 )
7682 7687 ],
7683 7688 _(b'[-u] FILE...'),
7684 7689 helpcategory=command.CATEGORY_IMPORT_EXPORT,
7685 7690 )
7686 7691 def unbundle(ui, repo, fname1, *fnames, **opts):
7687 7692 """apply one or more bundle files
7688 7693
7689 7694 Apply one or more bundle files generated by :hg:`bundle`.
7690 7695
7691 7696 Returns 0 on success, 1 if an update has unresolved files.
7692 7697 """
7693 7698 fnames = (fname1,) + fnames
7694 7699
7695 7700 with repo.lock():
7696 7701 for fname in fnames:
7697 7702 f = hg.openpath(ui, fname)
7698 7703 gen = exchange.readbundle(ui, f, fname)
7699 7704 if isinstance(gen, streamclone.streamcloneapplier):
7700 7705 raise error.InputError(
7701 7706 _(
7702 7707 b'packed bundles cannot be applied with '
7703 7708 b'"hg unbundle"'
7704 7709 ),
7705 7710 hint=_(b'use "hg debugapplystreamclonebundle"'),
7706 7711 )
7707 7712 url = b'bundle:' + fname
7708 7713 try:
7709 7714 txnname = b'unbundle'
7710 7715 if not isinstance(gen, bundle2.unbundle20):
7711 7716 txnname = b'unbundle\n%s' % urlutil.hidepassword(url)
7712 7717 with repo.transaction(txnname) as tr:
7713 7718 op = bundle2.applybundle(
7714 7719 repo, gen, tr, source=b'unbundle', url=url
7715 7720 )
7716 7721 except error.BundleUnknownFeatureError as exc:
7717 7722 raise error.Abort(
7718 7723 _(b'%s: unknown bundle feature, %s') % (fname, exc),
7719 7724 hint=_(
7720 7725 b"see https://mercurial-scm.org/"
7721 7726 b"wiki/BundleFeature for more "
7722 7727 b"information"
7723 7728 ),
7724 7729 )
7725 7730 modheads = bundle2.combinechangegroupresults(op)
7726 7731
7727 7732 if postincoming(ui, repo, modheads, opts.get('update'), None, None):
7728 7733 return 1
7729 7734 else:
7730 7735 return 0
7731 7736
7732 7737
7733 7738 @command(
7734 7739 b'unshelve',
7735 7740 [
7736 7741 (b'a', b'abort', None, _(b'abort an incomplete unshelve operation')),
7737 7742 (
7738 7743 b'c',
7739 7744 b'continue',
7740 7745 None,
7741 7746 _(b'continue an incomplete unshelve operation'),
7742 7747 ),
7743 7748 (b'i', b'interactive', None, _(b'use interactive mode (EXPERIMENTAL)')),
7744 7749 (b'k', b'keep', None, _(b'keep shelve after unshelving')),
7745 7750 (
7746 7751 b'n',
7747 7752 b'name',
7748 7753 b'',
7749 7754 _(b'restore shelved change with given name'),
7750 7755 _(b'NAME'),
7751 7756 ),
7752 7757 (b't', b'tool', b'', _(b'specify merge tool')),
7753 7758 (
7754 7759 b'',
7755 7760 b'date',
7756 7761 b'',
7757 7762 _(b'set date for temporary commits (DEPRECATED)'),
7758 7763 _(b'DATE'),
7759 7764 ),
7760 7765 ],
7761 7766 _(b'hg unshelve [OPTION]... [[-n] SHELVED]'),
7762 7767 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7763 7768 )
7764 7769 def unshelve(ui, repo, *shelved, **opts):
7765 7770 """restore a shelved change to the working directory
7766 7771
7767 7772 This command accepts an optional name of a shelved change to
7768 7773 restore. If none is given, the most recent shelved change is used.
7769 7774
7770 7775 If a shelved change is applied successfully, the bundle that
7771 7776 contains the shelved changes is moved to a backup location
7772 7777 (.hg/shelve-backup).
7773 7778
7774 7779 Since you can restore a shelved change on top of an arbitrary
7775 7780 commit, it is possible that unshelving will result in a conflict
7776 7781 between your changes and the commits you are unshelving onto. If
7777 7782 this occurs, you must resolve the conflict, then use
7778 7783 ``--continue`` to complete the unshelve operation. (The bundle
7779 7784 will not be moved until you successfully complete the unshelve.)
7780 7785
7781 7786 (Alternatively, you can use ``--abort`` to abandon an unshelve
7782 7787 that causes a conflict. This reverts the unshelved changes, and
7783 7788 leaves the bundle in place.)
7784 7789
7785 7790 If bare shelved change (without interactive, include and exclude
7786 7791 option) was done on newly created branch it would restore branch
7787 7792 information to the working directory.
7788 7793
7789 7794 After a successful unshelve, the shelved changes are stored in a
7790 7795 backup directory. Only the N most recent backups are kept. N
7791 7796 defaults to 10 but can be overridden using the ``shelve.maxbackups``
7792 7797 configuration option.
7793 7798
7794 7799 .. container:: verbose
7795 7800
7796 7801 Timestamp in seconds is used to decide order of backups. More
7797 7802 than ``maxbackups`` backups are kept, if same timestamp
7798 7803 prevents from deciding exact order of them, for safety.
7799 7804
7800 7805 Selected changes can be unshelved with ``--interactive`` flag.
7801 7806 The working directory is updated with the selected changes, and
7802 7807 only the unselected changes remain shelved.
7803 7808 Note: The whole shelve is applied to working directory first before
7804 7809 running interactively. So, this will bring up all the conflicts between
7805 7810 working directory and the shelve, irrespective of which changes will be
7806 7811 unshelved.
7807 7812 """
7808 7813 with repo.wlock():
7809 7814 return shelvemod.unshelvecmd(ui, repo, *shelved, **opts)
7810 7815
7811 7816
7812 7817 statemod.addunfinished(
7813 7818 b'unshelve',
7814 7819 fname=b'shelvedstate',
7815 7820 continueflag=True,
7816 7821 abortfunc=shelvemod.hgabortunshelve,
7817 7822 continuefunc=shelvemod.hgcontinueunshelve,
7818 7823 cmdmsg=_(b'unshelve already in progress'),
7819 7824 )
7820 7825
7821 7826
7822 7827 @command(
7823 7828 b'update|up|checkout|co',
7824 7829 [
7825 7830 (b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
7826 7831 (b'c', b'check', None, _(b'require clean working directory')),
7827 7832 (b'm', b'merge', None, _(b'merge uncommitted changes')),
7828 7833 (b'd', b'date', b'', _(b'tipmost revision matching date'), _(b'DATE')),
7829 7834 (b'r', b'rev', b'', _(b'revision'), _(b'REV')),
7830 7835 ]
7831 7836 + mergetoolopts,
7832 7837 _(b'[-C|-c|-m] [-d DATE] [[-r] REV]'),
7833 7838 helpcategory=command.CATEGORY_WORKING_DIRECTORY,
7834 7839 helpbasic=True,
7835 7840 )
7836 7841 def update(ui, repo, node=None, **opts):
7837 7842 """update working directory (or switch revisions)
7838 7843
7839 7844 Update the repository's working directory to the specified
7840 7845 changeset. If no changeset is specified, update to the tip of the
7841 7846 current named branch and move the active bookmark (see :hg:`help
7842 7847 bookmarks`).
7843 7848
7844 7849 Update sets the working directory's parent revision to the specified
7845 7850 changeset (see :hg:`help parents`).
7846 7851
7847 7852 If the changeset is not a descendant or ancestor of the working
7848 7853 directory's parent and there are uncommitted changes, the update is
7849 7854 aborted. With the -c/--check option, the working directory is checked
7850 7855 for uncommitted changes; if none are found, the working directory is
7851 7856 updated to the specified changeset.
7852 7857
7853 7858 .. container:: verbose
7854 7859
7855 7860 The -C/--clean, -c/--check, and -m/--merge options control what
7856 7861 happens if the working directory contains uncommitted changes.
7857 7862 At most of one of them can be specified.
7858 7863
7859 7864 1. If no option is specified, and if
7860 7865 the requested changeset is an ancestor or descendant of
7861 7866 the working directory's parent, the uncommitted changes
7862 7867 are merged into the requested changeset and the merged
7863 7868 result is left uncommitted. If the requested changeset is
7864 7869 not an ancestor or descendant (that is, it is on another
7865 7870 branch), the update is aborted and the uncommitted changes
7866 7871 are preserved.
7867 7872
7868 7873 2. With the -m/--merge option, the update is allowed even if the
7869 7874 requested changeset is not an ancestor or descendant of
7870 7875 the working directory's parent.
7871 7876
7872 7877 3. With the -c/--check option, the update is aborted and the
7873 7878 uncommitted changes are preserved.
7874 7879
7875 7880 4. With the -C/--clean option, uncommitted changes are discarded and
7876 7881 the working directory is updated to the requested changeset.
7877 7882
7878 7883 To cancel an uncommitted merge (and lose your changes), use
7879 7884 :hg:`merge --abort`.
7880 7885
7881 7886 Use null as the changeset to remove the working directory (like
7882 7887 :hg:`clone -U`).
7883 7888
7884 7889 If you want to revert just one file to an older revision, use
7885 7890 :hg:`revert [-r REV] NAME`.
7886 7891
7887 7892 See :hg:`help dates` for a list of formats valid for -d/--date.
7888 7893
7889 7894 Returns 0 on success, 1 if there are unresolved files.
7890 7895 """
7891 7896 cmdutil.check_at_most_one_arg(opts, 'clean', 'check', 'merge')
7892 7897 rev = opts.get('rev')
7893 7898 date = opts.get('date')
7894 7899 clean = opts.get('clean')
7895 7900 check = opts.get('check')
7896 7901 merge = opts.get('merge')
7897 7902 if rev and node:
7898 7903 raise error.InputError(_(b"please specify just one revision"))
7899 7904
7900 7905 if ui.configbool(b'commands', b'update.requiredest'):
7901 7906 if not node and not rev and not date:
7902 7907 raise error.InputError(
7903 7908 _(b'you must specify a destination'),
7904 7909 hint=_(b'for example: hg update ".::"'),
7905 7910 )
7906 7911
7907 7912 if rev is None or rev == b'':
7908 7913 rev = node
7909 7914
7910 7915 if date and rev is not None:
7911 7916 raise error.InputError(_(b"you can't specify a revision and a date"))
7912 7917
7913 7918 updatecheck = None
7914 7919 if check or merge is not None and not merge:
7915 7920 updatecheck = b'abort'
7916 7921 elif merge or check is not None and not check:
7917 7922 updatecheck = b'none'
7918 7923
7919 7924 with repo.wlock():
7920 7925 cmdutil.clearunfinished(repo)
7921 7926 if date:
7922 7927 rev = cmdutil.finddate(ui, repo, date)
7923 7928
7924 7929 # if we defined a bookmark, we have to remember the original name
7925 7930 brev = rev
7926 7931 if rev:
7927 7932 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
7928 7933 ctx = logcmdutil.revsingle(repo, rev, default=None)
7929 7934 rev = ctx.rev()
7930 7935 hidden = ctx.hidden()
7931 7936 overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
7932 7937 with ui.configoverride(overrides, b'update'):
7933 7938 ret = hg.updatetotally(
7934 7939 ui, repo, rev, brev, clean=clean, updatecheck=updatecheck
7935 7940 )
7936 7941 if hidden:
7937 7942 ctxstr = ctx.hex()[:12]
7938 7943 ui.warn(_(b"updated to hidden changeset %s\n") % ctxstr)
7939 7944
7940 7945 if ctx.obsolete():
7941 7946 obsfatemsg = obsutil._getfilteredreason(repo, ctxstr, ctx)
7942 7947 ui.warn(b"(%s)\n" % obsfatemsg)
7943 7948 return ret
7944 7949
7945 7950
7946 7951 @command(
7947 7952 b'verify',
7948 7953 [(b'', b'full', False, b'perform more checks (EXPERIMENTAL)')],
7949 7954 helpcategory=command.CATEGORY_MAINTENANCE,
7950 7955 )
7951 7956 def verify(ui, repo, **opts):
7952 7957 """verify the integrity of the repository
7953 7958
7954 7959 Verify the integrity of the current repository.
7955 7960
7956 7961 This will perform an extensive check of the repository's
7957 7962 integrity, validating the hashes and checksums of each entry in
7958 7963 the changelog, manifest, and tracked files, as well as the
7959 7964 integrity of their crosslinks and indices.
7960 7965
7961 7966 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
7962 7967 for more information about recovery from corruption of the
7963 7968 repository.
7964 7969
7965 7970 For an alternative UI with a lot more control over the verification
7966 7971 process and better error reporting, try `hg help admin::verify`.
7967 7972
7968 7973 Returns 0 on success, 1 if errors are encountered.
7969 7974 """
7970 7975 level = None
7971 7976 if opts['full']:
7972 7977 level = verifymod.VERIFY_FULL
7973 7978 return hg.verify(repo, level)
7974 7979
7975 7980
7976 7981 @command(
7977 7982 b'version',
7978 7983 [] + formatteropts,
7979 7984 helpcategory=command.CATEGORY_HELP,
7980 7985 norepo=True,
7981 7986 intents={INTENT_READONLY},
7982 7987 )
7983 7988 def version_(ui, **opts):
7984 7989 """output version and copyright information
7985 7990
7986 7991 .. container:: verbose
7987 7992
7988 7993 Template:
7989 7994
7990 7995 The following keywords are supported. See also :hg:`help templates`.
7991 7996
7992 7997 :extensions: List of extensions.
7993 7998 :ver: String. Version number.
7994 7999
7995 8000 And each entry of ``{extensions}`` provides the following sub-keywords
7996 8001 in addition to ``{ver}``.
7997 8002
7998 8003 :bundled: Boolean. True if included in the release.
7999 8004 :name: String. Extension name.
8000 8005 """
8001 8006 if ui.verbose:
8002 8007 ui.pager(b'version')
8003 8008 fm = ui.formatter(b"version", pycompat.byteskwargs(opts))
8004 8009 fm.startitem()
8005 8010 fm.write(
8006 8011 b"ver", _(b"Mercurial Distributed SCM (version %s)\n"), util.version()
8007 8012 )
8008 8013 license = _(
8009 8014 b"(see https://mercurial-scm.org for more information)\n"
8010 8015 b"\nCopyright (C) 2005-2023 Olivia Mackall and others\n"
8011 8016 b"This is free software; see the source for copying conditions. "
8012 8017 b"There is NO\nwarranty; "
8013 8018 b"not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
8014 8019 )
8015 8020 if not ui.quiet:
8016 8021 fm.plain(license)
8017 8022
8018 8023 if ui.verbose:
8019 8024 fm.plain(_(b"\nEnabled extensions:\n\n"))
8020 8025 # format names and versions into columns
8021 8026 names = []
8022 8027 vers = []
8023 8028 isinternals = []
8024 8029 for name, module in sorted(extensions.extensions()):
8025 8030 names.append(name)
8026 8031 vers.append(extensions.moduleversion(module) or None)
8027 8032 isinternals.append(extensions.ismoduleinternal(module))
8028 8033 fn = fm.nested(b"extensions", tmpl=b'{name}\n')
8029 8034 if names:
8030 8035 namefmt = b" %%-%ds " % max(len(n) for n in names)
8031 8036 places = [_(b"external"), _(b"internal")]
8032 8037 for n, v, p in zip(names, vers, isinternals):
8033 8038 fn.startitem()
8034 8039 fn.condwrite(ui.verbose, b"name", namefmt, n)
8035 8040 if ui.verbose:
8036 8041 fn.plain(b"%s " % places[p])
8037 8042 fn.data(bundled=p)
8038 8043 fn.condwrite(ui.verbose and v, b"ver", b"%s", v)
8039 8044 if ui.verbose:
8040 8045 fn.plain(b"\n")
8041 8046 fn.end()
8042 8047 fm.end()
8043 8048
8044 8049
8045 8050 def loadcmdtable(ui, name, cmdtable):
8046 8051 """Load command functions from specified cmdtable"""
8047 8052 overrides = [cmd for cmd in cmdtable if cmd in table]
8048 8053 if overrides:
8049 8054 ui.warn(
8050 8055 _(b"extension '%s' overrides commands: %s\n")
8051 8056 % (name, b" ".join(overrides))
8052 8057 )
8053 8058 table.update(cmdtable)
@@ -1,489 +1,495 b''
1 1 # pycompat.py - portability shim for python 3
2 2 #
3 3 # This software may be used and distributed according to the terms of the
4 4 # GNU General Public License version 2 or any later version.
5 5
6 6 """Mercurial portability shim for python 3.
7 7
8 8 This contains aliases to hide python version-specific details from the core.
9 9 """
10 10
11 11
12 12 import builtins
13 13 import codecs
14 14 import concurrent.futures as futures
15 15 import getopt
16 16 import http.client as httplib
17 17 import http.cookiejar as cookielib
18 18 import inspect
19 19 import io
20 20 import json
21 21 import os
22 22 import queue
23 23 import shlex
24 24 import socketserver
25 25 import struct
26 26 import sys
27 27 import tempfile
28 28 import xmlrpc.client as xmlrpclib
29 29
30 30 from typing import (
31 31 Any,
32 32 AnyStr,
33 33 BinaryIO,
34 34 Callable,
35 35 Dict,
36 36 Iterable,
37 37 Iterator,
38 38 List,
39 39 Mapping,
40 40 NoReturn,
41 41 Optional,
42 42 Sequence,
43 43 Tuple,
44 44 Type,
45 45 TypeVar,
46 46 cast,
47 47 overload,
48 48 )
49 49
50 50 ispy3 = sys.version_info[0] >= 3
51 51 ispypy = '__pypy__' in sys.builtin_module_names
52 52 TYPE_CHECKING = False
53 53
54 54 if not globals(): # hide this from non-pytype users
55 55 import typing
56 56
57 57 TYPE_CHECKING = typing.TYPE_CHECKING
58 58
59 59 _GetOptResult = Tuple[List[Tuple[bytes, bytes]], List[bytes]]
60 60 _T0 = TypeVar('_T0')
61 61 _T1 = TypeVar('_T1')
62 62 _S = TypeVar('_S')
63 63 _Tbytestr = TypeVar('_Tbytestr', bound='bytestr')
64 64
65 65
66 66 def future_set_exception_info(f, exc_info):
67 67 f.set_exception(exc_info[0])
68 68
69 69
70 70 FileNotFoundError = builtins.FileNotFoundError
71 71
72 72
73 73 def identity(a: _T0) -> _T0:
74 74 return a
75 75
76 76
77 77 def _rapply(f, xs):
78 78 if xs is None:
79 79 # assume None means non-value of optional data
80 80 return xs
81 81 if isinstance(xs, (list, set, tuple)):
82 82 return type(xs)(_rapply(f, x) for x in xs)
83 83 if isinstance(xs, dict):
84 84 return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items())
85 85 return f(xs)
86 86
87 87
88 88 def rapply(f, xs):
89 89 """Apply function recursively to every item preserving the data structure
90 90
91 91 >>> def f(x):
92 92 ... return 'f(%s)' % x
93 93 >>> rapply(f, None) is None
94 94 True
95 95 >>> rapply(f, 'a')
96 96 'f(a)'
97 97 >>> rapply(f, {'a'}) == {'f(a)'}
98 98 True
99 99 >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
100 100 ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]
101 101
102 102 >>> xs = [object()]
103 103 >>> rapply(identity, xs) is xs
104 104 True
105 105 """
106 106 if f is identity:
107 107 # fast path mainly for py2
108 108 return xs
109 109 return _rapply(f, xs)
110 110
111 111
112 112 if os.name == r'nt':
113 113 # MBCS (or ANSI) filesystem encoding must be used as before.
114 114 # Otherwise non-ASCII filenames in existing repositories would be
115 115 # corrupted.
116 116 # This must be set once prior to any fsencode/fsdecode calls.
117 117 sys._enablelegacywindowsfsencoding() # pytype: disable=module-attr
118 118
119 119 fsencode = os.fsencode
120 120 fsdecode = os.fsdecode
121 121 oscurdir: bytes = os.curdir.encode('ascii')
122 122 oslinesep: bytes = os.linesep.encode('ascii')
123 123 osname: bytes = os.name.encode('ascii')
124 124 ospathsep: bytes = os.pathsep.encode('ascii')
125 125 ospardir: bytes = os.pardir.encode('ascii')
126 126 ossep: bytes = os.sep.encode('ascii')
127 127 osaltsep: Optional[bytes] = os.altsep.encode('ascii') if os.altsep else None
128 128 osdevnull: bytes = os.devnull.encode('ascii')
129 129
130 130 sysplatform: bytes = sys.platform.encode('ascii')
131 131 sysexecutable: bytes = os.fsencode(sys.executable) if sys.executable else b''
132 132
133 133
134 134 if TYPE_CHECKING:
135 135
136 136 @overload
137 137 def maplist(f: Callable[[_T0], _S], arg: Iterable[_T0]) -> List[_S]:
138 138 ...
139 139
140 140 @overload
141 141 def maplist(
142 142 f: Callable[[_T0, _T1], _S], arg1: Iterable[_T0], arg2: Iterable[_T1]
143 143 ) -> List[_S]:
144 144 ...
145 145
146 146
147 147 def maplist(f, *args):
148 148 return list(map(f, *args))
149 149
150 150
151 151 def rangelist(*args) -> List[int]:
152 152 return list(range(*args))
153 153
154 154
155 155 def ziplist(*args):
156 156 return list(zip(*args))
157 157
158 158
159 159 rawinput = input
160 160 getargspec = inspect.getfullargspec
161 161
162 162 long = int
163 163
164 164 if builtins.getattr(sys, 'argv', None) is not None:
165 165 # On POSIX, the char** argv array is converted to Python str using
166 166 # Py_DecodeLocale(). The inverse of this is Py_EncodeLocale(), which
167 167 # isn't directly callable from Python code. In practice, os.fsencode()
168 168 # can be used instead (this is recommended by Python's documentation
169 169 # for sys.argv).
170 170 #
171 171 # On Windows, the wchar_t **argv is passed into the interpreter as-is.
172 172 # Like POSIX, we need to emulate what Py_EncodeLocale() would do. But
173 173 # there's an additional wrinkle. What we really want to access is the
174 174 # ANSI codepage representation of the arguments, as this is what
175 175 # `int main()` would receive if Python 3 didn't define `int wmain()`
176 176 # (this is how Python 2 worked). To get that, we encode with the mbcs
177 177 # encoding, which will pass CP_ACP to the underlying Windows API to
178 178 # produce bytes.
179 179 sysargv: List[bytes] = []
180 180 if os.name == r'nt':
181 181 sysargv = [a.encode("mbcs", "ignore") for a in sys.argv]
182 182 else:
183 183 sysargv = [fsencode(a) for a in sys.argv]
184 184
185 185 bytechr = struct.Struct('>B').pack
186 186 byterepr = b'%r'.__mod__
187 187
188 188
189 189 class bytestr(bytes):
190 190 """A bytes which mostly acts as a Python 2 str
191 191
192 192 >>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1)
193 193 ('', 'foo', 'ascii', '1')
194 194 >>> s = bytestr(b'foo')
195 195 >>> assert s is bytestr(s)
196 196
197 197 __bytes__() should be called if provided:
198 198
199 199 >>> class bytesable:
200 200 ... def __bytes__(self):
201 201 ... return b'bytes'
202 202 >>> bytestr(bytesable())
203 203 'bytes'
204 204
205 ...unless the argument is the bytes *type* itself: it gets a
206 __bytes__() method in Python 3.11, which cannot be used as in an instance
207 of bytes:
208
209 >>> bytestr(bytes)
210 "<class 'bytes'>"
211
205 212 There's no implicit conversion from non-ascii str as its encoding is
206 213 unknown:
207 214
208 215 >>> bytestr(chr(0x80)) # doctest: +ELLIPSIS
209 216 Traceback (most recent call last):
210 217 ...
211 218 UnicodeEncodeError: ...
212 219
213 220 Comparison between bytestr and bytes should work:
214 221
215 222 >>> assert bytestr(b'foo') == b'foo'
216 223 >>> assert b'foo' == bytestr(b'foo')
217 224 >>> assert b'f' in bytestr(b'foo')
218 225 >>> assert bytestr(b'f') in b'foo'
219 226
220 227 Sliced elements should be bytes, not integer:
221 228
222 229 >>> s[1], s[:2]
223 230 (b'o', b'fo')
224 231 >>> list(s), list(reversed(s))
225 232 ([b'f', b'o', b'o'], [b'o', b'o', b'f'])
226 233
227 234 As bytestr type isn't propagated across operations, you need to cast
228 235 bytes to bytestr explicitly:
229 236
230 237 >>> s = bytestr(b'foo').upper()
231 238 >>> t = bytestr(s)
232 239 >>> s[0], t[0]
233 240 (70, b'F')
234 241
235 242 Be careful to not pass a bytestr object to a function which expects
236 243 bytearray-like behavior.
237 244
238 245 >>> t = bytes(t) # cast to bytes
239 246 >>> assert type(t) is bytes
240 247 """
241 248
242 249 # Trick pytype into not demanding Iterable[int] be passed to __new__(),
243 250 # since the appropriate bytes format is done internally.
244 251 #
245 252 # https://github.com/google/pytype/issues/500
246 253 if TYPE_CHECKING:
247 254
248 255 def __init__(self, s: object = b'') -> None:
249 256 pass
250 257
251 258 def __new__(cls: Type[_Tbytestr], s: object = b'') -> _Tbytestr:
252 259 if isinstance(s, bytestr):
253 260 return s
254 if not isinstance(
255 s, (bytes, bytearray)
256 ) and not builtins.hasattr( # hasattr-py3-only
257 s, u'__bytes__'
261 if not isinstance(s, (bytes, bytearray)) and (
262 isinstance(s, type)
263 or not builtins.hasattr(s, u'__bytes__') # hasattr-py3-only
258 264 ):
259 265 s = str(s).encode('ascii')
260 266 return bytes.__new__(cls, s)
261 267
262 268 # The base class uses `int` return in py3, but the point of this class is to
263 269 # behave like py2.
264 270 def __getitem__(self, key) -> bytes: # pytype: disable=signature-mismatch
265 271 s = bytes.__getitem__(self, key)
266 272 if not isinstance(s, bytes):
267 273 s = bytechr(s)
268 274 return s
269 275
270 276 # The base class expects `Iterator[int]` return in py3, but the point of
271 277 # this class is to behave like py2.
272 278 def __iter__(self) -> Iterator[bytes]: # pytype: disable=signature-mismatch
273 279 return iterbytestr(bytes.__iter__(self))
274 280
275 281 def __repr__(self) -> str:
276 282 return bytes.__repr__(self)[1:] # drop b''
277 283
278 284
279 285 def iterbytestr(s: Iterable[int]) -> Iterator[bytes]:
280 286 """Iterate bytes as if it were a str object of Python 2"""
281 287 return map(bytechr, s)
282 288
283 289
284 290 if TYPE_CHECKING:
285 291
286 292 @overload
287 293 def maybebytestr(s: bytes) -> bytestr:
288 294 ...
289 295
290 296 @overload
291 297 def maybebytestr(s: _T0) -> _T0:
292 298 ...
293 299
294 300
295 301 def maybebytestr(s):
296 302 """Promote bytes to bytestr"""
297 303 if isinstance(s, bytes):
298 304 return bytestr(s)
299 305 return s
300 306
301 307
302 308 def sysbytes(s: AnyStr) -> bytes:
303 309 """Convert an internal str (e.g. keyword, __doc__) back to bytes
304 310
305 311 This never raises UnicodeEncodeError, but only ASCII characters
306 312 can be round-trip by sysstr(sysbytes(s)).
307 313 """
308 314 if isinstance(s, bytes):
309 315 return s
310 316 return s.encode('utf-8')
311 317
312 318
313 319 def sysstr(s: AnyStr) -> str:
314 320 """Return a keyword str to be passed to Python functions such as
315 321 getattr() and str.encode()
316 322
317 323 This never raises UnicodeDecodeError. Non-ascii characters are
318 324 considered invalid and mapped to arbitrary but unique code points
319 325 such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
320 326 """
321 327 if isinstance(s, builtins.str):
322 328 return s
323 329 return s.decode('latin-1')
324 330
325 331
326 332 def strurl(url: AnyStr) -> str:
327 333 """Converts a bytes url back to str"""
328 334 if isinstance(url, bytes):
329 335 return url.decode('ascii')
330 336 return url
331 337
332 338
333 339 def bytesurl(url: AnyStr) -> bytes:
334 340 """Converts a str url to bytes by encoding in ascii"""
335 341 if isinstance(url, str):
336 342 return url.encode('ascii')
337 343 return url
338 344
339 345
340 346 def raisewithtb(exc: BaseException, tb) -> NoReturn:
341 347 """Raise exception with the given traceback"""
342 348 raise exc.with_traceback(tb)
343 349
344 350
345 351 def getdoc(obj: object) -> Optional[bytes]:
346 352 """Get docstring as bytes; may be None so gettext() won't confuse it
347 353 with _('')"""
348 354 doc = builtins.getattr(obj, '__doc__', None)
349 355 if doc is None:
350 356 return doc
351 357 return sysbytes(doc)
352 358
353 359
354 360 # these wrappers are automagically imported by hgloader
355 361 delattr = builtins.delattr
356 362 getattr = builtins.getattr
357 363 hasattr = builtins.hasattr
358 364 setattr = builtins.setattr
359 365 xrange = builtins.range
360 366 unicode = str
361 367
362 368
363 369 def open(
364 370 name,
365 371 mode: AnyStr = b'r',
366 372 buffering: int = -1,
367 373 encoding: Optional[str] = None,
368 374 ) -> Any:
369 375 # TODO: assert binary mode, and cast result to BinaryIO?
370 376 return builtins.open(name, sysstr(mode), buffering, encoding)
371 377
372 378
373 379 safehasattr = builtins.hasattr
374 380
375 381
376 382 def _getoptbwrapper(
377 383 orig, args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
378 384 ) -> _GetOptResult:
379 385 """
380 386 Takes bytes arguments, converts them to unicode, pass them to
381 387 getopt.getopt(), convert the returned values back to bytes and then
382 388 return them for Python 3 compatibility as getopt.getopt() don't accepts
383 389 bytes on Python 3.
384 390 """
385 391 args = [a.decode('latin-1') for a in args]
386 392 shortlist = shortlist.decode('latin-1')
387 393 namelist = [a.decode('latin-1') for a in namelist]
388 394 opts, args = orig(args, shortlist, namelist)
389 395 opts = [(a[0].encode('latin-1'), a[1].encode('latin-1')) for a in opts]
390 396 args = [a.encode('latin-1') for a in args]
391 397 return opts, args
392 398
393 399
394 400 def strkwargs(dic: Mapping[bytes, _T0]) -> Dict[str, _T0]:
395 401 """
396 402 Converts the keys of a python dictonary to str i.e. unicodes so that
397 403 they can be passed as keyword arguments as dictionaries with bytes keys
398 404 can't be passed as keyword arguments to functions on Python 3.
399 405 """
400 406 dic = {k.decode('latin-1'): v for k, v in dic.items()}
401 407 return dic
402 408
403 409
404 410 def byteskwargs(dic: Mapping[str, _T0]) -> Dict[bytes, _T0]:
405 411 """
406 412 Converts keys of python dictionaries to bytes as they were converted to
407 413 str to pass that dictonary as a keyword argument on Python 3.
408 414 """
409 415 dic = {k.encode('latin-1'): v for k, v in dic.items()}
410 416 return dic
411 417
412 418
413 419 # TODO: handle shlex.shlex().
414 420 def shlexsplit(
415 421 s: bytes, comments: bool = False, posix: bool = True
416 422 ) -> List[bytes]:
417 423 """
418 424 Takes bytes argument, convert it to str i.e. unicodes, pass that into
419 425 shlex.split(), convert the returned value to bytes and return that for
420 426 Python 3 compatibility as shelx.split() don't accept bytes on Python 3.
421 427 """
422 428 ret = shlex.split(s.decode('latin-1'), comments, posix)
423 429 return [a.encode('latin-1') for a in ret]
424 430
425 431
426 432 iteritems = lambda x: x.items()
427 433 itervalues = lambda x: x.values()
428 434
429 435 json_loads = json.loads
430 436
431 437 isjython: bool = sysplatform.startswith(b'java')
432 438
433 439 isdarwin: bool = sysplatform.startswith(b'darwin')
434 440 islinux: bool = sysplatform.startswith(b'linux')
435 441 isposix: bool = osname == b'posix'
436 442 iswindows: bool = osname == b'nt'
437 443
438 444
439 445 def getoptb(
440 446 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
441 447 ) -> _GetOptResult:
442 448 return _getoptbwrapper(getopt.getopt, args, shortlist, namelist)
443 449
444 450
445 451 def gnugetoptb(
446 452 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
447 453 ) -> _GetOptResult:
448 454 return _getoptbwrapper(getopt.gnu_getopt, args, shortlist, namelist)
449 455
450 456
451 457 def mkdtemp(
452 458 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
453 459 ) -> bytes:
454 460 return tempfile.mkdtemp(suffix, prefix, dir)
455 461
456 462
457 463 # text=True is not supported; use util.from/tonativeeol() instead
458 464 def mkstemp(
459 465 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
460 466 ) -> Tuple[int, bytes]:
461 467 return tempfile.mkstemp(suffix, prefix, dir)
462 468
463 469
464 470 # TemporaryFile does not support an "encoding=" argument on python2.
465 471 # This wrapper file are always open in byte mode.
466 472 def unnamedtempfile(mode: Optional[bytes] = None, *args, **kwargs) -> BinaryIO:
467 473 if mode is None:
468 474 mode = 'w+b'
469 475 else:
470 476 mode = sysstr(mode)
471 477 assert 'b' in mode
472 478 return cast(BinaryIO, tempfile.TemporaryFile(mode, *args, **kwargs))
473 479
474 480
475 481 # NamedTemporaryFile does not support an "encoding=" argument on python2.
476 482 # This wrapper file are always open in byte mode.
477 483 def namedtempfile(
478 484 mode: bytes = b'w+b',
479 485 bufsize: int = -1,
480 486 suffix: bytes = b'',
481 487 prefix: bytes = b'tmp',
482 488 dir: Optional[bytes] = None,
483 489 delete: bool = True,
484 490 ):
485 491 mode = sysstr(mode)
486 492 assert 'b' in mode
487 493 return tempfile.NamedTemporaryFile(
488 494 mode, bufsize, suffix=suffix, prefix=prefix, dir=dir, delete=delete
489 495 )
@@ -1,68 +1,77 b''
1 = Mercurial 6.6.2 =
2
3 * histedit: remove superfluous echo() and endwin() calls (issue6859)
4 * persistent-nodemap: avoid writing nodemap for empty revlog
5 * persistent-nodemap: respect the mmap setting when refreshing data
6 * bundle: do not detect --base argument that match nothing as lack of argument
7 * narrow: prevent removal of ACL-defined excludes
8 * pycompat: fix bytestr(bytes) in Python 3.11
9
1 10 = Mercurial 6.6.1 =
2 11
3 12 The first two patches fix aborted transactions that could happen since 6.6.
4 13
5 14 * revlog: avoid exposing delayed index entry too widely in non-inline revlog
6 15 * revlog: avoid wrongly updating the data file location on "divert"
7 16 * tests: do not fail tests in a state with uncommitted .py file removal
8 17 * perf-tags: fix the --clear-fnode-cache-rev code
9 18 * perf-tags: fix clear_cache_fnodes to actually clear that cache
10 19 * censor: fix things around inlining
11 20 * Various Python 3 cleanups
12 21 * Various Windows test suite fixes
13 22
14 23 = Mercurial 6.6 =
15 24
16 25 As usual, a *lot* of patches don't make it to this list.
17 26
18 27 == New Features ==
19 28 * rust-config: add support for default config items
20 29 * rhg: add config defaults to configitems.toml
21 30 * rhg: support "status FILE"
22 31 * rhg: support rhg files [FILE]
23 32 * commands: add admin namespace
24 33 * admin-command: add verify command
25 34 * debug-delta-chain: add options to control what we compute
26 35 * Added some caching for uncompressed revlog chunks that speed up some operations
27 36
28 37 == New Experimental Features ==
29 38
30 39 == Bug Fixes ==
31 40 * Improve OpenVMS support
32 41 * byteify-strings: passe sysstr to attr function and wrapper
33 42 * journal: track bookmark deletion
34 43 * transaction: actually delete file created during the transaction on rollback
35 44 * pull: avoid referencing a variable before it is initialized
36 45 * rust-filepatterns: also normalize RelPath
37 46 * narrow: hoist a variable to a higher level to avoid use-before-init warning
38 47 * convert: stabilize subversion date sorter
39 48 * run-tests: detect HGWITHRUSTEXT value
40 49 * censor: accept censored revision during upgrade
41 50 * rust-matchers: fix quadratic complexity in `FileMatcher`
42 51 * unstable: do not consider internal phases when computing unstable
43 52 * Still a whole bunch of Python 2 -> 3 migration leftovers
44 53
45 54 == Backwards Compatibility Changes ==
46 55 * perf: display all timing by default
47 56 * infinitepush: drop the extension
48 57 * debug-delta-chain: print less data by default
49 58
50 59 == Internal API Changes ==
51 60
52 61 * The revlog interface has been significantly cleaned up.
53 62 * configitems: add `documentation` field
54 63 * configitems: declare items in a TOML file
55 64 * configitems: move blackbox's config items to the new configitems.toml
56 65 * path-suboption: deprecated specifying the attributes as bytes
57 66 * pycompat: deprecate using bytes
58 67 * check-code: drop the `safehasattr` rule
59 68 * safehasattr: drop usage in favor of hasattr
60 69 * rust: add `UncheckedRevision` type
61 70 * rust: implement the `Graph` trait for all revlogs
62 71 * rust: make `Revision` a newtype
63 72 * perf: change the way we approach revlog reading
64 73 * perf: ensure all readlog's reading is done within a `reading` context
65 74 * delta-chain: move the debugdeltachain command in revlogutils
66 75
67 76 == Miscellaneous ==
68 77
@@ -1,277 +1,281 b''
1 1 $ hg init test
2 2 $ cd test
3 3 $ hg unbundle "$TESTDIR/bundles/remote.hg"
4 4 adding changesets
5 5 adding manifests
6 6 adding file changes
7 7 added 9 changesets with 7 changes to 4 files (+1 heads)
8 8 new changesets bfaf4b5cbf01:916f1afdef90 (9 drafts)
9 9 (run 'hg heads' to see heads, 'hg merge' to merge)
10 10 $ hg up tip
11 11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12 12 $ cd ..
13 13
14 14 $ for i in 0 1 2 3 4 5 6 7 8; do
15 15 > mkdir test-"$i"
16 16 > hg --cwd test-"$i" init
17 17 > hg -R test bundle -r "$i" test-"$i".hg test-"$i"
18 18 > cd test-"$i"
19 19 > hg unbundle ../test-"$i".hg
20 20 > hg verify -q
21 21 > hg tip -q
22 22 > cd ..
23 23 > done
24 24 searching for changes
25 25 1 changesets found
26 26 adding changesets
27 27 adding manifests
28 28 adding file changes
29 29 added 1 changesets with 1 changes to 1 files
30 30 new changesets bfaf4b5cbf01 (1 drafts)
31 31 (run 'hg update' to get a working copy)
32 32 0:bfaf4b5cbf01
33 33 searching for changes
34 34 2 changesets found
35 35 adding changesets
36 36 adding manifests
37 37 adding file changes
38 38 added 2 changesets with 2 changes to 1 files
39 39 new changesets bfaf4b5cbf01:21f32785131f (2 drafts)
40 40 (run 'hg update' to get a working copy)
41 41 1:21f32785131f
42 42 searching for changes
43 43 3 changesets found
44 44 adding changesets
45 45 adding manifests
46 46 adding file changes
47 47 added 3 changesets with 3 changes to 1 files
48 48 new changesets bfaf4b5cbf01:4ce51a113780 (3 drafts)
49 49 (run 'hg update' to get a working copy)
50 50 2:4ce51a113780
51 51 searching for changes
52 52 4 changesets found
53 53 adding changesets
54 54 adding manifests
55 55 adding file changes
56 56 added 4 changesets with 4 changes to 1 files
57 57 new changesets bfaf4b5cbf01:93ee6ab32777 (4 drafts)
58 58 (run 'hg update' to get a working copy)
59 59 3:93ee6ab32777
60 60 searching for changes
61 61 2 changesets found
62 62 adding changesets
63 63 adding manifests
64 64 adding file changes
65 65 added 2 changesets with 2 changes to 1 files
66 66 new changesets bfaf4b5cbf01:c70afb1ee985 (2 drafts)
67 67 (run 'hg update' to get a working copy)
68 68 1:c70afb1ee985
69 69 searching for changes
70 70 3 changesets found
71 71 adding changesets
72 72 adding manifests
73 73 adding file changes
74 74 added 3 changesets with 3 changes to 1 files
75 75 new changesets bfaf4b5cbf01:f03ae5a9b979 (3 drafts)
76 76 (run 'hg update' to get a working copy)
77 77 2:f03ae5a9b979
78 78 searching for changes
79 79 4 changesets found
80 80 adding changesets
81 81 adding manifests
82 82 adding file changes
83 83 added 4 changesets with 5 changes to 2 files
84 84 new changesets bfaf4b5cbf01:095cb14b1b4d (4 drafts)
85 85 (run 'hg update' to get a working copy)
86 86 3:095cb14b1b4d
87 87 searching for changes
88 88 5 changesets found
89 89 adding changesets
90 90 adding manifests
91 91 adding file changes
92 92 added 5 changesets with 6 changes to 3 files
93 93 new changesets bfaf4b5cbf01:faa2e4234c7a (5 drafts)
94 94 (run 'hg update' to get a working copy)
95 95 4:faa2e4234c7a
96 96 searching for changes
97 97 5 changesets found
98 98 adding changesets
99 99 adding manifests
100 100 adding file changes
101 101 added 5 changesets with 5 changes to 2 files
102 102 new changesets bfaf4b5cbf01:916f1afdef90 (5 drafts)
103 103 (run 'hg update' to get a working copy)
104 104 4:916f1afdef90
105 105 $ cd test-8
106 106 $ hg pull ../test-7
107 107 pulling from ../test-7
108 108 searching for changes
109 109 adding changesets
110 110 adding manifests
111 111 adding file changes
112 112 added 4 changesets with 2 changes to 3 files (+1 heads)
113 113 new changesets c70afb1ee985:faa2e4234c7a
114 114 1 local changesets published
115 115 (run 'hg heads' to see heads, 'hg merge' to merge)
116 116 $ hg verify -q
117 117 $ hg rollback
118 118 repository tip rolled back to revision 4 (undo pull)
119 119 $ cd ..
120 120
121 121 should fail
122 122
123 123 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg test-3
124 124 abort: --base is incompatible with specifying destinations
125 125 [10]
126 126 $ hg -R test bundle -a -r tip test-bundle-branch1.hg test-3
127 127 abort: --all is incompatible with specifying destinations
128 128 [10]
129 129 $ hg -R test bundle -r tip test-bundle-branch1.hg
130 130 config error: default repository not configured!
131 131 (see 'hg help config.paths')
132 132 [30]
133 133
134 134 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
135 135 2 changesets found
136 136 $ hg -R test bundle --base 2 -r 7 test-bundle-branch2.hg
137 137 4 changesets found
138 138 $ hg -R test bundle --base 2 test-bundle-all.hg
139 139 6 changesets found
140 140 $ hg -R test bundle --base 2 --all test-bundle-all-2.hg
141 141 ignoring --base because --all was specified
142 142 9 changesets found
143 $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-with-dest.hg --config paths.default=$TESTTMP/test-3
144 5 changesets found
145 $ hg -R test bundle --base 3-3 -r tip test-base-match-nothing-no-dest.hg
146 5 changesets found
143 147 $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
144 148 1 changesets found
145 149
146 150 empty bundle
147 151
148 152 $ hg -R test bundle --base 7 --base 8 test-bundle-empty.hg
149 153 no changes found
150 154 [1]
151 155
152 156 issue76 msg2163
153 157
154 158 $ hg -R test bundle --base 3 -r 3 -r 3 test-bundle-cset-3.hg
155 159 no changes found
156 160 [1]
157 161
158 162 Issue1910: 'hg bundle --base $head' does not exclude $head from
159 163 result
160 164
161 165 $ hg -R test bundle --base 7 test-bundle-cset-7.hg
162 166 4 changesets found
163 167
164 168 $ hg clone test-2 test-9
165 169 updating to branch default
166 170 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
167 171 $ cd test-9
168 172
169 173 revision 2
170 174
171 175 $ hg tip -q
172 176 2:4ce51a113780
173 177 $ hg unbundle ../test-bundle-should-fail.hg
174 178 adding changesets
175 179 transaction abort!
176 180 rollback completed
177 181 abort: 00changelog@93ee6ab32777cd430e07da694794fb6a4f917712: unknown parent
178 182 [50]
179 183
180 184 revision 2
181 185
182 186 $ hg tip -q
183 187 2:4ce51a113780
184 188 $ hg unbundle ../test-bundle-all.hg
185 189 adding changesets
186 190 adding manifests
187 191 adding file changes
188 192 added 6 changesets with 4 changes to 4 files (+1 heads)
189 193 new changesets 93ee6ab32777:916f1afdef90 (6 drafts)
190 194 (run 'hg heads' to see heads, 'hg merge' to merge)
191 195
192 196 revision 8
193 197
194 198 $ hg tip -q
195 199 8:916f1afdef90
196 200 $ hg verify -q
197 201 $ hg rollback
198 202 repository tip rolled back to revision 2 (undo unbundle)
199 203
200 204 revision 2
201 205
202 206 $ hg tip -q
203 207 2:4ce51a113780
204 208 $ hg unbundle ../test-bundle-branch1.hg
205 209 adding changesets
206 210 adding manifests
207 211 adding file changes
208 212 added 2 changesets with 2 changes to 2 files
209 213 new changesets 93ee6ab32777:916f1afdef90 (2 drafts)
210 214 (run 'hg update' to get a working copy)
211 215
212 216 revision 4
213 217
214 218 $ hg tip -q
215 219 4:916f1afdef90
216 220 $ hg verify -q
217 221 $ hg rollback
218 222 repository tip rolled back to revision 2 (undo unbundle)
219 223 $ hg unbundle ../test-bundle-branch2.hg
220 224 adding changesets
221 225 adding manifests
222 226 adding file changes
223 227 added 4 changesets with 3 changes to 3 files (+1 heads)
224 228 new changesets c70afb1ee985:faa2e4234c7a (4 drafts)
225 229 (run 'hg heads' to see heads, 'hg merge' to merge)
226 230
227 231 revision 6
228 232
229 233 $ hg tip -q
230 234 6:faa2e4234c7a
231 235 $ hg verify -q
232 236 $ hg rollback
233 237 repository tip rolled back to revision 2 (undo unbundle)
234 238 $ hg unbundle ../test-bundle-cset-7.hg
235 239 adding changesets
236 240 adding manifests
237 241 adding file changes
238 242 added 2 changesets with 2 changes to 2 files
239 243 new changesets 93ee6ab32777:916f1afdef90 (2 drafts)
240 244 (run 'hg update' to get a working copy)
241 245
242 246 revision 4
243 247
244 248 $ hg tip -q
245 249 4:916f1afdef90
246 250 $ hg verify -q
247 251
248 252 $ cd ../test
249 253 $ hg merge 7
250 254 note: possible conflict - afile was renamed multiple times to:
251 255 adifferentfile
252 256 anotherfile
253 257 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
254 258 (branch merge, don't forget to commit)
255 259 $ hg ci -m merge
256 260 $ cd ..
257 261 $ hg -R test bundle --base 2 test-bundle-head.hg
258 262 7 changesets found
259 263 $ hg clone test-2 test-10
260 264 updating to branch default
261 265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
262 266 $ cd test-10
263 267 $ hg unbundle ../test-bundle-head.hg
264 268 adding changesets
265 269 adding manifests
266 270 adding file changes
267 271 added 7 changesets with 4 changes to 4 files
268 272 new changesets 93ee6ab32777:03fc0b0e347c (7 drafts)
269 273 (run 'hg update' to get a working copy)
270 274
271 275 revision 9
272 276
273 277 $ hg tip -q
274 278 9:03fc0b0e347c
275 279 $ hg verify -q
276 280
277 281 $ cd ..
@@ -1,79 +1,75 b''
1 Make a narrow clone then archive it
1 Test exclusion-based ACL enforcement
2 2 $ . "$TESTDIR/narrow-library.sh"
3 3
4 4 $ hg init master
5 5 $ cd master
6 6
7 7 $ for x in `$TESTDIR/seq.py 3`; do
8 8 > echo $x > "f$x"
9 9 > hg add "f$x"
10 10 > hg commit -m "Add $x"
11 11 > done
12 12 $ cat >> .hg/hgrc << EOF
13 13 > [narrowacl]
14 > default.includes=f1 f2
14 > default.includes=*
15 > default.excludes=f2 f3
16 > test.excludes=f3
15 17 > EOF
16 18 $ hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid
17 19 $ cat hg.pid >> "$DAEMON_PIDS"
18 20
19 21 $ cd ..
20 22 $ hg clone http://localhost:$HGPORT1 narrowclone1
21 23 requesting all changes
22 24 adding changesets
23 25 adding manifests
24 26 adding file changes
25 27 added 3 changesets with 2 changes to 2 files
26 28 new changesets * (glob)
27 29 updating to branch default
28 30 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
29 31
30 32 The clone directory should only contain f1 and f2
31 33 $ ls -A -1 narrowclone1 | sort
32 34 .hg
33 35 f1
34 36 f2
35 37
36 38 Requirements should contain narrowhg
37 39 $ hg debugrequires -R narrowclone1 | grep narrowhg
38 40 narrowhg-experimental
39 41
40 NarrowHG should track f1 and f2
42 NarrowHG should exclude f3.
41 43 $ hg -R narrowclone1 tracked
42 I path:f1
43 I path:f2
44 I path:.
45 X path:f3
44 46
45 47 Narrow should not be able to widen to include f3
46 48 $ hg -R narrowclone1 tracked --addinclude f3
47 49 comparing with http://localhost:$HGPORT1/
48 50 searching for changes
49 abort: The following includes are not accessible for test: ['path:f3']
51 adding changesets
52 adding manifests
53 adding file changes
54 $ ls -A -1 narrowclone1 | sort
55 .hg
56 f1
57 f2
58 $ hg -R narrowclone1 tracked
59 I path:.
60 X path:f3
61
62
63 Narrow should not be able to remove the exclusion for f3
64 $ hg -R narrowclone1 tracked --removeexclude f3
65 comparing with http://localhost:$HGPORT1/
66 searching for changes
67 abort: The following excludes cannot be removed for test: ['path:f3']
50 68 [255]
51 69 $ ls -A -1 narrowclone1 | sort
52 70 .hg
53 71 f1
54 72 f2
55 73 $ hg -R narrowclone1 tracked
56 I path:f1
57 I path:f2
58
59 Narrow should allow widen to include f2
60 $ hg -R narrowclone1 tracked --removeinclude f2 > /dev/null
61 $ hg -R narrowclone1 tracked
62 I path:f1
63 $ ls -A -1 narrowclone1 | sort
64 .hg
65 f1
66 $ hg -R narrowclone1 tracked --addinclude f2
67 comparing with http://localhost:$HGPORT1/
68 searching for changes
69 adding changesets
70 adding manifests
71 adding file changes
72 added 0 changesets with 1 changes to 1 files
73 $ hg -R narrowclone1 tracked
74 I path:f1
75 I path:f2
76 $ ls -A -1 narrowclone1 | sort
77 .hg
78 f1
79 f2
74 I path:.
75 X path:f3
General Comments 0
You need to be logged in to leave comments. Login now