mirror of
https://github.com/facebook/sapling.git
synced 2024-12-28 15:44:27 +03:00
codemod: remove unneeded files
Summary: Remove files that are ancient, not used, or not referred. The file list was initially generated via a Ruby script: (Dir['{contrib,tests}/**']-Dir['tests/test-*']).select{|name| `rg #{File.basename(name).split('.')[0]}`.empty?} Plus some manual selection. Some notes about deleted files: - Revset benchmarks: Benchmarks on the Rust side is a cleaner choice. - editmerge and hg-new-workdir: Newer versions live in fb/. Reviewed By: xavierd Differential Revision: D18541783 fbshipit-source-id: f08933d5c1a9c46d25322adbc2cc1e8a1b505d70
This commit is contained in:
parent
35e1f88a5f
commit
e5d47a8bde
158
eden/scm/.hgsigs
158
eden/scm/.hgsigs
@ -1,158 +0,0 @@
|
||||
35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0 iD8DBQBEYmO2ywK+sNU5EO8RAnaYAKCO7x15xUn5mnhqWNXqk/ehlhRt2QCfRDfY0LrUq2q4oK/KypuJYPHgq1A=
|
||||
2be3001847cb18a23c403439d9e7d0ace30804e9 0 iD8DBQBExUbjywK+sNU5EO8RAhzxAKCtyHAQUzcTSZTqlfJ0by6vhREwWQCghaQFHfkfN0l9/40EowNhuMOKnJk=
|
||||
36a957364b1b89c150f2d0e60a99befe0ee08bd3 0 iD8DBQBFfL2QywK+sNU5EO8RAjYFAKCoGlaWRTeMsjdmxAjUYx6diZxOBwCfY6IpBYsKvPTwB3oktnPt5Rmrlys=
|
||||
27230c29bfec36d5540fbe1c976810aefecfd1d2 0 iD8DBQBFheweywK+sNU5EO8RAt7VAKCrqJQWT2/uo2RWf0ZI4bLp6v82jACgjrMdsaTbxRsypcmEsdPhlG6/8F4=
|
||||
fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0 iD8DBQBGgHicywK+sNU5EO8RAgNxAJ0VG8ixAaeudx4sZbhngI1syu49HQCeNUJQfWBgA8bkJ2pvsFpNxwYaX3I=
|
||||
23889160905a1b09fffe1c07378e9fc1827606eb 0 iD8DBQBHGTzoywK+sNU5EO8RAr/UAJ0Y8s4jQtzgS+G9vM8z6CWBThZ8fwCcCT5XDj2XwxKkz/0s6UELwjsO3LU=
|
||||
bae2e9c838e90a393bae3973a7850280413e091a 0 iD8DBQBH6DO5ywK+sNU5EO8RAsfrAJ0e4r9c9GF/MJsM7Xjd3NesLRC3+ACffj6+6HXdZf8cswAoFPO+DY00oD0=
|
||||
d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 0 iD8DBQBINdwsywK+sNU5EO8RAjIUAKCPmlFJSpsPAAUKF+iNHAwVnwmzeQCdEXrL27CWclXuUKdbQC8De7LICtE=
|
||||
d2375bbee6d47e62ba8e415c86e83a465dc4dce9 0 iD8DBQBIo1wpywK+sNU5EO8RAmRNAJ94x3OFt6blbqu/yBoypm/AJ44fuACfUaldXcV5z9tht97hSp22DVTEPGc=
|
||||
2a67430f92f15ea5159c26b09ec4839a0c549a26 0 iEYEABECAAYFAkk1hykACgkQywK+sNU5EO85QACeNJNUanjc2tl4wUoPHNuv+lSj0ZMAoIm93wSTc/feyYnO2YCaQ1iyd9Nu
|
||||
3773e510d433969e277b1863c317b674cbee2065 0 iEYEABECAAYFAklNbbAACgkQywK+sNU5EO8o+gCfeb2/lfIJZMvyDA1m+G1CsBAxfFsAoIa6iAMG8SBY7hW1Q85Yf/LXEvaE
|
||||
11a4eb81fb4f4742451591489e2797dc47903277 0 iEYEABECAAYFAklcAnsACgkQywK+sNU5EO+uXwCbBVHNNsLy1g7BlAyQJwadYVyHOXoAoKvtAVO71+bv7EbVoukwTzT+P4Sx
|
||||
11efa41037e280d08cfb07c09ad485df30fb0ea8 0 iEYEABECAAYFAkmvJRQACgkQywK+sNU5EO9XZwCeLMgDgPSMWMm6vgjL4lDs2pEc5+0AnRxfiFbpbBfuEFTqKz9nbzeyoBlx
|
||||
02981000012e3adf40c4849bd7b3d5618f9ce82d 0 iEYEABECAAYFAknEH3wACgkQywK+sNU5EO+uXwCeI+LbLMmhjU1lKSfU3UWJHjjUC7oAoIZLvYDGOL/tNZFUuatc3RnZ2eje
|
||||
196d40e7c885fa6e95f89134809b3ec7bdbca34b 0 iEYEABECAAYFAkpL2X4ACgkQywK+sNU5EO9FOwCfXJycjyKJXsvQqKkHrglwOQhEKS4An36GfKzptfN8b1qNc3+ya/5c2WOM
|
||||
3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 0 iEYEABECAAYFAkpopLIACgkQywK+sNU5EO8QSgCfZ0ztsd071rOa2lhmp9Fyue/WoI0AoLTei80/xrhRlB8L/rZEf2KBl8dA
|
||||
31ec469f9b556f11819937cf68ee53f2be927ebf 0 iEYEABECAAYFAksBuxAACgkQywK+sNU5EO+mBwCfagB+A0txzWZ6dRpug3LEoK7Z1QsAoKpbk8vsLjv6/oRDicSk/qBu33+m
|
||||
439d7ea6fe3aa4ab9ec274a68846779153789de9 0 iEYEABECAAYFAksVw0kACgkQywK+sNU5EO/oZwCfdfBEkgp38xq6wN2F4nj+SzofrJIAnjmxt04vaJSeOOeHylHvk6lzuQsw
|
||||
296a0b14a68621f6990c54fdba0083f6f20935bf 0 iEYEABECAAYFAks+jCoACgkQywK+sNU5EO9J8wCeMUGF9E/gS2UBsqIz56WS4HMPRPUAoI5J95mwEIK8Clrl7qFRidNI6APq
|
||||
4aa619c4c2c09907034d9824ebb1dd0e878206eb 0 iEYEABECAAYFAktm9IsACgkQywK+sNU5EO9XGgCgk4HclRQhexEtooPE5GcUCdB6M8EAn2ptOhMVbIoO+JncA+tNACPFXh0O
|
||||
ff2704a8ded37fbebd8b6eb5ec733731d725da8a 0 iEYEABECAAYFAkuRoSQACgkQywK+sNU5EO//3QCeJDc5r2uFyFCtAlpSA27DEE5rrxAAn2FSwTy9fhrB3QAdDQlwkEZcQzDh
|
||||
2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 0 iEYEABECAAYFAku1IwIACgkQywK+sNU5EO9MjgCdHLVwkTZlNHxhcznZKBL1rjN+J7cAoLLWi9LTL6f/TgBaPSKOy1ublbaW
|
||||
39f725929f0c48c5fb3b90c071fc3066012456ca 0 iEYEABECAAYFAkvclvsACgkQywK+sNU5EO9FSwCeL9i5x8ALW/LE5+lCX6MFEAe4MhwAn1ev5o6SX6GrNdDfKweiemfO2VBk
|
||||
fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 0 iEYEABECAAYFAkvsKTkACgkQywK+sNU5EO9qEACgiSiRGvTG2vXGJ65tUSOIYihTuFAAnRzRIqEVSw8M8/RGeUXRps0IzaCO
|
||||
24fe2629c6fd0c74c90bd066e77387c2b02e8437 0 iEYEABECAAYFAkwFLRsACgkQywK+sNU5EO+pJACgp13tPI+pbwKZV+LeMjcQ4H6tCZYAoJebzhd6a8yYx6qiwpJxA9BXZNXy
|
||||
f786fc4b8764cd2a5526d259cf2f94d8a66924d9 0 iEYEABECAAYFAkwsyxcACgkQywK+sNU5EO+crACfUpNAF57PmClkSri9nJcBjb2goN4AniPCNaKvnki7TnUsi1u2oxltpKKL
|
||||
bf1774d95bde614af3956d92b20e2a0c68c5fec7 0 iEYEABECAAYFAkxVwccACgkQywK+sNU5EO+oFQCeJzwZ+we1fIIyBGCddHceOUAN++cAnjvT6A8ZWW0zV21NXIFF1qQmjxJd
|
||||
c00f03a4982e467fb6b6bd45908767db6df4771d 0 iEYEABECAAYFAkxXDqsACgkQywK+sNU5EO/GJACfT9Rz4hZOxPQEs91JwtmfjevO84gAmwSmtfo5mmWSm8gtTUebCcdTv0Kf
|
||||
ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 0 iD8DBQBMdo+qywK+sNU5EO8RAqQpAJ975BL2CCAiWMz9SXthNQ9xG181IwCgp4O+KViHPkufZVFn2aTKMNvcr1A=
|
||||
93d8bff78c96fe7e33237b257558ee97290048a4 0 iD8DBQBMpfvdywK+sNU5EO8RAsxVAJ0UaL1XB51C76JUBhafc9GBefuMxwCdEWkTOzwvE0SarJBe9i008jhbqW4=
|
||||
333421b9e0f96c7bc788e5667c146a58a9440a55 0 iD8DBQBMz0HOywK+sNU5EO8RAlsEAJ0USh6yOG7OrWkADGunVt9QimBQnwCbBqeMnKgSbwEw8jZwE3Iz1mdrYlo=
|
||||
4438875ec01bd0fc32be92b0872eb6daeed4d44f 0 iD8DBQBM4WYUywK+sNU5EO8RAhCVAJ0dJswachwFAHALmk1x0RJehxzqPQCbBNskP9n/X689jB+btNTZTyKU/fw=
|
||||
6aff4f144ad356311318b0011df0bb21f2c97429 0 iD8DBQBM9uxXywK+sNU5EO8RAv+4AKCDj4qKP16GdPaq1tP6BUwpM/M1OACfRyzLPp/qiiN8xJTWoWYSe/XjJug=
|
||||
e3bf16703e2601de99e563cdb3a5d50b64e6d320 0 iD8DBQBNH8WqywK+sNU5EO8RAiQTAJ9sBO+TeiGro4si77VVaQaA6jcRUgCfSA28dBbjj0oFoQwvPoZjANiZBH8=
|
||||
a6c855c32ea081da3c3b8ff628f1847ff271482f 0 iD8DBQBNSJJ+ywK+sNU5EO8RAoJaAKCweDEF70fu+r1Zn7pYDXdlk5RuSgCeO9gK/eit8Lin/1n3pO7aYguFLok=
|
||||
2b2155623ee2559caf288fd333f30475966c4525 0 iD8DBQBNSJeBywK+sNU5EO8RAm1KAJ4hW9Cm9nHaaGJguchBaPLlAr+O3wCgqgmMok8bdAS06N6PL60PSTM//Gg=
|
||||
2616325766e3504c8ae7c84bd15ee610901fe91d 0 iD8DBQBNbWy9ywK+sNU5EO8RAlWCAJ4mW8HbzjJj9GpK98muX7k+7EvEHwCfaTLbC/DH3QEsZBhEP+M8tzL6RU4=
|
||||
aa1f3be38ab127280761889d2dca906ca465b5f4 0 iD8DBQBNeQq7ywK+sNU5EO8RAlEOAJ4tlEDdetE9lKfjGgjbkcR8PrC3egCfXCfF3qNVvU/2YYjpgvRwevjvDy0=
|
||||
b032bec2c0a651ca0ddecb65714bfe6770f67d70 0 iD8DBQBNlg5kywK+sNU5EO8RAnGEAJ9gmEx6MfaR4XcG2m/93vwtfyzs3gCgltzx8/YdHPwqDwRX/WbpYgi33is=
|
||||
3cb1e95676ad089596bd81d0937cad37d6e3b7fb 0 iD8DBQBNvTy4ywK+sNU5EO8RAmp8AJ9QnxK4jTJ7G722MyeBxf0UXEdGwACgtlM7BKtNQfbEH/fOW5y+45W88VI=
|
||||
733af5d9f6b22387913e1d11350fb8cb7c1487dd 0 iD8DBQBN5q/8ywK+sNU5EO8RArRGAKCNGT94GKIYtSuwZ57z1sQbcw6uLACfffpbMV4NAPMl8womAwg+7ZPKnIU=
|
||||
de9eb6b1da4fc522b1cab16d86ca166204c24f25 0 iD8DBQBODhfhywK+sNU5EO8RAr2+AJ4ugbAj8ae8/K0bYZzx3sascIAg1QCeK3b+zbbVVqd3b7CDpwFnaX8kTd4=
|
||||
4a43e23b8c55b4566b8200bf69fe2158485a2634 0 iD8DBQBONzIMywK+sNU5EO8RAj5SAJ0aPS3+JHnyI6bHB2Fl0LImbDmagwCdGbDLp1S7TFobxXudOH49bX45Iik=
|
||||
d629f1e89021103f1753addcef6b310e4435b184 0 iD8DBQBOWAsBywK+sNU5EO8RAht4AJwJl9oNFopuGkj5m8aKuf7bqPkoAQCeNrEm7UhFsZKYT5iUOjnMV7s2LaM=
|
||||
351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg=
|
||||
384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI=
|
||||
41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4=
|
||||
195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo=
|
||||
6344043924497cd06d781d9014c66802285072e4 0 iD8DBQBPALgmywK+sNU5EO8RAlfhAJ9nYOdWnhfVDHYtDTJAyJtXBAQS9wCgnefoSQt7QABkbGxM+Q85UYEBuD0=
|
||||
db33555eafeaf9df1e18950e29439eaa706d399b 0 iD8DBQBPGdzxywK+sNU5EO8RAppkAJ9jOXhUVE/97CPgiMA0pMGiIYnesQCfengAszcBiSiKGugiI8Okc9ghU+Y=
|
||||
2aa5b51f310fb3befd26bed99c02267f5c12c734 0 iD8DBQBPKZ9bywK+sNU5EO8RAt1TAJ45r1eJ0YqSkInzrrayg4TVCh0SnQCgm0GA/Ua74jnnDwVQ60lAwROuz1Q=
|
||||
53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 0 iD8DBQBPT/fvywK+sNU5EO8RAnfYAKCn7d0vwqIb100YfWm1F7nFD5B+FACeM02YHpQLSNsztrBCObtqcnfod7Q=
|
||||
b9bd95e61b49c221c4cca24e6da7c946fc02f992 0 iD8DBQBPeLsIywK+sNU5EO8RAvpNAKCtKe2gitz8dYn52IRF0hFOPCR7AQCfRJL/RWCFweu2T1vH/mUOCf8SXXc=
|
||||
d9e2f09d5488c395ae9ddbb320ceacd24757e055 0 iD8DBQBPju/dywK+sNU5EO8RArBYAJ9xtifdbk+hCOJO8OZa4JfHX8OYZQCeKPMBaBWiT8N/WHoOm1XU0q+iono=
|
||||
00182b3d087909e3c3ae44761efecdde8f319ef3 0 iD8DBQBPoFhIywK+sNU5EO8RAhzhAKCBj1n2jxPTkZNJJ5pSp3soa+XHIgCgsZZpAQxOpXwCp0eCdNGe0+pmxmg=
|
||||
5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 0 iD8DBQBPovNWywK+sNU5EO8RAhgiAJ980T91FdPTRMmVONDhpkMsZwVIMACgg3bKvoWSeuCW28llUhAJtUjrMv0=
|
||||
85a358df5bbbe404ca25730c9c459b34263441dc 0 iD8DBQBPyZsWywK+sNU5EO8RAnpLAJ48qrGDJRT+pteS0mSQ11haqHstPwCdG4ccGbk+0JHb7aNy8/NRGAOqn9w=
|
||||
b013baa3898e117959984fc64c29d8c784d2f28b 0 iD8DBQBP8QOPywK+sNU5EO8RAqimAKCFRSx0lvG6y8vne2IhNG062Hn0dACeMLI5/zhpWpHBIVeAAquYfx2XFeA=
|
||||
7f5094bb3f423fc799e471aac2aee81a7ce57a0b 0 iD8DBQBQGiL8ywK+sNU5EO8RAq5oAJ4rMMCPx6O+OuzNXVOexogedWz/QgCeIiIxLd76I4pXO48tdXhr0hQcBuM=
|
||||
072209ae4ddb654eb2d5fd35bff358c738414432 0 iD8DBQBQQkq0ywK+sNU5EO8RArDTAJ9nk5CySnNAjAXYvqvx4uWCw9ThZwCgqmFRehH/l+oTwj3f8nw8u8qTCdc=
|
||||
b3f0f9a39c4e1d0250048cd803ab03542d6f140a 0 iD8DBQBQamltywK+sNU5EO8RAlsqAJ4qF/m6aFu4mJCOKTiAP5RvZFK02ACfawYShUZO6OXEFfveU0aAxDR0M1k=
|
||||
d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 0 iD8DBQBQgPV5ywK+sNU5EO8RArylAJ0abcx5NlDjyv3ZDWpAfRIHyRsJtQCgn4TMuEayqgxzrvadQZHdTEU2g38=
|
||||
195ad823b5d58c68903a6153a25e3fb4ed25239d 0 iD8DBQBQkuT9ywK+sNU5EO8RAhB4AKCeerItoK2Jipm2cVf4euGofAa/WACeJj3TVd4pFILpb+ogj7ebweFLJi0=
|
||||
0c10cf8191469e7c3c8844922e17e71a176cb7cb 0 iD8DBQBQvQWoywK+sNU5EO8RAnq3AJoCn98u4geFx5YaQaeh99gFhCd7bQCgjoBwBSUyOvGd0yBy60E3Vv3VZhM=
|
||||
a4765077b65e6ae29ba42bab7834717b5072d5ba 0 iD8DBQBQ486sywK+sNU5EO8RAhmJAJ90aLfLKZhmcZN7kqphigQJxiFOQACeJ5IUZxjGKH4xzi3MrgIcx9n+dB0=
|
||||
f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 0 iD8DBQBQ+yuYywK+sNU5EO8RAm9JAJoD/UciWvpGeKBcpGtZJBFJVcL/HACghDXSgQ+xQDjB+6uGrdgAQsRR1Lg=
|
||||
a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 0 iD8DBQBRDDROywK+sNU5EO8RAh75AJ9uJCGoCWnP0Lv/+XuYs4hvUl+sAgCcD36QgAnuw8IQXrvv684BAXAnHcA=
|
||||
7511d4df752e61fe7ae4f3682e0a0008573b0402 0 iD8DBQBRFYaoywK+sNU5EO8RAuErAJoDyhXn+lptU3+AevVdwAIeNFyR2gCdHzPHyWd+JDeWCUR+pSOBi8O2ppM=
|
||||
5b7175377babacce80a6c1e12366d8032a6d4340 0 iD8DBQBRMCYgywK+sNU5EO8RAq1/AKCWKlt9ysibyQgYwoxxIOZv5J8rpwCcDSHQaaf1fFZUTnQsOePwcM2Y/Sg=
|
||||
50c922c1b5145dab8baefefb0437d363b6a6c21c 0 iD8DBQBRWnUnywK+sNU5EO8RAuQRAJwM42cJqJPeqJ0jVNdMqKMDqr4dSACeP0cRVGz1gitMuV0x8f3mrZrqc7I=
|
||||
8a7bd2dccd44ed571afe7424cd7f95594f27c092 0 iD8DBQBRXfBvywK+sNU5EO8RAn+LAKCsMmflbuXjYRxlzFwId5ptm8TZcwCdGkyLbZcASBOkzQUm/WW1qfknJHU=
|
||||
292cd385856d98bacb2c3086f8897bc660c2beea 0 iD8DBQBRcM0BywK+sNU5EO8RAjp4AKCJBykQbvXhKuvLSMxKx3a2TBiXcACfbr/kLg5GlZTF/XDPmY+PyHgI/GM=
|
||||
23f785b38af38d2fca6b8f3db56b8007a84cd73a 0 iD8DBQBRgZwNywK+sNU5EO8RAmO4AJ4u2ILGuimRP6MJgE2t65LZ5dAdkACgiENEstIdrlFC80p+sWKD81kKIYI=
|
||||
ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 0 iD8DBQBRkswvywK+sNU5EO8RAiYYAJsHTHyHbJeAgmGvBTmDrfcKu4doUgCeLm7eGBjx7yAPUvEtxef8rAkQmXI=
|
||||
cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 0 iD8DBQBRqnFLywK+sNU5EO8RAsWNAJ9RR6t+y1DLFc2HeH0eN9VfZAKF9gCeJ8ezvhtKq/LMs0/nvcgKQc/d5jk=
|
||||
009794acc6e37a650f0fae37872e733382ac1c0c 0 iD8DBQBR0guxywK+sNU5EO8RArNkAKCq9pMihVzP8Os5kCmgbWpe5C37wgCgqzuPZTHvAsXF5wTyaSTMVa9Ccq4=
|
||||
f0d7721d7322dcfb5af33599c2543f27335334bb 0 iD8DBQBR8taaywK+sNU5EO8RAqeEAJ4idDhhDuEsgsUjeQgWNj498matHACfT67gSF5w0ylsrBx1Hb52HkGXDm0=
|
||||
f37b5a17e6a0ee17afde2cdde5393dd74715fb58 0 iD8DBQBR+ymFywK+sNU5EO8RAuSdAJkBMcd9DAZ3rWE9WGKPm2YZ8LBoXACfXn/wbEsVy7ZgJoUwiWmHSnQaWCI=
|
||||
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=
|
||||
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
|
@ -1,11 +0,0 @@
|
||||
{
|
||||
// Enforcing
|
||||
"eqeqeq" : true, // true: Require triple equals (===) for comparison
|
||||
"forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
|
||||
"freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc.
|
||||
"nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters.
|
||||
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
|
||||
|
||||
// Environments
|
||||
"browser" : true // Web Browser (window, document, etc)
|
||||
}
|
@ -1,76 +0,0 @@
|
||||
PYTHONVER=2.7.10
|
||||
PYTHONNAME=python-
|
||||
PREFIX=$(HOME)/bin/prefix-$(PYTHONNAME)$(PYTHONVER)
|
||||
SYMLINKDIR=$(HOME)/bin
|
||||
|
||||
help:
|
||||
@echo
|
||||
@echo 'Make a custom installation of a Python version'
|
||||
@echo
|
||||
@echo 'Common make parameters:'
|
||||
@echo ' PYTHONVER=... [$(PYTHONVER)]'
|
||||
@echo ' PREFIX=... [$(PREFIX)]'
|
||||
@echo ' SYMLINKDIR=... [$(SYMLINKDIR) creating $(PYTHONNAME)$(PYTHONVER)]'
|
||||
@echo
|
||||
@echo 'Common make targets:'
|
||||
@echo ' python - install Python $$PYTHONVER in $$PREFIX'
|
||||
@echo ' symlink - create a $$SYMLINKDIR/$(PYTHONNAME)$$PYTHONVER symlink'
|
||||
@echo
|
||||
@echo 'Example: create a temporary Python installation:'
|
||||
@echo ' $$ make -f Makefile.python python PYTHONVER=${PYTHONVER} PREFIX=/tmp/p27'
|
||||
@echo ' $$ /tmp/p27/bin/python -V'
|
||||
@echo ' Python 2.7'
|
||||
@echo
|
||||
@echo 'Some external libraries are required for building Python: zlib bzip2 openssl.'
|
||||
@echo 'Make sure their development packages are installed systemwide.'
|
||||
# fedora: yum install zlib-devel bzip2-devel openssl-devel
|
||||
# debian: apt-get install zlib1g-dev libbz2-dev libssl-dev
|
||||
@echo
|
||||
@echo 'To build a nice collection of interesting Python versions:'
|
||||
@echo ' $$ for v in 2.{6{,.1,.2,.9},7{,.8,.10}}; do'
|
||||
@echo ' make -f Makefile.python symlink PYTHONVER=$$v || break; done'
|
||||
@echo 'To run a Mercurial test on all these Python versions:'
|
||||
@echo ' $$ for py in `cd ~/bin && ls $(PYTHONNAME)2.*`; do'
|
||||
@echo ' echo $$py; $$py run-tests.py test-http.t; echo; done'
|
||||
@echo
|
||||
|
||||
export LANGUAGE=C
|
||||
export LC_ALL=C
|
||||
|
||||
python: $(PREFIX)/bin/python docutils
|
||||
printf 'import sys, zlib, bz2, docutils, ssl' | $(PREFIX)/bin/python
|
||||
|
||||
PYTHON_SRCDIR=Python-$(PYTHONVER)
|
||||
PYTHON_SRCFILE=$(PYTHON_SRCDIR).tgz
|
||||
|
||||
$(PREFIX)/bin/python:
|
||||
[ -f $(PYTHON_SRCFILE) ] || wget http://www.python.org/ftp/python/$(PYTHONVER)/$(PYTHON_SRCFILE) || curl -OL http://www.python.org/ftp/python/$(PYTHONVER)/$(PYTHON_SRCFILE) || [ -f $(PYTHON_SRCFILE) ]
|
||||
rm -rf $(PYTHON_SRCDIR)
|
||||
tar xf $(PYTHON_SRCFILE)
|
||||
# Debian/Ubuntu disables SSLv2,3 the hard way, disable it on old Pythons too
|
||||
-sed -i 's,self.*SSLv[23]_method(),0;//\0,g' $(PYTHON_SRCDIR)/Modules/_ssl.c
|
||||
# Find multiarch system libraries on Ubuntu and disable fortify error when setting argv
|
||||
LDFLAGS="-L/usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH`"; \
|
||||
BASECFLAGS=-U_FORTIFY_SOURCE; \
|
||||
export LDFLAGS BASECFLAGS; \
|
||||
cd $(PYTHON_SRCDIR) && ./configure --prefix=$(PREFIX) && make all SVNVERSION=pwd && make install
|
||||
printf 'import sys, zlib, bz2, ssl' | $(PREFIX)/bin/python
|
||||
rm -rf $(PYTHON_SRCDIR)
|
||||
|
||||
DOCUTILSVER=0.12
|
||||
DOCUTILS_SRCDIR=docutils-$(DOCUTILSVER)
|
||||
DOCUTILS_SRCFILE=$(DOCUTILS_SRCDIR).tar.gz
|
||||
|
||||
docutils: $(PREFIX)/bin/python
|
||||
@$(PREFIX)/bin/python -c 'import docutils' || ( set -ex; \
|
||||
[ -f $(DOCUTILS_SRCFILE) ] || wget http://downloads.sourceforge.net/project/docutils/docutils/$(DOCUTILSVER)/$(DOCUTILS_SRCFILE) || [ -f $(DOCUTILS_SRCFILE) ]; \
|
||||
rm -rf $(DOCUTILS_SRCDIR); \
|
||||
tar xf $(DOCUTILS_SRCFILE); \
|
||||
cd $(DOCUTILS_SRCDIR) && $(PREFIX)/bin/python setup.py install --prefix=$(PREFIX); \
|
||||
$(PREFIX)/bin/python -c 'import docutils'; \
|
||||
rm -rf $(DOCUTILS_SRCDIR); )
|
||||
|
||||
symlink: python $(SYMLINKDIR)
|
||||
ln -sf $(PREFIX)/bin/python $(SYMLINKDIR)/$(PYTHONNAME)$(PYTHONVER)
|
||||
|
||||
.PHONY: help python docutils symlink
|
@ -1,137 +0,0 @@
|
||||
# All revsets ever used with revsetbenchmarks.py script
|
||||
#
|
||||
# The goal of this file is to gather all revsets ever used for benchmarking
|
||||
# revset's performance. It should be used to gather revsets that test a
|
||||
# specific usecase or a specific implementation of revset predicates.
|
||||
# If you are working on the smartset implementation itself, check
|
||||
# 'base-revsets.txt'.
|
||||
#
|
||||
# Please update this file with any revsets you use for benchmarking a change so
|
||||
# that future contributors can easily find and retest it when doing further
|
||||
# modification. Feel free to highlight interesting variants if needed.
|
||||
|
||||
|
||||
## Revset from this section are all extracted from changelog when this file was
|
||||
# created. Feel free to dig and improve documentation.
|
||||
|
||||
# Used in revision da05fe01170b
|
||||
(20000::) - (20000)
|
||||
# Used in revision 95af98616aa7
|
||||
parents(20000)
|
||||
# Used in revision 186fd06283b4
|
||||
(_intlist('20000\x0020001')) and merge()
|
||||
# Used in revision 911f5a6579d1
|
||||
p1(20000)
|
||||
p2(10000)
|
||||
# Used in revision b6dc3b79bb25
|
||||
0::
|
||||
# Used in revision faf4f63533ff
|
||||
bookmark()
|
||||
# Used in revision 22ba2c0825da
|
||||
tip~25
|
||||
# Used in revision 0cf46b8298fe
|
||||
bisect(range)
|
||||
# Used in revision 5b65429721d5
|
||||
divergent()
|
||||
# Used in revision 6261b9c549a2
|
||||
file(COPYING)
|
||||
# Used in revision 44f471102f3a
|
||||
follow(COPYING)
|
||||
# Used in revision 8040a44aab1c
|
||||
origin(tip)
|
||||
# Used in revision bbf4f3dfd700
|
||||
rev(25)
|
||||
# Used in revision a428db9ab61d
|
||||
p1()
|
||||
# Used in revision c1546d7400ef
|
||||
min(0::)
|
||||
# Used in revision 546fa6576815
|
||||
author(lmoscovicz) or author(mpm)
|
||||
author(mpm) or author(lmoscovicz)
|
||||
# Used in revision 9bfe68357c01
|
||||
public() and id("d82e2223f132")
|
||||
# Used in revision ba89f7b542c9
|
||||
rev(25)
|
||||
# Used in revision eb763217152a
|
||||
rev(210000)
|
||||
# Used in revision 69524a05a7fa
|
||||
10:100
|
||||
parents(10):parents(100)
|
||||
# Used in revision 6f1b8b3f12fd
|
||||
100~5
|
||||
parents(100)~5
|
||||
(100~5)~5
|
||||
# Used in revision 7a42e5d4c418
|
||||
children(tip~100)
|
||||
# Used in revision 7e8737e6ab08
|
||||
100^1
|
||||
parents(100)^1
|
||||
(100^1)^1
|
||||
# Used in revision 30e0dcd7c5ff
|
||||
matching(100)
|
||||
matching(parents(100))
|
||||
# Used in revision aafeaba22826
|
||||
0|1|2|3|4|5|6|7|8|9
|
||||
# Used in revision 33c7a94d4dd0
|
||||
tip:0
|
||||
# Used in revision 7d369fae098e
|
||||
(0:100000)
|
||||
# Used in revision b333ca94403d
|
||||
0 + 1 + 2 + ... + 200
|
||||
0 + 1 + 2 + ... + 1000
|
||||
sort(0 + 1 + 2 + ... + 200)
|
||||
sort(0 + 1 + 2 + ... + 1000)
|
||||
# Used in revision 7fbef7932af9
|
||||
first(0 + 1 + 2 + ... + 1000)
|
||||
# Used in revision ceaf04bb14ff
|
||||
0:1000
|
||||
# Used in revision 262e6ad93885
|
||||
not public()
|
||||
(tip~1000::) - public()
|
||||
not public() and branch("default")
|
||||
# Used in revision 15412bba5a68
|
||||
0::tip
|
||||
|
||||
## all the revsets from this section have been taken from the former central file
|
||||
# for revset's benchmarking, they are undocumented for this reason.
|
||||
all()
|
||||
draft()
|
||||
::tip
|
||||
draft() and ::tip
|
||||
::tip and draft()
|
||||
author(lmoscovicz)
|
||||
author(mpm)
|
||||
::p1(p1(tip))::
|
||||
public()
|
||||
:10000 and public()
|
||||
:10000 and draft()
|
||||
(not public() - obsolete())
|
||||
|
||||
# The one below is used by rebase
|
||||
(children(ancestor(tip~5, tip)) and ::(tip~5))::
|
||||
|
||||
# those two `roots(...)` inputs are close to what phase movement use.
|
||||
roots((tip~100::) - (tip~100::tip))
|
||||
roots((0::) - (0::tip))
|
||||
|
||||
# more roots testing
|
||||
roots(tip~100:)
|
||||
roots(:42)
|
||||
roots(not public())
|
||||
roots((0:tip)::)
|
||||
roots(0::tip)
|
||||
42:68 and roots(42:tip)
|
||||
# Used in revision f140d6207cca
|
||||
roots(0:tip)
|
||||
# test disjoint set with multiple roots
|
||||
roots((:42) + (tip~42:))
|
||||
|
||||
# Testing the behavior of "head()" in various situations
|
||||
head()
|
||||
head() - public()
|
||||
draft() and head()
|
||||
head() and author("mpm")
|
||||
|
||||
# testing the mutable phases set
|
||||
draft()
|
||||
secret()
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"project": "mercurial",
|
||||
"project_url": "https://mercurial-scm.org/",
|
||||
"repo": "..",
|
||||
"branches": ["default", "stable"],
|
||||
"environment_type": "virtualenv",
|
||||
"show_commit_url": "https://www.mercurial-scm.org/repo/hg/rev/",
|
||||
"benchmark_dir": "benchmarks",
|
||||
"env_dir": "../.asv/env",
|
||||
"results_dir": "../.asv/results",
|
||||
"html_dir": "../.asv/html"
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
# Base Revsets to be used with revsetbenchmarks.py script
|
||||
#
|
||||
# The goal of this file is to gather a limited amount of revsets that allow a
|
||||
# good coverage of the internal revsets mechanisms. Revsets included should not
|
||||
# be selected for their individual implementation, but for what they reveal of
|
||||
# the internal implementation of smartsets classes (and their interactions).
|
||||
#
|
||||
# Use and update this file when you change internal implementation of these
|
||||
# smartsets classes. Please include a comment explaining what each of your
|
||||
# addition is testing. Also check if your changes to the smartset class makes
|
||||
# some of the tests inadequate and replace them with a new one testing the same
|
||||
# behavior.
|
||||
#
|
||||
# If you want to benchmark revsets predicate itself, check 'all-revsets.txt'.
|
||||
#
|
||||
# The current content of this file is currently likely not reaching this goal
|
||||
# entirely, feel free, to audit its content and comment on each revset to
|
||||
# highlight what internal mechanisms they test.
|
||||
|
||||
all()
|
||||
draft()
|
||||
::tip
|
||||
draft() and ::tip
|
||||
::tip and draft()
|
||||
0::tip
|
||||
roots(0::tip)
|
||||
author(lmoscovicz)
|
||||
author(mpm)
|
||||
author(lmoscovicz) or author(mpm)
|
||||
author(mpm) or author(lmoscovicz)
|
||||
tip:0
|
||||
0::
|
||||
# those two `roots(...)` inputs are close to what phase movement use.
|
||||
roots((tip~100::) - (tip~100::tip))
|
||||
roots((0::) - (0::tip))
|
||||
42:68 and roots(42:tip)
|
||||
::p1(p1(tip))::
|
||||
public()
|
||||
:10000 and public()
|
||||
draft()
|
||||
:10000 and draft()
|
||||
roots((0:tip)::)
|
||||
(not public() - obsolete())
|
||||
(_intlist('20000\x0020001')) and merge()
|
||||
parents(20000)
|
||||
(20000::) - (20000)
|
||||
# The one below is used by rebase
|
||||
(children(ancestor(tip~5, tip)) and ::(tip~5))::
|
@ -1,119 +0,0 @@
|
||||
# __init__.py - asv benchmark suite
|
||||
#
|
||||
# Copyright 2016 Logilab SA <contact@logilab.fr>
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
# "historical portability" policy of contrib/benchmarks:
|
||||
#
|
||||
# We have to make this code work correctly with current mercurial stable branch
|
||||
# and if possible with reasonable cost with early Mercurial versions.
|
||||
|
||||
"""ASV (https://asv.readthedocs.io) benchmark suite
|
||||
|
||||
Benchmark are parameterized against reference repositories found in the
|
||||
directory pointed by the REPOS_DIR environment variable.
|
||||
|
||||
Invocation example:
|
||||
|
||||
$ export REPOS_DIR=~/hgperf/repos
|
||||
# run suite on given revision
|
||||
$ asv --config contrib/asv.conf.json run REV
|
||||
# run suite on new changesets found in stable and default branch
|
||||
$ asv --config contrib/asv.conf.json run NEW
|
||||
# display a comparative result table of benchmark results between two given
|
||||
# revisions
|
||||
$ asv --config contrib/asv.conf.json compare REV1 REV2
|
||||
# compute regression detection and generate ASV static website
|
||||
$ asv --config contrib/asv.conf.json publish
|
||||
# serve the static website
|
||||
$ asv --config contrib/asv.conf.json preview
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import functools
|
||||
import os
|
||||
import re
|
||||
|
||||
from edenscm.mercurial import extensions, hg, ui as uimod, util
|
||||
|
||||
|
||||
basedir = os.path.abspath(
|
||||
os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir)
|
||||
)
|
||||
reposdir = os.environ["REPOS_DIR"]
|
||||
reposnames = [
|
||||
name
|
||||
for name in os.listdir(reposdir)
|
||||
if os.path.isdir(os.path.join(reposdir, name, ".hg"))
|
||||
]
|
||||
if not reposnames:
|
||||
raise ValueError("No repositories found in $REPO_DIR")
|
||||
outputre = re.compile(
|
||||
(r"! wall (\d+.\d+) comb \d+.\d+ user \d+.\d+ sys " r"\d+.\d+ \(best of \d+\)")
|
||||
)
|
||||
|
||||
|
||||
def runperfcommand(reponame, command, *args, **kwargs):
|
||||
os.environ["HGRCPATH"] = os.environ.get("ASVHGRCPATH", "")
|
||||
# for "historical portability"
|
||||
# ui.load() has been available since d83ca85
|
||||
if util.safehasattr(uimod.ui, "load"):
|
||||
ui = uimod.ui.load()
|
||||
else:
|
||||
ui = uimod.ui()
|
||||
repo = hg.repository(ui, os.path.join(reposdir, reponame))
|
||||
perfext = extensions.load(
|
||||
ui, "perfext", os.path.join(basedir, "contrib", "perf.py")
|
||||
)
|
||||
cmd = getattr(perfext, command)
|
||||
ui.pushbuffer()
|
||||
cmd(ui, repo, *args, **kwargs)
|
||||
output = ui.popbuffer()
|
||||
match = outputre.search(output)
|
||||
if not match:
|
||||
raise ValueError("Invalid output {0}".format(output))
|
||||
return float(match.group(1))
|
||||
|
||||
|
||||
def perfbench(repos=reposnames, name=None, params=None):
|
||||
"""decorator to declare ASV benchmark based on contrib/perf.py extension
|
||||
|
||||
An ASV benchmark is a python function with the given attributes:
|
||||
|
||||
__name__: should start with track_, time_ or mem_ to be collected by ASV
|
||||
params and param_name: parameter matrix to display multiple graphs on the
|
||||
same page.
|
||||
pretty_name: If defined it's displayed in web-ui instead of __name__
|
||||
(useful for revsets)
|
||||
the module name is prepended to the benchmark name and displayed as
|
||||
"category" in webui.
|
||||
|
||||
Benchmarks are automatically parameterized with repositories found in the
|
||||
REPOS_DIR environment variable.
|
||||
|
||||
`params` is the param matrix in the form of a list of tuple
|
||||
(param_name, [value0, value1])
|
||||
|
||||
For example [(x, [a, b]), (y, [c, d])] declare benchmarks for
|
||||
(a, c), (a, d), (b, c) and (b, d).
|
||||
"""
|
||||
params = list(params or [])
|
||||
params.insert(0, ("repo", repos))
|
||||
|
||||
def decorator(func):
|
||||
@functools.wraps(func)
|
||||
def wrapped(repo, *args):
|
||||
def perf(command, *a, **kw):
|
||||
return runperfcommand(repo, command, *a, **kw)
|
||||
|
||||
return func(perf, *args)
|
||||
|
||||
wrapped.params = [p[1] for p in params]
|
||||
wrapped.param_names = [p[0] for p in params]
|
||||
wrapped.pretty_name = name
|
||||
return wrapped
|
||||
|
||||
return decorator
|
@ -1,30 +0,0 @@
|
||||
# perf.py - asv benchmarks using contrib/perf.py extension
|
||||
#
|
||||
# Copyright 2016 Logilab SA <contact@logilab.fr>
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
from . import perfbench
|
||||
|
||||
|
||||
@perfbench()
|
||||
def track_tags(perf):
|
||||
return perf("perftags")
|
||||
|
||||
|
||||
@perfbench()
|
||||
def track_status(perf):
|
||||
return perf("perfstatus", unknown=False)
|
||||
|
||||
|
||||
@perfbench(params=[("rev", ["1000", "10000", "tip"])])
|
||||
def track_manifest(perf, rev):
|
||||
return perf("perfmanifest", rev)
|
||||
|
||||
|
||||
@perfbench()
|
||||
def track_heads(perf):
|
||||
return perf("perfheads")
|
@ -1,57 +0,0 @@
|
||||
# revset.py - asv revset benchmarks
|
||||
#
|
||||
# Copyright 2016 Logilab SA <contact@logilab.fr>
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
"""ASV revset benchmarks generated from contrib/base-revsets.txt
|
||||
|
||||
Each revset benchmark is parameterized with variants (first, last, sort, ...)
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import os
|
||||
import string
|
||||
import sys
|
||||
|
||||
from . import basedir, perfbench
|
||||
|
||||
|
||||
def createrevsetbenchmark(baseset, variants=None):
|
||||
if variants is None:
|
||||
# Default variants
|
||||
variants = ["plain", "first", "last", "sort", "sort+first", "sort+last"]
|
||||
fname = "track_" + "_".join(
|
||||
"".join(
|
||||
[c if c in string.digits + string.letters else " " for c in baseset]
|
||||
).split()
|
||||
)
|
||||
|
||||
def wrap(fname, baseset):
|
||||
@perfbench(name=baseset, params=[("variant", variants)])
|
||||
def f(perf, variant):
|
||||
revset = baseset
|
||||
if variant != "plain":
|
||||
for var in variant.split("+"):
|
||||
revset = "%s(%s)" % (var, revset)
|
||||
return perf("perfrevset", revset)
|
||||
|
||||
f.__name__ = fname
|
||||
return f
|
||||
|
||||
return wrap(fname, baseset)
|
||||
|
||||
|
||||
def initializerevsetbenchmarks():
|
||||
mod = sys.modules[__name__]
|
||||
with open(os.path.join(basedir, "contrib", "base-revsets.txt"), "rb") as fh:
|
||||
for line in fh:
|
||||
baseset = line.strip()
|
||||
if baseset and not baseset.startswith("#"):
|
||||
func = createrevsetbenchmark(baseset)
|
||||
setattr(mod, func.__name__, func)
|
||||
|
||||
|
||||
initializerevsetbenchmarks()
|
@ -1,53 +0,0 @@
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import __builtin__
|
||||
import os
|
||||
|
||||
from edenscm.mercurial import util
|
||||
|
||||
|
||||
def lowerwrap(scope, funcname):
|
||||
f = getattr(scope, funcname)
|
||||
|
||||
def wrap(fname, *args, **kwargs):
|
||||
d, base = os.path.split(fname)
|
||||
try:
|
||||
files = os.listdir(d or ".")
|
||||
except OSError:
|
||||
files = []
|
||||
if base in files:
|
||||
return f(fname, *args, **kwargs)
|
||||
for fn in files:
|
||||
if fn.lower() == base.lower():
|
||||
return f(os.path.join(d, fn), *args, **kwargs)
|
||||
return f(fname, *args, **kwargs)
|
||||
|
||||
scope.__dict__[funcname] = wrap
|
||||
|
||||
|
||||
def normcase(path):
|
||||
return path.lower()
|
||||
|
||||
|
||||
os.path.normcase = normcase
|
||||
|
||||
for f in "file open".split():
|
||||
lowerwrap(__builtin__, f)
|
||||
|
||||
for f in "chmod chown open lstat stat remove unlink".split():
|
||||
lowerwrap(os, f)
|
||||
|
||||
for f in "exists lexists".split():
|
||||
lowerwrap(os.path, f)
|
||||
|
||||
lowerwrap(util, "posixfile")
|
@ -1,63 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
#
|
||||
# Dumps output generated by Mercurial's command server in a formatted style to a
|
||||
# given file or stderr if '-' is specified. Output is also written in its raw
|
||||
# format to stdout.
|
||||
#
|
||||
# $ ./hg serve --cmds pipe | ./contrib/debugcmdserver.py -
|
||||
# o, 52 -> 'capabilities: getencoding runcommand\nencoding: UTF-8'
|
||||
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import struct
|
||||
import sys
|
||||
|
||||
|
||||
if len(sys.argv) != 2:
|
||||
print("usage: debugcmdserver.py FILE")
|
||||
sys.exit(1)
|
||||
|
||||
outputfmt = ">cI"
|
||||
outputfmtsize = struct.calcsize(outputfmt)
|
||||
|
||||
if sys.argv[1] == "-":
|
||||
log = sys.stderr
|
||||
else:
|
||||
log = open(sys.argv[1], "a")
|
||||
|
||||
|
||||
def read(size):
|
||||
data = sys.stdin.read(size)
|
||||
if not data:
|
||||
raise EOFError
|
||||
sys.stdout.write(data)
|
||||
sys.stdout.flush()
|
||||
return data
|
||||
|
||||
|
||||
try:
|
||||
while True:
|
||||
header = read(outputfmtsize)
|
||||
channel, length = struct.unpack(outputfmt, header)
|
||||
log.write("%s, %-4d" % (channel, length))
|
||||
if channel in "IL":
|
||||
log.write(" -> waiting for input\n")
|
||||
else:
|
||||
data = read(length)
|
||||
log.write(" -> %r\n" % data)
|
||||
log.flush()
|
||||
except EOFError:
|
||||
pass
|
||||
finally:
|
||||
if log != sys.stderr:
|
||||
log.close()
|
@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# A simple script for opening merge conflicts in the editor.
|
||||
# Use the following Mercurial settings to enable it.
|
||||
#
|
||||
# [ui]
|
||||
# merge = editmerge
|
||||
#
|
||||
# [merge-tools]
|
||||
# editmerge.args=$output
|
||||
# editmerge.check=changed
|
||||
# editmerge.premerge=keep
|
||||
|
||||
FILE="$1"
|
||||
|
||||
getlines() {
|
||||
grep -n "^<<<<<<" "$FILE" | cut -f1 -d:
|
||||
}
|
||||
|
||||
# editor preference loosely based on https://mercurial-scm.org/wiki/editor
|
||||
# hg showconfig is at the bottom though, since it's slow to run (0.15 seconds)
|
||||
ED="$HGEDITOR"
|
||||
if [ "$ED" = "" ] ; then
|
||||
ED="$VISUAL"
|
||||
fi
|
||||
if [ "$ED" = "" ] ; then
|
||||
ED="$EDITOR"
|
||||
fi
|
||||
if [ "$ED" = "" ] ; then
|
||||
ED="$(hg showconfig ui.editor)"
|
||||
fi
|
||||
if [ "$ED" = "" ] ; then
|
||||
echo "merge failed - unable to find editor"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$ED" = "emacs" ] || [ "$ED" = "nano" ] || [ "$ED" = "vim" ] ; then
|
||||
FIRSTLINE="$(getlines | head -n 1)"
|
||||
PREVIOUSLINE=""
|
||||
|
||||
# open the editor to the first conflict until there are no more
|
||||
# or the user stops editing the file
|
||||
while [ ! "$FIRSTLINE" = "" ] && [ ! "$FIRSTLINE" = "$PREVIOUSLINE" ] ; do
|
||||
$ED "+$FIRSTLINE" "$FILE"
|
||||
PREVIOUSLINE="$FIRSTLINE"
|
||||
FIRSTLINE="$(getlines | head -n 1)"
|
||||
done
|
||||
else
|
||||
$ED "$FILE"
|
||||
fi
|
||||
|
||||
# get the line numbers of the remaining conflicts
|
||||
CONFLICTS="$(getlines | sed ':a;N;$!ba;s/\n/, /g')"
|
||||
if [ ! "$CONFLICTS" = "" ] ; then
|
||||
echo "merge failed - resolve the conflicts (line $CONFLICTS) then use 'hg resolve --mark'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
@ -1,150 +0,0 @@
|
||||
#!/usr/bin/env python2
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from edenscm.mercurial import util
|
||||
|
||||
|
||||
# Always load hg libraries from the hg we can find on $PATH.
|
||||
hglib = json.loads(subprocess.check_output(["hg", "debuginstall", "-Tjson"]))[0][
|
||||
"hgmodules"
|
||||
]
|
||||
sys.path.insert(0, os.path.dirname(hglib))
|
||||
|
||||
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument(
|
||||
"--paranoid",
|
||||
action="store_true",
|
||||
help=(
|
||||
"Be paranoid about how version numbers compare and "
|
||||
"produce something that's more likely to sort "
|
||||
"reasonably."
|
||||
),
|
||||
)
|
||||
ap.add_argument("--selftest", action="store_true", help="Run self-tests.")
|
||||
ap.add_argument("versionfile", help="Path to a valid mercurial __version__.py")
|
||||
|
||||
|
||||
def paranoidver(ver):
|
||||
"""Given an hg version produce something that distutils can sort.
|
||||
|
||||
Some Mac package management systems use distutils code in order to
|
||||
figure out upgrades, which makes life difficult. The test case is
|
||||
a reduced version of code in the Munki tool used by some large
|
||||
organizations to centrally manage OS X packages, which is what
|
||||
inspired this kludge.
|
||||
|
||||
>>> paranoidver('3.4')
|
||||
'3.4.0'
|
||||
>>> paranoidver('3.4.2')
|
||||
'3.4.2'
|
||||
>>> paranoidver('3.0-rc+10')
|
||||
'2.9.9999-rc+10'
|
||||
>>> paranoidver('4.2+483-5d44d7d4076e')
|
||||
'4.2.0+483-5d44d7d4076e'
|
||||
>>> paranoidver('4.2.1+598-48d1e1214d8c')
|
||||
'4.2.1+598-48d1e1214d8c'
|
||||
>>> paranoidver('4.3-rc')
|
||||
'4.2.9999-rc'
|
||||
>>> paranoidver('4.3')
|
||||
'4.3.0'
|
||||
>>> from distutils import version
|
||||
>>> class LossyPaddedVersion(version.LooseVersion):
|
||||
... '''Subclass version.LooseVersion to compare things like
|
||||
... "10.6" and "10.6.0" as equal'''
|
||||
... def __init__(self, s):
|
||||
... self.parse(s)
|
||||
...
|
||||
... def _pad(self, version_list, max_length):
|
||||
... 'Pad a version list by adding extra 0 components to the end'
|
||||
... # copy the version_list so we don't modify it
|
||||
... cmp_list = list(version_list)
|
||||
... while len(cmp_list) < max_length:
|
||||
... cmp_list.append(0)
|
||||
... return cmp_list
|
||||
...
|
||||
... def __cmp__(self, other):
|
||||
... if isinstance(other, str):
|
||||
... other = MunkiLooseVersion(other)
|
||||
... max_length = max(len(self.version), len(other.version))
|
||||
... self_cmp_version = self._pad(self.version, max_length)
|
||||
... other_cmp_version = self._pad(other.version, max_length)
|
||||
... return cmp(self_cmp_version, other_cmp_version)
|
||||
>>> def testver(older, newer):
|
||||
... o = LossyPaddedVersion(paranoidver(older))
|
||||
... n = LossyPaddedVersion(paranoidver(newer))
|
||||
... return o < n
|
||||
>>> testver('3.4', '3.5')
|
||||
True
|
||||
>>> testver('3.4.0', '3.5-rc')
|
||||
True
|
||||
>>> testver('3.4-rc', '3.5')
|
||||
True
|
||||
>>> testver('3.4-rc+10-deadbeef', '3.5')
|
||||
True
|
||||
>>> testver('3.4.2', '3.5-rc')
|
||||
True
|
||||
>>> testver('3.4.2', '3.5-rc+10-deadbeef')
|
||||
True
|
||||
>>> testver('4.2+483-5d44d7d4076e', '4.2.1+598-48d1e1214d8c')
|
||||
True
|
||||
>>> testver('4.3-rc', '4.3')
|
||||
True
|
||||
>>> testver('4.3', '4.3-rc')
|
||||
False
|
||||
"""
|
||||
major, minor, micro, extra = util.versiontuple(ver, n=4)
|
||||
if micro is None:
|
||||
micro = 0
|
||||
if extra:
|
||||
if extra.startswith("rc"):
|
||||
if minor == 0:
|
||||
major -= 1
|
||||
minor = 9
|
||||
else:
|
||||
minor -= 1
|
||||
micro = 9999
|
||||
extra = "-" + extra
|
||||
else:
|
||||
extra = "+" + extra
|
||||
else:
|
||||
extra = ""
|
||||
return "%d.%d.%d%s" % (major, minor, micro, extra)
|
||||
|
||||
|
||||
def main(argv):
|
||||
opts = ap.parse_args(argv[1:])
|
||||
if opts.selftest:
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
||||
return
|
||||
with open(opts.versionfile) as f:
|
||||
for l in f:
|
||||
if l.startswith("version = "):
|
||||
# version number is entire line minus the quotes
|
||||
ver = l[len("version = ") + 1 : -2]
|
||||
break
|
||||
if opts.paranoid:
|
||||
print(paranoidver(ver))
|
||||
else:
|
||||
print(ver)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
@ -1,65 +0,0 @@
|
||||
#!/bin/bash -e
|
||||
# Copyright (C) 2015 Facebook, Inc
|
||||
# Maintained by Ryan McElroy <rm@fb.com>
|
||||
#
|
||||
# Distributed under the GNU General Public License, version 2.0.
|
||||
#
|
||||
|
||||
if [[ $# -ne 2 ]]; then
|
||||
PROGNAME="$(basename $0)"
|
||||
cat <<END
|
||||
Usage: $PROGNAME <src> <dst>
|
||||
|
||||
This script enables the Mercurial share extension, shares a repository from
|
||||
'src' to 'dst', and copies the .hg/hgrc configuration from 'src' to 'dst'.
|
||||
This allows sharing repositories with non-standard configurations like we have
|
||||
here at Facebook.
|
||||
|
||||
In the future, this functionality will probably be folded into the share
|
||||
extension directly.
|
||||
END
|
||||
exit 1
|
||||
fi
|
||||
|
||||
src="$1"
|
||||
dst="$2"
|
||||
|
||||
hg --config "extensions.share=" share --noupdate --bookmarks "$src" "$dst"
|
||||
|
||||
echo "Setting up configuration..."
|
||||
cp "$src/.hg/hgrc" "$dst/.hg/hgrc"
|
||||
|
||||
# Force share on in this repo, regardless of global setting.
|
||||
# This ensures that bookmark shares will work
|
||||
# (basic sharing works even without extension).
|
||||
if [[ ! $(grep -q "^share=$" "$dst/.hg/hgrc") ]]; then
|
||||
cat >> "$dst/.hg/hgrc" <<END
|
||||
[extensions]
|
||||
share=
|
||||
END
|
||||
fi
|
||||
|
||||
# For forward compatibility, write "bookmarks" into the "shared" file.
|
||||
# See http://patchwork.serpentine.com/patch/7488/
|
||||
echo "bookmarks" >> "$dst/.hg/shared"
|
||||
|
||||
# Copy over svn metadata since hgsvn and share are not aware of each other
|
||||
if [[ -d $src/.hg/svn ]]; then
|
||||
echo "Copying svn metadata..."
|
||||
cp -R $src/.hg/svn $dst/.hg/
|
||||
fi
|
||||
|
||||
if [[ -e $src/.hg/sparse ]]; then
|
||||
echo "Copying sparse profile..."
|
||||
cp $src/.hg/sparse $dst/.hg/
|
||||
fi
|
||||
|
||||
echo "Updating new repository..."
|
||||
# Disable the watchman integration during the initial checkout;
|
||||
# to start with there is no .watchmanconfig and the local policy
|
||||
# may be to disallow watching the repo without one, leading to a
|
||||
# harmless but confusing error message.
|
||||
hg --cwd "$dst" --config fsmonitor.mode=off \
|
||||
update $(hg --cwd "$src" log -r . -T '{node}')
|
||||
|
||||
echo "Set up new Mercurial Working Directory in '$dst' based on '$src'..."
|
@ -1,145 +0,0 @@
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
# A minimal client for Mercurial's command server
|
||||
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import os
|
||||
import signal
|
||||
import socket
|
||||
import struct
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
|
||||
try:
|
||||
import cStringIO as io
|
||||
|
||||
stringio = io.StringIO
|
||||
except ImportError:
|
||||
import io
|
||||
|
||||
stringio = io.StringIO
|
||||
|
||||
|
||||
def connectpipe(path=None):
|
||||
cmdline = ["hg", "serve", "--cmdserver", "pipe"]
|
||||
if path:
|
||||
cmdline += ["-R", path]
|
||||
|
||||
server = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
|
||||
return server
|
||||
|
||||
|
||||
class unixconnection(object):
|
||||
def __init__(self, sockpath):
|
||||
self.sock = sock = socket.socket(socket.AF_UNIX)
|
||||
sock.connect(sockpath)
|
||||
self.stdin = sock.makefile("wb")
|
||||
self.stdout = sock.makefile("rb")
|
||||
|
||||
def wait(self):
|
||||
self.stdin.close()
|
||||
self.stdout.close()
|
||||
self.sock.close()
|
||||
|
||||
|
||||
class unixserver(object):
|
||||
def __init__(self, sockpath, logpath=None, repopath=None):
|
||||
self.sockpath = sockpath
|
||||
cmdline = ["hg", "serve", "--cmdserver", "unix", "-a", sockpath]
|
||||
if repopath:
|
||||
cmdline += ["-R", repopath]
|
||||
if logpath:
|
||||
stdout = open(logpath, "a")
|
||||
stderr = subprocess.STDOUT
|
||||
else:
|
||||
stdout = stderr = None
|
||||
self.server = subprocess.Popen(cmdline, stdout=stdout, stderr=stderr)
|
||||
# wait for listen()
|
||||
while self.server.poll() is None:
|
||||
if os.path.exists(sockpath):
|
||||
break
|
||||
time.sleep(0.1)
|
||||
|
||||
def connect(self):
|
||||
return unixconnection(self.sockpath)
|
||||
|
||||
def shutdown(self):
|
||||
os.kill(self.server.pid, signal.SIGTERM)
|
||||
self.server.wait()
|
||||
|
||||
|
||||
def writeblock(server, data):
|
||||
server.stdin.write(struct.pack(">I", len(data)))
|
||||
server.stdin.write(data)
|
||||
server.stdin.flush()
|
||||
|
||||
|
||||
def readchannel(server):
|
||||
data = server.stdout.read(5)
|
||||
if not data:
|
||||
raise EOFError
|
||||
channel, length = struct.unpack(">cI", data)
|
||||
if channel in "IL":
|
||||
return channel, length
|
||||
else:
|
||||
return channel, server.stdout.read(length)
|
||||
|
||||
|
||||
def sep(text):
|
||||
return text.replace("\\", "/")
|
||||
|
||||
|
||||
def runcommand(
|
||||
server, args, output=sys.stdout, error=sys.stderr, input=None, outfilter=lambda x: x
|
||||
):
|
||||
print("*** runcommand", " ".join(args))
|
||||
sys.stdout.flush()
|
||||
server.stdin.write("runcommand\n")
|
||||
writeblock(server, "\0".join(args))
|
||||
|
||||
if not input:
|
||||
input = stringio()
|
||||
|
||||
while True:
|
||||
ch, data = readchannel(server)
|
||||
if ch == "o":
|
||||
output.write(outfilter(data))
|
||||
output.flush()
|
||||
elif ch == "e":
|
||||
error.write(data)
|
||||
error.flush()
|
||||
elif ch == "I":
|
||||
writeblock(server, input.read(data))
|
||||
elif ch == "L":
|
||||
writeblock(server, input.readline(data))
|
||||
elif ch == "r":
|
||||
ret, = struct.unpack(">i", data)
|
||||
if ret != 0:
|
||||
print(" [%d]" % ret)
|
||||
return ret
|
||||
else:
|
||||
print("unexpected channel %c: %r" % (ch, data))
|
||||
if ch.isupper():
|
||||
return
|
||||
|
||||
|
||||
def check(func, connect=connectpipe):
|
||||
sys.stdout.flush()
|
||||
server = connect()
|
||||
try:
|
||||
return func(server)
|
||||
finally:
|
||||
server.stdin.close()
|
||||
server.wait()
|
@ -1,100 +0,0 @@
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
# hggitperf.py - performance test routines
|
||||
"""helper extension to measure performance of hg-git operations
|
||||
|
||||
This requires both the hggit and hggitperf extensions to be enabled and
|
||||
available.
|
||||
"""
|
||||
|
||||
import functools
|
||||
import os
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
from edenscm.mercurial import cmdutil
|
||||
|
||||
|
||||
cmdtable = {}
|
||||
command = cmdutil.command(cmdtable)
|
||||
|
||||
# the timer functions are copied from mercurial/contrib/perf.py
|
||||
def gettimer(ui, opts=None):
|
||||
"""return a timer function and formatter: (timer, formatter)
|
||||
|
||||
This functions exist to gather the creation of formatter in a single
|
||||
place instead of duplicating it in all performance command."""
|
||||
|
||||
# enforce an idle period before execution to counteract power management
|
||||
time.sleep(ui.configint("perf", "presleep", 1))
|
||||
|
||||
if opts is None:
|
||||
opts = {}
|
||||
# redirect all to stderr
|
||||
ui = ui.copy()
|
||||
ui.fout = ui.ferr
|
||||
# get a formatter
|
||||
fm = ui.formatter("perf", opts)
|
||||
return functools.partial(_timer, fm), fm
|
||||
|
||||
|
||||
def _timer(fm, func, title=None):
|
||||
results = []
|
||||
begin = time.time()
|
||||
count = 0
|
||||
while True:
|
||||
ostart = os.times()
|
||||
cstart = time.time()
|
||||
r = func()
|
||||
cstop = time.time()
|
||||
ostop = os.times()
|
||||
count += 1
|
||||
a, b = ostart, ostop
|
||||
results.append((cstop - cstart, b[0] - a[0], b[1] - a[1]))
|
||||
if cstop - begin > 3 and count >= 100:
|
||||
break
|
||||
if cstop - begin > 10 and count >= 3:
|
||||
break
|
||||
|
||||
fm.startitem()
|
||||
|
||||
if title:
|
||||
fm.write("title", "! %s\n", title)
|
||||
if r:
|
||||
fm.write("result", "! result: %s\n", r)
|
||||
m = min(results)
|
||||
fm.plain("!")
|
||||
fm.write("wall", " wall %f", m[0])
|
||||
fm.write("comb", " comb %f", m[1] + m[2])
|
||||
fm.write("user", " user %f", m[1])
|
||||
fm.write("sys", " sys %f", m[2])
|
||||
fm.write("count", " (best of %d)", count)
|
||||
fm.plain("\n")
|
||||
|
||||
|
||||
@command("perfgitloadmap")
|
||||
def perfgitloadmap(ui, repo):
|
||||
timer, fm = gettimer(ui)
|
||||
timer(repo.githandler.load_map)
|
||||
fm.end()
|
||||
|
||||
|
||||
@command("perfgitsavemap")
|
||||
def perfgitsavemap(ui, repo):
|
||||
timer, fm = gettimer(ui)
|
||||
repo.githandler.load_map()
|
||||
fd, f = tempfile.mkstemp(prefix=".git-mapfile-", dir=repo.path)
|
||||
basename = os.path.basename(f)
|
||||
try:
|
||||
timer(lambda: repo.githandler.save_map(basename))
|
||||
finally:
|
||||
os.unlink(f)
|
||||
fm.end()
|
@ -1,97 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# hgperf - measure performance of Mercurial commands
|
||||
#
|
||||
# Copyright 2014 Matt Mackall <mpm@selenic.com>
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
'''measure performance of Mercurial commands
|
||||
|
||||
Using ``hgperf`` instead of ``hg`` measures performance of the target
|
||||
Mercurial command. For example, the execution below measures
|
||||
performance of :hg:`heads --topo`::
|
||||
|
||||
$ hgperf heads --topo
|
||||
|
||||
All command output via ``ui`` is suppressed, and just measurement
|
||||
result is displayed: see also "perf" extension in "contrib".
|
||||
|
||||
Costs of processing before dispatching to the command function like
|
||||
below are not measured::
|
||||
|
||||
- parsing command line (e.g. option validity check)
|
||||
- reading configuration files in
|
||||
|
||||
But ``pre-`` and ``post-`` hook invocation for the target command is
|
||||
measured, even though these are invoked before or after dispatching to
|
||||
the command function, because these may be required to repeat
|
||||
execution of the target command correctly.
|
||||
'''
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
libdir = '@LIBDIR@'
|
||||
|
||||
if libdir != '@' 'LIBDIR' '@':
|
||||
if not os.path.isabs(libdir):
|
||||
libdir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
|
||||
libdir)
|
||||
libdir = os.path.abspath(libdir)
|
||||
sys.path.insert(0, libdir)
|
||||
|
||||
# enable importing on demand to reduce startup time
|
||||
try:
|
||||
from edenscm.mercurial import demandimport; demandimport.enable()
|
||||
except ImportError:
|
||||
import sys
|
||||
sys.stderr.write("abort: couldn't find mercurial libraries in [%s]\n" %
|
||||
' '.join(sys.path))
|
||||
sys.stderr.write("(check your install and PYTHONPATH)\n")
|
||||
sys.exit(-1)
|
||||
|
||||
from edenscm.mercurial import (
|
||||
dispatch,
|
||||
util,
|
||||
)
|
||||
|
||||
def timer(func, title=None):
|
||||
results = []
|
||||
begin = util.timer()
|
||||
count = 0
|
||||
while True:
|
||||
ostart = os.times()
|
||||
cstart = util.timer()
|
||||
r = func()
|
||||
cstop = util.timer()
|
||||
ostop = os.times()
|
||||
count += 1
|
||||
a, b = ostart, ostop
|
||||
results.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
|
||||
if cstop - begin > 3 and count >= 100:
|
||||
break
|
||||
if cstop - begin > 10 and count >= 3:
|
||||
break
|
||||
if title:
|
||||
sys.stderr.write("! %s\n" % title)
|
||||
if r:
|
||||
sys.stderr.write("! result: %s\n" % r)
|
||||
m = min(results)
|
||||
sys.stderr.write("! wall %f comb %f user %f sys %f (best of %d)\n"
|
||||
% (m[0], m[1] + m[2], m[1], m[2], count))
|
||||
|
||||
orgruncommand = dispatch.runcommand
|
||||
|
||||
def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions):
|
||||
ui.pushbuffer()
|
||||
lui.pushbuffer()
|
||||
timer(lambda : orgruncommand(lui, repo, cmd, fullargs, ui,
|
||||
options, d, cmdpats, cmdoptions))
|
||||
ui.popbuffer()
|
||||
lui.popbuffer()
|
||||
|
||||
dispatch.runcommand = runcommand
|
||||
|
||||
dispatch.run()
|
@ -1,19 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# An example FastCGI script for use with flup, edit as necessary
|
||||
|
||||
# Path to repo or hgweb config to serve (see 'hg help hgweb')
|
||||
config = "/path/to/repo/or/config"
|
||||
|
||||
# Uncomment and adjust if Mercurial is not installed system-wide
|
||||
# (consult "installed modules" path from 'hg debuginstall'):
|
||||
#import sys; sys.path.insert(0, "/path/to/python/lib")
|
||||
|
||||
# Uncomment to send python tracebacks to the browser if an error occurs:
|
||||
#import cgitb; cgitb.enable()
|
||||
|
||||
from edenscm.mercurial import demandimport; demandimport.enable()
|
||||
from edenscm.mercurial.hgweb import hgweb
|
||||
from flup.server.fcgi import WSGIServer
|
||||
application = hgweb(config)
|
||||
WSGIServer(application).run()
|
@ -1,18 +0,0 @@
|
||||
# An example WSGI for use with mod_wsgi, edit as necessary
|
||||
# See https://mercurial-scm.org/wiki/modwsgi for more information
|
||||
|
||||
# Path to repo or hgweb config to serve (see 'hg help hgweb')
|
||||
config = "/path/to/repo/or/config"
|
||||
|
||||
# Uncomment and adjust if Mercurial is not installed system-wide
|
||||
# (consult "installed modules" path from 'hg debuginstall'):
|
||||
#import sys; sys.path.insert(0, "/path/to/python/lib")
|
||||
|
||||
# Uncomment to send python tracebacks to the browser if an error occurs:
|
||||
#import cgitb; cgitb.enable()
|
||||
|
||||
# enable demandloading to reduce startup time
|
||||
from edenscm.mercurial import demandimport; demandimport.enable()
|
||||
|
||||
from edenscm.mercurial.hgweb import hgweb
|
||||
application = hgweb(config)
|
@ -1,104 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
""" Convert mercurial check-code errors into a format
|
||||
that plays nicely with arc lint """
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import errno
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
import utils
|
||||
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__))
|
||||
|
||||
# Normalize the list of files that we should report on
|
||||
wanted = set()
|
||||
for path in sys.argv[1:]:
|
||||
wanted.add(os.path.relpath(path))
|
||||
|
||||
# Export LINTFILES so tests can skip unrelated files
|
||||
if wanted:
|
||||
os.environ["LINTFILES"] = "\n".join(sorted(wanted))
|
||||
|
||||
args = ["-l", "test-check-code-hg.t", "test-check-pyflakes-hg.t"]
|
||||
|
||||
try:
|
||||
proc = utils.spawnruntests(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
except OSError as ex:
|
||||
if ex.errno == errno.ENOENT:
|
||||
print(
|
||||
"lint.py:1: ERROR:ENVIRON: Please either set "
|
||||
+ "MERCURIALRUNTEST var to the full path to run-tests.py, "
|
||||
+ "or add the containing directory to your $PATH"
|
||||
)
|
||||
else:
|
||||
print("lint.py:1: ERROR:OSError: %r" % ex)
|
||||
sys.exit(0)
|
||||
|
||||
output, error = proc.communicate()
|
||||
|
||||
context_file = None
|
||||
lines = error.split("\n")
|
||||
# We expect a run of 3 lines to describe the error, with the first
|
||||
# of those to look like a filename and line number location
|
||||
while lines:
|
||||
line = lines[0]
|
||||
lines.pop(0)
|
||||
|
||||
# test-check-pyflakes-hg style output
|
||||
m = re.match("^\+ ([a-zA-Z0-9_./-]+):(\d+): (.*)$", line)
|
||||
if m:
|
||||
filename, location, why = m.groups()
|
||||
if filename in wanted:
|
||||
print("%s:%s: ERROR:Pyflakes: %s" % (filename, location, why))
|
||||
continue
|
||||
|
||||
# test-check-code-hg style output
|
||||
if re.match("^--- (.*)$", line):
|
||||
context_file = os.path.relpath(line[4:])
|
||||
continue
|
||||
|
||||
m = re.match("^\+ (Skipping (.*) it has no.*)$", line)
|
||||
if m:
|
||||
filename = m.group(2)
|
||||
if filename in wanted:
|
||||
print(
|
||||
"%s:0: ERROR:CheckCode: Update %s to add %s"
|
||||
% (filename, context_file, m.group(1))
|
||||
)
|
||||
continue
|
||||
|
||||
if not re.match("^\+ +[a-zA-Z0-9_./-]+:\d+:$", line):
|
||||
continue
|
||||
|
||||
if len(lines) < 2:
|
||||
continue
|
||||
|
||||
location = line
|
||||
context = lines.pop(0) # we ignore this
|
||||
why = lines.pop(0)
|
||||
|
||||
location = location[1:].strip() # strip off the "+ " bit
|
||||
location = location.rstrip(":")
|
||||
filename, lineno = location.split(":")
|
||||
|
||||
if filename not in wanted:
|
||||
# lint doesn't care about this file.
|
||||
continue
|
||||
|
||||
why = why[1:].strip()
|
||||
|
||||
print("%s: ERROR:CheckCode: %s" % (location, why))
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 8.6 KiB |
@ -1,40 +0,0 @@
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
# memory.py - track memory usage
|
||||
|
||||
"""helper extension to measure memory usage
|
||||
|
||||
Reads current and peak memory usage from ``/proc/self/status`` and
|
||||
prints it to ``stderr`` on exit.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
|
||||
def memusage(ui):
|
||||
"""Report memory usage of the current process."""
|
||||
result = {"peak": 0, "rss": 0}
|
||||
with open("/proc/self/status", "r") as status:
|
||||
# This will only work on systems with a /proc file system
|
||||
# (like Linux).
|
||||
for line in status:
|
||||
parts = line.split()
|
||||
key = parts[0][2:-1].lower()
|
||||
if key in result:
|
||||
result[key] = int(parts[1])
|
||||
ui.write_err(
|
||||
", ".join(["%s: %.1f MiB" % (k, v / 1024.0) for k, v in result.iteritems()])
|
||||
+ "\n"
|
||||
)
|
||||
|
||||
|
||||
def extsetup(ui):
|
||||
ui.atexit(memusage, ui)
|
@ -1,417 +0,0 @@
|
||||
;;; mq.el --- Emacs support for Mercurial Queues
|
||||
|
||||
;; Copyright (C) 2006 Bryan O'Sullivan
|
||||
|
||||
;; Author: Bryan O'Sullivan <bos@serpentine.com>
|
||||
|
||||
;; mq.el is free software; you can redistribute it and/or modify it
|
||||
;; under the terms of the GNU General Public License version 2 or any
|
||||
;; later version.
|
||||
|
||||
;; mq.el is distributed in the hope that it will be useful, but
|
||||
;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
;; General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with mq.el, GNU Emacs, or XEmacs; see the file COPYING (`C-h
|
||||
;; C-l'). If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(eval-when-compile (require 'cl))
|
||||
(require 'mercurial)
|
||||
|
||||
|
||||
(defcustom mq-mode-hook nil
|
||||
"Hook run when a buffer enters mq-mode."
|
||||
:type 'sexp
|
||||
:group 'mercurial)
|
||||
|
||||
(defcustom mq-global-prefix "\C-cq"
|
||||
"The global prefix for Mercurial Queues keymap bindings."
|
||||
:type 'sexp
|
||||
:group 'mercurial)
|
||||
|
||||
(defcustom mq-edit-mode-hook nil
|
||||
"Hook run after a buffer is populated to edit a patch description."
|
||||
:type 'sexp
|
||||
:group 'mercurial)
|
||||
|
||||
(defcustom mq-edit-finish-hook nil
|
||||
"Hook run before a patch description is finished up with."
|
||||
:type 'sexp
|
||||
:group 'mercurial)
|
||||
|
||||
(defcustom mq-signoff-address nil
|
||||
"Address with which to sign off on a patch."
|
||||
:type 'string
|
||||
:group 'mercurial)
|
||||
|
||||
|
||||
;;; Internal variables.
|
||||
|
||||
(defvar mq-mode nil
|
||||
"Is this file managed by MQ?")
|
||||
(make-variable-buffer-local 'mq-mode)
|
||||
(put 'mq-mode 'permanent-local t)
|
||||
|
||||
(defvar mq-patch-history nil)
|
||||
|
||||
(defvar mq-top-patch '(nil))
|
||||
|
||||
(defvar mq-prev-buffer nil)
|
||||
(make-variable-buffer-local 'mq-prev-buffer)
|
||||
(put 'mq-prev-buffer 'permanent-local t)
|
||||
|
||||
(defvar mq-top nil)
|
||||
(make-variable-buffer-local 'mq-top)
|
||||
(put 'mq-top 'permanent-local t)
|
||||
|
||||
;;; Global keymap.
|
||||
|
||||
(defvar mq-global-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map "." 'mq-push)
|
||||
(define-key map ">" 'mq-push-all)
|
||||
(define-key map "," 'mq-pop)
|
||||
(define-key map "<" 'mq-pop-all)
|
||||
(define-key map "=" 'mq-diff)
|
||||
(define-key map "r" 'mq-refresh)
|
||||
(define-key map "e" 'mq-refresh-edit)
|
||||
(define-key map "i" 'mq-new)
|
||||
(define-key map "n" 'mq-next)
|
||||
(define-key map "o" 'mq-signoff)
|
||||
(define-key map "p" 'mq-previous)
|
||||
(define-key map "s" 'mq-edit-series)
|
||||
(define-key map "t" 'mq-top)
|
||||
map))
|
||||
|
||||
(global-set-key mq-global-prefix mq-global-map)
|
||||
|
||||
(add-minor-mode 'mq-mode 'mq-mode)
|
||||
|
||||
|
||||
;;; Refresh edit mode keymap.
|
||||
|
||||
(defvar mq-edit-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
(define-key map "\C-c\C-c" 'mq-edit-finish)
|
||||
(define-key map "\C-c\C-k" 'mq-edit-kill)
|
||||
(define-key map "\C-c\C-s" 'mq-signoff)
|
||||
map))
|
||||
|
||||
|
||||
;;; Helper functions.
|
||||
|
||||
(defun mq-read-patch-name (&optional source prompt force)
|
||||
"Read a patch name to use with a command.
|
||||
May return nil, meaning \"use the default\"."
|
||||
(let ((patches (split-string
|
||||
(hg-chomp (hg-run0 (or source "qseries"))) "\n")))
|
||||
(when force
|
||||
(completing-read (format "Patch%s: " (or prompt ""))
|
||||
(mapcar (lambda (x) (cons x x)) patches)
|
||||
nil
|
||||
nil
|
||||
nil
|
||||
'mq-patch-history))))
|
||||
|
||||
(defun mq-refresh-buffers (root)
|
||||
(save-excursion
|
||||
(dolist (buf (hg-buffers-visiting-repo root))
|
||||
(when (not (verify-visited-file-modtime buf))
|
||||
(set-buffer buf)
|
||||
(let ((ctx (hg-buffer-context)))
|
||||
(message "Refreshing %s..." (buffer-name))
|
||||
(revert-buffer t t t)
|
||||
(hg-restore-context ctx)
|
||||
(message "Refreshing %s...done" (buffer-name))))))
|
||||
(hg-update-mode-lines root)
|
||||
(mq-update-mode-lines root))
|
||||
|
||||
(defun mq-last-line ()
|
||||
(goto-char (point-max))
|
||||
(beginning-of-line)
|
||||
(when (looking-at "^$")
|
||||
(forward-line -1))
|
||||
(let ((bol (point)))
|
||||
(end-of-line)
|
||||
(let ((line (buffer-substring bol (point))))
|
||||
(when (> (length line) 0)
|
||||
line))))
|
||||
|
||||
(defun mq-push (&optional patch)
|
||||
"Push patches until PATCH is reached.
|
||||
If PATCH is nil, push at most one patch."
|
||||
(interactive (list (mq-read-patch-name "qunapplied" " to push"
|
||||
current-prefix-arg)))
|
||||
(let ((root (hg-root))
|
||||
(prev-buf (current-buffer))
|
||||
last-line ok)
|
||||
(unless root
|
||||
(error "Cannot push outside a repository!"))
|
||||
(hg-sync-buffers root)
|
||||
(let ((buf-name (format "MQ: Push %s" (or patch "next patch"))))
|
||||
(kill-buffer (get-buffer-create buf-name))
|
||||
(split-window-vertically)
|
||||
(other-window 1)
|
||||
(switch-to-buffer (get-buffer-create buf-name))
|
||||
(cd root)
|
||||
(message "Pushing...")
|
||||
(setq ok (= 0 (apply 'call-process (hg-binary) nil t t "qpush"
|
||||
(if patch (list patch))))
|
||||
last-line (mq-last-line))
|
||||
(let ((lines (count-lines (point-min) (point-max))))
|
||||
(if (or (<= lines 1)
|
||||
(and (equal lines 2) (string-match "Now at:" last-line)))
|
||||
(progn
|
||||
(kill-buffer (current-buffer))
|
||||
(delete-window))
|
||||
(hg-view-mode prev-buf))))
|
||||
(mq-refresh-buffers root)
|
||||
(sit-for 0)
|
||||
(when last-line
|
||||
(if ok
|
||||
(message "Pushing... %s" last-line)
|
||||
(error "Pushing... %s" last-line)))))
|
||||
|
||||
(defun mq-push-all ()
|
||||
"Push patches until all are applied."
|
||||
(interactive)
|
||||
(mq-push "-a"))
|
||||
|
||||
(defun mq-pop (&optional patch)
|
||||
"Pop patches until PATCH is reached.
|
||||
If PATCH is nil, pop at most one patch."
|
||||
(interactive (list (mq-read-patch-name "qapplied" " to pop to"
|
||||
current-prefix-arg)))
|
||||
(let ((root (hg-root))
|
||||
last-line ok)
|
||||
(unless root
|
||||
(error "Cannot pop outside a repository!"))
|
||||
(hg-sync-buffers root)
|
||||
(set-buffer (generate-new-buffer "qpop"))
|
||||
(cd root)
|
||||
(message "Popping...")
|
||||
(setq ok (= 0 (apply 'call-process (hg-binary) nil t t "qpop"
|
||||
(if patch (list patch))))
|
||||
last-line (mq-last-line))
|
||||
(kill-buffer (current-buffer))
|
||||
(mq-refresh-buffers root)
|
||||
(sit-for 0)
|
||||
(when last-line
|
||||
(if ok
|
||||
(message "Popping... %s" last-line)
|
||||
(error "Popping... %s" last-line)))))
|
||||
|
||||
(defun mq-pop-all ()
|
||||
"Push patches until none are applied."
|
||||
(interactive)
|
||||
(mq-pop "-a"))
|
||||
|
||||
(defun mq-refresh-internal (root &rest args)
|
||||
(hg-sync-buffers root)
|
||||
(let ((patch (mq-patch-info "qtop")))
|
||||
(message "Refreshing %s..." patch)
|
||||
(let ((ret (apply 'hg-run "qrefresh" args)))
|
||||
(if (equal (car ret) 0)
|
||||
(message "Refreshing %s... done." patch)
|
||||
(error "Refreshing %s... %s" patch (hg-chomp (cdr ret)))))))
|
||||
|
||||
(defun mq-refresh (&optional git)
|
||||
"Refresh the topmost applied patch.
|
||||
With a prefix argument, generate a git-compatible patch."
|
||||
(interactive "P")
|
||||
(let ((root (hg-root)))
|
||||
(unless root
|
||||
(error "Cannot refresh outside of a repository!"))
|
||||
(apply 'mq-refresh-internal root (if git '("--git")))))
|
||||
|
||||
(defun mq-patch-info (cmd &optional msg)
|
||||
(let* ((ret (hg-run cmd))
|
||||
(info (hg-chomp (cdr ret))))
|
||||
(if (equal (car ret) 0)
|
||||
(if msg
|
||||
(message "%s patch: %s" msg info)
|
||||
info)
|
||||
(error "%s" info))))
|
||||
|
||||
(defun mq-top ()
|
||||
"Print the name of the topmost applied patch."
|
||||
(interactive)
|
||||
(mq-patch-info "qtop" "Top"))
|
||||
|
||||
(defun mq-next ()
|
||||
"Print the name of the next patch to be pushed."
|
||||
(interactive)
|
||||
(mq-patch-info "qnext" "Next"))
|
||||
|
||||
(defun mq-previous ()
|
||||
"Print the name of the first patch below the topmost applied patch.
|
||||
This would become the active patch if popped to."
|
||||
(interactive)
|
||||
(mq-patch-info "qprev" "Previous"))
|
||||
|
||||
(defun mq-edit-finish ()
|
||||
"Finish editing the description of this patch, and refresh the patch."
|
||||
(interactive)
|
||||
(unless (equal (mq-patch-info "qtop") mq-top)
|
||||
(error "Topmost patch has changed!"))
|
||||
(hg-sync-buffers hg-root)
|
||||
(run-hooks 'mq-edit-finish-hook)
|
||||
(mq-refresh-internal hg-root "-m" (buffer-substring (point-min) (point-max)))
|
||||
(let ((buf mq-prev-buffer))
|
||||
(kill-buffer nil)
|
||||
(switch-to-buffer buf)))
|
||||
|
||||
(defun mq-edit-kill ()
|
||||
"Kill the edit currently being prepared."
|
||||
(interactive)
|
||||
(when (or (not (buffer-modified-p)) (y-or-n-p "Really kill this edit? "))
|
||||
(let ((buf mq-prev-buffer))
|
||||
(kill-buffer nil)
|
||||
(switch-to-buffer buf))))
|
||||
|
||||
(defun mq-get-top (root)
|
||||
(let ((entry (assoc root mq-top-patch)))
|
||||
(if entry
|
||||
(cdr entry))))
|
||||
|
||||
(defun mq-set-top (root patch)
|
||||
(let ((entry (assoc root mq-top-patch)))
|
||||
(if entry
|
||||
(if patch
|
||||
(setcdr entry patch)
|
||||
(setq mq-top-patch (delq entry mq-top-patch)))
|
||||
(setq mq-top-patch (cons (cons root patch) mq-top-patch)))))
|
||||
|
||||
(defun mq-update-mode-lines (root)
|
||||
(let ((cwd default-directory))
|
||||
(cd root)
|
||||
(condition-case nil
|
||||
(mq-set-top root (mq-patch-info "qtop"))
|
||||
(error (mq-set-top root nil)))
|
||||
(cd cwd))
|
||||
(let ((patch (mq-get-top root)))
|
||||
(save-excursion
|
||||
(dolist (buf (hg-buffers-visiting-repo root))
|
||||
(set-buffer buf)
|
||||
(if mq-mode
|
||||
(setq mq-mode (or (and patch (concat " MQ:" patch)) " MQ")))))))
|
||||
|
||||
(defun mq-mode (&optional arg)
|
||||
"Minor mode for Mercurial repositories with an MQ patch queue"
|
||||
(interactive "i")
|
||||
(cond ((hg-root)
|
||||
(setq mq-mode (if (null arg) (not mq-mode)
|
||||
arg))
|
||||
(mq-update-mode-lines (hg-root))))
|
||||
(run-hooks 'mq-mode-hook))
|
||||
|
||||
(defun mq-edit-mode ()
|
||||
"Mode for editing the description of a patch.
|
||||
|
||||
Key bindings
|
||||
------------
|
||||
\\[mq-edit-finish] use this description
|
||||
\\[mq-edit-kill] abandon this description"
|
||||
(interactive)
|
||||
(use-local-map mq-edit-mode-map)
|
||||
(set-syntax-table text-mode-syntax-table)
|
||||
(setq local-abbrev-table text-mode-abbrev-table
|
||||
major-mode 'mq-edit-mode
|
||||
mode-name "MQ-Edit")
|
||||
(set-buffer-modified-p nil)
|
||||
(setq buffer-undo-list nil)
|
||||
(run-hooks 'text-mode-hook 'mq-edit-mode-hook))
|
||||
|
||||
(defun mq-refresh-edit ()
|
||||
"Refresh the topmost applied patch, editing the patch description."
|
||||
(interactive)
|
||||
(while mq-prev-buffer
|
||||
(set-buffer mq-prev-buffer))
|
||||
(let ((root (hg-root))
|
||||
(prev-buffer (current-buffer))
|
||||
(patch (mq-patch-info "qtop")))
|
||||
(hg-sync-buffers root)
|
||||
(let ((buf-name (format "*MQ: Edit description of %s*" patch)))
|
||||
(switch-to-buffer (get-buffer-create buf-name))
|
||||
(when (= (point-min) (point-max))
|
||||
(set (make-local-variable 'hg-root) root)
|
||||
(set (make-local-variable 'mq-top) patch)
|
||||
(setq mq-prev-buffer prev-buffer)
|
||||
(insert (hg-run0 "qheader"))
|
||||
(goto-char (point-min)))
|
||||
(mq-edit-mode)
|
||||
(cd root)))
|
||||
(message "Type `C-c C-c' to finish editing and refresh the patch."))
|
||||
|
||||
(defun mq-new (name)
|
||||
"Create a new empty patch named NAME.
|
||||
The patch is applied on top of the current topmost patch.
|
||||
With a prefix argument, forcibly create the patch even if the working
|
||||
directory is modified."
|
||||
(interactive (list (mq-read-patch-name "qseries" " to create" t)))
|
||||
(message "Creating patch...")
|
||||
(let ((ret (if current-prefix-arg
|
||||
(hg-run "qnew" "-f" name)
|
||||
(hg-run "qnew" name))))
|
||||
(if (equal (car ret) 0)
|
||||
(progn
|
||||
(hg-update-mode-lines (buffer-file-name))
|
||||
(message "Creating patch... done."))
|
||||
(error "Creating patch... %s" (hg-chomp (cdr ret))))))
|
||||
|
||||
(defun mq-edit-series ()
|
||||
"Edit the MQ series file directly."
|
||||
(interactive)
|
||||
(let ((root (hg-root)))
|
||||
(unless root
|
||||
(error "Not in an MQ repository!"))
|
||||
(find-file (concat root ".hg/patches/series"))))
|
||||
|
||||
(defun mq-diff (&optional git)
|
||||
"Display a diff of the topmost applied patch.
|
||||
With a prefix argument, display a git-compatible diff."
|
||||
(interactive "P")
|
||||
(hg-view-output ((format "MQ: Diff of %s" (mq-patch-info "qtop")))
|
||||
(if git
|
||||
(call-process (hg-binary) nil t nil "qdiff" "--git")
|
||||
(call-process (hg-binary) nil t nil "qdiff"))
|
||||
(diff-mode)
|
||||
(font-lock-fontify-buffer)))
|
||||
|
||||
(defun mq-signoff ()
|
||||
"Sign off on the current patch, in the style used by the Linux kernel.
|
||||
If the variable mq-signoff-address is non-nil, it will be used, otherwise
|
||||
the value of the ui.username item from your hgrc will be used."
|
||||
(interactive)
|
||||
(let ((was-editing (eq major-mode 'mq-edit-mode))
|
||||
signed)
|
||||
(unless was-editing
|
||||
(mq-refresh-edit))
|
||||
(save-excursion
|
||||
(let* ((user (or mq-signoff-address
|
||||
(hg-run0 "debugconfig" "ui.username")))
|
||||
(signoff (concat "Signed-off-by: " user)))
|
||||
(if (search-forward signoff nil t)
|
||||
(message "You have already signed off on this patch.")
|
||||
(goto-char (point-max))
|
||||
(let ((case-fold-search t))
|
||||
(if (re-search-backward "^Signed-off-by: " nil t)
|
||||
(forward-line 1)
|
||||
(insert "\n")))
|
||||
(insert signoff)
|
||||
(message "%s" signoff)
|
||||
(setq signed t))))
|
||||
(unless was-editing
|
||||
(if signed
|
||||
(mq-edit-finish)
|
||||
(mq-edit-kill)))))
|
||||
|
||||
|
||||
(provide 'mq)
|
||||
|
||||
|
||||
;;; Local Variables:
|
||||
;;; prompt-to-byte-compile: nil
|
||||
;;; end:
|
@ -1,38 +0,0 @@
|
||||
# Extract version number into 4 parts, some of which may be empty:
|
||||
#
|
||||
# version: the numeric part of the most recent tag. Will always look like 1.3.
|
||||
#
|
||||
# type: if an rc build, "rc", otherwise empty
|
||||
#
|
||||
# distance: the distance from the nearest tag, or empty if built from a tag
|
||||
#
|
||||
# node: the node|short hg was built from, or empty if built from a tag
|
||||
gethgversion() {
|
||||
export HGRCPATH=
|
||||
export HGPLAIN=
|
||||
|
||||
make cleanbutpackages
|
||||
make local PURE=--pure
|
||||
HG="$PWD/hg"
|
||||
|
||||
"$HG" version > /dev/null || { echo 'abort: hg version failed!'; exit 1 ; }
|
||||
|
||||
hgversion=`LANGUAGE=C "$HG" version | sed -ne 's/.*(version \(.*\))$/\1/p'`
|
||||
|
||||
if echo $hgversion | grep + > /dev/null 2>&1 ; then
|
||||
tmp=`echo $hgversion | cut -d+ -f 2`
|
||||
hgversion=`echo $hgversion | cut -d+ -f 1`
|
||||
distance=`echo $tmp | cut -d- -f 1`
|
||||
node=`echo $tmp | cut -d- -f 2`
|
||||
else
|
||||
distance=''
|
||||
node=''
|
||||
fi
|
||||
if echo $hgversion | grep -- '-' > /dev/null 2>&1; then
|
||||
version=`echo $hgversion | cut -d- -f1`
|
||||
type=`echo $hgversion | cut -d- -f2`
|
||||
else
|
||||
version=$hgversion
|
||||
type=''
|
||||
fi
|
||||
}
|
@ -1,313 +0,0 @@
|
||||
# lint Python modules using external checkers.
|
||||
#
|
||||
# This is the main checker controlling the other ones and the reports
|
||||
# generation. It is itself both a raw checker and an astng checker in order
|
||||
# to:
|
||||
# * handle message activation / deactivation at the module level
|
||||
# * handle some basic but necessary stats'data (number of classes, methods...)
|
||||
#
|
||||
[MASTER]
|
||||
|
||||
# Specify a configuration file.
|
||||
#rcfile=
|
||||
|
||||
# Python code to execute, usually for sys.path manipulation such as
|
||||
# pygtk.require().
|
||||
#init-hook=
|
||||
|
||||
# Profiled execution.
|
||||
profile=no
|
||||
|
||||
# Add <file or directory> to the black list. It should be a base name, not a
|
||||
# path. You may set this option multiple times.
|
||||
ignore=CVS
|
||||
|
||||
# Pickle collected data for later comparisons.
|
||||
persistent=yes
|
||||
|
||||
# Set the cache size for astng objects.
|
||||
cache-size=500
|
||||
|
||||
# List of plugins (as comma separated values of python modules names) to load,
|
||||
# usually to register additional checkers.
|
||||
load-plugins=
|
||||
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
# Enable only checker(s) with the given id(s). This option conflicts with the
|
||||
# disable-checker option
|
||||
#enable-checker=
|
||||
|
||||
# Enable all checker(s) except those with the given id(s). This option
|
||||
# conflicts with the enable-checker option
|
||||
#disable-checker=
|
||||
|
||||
# Enable all messages in the listed categories (IRCWEF).
|
||||
#enable-msg-cat=
|
||||
|
||||
# Disable all messages in the listed categories (IRCWEF).
|
||||
disable-msg-cat=I
|
||||
|
||||
# Enable the message(s) with the given id(s).
|
||||
#enable-msg=
|
||||
|
||||
# Disable the message(s) with the given id(s).
|
||||
# W0704: except: pass
|
||||
# C0111: missing docstring
|
||||
# W0403: for the time being absolute imports don't play nice with demandimport
|
||||
disable-msg=W0704,C0111,W0403
|
||||
|
||||
|
||||
[REPORTS]
|
||||
|
||||
# Set the output format. Available formats are text, parseable, colorized, msvs
|
||||
# (visual studio) and html
|
||||
output-format=text
|
||||
|
||||
# Include message's id in output
|
||||
include-ids=yes
|
||||
|
||||
# Put messages in a separate file for each module / package specified on the
|
||||
# command line instead of printing them on stdout. Reports (if any) will be
|
||||
# written in a file name "pylint_global.[txt|html]".
|
||||
files-output=no
|
||||
|
||||
# Tells whether to display a full report or only the messages
|
||||
reports=yes
|
||||
|
||||
# Python expression which should return a note less than 10 (10 is the highest
|
||||
# note). You have access to the variables errors warning, statement which
|
||||
# respectively contain the number of errors / warnings messages and the total
|
||||
# number of statements analyzed. This is used by the global evaluation report
|
||||
# (R0004).
|
||||
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||
|
||||
# Add a comment according to your evaluation note. This is used by the global
|
||||
# evaluation report (R0004).
|
||||
comment=no
|
||||
|
||||
# Enable the report(s) with the given id(s).
|
||||
#enable-report=
|
||||
|
||||
# Disable the report(s) with the given id(s).
|
||||
#disable-report=
|
||||
|
||||
|
||||
# try to find bugs in the code using type inference
|
||||
#
|
||||
[TYPECHECK]
|
||||
|
||||
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||
ignore-mixin-members=yes
|
||||
|
||||
# List of classes names for which member attributes should not be checked
|
||||
# (useful for classes with attributes dynamically set).
|
||||
ignored-classes=SQLObject
|
||||
|
||||
# When zope mode is activated, add a predefined set of Zope acquired attributes
|
||||
# to generated-members.
|
||||
zope=no
|
||||
|
||||
# List of members which are set dynamically and missed by pylint inference
|
||||
# system, and so shouldn't trigger E0201 when accessed.
|
||||
generated-members=REQUEST,acl_users,aq_parent
|
||||
|
||||
|
||||
# checks for
|
||||
# * unused variables / imports
|
||||
# * undefined variables
|
||||
# * redefinition of variable from builtins or from an outer scope
|
||||
# * use of variable before assignment
|
||||
#
|
||||
[VARIABLES]
|
||||
|
||||
# Tells whether we should check for unused import in __init__ files.
|
||||
init-import=yes
|
||||
|
||||
# A regular expression matching names used for dummy variables (i.e. not used).
|
||||
dummy-variables-rgx=dummy
|
||||
|
||||
# List of additional names supposed to be defined in builtins. Remember that
|
||||
# you should avoid to define new builtins when possible.
|
||||
additional-builtins=
|
||||
|
||||
|
||||
# checks for :
|
||||
# * doc strings
|
||||
# * modules / classes / functions / methods / arguments / variables name
|
||||
# * number of arguments, local variables, branches, returns and statements in
|
||||
# functions, methods
|
||||
# * required module attributes
|
||||
# * dangerous default values as arguments
|
||||
# * redefinition of function / method / class
|
||||
# * uses of the global statement
|
||||
#
|
||||
[BASIC]
|
||||
|
||||
# Required attributes for module, separated by a comma
|
||||
required-attributes=
|
||||
|
||||
# Regular expression which should only match functions or classes name which do
|
||||
# not require a docstring
|
||||
no-docstring-rgx=__.*__
|
||||
|
||||
# Regular expression which should only match correct module names
|
||||
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
|
||||
|
||||
# Regular expression which should only match correct module level names
|
||||
const-rgx=(([a-zA-Z_][a-zA-Z0-9_]*)|(__.*__))$
|
||||
|
||||
# Regular expression which should only match correct class names
|
||||
class-rgx=[a-zA-Z_][a-zA-Z0-9]+$
|
||||
|
||||
# Regular expression which should only match correct function names
|
||||
function-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||
|
||||
# Regular expression which should only match correct method names
|
||||
method-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||
|
||||
# Regular expression which should only match correct instance attribute names
|
||||
attr-rgx=[a-z_][a-z0-9_]{1,30}$
|
||||
|
||||
# Regular expression which should only match correct argument names
|
||||
argument-rgx=[a-z_][a-z0-9_]{0,30}$
|
||||
|
||||
# Regular expression which should only match correct variable names
|
||||
variable-rgx=[a-z_][a-z0-9_]{0,30}$
|
||||
|
||||
# Regular expression which should only match correct list comprehension /
|
||||
# generator expression variable names
|
||||
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
|
||||
|
||||
# Good variable names which should always be accepted, separated by a comma
|
||||
good-names=i,j,k,ex,Run,_,ui,c,fn,f,fd,l
|
||||
|
||||
# Bad variable names which should always be refused, separated by a comma
|
||||
bad-names=foo,bar,baz,toto,tutu,tata
|
||||
|
||||
# List of builtins function names that should not be used, separated by a comma
|
||||
#bad-functions=map,filter,apply,input
|
||||
bad-functions=map,filter,apply,input
|
||||
|
||||
|
||||
# checks for
|
||||
# * external modules dependencies
|
||||
# * relative / wildcard imports
|
||||
# * cyclic imports
|
||||
# * uses of deprecated modules
|
||||
#
|
||||
[IMPORTS]
|
||||
|
||||
# Deprecated modules which should not be used, separated by a comma
|
||||
deprecated-modules=regsub,TERMIOS,Bastion,rexec
|
||||
|
||||
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||
# given file (report R0402 must not be disabled)
|
||||
import-graph=
|
||||
|
||||
# Create a graph of external dependencies in the given file (report R0402 must
|
||||
# not be disabled)
|
||||
ext-import-graph=
|
||||
|
||||
# Create a graph of internal dependencies in the given file (report R0402 must
|
||||
# not be disabled)
|
||||
int-import-graph=
|
||||
|
||||
|
||||
# checks for sign of poor/misdesign:
|
||||
# * number of methods, attributes, local variables...
|
||||
# * size, complexity of functions, methods
|
||||
#
|
||||
[DESIGN]
|
||||
|
||||
# Maximum number of arguments for function / method
|
||||
max-args=5
|
||||
|
||||
# Maximum number of locals for function / method body
|
||||
max-locals=15
|
||||
|
||||
# Maximum number of return / yield for function / method body
|
||||
max-returns=6
|
||||
|
||||
# Maximum number of branch for function / method body
|
||||
max-branchs=12
|
||||
|
||||
# Maximum number of statements in function / method body
|
||||
max-statements=50
|
||||
|
||||
# Maximum number of parents for a class (see R0901).
|
||||
max-parents=7
|
||||
|
||||
# Maximum number of attributes for a class (see R0902).
|
||||
max-attributes=7
|
||||
|
||||
# Minimum number of public methods for a class (see R0903).
|
||||
min-public-methods=2
|
||||
|
||||
# Maximum number of public methods for a class (see R0904).
|
||||
max-public-methods=20
|
||||
|
||||
|
||||
# checks for :
|
||||
# * methods without self as first argument
|
||||
# * overridden methods signature
|
||||
# * access only to existent members via self
|
||||
# * attributes not defined in the __init__ method
|
||||
# * supported interfaces implementation
|
||||
# * unreachable code
|
||||
#
|
||||
[CLASSES]
|
||||
|
||||
# List of interface methods to ignore, separated by a comma. This is used for
|
||||
# instance to not check methods defines in Zope's Interface base class.
|
||||
ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
|
||||
|
||||
# List of method names used to declare (i.e. assign) instance attributes.
|
||||
defining-attr-methods=__init__,__new__,setUp
|
||||
|
||||
|
||||
# checks for :
|
||||
# * unauthorized constructions
|
||||
# * strict indentation
|
||||
# * line length
|
||||
# * use of <> instead of !=
|
||||
#
|
||||
[FORMAT]
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=80
|
||||
|
||||
# Maximum number of lines in a module
|
||||
max-module-lines=1000
|
||||
|
||||
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
|
||||
# tab).
|
||||
indent-string=' '
|
||||
|
||||
|
||||
# checks for:
|
||||
# * warning notes in the code like FIXME, XXX
|
||||
# * PEP 263: source code with non ascii character but no encoding declaration
|
||||
#
|
||||
[MISCELLANEOUS]
|
||||
|
||||
# List of note tags to take in consideration, separated by a comma.
|
||||
notes=FIXME,XXX,TODO
|
||||
|
||||
|
||||
# checks for similarities and duplicated code. This computation may be
|
||||
# memory / CPU intensive, so you should disable it if you experiments some
|
||||
# problems.
|
||||
#
|
||||
[SIMILARITIES]
|
||||
|
||||
# Minimum lines number of a similarity.
|
||||
min-similarity-lines=4
|
||||
|
||||
# Ignore comments when computing similarities.
|
||||
ignore-comments=yes
|
||||
|
||||
# Ignore docstrings when computing similarities.
|
||||
ignore-docstrings=yes
|
@ -1,162 +0,0 @@
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
"""Find tests that newly pass under Python 3.
|
||||
|
||||
The approach is simple: we maintain a whitelist of Python 3 passing
|
||||
tests in the repository, and periodically run all the /other/ tests
|
||||
and look for new passes. Any newly passing tests get automatically
|
||||
added to the whitelist.
|
||||
|
||||
You probably want to run it like this:
|
||||
|
||||
$ cd tests
|
||||
$ python3 ../contrib/python3-ratchet.py \
|
||||
> --working-tests=../contrib/python3-whitelist
|
||||
"""
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
_hgenv = dict(os.environ)
|
||||
_hgenv.update({"HGPLAIN": "1"})
|
||||
|
||||
_HG_FIRST_CHANGE = "9117c6561b0bd7792fa13b50d28239d51b78e51f"
|
||||
|
||||
|
||||
def _runhg(*args):
|
||||
return subprocess.check_output(args, env=_hgenv)
|
||||
|
||||
|
||||
def _is_hg_repo(path):
|
||||
return (
|
||||
_runhg("hg", "log", "-R", path, "-r0", "--template={node}").strip()
|
||||
== _HG_FIRST_CHANGE
|
||||
)
|
||||
|
||||
|
||||
def _py3default():
|
||||
if sys.version_info[0] >= 3:
|
||||
return sys.executable
|
||||
return "python3"
|
||||
|
||||
|
||||
def main(argv=()):
|
||||
p = argparse.ArgumentParser()
|
||||
p.add_argument(
|
||||
"--working-tests", help="List of tests that already work in Python 3."
|
||||
)
|
||||
p.add_argument(
|
||||
"--commit-to-repo", help="If set, commit newly fixed tests to the given repo"
|
||||
)
|
||||
p.add_argument(
|
||||
"-j",
|
||||
default=os.sysconf(r"SC_NPROCESSORS_ONLN"),
|
||||
type=int,
|
||||
help="Number of parallel tests to run.",
|
||||
)
|
||||
p.add_argument(
|
||||
"--python3",
|
||||
default=_py3default(),
|
||||
help="python3 interpreter to use for test run",
|
||||
)
|
||||
p.add_argument(
|
||||
"--commit-user",
|
||||
default="python3-ratchet@mercurial-scm.org",
|
||||
help="Username to specify when committing to a repo.",
|
||||
)
|
||||
opts = p.parse_args(argv)
|
||||
if opts.commit_to_repo:
|
||||
if not _is_hg_repo(opts.commit_to_repo):
|
||||
print("abort: specified repository is not the hg repository")
|
||||
sys.exit(1)
|
||||
if not opts.working_tests or not os.path.isfile(opts.working_tests):
|
||||
print(
|
||||
"abort: --working-tests must exist and be a file (got %r)"
|
||||
% opts.working_tests
|
||||
)
|
||||
sys.exit(1)
|
||||
elif opts.commit_to_repo:
|
||||
root = _runhg("hg", "root").strip()
|
||||
if not opts.working_tests.startswith(root):
|
||||
print(
|
||||
"abort: if --commit-to-repo is given, "
|
||||
"--working-tests must be from that repo"
|
||||
)
|
||||
sys.exit(1)
|
||||
try:
|
||||
subprocess.check_call(
|
||||
[
|
||||
opts.python3,
|
||||
"-c",
|
||||
"import sys ; "
|
||||
"assert ((3, 5) <= sys.version_info < (3, 6) "
|
||||
"or sys.version_info >= (3, 6, 2))",
|
||||
]
|
||||
)
|
||||
except subprocess.CalledProcessError:
|
||||
print("warning: Python 3.6.0 and 3.6.1 have " "a bug which breaks Mercurial")
|
||||
print("(see https://bugs.python.org/issue29714 for details)")
|
||||
# TODO(augie): uncomment exit when Python 3.6.2 is available
|
||||
# sys.exit(1)
|
||||
|
||||
rt = subprocess.Popen(
|
||||
[
|
||||
opts.python3,
|
||||
"run-tests.py",
|
||||
"-j",
|
||||
str(opts.j),
|
||||
"--blacklist",
|
||||
opts.working_tests,
|
||||
"--json",
|
||||
]
|
||||
)
|
||||
rt.wait()
|
||||
with open("report.json") as f:
|
||||
data = f.read()
|
||||
report = json.loads(data.split("=", 1)[1])
|
||||
newpass = set()
|
||||
for test, result in report.items():
|
||||
if result["result"] != "success":
|
||||
continue
|
||||
# A new passing test! Huzzah!
|
||||
newpass.add(test)
|
||||
if newpass:
|
||||
# We already validated the repo, so we can just dive right in
|
||||
# and commit.
|
||||
if opts.commit_to_repo:
|
||||
print(len(newpass), "new passing tests on Python 3!")
|
||||
with open(opts.working_tests) as f:
|
||||
oldpass = {l for l in f.read().splitlines() if l}
|
||||
with open(opts.working_tests, "w") as f:
|
||||
for p in sorted(oldpass | newpass):
|
||||
f.write("%s\n" % p)
|
||||
_runhg(
|
||||
"hg",
|
||||
"commit",
|
||||
"-R",
|
||||
opts.commit_to_repo,
|
||||
"--user",
|
||||
opts.commit_user,
|
||||
"--message",
|
||||
"python3: expand list of passing tests",
|
||||
)
|
||||
else:
|
||||
print("Newly passing tests:", "\n".join(sorted(newpass)))
|
||||
sys.exit(2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
@ -1,121 +0,0 @@
|
||||
test-add.t
|
||||
test-addremove-similar.t
|
||||
test-addremove.t
|
||||
test-ancestor.py
|
||||
test-automv.t
|
||||
test-backwards-remove.t
|
||||
test-bheads.t
|
||||
test-bisect2.t
|
||||
test-bookmarks-merge.t
|
||||
test-bookmarks-strip.t
|
||||
test-branch-tag-confict.t
|
||||
test-casecollision.t
|
||||
test-cat.t
|
||||
test-changelog-exec.t
|
||||
test-check-commit.t
|
||||
test-check-execute.t
|
||||
test-check-module-imports.t
|
||||
test-check-pyflakes.t
|
||||
test-check-pylint.t
|
||||
test-check-shbang.t
|
||||
test-children.t
|
||||
test-commit-unresolved.t
|
||||
test-completion.t
|
||||
test-contrib-check-code.t
|
||||
test-contrib-check-commit.t
|
||||
test-debugrename.t
|
||||
test-diff-copy-depth.t
|
||||
test-diff-hashes.t
|
||||
test-diff-issue2761.t
|
||||
test-diff-newlines.t
|
||||
test-diff-reverse.t
|
||||
test-diff-subdir.t
|
||||
test-dirstate-nonnormalset.t
|
||||
test-doctest.py
|
||||
test-double-merge.t
|
||||
test-duplicateoptions.py
|
||||
test-empty-dir.t
|
||||
test-empty-file.t
|
||||
test-empty.t
|
||||
test-encoding-func.py
|
||||
test-excessive-merge.t
|
||||
test-execute-bit.t
|
||||
test-gpg.t
|
||||
test-hghave.t
|
||||
test-imports-checker.t
|
||||
test-issue1089.t
|
||||
test-issue1502.t
|
||||
test-issue1802.t
|
||||
test-issue1877.t
|
||||
test-issue1993.t
|
||||
test-issue522.t
|
||||
test-issue612.t
|
||||
test-issue619.t
|
||||
test-issue672.t
|
||||
test-issue842.t
|
||||
test-journal-exists.t
|
||||
test-locate.t
|
||||
test-lrucachedict.py
|
||||
test-manifest.py
|
||||
test-manifest-merging.t
|
||||
test-match.py
|
||||
test-merge-default.t
|
||||
test-merge-internal-tools-pattern.t
|
||||
test-merge-remove.t
|
||||
test-merge-revert.t
|
||||
test-merge-revert2.t
|
||||
test-merge-subrepos.t
|
||||
test-merge10.t
|
||||
test-merge2.t
|
||||
test-merge4.t
|
||||
test-merge5.t
|
||||
test-merge6.t
|
||||
test-merge7.t
|
||||
test-merge8.t
|
||||
test-mq-qimport-fail-cleanup.t
|
||||
test-permissions.t
|
||||
test-push-checkheads-partial-C1.t
|
||||
test-push-checkheads-partial-C2.t
|
||||
test-push-checkheads-partial-C3.t
|
||||
test-push-checkheads-partial-C4.t
|
||||
test-push-checkheads-pruned-B1.t
|
||||
test-push-checkheads-pruned-B2.t
|
||||
test-push-checkheads-pruned-B3.t
|
||||
test-push-checkheads-pruned-B4.t
|
||||
test-push-checkheads-pruned-B5.t
|
||||
test-push-checkheads-pruned-B6.t
|
||||
test-push-checkheads-pruned-B7.t
|
||||
test-push-checkheads-pruned-B8.t
|
||||
test-push-checkheads-superceed-A1.t
|
||||
test-push-checkheads-superceed-A2.t
|
||||
test-push-checkheads-superceed-A3.t
|
||||
test-push-checkheads-superceed-A4.t
|
||||
test-push-checkheads-superceed-A5.t
|
||||
test-push-checkheads-superceed-A6.t
|
||||
test-push-checkheads-superceed-A7.t
|
||||
test-push-checkheads-superceed-A8.t
|
||||
test-push-checkheads-unpushed-D1.t
|
||||
test-push-checkheads-unpushed-D2.t
|
||||
test-push-checkheads-unpushed-D3.t
|
||||
test-push-checkheads-unpushed-D4.t
|
||||
test-push-checkheads-unpushed-D5.t
|
||||
test-push-checkheads-unpushed-D6.t
|
||||
test-push-checkheads-unpushed-D7.t
|
||||
test-rename-dir-merge.t
|
||||
test-rename-merge1.t
|
||||
test-rename.t
|
||||
test-revert-flags.t
|
||||
test-revert-unknown.t
|
||||
test-revlog-group-emptyiter.t
|
||||
test-revlog-packentry.t
|
||||
test-run-tests.py
|
||||
test-show-stack.t
|
||||
test-simple-update.t
|
||||
test-status-terse.t
|
||||
test-uncommit.t
|
||||
test-unified-test.t
|
||||
test-unrelated-pull.t
|
||||
test-update-issue1456.t
|
||||
test-update-names.t
|
||||
test-update-reverse.t
|
||||
test-xdg.t
|
@ -1,387 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Portions Copyright (c) Facebook, Inc. and its affiliates.
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2.
|
||||
|
||||
# Copyright Matt Mackall <mpm@selenic.com> and others
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
# Measure the performance of a list of revsets against multiple revisions
|
||||
# defined by parameter. Checkout one by one and run perfrevset with every
|
||||
# revset in the list to benchmark its performance.
|
||||
#
|
||||
# You should run this from the root of your mercurial repository.
|
||||
#
|
||||
# call with --help for details
|
||||
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import math
|
||||
import optparse # cannot use argparse, python 2.7 only
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
DEFAULTVARIANTS = [
|
||||
"plain",
|
||||
"min",
|
||||
"max",
|
||||
"first",
|
||||
"last",
|
||||
"reverse",
|
||||
"reverse+first",
|
||||
"reverse+last",
|
||||
"sort",
|
||||
"sort+first",
|
||||
"sort+last",
|
||||
]
|
||||
|
||||
|
||||
def check_output(*args, **kwargs):
|
||||
kwargs.setdefault("stderr", subprocess.PIPE)
|
||||
kwargs.setdefault("stdout", subprocess.PIPE)
|
||||
proc = subprocess.Popen(*args, **kwargs)
|
||||
output, error = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
raise subprocess.CalledProcessError(proc.returncode, " ".join(args[0]))
|
||||
return output
|
||||
|
||||
|
||||
def update(rev):
|
||||
"""update the repo to a revision"""
|
||||
try:
|
||||
subprocess.check_call(["hg", "update", "--quiet", "--check", str(rev)])
|
||||
check_output(
|
||||
["make", "local"], stderr=None
|
||||
) # suppress output except for error/warning
|
||||
except subprocess.CalledProcessError as exc:
|
||||
print("update to revision %s failed, aborting" % rev, file=sys.stderr)
|
||||
sys.exit(exc.returncode)
|
||||
|
||||
|
||||
def hg(cmd, repo=None):
|
||||
"""run a mercurial command
|
||||
|
||||
<cmd> is the list of command + argument,
|
||||
<repo> is an optional repository path to run this command in."""
|
||||
fullcmd = ["./hg"]
|
||||
if repo is not None:
|
||||
fullcmd += ["-R", repo]
|
||||
fullcmd += ["--config", "extensions.perf=" + os.path.join(contribdir, "perf.py")]
|
||||
fullcmd += cmd
|
||||
return check_output(fullcmd, stderr=subprocess.STDOUT)
|
||||
|
||||
|
||||
def perf(revset, target=None, contexts=False):
|
||||
"""run benchmark for this very revset"""
|
||||
try:
|
||||
args = ["perfrevset", revset]
|
||||
if contexts:
|
||||
args.append("--contexts")
|
||||
output = hg(args, repo=target)
|
||||
return parseoutput(output)
|
||||
except subprocess.CalledProcessError as exc:
|
||||
print("abort: cannot run revset benchmark: %s" % exc.cmd, file=sys.stderr)
|
||||
if getattr(exc, "output", None) is None: # no output before 2.7
|
||||
print("(no output)", file=sys.stderr)
|
||||
else:
|
||||
print(exc.output, file=sys.stderr)
|
||||
return None
|
||||
|
||||
|
||||
outputre = re.compile(
|
||||
r"! wall (\d+.\d+) comb (\d+.\d+) user (\d+.\d+) " "sys (\d+.\d+) \(best of (\d+)\)"
|
||||
)
|
||||
|
||||
|
||||
def parseoutput(output):
|
||||
"""parse a textual output into a dict
|
||||
|
||||
We cannot just use json because we want to compare with old
|
||||
versions of Mercurial that may not support json output.
|
||||
"""
|
||||
match = outputre.search(output)
|
||||
if not match:
|
||||
print("abort: invalid output:", file=sys.stderr)
|
||||
print(output, file=sys.stderr)
|
||||
sys.exit(1)
|
||||
return {
|
||||
"comb": float(match.group(2)),
|
||||
"count": int(match.group(5)),
|
||||
"sys": float(match.group(3)),
|
||||
"user": float(match.group(4)),
|
||||
"wall": float(match.group(1)),
|
||||
}
|
||||
|
||||
|
||||
def printrevision(rev):
|
||||
"""print data about a revision"""
|
||||
sys.stdout.write("Revision ")
|
||||
sys.stdout.flush()
|
||||
subprocess.check_call(
|
||||
[
|
||||
"hg",
|
||||
"log",
|
||||
"--rev",
|
||||
str(rev),
|
||||
"--template",
|
||||
'{if(tags, " ({tags})")} ' "{rev}:{node|short}: {desc|firstline}\n",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def idxwidth(nbidx):
|
||||
"""return the max width of number used for index
|
||||
|
||||
This is similar to log10(nbidx), but we use custom code here
|
||||
because we start with zero and we'd rather not deal with all the
|
||||
extra rounding business that log10 would imply.
|
||||
"""
|
||||
nbidx -= 1 # starts at 0
|
||||
idxwidth = 0
|
||||
while nbidx:
|
||||
idxwidth += 1
|
||||
nbidx //= 10
|
||||
if not idxwidth:
|
||||
idxwidth = 1
|
||||
return idxwidth
|
||||
|
||||
|
||||
def getfactor(main, other, field, sensitivity=0.05):
|
||||
"""return the relative factor between values for 'field' in main and other
|
||||
|
||||
Return None if the factor is insignificant (less than <sensitivity>
|
||||
variation)."""
|
||||
factor = 1
|
||||
if main is not None:
|
||||
factor = other[field] / main[field]
|
||||
low, high = 1 - sensitivity, 1 + sensitivity
|
||||
if low < factor < high:
|
||||
return None
|
||||
return factor
|
||||
|
||||
|
||||
def formatfactor(factor):
|
||||
"""format a factor into a 4 char string
|
||||
|
||||
22%
|
||||
156%
|
||||
x2.4
|
||||
x23
|
||||
x789
|
||||
x1e4
|
||||
x5x7
|
||||
|
||||
"""
|
||||
if factor is None:
|
||||
return " "
|
||||
elif factor < 2:
|
||||
return "%3i%%" % (factor * 100)
|
||||
elif factor < 10:
|
||||
return "x%3.1f" % factor
|
||||
elif factor < 1000:
|
||||
return "%4s" % ("x%i" % factor)
|
||||
else:
|
||||
order = int(math.log(factor)) + 1
|
||||
while 1 < math.log(factor):
|
||||
factor //= 0
|
||||
return "x%ix%i" % (factor, order)
|
||||
|
||||
|
||||
def formattiming(value):
|
||||
"""format a value to strictly 8 char, dropping some precision if needed"""
|
||||
if value < 10 ** 7:
|
||||
return ("%.6f" % value)[:8]
|
||||
else:
|
||||
# value is HUGE very unlikely to happen (4+ month run)
|
||||
return "%i" % value
|
||||
|
||||
|
||||
_marker = object()
|
||||
|
||||
|
||||
def printresult(variants, idx, data, maxidx, verbose=False, reference=_marker):
|
||||
"""print a line of result to stdout"""
|
||||
mask = "%%0%ii) %%s" % idxwidth(maxidx)
|
||||
|
||||
out = []
|
||||
for var in variants:
|
||||
if data[var] is None:
|
||||
out.append("error ")
|
||||
out.append(" " * 4)
|
||||
continue
|
||||
out.append(formattiming(data[var]["wall"]))
|
||||
if reference is not _marker:
|
||||
factor = None
|
||||
if reference is not None:
|
||||
factor = getfactor(reference[var], data[var], "wall")
|
||||
out.append(formatfactor(factor))
|
||||
if verbose:
|
||||
out.append(formattiming(data[var]["comb"]))
|
||||
out.append(formattiming(data[var]["user"]))
|
||||
out.append(formattiming(data[var]["sys"]))
|
||||
out.append("%6d" % data[var]["count"])
|
||||
print(mask % (idx, " ".join(out)))
|
||||
|
||||
|
||||
def printheader(variants, maxidx, verbose=False, relative=False):
|
||||
header = [" " * (idxwidth(maxidx) + 1)]
|
||||
for var in variants:
|
||||
if not var:
|
||||
var = "iter"
|
||||
if 8 < len(var):
|
||||
var = var[:3] + ".." + var[-3:]
|
||||
header.append("%-8s" % var)
|
||||
if relative:
|
||||
header.append(" ")
|
||||
if verbose:
|
||||
header.append("%-8s" % "comb")
|
||||
header.append("%-8s" % "user")
|
||||
header.append("%-8s" % "sys")
|
||||
header.append("%6s" % "count")
|
||||
print(" ".join(header))
|
||||
|
||||
|
||||
def getrevs(spec):
|
||||
"""get the list of rev matched by a revset"""
|
||||
try:
|
||||
out = check_output(["hg", "log", "--template={rev}\n", "--rev", spec])
|
||||
except subprocess.CalledProcessError as exc:
|
||||
print("abort, can't get revision from %s" % spec, file=sys.stderr)
|
||||
sys.exit(exc.returncode)
|
||||
return [r for r in out.split() if r]
|
||||
|
||||
|
||||
def applyvariants(revset, variant):
|
||||
if variant == "plain":
|
||||
return revset
|
||||
for var in variant.split("+"):
|
||||
revset = "%s(%s)" % (var, revset)
|
||||
return revset
|
||||
|
||||
|
||||
helptext = """This script will run multiple variants of provided revsets using
|
||||
different revisions in your mercurial repository. After the benchmark are run
|
||||
summary output is provided. Use it to demonstrate speed improvements or pin
|
||||
point regressions. Revsets to run are specified in a file (or from stdin), one
|
||||
revsets per line. Line starting with '#' will be ignored, allowing insertion of
|
||||
comments."""
|
||||
parser = optparse.OptionParser(
|
||||
usage="usage: %prog [options] <revs>", description=helptext
|
||||
)
|
||||
parser.add_option(
|
||||
"-f", "--file", help="read revset from FILE (stdin if omitted)", metavar="FILE"
|
||||
)
|
||||
parser.add_option("-R", "--repo", help="run benchmark on REPO", metavar="REPO")
|
||||
|
||||
parser.add_option(
|
||||
"-v",
|
||||
"--verbose",
|
||||
action="store_true",
|
||||
help="display all timing data (not just best total time)",
|
||||
)
|
||||
|
||||
parser.add_option(
|
||||
"",
|
||||
"--variants",
|
||||
default=",".join(DEFAULTVARIANTS),
|
||||
help="comma separated list of variant to test "
|
||||
"(eg: plain,min,sorted) (plain = no modification)",
|
||||
)
|
||||
parser.add_option(
|
||||
"",
|
||||
"--contexts",
|
||||
action="store_true",
|
||||
help="obtain changectx from results instead of integer revs",
|
||||
)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
if not args:
|
||||
parser.print_help()
|
||||
sys.exit(255)
|
||||
|
||||
# the directory where both this script and the perf.py extension live.
|
||||
contribdir = os.path.dirname(__file__)
|
||||
|
||||
revsetsfile = sys.stdin
|
||||
if options.file:
|
||||
revsetsfile = open(options.file)
|
||||
|
||||
revsets = [l.strip() for l in revsetsfile if not l.startswith("#")]
|
||||
revsets = [l for l in revsets if l]
|
||||
|
||||
print("Revsets to benchmark")
|
||||
print("----------------------------")
|
||||
|
||||
for idx, rset in enumerate(revsets):
|
||||
print("%i) %s" % (idx, rset))
|
||||
|
||||
print("----------------------------")
|
||||
print()
|
||||
|
||||
revs = []
|
||||
for a in args:
|
||||
revs.extend(getrevs(a))
|
||||
|
||||
variants = options.variants.split(",")
|
||||
|
||||
results = []
|
||||
for r in revs:
|
||||
print("----------------------------")
|
||||
printrevision(r)
|
||||
print("----------------------------")
|
||||
update(r)
|
||||
res = []
|
||||
results.append(res)
|
||||
printheader(variants, len(revsets), verbose=options.verbose)
|
||||
for idx, rset in enumerate(revsets):
|
||||
varres = {}
|
||||
for var in variants:
|
||||
varrset = applyvariants(rset, var)
|
||||
data = perf(varrset, target=options.repo, contexts=options.contexts)
|
||||
varres[var] = data
|
||||
res.append(varres)
|
||||
printresult(variants, idx, varres, len(revsets), verbose=options.verbose)
|
||||
sys.stdout.flush()
|
||||
print("----------------------------")
|
||||
|
||||
|
||||
print(
|
||||
"""
|
||||
|
||||
Result by revset
|
||||
================
|
||||
"""
|
||||
)
|
||||
|
||||
print("Revision:")
|
||||
for idx, rev in enumerate(revs):
|
||||
sys.stdout.write("%i) " % idx)
|
||||
sys.stdout.flush()
|
||||
printrevision(rev)
|
||||
|
||||
print()
|
||||
print()
|
||||
|
||||
for ridx, rset in enumerate(revsets):
|
||||
|
||||
print("revset #%i: %s" % (ridx, rset))
|
||||
printheader(variants, len(results), verbose=options.verbose, relative=True)
|
||||
ref = None
|
||||
for idx, data in enumerate(results):
|
||||
printresult(
|
||||
variants,
|
||||
idx,
|
||||
data[ridx],
|
||||
len(results),
|
||||
verbose=options.verbose,
|
||||
reference=ref,
|
||||
)
|
||||
ref = data[ridx]
|
||||
print()
|
@ -1,81 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
from __future__ import absolute_import
|
||||
|
||||
import getopt
|
||||
import sys
|
||||
|
||||
from edenscm import hgdemandimport
|
||||
hgdemandimport.enable()
|
||||
|
||||
from edenscm.mercurial.i18n import _
|
||||
from edenscm.mercurial import (
|
||||
context,
|
||||
error,
|
||||
fancyopts,
|
||||
simplemerge,
|
||||
ui as uimod,
|
||||
util,
|
||||
)
|
||||
|
||||
options = [('L', 'label', [], _('labels to use on conflict markers')),
|
||||
('a', 'text', None, _('treat all files as text')),
|
||||
('p', 'print', None,
|
||||
_('print results instead of overwriting LOCAL')),
|
||||
('', 'no-minimal', None, _('no effect (DEPRECATED)')),
|
||||
('h', 'help', None, _('display help and exit')),
|
||||
('q', 'quiet', None, _('suppress output'))]
|
||||
|
||||
usage = _('''simplemerge [OPTS] LOCAL BASE OTHER
|
||||
|
||||
Simple three-way file merge utility with a minimal feature set.
|
||||
|
||||
Apply to LOCAL the changes necessary to go from BASE to OTHER.
|
||||
|
||||
By default, LOCAL is overwritten with the results of this operation.
|
||||
''')
|
||||
|
||||
class ParseError(Exception):
|
||||
"""Exception raised on errors in parsing the command line."""
|
||||
|
||||
def showhelp():
|
||||
sys.stdout.write(usage)
|
||||
sys.stdout.write('\noptions:\n')
|
||||
|
||||
out_opts = []
|
||||
for shortopt, longopt, default, desc in options:
|
||||
out_opts.append(('%2s%s' % (shortopt and '-%s' % shortopt,
|
||||
longopt and ' --%s' % longopt),
|
||||
'%s' % desc))
|
||||
opts_len = max([len(opt[0]) for opt in out_opts])
|
||||
for first, second in out_opts:
|
||||
sys.stdout.write(' %-*s %s\n' % (opts_len, first, second))
|
||||
|
||||
try:
|
||||
for fp in (sys.stdin, sys.stdout, sys.stderr):
|
||||
util.setbinary(fp)
|
||||
|
||||
opts = {}
|
||||
try:
|
||||
args = fancyopts.fancyopts(sys.argv[1:], options, opts)
|
||||
except getopt.GetoptError as e:
|
||||
raise ParseError(e)
|
||||
if opts['help']:
|
||||
showhelp()
|
||||
sys.exit(0)
|
||||
if len(args) != 3:
|
||||
raise ParseError(_('wrong number of arguments'))
|
||||
local, base, other = args
|
||||
sys.exit(simplemerge.simplemerge(uimod.ui.load(),
|
||||
context.arbitraryfilectx(local),
|
||||
context.arbitraryfilectx(base),
|
||||
context.arbitraryfilectx(other),
|
||||
**opts))
|
||||
except ParseError as e:
|
||||
sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
|
||||
showhelp()
|
||||
sys.exit(1)
|
||||
except error.Abort as e:
|
||||
sys.stderr.write("abort: %s\n" % e)
|
||||
sys.exit(255)
|
||||
except KeyboardInterrupt:
|
||||
sys.exit(255)
|
@ -1,50 +0,0 @@
|
||||
#
|
||||
# tcsh completion for Mercurial
|
||||
#
|
||||
# This file has been auto-generated by tcsh_completion_build.sh for
|
||||
# Mercurial Distributed SCM (version 1.7.5+157-8a220ae0b2ba)
|
||||
#
|
||||
# Copyright (C) 2005 TK Soh.
|
||||
#
|
||||
# This is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 2 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
|
||||
complete hg \
|
||||
'n/--cwd/d/' 'n/-R/d/' 'n/--repository/d/' \
|
||||
'C/-/( -R --repository \
|
||||
--cwd \
|
||||
-y --noninteractive \
|
||||
-q --quiet \
|
||||
-v --verbose \
|
||||
--config \
|
||||
--debug \
|
||||
--debugger \
|
||||
--encoding \
|
||||
--encodingmode \
|
||||
--traceback \
|
||||
--time \
|
||||
--profile \
|
||||
--version \
|
||||
-h --help)/' \
|
||||
'p/1/(add addremove annotate blame archive \
|
||||
backout bisect bookmarks branch branches \
|
||||
bundle cat clone commit ci \
|
||||
copy cp debugancestor debugbuilddag debugcheckstate \
|
||||
debugcommands debugcomplete debugdag debugdata debugdate \
|
||||
debugfsinfo debugignore debugindex debugindexdot debuginstall \
|
||||
debugpushkey debugrebuildstate debugrename debugrevspec debugsetparents \
|
||||
debugstate debugsub debugwalk diff export \
|
||||
forget grep heads help identify \
|
||||
id import patch incoming in \
|
||||
init locate log history manifest \
|
||||
merge outgoing out parents paths \
|
||||
pull push recover remove rm \
|
||||
rename move mv resolve revert \
|
||||
rollback root serve showconfig debugconfig \
|
||||
status st summary sum tag \
|
||||
tags tip unbundle update up \
|
||||
checkout co verify version)/'
|
||||
|
@ -1,74 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# tcsh_completion_build.sh - script to generate tcsh completion
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2005 TK Soh.
|
||||
#
|
||||
# This is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 2 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
#
|
||||
# Description
|
||||
# -----------
|
||||
# This script generates a tcsh source file to support completion
|
||||
# of Mercurial commands and options.
|
||||
#
|
||||
# Instruction:
|
||||
# -----------
|
||||
# Run this script to generate the tcsh source file, and source
|
||||
# the file to add command completion support for Mercurial.
|
||||
#
|
||||
# tcsh% tcsh_completion.sh FILE
|
||||
# tcsh% source FILE
|
||||
#
|
||||
# If FILE is not specified, tcsh_completion will be generated.
|
||||
#
|
||||
# Bugs:
|
||||
# ----
|
||||
# 1. command specific options are not supported
|
||||
# 2. hg commands must be specified immediately after 'hg'.
|
||||
#
|
||||
|
||||
tcsh_file=${1-tcsh_completion}
|
||||
|
||||
hg_commands=`hg --debug help | \
|
||||
sed -e '1,/^list of commands:/d' \
|
||||
-e '/^enabled extensions:/,$d' \
|
||||
-e '/^additional help topics:/,$d' \
|
||||
-e '/^ [^ ]/!d; s/[,:]//g;' | \
|
||||
xargs -n5 | \
|
||||
sed -e '$!s/$/ \\\\/g; 2,$s/^ */ /g'`
|
||||
|
||||
hg_global_options=`hg -v help | \
|
||||
sed -e '1,/global/d;/^ *-/!d; s/ [^- ].*//' | \
|
||||
sed -e 's/ *$//; $!s/$/ \\\\/g; 2,$s/^ */ /g'`
|
||||
|
||||
hg_version=`hg version | sed -e '1q'`
|
||||
|
||||
script_name=`basename $0`
|
||||
|
||||
cat > $tcsh_file <<END
|
||||
#
|
||||
# tcsh completion for Mercurial
|
||||
#
|
||||
# This file has been auto-generated by $script_name for
|
||||
# $hg_version
|
||||
#
|
||||
# Copyright (C) 2005 TK Soh.
|
||||
#
|
||||
# This is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 2 of the License, or (at your
|
||||
# option) any later version.
|
||||
#
|
||||
|
||||
complete hg \\
|
||||
'n/--cwd/d/' 'n/-R/d/' 'n/--repository/d/' \\
|
||||
'C/-/($hg_global_options)/' \\
|
||||
'p/1/($hg_commands)/'
|
||||
|
||||
END
|
@ -1,41 +0,0 @@
|
||||
# RelaxNG schema for "xml" log style
|
||||
# Inspired by Subversion's XML log format.
|
||||
|
||||
start = log
|
||||
node.type = xsd:string {minLength = "40" maxLength = "40"}
|
||||
|
||||
log = element log { logentry+ }
|
||||
logentry = element logentry {
|
||||
logentry.attlist,
|
||||
branch*, tag*, hgparent*,
|
||||
author, date,
|
||||
msg, paths?, copies?, extra*
|
||||
}
|
||||
logentry.attlist =
|
||||
attribute revision {xsd:nonNegativeInteger}
|
||||
& attribute node {node.type}
|
||||
branch = element branch { text }
|
||||
tag = element tag { text }
|
||||
hgparent = element parent {hgparent.attlist, text}
|
||||
hgparent.attlist =
|
||||
attribute revision {xsd:integer {minInclusive = "-1"} }
|
||||
& attribute node {node.type}
|
||||
author = element author { author.attlist, text }
|
||||
author.attlist =
|
||||
attribute email {text}
|
||||
date = element date {xsd:dateTime}
|
||||
msg = element msg {msg.attlist, text}
|
||||
msg.attlist =
|
||||
attribute xml:space {"preserve"}
|
||||
paths = element paths { path* }
|
||||
path = element path { path.attlist, text }
|
||||
path.attlist =
|
||||
# Action: (A)dd, (M)odify, (R)emove
|
||||
attribute action {"A"|"M"|"R"}
|
||||
copies = element copies { copy+ }
|
||||
copy = element copy { copy.attlist, text }
|
||||
copy.attlist =
|
||||
attribute source {text}
|
||||
extra = element extra {extra.attlist, text}
|
||||
extra.attlist =
|
||||
attribute key {text}
|
@ -1,22 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# An example hgweb CGI script, edit as necessary
|
||||
# See also https://mercurial-scm.org/wiki/PublishingRepositories
|
||||
|
||||
# Path to repo or hgweb config to serve (see 'hg help hgweb')
|
||||
config = "/path/to/repo/or/config"
|
||||
|
||||
# Uncomment and adjust if Mercurial is not installed system-wide
|
||||
# (consult "installed modules" path from 'hg debuginstall'):
|
||||
# import sys; sys.path.insert(0, "/path/to/python/lib")
|
||||
|
||||
# Uncomment to send python tracebacks to the browser if an error occurs:
|
||||
# import cgitb; cgitb.enable()
|
||||
|
||||
from edenscm.mercurial import demandimport
|
||||
|
||||
demandimport.enable()
|
||||
from edenscm.mercurial.hgweb import hgweb, wsgicgi
|
||||
|
||||
application = hgweb(config)
|
||||
wsgicgi.launch(application)
|
@ -1,63 +0,0 @@
|
||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
#include <folly/portability/GTest.h>
|
||||
|
||||
#include <array>
|
||||
#include "edenscm/mercurial/bitmanipulation.h"
|
||||
|
||||
namespace {
|
||||
// This is basically like std::make_array<char>(), but uses memcpy to avoid
|
||||
// undefined behavior when handling input bytes that fit in unsigned char
|
||||
// but not char.
|
||||
//
|
||||
// We need to return array<char> rather than array<unsigned char> since the
|
||||
// functions we are testing expect a 'const char*'
|
||||
template <typename... Args>
|
||||
constexpr std::array<char, sizeof...(Args)> make_buf(Args&&... args) {
|
||||
std::array<unsigned char, sizeof...(Args)> unsigned_array = {
|
||||
{static_cast<unsigned char>(std::forward<Args>(args))...}};
|
||||
std::array<char, sizeof...(Args)> result{{}};
|
||||
memcpy(result.data(), unsigned_array.data(), unsigned_array.size());
|
||||
return result;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
TEST(BitManipulation, getbe32) {
|
||||
EXPECT_EQ(0x12345678, getbe32(make_buf(0x12, 0x34, 0x56, 0x78).data()));
|
||||
|
||||
EXPECT_EQ(0x12345678, getbe32(make_buf(0x12, 0x34, 0x56, 0x78).data()));
|
||||
EXPECT_EQ(0xffffffffUL, getbe32(make_buf(0xff, 0xff, 0xff, 0xff).data()));
|
||||
}
|
||||
|
||||
TEST(BitManipulation, putbe32) {
|
||||
std::array<char, 4> buf;
|
||||
putbe32(0x87654321UL, buf.data());
|
||||
EXPECT_EQ(0x87654321UL, getbe32(buf.data()));
|
||||
putbe32(0, buf.data());
|
||||
EXPECT_EQ(0, getbe32(buf.data()));
|
||||
putbe32(42, buf.data());
|
||||
EXPECT_EQ(42, getbe32(buf.data()));
|
||||
}
|
||||
|
||||
TEST(BitManipulation, getbeuint16) {
|
||||
EXPECT_EQ(0x1234, getbeuint16(make_buf(0x12, 0x34).data()));
|
||||
EXPECT_EQ(0xffff, getbeuint16(make_buf(0xff, 0xff).data()));
|
||||
}
|
||||
|
||||
TEST(BitManipulation, getbeint16) {
|
||||
EXPECT_EQ(0x1234, getbeint16(make_buf(0x12, 0x34).data()));
|
||||
EXPECT_EQ(-1, getbeint16(make_buf(0xff, 0xff).data()));
|
||||
EXPECT_EQ(-2, getbeint16(make_buf(0xff, 0xfe).data()));
|
||||
}
|
||||
|
||||
TEST(BitManipulation, getbefloat64) {
|
||||
EXPECT_EQ(0.0, getbefloat64(make_buf(0, 0, 0, 0, 0, 0, 0, 0).data()));
|
||||
EXPECT_EQ(-0.0, getbefloat64(make_buf(0x80, 0, 0, 0, 0, 0, 0, 0).data()));
|
||||
EXPECT_DOUBLE_EQ(
|
||||
2.0, getbefloat64(make_buf(0x40, 0, 0, 0, 0, 0, 0, 1).data()));
|
||||
EXPECT_DOUBLE_EQ(
|
||||
-8.0, getbefloat64(make_buf(0xc0, 0x20, 0, 0, 0, 0, 0, 1).data()));
|
||||
EXPECT_DOUBLE_EQ(
|
||||
-4.0,
|
||||
getbefloat64(
|
||||
make_buf(0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff).data()));
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import os
|
||||
|
||||
from edenscm.mercurial import dispatch
|
||||
|
||||
|
||||
def testdispatch(cmd):
|
||||
"""Simple wrapper around dispatch.dispatch()
|
||||
|
||||
Prints command and result value, but does not handle quoting.
|
||||
"""
|
||||
print("running: %s" % (cmd,))
|
||||
req = dispatch.request(cmd.split())
|
||||
result = dispatch.dispatch(req)
|
||||
print("result: %r" % (result,))
|
||||
|
||||
|
||||
# create file 'foo', add and commit
|
||||
f = open("foo", "wb")
|
||||
f.write("foo\n")
|
||||
f.close()
|
||||
testdispatch("add foo")
|
||||
testdispatch("commit -m commit1 -d 2000-01-01 foo")
|
||||
|
||||
# append to file 'foo' and commit
|
||||
f = open("foo", "ab")
|
||||
f.write("bar\n")
|
||||
f.close()
|
||||
# remove blackbox.log directory (proxy for readonly log file)
|
||||
os.rmdir(".hg/blackbox.log")
|
||||
# replace it with the real blackbox.log file
|
||||
os.rename(".hg/blackbox.log-", ".hg/blackbox.log")
|
||||
testdispatch("commit -m commit2 -d 2000-01-02 foo")
|
||||
|
||||
# check 88803a69b24 (fancyopts modified command table)
|
||||
testdispatch("log -r 0")
|
||||
testdispatch("log -r tip")
|
@ -1,29 +0,0 @@
|
||||
DOCUMENT_ROOT="/var/www/hg"; export DOCUMENT_ROOT
|
||||
GATEWAY_INTERFACE="CGI/1.1"; export GATEWAY_INTERFACE
|
||||
HTTP_ACCEPT="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; export HTTP_ACCEPT
|
||||
HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"; export HTTP_ACCEPT_CHARSET
|
||||
HTTP_ACCEPT_ENCODING="gzip,deflate"; export HTTP_ACCEPT_ENCODING
|
||||
HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"; export HTTP_ACCEPT_LANGUAGE
|
||||
HTTP_CACHE_CONTROL="max-age=0"; export HTTP_CACHE_CONTROL
|
||||
HTTP_CONNECTION="keep-alive"; export HTTP_CONNECTION
|
||||
HTTP_HOST="hg.omnifarious.org"; export HTTP_HOST
|
||||
HTTP_KEEP_ALIVE="300"; export HTTP_KEEP_ALIVE
|
||||
HTTP_USER_AGENT="Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4"; export HTTP_USER_AGENT
|
||||
PATH_INFO="/"; export PATH_INFO
|
||||
PATH_TRANSLATED="/var/www/hg/index.html"; export PATH_TRANSLATED
|
||||
QUERY_STRING=""; export QUERY_STRING
|
||||
REMOTE_ADDR="127.0.0.2"; export REMOTE_ADDR
|
||||
REMOTE_PORT="44703"; export REMOTE_PORT
|
||||
REQUEST_METHOD="GET"; export REQUEST_METHOD
|
||||
REQUEST_URI="/test/"; export REQUEST_URI
|
||||
SCRIPT_FILENAME="/home/hopper/hg_public/test.cgi"; export SCRIPT_FILENAME
|
||||
SCRIPT_NAME="/test"; export SCRIPT_NAME
|
||||
SCRIPT_URI="http://hg.omnifarious.org/test/"; export SCRIPT_URI
|
||||
SCRIPT_URL="/test/"; export SCRIPT_URL
|
||||
SERVER_ADDR="127.0.0.1"; export SERVER_ADDR
|
||||
SERVER_ADMIN="eric@localhost"; export SERVER_ADMIN
|
||||
SERVER_NAME="hg.omnifarious.org"; export SERVER_NAME
|
||||
SERVER_PORT="80"; export SERVER_PORT
|
||||
SERVER_PROTOCOL="HTTP/1.1"; export SERVER_PROTOCOL
|
||||
SERVER_SIGNATURE="<address>Apache/2.0.53 (Fedora) Server at hg.omnifarious.org Port 80</address>"; export SERVER_SIGNATURE
|
||||
SERVER_SOFTWARE="Apache/2.0.53 (Fedora)"; export SERVER_SOFTWARE
|
@ -1,89 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
"""dummy SMTP server for use in tests"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import asyncore
|
||||
import optparse
|
||||
import smtpd
|
||||
import ssl
|
||||
import sys
|
||||
|
||||
from edenscm.mercurial import server, sslutil, ui as uimod
|
||||
|
||||
|
||||
def log(msg):
|
||||
sys.stdout.write(msg)
|
||||
sys.stdout.flush()
|
||||
|
||||
|
||||
class dummysmtpserver(smtpd.SMTPServer):
|
||||
def __init__(self, localaddr):
|
||||
smtpd.SMTPServer.__init__(self, localaddr, remoteaddr=None)
|
||||
|
||||
def process_message(self, peer, mailfrom, rcpttos, data):
|
||||
log("%s from=%s to=%s\n" % (peer[0], mailfrom, ", ".join(rcpttos)))
|
||||
|
||||
|
||||
class dummysmtpsecureserver(dummysmtpserver):
|
||||
def __init__(self, localaddr, certfile):
|
||||
dummysmtpserver.__init__(self, localaddr)
|
||||
self._certfile = certfile
|
||||
|
||||
def handle_accept(self):
|
||||
pair = self.accept()
|
||||
if not pair:
|
||||
return
|
||||
conn, addr = pair
|
||||
ui = uimod.ui.load()
|
||||
try:
|
||||
# wrap_socket() would block, but we don't care
|
||||
conn = sslutil.wrapserversocket(conn, ui, certfile=self._certfile)
|
||||
except ssl.SSLError:
|
||||
log("%s ssl error\n" % addr[0])
|
||||
conn.close()
|
||||
return
|
||||
smtpd.SMTPChannel(self, conn, addr)
|
||||
|
||||
|
||||
def run():
|
||||
try:
|
||||
asyncore.loop()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
|
||||
def main():
|
||||
op = optparse.OptionParser()
|
||||
op.add_option("-d", "--daemon", action="store_true")
|
||||
op.add_option("--daemon-postexec", action="append")
|
||||
op.add_option("-p", "--port", type=int, default=8025)
|
||||
op.add_option("-a", "--address", default="localhost")
|
||||
op.add_option("--pid-file", metavar="FILE")
|
||||
op.add_option("--tls", choices=["none", "smtps"], default="none")
|
||||
op.add_option("--certificate", metavar="FILE")
|
||||
|
||||
opts, args = op.parse_args()
|
||||
if opts.tls == "smtps" and not opts.certificate:
|
||||
op.error("--certificate must be specified")
|
||||
|
||||
addr = (opts.address, opts.port)
|
||||
|
||||
def init():
|
||||
if opts.tls == "none":
|
||||
dummysmtpserver(addr)
|
||||
else:
|
||||
dummysmtpsecureserver(addr, opts.certificate)
|
||||
log("listening at %s:%d\n" % addr)
|
||||
|
||||
server.runservice(
|
||||
vars(opts),
|
||||
initfn=init,
|
||||
runfn=run,
|
||||
runargs=[sys.executable, __file__] + sys.argv[1:],
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
@ -1,38 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Filter output by pyflakes to control which warnings we check
|
||||
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
lines = []
|
||||
for line in sys.stdin:
|
||||
# We blacklist tests that are too noisy for us
|
||||
pats = [
|
||||
r"undefined name 'WindowsError'",
|
||||
r"redefinition of unused '[^']+' from line",
|
||||
# for cffi, allow re-exports from pure.*
|
||||
r"cffi/[^:]*:.*\bimport \*' used",
|
||||
r"cffi/[^:]*:.*\*' imported but unused",
|
||||
]
|
||||
|
||||
keep = True
|
||||
for pat in pats:
|
||||
if re.search(pat, line):
|
||||
keep = False
|
||||
break # pattern matches
|
||||
if keep:
|
||||
fn = line.split(":", 1)[0]
|
||||
f = open(fn)
|
||||
data = f.read()
|
||||
f.close()
|
||||
if "no-" "check-code" in data:
|
||||
continue
|
||||
lines.append(line)
|
||||
|
||||
for line in lines:
|
||||
sys.stdout.write(line)
|
||||
print()
|
@ -1,36 +0,0 @@
|
||||
source "$RUNTESTDIR/helpers-testrepo.sh"
|
||||
|
||||
# some version of helpers-testrepo.sh does not do this, but we want it to
|
||||
# remove the obsstore warning. so let's check HGRCPATH and do it again.
|
||||
if grep -q createmarkers "$HGRCPATH"; then
|
||||
:
|
||||
else
|
||||
cat >> "$HGRCPATH" << EOF
|
||||
[experimental]
|
||||
evolution = createmarkers
|
||||
EOF
|
||||
fi
|
||||
|
||||
# go to repo root
|
||||
cd "$TESTDIR"/..
|
||||
|
||||
# enable lz4revlog if it's required
|
||||
if grep -q 'lz4revlog' .hg/requires; then
|
||||
cat >> "$HGRCPATH" <<EOF
|
||||
[extensions]
|
||||
lz4revlog=
|
||||
EOF
|
||||
fi
|
||||
|
||||
# sanity check whether hg actually works or not
|
||||
if ! testrepohg log -r tip -T '{author}' >/dev/null 2>"$TESTTMP/hg-err-check";
|
||||
then
|
||||
echo 'hg does not work'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# hg might work but print "failed to ..." - treat that as an error
|
||||
if [ -s "$TESTTMP/hg-err-check" ]; then
|
||||
echo 'hg outputs to stderr: ' `cat "$TESTTMP/hg-err-check"`
|
||||
exit 1
|
||||
fi
|
@ -1,27 +0,0 @@
|
||||
hgterm,
|
||||
am, km, mir, msgr, xenl,
|
||||
colors#8, cols#80, it#8, lines#24, pairs#64,
|
||||
acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
|
||||
bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
|
||||
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\b,
|
||||
cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
|
||||
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
|
||||
dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
|
||||
ed=\E[J, el=\E[K, enacs=\E)0, home=\E[H, ht=\t,
|
||||
hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=\n,
|
||||
is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, kbs=\b,
|
||||
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
|
||||
kdch1=\E[3~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~,
|
||||
kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
|
||||
kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
|
||||
kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~,
|
||||
kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
|
||||
kf9=\E[20~, kfnd=\E[1~, kich1=\E[2~, kmous=\E[M,
|
||||
knp=\E[6~, kpp=\E[5~, kslt=\E[4~, op=\E[m, rc=\E8,
|
||||
rev=\E[7m, ri=\EM, rmacs=^O, rmcup=\E[2J\E[?47l\E8,
|
||||
rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
|
||||
rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, sc=\E7,
|
||||
setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m,
|
||||
smacs=^N, smcup=\E7\E[?47h, smir=\E[4h,
|
||||
smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
|
||||
u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
|
@ -1,21 +0,0 @@
|
||||
# A dummy extension that installs an hgweb command that throws an Exception.
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
from edenscm.mercurial.hgweb import webcommands
|
||||
|
||||
|
||||
def raiseerror(web, req, tmpl):
|
||||
"""Dummy web command that raises an uncaught Exception."""
|
||||
|
||||
# Simulate an error after partial response.
|
||||
if "partialresponse" in req.form:
|
||||
req.respond(200, "text/plain")
|
||||
req.write("partial content\n")
|
||||
|
||||
raise AttributeError("I am an uncaught error!")
|
||||
|
||||
|
||||
def extsetup(ui):
|
||||
setattr(webcommands, "raiseerror", raiseerror)
|
||||
webcommands.__all__.append("raiseerror")
|
@ -1,75 +0,0 @@
|
||||
# Helper module to use the Hypothesis tool in tests
|
||||
#
|
||||
# Copyright 2015 David R. MacIver
|
||||
#
|
||||
# For details see http://hypothesis.readthedocs.org
|
||||
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
import hypothesis.strategies as st
|
||||
from hypothesis import given
|
||||
|
||||
|
||||
try:
|
||||
# hypothesis 2.x
|
||||
from hypothesis.configuration import set_hypothesis_home_dir
|
||||
from hypothesis import settings
|
||||
except ImportError:
|
||||
# hypothesis 1.x
|
||||
from hypothesis.settings import set_hypothesis_home_dir
|
||||
from hypothesis import Settings as settings
|
||||
|
||||
# hypothesis store data regarding generate example and code
|
||||
set_hypothesis_home_dir(os.path.join(os.getenv("TESTTMP"), ".hypothesis"))
|
||||
|
||||
|
||||
def check(*args, **kwargs):
|
||||
"""decorator to make a function a hypothesis test
|
||||
|
||||
Decorated function are run immediately (to be used doctest style)"""
|
||||
|
||||
def accept(f):
|
||||
# Workaround for https://github.com/DRMacIver/hypothesis/issues/206
|
||||
# Fixed in version 1.13 (released 2015 october 29th)
|
||||
f.__module__ = "__anon__"
|
||||
try:
|
||||
with settings(max_examples=2000):
|
||||
given(*args, **kwargs)(f)()
|
||||
except Exception:
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
sys.exit(1)
|
||||
|
||||
return accept
|
||||
|
||||
|
||||
def roundtrips(data, decode, encode):
|
||||
"""helper to tests function that must do proper encode/decode roundtripping
|
||||
"""
|
||||
|
||||
@given(data)
|
||||
def testroundtrips(value):
|
||||
encoded = encode(value)
|
||||
decoded = decode(encoded)
|
||||
if decoded != value:
|
||||
raise ValueError(
|
||||
"Round trip failed: %s(%r) -> %s(%r) -> %r"
|
||||
% (encode.__name__, value, decode.__name__, encoded, decoded)
|
||||
)
|
||||
|
||||
try:
|
||||
testroundtrips()
|
||||
except Exception:
|
||||
# heredoc swallow traceback, we work around it
|
||||
traceback.print_exc(file=sys.stdout)
|
||||
raise
|
||||
print("Round trip OK")
|
||||
|
||||
|
||||
# strategy for generating bytestring that might be an issue for Mercurial
|
||||
bytestrings = (
|
||||
st.builds(lambda s, e: s.encode(e), st.text(), st.sampled_from(["utf-8", "utf-16"]))
|
||||
) | st.binary()
|
@ -1,27 +0,0 @@
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import argparse
|
||||
import os
|
||||
|
||||
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("path", nargs="+")
|
||||
opts = ap.parse_args()
|
||||
|
||||
|
||||
def gather():
|
||||
for p in opts.path:
|
||||
if not os.path.exists(p):
|
||||
return
|
||||
if os.path.isdir(p):
|
||||
yield p + os.path.sep
|
||||
for dirpath, dirs, files in os.walk(p):
|
||||
for d in dirs:
|
||||
yield os.path.join(dirpath, d) + os.path.sep
|
||||
for f in files:
|
||||
yield os.path.join(dirpath, f)
|
||||
else:
|
||||
yield p
|
||||
|
||||
|
||||
print("\n".join(sorted(gather(), key=lambda x: x.replace(os.path.sep, "/"))))
|
@ -1,20 +0,0 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
import os
|
||||
import time
|
||||
|
||||
|
||||
class mocktime(object):
|
||||
def __init__(self, increment):
|
||||
self.time = 0
|
||||
self.increment = [float(s) for s in increment.split()]
|
||||
self.pos = 0
|
||||
|
||||
def __call__(self):
|
||||
self.time += self.increment[self.pos % len(self.increment)]
|
||||
self.pos += 1
|
||||
return self.time
|
||||
|
||||
|
||||
def uisetup(ui):
|
||||
time.time = mocktime(os.environ.get("MOCKTIME", "0.1"))
|
@ -1,8 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
for path in "$@"; do
|
||||
[[ -e $RUNTESTDIR/../$path ]] || {
|
||||
echo 'skipped: missing core hg file: '"$path"
|
||||
exit 80
|
||||
}
|
||||
done
|
@ -1,29 +0,0 @@
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
def _main(modulename):
|
||||
"""run the tests found in module, printing nothing when all tests pass"""
|
||||
module = sys.modules[modulename]
|
||||
suite = unittest.defaultTestLoader.loadTestsFromModule(module)
|
||||
results = unittest.TestResult()
|
||||
suite.run(results)
|
||||
if results.errors or results.failures:
|
||||
for tc, exc in results.errors:
|
||||
print("ERROR:", tc)
|
||||
print()
|
||||
sys.stdout.write(exc)
|
||||
for tc, exc in results.failures:
|
||||
print("FAIL:", tc)
|
||||
print()
|
||||
sys.stdout.write(exc)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if os.environ.get("SILENT_BE_NOISY"):
|
||||
main = unittest.main
|
||||
else:
|
||||
main = _main
|
@ -1,45 +0,0 @@
|
||||
Generate a private key (priv.pem):
|
||||
|
||||
$ openssl genrsa -out priv.pem 2048
|
||||
|
||||
Generate 2 self-signed certificates from this key (pub.pem, pub-other.pem):
|
||||
|
||||
$ openssl req -new -x509 -key priv.pem -nodes -sha256 -days 9000 \
|
||||
-out pub.pem -batch -subj '/CN=localhost/emailAddress=hg@localhost/'
|
||||
$ openssl req -new -x509 -key priv.pem -nodes -sha256 -days 9000 \
|
||||
-out pub-other.pem -batch -subj '/CN=localhost/emailAddress=hg@localhost/'
|
||||
|
||||
Now generate an expired certificate by turning back the system time:
|
||||
|
||||
$ faketime 2016-01-01T00:00:00Z \
|
||||
openssl req -new -x509 -key priv.pem -nodes -sha256 -days 1 \
|
||||
-out pub-expired.pem -batch -subj '/CN=localhost/emailAddress=hg@localhost/'
|
||||
|
||||
Generate a certificate not yet active by advancing the system time:
|
||||
|
||||
$ faketime 2030-01-1T00:00:00Z \
|
||||
openssl req -new -x509 -key priv.pem -nodes -sha256 -days 1 \
|
||||
-out pub-not-yet.pem -batch -subj '/CN=localhost/emailAddress=hg@localhost/'
|
||||
|
||||
Generate a passphrase protected client certificate private key:
|
||||
|
||||
$ openssl genrsa -aes256 -passout pass:1234 -out client-key.pem 2048
|
||||
|
||||
Create a copy of the private key without a passphrase:
|
||||
|
||||
$ openssl rsa -in client-key.pem -passin pass:1234 -out client-key-decrypted.pem
|
||||
|
||||
Create a CSR and sign the key using the server keypair:
|
||||
|
||||
$ printf '.\n.\n.\n.\n.\n.\nhg-client@localhost\n.\n.\n' | \
|
||||
openssl req -new -key client-key.pem -passin pass:1234 -out client-csr.pem
|
||||
$ openssl x509 -req -days 9000 -in client-csr.pem -CA pub.pem -CAkey priv.pem \
|
||||
-set_serial 01 -out client-cert.pem
|
||||
|
||||
When replacing the certificates, references to certificate fingerprints will
|
||||
need to be updated in test files.
|
||||
|
||||
Fingerprints for certs can be obtained by running:
|
||||
|
||||
$ openssl x509 -in pub.pem -noout -sha1 -fingerprint
|
||||
$ openssl x509 -in pub.pem -noout -sha256 -fingerprint
|
@ -1,17 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICyTCCAbECAQEwDQYJKoZIhvcNAQELBQAwMTESMBAGA1UEAwwJbG9jYWxob3N0
|
||||
MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhvc3QwHhcNMTYwNzEzMDQ0NzIxWhcN
|
||||
NDEwMzA0MDQ0NzIxWjAkMSIwIAYJKoZIhvcNAQkBFhNoZy1jbGllbnRAbG9jYWxo
|
||||
b3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6upuVmEs1dTpBWRe
|
||||
4LLM1ARhnMQpI6jaQ8JKzQghMU/3T3n6Qkimt2HmxuiczvsawAbUPpBAxZbBnKmX
|
||||
bKMiXjtQaO4o4gnyNZVuBgkq2Grc2BREOf0vtUvnPumlnjyAcMNRm6iVbbOerPzV
|
||||
Dn1nH7Ljf9UKyGl/Qj6eOAgez/TDui2fo5FUfaqUzF8B7FoaRmsErZZU9pJ+etKX
|
||||
M2DlLGofYNbOi+K0RbPypKNzeInNUnvh9JXKntmLQHRwXDSvcGveKepfVlmz/qme
|
||||
DqhQSonIXTektdyZ5g9dOvxEjQSYHp+7exIKvrpXLfou3s9nCUTs6ekQLi1Tb4Pn
|
||||
gbhauwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQDVgUHJlu4quQCfeHPoemj+6Jp+
|
||||
M140lY7DGFyiGfHP7KcxXiJHagbUC5D1IPYARwhh7Rdssy0FsmWQKYl8LXKvstz4
|
||||
zCgz9gxb7vydkZLF49lP1I13Pekoz99381RrXUYomHbx6jKPiOha7ikfAUefop0n
|
||||
uwfeQ5f6mfr0AcXmu6W7PHYMcPTK0ZyzoZwobRktKZ+OiwjW/nyolbdXxwU+kRQs
|
||||
r0224+GBuwPWmXAobHgPhtClHXYa2ltL1qFFQJETJt0HjhH89jl5HWJl8g3rqccn
|
||||
AkyiRIGDAWJsiQTOK7iOy0JSbmT1ePrhAyUoZO8GPbBsOdSdBMM32Y3HAKQz
|
||||
-----END CERTIFICATE-----
|
@ -1,27 +0,0 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEA6upuVmEs1dTpBWRe4LLM1ARhnMQpI6jaQ8JKzQghMU/3T3n6
|
||||
Qkimt2HmxuiczvsawAbUPpBAxZbBnKmXbKMiXjtQaO4o4gnyNZVuBgkq2Grc2BRE
|
||||
Of0vtUvnPumlnjyAcMNRm6iVbbOerPzVDn1nH7Ljf9UKyGl/Qj6eOAgez/TDui2f
|
||||
o5FUfaqUzF8B7FoaRmsErZZU9pJ+etKXM2DlLGofYNbOi+K0RbPypKNzeInNUnvh
|
||||
9JXKntmLQHRwXDSvcGveKepfVlmz/qmeDqhQSonIXTektdyZ5g9dOvxEjQSYHp+7
|
||||
exIKvrpXLfou3s9nCUTs6ekQLi1Tb4PngbhauwIDAQABAoIBABATjQuCSPQ1RuEk
|
||||
lk2gTt4vkpKM5hfXpWA/uqi/Zq4eP9mDinngyPAB1i5Emv6bNqBvlzTU4GnlQEi9
|
||||
XmyD2YVDX+RecBPQBHBgUpA9Ll5zKbvr3yNszUgF8sRebwQeNdgBteMGLXu9cB18
|
||||
jAQa1uTXdDQ6WyuN9LSO3nsNKzal8uucnZxdfFDIHx0MahPlrPfAkqzeKxxfyyRE
|
||||
jzia24oE+ewE8GHX/TvYnPybCPmBtRwbldA32vx8HbDCvlJanw3dyL98isBa5prr
|
||||
DsFaDltWzTKdJOIntdTJXRUDwYp7526bUEdGo/1FddbjW6Th8sXiJu91nL3BD/Qk
|
||||
mW102bECgYEA/zEtKgXjPeV9e3/vvAYU2Bsq8TkmhU6ZiZOQCdPWUNOsyfxibJBk
|
||||
XXsldtZ111vX/+fdGVPFJRoL1Qf4Xjf3MILVhAAcmfTpnWkdbveOrdCjbACE/ReQ
|
||||
xkExZdXhBd9YTS8IelL/Hv45FUo7UWWitgtvTG6caN3LaBTx1o2DiTkCgYEA66jS
|
||||
RQrsjRNT+cf7HBmKrKd7EknAH2v83ZyPd49BSBiNnmWaqPG2NxCLWpKks20xvRo2
|
||||
j8nftCsu9vSXv+KLnSb2CfOefvNoui7wQyiiWxrMBEPn8DS5E7ctqAiIhQsWEK+e
|
||||
n9E0PW/wyKI1Gk5U1nHwEJt196kYPzD8QgnwB5MCgYEAloVrHl5aqyex3CaaQU1U
|
||||
/iMIMUCEeBzkc0GWtDU/NG2mfX1gkKiaiokYj//vgheqUEdzIn1Gy5uRXxZUaT6Z
|
||||
jwOc7T8jn6vWIALgWZOrlNp7ijjEOISt4EKT4H1HPS9/5gbX+U77LEzHXsdqNZi9
|
||||
YKNeArc7ip9IWxv/iY3vCAECgYEAgMjOuGqC4Ynpf3x5T17p+PbB/DmPo9xY4ScZ
|
||||
BEamb2bzpddy0NbfNHJ3JXU0StXms6gqnyO8e/KJhO4gK/37PFO5a7DWMhyFZBIY
|
||||
vSrspwsa6U3O5+d4KT0W11hqewKW+WFwN3iVqumM1ahHiuu500OK5RiAPGsNVCNK
|
||||
CDD0Gr8CgYEAzwTt62ke3zCFOZ2E6EIR6eM+0Q9+B5zceU8DAZaTTxP4532HnT6/
|
||||
iHMQvUh0KBE4Rxw3MeSgpe7gKIcMKXubrcDIsEz8vhhOM1xsYIzVEWLtoCLPTaSF
|
||||
OWQsk98VDt3SgEjb25nOjJ24zZzUVk45OiGUoxfn1Bp6BbJH7IDihCk=
|
||||
-----END RSA PRIVATE KEY-----
|
@ -1,30 +0,0 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
Proc-Type: 4,ENCRYPTED
|
||||
DEK-Info: AES-256-CBC,ADE9D82AA8D8023CD4E9B67FECD9FE08
|
||||
|
||||
tjMPfTx/dFicleUbh4pH4f5RUtgZwamcU/uy246wk+f2EBG7pVKEEmoXm8rWW2tW
|
||||
xlp9BjL6yCBxoB/GGPjFAoqjQmnUQMxy/P0OWqur3t0+GrB4Fw9hB82fxgnAaydF
|
||||
10fw+bRMCfxJMRfa2nEkLzL9za6TF0IOvAYYza/rCxgOQiLg/py9V29wjVnIW9Dt
|
||||
B/GxfblTv9K2JBEVdKNWIGT1ZGxem8qiXctbufIXDr+dEEoFUKh+wvkmwVhBaSXi
|
||||
gw6fAoATz0Lpd+9d0bqEC1wC3NFdxABYUjZMQ7+xtNzaSCdXiWgv4ix1kzoY8rIi
|
||||
mnaSH1VdO27fzA0aOgi6/FAYCT0H3bEQIPgcA47kpty8a27OCylHZGa+vnmBnEtv
|
||||
qZeO9kX3Dmoi7vzXL8vjf41ZY7eTU6kYWktdBw/gM65goGINPFx85gli3k5I7+TR
|
||||
DQ1shyAmmMU9rH+YamZ9Hs4SLfAe7xPI/7i/upMsz56c57/HlvUwHr0as+L7WDZP
|
||||
iX/oW2DQmwN/C5owMPttM7dg2PvSw/Blte5lvloLbmhQTzzw0MDkPHkGt+5Hhjcl
|
||||
NwoaVCzT4Kg3E7fcXrKr80vYP9fOQIbCT5qtZ2/cTNLk8XYmLJm8Q7e1XqvuY9sQ
|
||||
K7xQ5iLz0PjWDtgbculcb3tQIIUcf/Ss9nCakWr6r4pPIQjDVJh07L7ou76n2PVs
|
||||
zJh6cJBgTEUaRWTQgGVH9euyQU3pXHLR0nk5zN4uAOVWdR7eiiskYwT3pM6HiER8
|
||||
ZYTs+fJtQD9gJPhBAa3LX5L7kWADxGFdAH5qoTn1SSJY4RIVFVfRfxXmQuTGlRQB
|
||||
UEh5Q3bdYKeauw3E9kBaYMYu19223XsAyuvs7/nB02DV6dFjTCGLsrv3JEgf+Wx6
|
||||
biCfoOrR1Kt2ez8QR9/6TIbz36kc2Jo3m2jKqUrNx1/gLj+coklSET09IwRZ0voi
|
||||
7ype+4mHFEzwiSxmugLfdnU8d9PkzFzUiu3qSYeD2DR9hBgnZtgu0fFnSCmqFDXG
|
||||
H1yWy6X6Wiqx6abPVq1ODZgeTmsjJsMLDB6PUbQyESp9ICRJyPPCrMi6UpLrWMto
|
||||
A764n5w8B2g/GPJfz1sPePZYi6sumd9UqTQ8UhM644oOlxPWufiBeTiPm1W73PSZ
|
||||
6DmLyVEh+kcfID6xq3tWVAuiPO1jMpQGoLKXO7oxGvmTNY/Va++j22DpzNoj1hTJ
|
||||
cnFOQZARKrSooAnngwUP68tGVo/+fxzWG95t7IZy8BvszP09VT1jcHOfFIZqHa/V
|
||||
rI/JrWSK+tu75Ot63QQpm1x7xSctMZg71w7riVipA+8F1FBdmp+lhOQkEMytngIA
|
||||
jKovkuwo8AiQvYCDspEcGSroQmOh1d5TraRyhTuRdiefLVSh05kVGCd6/UsVqdZs
|
||||
j+HEyepn4/A9xpHRBTWfCwBFFktAgSdCUOLh5xsT2MbbT/0wDoneD/uay0NakWXB
|
||||
zuVsaasx0Yl2cqvXKVUMphmbqMa859BNVqEK3l3tYZdvHiwT8J1LnEEK4KiBa2zZ
|
||||
+8FcFvD8x1NZBcCBArYP59MbCQOC2QBPJe/oCiUVhN8kRIwlwOhytbW+QIuLZHi4
|
||||
-----END RSA PRIVATE KEY-----
|
@ -1,27 +0,0 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEA2Ugt7jQrD+u+JtIfXZpVepzOAufcX4CMoHV95qZXZml2juGp
|
||||
x3T7wjQPB/IPoOpRG9CoCaekKK+bIqQX1qNuiUa2CsqchNQcua2js5DTttmRYC+f
|
||||
wHaQc0UY1QKe/0r8NFX1XoeIWfuL+0UAERoI1zmhu9px5326C7PoyBPIubT0ejLV
|
||||
LfciFgyHDmqvYGu6cUBpNFrAi8csPNGcyie1Axh0wZ/9jvHdN+iGmaV9GZObGv0G
|
||||
ZpbWlJm8fG+mH1qMFYA6mnknJbEBBTnV0IWdGJalGnz+5GfCvhxzYcEWmLDeO/7F
|
||||
NrWMVT9L8Ky65cygCeJ4lEW1XB1w/6rQYjaSnwIDAQABAoIBAAwDAH8FpUfJCYcN
|
||||
4KwFByqzFnR0qusgqSWJuT8R/QztUZ+OfBtJrU1MIXSX/iMwMPGvtEpsWRfitVnR
|
||||
5nt4J3kxTokEMGjrbPca0Uzw+bNHDdFacKNsKookzL2h2nZUh+LAycLDDVekH1Xx
|
||||
t5I6dTiot/cxmVBp0+ontPuylEsnyrQio6eljBfPzxBdRp2lkiymKf3jvbGXRnZ4
|
||||
jSFTRuUlbnVbZ3CKnFPU+d5tvn2nEwU/DVbGpJNZAPl99Q0XUcNF3AtGlwGMvi0X
|
||||
azcIIOn+swLjn+U2S6i3K234ItYS5I+c9Xi+9DO4fuVko+CQ8PWXP2HdAze7DENc
|
||||
zADmd0kCgYEA7nN+qUFAmMOcRE8nSNLt7mcwq6fYQ1MVGikCIXn/PI/wfEqY0lws
|
||||
ZhwykBXog0S7PzYkR3LcDOqN0wDcdJ3K4c/a6Z6IqbXMgxaosYfHCCMtdhy0g0F2
|
||||
ek0SaY3WQhpFRIG19hvB+ZJSc7JQt+TaXeb8HM1452kmOLpfQGiqqTsCgYEA6UXZ
|
||||
bI7c2jO1X+rWF2tZfZdtdeVrIVcm8BunF7ETC4iK/iH2phRQQAh4TFZm6wkX57Tv
|
||||
LKDGxmohFlEK7FOtSCeSSVfkvZYRBuHOYcwBgBr1XzXXjHcMoyr0+LflZysht151
|
||||
9F0hJwdGQZrivZnv9clJ632RlgE4XlPGskQhRe0CgYEAxVGdhsIQilmUfpJhl8m0
|
||||
SovpoqKKO2wNElDNCpbBt4QFJVU1kR3lP7olvUXj2nyN1okfDGDn52hRZEJaK8ZH
|
||||
lQVDyf7+aDGgwvmFLyOEeB9kB1FJrzQErsAIdICCxMCogUA1KytdIQEMaeEtGn+u
|
||||
k/YIumztl9FTZ64SFGKIlvECgYEA25Kb7csrp1g0yWxKyRCK0+TNa8Pe6ysVw7zD
|
||||
s1FCFAEak8t0Vy+Xui4+zdwmU+XjUn7FAsTzVaBgNJlkJr88xEY7ND4/WRUAQfIa
|
||||
SYO1hdfaTxxnIBiPFKdCnzq5/DplKi0H6lQe+JWoU+hutPlJHZmysq8ncoMDhAZn
|
||||
aTUn/KECgYEAvxGaWt4Fn2tRrHeaG0qT+nMBxd8cTiFInOcYDeS/FlQo3DTDK2Ai
|
||||
qLBa4DinnGN2hSKwnN3R5R2VRxk4I6+ljG0yuNBhJBcAgAFpnHfkuY1maQJB+1xY
|
||||
A07WcM4J3yuPfjcDkipNFQa4Y8oJCaS2yiOPvlUfNQrCLAV+YqHZiiQ=
|
||||
-----END RSA PRIVATE KEY-----
|
@ -1,20 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDNTCCAh2gAwIBAgIJANRJCnkBtkkOMA0GCSqGSIb3DQEBCwUAMDExEjAQBgNV
|
||||
BAMMCWxvY2FsaG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTE2
|
||||
MDEwMTA4MDAzMFoXDTE2MDEwMjA4MDAzMFowMTESMBAGA1UEAwwJbG9jYWxob3N0
|
||||
MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUA
|
||||
A4IBDwAwggEKAoIBAQDZSC3uNCsP674m0h9dmlV6nM4C59xfgIygdX3mpldmaXaO
|
||||
4anHdPvCNA8H8g+g6lEb0KgJp6Qor5sipBfWo26JRrYKypyE1By5raOzkNO22ZFg
|
||||
L5/AdpBzRRjVAp7/Svw0VfVeh4hZ+4v7RQARGgjXOaG72nHnfboLs+jIE8i5tPR6
|
||||
MtUt9yIWDIcOaq9ga7pxQGk0WsCLxyw80ZzKJ7UDGHTBn/2O8d036IaZpX0Zk5sa
|
||||
/QZmltaUmbx8b6YfWowVgDqaeSclsQEFOdXQhZ0YlqUafP7kZ8K+HHNhwRaYsN47
|
||||
/sU2tYxVP0vwrLrlzKAJ4niURbVcHXD/qtBiNpKfAgMBAAGjUDBOMB0GA1UdDgQW
|
||||
BBT6fA08JcG+SWBN9Y+p575xcFfIVjAfBgNVHSMEGDAWgBT6fA08JcG+SWBN9Y+p
|
||||
575xcFfIVjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBnY2r60iGg
|
||||
0BqR5vOj//XjS1FZKNG6+n3MKgxBY3pqFbqsCJfX5GfWD3GHJRXzv3p1MXIP3BWj
|
||||
zFutg+FE2QChQFwZjJu3E1VnIZN5ytYBltGHwaCEUdGq9sAZ9R2Jdf8xhQa5h+1U
|
||||
NZJvYbhCyecnUh2/Dkj2pFoF7wv7BtWFJV20WzHesN/Dik51cr6yFSn4nJb6YAMw
|
||||
t4/Vnf24v36WwnBoO5VqO+ntISTD6CS3EE5Gqv2ZMQtFaMoRfKIBaDIKHvbYeXdX
|
||||
2gDTKWnS5KJYWmsl6N2CPjrHJJphaFGSKFAivmT24Q+JSKcC9hww7gvnGcVmsFan
|
||||
H5xwzFQW2cna
|
||||
-----END CERTIFICATE-----
|
@ -1,20 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDNTCCAh2gAwIBAgIJAJvD5nejIHr2MA0GCSqGSIb3DQEBCwUAMDExEjAQBgNV
|
||||
BAMMCWxvY2FsaG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTMw
|
||||
MDEwMTA4MDAwOFoXDTMwMDEwMjA4MDAwOFowMTESMBAGA1UEAwwJbG9jYWxob3N0
|
||||
MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUA
|
||||
A4IBDwAwggEKAoIBAQDZSC3uNCsP674m0h9dmlV6nM4C59xfgIygdX3mpldmaXaO
|
||||
4anHdPvCNA8H8g+g6lEb0KgJp6Qor5sipBfWo26JRrYKypyE1By5raOzkNO22ZFg
|
||||
L5/AdpBzRRjVAp7/Svw0VfVeh4hZ+4v7RQARGgjXOaG72nHnfboLs+jIE8i5tPR6
|
||||
MtUt9yIWDIcOaq9ga7pxQGk0WsCLxyw80ZzKJ7UDGHTBn/2O8d036IaZpX0Zk5sa
|
||||
/QZmltaUmbx8b6YfWowVgDqaeSclsQEFOdXQhZ0YlqUafP7kZ8K+HHNhwRaYsN47
|
||||
/sU2tYxVP0vwrLrlzKAJ4niURbVcHXD/qtBiNpKfAgMBAAGjUDBOMB0GA1UdDgQW
|
||||
BBT6fA08JcG+SWBN9Y+p575xcFfIVjAfBgNVHSMEGDAWgBT6fA08JcG+SWBN9Y+p
|
||||
575xcFfIVjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC0VDzAqPiL
|
||||
6U8yqaQqXdS6iK49yDQe9qzxzNnAZnj4YCsa5+qYSf+jl49Rak+pGw3AmN9gl6xq
|
||||
aaP5xAlS8F0lnfZ5NcXmmp4Lt25qdu9J9qIPEAL4/ucirDr/cphCbDtzaWsrfi9j
|
||||
YjVzSqoSEdnV1x9GkkLVwQRmA+D/2+95pgx6UNchqMbXuEQkAv9kVOzSG62OOAzO
|
||||
z2Wct6b+DFbfFI0xcvKeJRGogjkd5QrF1XxU7e5u17DAN7/nhahv43ol3eC/fUiH
|
||||
ITZpEc+/WdVtUwZQtoEQuBLB1Mc8QvYUUksUv9+KVjZ4o2oqApup7k7oMSPYNPTf
|
||||
2O99CXjOCl9k
|
||||
-----END CERTIFICATE-----
|
@ -1,20 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDNTCCAh2gAwIBAgIJAMXBgtbkFDfwMA0GCSqGSIb3DQEBCwUAMDExEjAQBgNV
|
||||
BAMMCWxvY2FsaG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTE2
|
||||
MDcxMzA0MTcyOFoXDTQxMDMwNDA0MTcyOFowMTESMBAGA1UEAwwJbG9jYWxob3N0
|
||||
MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUA
|
||||
A4IBDwAwggEKAoIBAQDZSC3uNCsP674m0h9dmlV6nM4C59xfgIygdX3mpldmaXaO
|
||||
4anHdPvCNA8H8g+g6lEb0KgJp6Qor5sipBfWo26JRrYKypyE1By5raOzkNO22ZFg
|
||||
L5/AdpBzRRjVAp7/Svw0VfVeh4hZ+4v7RQARGgjXOaG72nHnfboLs+jIE8i5tPR6
|
||||
MtUt9yIWDIcOaq9ga7pxQGk0WsCLxyw80ZzKJ7UDGHTBn/2O8d036IaZpX0Zk5sa
|
||||
/QZmltaUmbx8b6YfWowVgDqaeSclsQEFOdXQhZ0YlqUafP7kZ8K+HHNhwRaYsN47
|
||||
/sU2tYxVP0vwrLrlzKAJ4niURbVcHXD/qtBiNpKfAgMBAAGjUDBOMB0GA1UdDgQW
|
||||
BBT6fA08JcG+SWBN9Y+p575xcFfIVjAfBgNVHSMEGDAWgBT6fA08JcG+SWBN9Y+p
|
||||
575xcFfIVjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDLxD+Q90Ue
|
||||
zrkmq964pzl+9zd0Y1ODSBnwaZfJxaoyFwRpYva1GYyz2CnJZEDjh8nUbo/jmEU1
|
||||
9D91YT8e3plgcpsuxp0YhCUJbTz56k2OOq/MyrX+KgrC2VAdGbhr/C3hNkGKBzdu
|
||||
+8p+z3jBUkiQFRb8xc485v1zkOX1lPN3tSAEOcja/lslmHV1UQhEYI/Ne2z/i/rQ
|
||||
uVtC28dTHoPnJykIhXBwgxuAL3G3eFpCRemHOyTlzNDQQxkgMNAYenutWpYXjM2Z
|
||||
paplLANjV+X91wyAXZ1XZ+5m7yLA7463MwOPU3Ko+HcyKKjPO+wJwVJbEpXr3rPR
|
||||
getT2CfPFLMe
|
||||
-----END CERTIFICATE-----
|
@ -1,20 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDNTCCAh2gAwIBAgIJAJ12yUL2zGhzMA0GCSqGSIb3DQEBCwUAMDExEjAQBgNV
|
||||
BAMMCWxvY2FsaG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTE2
|
||||
MDcxMzA0MTcxMloXDTQxMDMwNDA0MTcxMlowMTESMBAGA1UEAwwJbG9jYWxob3N0
|
||||
MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUA
|
||||
A4IBDwAwggEKAoIBAQDZSC3uNCsP674m0h9dmlV6nM4C59xfgIygdX3mpldmaXaO
|
||||
4anHdPvCNA8H8g+g6lEb0KgJp6Qor5sipBfWo26JRrYKypyE1By5raOzkNO22ZFg
|
||||
L5/AdpBzRRjVAp7/Svw0VfVeh4hZ+4v7RQARGgjXOaG72nHnfboLs+jIE8i5tPR6
|
||||
MtUt9yIWDIcOaq9ga7pxQGk0WsCLxyw80ZzKJ7UDGHTBn/2O8d036IaZpX0Zk5sa
|
||||
/QZmltaUmbx8b6YfWowVgDqaeSclsQEFOdXQhZ0YlqUafP7kZ8K+HHNhwRaYsN47
|
||||
/sU2tYxVP0vwrLrlzKAJ4niURbVcHXD/qtBiNpKfAgMBAAGjUDBOMB0GA1UdDgQW
|
||||
BBT6fA08JcG+SWBN9Y+p575xcFfIVjAfBgNVHSMEGDAWgBT6fA08JcG+SWBN9Y+p
|
||||
575xcFfIVjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCzJhM/OBoS
|
||||
JXnjfLhZqi6hTmx1XC7MR05z4fWdyBhZx8PwSDEjxAj/omAm2RMEx/Fv1a7FO6hd
|
||||
ClYsxxSfWJO7NQ3V4YLn9AvNr5gcxuXV/4bTtEFNebuzhV06u5nH7pGbHbkxCI+u
|
||||
QekmRTvKIojr8F44cyszEk+MZQ5bFBElByjVzgXNvAaDP0ryUL5eQhLrkuwbNFLQ
|
||||
mFf7EaerMuM28x1knhiH/39s7t92CJgm9+D60TmJ4XXwue1gZ0v9MVS18iOuWyio
|
||||
BklppJsdtDLxHTHGNlBeHdam5VejbXRo7s0y5OfuATwlgcaCMYC/68hVJYwl/GZ7
|
||||
3YpdNpMshSaE
|
||||
-----END CERTIFICATE-----
|
@ -1,138 +0,0 @@
|
||||
#!/bin/sh
|
||||
# setup config and various utility to test obsolescence marker exchanges tests
|
||||
|
||||
cat >> $TESTTMP/prune.sh << EOF
|
||||
rev=\`hg log --hidden --template '{node}\n' --rev "\$3"\`
|
||||
|
||||
hg debugobsolete --record-parents \$1 "\$2" \$rev \
|
||||
&& hg up --quiet 'max((::.) - obsolete())'
|
||||
EOF
|
||||
|
||||
cat >> $HGRCPATH <<EOF
|
||||
[web]
|
||||
# We test http pull and push, drop authentication requirement
|
||||
push_ssl = false
|
||||
allow_push = *
|
||||
|
||||
[ui]
|
||||
# simpler log output
|
||||
logtemplate ="{node|short} ({phase}): {desc}\n"
|
||||
|
||||
[phases]
|
||||
# non publishing server
|
||||
publish=False
|
||||
|
||||
[experimental]
|
||||
# reduce output changes
|
||||
bundle2-output-capture=True
|
||||
# enable evolution
|
||||
evolution=true
|
||||
|
||||
[devel]
|
||||
strip-obsmarkers = no
|
||||
|
||||
[alias]
|
||||
# fix date used to create obsolete markers.
|
||||
debugobsolete=debugobsolete -d '0 0'
|
||||
# poor man substiture to the evolve 'hg prune'. using prune makes the test clearer and
|
||||
prune = !sh $TESTTMP/prune.sh \$1 "\$2" "\$3"
|
||||
EOF
|
||||
|
||||
mkcommit() {
|
||||
echo "$1" > "$1"
|
||||
hg add "$1"
|
||||
hg ci -m "$1"
|
||||
}
|
||||
getid() {
|
||||
hg log --hidden --template '{node}\n' --rev "$1"
|
||||
}
|
||||
|
||||
setuprepos() {
|
||||
echo creating test repo for test case $1
|
||||
mkdir $1
|
||||
cd $1
|
||||
echo - pulldest
|
||||
hg init pushdest
|
||||
cd pushdest
|
||||
mkcommit O
|
||||
hg phase --public .
|
||||
cd ..
|
||||
echo - main
|
||||
hg clone -q pushdest main
|
||||
echo - pushdest
|
||||
hg clone -q main pulldest
|
||||
echo 'cd into `main` and proceed with env setup'
|
||||
}
|
||||
|
||||
inspect_obsmarkers (){
|
||||
# This exist as its own function to help the evolve extension reuse the tests as is.
|
||||
# The evolve extensions version will includes more advances query (eg:
|
||||
# related to obsmarkers discovery) to this.
|
||||
echo 'obsstore content'
|
||||
echo '================'
|
||||
hg debugobsolete
|
||||
}
|
||||
|
||||
dotest() {
|
||||
# dotest TESTNAME [TARGETNODE] [PUSHFLAGS+]
|
||||
#
|
||||
# test exchange for the given test case.
|
||||
#
|
||||
# This function performs push and pull in all directions through all
|
||||
# protocols and display the resulting obsolescence markers on all sides.
|
||||
|
||||
testcase=$1
|
||||
shift
|
||||
target="$1"
|
||||
if [ $# -gt 0 ]; then
|
||||
shift
|
||||
fi
|
||||
targetnode=""
|
||||
desccall=""
|
||||
cd $testcase
|
||||
echo "## Running testcase $testcase"
|
||||
if [ -n "$target" ]; then
|
||||
desccall="desc("\'"$target"\'")"
|
||||
targetnode="`hg -R main id -qr \"$desccall\"`"
|
||||
echo "# testing echange of \"$target\" ($targetnode)"
|
||||
fi
|
||||
echo "## initial state"
|
||||
echo "# obstore: main"
|
||||
hg -R main debugobsolete | sort
|
||||
echo "# obstore: pushdest"
|
||||
hg -R pushdest debugobsolete | sort
|
||||
echo "# obstore: pulldest"
|
||||
hg -R pulldest debugobsolete | sort
|
||||
|
||||
if [ -n "$target" ]; then
|
||||
echo "## pushing \"$target\"" from main to pushdest
|
||||
hg -R main push -r "$desccall" $@ pushdest
|
||||
else
|
||||
echo "## pushing from main to pushdest"
|
||||
hg -R main push pushdest $@
|
||||
fi
|
||||
echo "## post push state"
|
||||
echo "# obstore: main"
|
||||
hg -R main debugobsolete | sort
|
||||
echo "# obstore: pushdest"
|
||||
hg -R pushdest debugobsolete | sort
|
||||
echo "# obstore: pulldest"
|
||||
hg -R pulldest debugobsolete | sort
|
||||
if [ -n "$target" ]; then
|
||||
echo "## pulling \"$targetnode\"" from main into pulldest
|
||||
hg -R pulldest pull -r $targetnode $@ main
|
||||
else
|
||||
echo "## pulling from main into pulldest"
|
||||
hg -R pulldest pull main $@
|
||||
fi
|
||||
echo "## post pull state"
|
||||
echo "# obstore: main"
|
||||
hg -R main debugobsolete | sort
|
||||
echo "# obstore: pushdest"
|
||||
hg -R pushdest debugobsolete | sort
|
||||
echo "# obstore: pulldest"
|
||||
hg -R pulldest debugobsolete | sort
|
||||
|
||||
cd ..
|
||||
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
mkcommit() {
|
||||
echo "$1" > "$1"
|
||||
hg add "$1"
|
||||
hg ci -m "$1"
|
||||
}
|
||||
|
||||
getid() {
|
||||
hg log --hidden --template '{node}\n' --rev "$1"
|
||||
}
|
||||
|
||||
cat >> $HGRCPATH <<EOF
|
||||
[alias]
|
||||
debugobsolete=debugobsolete -d '0 0'
|
||||
EOF
|
@ -1,40 +0,0 @@
|
||||
# setup config and various utility to test new heads checks on push
|
||||
|
||||
cat >> $HGRCPATH <<EOF
|
||||
[ui]
|
||||
# simpler log output
|
||||
logtemplate ="{node|short} ({phase}): {desc}\n"
|
||||
|
||||
[phases]
|
||||
# non publishing server
|
||||
publish=False
|
||||
|
||||
[experimental]
|
||||
# enable evolution
|
||||
evolution=all
|
||||
|
||||
[alias]
|
||||
# fix date used to create obsolete markers.
|
||||
debugobsolete=debugobsolete -d '0 0'
|
||||
EOF
|
||||
|
||||
mkcommit() {
|
||||
echo "$1" > "$1"
|
||||
hg add "$1"
|
||||
hg ci -m "$1"
|
||||
}
|
||||
|
||||
getid() {
|
||||
hg log --hidden --template '{node}\n' --rev "$1"
|
||||
}
|
||||
|
||||
setuprepos() {
|
||||
echo creating basic server and client repo
|
||||
hg init server
|
||||
cd server
|
||||
mkcommit root
|
||||
hg phase --public .
|
||||
mkcommit A0
|
||||
cd ..
|
||||
hg clone server client
|
||||
}
|
@ -1,213 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import absolute_import, print_function
|
||||
|
||||
import optparse
|
||||
import os
|
||||
import select
|
||||
import socket
|
||||
import sys
|
||||
|
||||
from edenscm.mercurial import util
|
||||
|
||||
|
||||
__doc__ = """Tiny HTTP Proxy.
|
||||
|
||||
This module implements GET, HEAD, POST, PUT and DELETE methods
|
||||
on BaseHTTPServer, and behaves as an HTTP proxy. The CONNECT
|
||||
method is also implemented experimentally, but has not been
|
||||
tested yet.
|
||||
|
||||
Any help will be greatly appreciated. SUZUKI Hisao
|
||||
"""
|
||||
|
||||
__version__ = "0.2.1"
|
||||
|
||||
|
||||
httpserver = util.httpserver
|
||||
socketserver = util.socketserver
|
||||
urlreq = util.urlreq
|
||||
|
||||
if os.environ.get("HGIPV6", "0") == "1":
|
||||
family = socket.AF_INET6
|
||||
else:
|
||||
family = socket.AF_INET
|
||||
|
||||
|
||||
class ProxyHandler(httpserver.basehttprequesthandler):
|
||||
__base = httpserver.basehttprequesthandler
|
||||
__base_handle = __base.handle
|
||||
|
||||
server_version = "TinyHTTPProxy/" + __version__
|
||||
rbufsize = 0 # self.rfile Be unbuffered
|
||||
|
||||
def handle(self):
|
||||
(ip, port) = self.client_address
|
||||
allowed = getattr(self, "allowed_clients", None)
|
||||
if allowed is not None and ip not in allowed:
|
||||
self.raw_requestline = self.rfile.readline()
|
||||
if self.parse_request():
|
||||
self.send_error(403)
|
||||
else:
|
||||
self.__base_handle()
|
||||
|
||||
def log_request(self, code="-", size="-"):
|
||||
xheaders = [h for h in self.headers.items() if h[0].startswith("x-")]
|
||||
self.log_message(
|
||||
'"%s" %s %s%s',
|
||||
self.requestline,
|
||||
str(code),
|
||||
str(size),
|
||||
"".join([" %s:%s" % h for h in sorted(xheaders)]),
|
||||
)
|
||||
# Flush for Windows, so output isn't lost on TerminateProcess()
|
||||
sys.stdout.flush()
|
||||
sys.stderr.flush()
|
||||
|
||||
def _connect_to(self, netloc, soc):
|
||||
i = netloc.find(":")
|
||||
if i >= 0:
|
||||
host_port = netloc[:i], int(netloc[i + 1 :])
|
||||
else:
|
||||
host_port = netloc, 80
|
||||
print("\t" "connect to %s:%d" % host_port)
|
||||
try:
|
||||
soc.connect(host_port)
|
||||
except socket.error as arg:
|
||||
try:
|
||||
msg = arg[1]
|
||||
except (IndexError, TypeError):
|
||||
msg = arg
|
||||
self.send_error(404, msg)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
def do_CONNECT(self):
|
||||
soc = socket.socket(family, socket.SOCK_STREAM)
|
||||
try:
|
||||
if self._connect_to(self.path, soc):
|
||||
self.log_request(200)
|
||||
self.wfile.write(
|
||||
self.protocol_version + " 200 Connection established\r\n"
|
||||
)
|
||||
self.wfile.write("Proxy-agent: %s\r\n" % self.version_string())
|
||||
self.wfile.write("\r\n")
|
||||
self._read_write(soc, 300)
|
||||
finally:
|
||||
print("\t" "bye")
|
||||
soc.close()
|
||||
self.connection.close()
|
||||
|
||||
def do_GET(self):
|
||||
(scm, netloc, path, params, query, fragment) = urlreq.urlparse(
|
||||
self.path, "http"
|
||||
)
|
||||
if scm != "http" or fragment or not netloc:
|
||||
self.send_error(400, "bad url %s" % self.path)
|
||||
return
|
||||
soc = socket.socket(family, socket.SOCK_STREAM)
|
||||
try:
|
||||
if self._connect_to(netloc, soc):
|
||||
self.log_request()
|
||||
soc.send(
|
||||
"%s %s %s\r\n"
|
||||
% (
|
||||
self.command,
|
||||
urlreq.urlunparse(("", "", path, params, query, "")),
|
||||
self.request_version,
|
||||
)
|
||||
)
|
||||
self.headers["Connection"] = "close"
|
||||
del self.headers["Proxy-Connection"]
|
||||
for key_val in self.headers.items():
|
||||
soc.send("%s: %s\r\n" % key_val)
|
||||
soc.send("\r\n")
|
||||
self._read_write(soc)
|
||||
finally:
|
||||
print("\t" "bye")
|
||||
soc.close()
|
||||
self.connection.close()
|
||||
|
||||
def _read_write(self, soc, max_idling=20):
|
||||
iw = [self.connection, soc]
|
||||
ow = []
|
||||
count = 0
|
||||
while True:
|
||||
count += 1
|
||||
(ins, _, exs) = select.select(iw, ow, iw, 3)
|
||||
if exs:
|
||||
break
|
||||
if ins:
|
||||
for i in ins:
|
||||
if i is soc:
|
||||
out = self.connection
|
||||
else:
|
||||
out = soc
|
||||
try:
|
||||
data = i.recv(8192)
|
||||
except socket.error:
|
||||
break
|
||||
if data:
|
||||
out.send(data)
|
||||
count = 0
|
||||
else:
|
||||
print("\t" "idle", count)
|
||||
if count == max_idling:
|
||||
break
|
||||
|
||||
do_HEAD = do_GET
|
||||
do_POST = do_GET
|
||||
do_PUT = do_GET
|
||||
do_DELETE = do_GET
|
||||
|
||||
|
||||
class ThreadingHTTPServer(socketserver.ThreadingMixIn, httpserver.httpserver):
|
||||
def __init__(self, *args, **kwargs):
|
||||
httpserver.httpserver.__init__(self, *args, **kwargs)
|
||||
a = open("proxy.pid", "w")
|
||||
a.write(str(os.getpid()) + "\n")
|
||||
a.close()
|
||||
|
||||
|
||||
def runserver(portfile="tinyproxy.port", bind=""):
|
||||
server_address = (bind, 0)
|
||||
ProxyHandler.protocol_version = "HTTP/1.0"
|
||||
httpd = ThreadingHTTPServer(server_address, ProxyHandler)
|
||||
sa = httpd.socket.getsockname()
|
||||
print("Serving HTTP on", sa[0], "port", sa[1], "...")
|
||||
with open(portfile + ".tmp", "w") as f:
|
||||
f.write("%s" % sa[1])
|
||||
os.rename(portfile + ".tmp", portfile)
|
||||
try:
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("\nKeyboard interrupt received, exiting.")
|
||||
httpd.server_close()
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
allowed = []
|
||||
for name in ["localhost"]:
|
||||
client = socket.gethostbyname(name)
|
||||
allowed.append(client)
|
||||
print("Accept: %s (%s)" % (client, name))
|
||||
ProxyHandler.allowed_clients = allowed
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
parser.add_option(
|
||||
"-b",
|
||||
"--bind",
|
||||
metavar="ADDRESS",
|
||||
help="Specify alternate bind address [default: all interfaces]",
|
||||
default="",
|
||||
)
|
||||
parser.add_option(
|
||||
"-f",
|
||||
"--portfile",
|
||||
metavar="PORTFILE",
|
||||
help="Specify the port file [default: tinyproxy.port]",
|
||||
default="tinyproxy.port",
|
||||
)
|
||||
(options, args) = parser.parse_args()
|
||||
runserver(options.portfile, options.bind)
|
@ -1,56 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
from optparse import OptionParser
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = OptionParser()
|
||||
parser.add_option(
|
||||
"--created",
|
||||
dest="created",
|
||||
type="string",
|
||||
default=[],
|
||||
action="append",
|
||||
help="wait for <FILE> to be created",
|
||||
metavar="FILE",
|
||||
)
|
||||
parser.add_option(
|
||||
"--deleted",
|
||||
dest="deleted",
|
||||
type="string",
|
||||
default=[],
|
||||
action="append",
|
||||
help="wait for <FILE> to be deleted",
|
||||
metavar="FILE",
|
||||
)
|
||||
parser.add_option(
|
||||
"--sleep-interval-ms",
|
||||
dest="sleep_interval_ms",
|
||||
type="int",
|
||||
default=100,
|
||||
help="time in MS to sleep between checks",
|
||||
)
|
||||
parser.add_option(
|
||||
"--max-time",
|
||||
dest="max_time",
|
||||
type="int",
|
||||
help="maximum time in seconds to wait for all the files to "
|
||||
"reach the desired state",
|
||||
)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
start = time.time()
|
||||
while options.max_time is None or time.time() < start + options.max_time:
|
||||
if not all(os.access(f, os.F_OK) for f in options.created) or any(
|
||||
os.access(f, os.F_OK) for f in options.deleted
|
||||
):
|
||||
time.sleep(options.sleep_interval_ms / 1000.0)
|
||||
continue
|
||||
|
||||
sys.exit(0)
|
||||
|
||||
sys.exit(1)
|
Loading…
Reference in New Issue
Block a user