mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-05-09 17:01:16 -03:00
Compare commits
6589 Commits
pre_whites
...
Integratio
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
938ce48d25 | ||
|
|
0c25d7a49c | ||
|
|
d6e315d25d | ||
|
|
14ee19cc1b | ||
|
|
57d6124e6e | ||
|
|
cf2b40040a | ||
|
|
b404b9392c | ||
|
|
1f871c4d0c | ||
|
|
e07b45f447 | ||
|
|
081e14fd21 | ||
|
|
99ba07354a | ||
|
|
79d53a32dc | ||
|
|
ffab420e43 | ||
|
|
355cb88e38 | ||
|
|
e0d7f0bc96 | ||
|
|
83fbd881e7 | ||
|
|
87721049db | ||
|
|
566aa6e78f | ||
|
|
99d56ea2f9 | ||
|
|
0b45b474f3 | ||
|
|
f2a829aa23 | ||
|
|
f022b4b721 | ||
|
|
6d4eb96509 | ||
|
|
88f7d50633 | ||
|
|
0a0060481f | ||
|
|
46db332be5 | ||
|
|
9cfb1394bf | ||
|
|
0b63c1f46d | ||
|
|
d40a07436a | ||
|
|
04795eb8ea | ||
|
|
03bca5f7dd | ||
|
|
fa5f3fe9a0 | ||
|
|
6f33c0ccb5 | ||
|
|
8521ce4cd2 | ||
|
|
df4a41ff81 | ||
|
|
335c41f097 | ||
|
|
366c21ca47 | ||
|
|
5012fb0e36 | ||
|
|
1785af156b | ||
|
|
d20b3c688b | ||
|
|
c242d923c9 | ||
|
|
176c84fb9f | ||
|
|
60f8eda5c4 | ||
|
|
91a664b9fa | ||
|
|
35db0fb5df | ||
|
|
edf95478d9 | ||
|
|
42ec4aa2dd | ||
|
|
f0aa63cc11 | ||
|
|
eb0dd1ea78 | ||
|
|
8ee2e54c9b | ||
|
|
b18693f3c1 | ||
|
|
bd1ceefb17 | ||
|
|
b794a5e476 | ||
|
|
bcfef9268d | ||
|
|
19bcf9fc36 | ||
|
|
ad5d400319 | ||
|
|
958e46882f | ||
|
|
2713265b01 | ||
|
|
be1c022861 | ||
|
|
a02eac5a7a | ||
|
|
5615351f27 | ||
|
|
fe67cc4f6e | ||
|
|
dd582abcc5 | ||
|
|
d91b48b866 | ||
|
|
047fcb3224 | ||
|
|
a730f9fc90 | ||
|
|
ba455c81b4 | ||
|
|
36367e4882 | ||
|
|
1cb8b2a87b | ||
|
|
85cecd30fb | ||
|
|
a1c481c06a | ||
|
|
9e7034c903 | ||
|
|
40799d9e95 | ||
|
|
8ab6078001 | ||
|
|
7e854e072a | ||
|
|
20099774a0 | ||
|
|
d065ff840d | ||
|
|
4ceb21cf09 | ||
|
|
a2212876a9 | ||
|
|
62c6a09f1c | ||
|
|
c2ae163bfe | ||
|
|
e89035d76c | ||
|
|
c1af29f641 | ||
|
|
a4f27bea36 | ||
|
|
7d79d326b5 | ||
|
|
8d0e1f3bcc | ||
|
|
cc3fd9cf8f | ||
|
|
19be5f31b8 | ||
|
|
2dab869b41 | ||
|
|
ca46c556c3 | ||
|
|
d6a5792ce2 | ||
|
|
60fa9da3a7 | ||
|
|
3a835ebd61 | ||
|
|
b383e29a24 | ||
|
|
c729a97c43 | ||
|
|
fc9d8eec72 | ||
|
|
007d794b6e | ||
|
|
7367e545f2 | ||
|
|
3d557518d5 | ||
|
|
d0085cae3c | ||
|
|
a8ce7bad7b | ||
|
|
1ab84ac62a | ||
|
|
8730b482a7 | ||
|
|
58b29fb5d1 | ||
|
|
4221d6c3e6 | ||
|
|
442eb028c1 | ||
|
|
ca1c499069 | ||
|
|
b00b1af152 | ||
|
|
59197d12e0 | ||
|
|
7b21f1c3cb | ||
|
|
1c364722a7 | ||
|
|
31d17f4559 | ||
|
|
13e025bdb0 | ||
|
|
75515a4917 | ||
|
|
ab0f1d33fe | ||
|
|
680040d17d | ||
|
|
e160cde606 | ||
|
|
f56c317bd0 | ||
|
|
1fffdbce79 | ||
|
|
278cbc5ff1 | ||
|
|
8343e61795 | ||
|
|
534f694cee | ||
|
|
7437f82d92 | ||
|
|
920be02fe9 | ||
|
|
eed274ff78 | ||
|
|
6dafcc4960 | ||
|
|
ae581c7dbc | ||
|
|
5bd0472682 | ||
|
|
7257c69979 | ||
|
|
7a20e8d64d | ||
|
|
2d2f7c8fb1 | ||
|
|
15f089897d | ||
|
|
322b232fc0 | ||
|
|
8e5b1f9e4d | ||
|
|
4b28e9d2e4 | ||
|
|
7abfd1db30 | ||
|
|
121991b98c | ||
|
|
6f46eaaeeb | ||
|
|
efa9553dc1 | ||
|
|
aa6be9bee4 | ||
|
|
d6ab3db159 | ||
|
|
77229effb5 | ||
|
|
34440165aa | ||
|
|
da6937e0cf | ||
|
|
6b7501d715 | ||
|
|
460bc00698 | ||
|
|
bfd50863b8 | ||
|
|
db1500bfa4 | ||
|
|
4d4227e57f | ||
|
|
a700acadfa | ||
|
|
8ebf2b8f70 | ||
|
|
ffb4ab5ca8 | ||
|
|
11b0b23587 | ||
|
|
a7ec158373 | ||
|
|
9afc4b419e | ||
|
|
7926b69d15 | ||
|
|
4f3786f8d0 | ||
|
|
c2ffd3008a | ||
|
|
73537fc7c3 | ||
|
|
30990e8069 | ||
|
|
3770d9fb7a | ||
|
|
93aa95d8c4 | ||
|
|
0373a87867 | ||
|
|
182d7ce732 | ||
|
|
cf01694def | ||
|
|
e1c0ab8edb | ||
|
|
22f794125f | ||
|
|
9300ec55f0 | ||
|
|
47c1144a3c | ||
|
|
1836e704c4 | ||
|
|
dfcf140e00 | ||
|
|
b23bda8ed6 | ||
|
|
913f65cd77 | ||
|
|
3b210cc5bd | ||
|
|
1288877033 | ||
|
|
13c2b4cdc3 | ||
|
|
132edda6ff | ||
|
|
fd13043340 | ||
|
|
03ec48c701 | ||
|
|
bf089addd0 | ||
|
|
a2dda29cf6 | ||
|
|
203de775d0 | ||
|
|
1015e74480 | ||
|
|
e09e1e8e41 | ||
|
|
17049ce919 | ||
|
|
0d8334a31b | ||
|
|
4d3b56c151 | ||
|
|
419d7a5138 | ||
|
|
008eef50f3 | ||
|
|
c7f5e58927 | ||
|
|
3afcca3114 | ||
|
|
319d1b81fb | ||
|
|
8072900e16 | ||
|
|
39a05a359a | ||
|
|
1bfbed94ae | ||
|
|
bd122aa433 | ||
|
|
f9118d964e | ||
|
|
e753581df7 | ||
|
|
0ff24b35a1 | ||
|
|
54050bd4c5 | ||
|
|
d467bb58d9 | ||
|
|
af0c8d51e0 | ||
|
|
9454397e4c | ||
|
|
47890389e1 | ||
|
|
5899694233 | ||
|
|
9690ac5974 | ||
|
|
7b5296817a | ||
|
|
d18e2d970c | ||
|
|
11c77abc8c | ||
|
|
fe485f2485 | ||
|
|
adc69f94da | ||
|
|
d98874bd08 | ||
|
|
121d61cf31 | ||
|
|
c78e6a3ccf | ||
|
|
fb0c1460a9 | ||
|
|
5ad292328a | ||
|
|
f695284a84 | ||
|
|
ebb3a3a16e | ||
|
|
379f44fabe | ||
|
|
b427cd1823 | ||
|
|
afc82ff23e | ||
|
|
c5d72332ba | ||
|
|
809998a9a5 | ||
|
|
381215ef07 | ||
|
|
6bc2e15953 | ||
|
|
410e13dd74 | ||
|
|
884b4c9a61 | ||
|
|
f64a87a374 | ||
|
|
7533fa89d4 | ||
|
|
57cf9055d5 | ||
|
|
d727e32934 | ||
|
|
1d5e715008 | ||
|
|
a04a37897f | ||
|
|
11d523e61a | ||
|
|
ce1463bde6 | ||
|
|
a23894ca37 | ||
|
|
ac241b7132 | ||
|
|
fcd4a44b98 | ||
|
|
5efa18da15 | ||
|
|
6c988abe28 | ||
|
|
162af88c9a | ||
|
|
3c6844d4f4 | ||
|
|
3253893923 | ||
|
|
e9568069a7 | ||
|
|
fc51c156cb | ||
|
|
09f77a355f | ||
|
|
3b2be9009e | ||
|
|
00b1dd861e | ||
|
|
1b5ccb12d5 | ||
|
|
6eccf6557f | ||
|
|
d4db4f40a4 | ||
|
|
27c0ee92de | ||
|
|
f4d666f56c | ||
|
|
5947aa0171 | ||
|
|
3f3b3a7006 | ||
|
|
ff042bbb7b | ||
|
|
b66e5ea5ea | ||
|
|
5fa4e0d2ee | ||
|
|
d73c487d60 | ||
|
|
6df29b2fd1 | ||
|
|
3f820f0edf | ||
|
|
dfe6bc531e | ||
|
|
bb829075d8 | ||
|
|
259135b211 | ||
|
|
202bf0bede | ||
|
|
161196fe53 | ||
|
|
ec2659c500 | ||
|
|
0e62dedb26 | ||
|
|
c02bf2548f | ||
|
|
d22446f651 | ||
|
|
c140b3c724 | ||
|
|
a5b8359c1c | ||
|
|
a8a9a823f2 | ||
|
|
9c6bd8b1b4 | ||
|
|
36d3714a62 | ||
|
|
6bc59db721 | ||
|
|
f212518d3e | ||
|
|
c76de58758 | ||
|
|
8c3481a921 | ||
|
|
e363171b8d | ||
|
|
8de34a3fb1 | ||
|
|
90d89a3262 | ||
|
|
4c08cbd050 | ||
|
|
e3643c610f | ||
|
|
1f0085bc08 | ||
|
|
e212269ab1 | ||
|
|
c6230ddfde | ||
|
|
236556ba05 | ||
|
|
6a9f0fc0c1 | ||
|
|
5e77689c5a | ||
|
|
728dd25665 | ||
|
|
ca159ae4b8 | ||
|
|
786c0c5abb | ||
|
|
3e4bdf51d4 | ||
|
|
0f0bb1e10f | ||
|
|
6ad4d94e12 | ||
|
|
02b093d70a | ||
|
|
739ad77f38 | ||
|
|
767b7a2180 | ||
|
|
35c01bcba2 | ||
|
|
0aedd47af2 | ||
|
|
f3cee81338 | ||
|
|
64783428d4 | ||
|
|
3875cc60bd | ||
|
|
264d8270a7 | ||
|
|
5b696b5fb5 | ||
|
|
6eb8526159 | ||
|
|
e04130e145 | ||
|
|
f702c42068 | ||
|
|
a9845dc026 | ||
|
|
d7cbf3581d | ||
|
|
1bc4cf2318 | ||
|
|
070a43989f | ||
|
|
a722a4b967 | ||
|
|
551ca813e0 | ||
|
|
5735703261 | ||
|
|
e6d09dc4fe | ||
|
|
bd7fea55c4 | ||
|
|
6147e9ee0d | ||
|
|
16da066722 | ||
|
|
05d14f24d6 | ||
|
|
35ce95f51d | ||
|
|
d62731a931 | ||
|
|
444f9f8715 | ||
|
|
36a149337b | ||
|
|
0170875ece | ||
|
|
96da62ea87 | ||
|
|
20cb62440c | ||
|
|
d7b2576fb5 | ||
|
|
f465760d1f | ||
|
|
9fd3f35c9a | ||
|
|
a17a815c87 | ||
|
|
a389ca694c | ||
|
|
7a0e72bfa9 | ||
|
|
dd8c4cfb33 | ||
|
|
9d0050023c | ||
|
|
8c14f0f30f | ||
|
|
e045b045da | ||
|
|
5cc92ffd70 | ||
|
|
a1728d61af | ||
|
|
ae54b66799 | ||
|
|
cc99e8d510 | ||
|
|
f28f9792b3 | ||
|
|
f15dd314e0 | ||
|
|
f5083d7bab | ||
|
|
8ff0e7441f | ||
|
|
3b3361685a | ||
|
|
6c1ea03e9c | ||
|
|
1f440eb063 | ||
|
|
a0110d296c | ||
|
|
a02c54c8c7 | ||
|
|
2db759813d | ||
|
|
9c63ad3209 | ||
|
|
dbd228cc75 | ||
|
|
d31cc08fd9 | ||
|
|
794b448c00 | ||
|
|
a483643626 | ||
|
|
b4a6daef11 | ||
|
|
f823611c2e | ||
|
|
deb6d477d4 | ||
|
|
38ac7693e9 | ||
|
|
5b59ab3d9c | ||
|
|
fde74d489c | ||
|
|
dc250e0c29 | ||
|
|
0e82fcd999 | ||
|
|
17643ef12c | ||
|
|
e6863a90c8 | ||
|
|
f3da54d99c | ||
|
|
62870abe34 | ||
|
|
3ba74b3195 | ||
|
|
d44c21b580 | ||
|
|
bda147c7d3 | ||
|
|
9be7288fab | ||
|
|
9c2dff76cb | ||
|
|
45a2ff4191 | ||
|
|
ce174afabf | ||
|
|
0f141b6ccf | ||
|
|
5d59c6a1cd | ||
|
|
56002abc61 | ||
|
|
daf520db0a | ||
|
|
6e6fcda8e2 | ||
|
|
b9c50e400f | ||
|
|
0e6cc13d0d | ||
|
|
d00c196613 | ||
|
|
add24f96a9 | ||
|
|
ca61fc1bf8 | ||
|
|
06e5194092 | ||
|
|
8b277e711e | ||
|
|
eca4d113c6 | ||
|
|
8e2d207869 | ||
|
|
2a62e18635 | ||
|
|
f7a020ad33 | ||
|
|
48c510572b | ||
|
|
753639aa9c | ||
|
|
ec9c592edc | ||
|
|
274c77cf0c | ||
|
|
9269a5e0a8 | ||
|
|
051605b593 | ||
|
|
1a9e3761ae | ||
|
|
9bce3f4741 | ||
|
|
7bd26f9ff0 | ||
|
|
865a4647ae | ||
|
|
59d78e8afa | ||
|
|
1e0fab4fa4 | ||
|
|
3e9453840f | ||
|
|
de2b0d1ae8 | ||
|
|
2a680ebd12 | ||
|
|
67c4da9dbf | ||
|
|
4abdf8c301 | ||
|
|
d046452cdf | ||
|
|
9f436c3750 | ||
|
|
2cccc9b589 | ||
|
|
ad4913fd61 | ||
|
|
a78a480c53 | ||
|
|
1b1bc28c0a | ||
|
|
54d8d169b5 | ||
|
|
d9f34147c3 | ||
|
|
cbcabf6d00 | ||
|
|
d40a82b4d3 | ||
|
|
1d68b52cbc | ||
|
|
7606bfc2e5 | ||
|
|
1c59a3f1a8 | ||
|
|
e8a35bfaa8 | ||
|
|
1e58e00734 | ||
|
|
b3a00c5389 | ||
|
|
d70cdb19c1 | ||
|
|
8aef4330f0 | ||
|
|
af4da66515 | ||
|
|
fb6b4b9ae5 | ||
|
|
cdf39ed660 | ||
|
|
6223833130 | ||
|
|
a175aaa18a | ||
|
|
afff92c4b1 | ||
|
|
0ffbb657df | ||
|
|
b39651f1ad | ||
|
|
60e05d82c8 | ||
|
|
f95431362c | ||
|
|
c79db8ecf7 | ||
|
|
27c06c997c | ||
|
|
a9c30b05af | ||
|
|
99860c8294 | ||
|
|
c8c7fec48a | ||
|
|
fa66ac8d8c | ||
|
|
c0a332743f | ||
|
|
9b22ae7c74 | ||
|
|
d87f00bdc9 | ||
|
|
e51e854d8d | ||
|
|
1473f952d4 | ||
|
|
b0dc715d18 | ||
|
|
4fdcc2e400 | ||
|
|
68c7ecd777 | ||
|
|
f7d846ad8b | ||
|
|
82bff2d692 | ||
|
|
1f2b2b119a | ||
|
|
c3ca108dbe | ||
|
|
9c957eeef3 | ||
|
|
459c01df76 | ||
|
|
3175ccf266 | ||
|
|
00dcc2a12d | ||
|
|
20cec8611d | ||
|
|
cbff87fe17 | ||
|
|
2b0c54dfc8 | ||
|
|
acff2516d4 | ||
|
|
5eada4b623 | ||
|
|
d2bee105c9 | ||
|
|
78cac07d3c | ||
|
|
a536d2bc1f | ||
|
|
c300e09e8c | ||
|
|
22ccee3380 | ||
|
|
40e37c4a87 | ||
|
|
42c648ab35 | ||
|
|
09541e9524 | ||
|
|
46b65a550f | ||
|
|
392cdd4338 | ||
|
|
1ca58984bf | ||
|
|
32ca6118a6 | ||
|
|
d4f5689eaa | ||
|
|
3561f36cc4 | ||
|
|
eb3541be86 | ||
|
|
8440d9ba86 | ||
|
|
06cd4dc66f | ||
|
|
b932522138 | ||
|
|
9d1fc1045e | ||
|
|
7af3adc344 | ||
|
|
8b83fe1ff7 | ||
|
|
c269ef2c5d | ||
|
|
3c4c47f516 | ||
|
|
a374b8ede7 | ||
|
|
e2a3dae58b | ||
|
|
0f568d4f66 | ||
|
|
11502c0d36 | ||
|
|
57cc3d950d | ||
|
|
dae2809531 | ||
|
|
a11e955c84 | ||
|
|
c636a455a0 | ||
|
|
4d1eeef3db | ||
|
|
679437d6a9 | ||
|
|
a39734cbed | ||
|
|
63e0a3d7c2 | ||
|
|
2ce0240fc8 | ||
|
|
c5ec7daab4 | ||
|
|
e26bdff487 | ||
|
|
6a6ffe68cb | ||
|
|
87f646d84d | ||
|
|
c04cb9c715 | ||
|
|
28455235b1 | ||
|
|
7de9563aad | ||
|
|
994f5c500b | ||
|
|
dfbffd13df | ||
|
|
eec4b399b5 | ||
|
|
7ead8f459e | ||
|
|
495c09fe6b | ||
|
|
8c09d6e063 | ||
|
|
84b7c2b152 | ||
|
|
62d73bee5e | ||
|
|
73c747d162 | ||
|
|
b1176323e7 | ||
|
|
d34a300818 | ||
|
|
f998afaa23 | ||
|
|
90a4af5112 | ||
|
|
5b9331ade0 | ||
|
|
369890cdd9 | ||
|
|
a6031c42bf | ||
|
|
dc17869a84 | ||
|
|
00f2099f29 | ||
|
|
817adc123d | ||
|
|
144af5116a | ||
|
|
092307d4c0 | ||
|
|
121c70cf39 | ||
|
|
948b9d2ab8 | ||
|
|
8e49229d8f | ||
|
|
49bfc4f000 | ||
|
|
72d80c3d91 | ||
|
|
cbdd347ec6 | ||
|
|
81a987c39c | ||
|
|
5692adbdf6 | ||
|
|
9470f8a05b | ||
|
|
e812b609f9 | ||
|
|
44bae29039 | ||
|
|
f025607c11 | ||
|
|
fa00183e5f | ||
|
|
4d909b1c19 | ||
|
|
6e36b20e42 | ||
|
|
5061f1666b | ||
|
|
1ab9fe663f | ||
|
|
cda18be6b4 | ||
|
|
27cd74e16c | ||
|
|
dcced5f1bc | ||
|
|
d16d463e0d | ||
|
|
072974ec5c | ||
|
|
31745d29ab | ||
|
|
8f166cbb2a | ||
|
|
a6d64c1086 | ||
|
|
2443ea92c3 | ||
|
|
e6737d5775 | ||
|
|
fa665bd3c8 | ||
|
|
7b86062720 | ||
|
|
f25a1d720a | ||
|
|
76749468aa | ||
|
|
64ff2f7895 | ||
|
|
1270bb265f | ||
|
|
35a7e1ef0e | ||
|
|
eca4273f77 | ||
|
|
e8b6705067 | ||
|
|
c133cb2f1a | ||
|
|
3b1806a904 | ||
|
|
b347b44d9e | ||
|
|
086d088e1b | ||
|
|
c8c3265cb8 | ||
|
|
fd14e459cf | ||
|
|
f6a1bc1489 | ||
|
|
8de5af5f9e | ||
|
|
ebc5e18956 | ||
|
|
56198818b0 | ||
|
|
39905d4135 | ||
|
|
72e9d41dcc | ||
|
|
44d68f99ea | ||
|
|
f741968d6d | ||
|
|
e26d5418af | ||
|
|
8a6fe77f71 | ||
|
|
84f5d2082a | ||
|
|
fa8248f170 | ||
|
|
0f4126c115 | ||
|
|
93d40f9143 | ||
|
|
725062d360 | ||
|
|
23eb63eb2f | ||
|
|
88e6930b57 | ||
|
|
ca897807eb | ||
|
|
49c736f407 | ||
|
|
e468c767b5 | ||
|
|
1e2fa80d3e | ||
|
|
0cfe722a93 | ||
|
|
191ca21092 | ||
|
|
4cc0c3bfa7 | ||
|
|
583d771b10 | ||
|
|
b2b4ab4bab | ||
|
|
4dc1c6ca39 | ||
|
|
485fdbde41 | ||
|
|
bcd23ff971 | ||
|
|
aedb8dc327 | ||
|
|
a229f703ae | ||
|
|
338b40bb43 | ||
|
|
ba69f8f71d | ||
|
|
5492a16719 | ||
|
|
eb0539af60 | ||
|
|
c1af560753 | ||
|
|
b7db397f61 | ||
|
|
46bd0e66b6 | ||
|
|
6401906288 | ||
|
|
1b3154e50e | ||
|
|
7d33372d20 | ||
|
|
0a337a9d8e | ||
|
|
fd4b3f2c26 | ||
|
|
4be4932786 | ||
|
|
beac145e75 | ||
|
|
5bd121bd6d | ||
|
|
9401d3a6d5 | ||
|
|
e6aacd6167 | ||
|
|
9ddba0116f | ||
|
|
ec14507723 | ||
|
|
332e17e8e8 | ||
|
|
4974ecfc32 | ||
|
|
4b78c92652 | ||
|
|
1c4940c04c | ||
|
|
560985cdee | ||
|
|
9de28f6887 | ||
|
|
0dd2607cac | ||
|
|
18a163dc24 | ||
|
|
ff47b2dad5 | ||
|
|
90023e6dfb | ||
|
|
b3ce3e2b7c | ||
|
|
e197e57a7f | ||
|
|
1bdf61cb20 | ||
|
|
20395339a4 | ||
|
|
5f1168002e | ||
|
|
82c8abc4dc | ||
|
|
84fe46e763 | ||
|
|
3cda5ac59b | ||
|
|
feb6e9c90b | ||
|
|
ef66b99721 | ||
|
|
b635863509 | ||
|
|
1764716718 | ||
|
|
c053065e91 | ||
|
|
a4f55d95d4 | ||
|
|
7c5297e785 | ||
|
|
9929acd9d8 | ||
|
|
1f8e4dad9f | ||
|
|
ceddd1e684 | ||
|
|
1e3d26f744 | ||
|
|
183b7f7017 | ||
|
|
39e3c3c0b1 | ||
|
|
34fc390e13 | ||
|
|
88b688c544 | ||
|
|
2c312d05df | ||
|
|
5b1731331e | ||
|
|
e35d248f64 | ||
|
|
21890ccac7 | ||
|
|
98d736f916 | ||
|
|
6f57fef8f8 | ||
|
|
678fd86107 | ||
|
|
5f787cfe55 | ||
|
|
91f75d84d3 | ||
|
|
6dc74d3b6c | ||
|
|
d652b9b606 | ||
|
|
d7a9e25e17 | ||
|
|
aba69ac6ae | ||
|
|
060643a3b0 | ||
|
|
d623ac5040 | ||
|
|
87eb073ff9 | ||
|
|
4194b4efee | ||
|
|
762c31be87 | ||
|
|
dc8d603f98 | ||
|
|
d3201ad887 | ||
|
|
902af26253 | ||
|
|
8a96f283ba | ||
|
|
782cae2d21 | ||
|
|
14f766b66d | ||
|
|
7cbc0c371a | ||
|
|
1a1ee352ff | ||
|
|
f533189a28 | ||
|
|
b5d6c1102e | ||
|
|
ba68efd543 | ||
|
|
b0368fd85b | ||
|
|
2a616698b3 | ||
|
|
d8b1f0715f | ||
|
|
baeeef3233 | ||
|
|
e02e485cc6 | ||
|
|
4962244161 | ||
|
|
376a4eca58 | ||
|
|
f479e4a830 | ||
|
|
e598cb235a | ||
|
|
2fd15e7c6c | ||
|
|
f3f2d2d191 | ||
|
|
0b0e65a8a4 | ||
|
|
29b67030b8 | ||
|
|
9d9966b156 | ||
|
|
80e30bc144 | ||
|
|
06cda3f0b0 | ||
|
|
92fa94aa09 | ||
|
|
809b2cd792 | ||
|
|
02ae926c8e | ||
|
|
70c80c9d0e | ||
|
|
374772e539 | ||
|
|
83637e2178 | ||
|
|
4d864aea1c | ||
|
|
0fdc51beed | ||
|
|
8f526c0876 | ||
|
|
a9e9af5c5d | ||
|
|
a733296980 | ||
|
|
b619f34777 | ||
|
|
5f82cb5ca4 | ||
|
|
e48722f0bf | ||
|
|
7db0958804 | ||
|
|
342d0644ac | ||
|
|
c31861fdd1 | ||
|
|
77134fc49d | ||
|
|
503427255e | ||
|
|
54959a8248 | ||
|
|
97f2eca571 | ||
|
|
408cdba1be | ||
|
|
e03db61dac | ||
|
|
beba9df406 | ||
|
|
156d4fb9b9 | ||
|
|
c2e66b002a | ||
|
|
9d9afd8264 | ||
|
|
6c5e5d35a9 | ||
|
|
c8af566330 | ||
|
|
c2cfc65cf2 | ||
|
|
3742a7827f | ||
|
|
bd8c8ceb59 | ||
|
|
d00474f0fc | ||
|
|
7a07e9fc76 | ||
|
|
afc5c0a6e7 | ||
|
|
a9b582d2a8 | ||
|
|
9216544437 | ||
|
|
a2cb9cceaf | ||
|
|
2961dcc4be | ||
|
|
7ec761fc75 | ||
|
|
9a9238a253 | ||
|
|
e35983438e | ||
|
|
9f3059b7f4 | ||
|
|
1c8bbfdb6d | ||
|
|
facdc88c0c | ||
|
|
14d59c53f6 | ||
|
|
60c4a66c57 | ||
|
|
d53750bee6 | ||
|
|
ea49c14c62 | ||
|
|
701259d372 | ||
|
|
a89e9e7ba3 | ||
|
|
f7ba2a6a00 | ||
|
|
5d01399586 | ||
|
|
8ae9b716a0 | ||
|
|
bd24e8662e | ||
|
|
25169a44ed | ||
|
|
6c0f31d622 | ||
|
|
c6e7b7ef00 | ||
|
|
01f24f2df6 | ||
|
|
366933413b | ||
|
|
d8a1928c24 | ||
|
|
c492d03f51 | ||
|
|
cc50103e53 | ||
|
|
99ecaec175 | ||
|
|
358e9def5b | ||
|
|
61ab3aea8c | ||
|
|
5c56765d12 | ||
|
|
f922875dbc | ||
|
|
a98cc75f9e | ||
|
|
ba8bdbb3ae | ||
|
|
0d0a65dc87 | ||
|
|
ff10e504a1 | ||
|
|
ca13e816ce | ||
|
|
222a45f07a | ||
|
|
5b489ca30f | ||
|
|
7659554dea | ||
|
|
95e5af7814 | ||
|
|
95712125c9 | ||
|
|
01452da5bf | ||
|
|
0e0168ef18 | ||
|
|
abcc9647da | ||
|
|
6e56637cf0 | ||
|
|
4b079e16e5 | ||
|
|
ba06a89923 | ||
|
|
dae0dd513d | ||
|
|
f93d1c963f | ||
|
|
d88866ccf7 | ||
|
|
c0f832a743 | ||
|
|
535617623b | ||
|
|
04b8b35a56 | ||
|
|
999728670d | ||
|
|
412c5aeaa6 | ||
|
|
adbaddfaf4 | ||
|
|
c116843611 | ||
|
|
ad5bbeb3c2 | ||
|
|
669eafb55f | ||
|
|
233738d50a | ||
|
|
bb1956fd8d | ||
|
|
d078e47adc | ||
|
|
3be3f2e6a2 | ||
|
|
517b77ca74 | ||
|
|
b758f84976 | ||
|
|
c0535b4e13 | ||
|
|
8bbecb66cf | ||
|
|
515fc509ec | ||
|
|
6d80ab8d74 | ||
|
|
0f59e42802 | ||
|
|
46e9bf86b8 | ||
|
|
0572b29f26 | ||
|
|
b819f38e83 | ||
|
|
a6d2b06529 | ||
|
|
625ef5d734 | ||
|
|
072bbe7e5d | ||
|
|
7583d57b63 | ||
|
|
44e2c28255 | ||
|
|
316303d777 | ||
|
|
5a561bcfce | ||
|
|
5732aeac9a | ||
|
|
2477a894e7 | ||
|
|
f83b3a4f58 | ||
|
|
3996e437b6 | ||
|
|
007ae0b15e | ||
|
|
06c8440d72 | ||
|
|
228c5c1319 | ||
|
|
3889079f48 | ||
|
|
4caf4ec5e5 | ||
|
|
c695cceab3 | ||
|
|
ce4bc001f2 | ||
|
|
1441cca9c5 | ||
|
|
b5aea3fd8b | ||
|
|
3ec1fab7aa | ||
|
|
f9f30c816e | ||
|
|
b2d887860a | ||
|
|
4057cfdce5 | ||
|
|
bc976a913c | ||
|
|
8b4ac66349 | ||
|
|
e800b18ee9 | ||
|
|
c24739d3bd | ||
|
|
054bc88b82 | ||
|
|
0f6c763d9e | ||
|
|
c51abd04ff | ||
|
|
b42b562d06 | ||
|
|
2cdacbdce4 | ||
|
|
0b96b516d5 | ||
|
|
2951fadc6b | ||
|
|
3b7d759d11 | ||
|
|
857a89e4bd | ||
|
|
ee069baf42 | ||
|
|
4e48b084d7 | ||
|
|
d385248cc8 | ||
|
|
1e5d7d98a8 | ||
|
|
24afff1c77 | ||
|
|
364115f818 | ||
|
|
0620cdf711 | ||
|
|
1629d339de | ||
|
|
00f95a978e | ||
|
|
7447432471 | ||
|
|
df89d71237 | ||
|
|
f508a1f274 | ||
|
|
d367d57ae9 | ||
|
|
8a7104a0a4 | ||
|
|
9ca89fce6a | ||
|
|
fb1c7a3d68 | ||
|
|
65a03c86cb | ||
|
|
c98ed6d07a | ||
|
|
2e5c531ff1 | ||
|
|
7bfcccf701 | ||
|
|
fbed821a5b | ||
|
|
ef728d3c1d | ||
|
|
cc80951e79 | ||
|
|
4ae6843b6b | ||
|
|
18a9aa58cd | ||
|
|
b3ec069401 | ||
|
|
4ca31ae987 | ||
|
|
315439bacc | ||
|
|
e6e6c0b625 | ||
|
|
9a5afe3913 | ||
|
|
3819437e0e | ||
|
|
7764f27170 | ||
|
|
f1803feebf | ||
|
|
d9be55e504 | ||
|
|
b575e120cf | ||
|
|
5cf67e20a5 | ||
|
|
db6fd2c570 | ||
|
|
410f6fbd44 | ||
|
|
a756049dac | ||
|
|
ed9c0a7f82 | ||
|
|
a991fd5a1a | ||
|
|
1fbf810946 | ||
|
|
3314135cc9 | ||
|
|
efb894fdae | ||
|
|
ff20651d8b | ||
|
|
9206734a4d | ||
|
|
8b9a13f6ca | ||
|
|
eaa5958b77 | ||
|
|
2a266c4d48 | ||
|
|
f8ec1e4a7b | ||
|
|
86362e72fe | ||
|
|
db8ec59ac4 | ||
|
|
b38ac1e35d | ||
|
|
a6f79dcca8 | ||
|
|
0866653a87 | ||
|
|
827b8b9fd5 | ||
|
|
26cc112096 | ||
|
|
f7e0cbc7a4 | ||
|
|
b236ab6e5d | ||
|
|
90d0f91bcd | ||
|
|
f42f7b7208 | ||
|
|
e45e2bf20e | ||
|
|
9616b50461 | ||
|
|
f02dd22973 | ||
|
|
73f2b444ef | ||
|
|
2d08b5ee8a | ||
|
|
9fc3d1215b | ||
|
|
98d29b53de | ||
|
|
b50541c655 | ||
|
|
88cf7e16c6 | ||
|
|
5cb3918c1c | ||
|
|
f3c864a9e2 | ||
|
|
b24971dc9e | ||
|
|
754b52bb26 | ||
|
|
3792fb086a | ||
|
|
4414d5c888 | ||
|
|
3c895c2839 | ||
|
|
93209ab053 | ||
|
|
e7f8e58be9 | ||
|
|
3b2de931cd | ||
|
|
37e748ad54 | ||
|
|
014b91488d | ||
|
|
0938c9f427 | ||
|
|
9bb2d1e79f | ||
|
|
c7f16439bf | ||
|
|
f83742d579 | ||
|
|
357d3b8c6d | ||
|
|
e1dafeab01 | ||
|
|
8e9670ccd5 | ||
|
|
23d4f93556 | ||
|
|
8ded041352 | ||
|
|
a5dd96558f | ||
|
|
df4b03d859 | ||
|
|
a85d2bf27a | ||
|
|
225f748f79 | ||
|
|
2f2a221c56 | ||
|
|
000892e315 | ||
|
|
cf8850a33f | ||
|
|
912dbd85d8 | ||
|
|
71329a250b | ||
|
|
9502ea8de3 | ||
|
|
7242c40b5c | ||
|
|
6814f29cd7 | ||
|
|
99a34fe841 | ||
|
|
5beeb5280f | ||
|
|
0da8022081 | ||
|
|
b49e1d7703 | ||
|
|
fd6a1a436b | ||
|
|
84043e425d | ||
|
|
f20b6a1e8f | ||
|
|
642a1db4fc | ||
|
|
f60e1549a9 | ||
|
|
6a38eb4f7d | ||
|
|
20af969aba | ||
|
|
0d9123ec91 | ||
|
|
18bc2b0f4a | ||
|
|
d90d0ee08e | ||
|
|
4f39cc4d82 | ||
|
|
4f56ce6d33 | ||
|
|
0fa0b620b3 | ||
|
|
ea2934e644 | ||
|
|
7b9c75094c | ||
|
|
b9a3938a2b | ||
|
|
2ab1466c8f | ||
|
|
ce28891c76 | ||
|
|
234ebb5d7b | ||
|
|
b75c3b968c | ||
|
|
6f1ae79a13 | ||
|
|
973533e374 | ||
|
|
bb7b649132 | ||
|
|
c793570f2c | ||
|
|
2747945c55 | ||
|
|
5282d3e711 | ||
|
|
7bd4af51a1 | ||
|
|
69f68d31df | ||
|
|
5648322993 | ||
|
|
8536a6825f | ||
|
|
99200d3bfb | ||
|
|
c4d903ff98 | ||
|
|
0950c35eb2 | ||
|
|
99fb7bb6aa | ||
|
|
6673fe5457 | ||
|
|
e9a4875a6b | ||
|
|
1b27c97bfb | ||
|
|
9e1576bdc4 | ||
|
|
e4c59ac60a | ||
|
|
0cd934ea63 | ||
|
|
49b0c7a4fe | ||
|
|
0f62161b2b | ||
|
|
f30bf40300 | ||
|
|
b13ee818d2 | ||
|
|
04c399c5a9 | ||
|
|
304d9da6a0 | ||
|
|
f7adaeb97b | ||
|
|
b67a614d86 | ||
|
|
9444c65ee8 | ||
|
|
137c2559d9 | ||
|
|
5c44d897ea | ||
|
|
51c9ad1359 | ||
|
|
da84b38430 | ||
|
|
74e6a82849 | ||
|
|
50541544f2 | ||
|
|
fedce06687 | ||
|
|
fd2a0dffa9 | ||
|
|
ea4e997dc9 | ||
|
|
ddd1afc57c | ||
|
|
26ea8dc362 | ||
|
|
38418d6356 | ||
|
|
cefb9e6d03 | ||
|
|
81b3baaa9c | ||
|
|
01d87455e1 | ||
|
|
a261beef02 | ||
|
|
0b2d8fd37e | ||
|
|
cdfdc994f1 | ||
|
|
9cd952588f | ||
|
|
be13ac353b | ||
|
|
8cf476fbf4 | ||
|
|
5b5a3f78e1 | ||
|
|
d536b152f7 | ||
|
|
4eb73862fc | ||
|
|
92d5c28730 | ||
|
|
8bddce2633 | ||
|
|
3e063e7c13 | ||
|
|
8251d949f1 | ||
|
|
c3f1961e36 | ||
|
|
976514597d | ||
|
|
db33ed0fc7 | ||
|
|
41ba0dfadb | ||
|
|
9cd24c042a | ||
|
|
2fa705e4b2 | ||
|
|
de23ce6ac1 | ||
|
|
ba7b8a9584 | ||
|
|
3a45cad12e | ||
|
|
8069939112 | ||
|
|
22a67885e1 | ||
|
|
6108b1d813 | ||
|
|
fbc6c68f3d | ||
|
|
3083e0ea80 | ||
|
|
82b7e6de69 | ||
|
|
56a46a0bab | ||
|
|
cb03be9fe6 | ||
|
|
8de266afb4 | ||
|
|
0c18f68cc2 | ||
|
|
080521071f | ||
|
|
14880ce7d1 | ||
|
|
e9f676a7f4 | ||
|
|
1b1fd5ab9b | ||
|
|
cef39cdcc0 | ||
|
|
a04a6d116e | ||
|
|
59a90fc543 | ||
|
|
50bec2c32e | ||
|
|
aa31fb92f2 | ||
|
|
54c9d57e42 | ||
|
|
7fafdee98e | ||
|
|
72208a9438 | ||
|
|
1bd5946d23 | ||
|
|
d1436486e2 | ||
|
|
634feac600 | ||
|
|
8386a815d3 | ||
|
|
a87970fbb5 | ||
|
|
27c1c06ed4 | ||
|
|
9ba6b62791 | ||
|
|
63c8a197e5 | ||
|
|
a95a83b140 | ||
|
|
fea1597a27 | ||
|
|
85fba3a316 | ||
|
|
89709c3a89 | ||
|
|
5262719995 | ||
|
|
3be0261294 | ||
|
|
56be045324 | ||
|
|
e1bc48492f | ||
|
|
d28493dba6 | ||
|
|
7d60d1db6d | ||
|
|
18e21a0992 | ||
|
|
0ab437be26 | ||
|
|
4fac2f98c2 | ||
|
|
64c8d4c265 | ||
|
|
fb53a96a1c | ||
|
|
54cefeb5b1 | ||
|
|
816d35de43 | ||
|
|
3d1975c6a6 | ||
|
|
39a02f8ead | ||
|
|
f025269195 | ||
|
|
5c2e6734c1 | ||
|
|
c4a12f90c1 | ||
|
|
d0d7bb75cd | ||
|
|
f135c53196 | ||
|
|
ac8fe1e4b9 | ||
|
|
d03aff8742 | ||
|
|
43c839ab0e | ||
|
|
9ce3ac5b93 | ||
|
|
e3a2eadb49 | ||
|
|
5b3729842c | ||
|
|
c92bb703dc | ||
|
|
d11f9f7148 | ||
|
|
ea897fcc0f | ||
|
|
12c249abbe | ||
|
|
cddd0d7538 | ||
|
|
dc95bfc1b1 | ||
|
|
13079911bc | ||
|
|
462b9c2209 | ||
|
|
2ba76a7115 | ||
|
|
a6536db502 | ||
|
|
a39c57c1b6 | ||
|
|
9d48c68f24 | ||
|
|
f81eef5ee1 | ||
|
|
3b64a256b6 | ||
|
|
020fe5ccdf | ||
|
|
164108d0a9 | ||
|
|
ae9b5871fb | ||
|
|
9c7909c006 | ||
|
|
7b38d0b7cb | ||
|
|
1231d358de | ||
|
|
04162b05ea | ||
|
|
852cf183a6 | ||
|
|
c53ee263d8 | ||
|
|
0f8e8d1cea | ||
|
|
094e853a20 | ||
|
|
1c2943bd8b | ||
|
|
194f7f34d9 | ||
|
|
242512f0df | ||
|
|
c1b60fa8e1 | ||
|
|
d7c28c9316 | ||
|
|
3e7e92dfff | ||
|
|
05e8cf13f7 | ||
|
|
5e4e0dab2c | ||
|
|
4c93cece58 | ||
|
|
fa0f552fe9 | ||
|
|
2bf96493fc | ||
|
|
9c88d71e2f | ||
|
|
298db6e11a | ||
|
|
8a14a4a5ff | ||
|
|
7a3d5ddeae | ||
|
|
6f99c9a904 | ||
|
|
edc3d92eda | ||
|
|
554bef93ba | ||
|
|
3981accf05 | ||
|
|
ce173e86b5 | ||
|
|
b23c6ebcba | ||
|
|
cdc0167ba1 | ||
|
|
4768c42f5d | ||
|
|
6f4db9f8ad | ||
|
|
f0f56a6910 | ||
|
|
84dcb24682 | ||
|
|
d4f9fcc7c7 | ||
|
|
539e9bf970 | ||
|
|
b0c892d26f | ||
|
|
18a120d00e | ||
|
|
f16ae9348f | ||
|
|
baa0c73d81 | ||
|
|
55fc10ea6e | ||
|
|
f69055b5e9 | ||
|
|
4d68877f51 | ||
|
|
618996a166 | ||
|
|
cfe355554c | ||
|
|
3d4dd4abef | ||
|
|
cf116e4880 | ||
|
|
a012320a9a | ||
|
|
0a4883a6b8 | ||
|
|
6066e243e0 | ||
|
|
fde647214d | ||
|
|
7b88187310 | ||
|
|
b6202c3c86 | ||
|
|
42fa841573 | ||
|
|
7dae40a240 | ||
|
|
56604f598e | ||
|
|
069e4fdd8d | ||
|
|
8b53083997 | ||
|
|
38c4437d79 | ||
|
|
8875f0ad76 | ||
|
|
8eb0608b00 | ||
|
|
088fc6003b | ||
|
|
85131452fa | ||
|
|
8a78dca26f | ||
|
|
843ac2554d | ||
|
|
8a67a113d8 | ||
|
|
af5869886b | ||
|
|
de8ccf1751 | ||
|
|
96d524304d | ||
|
|
46db0dd5eb | ||
|
|
bf63e061c9 | ||
|
|
faa17ec849 | ||
|
|
d09210c08b | ||
|
|
21cfdf04bd | ||
|
|
da8db7f6f0 | ||
|
|
d67b4d6ca7 | ||
|
|
aa58cae601 | ||
|
|
55ebf4430f | ||
|
|
721df61f4b | ||
|
|
1af4acbd0e | ||
|
|
3cabed88e2 | ||
|
|
3650712ff2 | ||
|
|
66f181499b | ||
|
|
75ac482cec | ||
|
|
585321181d | ||
|
|
fe4354e5ed | ||
|
|
d31be65a30 | ||
|
|
25839b8c36 | ||
|
|
69f066dc1b | ||
|
|
87f7cd0370 | ||
|
|
36a2f2cc01 | ||
|
|
0aa4c4a483 | ||
|
|
3b3047c3f6 | ||
|
|
8f8e19bf7b | ||
|
|
d5d3712220 | ||
|
|
efeb8e43a2 | ||
|
|
2c5b49c3fe | ||
|
|
05b5e8e4f8 | ||
|
|
aa22c744d2 | ||
|
|
457213a768 | ||
|
|
a99eecfad8 | ||
|
|
eeff32cde7 | ||
|
|
d17b298a48 | ||
|
|
7db5d573c2 | ||
|
|
b680db8ce6 | ||
|
|
cd5c40ed9c | ||
|
|
fd10c29211 | ||
|
|
9907a8df4d | ||
|
|
a2114233ac | ||
|
|
4096a7fda9 | ||
|
|
f563262cfd | ||
|
|
0c55b79cfc | ||
|
|
94ff789c4b | ||
|
|
dcf9ce6fc5 | ||
|
|
5acbd32c2e | ||
|
|
884092d13b | ||
|
|
f9d883dd74 | ||
|
|
2de38ef7bf | ||
|
|
ec2b38053e | ||
|
|
873ea0f0df | ||
|
|
2c317a2585 | ||
|
|
886341fdea | ||
|
|
e728bf45de | ||
|
|
409173e0f0 | ||
|
|
e9c106b881 | ||
|
|
8b0d2ff641 | ||
|
|
1f456c71f7 | ||
|
|
f0de6e0852 | ||
|
|
364f58fcfa | ||
|
|
fd60a7cff7 | ||
|
|
732b32c8b4 | ||
|
|
e675a66504 | ||
|
|
3f21fb64de | ||
|
|
ab95f94048 | ||
|
|
4452d9ce18 | ||
|
|
3ed9c851a3 | ||
|
|
fdefabdb1d | ||
|
|
bb9e15675e | ||
|
|
128aacaf87 | ||
|
|
554382a286 | ||
|
|
452211ebf5 | ||
|
|
3099d46736 | ||
|
|
8b16fccebf | ||
|
|
11e6cfeb82 | ||
|
|
5d2cf3f666 | ||
|
|
2f2f4b4287 | ||
|
|
11d729d09c | ||
|
|
6f14d55612 | ||
|
|
d3822e4cb3 | ||
|
|
0be08e4683 | ||
|
|
f3a9773849 | ||
|
|
62bedde23d | ||
|
|
91c28449aa | ||
|
|
bceef6c125 | ||
|
|
67a6f756f2 | ||
|
|
3faccc8b3e | ||
|
|
234808bc32 | ||
|
|
60d9c9fa00 | ||
|
|
d97bb3425f | ||
|
|
83799832bc | ||
|
|
3b1b5b30ca | ||
|
|
c4c89dff4e | ||
|
|
9443a4bf2d | ||
|
|
65f4963542 | ||
|
|
f05b55c84c | ||
|
|
9649b132bd | ||
|
|
bfd70880a5 | ||
|
|
5655f255ef | ||
|
|
c0af4ba70a | ||
|
|
fc110d2c0e | ||
|
|
a7f6105497 | ||
|
|
85334432ed | ||
|
|
c5a0c58cfb | ||
|
|
dac13d51fa | ||
|
|
38a2e0218d | ||
|
|
5f7f1102db | ||
|
|
cad9bbd2a2 | ||
|
|
e2b798cda3 | ||
|
|
b39d0adc39 | ||
|
|
8364e59709 | ||
|
|
483930946b | ||
|
|
edcf9ebc12 | ||
|
|
3a10e76874 | ||
|
|
81dd4a4536 | ||
|
|
4553a74933 | ||
|
|
0c2d939e02 | ||
|
|
7cd9c3b2bf | ||
|
|
834f344f1d | ||
|
|
69342066f4 | ||
|
|
4ca9953114 | ||
|
|
8fb6d5db3b | ||
|
|
0f587320ed | ||
|
|
7aaf897a72 | ||
|
|
75e17e007d | ||
|
|
37c7950a3f | ||
|
|
eec47a173d | ||
|
|
e135024cc4 | ||
|
|
e57f5cc99b | ||
|
|
8bfd3fa144 | ||
|
|
53e08cd0d6 | ||
|
|
bfd2885279 | ||
|
|
440df37b41 | ||
|
|
db0ff0bcde | ||
|
|
277cd30520 | ||
|
|
ba04c2af3d | ||
|
|
0e9d52bc41 | ||
|
|
4bcd0413f8 | ||
|
|
c077aae022 | ||
|
|
c45d4abaef | ||
|
|
ae700c8707 | ||
|
|
879c62cbe1 | ||
|
|
5faa425df1 | ||
|
|
109cc1c4d8 | ||
|
|
e98ecf9cfa | ||
|
|
7d055a120e | ||
|
|
7faa6e773f | ||
|
|
b7fc3ee22e | ||
|
|
c8c129f7a5 | ||
|
|
a4fced2a8b | ||
|
|
ce4fdbaf7c | ||
|
|
75cdaf5601 | ||
|
|
8e93041205 | ||
|
|
77cd0c1bf8 | ||
|
|
4ab922fc7c | ||
|
|
9a873f1495 | ||
|
|
bcbb4cc938 | ||
|
|
97e446b787 | ||
|
|
b917f168d3 | ||
|
|
f12164f7c7 | ||
|
|
e8f0ec0009 | ||
|
|
ce46c80492 | ||
|
|
64194d02fc | ||
|
|
32714021f5 | ||
|
|
7e24c14f8c | ||
|
|
8543a4061e | ||
|
|
af93db668c | ||
|
|
f5209deacc | ||
|
|
2f289ce097 | ||
|
|
57bfca17dc | ||
|
|
a8938bcb4d | ||
|
|
68da7ab822 | ||
|
|
8f7d68ee3e | ||
|
|
de9f034318 | ||
|
|
396faebc08 | ||
|
|
043631fd18 | ||
|
|
1014995159 | ||
|
|
bc28bd7d6d | ||
|
|
51d34e1960 | ||
|
|
7c8ed80e64 | ||
|
|
c7a682ed05 | ||
|
|
ea5f3925ea | ||
|
|
c67d9195eb | ||
|
|
fa57565c42 | ||
|
|
11cebe9483 | ||
|
|
b46b0310f3 | ||
|
|
9c060126b5 | ||
|
|
ed0a57ff6d | ||
|
|
60248e895f | ||
|
|
8dc26ba8b9 | ||
|
|
45fc499a91 | ||
|
|
d769b2ac40 | ||
|
|
2ba6dc8893 | ||
|
|
c5241360af | ||
|
|
f0503c84dc | ||
|
|
d02011c57a | ||
|
|
57bd122719 | ||
|
|
39ddfa2ad2 | ||
|
|
cd47f9b1a2 | ||
|
|
f0ce62c873 | ||
|
|
4a4fd7e75b | ||
|
|
efdc62fa80 | ||
|
|
97a6efec77 | ||
|
|
37e0fbb5e4 | ||
|
|
f5514543e4 | ||
|
|
6a878e45e7 | ||
|
|
3bd2caf682 | ||
|
|
d5e5878f6d | ||
|
|
1f51bdbb0c | ||
|
|
007a62cab6 | ||
|
|
848db48af5 | ||
|
|
eb081481c6 | ||
|
|
da2201d69a | ||
|
|
9adb3492f9 | ||
|
|
f9eb826d5b | ||
|
|
dbc15f8046 | ||
|
|
adcf192c25 | ||
|
|
62fc06d9ac | ||
|
|
b34b0cf1e3 | ||
|
|
7fe7582329 | ||
|
|
8f0f05ca44 | ||
|
|
798ad363ba | ||
|
|
7a49583f27 | ||
|
|
47993b48b6 | ||
|
|
e174b8a800 | ||
|
|
1cd43a371b | ||
|
|
3781862346 | ||
|
|
3f76cccded | ||
|
|
805e4b31a1 | ||
|
|
216c4b811a | ||
|
|
720f4ad742 | ||
|
|
7004c30f95 | ||
|
|
d08820f697 | ||
|
|
80b658e247 | ||
|
|
e1c90cac88 | ||
|
|
5196354176 | ||
|
|
d18b0be518 | ||
|
|
a9283803d4 | ||
|
|
5fc17dcc82 | ||
|
|
ac79a6b0c7 | ||
|
|
5ae09c37a6 | ||
|
|
a1cf2e5576 | ||
|
|
0c1984eb6c | ||
|
|
2ca7b88d49 | ||
|
|
cb9c077850 | ||
|
|
31348bee46 | ||
|
|
b49b2f5a84 | ||
|
|
a7f22f7df3 | ||
|
|
4113e406a9 | ||
|
|
0909fe12e8 | ||
|
|
861b55d7d8 | ||
|
|
d7baabab8d | ||
|
|
dd9e057c6b | ||
|
|
baba19c180 | ||
|
|
088450cbf5 | ||
|
|
f044084f3a | ||
|
|
6ff0f86606 | ||
|
|
af6bbbf83e | ||
|
|
fe37a1646d | ||
|
|
9f8ae95b0e | ||
|
|
fb8ae04f80 | ||
|
|
7be8a1707c | ||
|
|
18b06f3768 | ||
|
|
1af38d69a8 | ||
|
|
99b72c0972 | ||
|
|
0836a5b9b4 | ||
|
|
30a74dcf2d | ||
|
|
0a1294758d | ||
|
|
b7f1103088 | ||
|
|
40a90f1b2f | ||
|
|
649e244092 | ||
|
|
6d350409b3 | ||
|
|
68527ff20c | ||
|
|
020f8097f0 | ||
|
|
1f130bcc9c | ||
|
|
05c0cb713d | ||
|
|
639faf1c7f | ||
|
|
98eceba124 | ||
|
|
03366333b2 | ||
|
|
56abb1750b | ||
|
|
f6bb384a46 | ||
|
|
1a3adf086d | ||
|
|
7bacc57e4f | ||
|
|
a136bbdad9 | ||
|
|
2d99623b17 | ||
|
|
101ada83cb | ||
|
|
8ffc3ab242 | ||
|
|
4780b28a93 | ||
|
|
109769a147 | ||
|
|
d0bc04cb40 | ||
|
|
ec56b632f5 | ||
|
|
06afcb43b4 | ||
|
|
15bdf6fa00 | ||
|
|
7334d801cf | ||
|
|
e99f137356 | ||
|
|
8b9e5c9301 | ||
|
|
48797974d3 | ||
|
|
59dbc7ca6a | ||
|
|
21473b20ec | ||
|
|
171dea73d7 | ||
|
|
04c69932e2 | ||
|
|
ff66d2f3c1 | ||
|
|
d4ed2ca447 | ||
|
|
b61c4f1cbc | ||
|
|
04bde6cf5b | ||
|
|
429bdce4f1 | ||
|
|
de45232a37 | ||
|
|
78fe53406e | ||
|
|
7e48f5cc4f | ||
|
|
d74d3f2ca4 | ||
|
|
0c21efea55 | ||
|
|
af12bcb117 | ||
|
|
3f9273cc32 | ||
|
|
b11ca2c01c | ||
|
|
6ce03a4a36 | ||
|
|
df6a86913c | ||
|
|
d740b2a473 | ||
|
|
835a40bf56 | ||
|
|
1770e47eb0 | ||
|
|
2dd2867a61 | ||
|
|
f18b6868b7 | ||
|
|
11ede92d3f | ||
|
|
811beb9dcc | ||
|
|
6e933f1c8f | ||
|
|
46d1334f95 | ||
|
|
cebb63c1b5 | ||
|
|
53fd356850 | ||
|
|
2193ddbb6b | ||
|
|
417be25c69 | ||
|
|
1ef310c3a8 | ||
|
|
7b5f1f018b | ||
|
|
73b4efb65b | ||
|
|
c6fe65bad3 | ||
|
|
635e714bb4 | ||
|
|
281d468285 | ||
|
|
fd33e3e2c6 | ||
|
|
d6cd98320d | ||
|
|
42860da8ba | ||
|
|
fb252e6e10 | ||
|
|
e031d91c19 | ||
|
|
6366a67c21 | ||
|
|
5d8986fdad | ||
|
|
281be31eb3 | ||
|
|
8fcbe1a105 | ||
|
|
8692489326 | ||
|
|
c7771bb0dd | ||
|
|
a1ae484dce | ||
|
|
338311af1e | ||
|
|
8b858f2fcc | ||
|
|
2b425ad221 | ||
|
|
e1281754fe | ||
|
|
c40188e40e | ||
|
|
c8425f832c | ||
|
|
b495c68f28 | ||
|
|
67e3bac583 | ||
|
|
3b3bcc998e | ||
|
|
73282c9c4d | ||
|
|
fc80505ecc | ||
|
|
6513db35c1 | ||
|
|
d1472532d3 | ||
|
|
ffebe74885 | ||
|
|
9fdfe44236 | ||
|
|
01c5f6eaa8 | ||
|
|
19b89983a1 | ||
|
|
3604522bf2 | ||
|
|
cc35241a6e | ||
|
|
92a6906e6a | ||
|
|
22a4ead36e | ||
|
|
661d96c336 | ||
|
|
50f8ff1bc5 | ||
|
|
93d352b809 | ||
|
|
56c041b889 | ||
|
|
bcd9c39509 | ||
|
|
6972dee37e | ||
|
|
472e186c2b | ||
|
|
43d0016125 | ||
|
|
91ae39008a | ||
|
|
0d93125664 | ||
|
|
6b2e84be0e | ||
|
|
a05bcc6a63 | ||
|
|
25d83ed0d7 | ||
|
|
026cb48dce | ||
|
|
b241bf4140 | ||
|
|
fa9e445342 | ||
|
|
ace7903bc3 | ||
|
|
f14fde2373 | ||
|
|
46cf8c6bb7 | ||
|
|
14e23749a6 | ||
|
|
4d31a13fb2 | ||
|
|
eac8158110 | ||
|
|
67946b5509 | ||
|
|
3a2b836f0e | ||
|
|
9ac7da28bd | ||
|
|
65dcd06ca1 | ||
|
|
ee1d310651 | ||
|
|
215f731498 | ||
|
|
d0071960b8 | ||
|
|
0d8caeec34 | ||
|
|
d7628a4d29 | ||
|
|
9fd16d730b | ||
|
|
5b61829a33 | ||
|
|
9d7a0de4c1 | ||
|
|
7113cc33f1 | ||
|
|
864a1893bc | ||
|
|
856c9cf8a1 | ||
|
|
725febb669 | ||
|
|
e7b0327e08 | ||
|
|
87924e3d4b | ||
|
|
00d44599c4 | ||
|
|
b688deb33e | ||
|
|
1413e20ed4 | ||
|
|
4284e58033 | ||
|
|
039c3c1673 | ||
|
|
5175d82a80 | ||
|
|
13fd9be1d9 | ||
|
|
a5fd0b317e | ||
|
|
c2a5e7ae27 | ||
|
|
bb419d4f5e | ||
|
|
bca17db96e | ||
|
|
55b3c45f95 | ||
|
|
248de41d70 | ||
|
|
ee226eeccd | ||
|
|
83b1b5d282 | ||
|
|
b142262cf7 | ||
|
|
905766fca2 | ||
|
|
527e102746 | ||
|
|
9347951158 | ||
|
|
c5b7cc070e | ||
|
|
bcdc6bb46b | ||
|
|
b00daebec2 | ||
|
|
32e65ed301 | ||
|
|
57753c7303 | ||
|
|
4437e8d8d6 | ||
|
|
a4c03e3d7b | ||
|
|
6145b4a770 | ||
|
|
2137e197fc | ||
|
|
7669c14274 | ||
|
|
8eca1b0f13 | ||
|
|
c2f0a45d60 | ||
|
|
c0c33b3605 | ||
|
|
81becc5f6b | ||
|
|
76609de4da | ||
|
|
908063d830 | ||
|
|
cb352317bd | ||
|
|
7d46c78082 | ||
|
|
6368bebf12 | ||
|
|
3905c3355b | ||
|
|
d2c0cafeb7 | ||
|
|
737da73dd6 | ||
|
|
f3142a7d91 | ||
|
|
91a0ba9be5 | ||
|
|
95162ef19d | ||
|
|
3d40292c00 | ||
|
|
18203a081c | ||
|
|
72244dee5b | ||
|
|
c8cf8a6669 | ||
|
|
4baada25b9 | ||
|
|
75dd852340 | ||
|
|
fa3ca4dc3d | ||
|
|
a43da0163a | ||
|
|
ed475ab24b | ||
|
|
e892c51b9c | ||
|
|
874a675e7f | ||
|
|
6b7bcdbc91 | ||
|
|
d62a6cf28d | ||
|
|
dfeac760b9 | ||
|
|
e656654456 | ||
|
|
e67ab57ca3 | ||
|
|
99d2a344c7 | ||
|
|
2d08da79e9 | ||
|
|
1872fb4ea9 | ||
|
|
1590bd15f1 | ||
|
|
99ad68fc72 | ||
|
|
456b51a50e | ||
|
|
86b1c5a5a4 | ||
|
|
bd18736ee5 | ||
|
|
56d9134534 | ||
|
|
8fe1108cec | ||
|
|
6cff72b226 | ||
|
|
1183505695 | ||
|
|
c95b9f06e1 | ||
|
|
d10decabda | ||
|
|
b816cd6d50 | ||
|
|
24d251ff4b | ||
|
|
41a7b9457c | ||
|
|
d247c121a2 | ||
|
|
04bd4c4b4e | ||
|
|
27d7feaf95 | ||
|
|
ba53242b26 | ||
|
|
704517e237 | ||
|
|
335f397277 | ||
|
|
e9b24327d0 | ||
|
|
11400fb313 | ||
|
|
a77cd98136 | ||
|
|
d54fbddb11 | ||
|
|
d9f901f36d | ||
|
|
97dd46306e | ||
|
|
f8f954bd5c | ||
|
|
dbc67c6a4b | ||
|
|
61b4900a70 | ||
|
|
240bb25dbe | ||
|
|
0dce9a2114 | ||
|
|
a311f49eda | ||
|
|
9a092ec015 | ||
|
|
84b59ae0be | ||
|
|
e76c1fd139 | ||
|
|
b1ac07a178 | ||
|
|
55b2d36028 | ||
|
|
f872f25f5b | ||
|
|
f706081ea4 | ||
|
|
7fe3cb7b29 | ||
|
|
539acd9fc5 | ||
|
|
4b51e0f935 | ||
|
|
2761cf1bf5 | ||
|
|
6e02ec83d1 | ||
|
|
5eb0b34da1 | ||
|
|
c611943cc2 | ||
|
|
bf3731bed4 | ||
|
|
3fe561bc93 | ||
|
|
277db1c1af | ||
|
|
58425ed463 | ||
|
|
ea45541d53 | ||
|
|
dbb07bc3f5 | ||
|
|
64eaf7ca5a | ||
|
|
dcb39bfa86 | ||
|
|
ea3e9698df | ||
|
|
3bef4a3c1f | ||
|
|
4fbc2e4bdb | ||
|
|
72173a93a7 | ||
|
|
058e23720f | ||
|
|
29494d8546 | ||
|
|
298c580e72 | ||
|
|
4e2b11f2e0 | ||
|
|
146c62c603 | ||
|
|
e6bb7fc973 | ||
|
|
5356384d0a | ||
|
|
88134a2465 | ||
|
|
487dc98468 | ||
|
|
42ddab0cb4 | ||
|
|
58b604c5ba | ||
|
|
fa4cf77aff | ||
|
|
5ceac038b1 | ||
|
|
7b92217273 | ||
|
|
74f0be2a53 | ||
|
|
82b5ba1af4 | ||
|
|
728a4634a1 | ||
|
|
745a88f2f6 | ||
|
|
cf00162340 | ||
|
|
d407c22ee7 | ||
|
|
4fd458900b | ||
|
|
3f6ed72a6b | ||
|
|
3a6ec68a32 | ||
|
|
7b7bb5803f | ||
|
|
263cdc50db | ||
|
|
c59e221bf1 | ||
|
|
886fc38d55 | ||
|
|
ef25d8c76d | ||
|
|
e6fbb93d31 | ||
|
|
10498059e4 | ||
|
|
9cb2554423 | ||
|
|
088b21a15f | ||
|
|
296008089c | ||
|
|
7876bc6ef3 | ||
|
|
7dd2cd7de7 | ||
|
|
7776a03fb3 | ||
|
|
c304ca1a1c | ||
|
|
4429518667 | ||
|
|
635365654d | ||
|
|
950c7ef2eb | ||
|
|
e0ccb8c48e | ||
|
|
8ebba2066d | ||
|
|
158b946eac | ||
|
|
559f8d5511 | ||
|
|
9d5990eda7 | ||
|
|
8d53b72e46 | ||
|
|
9af7720f19 | ||
|
|
ab4dde6c7f | ||
|
|
b023bddc88 | ||
|
|
a8a8d33fe0 | ||
|
|
8a1af4a38d | ||
|
|
607d9e6aef | ||
|
|
b3f43723dc | ||
|
|
92628a384b | ||
|
|
ac4eedb436 | ||
|
|
4b1bc53f91 | ||
|
|
7b443ac1d3 | ||
|
|
bd601019fe | ||
|
|
8c86d258e8 | ||
|
|
376cb99974 | ||
|
|
d0ce2b4824 | ||
|
|
a4593d011a | ||
|
|
177256064c | ||
|
|
a3863b22a7 | ||
|
|
1bbd288f86 | ||
|
|
260d5bb013 | ||
|
|
aab3dbd24c | ||
|
|
5c0311653e | ||
|
|
6fe0cb1941 | ||
|
|
03a66e31f4 | ||
|
|
5aa281942f | ||
|
|
82ee3d6a4e | ||
|
|
fea22f2bec | ||
|
|
8aca33b21f | ||
|
|
dc5d0ff22f | ||
|
|
b0c47c814f | ||
|
|
5786f9e5c3 | ||
|
|
2b7a4143ec | ||
|
|
a2f507f1c8 | ||
|
|
9f4f9545c1 | ||
|
|
59dbf64603 | ||
|
|
e8b8be4237 | ||
|
|
e80e9c6b06 | ||
|
|
fefd1c7991 | ||
|
|
47a768ceea | ||
|
|
d40667bf26 | ||
|
|
0a23d615f4 | ||
|
|
44ef6cc87f | ||
|
|
4cf480a1a5 | ||
|
|
3df8643c31 | ||
|
|
6e7956a413 | ||
|
|
751d5503a1 | ||
|
|
67f7e53237 | ||
|
|
d09d2ca9ca | ||
|
|
219c7ec812 | ||
|
|
4dbb274d8a | ||
|
|
e27855b225 | ||
|
|
101926a8e8 | ||
|
|
3f999209a5 | ||
|
|
7f1bdc5541 | ||
|
|
591449aba7 | ||
|
|
559b05d01d | ||
|
|
9b6256d0fc | ||
|
|
1c9370dbd2 | ||
|
|
41b996f2b1 | ||
|
|
781a6b118a | ||
|
|
d84a859f4f | ||
|
|
09cb31a172 | ||
|
|
a40d5d4ea6 | ||
|
|
29f933adfc | ||
|
|
11f5bbf83d | ||
|
|
5e4d046492 | ||
|
|
904936789b | ||
|
|
5d2a806ac6 | ||
|
|
3a506543b6 | ||
|
|
74cac0f86f | ||
|
|
55bef3cd2e | ||
|
|
0ebff8c516 | ||
|
|
1e67baf00e | ||
|
|
326f2affa4 | ||
|
|
9d5a6c57a8 | ||
|
|
9fa0edcbc9 | ||
|
|
fb7645659f | ||
|
|
4f5bd08b20 | ||
|
|
975a5bfbde | ||
|
|
acdb81bbca | ||
|
|
083224d1c0 | ||
|
|
52d739c746 | ||
|
|
0594735714 | ||
|
|
4dfb334db8 | ||
|
|
384879704a | ||
|
|
4a1de248bc | ||
|
|
711c81b8c8 | ||
|
|
87db424e45 | ||
|
|
7e23965250 | ||
|
|
dabe718c52 | ||
|
|
628db65504 | ||
|
|
8e63386203 | ||
|
|
16d2f4faff | ||
|
|
15da6f0203 | ||
|
|
a0efae5f08 | ||
|
|
5db8065f15 | ||
|
|
c3d756b5df | ||
|
|
b27217e106 | ||
|
|
f7b051905e | ||
|
|
8537cc982e | ||
|
|
d6c4e66484 | ||
|
|
1ae0272c4e | ||
|
|
30aa8b3663 | ||
|
|
abf6874a2d | ||
|
|
99c6f65fee | ||
|
|
8f2ef082be | ||
|
|
bdcd451030 | ||
|
|
8b8a21dcad | ||
|
|
9f2addcf27 | ||
|
|
25afc9b377 | ||
|
|
c81cf56c0b | ||
|
|
0e9177b590 | ||
|
|
87394a9e0b | ||
|
|
dfac81803b | ||
|
|
f653fbfaf4 | ||
|
|
fb13b370e2 | ||
|
|
cafd856831 | ||
|
|
47d8a7e882 | ||
|
|
cdb72b7024 | ||
|
|
35ee28ff24 | ||
|
|
4fe9d79438 | ||
|
|
c36ad27618 | ||
|
|
d87c0424d8 | ||
|
|
0988f53c70 | ||
|
|
74fd29fc5c | ||
|
|
8b79f4e5c9 | ||
|
|
67de733b9b | ||
|
|
ff09b8c1ee | ||
|
|
cddc4cfb1d | ||
|
|
9028104536 | ||
|
|
2f1e70dc1b | ||
|
|
a4ed0837a1 | ||
|
|
e198ed0b2d | ||
|
|
abc9be0250 | ||
|
|
82ff27387a | ||
|
|
03fa5dad12 | ||
|
|
0c69e99d8b | ||
|
|
d4fb75e9f3 | ||
|
|
26472593aa | ||
|
|
10fae1836e | ||
|
|
864dbaeb43 | ||
|
|
7619e62b70 | ||
|
|
ecf06f2eb4 | ||
|
|
ec884f4bfd | ||
|
|
2b2057a56b | ||
|
|
38024a50dc | ||
|
|
1aec66e8a1 | ||
|
|
2bbcc5cbc8 | ||
|
|
4197420f39 | ||
|
|
7e36053ed9 | ||
|
|
e825415917 | ||
|
|
b4ce749c69 | ||
|
|
17dff8c569 | ||
|
|
7e0833c1e0 | ||
|
|
067892c4f1 | ||
|
|
8e3a9c9585 | ||
|
|
1a55e9ba60 | ||
|
|
f4414a0631 | ||
|
|
550e2c0d08 | ||
|
|
d68b631919 | ||
|
|
17cf255bf7 | ||
|
|
f2724da45c | ||
|
|
b1866b18dc | ||
|
|
96fca8b4ec | ||
|
|
7a18c37b39 | ||
|
|
a1c4475c0d | ||
|
|
18219646a0 | ||
|
|
4e026588f4 | ||
|
|
defdc92b57 | ||
|
|
78889cc034 | ||
|
|
30db202c97 | ||
|
|
fb08fe5f47 | ||
|
|
34c2bf0f55 | ||
|
|
94041974e4 | ||
|
|
a071deaf61 | ||
|
|
1278cf2b6e | ||
|
|
8e2d165756 | ||
|
|
92f39f7b89 | ||
|
|
35a7db50a2 | ||
|
|
0745f7dbe7 | ||
|
|
8e87d595b7 | ||
|
|
6f46f6b45a | ||
|
|
54af9ace1a | ||
|
|
d2d707a6fa | ||
|
|
f8fa69f817 | ||
|
|
7304d82416 | ||
|
|
3fc0faaebb | ||
|
|
d068f846e8 | ||
|
|
d376cb316f | ||
|
|
4f7a01af44 | ||
|
|
f3130ce70b | ||
|
|
72968bec42 | ||
|
|
23c296f8d5 | ||
|
|
427b8f5c52 | ||
|
|
c1ea9c7025 | ||
|
|
f2a6ae20e5 | ||
|
|
9ca6cb9fc8 | ||
|
|
473dc16b2b | ||
|
|
415c7ebbcc | ||
|
|
04205f36be | ||
|
|
9ef47a43a4 | ||
|
|
4a7aa98e93 | ||
|
|
2c77b24ced | ||
|
|
627ce4ea34 | ||
|
|
e0f0164b16 | ||
|
|
3b92d99277 | ||
|
|
529ba30b1a | ||
|
|
bb344bbd8f | ||
|
|
dc33c1afe1 | ||
|
|
8f548962b7 | ||
|
|
2d5b698f0b | ||
|
|
9e08609f85 | ||
|
|
f78ab085b5 | ||
|
|
bbc6bda843 | ||
|
|
0dc92fbb2d | ||
|
|
5e2c14e7be | ||
|
|
ed38db3370 | ||
|
|
69ecda5082 | ||
|
|
4e1303823b | ||
|
|
2dfb615d7b | ||
|
|
403d9691cb | ||
|
|
71af1a9566 | ||
|
|
8f22def8f7 | ||
|
|
3e226f0a5e | ||
|
|
06d071dd94 | ||
|
|
c22df3b823 | ||
|
|
5dc78dd858 | ||
|
|
f2c8e73891 | ||
|
|
98449fec51 | ||
|
|
ff4d275f22 | ||
|
|
63d601610d | ||
|
|
49a0841533 | ||
|
|
51bbecc419 | ||
|
|
3e6c57d5d3 | ||
|
|
30940916bd | ||
|
|
51a52a7286 | ||
|
|
e8243af20b | ||
|
|
140e6204be | ||
|
|
86af63cd39 | ||
|
|
6ecd0bcb32 | ||
|
|
df65ed8696 | ||
|
|
30baf8d101 | ||
|
|
f156bea1b7 | ||
|
|
05aae4764b | ||
|
|
5ac8c42fad | ||
|
|
c149f4f301 | ||
|
|
3a782003ed | ||
|
|
abef2cc422 | ||
|
|
5cf2a50269 | ||
|
|
3c4e3035fd | ||
|
|
0d08bfd6ff | ||
|
|
28454cb57d | ||
|
|
8754f776d8 | ||
|
|
b3d3e07c55 | ||
|
|
a4dc2b872b | ||
|
|
9adf500cf3 | ||
|
|
e260c42a13 | ||
|
|
277999adef | ||
|
|
b88cacf03e | ||
|
|
bd5c98298c | ||
|
|
e1951a32bb | ||
|
|
875a9c4c2e | ||
|
|
c577d01207 | ||
|
|
2c582fbc4e | ||
|
|
1e6bd2d968 | ||
|
|
a4eec25447 | ||
|
|
798f1a7050 | ||
|
|
285af8c4b4 | ||
|
|
cf808674bf | ||
|
|
873cbc3c64 | ||
|
|
a9aa234a64 | ||
|
|
899b5ec6cf | ||
|
|
80df9053b3 | ||
|
|
8cc4639ea6 | ||
|
|
6b92f830ff | ||
|
|
170f11771b | ||
|
|
70c9d78536 | ||
|
|
d6a9d6c59e | ||
|
|
83ecf84392 | ||
|
|
4853ec0281 | ||
|
|
bdee54bd10 | ||
|
|
c8252e7e0b | ||
|
|
bb90a4e4a9 | ||
|
|
8caab103d8 | ||
|
|
2df89f4b0f | ||
|
|
e4aedcd22c | ||
|
|
9fb7037174 | ||
|
|
4152bdc698 | ||
|
|
f3d025bd75 | ||
|
|
f6d101e7ad | ||
|
|
d383e3b92c | ||
|
|
d51f82d1b5 | ||
|
|
b759ba8a3d | ||
|
|
0ec9acf0f0 | ||
|
|
763063e741 | ||
|
|
4f345fdee7 | ||
|
|
ea38519a12 | ||
|
|
85b42b22f4 | ||
|
|
3284393aba | ||
|
|
7904f92c9e | ||
|
|
ec1e9ac98d | ||
|
|
68f4e005e4 | ||
|
|
c6093ad782 | ||
|
|
ec14527545 | ||
|
|
2cc0107dbf | ||
|
|
aec0973196 | ||
|
|
6f6a4a842c | ||
|
|
eaa0fdaeba | ||
|
|
dd191a9d4b | ||
|
|
bf2a9f3835 | ||
|
|
8d83c967d3 | ||
|
|
b48cfbefba | ||
|
|
cc24485503 | ||
|
|
eb8b92fce7 | ||
|
|
3f129b570c | ||
|
|
053d940d0a | ||
|
|
3b5fdc3fb0 | ||
|
|
db529f06b8 | ||
|
|
502deda376 | ||
|
|
08dd04c527 | ||
|
|
4ef14ea6e2 | ||
|
|
bb29f9f990 | ||
|
|
f3cb625802 | ||
|
|
60bca14b37 | ||
|
|
30368d5526 | ||
|
|
1bee66548a | ||
|
|
c31b9f430f | ||
|
|
2d42baac35 | ||
|
|
e26f7aacc4 | ||
|
|
0ffc2899dc | ||
|
|
897dba9f07 | ||
|
|
44f2f37bd4 | ||
|
|
df01547eab | ||
|
|
bd299e96b2 | ||
|
|
d234a1870b | ||
|
|
1a135aa0b0 | ||
|
|
0ed2af464c | ||
|
|
d5e1405cbe | ||
|
|
2302db4dc7 | ||
|
|
82f5fb507d | ||
|
|
59a11188df | ||
|
|
93dad29ec6 | ||
|
|
385e40540c | ||
|
|
0e954e4764 | ||
|
|
652faa1a13 | ||
|
|
e44934cf87 | ||
|
|
1e9c9e01e5 | ||
|
|
a312abdeb8 | ||
|
|
af22bf3501 | ||
|
|
d22743dad0 | ||
|
|
37b8cfaeba | ||
|
|
a114492223 | ||
|
|
69e823d612 | ||
|
|
d910b7af7d | ||
|
|
ffdabace5e | ||
|
|
b480b117a9 | ||
|
|
a665d532c3 | ||
|
|
b530d175e7 | ||
|
|
422b1bd066 | ||
|
|
79e74d0ebb | ||
|
|
070d204d9b | ||
|
|
175570b7ed | ||
|
|
a1744b5822 | ||
|
|
a6d6ded9a5 | ||
|
|
bda6426bf7 | ||
|
|
551bd39889 | ||
|
|
fded427c6a | ||
|
|
7840d53ecf | ||
|
|
52709e8051 | ||
|
|
1d4a0fb091 | ||
|
|
59e90123ea | ||
|
|
044f5512e2 | ||
|
|
1c91ec9dfa | ||
|
|
e7f87c08e1 | ||
|
|
ef8a0c93ea | ||
|
|
2079b4292e | ||
|
|
00ed221b5a | ||
|
|
1b9824ae46 | ||
|
|
b20ffca3e2 | ||
|
|
7a6a766e0a | ||
|
|
a6227f6c3a | ||
|
|
ed6c8a95d7 | ||
|
|
ac2c38735d | ||
|
|
cec2999983 | ||
|
|
82359ceb22 | ||
|
|
be1d32cade | ||
|
|
a69537ea13 | ||
|
|
59a2e1bcbc | ||
|
|
d71c4d129c | ||
|
|
955ae76cb3 | ||
|
|
65b80da60b | ||
|
|
7bdcbc1775 | ||
|
|
f6c9bfc0e8 | ||
|
|
5e94650645 | ||
|
|
cbae738882 | ||
|
|
75e9c863f6 | ||
|
|
2b4f61f294 | ||
|
|
5b3904e66b | ||
|
|
6161f54111 | ||
|
|
c75c6b4204 | ||
|
|
1f24432172 | ||
|
|
a0c8a9e8ed | ||
|
|
57184a8ed9 | ||
|
|
238a49b6f0 | ||
|
|
a520d97752 | ||
|
|
edaef4e6b0 | ||
|
|
822ee634c4 | ||
|
|
352cea1659 | ||
|
|
6841de5e4b | ||
|
|
89cab57f77 | ||
|
|
08fe6393d8 | ||
|
|
2bb415c47f | ||
|
|
f5fc92747e | ||
|
|
b0389cb77d | ||
|
|
eb01106751 | ||
|
|
f854d4a737 | ||
|
|
7a5d6391b8 | ||
|
|
52fdeefeaa | ||
|
|
809c953931 | ||
|
|
dce3b94d77 | ||
|
|
37c45f1f21 | ||
|
|
38a3699285 | ||
|
|
96004553d8 | ||
|
|
49e0a6efec | ||
|
|
a16397ecd8 | ||
|
|
08ff39c0c9 | ||
|
|
c815d28b68 | ||
|
|
15a6c2d2a1 | ||
|
|
80d9c3ec8b | ||
|
|
4a724ce40e | ||
|
|
5ef8b91db8 | ||
|
|
3e29793d04 | ||
|
|
5e39efa45b | ||
|
|
b8aacc29cd | ||
|
|
ee646c8dd0 | ||
|
|
65b0b947c9 | ||
|
|
c263c59346 | ||
|
|
3061eed647 | ||
|
|
5c140e5570 | ||
|
|
3d3c6cc495 | ||
|
|
4c47fbc964 | ||
|
|
2f5af733ba | ||
|
|
f234637e53 | ||
|
|
9236e27e86 | ||
|
|
1c06067d0d | ||
|
|
eff2a3c3a3 | ||
|
|
8ed63d63a4 | ||
|
|
06ea31d0ab | ||
|
|
603c865129 | ||
|
|
44830589ab | ||
|
|
0fc9ec5538 | ||
|
|
6f6d3ce520 | ||
|
|
4afd41877f | ||
|
|
ee572a13c8 | ||
|
|
8f78e71b6d | ||
|
|
8d4d47b548 | ||
|
|
80afc31ff8 | ||
|
|
0bf4d398ab | ||
|
|
f9e7ca869f | ||
|
|
8db12fe897 | ||
|
|
9bc1b44b0d | ||
|
|
4ff002b9fb | ||
|
|
ee6c23e6c2 | ||
|
|
027667be53 | ||
|
|
36c2ecb64f | ||
|
|
a71bb03f23 | ||
|
|
4b53cd583d | ||
|
|
fdea1abf70 | ||
|
|
a3a069234b | ||
|
|
6c4a51d56e | ||
|
|
0b976a1843 | ||
|
|
0ee24b9bce | ||
|
|
64d33fac5d | ||
|
|
3cca94b268 | ||
|
|
291d88a72f | ||
|
|
036b708d99 | ||
|
|
71f5fe1ece | ||
|
|
d00ab4a326 | ||
|
|
40679560a6 | ||
|
|
a5a9ca7d3b | ||
|
|
1f9349fb71 | ||
|
|
c9c802d3fc | ||
|
|
cbd9181b7e | ||
|
|
e92779981f | ||
|
|
846de82bb4 | ||
|
|
09cff3f4fe | ||
|
|
ec1f00e59b | ||
|
|
a5d3ac8444 | ||
|
|
3aa42389ef | ||
|
|
4050166738 | ||
|
|
523dc6da6d | ||
|
|
426653a9d7 | ||
|
|
910f78dd74 | ||
|
|
611cf852aa | ||
|
|
c179e447a6 | ||
|
|
573c539956 | ||
|
|
9e64571de0 | ||
|
|
63bb2da4d8 | ||
|
|
573e1ad4b1 | ||
|
|
c114cbc9af | ||
|
|
f10e4f88b6 | ||
|
|
a92a7cbb9c | ||
|
|
9b78857894 | ||
|
|
edf745232f | ||
|
|
5659898331 | ||
|
|
f00084f28b | ||
|
|
3a0bb6b19a | ||
|
|
f0a00ab2f2 | ||
|
|
6620b9ec72 | ||
|
|
e84200b847 | ||
|
|
e6e1805c5f | ||
|
|
be2b6bfdc9 | ||
|
|
8814f34dc1 | ||
|
|
09ce297352 | ||
|
|
4c38867768 | ||
|
|
23978aee81 | ||
|
|
fddd5fd045 | ||
|
|
084a820de3 | ||
|
|
c06a71bfbe | ||
|
|
044d45a0ff | ||
|
|
4c798ce3b4 | ||
|
|
107127afb7 | ||
|
|
d3cfab1391 | ||
|
|
1e9caecbcb | ||
|
|
fb54d34788 | ||
|
|
16816a1202 | ||
|
|
48d5342601 | ||
|
|
46d86766c4 | ||
|
|
6b1c939b67 | ||
|
|
65c762f1e1 | ||
|
|
4fde67fa50 | ||
|
|
f52708a20f | ||
|
|
16931f724b | ||
|
|
8f77b1cdd2 | ||
|
|
10e64fd548 | ||
|
|
d32e7f5ad7 | ||
|
|
8612ac592d | ||
|
|
b8bf567514 | ||
|
|
c32032757e | ||
|
|
1cb69e6f5c | ||
|
|
f5fac096c0 | ||
|
|
a26419557f | ||
|
|
980af4aa5b | ||
|
|
2565c5c15b | ||
|
|
5604bb238e | ||
|
|
a1d5a19e24 | ||
|
|
77201ade34 | ||
|
|
49d3a58a9e | ||
|
|
937c229b2e | ||
|
|
5b6814d6ad | ||
|
|
37508d1f1e | ||
|
|
bea0b17c9e | ||
|
|
30e02383a5 | ||
|
|
ec92e91ddc | ||
|
|
cc7d83fa94 | ||
|
|
17ba21cfe4 | ||
|
|
f1d40a3c7c | ||
|
|
275d658616 | ||
|
|
15e1f4349b | ||
|
|
f30c50cec5 | ||
|
|
805a177673 | ||
|
|
e410d47565 | ||
|
|
7ef2d5e86f | ||
|
|
3c95e00e8a | ||
|
|
b9d2e4d897 | ||
|
|
cb9f4e621f | ||
|
|
7c6600895e | ||
|
|
c0d80ab996 | ||
|
|
ffbda7fe64 | ||
|
|
8b201d8077 | ||
|
|
9e2776af0e | ||
|
|
3fa5d6c794 | ||
|
|
3ade72266c | ||
|
|
349eff0df7 | ||
|
|
a9db99ac52 | ||
|
|
e7d686461e | ||
|
|
dd69ca5a81 | ||
|
|
e332573fe1 | ||
|
|
dcc081a594 | ||
|
|
75f1e36b44 | ||
|
|
b3617cfd86 | ||
|
|
a381d959f2 | ||
|
|
ae03df4bc4 | ||
|
|
9d25b52208 | ||
|
|
d48c872913 | ||
|
|
4936de29e7 | ||
|
|
3463e81dda | ||
|
|
a3cd5bf170 | ||
|
|
6bd47b8662 | ||
|
|
cc3efcc3ab | ||
|
|
0be8d0d385 | ||
|
|
c3584111d6 | ||
|
|
095e04cb0d | ||
|
|
ef313dc8c5 | ||
|
|
c272584fec | ||
|
|
f20c7deaf1 | ||
|
|
08d42a0507 | ||
|
|
89efa9a8b1 | ||
|
|
fae1a398bd | ||
|
|
8213885491 | ||
|
|
da09a915f2 | ||
|
|
2a2ccea24e | ||
|
|
ed6298ad17 | ||
|
|
252c821cb3 | ||
|
|
8440308470 | ||
|
|
49518b71ab | ||
|
|
702de29549 | ||
|
|
757a95123d | ||
|
|
6ab46bb8db | ||
|
|
ddb9350ea9 | ||
|
|
03571b82be | ||
|
|
75600b6b53 | ||
|
|
35e1d1e2d8 | ||
|
|
a4f925d822 | ||
|
|
3edb7d538f | ||
|
|
b5a38ca96b | ||
|
|
cd16676911 | ||
|
|
d7ef7eb484 | ||
|
|
2105bae1fc | ||
|
|
0c265c0f52 | ||
|
|
cd8982b645 | ||
|
|
c0de8afaf3 | ||
|
|
62244f01c2 | ||
|
|
2b4ab19d47 | ||
|
|
4b9424eb20 | ||
|
|
c4d69ea8a1 | ||
|
|
a3f28e221f | ||
|
|
765891cc4e | ||
|
|
dec0f7aa84 | ||
|
|
44b3554a11 | ||
|
|
9f13edbe4a | ||
|
|
3d6c4adda9 | ||
|
|
38c851f4cf | ||
|
|
e1c3ec25ab | ||
|
|
542962bc69 | ||
|
|
ae0321778f | ||
|
|
570a6430ad | ||
|
|
83791a26c3 | ||
|
|
2118973251 | ||
|
|
70354f9f5e | ||
|
|
536b1220fd | ||
|
|
b6517250c7 | ||
|
|
a811ae25dc | ||
|
|
29429874b3 | ||
|
|
99e87dded3 | ||
|
|
84cf391faa | ||
|
|
f0469d829a | ||
|
|
6fd8dc44fb | ||
|
|
6123d3cb50 | ||
|
|
516e989464 | ||
|
|
085a9b9267 | ||
|
|
d9b30ab090 | ||
|
|
7ab1c6c7ad | ||
|
|
1afea1b650 | ||
|
|
8efe88201e | ||
|
|
b4f70cb98b | ||
|
|
98f4e49669 | ||
|
|
e0f62c178f | ||
|
|
6d02bec4c7 | ||
|
|
42a320064c | ||
|
|
002757225a | ||
|
|
db63be7909 | ||
|
|
3444fe87fb | ||
|
|
fac9b2393f | ||
|
|
f17ddb6770 | ||
|
|
ea9e05568e | ||
|
|
e30f3fee88 | ||
|
|
7d65141137 | ||
|
|
64fe617c63 | ||
|
|
b2174bc9c0 | ||
|
|
7a9efa7930 | ||
|
|
9dd0c47d0b | ||
|
|
992e1d0059 | ||
|
|
3d0a377e26 | ||
|
|
9f5ce04229 | ||
|
|
a9617f97b6 | ||
|
|
0a8c922d92 | ||
|
|
40de253b3a | ||
|
|
ce61ada623 | ||
|
|
06b2775131 | ||
|
|
4ad5b756e4 | ||
|
|
509ee64fc9 | ||
|
|
7fc1994339 | ||
|
|
22a2098c34 | ||
|
|
0cc307fbd9 | ||
|
|
69731f6642 | ||
|
|
ce2d1c4e83 | ||
|
|
ad6ea1691e | ||
|
|
2ea2a4c831 | ||
|
|
67c18c77d0 | ||
|
|
813415302a | ||
|
|
cbea0b9378 | ||
|
|
d93e57a3f9 | ||
|
|
f38646593c | ||
|
|
9598218a94 | ||
|
|
afdd1a98c1 | ||
|
|
9cae25d1eb | ||
|
|
4ffb0adb78 | ||
|
|
52648acdc8 | ||
|
|
f9664f224d | ||
|
|
0a929f7a0b | ||
|
|
3e35e6e488 | ||
|
|
af7f5f42b6 | ||
|
|
f27407bbf9 | ||
|
|
214c677032 | ||
|
|
2bbecf4292 | ||
|
|
0541a34201 | ||
|
|
cf63d1b2a7 | ||
|
|
85ba4e0142 | ||
|
|
9b24d26972 | ||
|
|
0970cc8736 | ||
|
|
616d301083 | ||
|
|
162053ed8d | ||
|
|
f9371899a1 | ||
|
|
56b60fab4b | ||
|
|
b91a2dd0bb | ||
|
|
83f386347f | ||
|
|
6eb1e31070 | ||
|
|
e3c538a991 | ||
|
|
908ed493cc | ||
|
|
a5e8b81ee3 | ||
|
|
c4f2210cc5 | ||
|
|
6d72d538a6 | ||
|
|
279ec88351 | ||
|
|
8a09c99f36 | ||
|
|
56161250de | ||
|
|
41a49b014a | ||
|
|
8339e28cfe | ||
|
|
b3d5fb71f4 | ||
|
|
94b71353ef | ||
|
|
3e17b8fccc | ||
|
|
40428f592d | ||
|
|
49e98cde4c | ||
|
|
708d6b6911 | ||
|
|
c3dddee804 | ||
|
|
47ad707bba | ||
|
|
bf84879134 | ||
|
|
b7cdb6d586 | ||
|
|
088b10f4c2 | ||
|
|
eff6b98813 | ||
|
|
949fc7bdd7 | ||
|
|
44cfe3e340 | ||
|
|
2b13472419 | ||
|
|
9d5471722f | ||
|
|
0447ee7b96 | ||
|
|
cd58e6129c | ||
|
|
f48291b70c | ||
|
|
2a472af7b8 | ||
|
|
927a678056 | ||
|
|
2565ffab25 | ||
|
|
cb70ac6932 | ||
|
|
e8d90dbf4b | ||
|
|
6db372133d | ||
|
|
f220250ada | ||
|
|
4ac2cfba61 | ||
|
|
0df65a106d | ||
|
|
0fefdb458f | ||
|
|
8aab725782 | ||
|
|
c5d9e7e391 | ||
|
|
3569987c81 | ||
|
|
10a2275c34 | ||
|
|
017836cffa | ||
|
|
eaf143dd8a | ||
|
|
03e0f1eb21 | ||
|
|
06282f02fd | ||
|
|
973097f025 | ||
|
|
e52a04e341 | ||
|
|
61f272495d | ||
|
|
0d170222a6 | ||
|
|
7edfcd5c63 | ||
|
|
5b6cc5af6d | ||
|
|
05d569ee44 | ||
|
|
a40f491c93 | ||
|
|
e78cefd759 | ||
|
|
07c9f0de9d | ||
|
|
1efb81456b | ||
|
|
fec83fa975 | ||
|
|
1634c9df78 | ||
|
|
14fb38f952 | ||
|
|
1d9cc12984 | ||
|
|
98b561929f | ||
|
|
f513f4e53a | ||
|
|
67a661c19f | ||
|
|
2fb1d5900d | ||
|
|
59a3968fd2 | ||
|
|
8e577b01bc | ||
|
|
7d44f8e871 | ||
|
|
8d2dfdf2c9 | ||
|
|
dabc34e0f9 | ||
|
|
3525a9d7ee | ||
|
|
61887c061b | ||
|
|
e4fd1d5f5a | ||
|
|
afe54df843 | ||
|
|
dddb0bb24b | ||
|
|
37578d8b39 | ||
|
|
2f29473efc | ||
|
|
f29139e853 | ||
|
|
87152877b2 | ||
|
|
8af00d2b78 | ||
|
|
a3dbca90d5 | ||
|
|
e07928062f | ||
|
|
ec19159580 | ||
|
|
b7d60dc7bb | ||
|
|
fab4399b8c | ||
|
|
e468b71459 | ||
|
|
a447a9aeff | ||
|
|
319e65af05 | ||
|
|
3e10640c04 | ||
|
|
405ec12940 | ||
|
|
730086b0f0 | ||
|
|
1040b255c7 | ||
|
|
41f87e82a8 | ||
|
|
bf2d61c6fd | ||
|
|
64485167e9 | ||
|
|
31adc221d9 | ||
|
|
7e6543c4cd | ||
|
|
ac9a0f0dbf | ||
|
|
699d294ac1 | ||
|
|
1cfbd62266 | ||
|
|
02ddc20c87 | ||
|
|
520e567390 | ||
|
|
144e7b0616 | ||
|
|
fe8e99138d | ||
|
|
e0abfee370 | ||
|
|
66a0f18410 | ||
|
|
3181bdcb9b | ||
|
|
e1adc3a6b2 | ||
|
|
7a76efa629 | ||
|
|
216f7d912a | ||
|
|
d373f1fc1d | ||
|
|
36a0f745cd | ||
|
|
ab189a75ab | ||
|
|
c9a409dcf3 | ||
|
|
f4476100f2 | ||
|
|
6bdab62358 | ||
|
|
009a677e0d | ||
|
|
2e47817adf | ||
|
|
176a291ed2 | ||
|
|
1350b44ecf | ||
|
|
1875222e93 | ||
|
|
439f233ccc | ||
|
|
a91dad35db | ||
|
|
6f745762bb | ||
|
|
f0065cda13 | ||
|
|
8a0d4854e8 | ||
|
|
b3fff2d779 | ||
|
|
754b0e9b91 | ||
|
|
3139ad0d4d | ||
|
|
3272505891 | ||
|
|
0991e398bb | ||
|
|
ac8b27fcb1 | ||
|
|
5b108efde4 | ||
|
|
f2884343b3 | ||
|
|
16bc7b48b5 | ||
|
|
9efa897d0d | ||
|
|
d8a6c0a91b | ||
|
|
7e3db843cd | ||
|
|
bb65b82c56 | ||
|
|
bb686a2236 | ||
|
|
fc803c75a6 | ||
|
|
812e977e62 | ||
|
|
5a5a6a6968 | ||
|
|
f7c133da00 | ||
|
|
4c56c89afc | ||
|
|
9361470070 | ||
|
|
ab3149257b | ||
|
|
2e38cf2a4b | ||
|
|
2be1288cac | ||
|
|
082d4b5a7e | ||
|
|
c111a65622 | ||
|
|
e89c66a224 | ||
|
|
85212c57e8 | ||
|
|
0297e5a105 | ||
|
|
d6ceeb915d | ||
|
|
5996962749 | ||
|
|
bc57c7710f | ||
|
|
9768653df7 | ||
|
|
59eb75021b | ||
|
|
d905ed33fe | ||
|
|
7a80610300 | ||
|
|
8d32eb62ae | ||
|
|
446f5d6134 | ||
|
|
d37e7bcc25 | ||
|
|
5809608bd2 | ||
|
|
2e65e27189 | ||
|
|
fd6d814ea4 | ||
|
|
51adf815aa | ||
|
|
56e05dab02 | ||
|
|
2e9a349dd0 | ||
|
|
1f77c2d09d | ||
|
|
6c906b365b | ||
|
|
509ce38375 | ||
|
|
6580ba8d8e | ||
|
|
1baaeee17e | ||
|
|
6f9f7632f3 | ||
|
|
dcf3d03e54 | ||
|
|
81a41e26f8 | ||
|
|
41a41b1591 | ||
|
|
4bc220f349 | ||
|
|
5eaccf91e2 | ||
|
|
12ea04580a | ||
|
|
11dccccdcc | ||
|
|
e9de674bbd | ||
|
|
4bed9ea56d | ||
|
|
c28bd74ca7 | ||
|
|
bf274f4fb5 | ||
|
|
f365f720da | ||
|
|
4223b3da68 | ||
|
|
e5bfdb99b6 | ||
|
|
6eb88dc13f | ||
|
|
48392517d4 | ||
|
|
c5a6d87c5e | ||
|
|
e1b445f934 | ||
|
|
19c038d1ef | ||
|
|
6daa8d7e12 | ||
|
|
177e06808c | ||
|
|
69005f8c60 | ||
|
|
fcd53af89d | ||
|
|
6c3f12fe24 | ||
|
|
6f8775499f | ||
|
|
430d82bd4f | ||
|
|
573916e5e2 | ||
|
|
7a3e0924e0 | ||
|
|
fc81fa6abf | ||
|
|
af022728bd | ||
|
|
5ca63c4956 | ||
|
|
a070dffc4e | ||
|
|
f0515d0caa | ||
|
|
1f836f72b3 | ||
|
|
89e48ba0b3 | ||
|
|
b118ed69d3 | ||
|
|
dddbdddcff | ||
|
|
05f19ad09c | ||
|
|
7211802fc0 | ||
|
|
7b906134e2 | ||
|
|
1fb92b6f8c | ||
|
|
b22842a52f | ||
|
|
834fdf8666 | ||
|
|
1621fa43d8 | ||
|
|
3da3558e35 | ||
|
|
b29b026106 | ||
|
|
7ffcb828fe | ||
|
|
11f4e64e45 | ||
|
|
bd93a9e6ff | ||
|
|
aed5267fd1 | ||
|
|
26e781ef5a | ||
|
|
ee6691458e | ||
|
|
4cd34816cf | ||
|
|
f9835b5077 | ||
|
|
52c7ebe502 | ||
|
|
6b536922af | ||
|
|
574424dc5a | ||
|
|
aedee4e1a4 | ||
|
|
f31f53f61f | ||
|
|
7c40abe4a6 | ||
|
|
58347d494a | ||
|
|
01dbfb0a3f | ||
|
|
2740cc80d2 | ||
|
|
8ba2a4cfd4 | ||
|
|
1f2432d63a | ||
|
|
a70ed0282b | ||
|
|
a7e3678d3e | ||
|
|
dce9453d25 | ||
|
|
fa7682ec3c | ||
|
|
28cde83c33 | ||
|
|
96157a05f6 | ||
|
|
b9f0842d7e | ||
|
|
77d4d21caa | ||
|
|
48aa929008 | ||
|
|
291a28e79c | ||
|
|
6ab97227de | ||
|
|
6dec6ddc26 | ||
|
|
0785260365 | ||
|
|
885de80a0e | ||
|
|
8204d3103b | ||
|
|
0814797444 | ||
|
|
e8bed9e038 | ||
|
|
a927efa015 | ||
|
|
05ab849b72 | ||
|
|
d8a9e11c32 | ||
|
|
fe8fb2dccf | ||
|
|
720c0ddb35 | ||
|
|
2900352e04 | ||
|
|
dc96c01c93 | ||
|
|
1ace742b6c | ||
|
|
7996e15ad1 | ||
|
|
3b50fe8b68 | ||
|
|
9870cf838a | ||
|
|
8d27f81a7b | ||
|
|
9f8d854c2a | ||
|
|
40fa0d5c83 | ||
|
|
e8c18386c8 | ||
|
|
745bceb9d8 | ||
|
|
483e9fdea2 | ||
|
|
c6e3dd7965 | ||
|
|
c2c3813555 | ||
|
|
1a1a9b9927 | ||
|
|
47b78b9eeb | ||
|
|
396bf1235d | ||
|
|
d885f00941 | ||
|
|
0ba02ee3d1 | ||
|
|
5a5b51c909 | ||
|
|
07ef1e7c4b | ||
|
|
896b9ecc70 | ||
|
|
4c7baa37a3 | ||
|
|
599089de80 | ||
|
|
eb3ed2680b | ||
|
|
90f7d4b081 | ||
|
|
05a640b027 | ||
|
|
a8a10d634b | ||
|
|
029d88e962 | ||
|
|
59fa04bd91 | ||
|
|
0019c12af3 | ||
|
|
8e1661cd22 | ||
|
|
b48b2ddfb2 | ||
|
|
d0077d0910 | ||
|
|
e79d42aa52 | ||
|
|
7bb3bf7c74 | ||
|
|
41acaced3f | ||
|
|
42eaacd3a1 | ||
|
|
9443a415bf | ||
|
|
45d3a705be | ||
|
|
4288db9d39 | ||
|
|
8324893565 | ||
|
|
41d4058156 | ||
|
|
ed85393611 | ||
|
|
ffd4754cb2 | ||
|
|
54dd4b7ed6 | ||
|
|
8041913e7a | ||
|
|
2d5ce72cb4 | ||
|
|
d058d290be | ||
|
|
85d697f13d | ||
|
|
754b78a748 | ||
|
|
254762f30f | ||
|
|
bf53f39cdd | ||
|
|
2b0bad889a | ||
|
|
ee15f1b987 | ||
|
|
3289797248 | ||
|
|
2b7dddf342 | ||
|
|
1293cd8b6a | ||
|
|
417255fc55 | ||
|
|
d73ff39393 | ||
|
|
227ba10628 | ||
|
|
15921d37c4 | ||
|
|
eaa3741336 | ||
|
|
422ff0f173 | ||
|
|
e2ed561264 | ||
|
|
1fbcb1ee9d | ||
|
|
a0d9db94cb | ||
|
|
6a5a1a8964 | ||
|
|
a8b2da8405 | ||
|
|
7cfe028b9d | ||
|
|
1ca1667786 | ||
|
|
c8d2e6d972 | ||
|
|
ca33bbd4e0 | ||
|
|
f47ebc4b1c | ||
|
|
682af2f83f | ||
|
|
7c6527e9cf | ||
|
|
121109ee4d | ||
|
|
11a60c8374 | ||
|
|
54a76bb9e5 | ||
|
|
2f33c24a07 | ||
|
|
d0146d7b6f | ||
|
|
9ad1b86e4e | ||
|
|
f63c8a703e | ||
|
|
4f6ac06b21 | ||
|
|
18cc06b38f | ||
|
|
c1d4c07548 | ||
|
|
e97c5b552c | ||
|
|
9588c9a811 | ||
|
|
94ef40fb19 | ||
|
|
87b0d1b828 | ||
|
|
38ea6e088e | ||
|
|
0eda4020a2 | ||
|
|
ded6e726e5 | ||
|
|
df55991806 | ||
|
|
73bd7c51cf | ||
|
|
df12ac24b2 | ||
|
|
fb63bee322 | ||
|
|
c7a016a137 | ||
|
|
3a03d5df53 | ||
|
|
f0ba37b73a | ||
|
|
a928517e95 | ||
|
|
5ec9fcd8d4 | ||
|
|
ed5f90d22e | ||
|
|
5cfd3eb63a | ||
|
|
aad2848e80 | ||
|
|
320cb6857f | ||
|
|
9ac78e06b4 | ||
|
|
93e6f57dfc | ||
|
|
45c7836bec | ||
|
|
b8778ba4a2 | ||
|
|
b16511344e | ||
|
|
1054a2fd36 | ||
|
|
b86b84e2a9 | ||
|
|
52d1b6b97d | ||
|
|
9b4310b10f | ||
|
|
13a4ef80b3 | ||
|
|
0de2a1072f | ||
|
|
2e5693a6bc | ||
|
|
acc2353328 | ||
|
|
8423345e09 | ||
|
|
36d4283d17 | ||
|
|
acd8363c38 | ||
|
|
e8a31a13a1 | ||
|
|
3e82be4ac2 | ||
|
|
521546a986 | ||
|
|
708f80d855 | ||
|
|
8645aa94c8 | ||
|
|
043725cdd5 | ||
|
|
209a2576cd | ||
|
|
5284a133b0 | ||
|
|
2d26a262e7 | ||
|
|
2e81ade66a | ||
|
|
5eb1ef4b4a | ||
|
|
5d6415b6bf | ||
|
|
bd03c3fbc5 | ||
|
|
20bcbcc252 | ||
|
|
47a9f99523 | ||
|
|
7356987e6e | ||
|
|
6518b6c6b7 | ||
|
|
d5462fb3d7 | ||
|
|
d7283cdaa1 | ||
|
|
54360d8cfe | ||
|
|
0b0d0e7799 | ||
|
|
609100c196 | ||
|
|
9e922a6e02 | ||
|
|
a275618589 | ||
|
|
83c7931afb | ||
|
|
1155c4b413 | ||
|
|
7a1146ebb5 | ||
|
|
180c211dd2 | ||
|
|
848495d4cf | ||
|
|
87c51f2c10 | ||
|
|
b41fced062 | ||
|
|
71e835feec | ||
|
|
313cb0d248 | ||
|
|
0c4ede5627 | ||
|
|
034aaaa62b | ||
|
|
839cd2a1c7 | ||
|
|
adba0550d5 | ||
|
|
6d1c127687 | ||
|
|
7cca963b8f | ||
|
|
1fb8f4e277 | ||
|
|
98863541c3 | ||
|
|
87bfd1a01e | ||
|
|
95385eda80 | ||
|
|
c02f5ceb0f | ||
|
|
4ba1f9e398 | ||
|
|
294e78205c | ||
|
|
d437a84828 | ||
|
|
2f28e96956 | ||
|
|
00a8766635 | ||
|
|
097d2246c2 | ||
|
|
23c3101440 | ||
|
|
003ea83410 | ||
|
|
de87419df9 | ||
|
|
4e505efc50 | ||
|
|
b7d910a941 | ||
|
|
f05fe4e292 | ||
|
|
72e687296b | ||
|
|
c9c311fbdb | ||
|
|
b9b66791c1 | ||
|
|
9b0d45d4fa | ||
|
|
5709c81fe0 | ||
|
|
e35b91d38c | ||
|
|
4f4d34e664 | ||
|
|
f6047f02d6 | ||
|
|
71e69b6d75 | ||
|
|
60c47deca9 | ||
|
|
c10952c354 | ||
|
|
e73226d7e8 | ||
|
|
19e12e3747 | ||
|
|
e4ce5ca24f | ||
|
|
01fb830bf5 | ||
|
|
edcf15e3d7 | ||
|
|
9f05697dcc | ||
|
|
c18614552d | ||
|
|
9701d5cc7b | ||
|
|
50fc3d72df | ||
|
|
feaeca4999 | ||
|
|
d4fb9a0e65 | ||
|
|
2c38978115 | ||
|
|
520f810bf9 | ||
|
|
d441de33e5 | ||
|
|
46b791240a | ||
|
|
3bd24ddb17 | ||
|
|
26c1430e82 | ||
|
|
6c3900ff64 | ||
|
|
6192e2453e | ||
|
|
eab836864e | ||
|
|
225caa2fe8 | ||
|
|
4fe2a2921f | ||
|
|
7779132595 | ||
|
|
ca5a4ec1d5 | ||
|
|
49ed20c8cb | ||
|
|
a5f6382d77 | ||
|
|
b2f047421d | ||
|
|
dfe7813c02 | ||
|
|
ddbf63c46f | ||
|
|
c8fe0e53dd | ||
|
|
7bcae09674 | ||
|
|
2a5ad198bf | ||
|
|
960cc628b2 | ||
|
|
6b41240cd2 | ||
|
|
6e873719fd | ||
|
|
f4f9ed56ee | ||
|
|
9f23f619c9 | ||
|
|
1e234f492c | ||
|
|
f0ab1331a5 | ||
|
|
99b729eb4d | ||
|
|
9af0797334 | ||
|
|
6bef7b7be9 | ||
|
|
b0b2182535 | ||
|
|
fb979922b3 | ||
|
|
c4bd110fca | ||
|
|
b663b0e818 | ||
|
|
41f1232cf9 | ||
|
|
4a2aed1f8e | ||
|
|
2d46969d3e | ||
|
|
f382fa8e8a | ||
|
|
7ea2dc4488 | ||
|
|
56679d4776 | ||
|
|
070ef6fd5b | ||
|
|
075be74cc4 | ||
|
|
5a8be61954 | ||
|
|
7fdbbe0711 | ||
|
|
8af6bb4436 | ||
|
|
2bb52c65c2 | ||
|
|
37d91d0c29 | ||
|
|
8dfee7ff76 | ||
|
|
07de13f61f | ||
|
|
668de88e69 | ||
|
|
31432c3535 | ||
|
|
cdb82e45ac | ||
|
|
a90b521eb4 | ||
|
|
25e0a39165 | ||
|
|
d982427216 | ||
|
|
21521b2953 | ||
|
|
42458ff7ab | ||
|
|
a8c9019a39 | ||
|
|
100a0ea549 | ||
|
|
cbe2d4b5f1 | ||
|
|
7878dbc4f0 | ||
|
|
e16f6ca2aa | ||
|
|
c7e26e494e | ||
|
|
6e6b294a3f | ||
|
|
00303ed07f | ||
|
|
345950ac1b | ||
|
|
e9543617f6 | ||
|
|
9c85dce863 | ||
|
|
bf3466d82c | ||
|
|
3eb7a8fa09 | ||
|
|
dcb39af8c0 | ||
|
|
8a2d6a9752 | ||
|
|
cc31cda835 | ||
|
|
b560daac21 | ||
|
|
8a7b30d3f0 | ||
|
|
d474368ea5 | ||
|
|
7e962d6f22 | ||
|
|
a26f68d63f | ||
|
|
bff6a6e66a | ||
|
|
f490b56378 | ||
|
|
dc6b538f56 | ||
|
|
4f397e86d7 | ||
|
|
d5ca88d42d | ||
|
|
f48fec31d6 | ||
|
|
0f65d9306b | ||
|
|
bb47dfcabc | ||
|
|
170a5ea31c | ||
|
|
4f95c4b8ac | ||
|
|
36352c0370 | ||
|
|
6d322dff73 | ||
|
|
fe8727fb71 | ||
|
|
44baf0f9bd | ||
|
|
4acfdcb0a0 | ||
|
|
e8ed45ecd3 | ||
|
|
3c0de01c07 | ||
|
|
1d418365b5 | ||
|
|
a3d0ea5c7f | ||
|
|
d35cbb6594 | ||
|
|
3663726689 | ||
|
|
cda415cb5d | ||
|
|
36f320598e | ||
|
|
d8497f0f1e | ||
|
|
f464704884 | ||
|
|
ea3e144f2d | ||
|
|
14efcb7cc5 | ||
|
|
4ffc6e02b7 | ||
|
|
f33ece11ac | ||
|
|
92e14d7e4a | ||
|
|
a5034874ab | ||
|
|
37c4247cb7 | ||
|
|
c07c98ac05 | ||
|
|
851e449347 | ||
|
|
213ef3ee56 | ||
|
|
30e56c0237 | ||
|
|
5d4fffcae4 | ||
|
|
8d40bf325d | ||
|
|
488a09fffb | ||
|
|
22558f9e7b | ||
|
|
b71aa8f9e8 | ||
|
|
8b9102d9fe | ||
|
|
4e1226a313 | ||
|
|
91a311c156 | ||
|
|
7fd3079bb6 | ||
|
|
f7f39b8c90 | ||
|
|
d389b22afc | ||
|
|
17f5727e7e | ||
|
|
61388cff02 | ||
|
|
d2739f10e1 | ||
|
|
a863f74fc4 | ||
|
|
41bf002049 | ||
|
|
632a209685 | ||
|
|
ce6e9b52ce | ||
|
|
0c23b5652a | ||
|
|
40a83e4018 | ||
|
|
53f1ebaf6b | ||
|
|
386f2bdcf4 | ||
|
|
c5b17b5310 | ||
|
|
36fe172932 | ||
|
|
94aeb47f63 | ||
|
|
ce1c9f3a65 | ||
|
|
45ae726d4f | ||
|
|
cd84587c3a | ||
|
|
c0c2e1d4fa | ||
|
|
d17f2585fa | ||
|
|
b05c09429d | ||
|
|
7ec205d59c | ||
|
|
b485d95808 | ||
|
|
eeea3f3b3c | ||
|
|
ca929e088e | ||
|
|
92dd6de73c | ||
|
|
01fa31f313 | ||
|
|
662ba60d63 | ||
|
|
f843eb3d31 | ||
|
|
e9b5505169 | ||
|
|
c2a8de4873 | ||
|
|
503edf2d49 | ||
|
|
4c34ba9959 | ||
|
|
204e79105a | ||
|
|
98470ab608 | ||
|
|
93bea5b321 | ||
|
|
2c8bc05826 | ||
|
|
8b1625be2b | ||
|
|
d71b97c2cf | ||
|
|
76c73aa8ce | ||
|
|
02ba7933e0 | ||
|
|
be0bd999ad | ||
|
|
92e3a3c8ef | ||
|
|
96ebfaaf87 | ||
|
|
30b71fbb78 | ||
|
|
fc3cd77c2f | ||
|
|
22c20f36cb | ||
|
|
46ab1a155c | ||
|
|
29b9e6705a | ||
|
|
ed7bf83b56 | ||
|
|
0a6dc2addb | ||
|
|
05b52eaa0b | ||
|
|
e14ae90cc8 | ||
|
|
06c658dd5e | ||
|
|
85cd372a4e | ||
|
|
f9115b5ef1 | ||
|
|
9d69f44550 | ||
|
|
c57b30cba1 | ||
|
|
bb754c2085 | ||
|
|
f7c6426b21 | ||
|
|
90e535f66f | ||
|
|
af95813514 | ||
|
|
82b298dcc5 | ||
|
|
ae32d0288b | ||
|
|
b17ebb4551 | ||
|
|
6faa2f9866 | ||
|
|
0335921c3c | ||
|
|
af0a2add10 | ||
|
|
87a532f533 | ||
|
|
fa837a2e4a | ||
|
|
f0125734d0 | ||
|
|
c0c8fffd50 | ||
|
|
2822dfc92d | ||
|
|
87fd9bca02 | ||
|
|
3d6cb59b31 | ||
|
|
6936e64b34 | ||
|
|
f78f51e2a7 | ||
|
|
578e4e8207 | ||
|
|
f7daa5884a | ||
|
|
f0e884075c | ||
|
|
363fa0a598 | ||
|
|
9f6ba5db7a | ||
|
|
cac3b239e3 | ||
|
|
b0716885bc | ||
|
|
a0623e870b | ||
|
|
7ce042ccff | ||
|
|
30f26b62e6 | ||
|
|
e89057b70c | ||
|
|
1bc887cd9f | ||
|
|
6b1801063b | ||
|
|
b895a50bb2 | ||
|
|
4b740d1fb6 | ||
|
|
e54b30d138 | ||
|
|
4b2d1c9acf | ||
|
|
8ca3adaa91 | ||
|
|
2345bea5c1 | ||
|
|
443fc66048 | ||
|
|
eeb42f5e54 | ||
|
|
35bee00802 | ||
|
|
3702616b60 | ||
|
|
3e30857e99 | ||
|
|
f37995c676 | ||
|
|
5328d6b83c | ||
|
|
172541c689 | ||
|
|
cfefaaf4ee | ||
|
|
0893134543 | ||
|
|
4f596536f5 | ||
|
|
2047351723 | ||
|
|
476ffe12f6 | ||
|
|
a872d9c299 | ||
|
|
b0184f1476 | ||
|
|
cb22354f83 | ||
|
|
4d04125fa1 | ||
|
|
ecaba64056 | ||
|
|
4906a5f390 | ||
|
|
f76e620be8 | ||
|
|
bfee664af3 | ||
|
|
4e2d2c125c | ||
|
|
f25d5a0f52 | ||
|
|
6d81e2b8a4 | ||
|
|
df0d0ae80a | ||
|
|
044efef577 | ||
|
|
8f0ea07eab | ||
|
|
b93ac10dda | ||
|
|
c99386a375 | ||
|
|
5dd959070c | ||
|
|
df10ffab9c | ||
|
|
9b5625a66b | ||
|
|
6f53709b65 | ||
|
|
9daffc7080 | ||
|
|
790968120d | ||
|
|
386c698d45 | ||
|
|
f3e93f0666 | ||
|
|
2a119ff082 | ||
|
|
2dbc7ddcb8 | ||
|
|
710addde16 | ||
|
|
ef5d3232e4 | ||
|
|
dc02587ac4 | ||
|
|
077a0e1b47 | ||
|
|
816857ead2 | ||
|
|
1248642996 | ||
|
|
a5e31cb0f1 | ||
|
|
27c88c870b | ||
|
|
67a594c12c | ||
|
|
e46978fedb | ||
|
|
7e0e745958 | ||
|
|
43515e1298 | ||
|
|
ccd62ff44b | ||
|
|
744da2cab2 | ||
|
|
b36414152b | ||
|
|
93b9e7443e | ||
|
|
b1f576deae | ||
|
|
01f09cf4c1 | ||
|
|
d68320a3c6 | ||
|
|
00cb9ce80a | ||
|
|
afa266a7ea | ||
|
|
3f9bd72bca | ||
|
|
fb845cdb72 | ||
|
|
8277f6a1ba | ||
|
|
d7604dcc99 | ||
|
|
71e1e38426 | ||
|
|
b77e2a67f8 | ||
|
|
e75fc8452f | ||
|
|
6c8ecab44b | ||
|
|
5da3d2f27b | ||
|
|
d51a1e4fe2 | ||
|
|
ee26eafc25 | ||
|
|
acfd380176 | ||
|
|
3a08a24259 | ||
|
|
0a51b17716 | ||
|
|
b12c413c28 | ||
|
|
375de96016 | ||
|
|
49008d7a1c | ||
|
|
e1ab6494cd | ||
|
|
5afd939f3e | ||
|
|
644ea82c2f | ||
|
|
450d4be88f | ||
|
|
3669805627 | ||
|
|
46fba342db | ||
|
|
5eedb0ee9c | ||
|
|
325f047803 | ||
|
|
c76f896f69 | ||
|
|
88688d02b2 | ||
|
|
ec292ec51b | ||
|
|
3a7a6f16ef | ||
|
|
3d0ea5fe79 | ||
|
|
d252704fdb | ||
|
|
dfe363c945 | ||
|
|
799d8ddfc4 | ||
|
|
99351fcb44 | ||
|
|
9bd5257dda | ||
|
|
10ae6d8b26 | ||
|
|
2fa4bd8fd7 | ||
|
|
3468fbc605 | ||
|
|
34ca8fd213 | ||
|
|
8140f74d75 | ||
|
|
1d2fff9686 | ||
|
|
b53f42970c | ||
|
|
4fbc476b19 | ||
|
|
9aad3781fb | ||
|
|
23ea77be76 | ||
|
|
51e25e5a8d | ||
|
|
113145e52a | ||
|
|
f9355a0b86 | ||
|
|
eb0d04d7ff | ||
|
|
b2be50f081 | ||
|
|
190fb4a665 | ||
|
|
20f28c2ef3 | ||
|
|
e00c70c5fe | ||
|
|
6b99af05a5 | ||
|
|
2df263fa26 | ||
|
|
06003f82ae | ||
|
|
f08ac969e9 | ||
|
|
fb3c839a15 | ||
|
|
e3187b2361 | ||
|
|
1e27910b60 | ||
|
|
09291735e6 | ||
|
|
512506f0f9 | ||
|
|
8cb560dc7e | ||
|
|
b2b327fec4 | ||
|
|
013506dfd5 | ||
|
|
bd2b7764c7 | ||
|
|
ba12bcad33 | ||
|
|
8b06d2ad66 | ||
|
|
a6cd12a7f1 | ||
|
|
6e0521e23f | ||
|
|
d895f876b4 | ||
|
|
bb6ce9d142 | ||
|
|
0ef811f8b8 | ||
|
|
7c6a3e7026 | ||
|
|
34a2ce2646 | ||
|
|
9abbc5f06c | ||
|
|
3ca5ca77fa | ||
|
|
733e960c11 | ||
|
|
14c7cfa84b | ||
|
|
2f0cb2a32b | ||
|
|
bd33e11599 | ||
|
|
3c4e322ec1 | ||
|
|
755d0089f3 | ||
|
|
ee599bdd5c | ||
|
|
a8d911bd39 | ||
|
|
85c346d6ad | ||
|
|
7a343a8665 | ||
|
|
40b4732f94 | ||
|
|
3cd1ef23ab | ||
|
|
efbbe5129f | ||
|
|
8326bdc9af | ||
|
|
ceedc6f345 | ||
|
|
f839282ac0 | ||
|
|
e99c6104fe | ||
|
|
d68c37b726 | ||
|
|
e3ac6d3fe2 | ||
|
|
b7c96417d1 | ||
|
|
9a442673e6 | ||
|
|
0fb434d372 | ||
|
|
163e16f546 | ||
|
|
9b4938e2c2 | ||
|
|
67f6a48a78 | ||
|
|
89c96c2114 | ||
|
|
52d8fdccff | ||
|
|
de076f00f8 | ||
|
|
30065d101b | ||
|
|
5a1a25bfbe | ||
|
|
cf393a264d | ||
|
|
70d798f6ed | ||
|
|
ca15a22cd1 | ||
|
|
86d9e5251a | ||
|
|
417d53a58f | ||
|
|
497b3f51c8 | ||
|
|
080e3efd1b | ||
|
|
71cf516f58 | ||
|
|
08fc19484f | ||
|
|
f966248f16 | ||
|
|
e597df70d7 | ||
|
|
c79e9c7d4e | ||
|
|
75e7784f18 | ||
|
|
8e7f0e781d | ||
|
|
528b9fdcf2 | ||
|
|
edee3e5eb2 | ||
|
|
c9caee37b4 | ||
|
|
bc693bd4e0 | ||
|
|
dff384e42d | ||
|
|
cd422e5d78 | ||
|
|
ca6cda20a3 | ||
|
|
3d8e8a8715 | ||
|
|
af0f9e5308 | ||
|
|
88cb616c1b | ||
|
|
63120a9962 | ||
|
|
807dc82a75 | ||
|
|
1fb4cc0e76 | ||
|
|
6a36144587 | ||
|
|
0045b46af8 | ||
|
|
47fbfdca3e | ||
|
|
772e35562a | ||
|
|
e42f593553 | ||
|
|
9642fcb589 | ||
|
|
7e58a3982a | ||
|
|
431589a16a | ||
|
|
cbee315b1b | ||
|
|
84b08a4fe3 | ||
|
|
c429a585e4 | ||
|
|
68e167d576 | ||
|
|
262452d0b1 | ||
|
|
7e08679f1b | ||
|
|
dda890cf88 | ||
|
|
44cde9e0e9 | ||
|
|
d7bc20c933 | ||
|
|
d69a68e265 | ||
|
|
534c1287ca | ||
|
|
81dee16d69 | ||
|
|
e5011fbcdf | ||
|
|
0f5bfeead2 | ||
|
|
a47b4b0e95 | ||
|
|
02f578a82d | ||
|
|
dfb4998778 | ||
|
|
ea71f0b610 | ||
|
|
a3e9e179eb | ||
|
|
0f3b4d2bd8 | ||
|
|
ceee1ebfd9 | ||
|
|
046174397b | ||
|
|
a6ec2dc3ed | ||
|
|
6ec83568b5 | ||
|
|
b2a2705df4 | ||
|
|
0d6bdb38e6 | ||
|
|
02cef2da23 | ||
|
|
9c53019d95 | ||
|
|
7a4065eb9f | ||
|
|
13eb302f3c | ||
|
|
6122ae83a6 | ||
|
|
fa78a7101c | ||
|
|
5d680f6dbc | ||
|
|
290e936322 | ||
|
|
ecf4517ffe | ||
|
|
eb834f47ef | ||
|
|
db2c128b24 | ||
|
|
e0a627f99d | ||
|
|
8070cd81d6 | ||
|
|
00291c1c5a | ||
|
|
10661bb024 | ||
|
|
f9edcbbbe2 | ||
|
|
7365b6bd0c | ||
|
|
d66d51f101 | ||
|
|
bc8ec46ef9 | ||
|
|
3a0d417b9e | ||
|
|
7e56d6385e | ||
|
|
db0176b884 | ||
|
|
f63f6e54fa | ||
|
|
7cf6ef675a | ||
|
|
29664c42a0 | ||
|
|
8dc4b0d4b2 | ||
|
|
cb74f0f60e | ||
|
|
d8dd718695 | ||
|
|
4424909801 | ||
|
|
a243580cfa | ||
|
|
693d6879d3 | ||
|
|
ad7e9a8d56 | ||
|
|
d0fdc82fdf | ||
|
|
82c56bc64b | ||
|
|
098f6d01c4 | ||
|
|
4b0f1cf85b | ||
|
|
7ac32e45cb | ||
|
|
8e21d5de92 | ||
|
|
f04644f749 | ||
|
|
7ab65595cb | ||
|
|
2cabcf4ad4 | ||
|
|
20d36f16d3 | ||
|
|
dc58edd521 | ||
|
|
e6d4ac5ee2 | ||
|
|
0ca103686f | ||
|
|
cfe3fc301c | ||
|
|
cbe97ac1a1 | ||
|
|
3cecc1f475 | ||
|
|
9f0c31611c | ||
|
|
d70be18c42 | ||
|
|
1be3fe6633 | ||
|
|
7b17d20099 | ||
|
|
ab1db7ebee | ||
|
|
723d689679 | ||
|
|
cd6a9ee522 | ||
|
|
a5e0555e83 | ||
|
|
1499ade89c | ||
|
|
0310d3bd8c | ||
|
|
02375982df | ||
|
|
5435f60f31 | ||
|
|
b72ed1fa8c | ||
|
|
3a7719015d | ||
|
|
0ee03cbf98 | ||
|
|
67339caa33 | ||
|
|
d77c20b09a | ||
|
|
d910aa15fe | ||
|
|
5d20750aaa | ||
|
|
c4e322d3ad | ||
|
|
222a07e907 | ||
|
|
9d2092bf9f | ||
|
|
4d49c902ac | ||
|
|
65ed22d5a6 | ||
|
|
09f9d71bb2 | ||
|
|
059e11078c | ||
|
|
8829bb1364 | ||
|
|
e30db95baa | ||
|
|
970d895aca | ||
|
|
c9b3220160 | ||
|
|
10575d895d | ||
|
|
67f3c01396 | ||
|
|
536d6cebd9 | ||
|
|
7a97095583 | ||
|
|
f37dafdf52 | ||
|
|
c84137aec8 | ||
|
|
f1dc1cd92b | ||
|
|
41f2344cea | ||
|
|
a965a71079 | ||
|
|
913624cbfa | ||
|
|
220fd418a7 | ||
|
|
5dda908c1f | ||
|
|
b7f45c3783 | ||
|
|
3a6e239437 | ||
|
|
fcbeddc3eb | ||
|
|
7ef40f4e53 | ||
|
|
2fafb13eaa | ||
|
|
90ee810c73 | ||
|
|
1357f5a364 | ||
|
|
9f21e3792a | ||
|
|
0b385f145c | ||
|
|
32a585a52b | ||
|
|
410d92ed61 | ||
|
|
53e865b654 | ||
|
|
57f289850c | ||
|
|
63a851cfd6 | ||
|
|
24d6f6d066 | ||
|
|
db1ec847f9 | ||
|
|
aee9d2c9d7 | ||
|
|
22e0702e8d | ||
|
|
29c38d73a2 | ||
|
|
8d11bb9f86 | ||
|
|
8d6735cb41 | ||
|
|
3d74b160b3 | ||
|
|
2768d2ea06 | ||
|
|
bb11999bf7 | ||
|
|
5bf1b0e5f5 | ||
|
|
3d19b549c8 | ||
|
|
bfb5fec330 | ||
|
|
0d257fd651 | ||
|
|
ebde55f704 | ||
|
|
f23464001f | ||
|
|
0882e0cb95 | ||
|
|
763c620d0b | ||
|
|
2871096f9c | ||
|
|
a918397da2 | ||
|
|
8e88b29eeb | ||
|
|
aaaea44714 | ||
|
|
ffe5736abb | ||
|
|
d79a5a3152 | ||
|
|
ffcfe73299 | ||
|
|
2885c085d8 | ||
|
|
7af9e1f5c5 | ||
|
|
980fb59232 | ||
|
|
9ad3488b5d | ||
|
|
8f420b9272 | ||
|
|
d55b226f19 | ||
|
|
95635a5982 | ||
|
|
91962d8aa2 | ||
|
|
d1208386d2 | ||
|
|
d7a4838a54 | ||
|
|
6d6f67ee67 | ||
|
|
987f7cafd3 | ||
|
|
b883e59ee9 | ||
|
|
79fa4d5c4a | ||
|
|
23de5908cf | ||
|
|
0d5ef3f43e | ||
|
|
2a8309458d | ||
|
|
2418daebf3 | ||
|
|
53c506f109 | ||
|
|
7d1f45e25f | ||
|
|
1bad956633 | ||
|
|
2f51088bfb | ||
|
|
0a40dcdb44 | ||
|
|
6b92fdd18d | ||
|
|
b9848538e3 | ||
|
|
475439fa0b | ||
|
|
8fba36b242 | ||
|
|
8b44358c53 | ||
|
|
dac8483f7e | ||
|
|
46f4819ffa | ||
|
|
c238ad35bd | ||
|
|
309e10e7a2 | ||
|
|
dc470bcad3 | ||
|
|
49d9883b3e | ||
|
|
2606cfe72d | ||
|
|
85e701f422 | ||
|
|
5accc7c6c5 | ||
|
|
60317190bd | ||
|
|
6594c061be | ||
|
|
216a45edee | ||
|
|
7828f2303a | ||
|
|
245be2c2e4 | ||
|
|
14b953e414 | ||
|
|
432c0058a9 | ||
|
|
7c24369454 | ||
|
|
46be5ac468 | ||
|
|
ade6ebf522 | ||
|
|
30ea7cc3f8 | ||
|
|
573b3797a5 | ||
|
|
a0b3b8ac4c | ||
|
|
4d63ebde15 | ||
|
|
9cee3f13a1 | ||
|
|
8dc74de92e | ||
|
|
21fc2decd7 | ||
|
|
9192bf1db5 | ||
|
|
7c2c516353 | ||
|
|
db18449f4c | ||
|
|
44757c81af | ||
|
|
d0aa461587 | ||
|
|
504b32f61b | ||
|
|
6a5d89669e | ||
|
|
e39628bbe9 | ||
|
|
f5dcb6a0cb | ||
|
|
14187f9e3f | ||
|
|
9225b16d12 | ||
|
|
00e32a0909 | ||
|
|
73f2992a2e | ||
|
|
d55113b5b5 | ||
|
|
51468b7646 | ||
|
|
ff1d651415 | ||
|
|
768277a312 | ||
|
|
149e601743 | ||
|
|
a998921f39 | ||
|
|
3daccf3c22 | ||
|
|
c63c88262b | ||
|
|
fbe2cdc3c7 | ||
|
|
b60ef72c3d | ||
|
|
d2e79cf6f6 | ||
|
|
a38d5504ac | ||
|
|
76d24aa1bc | ||
|
|
a7605d584b | ||
|
|
4244a6e6fe | ||
|
|
b055b8440c | ||
|
|
14d7b1a0fa | ||
|
|
3626c39398 | ||
|
|
0d1d324e9f | ||
|
|
c53951b9b3 | ||
|
|
46b819a265 | ||
|
|
4d1e77fcae | ||
|
|
4efd0dfd65 | ||
|
|
100eef4e42 | ||
|
|
59c8800c4d | ||
|
|
1d101ef3d0 | ||
|
|
ac47100a7d | ||
|
|
c1e15ef084 | ||
|
|
01e5ca5c96 | ||
|
|
28228627fc | ||
|
|
8ec81393a3 | ||
|
|
1c6f6df2b3 | ||
|
|
bc6cc4c105 | ||
|
|
4481692037 | ||
|
|
1cdf386822 | ||
|
|
d4b5620bb3 | ||
|
|
4246cfa95c | ||
|
|
22cc0515c9 | ||
|
|
79f342b954 | ||
|
|
49838c768d | ||
|
|
862e0127f6 | ||
|
|
527e5f52ba | ||
|
|
42068931c7 | ||
|
|
e1a706bd77 | ||
|
|
d97c22df2d | ||
|
|
3ad5c7c289 | ||
|
|
fc44cffac5 | ||
|
|
5c8763be0e | ||
|
|
ee44879d4d | ||
|
|
c14bac4284 | ||
|
|
0aa7fd95b8 | ||
|
|
fa53563733 | ||
|
|
835176ef32 | ||
|
|
ed086fb1c8 | ||
|
|
c76d866317 | ||
|
|
9d742a4fa1 | ||
|
|
dc8d31a12a | ||
|
|
8d6b88eb5d | ||
|
|
80250c0729 | ||
|
|
ca912f157e | ||
|
|
716706bd9f | ||
|
|
61a614b612 | ||
|
|
3d6f995a9c | ||
|
|
ea945cc437 | ||
|
|
13d7432368 | ||
|
|
ed8d1040ba | ||
|
|
4f619c966b | ||
|
|
483b798863 | ||
|
|
b19bfc0dd3 | ||
|
|
8b2cf81f17 | ||
|
|
da17420cdf | ||
|
|
08c29727e0 | ||
|
|
45c6ac0208 | ||
|
|
7378871768 | ||
|
|
d3f155d895 | ||
|
|
075811e588 | ||
|
|
aa8840b423 | ||
|
|
58d7c4b388 | ||
|
|
1cd4731c2d | ||
|
|
a897ef0025 | ||
|
|
fb1443a885 | ||
|
|
05a432da32 | ||
|
|
404ab5e9ab | ||
|
|
901652d5c3 | ||
|
|
fde26d4049 | ||
|
|
b32bf22616 | ||
|
|
4bb805b5fe | ||
|
|
52731c480c | ||
|
|
f44ef3ad3f | ||
|
|
54319435f4 | ||
|
|
b064da8d38 | ||
|
|
ba5a55b754 | ||
|
|
bd2b107d37 | ||
|
|
4c84224d06 | ||
|
|
8e19c82e09 | ||
|
|
74d3aa582b | ||
|
|
85b136314b | ||
|
|
09bb713989 | ||
|
|
6466ffe82d | ||
|
|
8fc6011741 | ||
|
|
5092904ea3 | ||
|
|
3e24ae80b3 | ||
|
|
ffad7b0b29 | ||
|
|
d93bbfd486 | ||
|
|
32c241f51b | ||
|
|
690ceeeaa7 | ||
|
|
ea02da35d4 | ||
|
|
cea65599e6 | ||
|
|
6c329e8a83 | ||
|
|
5fa8370c13 | ||
|
|
96a28df018 | ||
|
|
ce41e3468e | ||
|
|
75064ed786 | ||
|
|
e08039a2bd | ||
|
|
108d66211f | ||
|
|
87d5fa054d | ||
|
|
5f4a77a324 | ||
|
|
8a940a2ee7 | ||
|
|
ac68c0c878 | ||
|
|
d5797c5439 | ||
|
|
bc35ca6366 | ||
|
|
d0fdc80725 | ||
|
|
df10b53c0c | ||
|
|
c2f9d60eb1 | ||
|
|
c4c7983497 | ||
|
|
1f06e5f0b9 | ||
|
|
daa217f533 | ||
|
|
e67505bead | ||
|
|
7ebafa53f6 | ||
|
|
e6ad48ea1b | ||
|
|
ba5a22e2ce | ||
|
|
f5241da836 | ||
|
|
8ab980b793 | ||
|
|
dcef1a5593 | ||
|
|
5df8fab463 | ||
|
|
b8817215dc | ||
|
|
375bef4443 | ||
|
|
0e7ab7a7d0 | ||
|
|
413ac86da2 | ||
|
|
f28a1c58f3 | ||
|
|
2f8d0e9aba | ||
|
|
bd4622a0d0 | ||
|
|
0f888ad4e6 | ||
|
|
9aeed0dc06 | ||
|
|
43535cf5a5 | ||
|
|
bf0e91cc97 | ||
|
|
fc78e70d08 | ||
|
|
aefcf544ca | ||
|
|
c93e38380a | ||
|
|
a10a79c6d0 | ||
|
|
0fd3f5c0dd | ||
|
|
61c0ca9dd9 | ||
|
|
e7599fd18c | ||
|
|
8d3eae0d76 | ||
|
|
ba1008b750 | ||
|
|
8558561650 | ||
|
|
f034d8ba3a | ||
|
|
8eb342ad3c | ||
|
|
d7fd0427f3 | ||
|
|
baee807837 | ||
|
|
c2e9cda7b3 | ||
|
|
4aa8fc753f | ||
|
|
635a1e9dd2 | ||
|
|
21e927d24e | ||
|
|
5f849d0264 | ||
|
|
671c0515d4 | ||
|
|
b5b8d9010e | ||
|
|
ea3d9c36a5 | ||
|
|
706bfa70c1 | ||
|
|
8e103c231e | ||
|
|
9569f51e83 | ||
|
|
6431c0de16 | ||
|
|
85799ee86e | ||
|
|
0993141334 | ||
|
|
46840ae375 | ||
|
|
59f0261dba | ||
|
|
7ad6a90ea2 | ||
|
|
574851f092 | ||
|
|
2d5eaed745 | ||
|
|
6adc35c636 | ||
|
|
6c5f923a47 | ||
|
|
d7c690b416 | ||
|
|
8eb9dac4bc | ||
|
|
2ff3a36675 | ||
|
|
e395a0eb69 | ||
|
|
36691df6fe | ||
|
|
790c7f80c7 | ||
|
|
155befe90e | ||
|
|
9347630d1e | ||
|
|
784b438d4a | ||
|
|
d2ae00ca44 | ||
|
|
8477126ae4 | ||
|
|
9c75546724 | ||
|
|
e1e1e558ce | ||
|
|
c37c93fcf6 | ||
|
|
35e282928a | ||
|
|
02f18cae0a | ||
|
|
4ff8e6e781 | ||
|
|
8e8b5a6481 | ||
|
|
200a10e78d | ||
|
|
9e93ddc097 | ||
|
|
3435e94994 | ||
|
|
fd1b7ba529 | ||
|
|
a4642f141f | ||
|
|
8f33b55ccc | ||
|
|
484c1484c9 | ||
|
|
cb6d5d76c8 | ||
|
|
47f1a92cc4 | ||
|
|
0953590cca | ||
|
|
411d573ba9 | ||
|
|
9dd6873e58 | ||
|
|
3f1fc332e7 | ||
|
|
bbf0007c46 | ||
|
|
6fa09e6a70 | ||
|
|
4f5d42858c | ||
|
|
83233ccc5a | ||
|
|
6888c3d604 | ||
|
|
35cee1e39c | ||
|
|
7e014174b8 | ||
|
|
aacdaee6a9 | ||
|
|
0e18e2ba78 | ||
|
|
a148b755a6 | ||
|
|
dfb23c4fce | ||
|
|
d30f8fffc8 | ||
|
|
19dd28e400 | ||
|
|
daf94e14d4 | ||
|
|
2eb518f59c | ||
|
|
0eb3fd6b3f | ||
|
|
6663c73eb0 | ||
|
|
bb5608e920 | ||
|
|
6495bd470d | ||
|
|
7accadc33f | ||
|
|
ad97a122c9 | ||
|
|
516695ff21 | ||
|
|
9d2b53450a | ||
|
|
de1258e09b | ||
|
|
2a4a539d86 | ||
|
|
a81bd697a8 | ||
|
|
2e0205a746 | ||
|
|
168a156e58 | ||
|
|
879ee61a30 | ||
|
|
c2f1df1d4a | ||
|
|
fb0921249f | ||
|
|
1828def866 | ||
|
|
dedc7f6f03 | ||
|
|
de0349399c | ||
|
|
b1b2698a84 | ||
|
|
9f0417b587 | ||
|
|
03460a3928 | ||
|
|
19c13c72f6 | ||
|
|
f20e8420a8 | ||
|
|
a7012648fe | ||
|
|
46b9f263ac | ||
|
|
540bdfcb02 | ||
|
|
6288f89bf9 | ||
|
|
6a16bdb808 | ||
|
|
5e09411340 | ||
|
|
f4c14b69a2 | ||
|
|
b4b52b8234 | ||
|
|
ed4b78918a | ||
|
|
6bee85fefa | ||
|
|
a37d4d809e | ||
|
|
3044697baa | ||
|
|
1e7c3fe709 | ||
|
|
333415f42a | ||
|
|
e3968ba872 | ||
|
|
58d56f91f3 | ||
|
|
0e8a8a7c80 | ||
|
|
fbd53f2da1 | ||
|
|
65aeaab054 | ||
|
|
94c12d84e2 | ||
|
|
a5f5e6c1ef | ||
|
|
61fd8b9861 | ||
|
|
f2246dfb34 | ||
|
|
b41b962336 | ||
|
|
5446841069 | ||
|
|
60bd3c809a | ||
|
|
fb5a8a089e | ||
|
|
9151ec7092 | ||
|
|
3633c51ad8 | ||
|
|
e3970f9cbb | ||
|
|
077757a30b | ||
|
|
211d626152 | ||
|
|
e8aab9183e | ||
|
|
10f3ea0008 | ||
|
|
88a785e321 | ||
|
|
d628fe0dea | ||
|
|
cbd3fa6b01 | ||
|
|
584cca59bf | ||
|
|
6cb48c6380 | ||
|
|
99be3ee96f | ||
|
|
c1c35e0f21 | ||
|
|
d8a497434f | ||
|
|
211829c586 | ||
|
|
2bb7c587f4 | ||
|
|
2187c0a84b | ||
|
|
c359d28b21 | ||
|
|
c1b384e5d3 | ||
|
|
8b67a1b26f | ||
|
|
c79ade9627 | ||
|
|
d61e95e4f9 | ||
|
|
68807f274e | ||
|
|
a805d401b8 | ||
|
|
2f52f073da | ||
|
|
c4cc9f9b8d | ||
|
|
6c401bc587 | ||
|
|
35160db268 | ||
|
|
5b0996fd80 | ||
|
|
585c03db72 | ||
|
|
613739ba07 | ||
|
|
947f659f96 | ||
|
|
8703c5bc00 | ||
|
|
43e1c0a2bf | ||
|
|
99e18d9cef | ||
|
|
718d9baead | ||
|
|
e2f4584220 | ||
|
|
4138073a2f | ||
|
|
1907323afc | ||
|
|
c39b94949b | ||
|
|
31bc88d16f | ||
|
|
5dbf40ca75 | ||
|
|
2d68b25025 | ||
|
|
1767681f9a | ||
|
|
0395c33982 | ||
|
|
83d3c9fc04 | ||
|
|
c184c1a81a | ||
|
|
31a617408f | ||
|
|
a6565bbea8 | ||
|
|
81cdceddd3 | ||
|
|
5b506499c1 | ||
|
|
62b76b26b4 | ||
|
|
b72837a0f4 | ||
|
|
c4f702b7c4 | ||
|
|
00cd01c89e | ||
|
|
eb0d18add4 | ||
|
|
585bdf45c8 | ||
|
|
89206d8654 | ||
|
|
a00e26b109 | ||
|
|
de17bdb130 | ||
|
|
3345f5d0d0 | ||
|
|
28837a8b30 | ||
|
|
96e688ea91 | ||
|
|
52f8707c3e | ||
|
|
b6e058985b | ||
|
|
bc9e3c7546 | ||
|
|
57fcbecb41 | ||
|
|
c4d0612e5c | ||
|
|
992dfcc4ce | ||
|
|
1e6492ef93 | ||
|
|
4c5aa8860a | ||
|
|
adc3b0e122 | ||
|
|
29d06760bc | ||
|
|
218843b9e4 | ||
|
|
25ad8866c9 | ||
|
|
2646d51a0b | ||
|
|
e88bfbc440 | ||
|
|
4e465ee04c | ||
|
|
1d446b74ff | ||
|
|
dae0f63e5b | ||
|
|
0779c89a65 | ||
|
|
b908d0b89b | ||
|
|
cadb5d51ea | ||
|
|
fcdc6a48c0 | ||
|
|
16aa0b93e9 | ||
|
|
158ea98189 | ||
|
|
962f9914c6 | ||
|
|
df8c4ce835 | ||
|
|
1b8face1a3 | ||
|
|
b4a44deb7b | ||
|
|
60a477a303 | ||
|
|
f8da754884 | ||
|
|
1688b2384f | ||
|
|
0c94c2b9e8 | ||
|
|
d3f6c8a694 | ||
|
|
e086e27f98 | ||
|
|
2f5d750393 | ||
|
|
b88e31b3f1 | ||
|
|
7c4f553acc | ||
|
|
4eb6aaf36f | ||
|
|
08edfaeae8 | ||
|
|
8081e9f189 | ||
|
|
0dac245b58 | ||
|
|
c7ba446c23 | ||
|
|
4b2495f28f | ||
|
|
11785c2bf4 | ||
|
|
4b9fece9f4 | ||
|
|
766176443d | ||
|
|
3552d073f6 | ||
|
|
49d3042bd3 | ||
|
|
701d141109 | ||
|
|
870593e345 | ||
|
|
5cf0e918b0 | ||
|
|
d7f38a0802 | ||
|
|
a77ce393ba | ||
|
|
f8ed1d182e | ||
|
|
68fcb790b0 | ||
|
|
8db1a5fae7 | ||
|
|
6bf70c86d2 | ||
|
|
b7d98fa873 | ||
|
|
daafe4ef37 | ||
|
|
ed1919b266 | ||
|
|
fdb2559425 | ||
|
|
ac545940de | ||
|
|
7a8cbcda06 | ||
|
|
8e79da3b2d | ||
|
|
1dac0041d5 | ||
|
|
43728fe7a0 | ||
|
|
e1f988b987 | ||
|
|
03fe30a774 | ||
|
|
c56df11128 | ||
|
|
6027eae1a1 | ||
|
|
bd482898d4 | ||
|
|
4417a6ee34 | ||
|
|
2a4f21cc92 | ||
|
|
8cc213ed4f | ||
|
|
4f519297dd | ||
|
|
4c4020babe | ||
|
|
ef31aa94f8 | ||
|
|
bc3260402a | ||
|
|
c5ed4e5cdf | ||
|
|
92d0d98a24 | ||
|
|
23fabf81d7 | ||
|
|
19112980ee | ||
|
|
8eca775977 | ||
|
|
c3971957ac | ||
|
|
9a7b2b190b | ||
|
|
6f2f0cfce2 | ||
|
|
3a249bb549 | ||
|
|
1a12071a48 | ||
|
|
b7fb11cb7f | ||
|
|
95c30f7a23 | ||
|
|
d5fe5c02a8 | ||
|
|
759b45ad79 | ||
|
|
1363c7468d | ||
|
|
834ebef53c | ||
|
|
bb932a0a0a | ||
|
|
f23c2beb61 | ||
|
|
994aba075d | ||
|
|
979b94e274 | ||
|
|
076ebf8cee | ||
|
|
6eea3992b3 | ||
|
|
6969cfab3d | ||
|
|
1a3bcf63bc | ||
|
|
814cb51eb5 | ||
|
|
d6d3977f3d | ||
|
|
c9ddad94a9 | ||
|
|
172f1e1b5f | ||
|
|
b257e79a07 | ||
|
|
f029e04047 | ||
|
|
6aa2cbe807 | ||
|
|
ad72421b2c | ||
|
|
594b460ba2 | ||
|
|
0a6f62358b | ||
|
|
8c707a4e2f | ||
|
|
7188d94c1b | ||
|
|
836b6bea73 | ||
|
|
8a6f26ff9b | ||
|
|
7143512198 | ||
|
|
5306fce16e | ||
|
|
fb1a7d9d73 | ||
|
|
482cfca84f | ||
|
|
e29d200ba5 | ||
|
|
43c7ababf9 | ||
|
|
baa6971a46 | ||
|
|
aefe084124 | ||
|
|
c68f8f3418 | ||
|
|
aa5291c6bd | ||
|
|
f045d9b143 | ||
|
|
666dcd78ba | ||
|
|
70ee7650f3 | ||
|
|
aa974b58bc | ||
|
|
6c8518dd10 | ||
|
|
346d918555 | ||
|
|
8104854d5d | ||
|
|
b4b5c2188f | ||
|
|
a0eef2663a | ||
|
|
f5dfebb6a3 | ||
|
|
2b7ffca414 | ||
|
|
96b3e1ce1b | ||
|
|
ce719a700c | ||
|
|
4280df3aa2 | ||
|
|
b73bf53bd3 | ||
|
|
d90169e79b | ||
|
|
fea798011b | ||
|
|
f17a71de74 | ||
|
|
0212314479 | ||
|
|
16c34b387f | ||
|
|
d65c63322e | ||
|
|
6943536ef3 | ||
|
|
7322c9c591 | ||
|
|
dfaefb97ff | ||
|
|
0a0acc8a2e | ||
|
|
a8837f537f | ||
|
|
ef67fc7ba0 | ||
|
|
83c0f43b33 | ||
|
|
17672b08c6 | ||
|
|
dc1f2fbb4c | ||
|
|
2d90859cab | ||
|
|
d325b4bf39 | ||
|
|
1d64c480c4 | ||
|
|
9f7334deef | ||
|
|
3dbefd08ad | ||
|
|
1a5d0fc47f | ||
|
|
17b6936f53 | ||
|
|
c5bcc4567e | ||
|
|
ce360bcfe3 | ||
|
|
789657456a | ||
|
|
7b3d93f4a1 | ||
|
|
3868203c76 | ||
|
|
e5bfdcd9a4 | ||
|
|
b7f13b4685 | ||
|
|
c2c4fbf206 | ||
|
|
bf86a92596 | ||
|
|
53fc9a4002 | ||
|
|
a8a9ac0dae | ||
|
|
3b53abecd0 | ||
|
|
3f12f75853 | ||
|
|
917c727619 | ||
|
|
6336288da1 | ||
|
|
3e0ff6db2a | ||
|
|
5db811253e | ||
|
|
e31a93040e | ||
|
|
8e55f7154b | ||
|
|
71d3357b71 | ||
|
|
3eafb3520f | ||
|
|
e50d104399 | ||
|
|
45dfa2d864 | ||
|
|
c2024a6a94 | ||
|
|
32d54e37f7 | ||
|
|
2bbad22248 | ||
|
|
22493c9df8 | ||
|
|
8d97a85834 | ||
|
|
e7d18b96f9 | ||
|
|
1854ef9823 | ||
|
|
c9577394eb | ||
|
|
0918ad6cee | ||
|
|
d3bcee9e2e | ||
|
|
1055864438 | ||
|
|
be0d9d093c | ||
|
|
bb491742ea | ||
|
|
46fbfaaa83 | ||
|
|
09bd938e25 | ||
|
|
d5f3a09ce9 | ||
|
|
036a29acf5 | ||
|
|
3e7dfd7f5e | ||
|
|
f21d826850 | ||
|
|
8e3e286577 | ||
|
|
f4b4e5b41f | ||
|
|
4a05d56337 | ||
|
|
73708061fc | ||
|
|
55abe105ea | ||
|
|
0006d23df8 | ||
|
|
df3da55602 | ||
|
|
13479fbc2a | ||
|
|
226cdc6a28 | ||
|
|
b13f0701a4 | ||
|
|
4c2cc384d2 | ||
|
|
2971887bbd | ||
|
|
b776327b9d | ||
|
|
b7e991c4b7 | ||
|
|
9788566ba4 | ||
|
|
233c443694 | ||
|
|
35bbc1d7b7 | ||
|
|
4e5e04bfda | ||
|
|
c0e8ad6f1f | ||
|
|
3472a39d07 | ||
|
|
9865a8c807 | ||
|
|
35e769d494 | ||
|
|
6e3ea5b2ea | ||
|
|
54f215294f | ||
|
|
f6f982226a | ||
|
|
98b33d7b6b | ||
|
|
86471ac21f | ||
|
|
57e22e87c2 | ||
|
|
0b3406bdc0 | ||
|
|
74cd977566 | ||
|
|
d9d2f61ba6 | ||
|
|
434eabb787 | ||
|
|
e8605cb3ef | ||
|
|
1bdf06836a | ||
|
|
0a99772572 | ||
|
|
2ffb47eba2 | ||
|
|
b208d752e2 | ||
|
|
ec74479d44 | ||
|
|
e75108fc4c | ||
|
|
176e34cf73 | ||
|
|
65415cb761 | ||
|
|
45bf843b03 | ||
|
|
610a5926a8 | ||
|
|
3b0f9911e2 | ||
|
|
55a2945449 | ||
|
|
16061d06a9 | ||
|
|
aeaacedf75 | ||
|
|
bec6d5c174 | ||
|
|
d98b6f2434 | ||
|
|
3ffbf9a7ea | ||
|
|
c481137b40 | ||
|
|
9f0b077295 | ||
|
|
5f2feee680 | ||
|
|
9ecd73d956 | ||
|
|
b9b39f7c31 | ||
|
|
37f4cbe3d7 | ||
|
|
126c8c14b8 | ||
|
|
3992315505 | ||
|
|
eb4e4fa7ad | ||
|
|
71e38dec11 | ||
|
|
11376ae25b | ||
|
|
dd245f62f0 | ||
|
|
aa37b40d93 | ||
|
|
8eccf8a6f7 | ||
|
|
7376639789 | ||
|
|
2334374fd6 | ||
|
|
f086bc9564 | ||
|
|
c30de8add4 | ||
|
|
de3cb6b374 | ||
|
|
4c8fdf6e90 | ||
|
|
1a41f908d3 | ||
|
|
95908aa2bc | ||
|
|
a19f4dd4c8 | ||
|
|
eadd4d9b71 | ||
|
|
4f3ff3d77f | ||
|
|
5bb81461f6 | ||
|
|
871a2088db | ||
|
|
abeaac6632 | ||
|
|
d591cebf44 | ||
|
|
8abb19aaca | ||
|
|
bcc937e4e0 | ||
|
|
915d92019c | ||
|
|
f24d5cb5f0 | ||
|
|
79c22c76bf | ||
|
|
20e96df85d | ||
|
|
be51fe944d | ||
|
|
54d1d98e39 | ||
|
|
6f92781992 | ||
|
|
c1bd3b5824 | ||
|
|
fb615843b3 | ||
|
|
c6d808a0d8 | ||
|
|
4f12821ca8 | ||
|
|
4fcda28d9b | ||
|
|
1883e051ba | ||
|
|
4825afbf58 | ||
|
|
ad8c7b9d0b | ||
|
|
7eb88ed7dc | ||
|
|
6afd0d8add | ||
|
|
bfe142fef0 | ||
|
|
54e626f665 | ||
|
|
f296471726 | ||
|
|
b2e8967e94 | ||
|
|
d83ef07ca7 | ||
|
|
e70ed961ea | ||
|
|
7216e36cb1 | ||
|
|
10a60b6ec2 | ||
|
|
054fb22854 | ||
|
|
b34127e346 | ||
|
|
be70ea7d49 | ||
|
|
1ef178c5e6 | ||
|
|
56399b9aa3 | ||
|
|
a79c7495c8 | ||
|
|
b13ee9da2a | ||
|
|
f86ee20579 | ||
|
|
f7e8f8031d | ||
|
|
18a116394d | ||
|
|
094948db51 | ||
|
|
18c7e97ecc | ||
|
|
c8ac48ff9a | ||
|
|
fa4ec55c96 | ||
|
|
a02d4dc27c | ||
|
|
31c75e747c | ||
|
|
8a1a446f45 | ||
|
|
7fe8a63f53 | ||
|
|
48874294d6 | ||
|
|
f5093f1625 | ||
|
|
4bc8cf1a1a | ||
|
|
527c932e93 | ||
|
|
cba3db6205 | ||
|
|
3b798b1733 | ||
|
|
f898d82536 | ||
|
|
3b5aab6edb | ||
|
|
11c8a47d22 | ||
|
|
b2323ca203 | ||
|
|
2c648c80c8 | ||
|
|
b8d9ba993d | ||
|
|
3810ef47f7 | ||
|
|
bbbadbcb78 | ||
|
|
c0acc98faa | ||
|
|
9828d787fa | ||
|
|
53456b5fc3 | ||
|
|
73a5e2bc6b | ||
|
|
9a2ac5fcb6 | ||
|
|
025b45b91e | ||
|
|
31d1e04301 | ||
|
|
a828f90d38 | ||
|
|
00556734bc | ||
|
|
b231ab7238 | ||
|
|
2587bbc4a7 | ||
|
|
40df11b162 | ||
|
|
a66d44054c | ||
|
|
e9fcbb334e | ||
|
|
babc6f0f9c | ||
|
|
bffeb664cc | ||
|
|
b85a8bbbfe | ||
|
|
925f451773 | ||
|
|
8bf1e694fe | ||
|
|
c5bc221b27 | ||
|
|
7f28acc5ed | ||
|
|
f36d2ff55f | ||
|
|
396e01a0e0 | ||
|
|
787c1304c6 | ||
|
|
d92c08c9bb | ||
|
|
bd3b4e03e9 | ||
|
|
cb5511c8db | ||
|
|
54b6a1c08e | ||
|
|
8cc154bc48 | ||
|
|
ab6d9ad521 | ||
|
|
5e1c71b059 | ||
|
|
f3695b95fc | ||
|
|
32a3e15309 | ||
|
|
0661553484 | ||
|
|
5f080fcfc9 | ||
|
|
a21e44c155 | ||
|
|
60089f9750 | ||
|
|
5043b9d06e | ||
|
|
a17b9fdaba | ||
|
|
2f3123e175 | ||
|
|
17c756971a | ||
|
|
f71e877f18 | ||
|
|
d6c97a6a13 | ||
|
|
e0e732523e | ||
|
|
47b9993469 | ||
|
|
7bfad18ec7 | ||
|
|
b0504f7739 | ||
|
|
67ed58b0ba | ||
|
|
a815e6ca14 | ||
|
|
b59904632d | ||
|
|
c1b9b27f86 | ||
|
|
2b87705a46 | ||
|
|
34faf7638e | ||
|
|
5e555fc1cf | ||
|
|
cb5d36d89f | ||
|
|
e2f16ec20e | ||
|
|
b615534d8d | ||
|
|
93d57bd73a | ||
|
|
60798798ef | ||
|
|
81696c16d2 | ||
|
|
89c504daf6 | ||
|
|
5a2287c52f | ||
|
|
a65a288eca | ||
|
|
cf80baa2d8 | ||
|
|
871a822379 | ||
|
|
b9b6b6108e | ||
|
|
3a2ba60b70 | ||
|
|
aa76f64a94 | ||
|
|
e34a8da5d7 | ||
|
|
6157a9a858 | ||
|
|
6b92c4867d | ||
|
|
3bd6eab88f | ||
|
|
3a3a9f5cc1 | ||
|
|
f87268e2ac | ||
|
|
5238ed309f | ||
|
|
6347988e0a | ||
|
|
b92acd3cf2 | ||
|
|
fd96bafbc8 | ||
|
|
b7e16cb0dd | ||
|
|
459df23931 | ||
|
|
e7b22a7ed2 | ||
|
|
bcbe91461e | ||
|
|
b68410d619 | ||
|
|
602e9cebd9 | ||
|
|
d2049edcab | ||
|
|
83322f63c6 | ||
|
|
f0a2f24701 | ||
|
|
97f1a8fe91 | ||
|
|
0ac9f159d6 | ||
|
|
a3f8e27bf8 | ||
|
|
b55c13f275 | ||
|
|
761651d410 | ||
|
|
70548f7cc7 | ||
|
|
f6ab0b4d07 | ||
|
|
bc8a34f8df | ||
|
|
8f0cd5508d | ||
|
|
a151c3f892 | ||
|
|
5b9135a698 | ||
|
|
db5c02fbfc | ||
|
|
938da3039d | ||
|
|
cfeae48b83 | ||
|
|
50f18ddaad | ||
|
|
2874650802 | ||
|
|
1271de321e | ||
|
|
a265ee6f6f | ||
|
|
e196203320 | ||
|
|
33d062cb60 | ||
|
|
53bcd4b1ab | ||
|
|
385f961b29 | ||
|
|
eada714a0a | ||
|
|
66f11e9bd3 | ||
|
|
158d3cc743 | ||
|
|
07c109fad8 | ||
|
|
618a4b42ad | ||
|
|
e2c81e54e2 | ||
|
|
e56f0628d5 | ||
|
|
546ba888ae | ||
|
|
9b2a17eb1e | ||
|
|
a7ecc0db1f | ||
|
|
bc7eb39781 | ||
|
|
299a383d98 | ||
|
|
75515af537 | ||
|
|
b1ed15a07a | ||
|
|
9dc6ef6771 | ||
|
|
a6a16808e3 | ||
|
|
aee71b594b | ||
|
|
6e3231a9d7 | ||
|
|
85dad6913e | ||
|
|
deacec07bf | ||
|
|
958880d972 | ||
|
|
78af59f40c | ||
|
|
c59f5e9f01 | ||
|
|
c9349f2ef6 | ||
|
|
4ebaa7b6bd | ||
|
|
618896c043 | ||
|
|
0dbd83ffaf | ||
|
|
3929e9de0e | ||
|
|
f4d1657c22 | ||
|
|
caab298f72 | ||
|
|
0d0b2ce9b3 | ||
|
|
16ad5d3a2e | ||
|
|
92e9297a15 | ||
|
|
ac72db8ef0 | ||
|
|
9b4e365517 | ||
|
|
c0cefde5d1 | ||
|
|
1786a7cdc4 | ||
|
|
a91e8887cd | ||
|
|
d3a0372e89 | ||
|
|
793e1afa08 | ||
|
|
78162a2a13 | ||
|
|
30ea4fc416 | ||
|
|
d1d36cc9af | ||
|
|
b2a97e4245 | ||
|
|
b32f770a69 | ||
|
|
78d4f22ce4 | ||
|
|
3925929979 | ||
|
|
60fdd71f74 | ||
|
|
b4f53143b0 | ||
|
|
9c2fdc6da5 | ||
|
|
821e8ec59a | ||
|
|
4401abb166 | ||
|
|
27be004c64 | ||
|
|
6c668868e9 | ||
|
|
6add8a7df9 | ||
|
|
7fa69ef8be | ||
|
|
f77f71c17e | ||
|
|
749b9182ab | ||
|
|
3b0805f4d7 | ||
|
|
0c1485c325 | ||
|
|
86554d66d0 | ||
|
|
6475d763d0 | ||
|
|
7add4d5782 | ||
|
|
f70b1ffbbf | ||
|
|
8a9b7dc63a | ||
|
|
3f30096727 | ||
|
|
52ff997bf0 | ||
|
|
08911e2dcc | ||
|
|
dd4639e5db | ||
|
|
2109af0987 | ||
|
|
68bbe13d23 | ||
|
|
b1a0498ff9 | ||
|
|
882f4714ac | ||
|
|
e7273e1d81 | ||
|
|
f359ded336 | ||
|
|
ff4b1104a2 | ||
|
|
a550695cba | ||
|
|
9438d33358 | ||
|
|
e35a2450d9 | ||
|
|
616d848fac | ||
|
|
a4b17b162c | ||
|
|
9fd6b5e1e2 | ||
|
|
466806fb11 | ||
|
|
97edc96afd | ||
|
|
8b14f1050d | ||
|
|
9cf2bb18c2 | ||
|
|
4b8febd44e | ||
|
|
d49f6e1b29 | ||
|
|
1e32f9431d | ||
|
|
4a3cda1495 | ||
|
|
05daedf7c6 | ||
|
|
f07d59c55d | ||
|
|
b057efdb37 | ||
|
|
7954b95f5d | ||
|
|
ebf91d59c7 | ||
|
|
0effcf6df1 | ||
|
|
e752ac3035 | ||
|
|
a5fabc6875 | ||
|
|
506720003d | ||
|
|
8ca21767fe | ||
|
|
e60db8075c | ||
|
|
0f3306870b | ||
|
|
a1b86749cf | ||
|
|
25d19f7d63 | ||
|
|
ae58809c9f | ||
|
|
322a611872 | ||
|
|
976ce1e8fd | ||
|
|
6ec58a20c0 | ||
|
|
ecb2da3142 | ||
|
|
ad237136e7 | ||
|
|
a4d6a104a6 | ||
|
|
a150ae76ac | ||
|
|
4621e763b6 | ||
|
|
8db162e048 | ||
|
|
7d94b7fd1b | ||
|
|
d79a72d722 | ||
|
|
d018ef39e1 | ||
|
|
781bbe217a | ||
|
|
4115a2f2d1 | ||
|
|
064ad7b981 | ||
|
|
767742c7e7 | ||
|
|
6fbb3c9976 | ||
|
|
7b34aaa432 | ||
|
|
5c6143d8e9 | ||
|
|
0ddd0ed4fb | ||
|
|
2d1331e104 | ||
|
|
9223b643b6 | ||
|
|
ea407476d0 | ||
|
|
f3560b8e62 | ||
|
|
18d7465592 | ||
|
|
b6b6de3304 | ||
|
|
79a6961793 | ||
|
|
ec7dd1ece8 | ||
|
|
cdfb425ac4 | ||
|
|
cb984cf761 | ||
|
|
7efbcc039d | ||
|
|
6c53862ff1 | ||
|
|
d31eceddaf | ||
|
|
3a190bbe49 | ||
|
|
5c4acc8ee1 | ||
|
|
92a9ba478b | ||
|
|
71a5db6961 | ||
|
|
013d91d4ee | ||
|
|
8e0c1c70ce | ||
|
|
bfbeca8b6c | ||
|
|
c0cf25cf0b | ||
|
|
edf6a951ee | ||
|
|
412a42246f | ||
|
|
781b61d074 | ||
|
|
1c99ef5b6e | ||
|
|
2008415106 | ||
|
|
386d6a77f2 | ||
|
|
a83323705d | ||
|
|
29d22e4e8b | ||
|
|
286c60bc9d | ||
|
|
c26d317da5 | ||
|
|
534fd1a59e | ||
|
|
49b49d7ed4 | ||
|
|
14bf2ee5cb | ||
|
|
cec1dc2095 | ||
|
|
9b5026f7e5 | ||
|
|
96dfd27725 | ||
|
|
905d8b2aa5 | ||
|
|
3ca518255e | ||
|
|
c59119e0b7 | ||
|
|
0748a4d8b6 | ||
|
|
3722f91e38 | ||
|
|
ba721d6cbf | ||
|
|
5532e5aa8a | ||
|
|
9cae8bf8a6 | ||
|
|
cb92a1d12f | ||
|
|
1242e63b6a | ||
|
|
f30872a7b5 | ||
|
|
9c3a9a1e73 | ||
|
|
c91f70523c | ||
|
|
3d9c24196d | ||
|
|
6f438f65de | ||
|
|
879d03d0fe | ||
|
|
7a1fc028e3 | ||
|
|
c3ef23b10f | ||
|
|
722fedc8fd | ||
|
|
32936b0eb9 | ||
|
|
3559f20c8f | ||
|
|
9dc53f7c1b | ||
|
|
9c007d1c94 | ||
|
|
6faac2d2c8 | ||
|
|
665314b240 | ||
|
|
cb1e3c501d | ||
|
|
9e8e5af064 | ||
|
|
fd731fb74f | ||
|
|
d1a56139e1 | ||
|
|
3408b2759e | ||
|
|
fbe28fd5d8 | ||
|
|
97aa1c033b | ||
|
|
34296dd440 | ||
|
|
87428672d8 | ||
|
|
84899fb2f8 | ||
|
|
73f344f41b | ||
|
|
9f8cec7f9e | ||
|
|
318daaffb2 | ||
|
|
cad1dc5293 | ||
|
|
900a8a1408 | ||
|
|
384cb2d735 | ||
|
|
ad61c3f0d6 | ||
|
|
c10aab77da | ||
|
|
e17f6fb2dc | ||
|
|
e896acffd7 | ||
|
|
20a6b65b25 | ||
|
|
01026c137f | ||
|
|
7aac3db55c | ||
|
|
0ecf294d34 | ||
|
|
89da09636e | ||
|
|
f8299a1274 | ||
|
|
94e9d6a5ef | ||
|
|
733108e33b | ||
|
|
48d353610f | ||
|
|
bff68f3bfc | ||
|
|
b9bd0166b6 | ||
|
|
1116929d2f | ||
|
|
22103e4849 | ||
|
|
e421c12cc4 | ||
|
|
5a9b1b1b57 | ||
|
|
d99ed89aa3 | ||
|
|
b9dd057a04 | ||
|
|
369a09e57e | ||
|
|
468648ff51 | ||
|
|
8c41a053fe | ||
|
|
a1b3358cb8 | ||
|
|
16e65c849c | ||
|
|
33c0d93b20 | ||
|
|
3d163eb910 | ||
|
|
3e32715693 | ||
|
|
388a8d09d8 | ||
|
|
b4aa2b7c2c | ||
|
|
dd595dd110 | ||
|
|
95687a03fb | ||
|
|
b3aa187867 | ||
|
|
b5d9e366ad | ||
|
|
d7ba6e4a1d | ||
|
|
981a71555f | ||
|
|
597dda5a4b | ||
|
|
66acd17bc0 | ||
|
|
793784c087 | ||
|
|
df6f1e8f62 | ||
|
|
facfe33218 | ||
|
|
78dfc57b1e | ||
|
|
d17ba69f9e | ||
|
|
5c16b5598b | ||
|
|
028d9e8e3b | ||
|
|
53a4814d8b | ||
|
|
1ff9aba6b1 | ||
|
|
39748870b6 | ||
|
|
b0cbad84f4 | ||
|
|
f920be5ea3 | ||
|
|
f9384fe323 | ||
|
|
789a54222d | ||
|
|
68efa5233c | ||
|
|
dce487380c | ||
|
|
75a76c596c | ||
|
|
7164769d33 | ||
|
|
9e3f912747 | ||
|
|
e529b78365 | ||
|
|
9374494d2b | ||
|
|
2018b9b217 | ||
|
|
3c0902b7e4 | ||
|
|
b31305b9bd | ||
|
|
d4eded2376 | ||
|
|
20974edc14 | ||
|
|
6e2132e01f | ||
|
|
34db67680d | ||
|
|
7864d0d416 | ||
|
|
d1feb9bcbf | ||
|
|
906d235601 | ||
|
|
e045eabad6 | ||
|
|
218bd7a687 | ||
|
|
70a99e494d | ||
|
|
e340baf6cc | ||
|
|
182faca2e5 | ||
|
|
14834ff076 | ||
|
|
a0127a0c7a | ||
|
|
390fe05a87 | ||
|
|
b9ff17f33c | ||
|
|
5f2ea007a5 | ||
|
|
e5a2343879 | ||
|
|
8d50b2509d | ||
|
|
a76afd6dae | ||
|
|
77a7dd82a9 | ||
|
|
04651105a8 | ||
|
|
d300bd4b62 | ||
|
|
a21db45cee | ||
|
|
2e948d9d6d | ||
|
|
6fa9a18a2b | ||
|
|
da2e2c2e99 | ||
|
|
8ba0ab2172 | ||
|
|
96589920d5 | ||
|
|
8c17d48c83 | ||
|
|
d458a8a03d | ||
|
|
39fe9fcfcd | ||
|
|
bf80b0db19 | ||
|
|
ebfaa8cc95 | ||
|
|
46cd89c2db | ||
|
|
8124b5073f | ||
|
|
a4e81d3978 | ||
|
|
147078f43d | ||
|
|
90629caa61 | ||
|
|
9cec0ad02c | ||
|
|
11bece80a8 | ||
|
|
a10f729ef9 | ||
|
|
b9db555343 | ||
|
|
9b43e6fa8b | ||
|
|
1edb7d3aa5 | ||
|
|
14fde56d32 | ||
|
|
a8059c5962 | ||
|
|
381404c4f4 | ||
|
|
68029095b5 | ||
|
|
9a34df604d | ||
|
|
2f96d2b19a | ||
|
|
bfd1951023 | ||
|
|
019c0fed23 | ||
|
|
bb01e5f81a | ||
|
|
8526a82947 | ||
|
|
94a3203c74 | ||
|
|
184110c2e7 | ||
|
|
3b3fde1c5e | ||
|
|
60a2e0a2ad | ||
|
|
c78e56c509 | ||
|
|
190cac07a3 | ||
|
|
efc3846fcf | ||
|
|
83df5ea660 | ||
|
|
e13d423b68 | ||
|
|
eafd577629 | ||
|
|
196a7c9d18 | ||
|
|
daa856ed47 | ||
|
|
04dc0aca50 | ||
|
|
918d5595bd | ||
|
|
0abdf9eeff | ||
|
|
8e8549ef7a | ||
|
|
cfc2d7fb3f | ||
|
|
c77f8e73c8 | ||
|
|
dda6be2592 | ||
|
|
93eea8de66 | ||
|
|
2ddd839f52 | ||
|
|
7555772432 | ||
|
|
33f9e071a4 | ||
|
|
9aaf93f364 | ||
|
|
14fa48864a | ||
|
|
206ea15b68 | ||
|
|
a7bab7b18b | ||
|
|
a6a41d159c | ||
|
|
59da180b8f | ||
|
|
51e446bc5f | ||
|
|
f68f91b399 | ||
|
|
0ea80a319e | ||
|
|
38caa0d988 | ||
|
|
7c2a420e88 | ||
|
|
d944add782 | ||
|
|
338a1311f5 | ||
|
|
00e0ed64bc | ||
|
|
f2447c537e | ||
|
|
220a15b8f6 | ||
|
|
330e996c30 | ||
|
|
32c0afe5a9 | ||
|
|
e83441395e | ||
|
|
43d23ee56e | ||
|
|
58a0f7f091 | ||
|
|
09bac97bb4 | ||
|
|
701a37fd00 | ||
|
|
9d7fbd2cc0 | ||
|
|
32010d1d93 | ||
|
|
75860db511 | ||
|
|
4d588a24e9 | ||
|
|
9382dc32df | ||
|
|
6db82c162c | ||
|
|
c31ad3ed07 | ||
|
|
c33a3862cc | ||
|
|
6cc64fc9e3 | ||
|
|
aafff91ac8 | ||
|
|
4b6639f697 | ||
|
|
fa588db148 | ||
|
|
851f0bcfb3 | ||
|
|
d9d9fa512d | ||
|
|
84372ba79d | ||
|
|
7ac593273e | ||
|
|
a529fc9d83 | ||
|
|
173a6a71c0 | ||
|
|
a177eb8c16 | ||
|
|
16459099af | ||
|
|
fa854d7a01 | ||
|
|
b3b83449cf | ||
|
|
d62694a9ce | ||
|
|
6044ac7e5e | ||
|
|
ec5f3d0cc8 | ||
|
|
f03d90e9de | ||
|
|
a31b44f9b2 | ||
|
|
a580d04dbc | ||
|
|
c84cdcd00c | ||
|
|
5638764bad | ||
|
|
ab7af98ded | ||
|
|
b0e09303a6 | ||
|
|
a242a64833 | ||
|
|
315ff1e712 | ||
|
|
21a751d153 | ||
|
|
090f027de1 | ||
|
|
cfa41686d2 | ||
|
|
3fe1069219 | ||
|
|
98091faeaf | ||
|
|
15e095233b | ||
|
|
a64c372a28 | ||
|
|
1f91a2a6f5 | ||
|
|
4aa38db56f | ||
|
|
9e32b330aa | ||
|
|
049bd227ed | ||
|
|
ff7108877b | ||
|
|
1927ebbc5d | ||
|
|
5db9548f40 | ||
|
|
cab115c8b9 | ||
|
|
4568359e27 | ||
|
|
07e4170418 | ||
|
|
0372cdbe7e | ||
|
|
5d1ddc9c58 | ||
|
|
c0b8e81b02 | ||
|
|
c3bacc78c7 | ||
|
|
4140e678f4 | ||
|
|
cc0fcdc18d | ||
|
|
fbade198b9 | ||
|
|
d982f2a575 | ||
|
|
becdc8b4fc | ||
|
|
76c6985f82 | ||
|
|
ac8c5910eb | ||
|
|
cc7f1755aa | ||
|
|
7493c9a040 | ||
|
|
9fc8729b96 | ||
|
|
80859b8483 | ||
|
|
71c55e1a4a | ||
|
|
d2f23e1df4 | ||
|
|
c70769c656 | ||
|
|
a13e067b85 | ||
|
|
8e8e63144b | ||
|
|
14724401ff | ||
|
|
72f5ab3186 | ||
|
|
3f0210dc96 | ||
|
|
3c8b344a41 | ||
|
|
46241e383f | ||
|
|
ea79f6b03f | ||
|
|
649c3f262d | ||
|
|
f85ec782a0 | ||
|
|
9df0bcea99 | ||
|
|
7764a1a6f8 | ||
|
|
980bf6e2f4 | ||
|
|
501c3d5518 | ||
|
|
6a0931aeae | ||
|
|
d7b3821c0a | ||
|
|
1665f84d60 | ||
|
|
fabee7e246 | ||
|
|
0ffa434926 | ||
|
|
a7727765dc | ||
|
|
33a76e1f8e | ||
|
|
cfc06203e7 | ||
|
|
6d7a7b00d7 | ||
|
|
3f11d90744 | ||
|
|
ae7b6156ac | ||
|
|
4ba95ad1c3 | ||
|
|
bae2b2cc47 | ||
|
|
47c357a354 | ||
|
|
b592da41f6 | ||
|
|
646d9ab431 | ||
|
|
43e451d4d8 | ||
|
|
1be5e68e99 | ||
|
|
ab5b22982f | ||
|
|
5157ac30fa | ||
|
|
3616dd5889 | ||
|
|
489fb7ec3f | ||
|
|
51527612d3 | ||
|
|
c181de1d7f | ||
|
|
d67800bbce | ||
|
|
27dd37ebb4 | ||
|
|
a186f04f15 | ||
|
|
15ca3b426f | ||
|
|
1c9aec4899 | ||
|
|
f0d8d90ed1 | ||
|
|
6ece8523b1 | ||
|
|
84af3dcd18 | ||
|
|
26051ea198 | ||
|
|
b00cbae4b5 | ||
|
|
4f4734fc9b | ||
|
|
3ac28f2b01 | ||
|
|
2f71c15b93 | ||
|
|
7cad0069e8 | ||
|
|
a0e5cdd178 | ||
|
|
ba11a0eb9b | ||
|
|
b511550917 | ||
|
|
7935b86cb2 | ||
|
|
fb8eb22e56 | ||
|
|
6925cd5d88 | ||
|
|
35595dbffd | ||
|
|
cd4fa518b8 | ||
|
|
316d7004a3 | ||
|
|
1096b1acd5 | ||
|
|
5766c7c53a | ||
|
|
bbce0909fe | ||
|
|
73158d6255 | ||
|
|
0986b6d991 | ||
|
|
c4a453fb22 | ||
|
|
1563501868 | ||
|
|
5f82f721d2 | ||
|
|
8d03baa4e0 | ||
|
|
a9b7e4582f | ||
|
|
2726712e01 | ||
|
|
8d3d51a020 | ||
|
|
5afd42c097 | ||
|
|
5b33e60752 | ||
|
|
80078491bd | ||
|
|
0a3f220572 | ||
|
|
5eee7d17f6 | ||
|
|
4718636ae2 | ||
|
|
2cd7f1443c | ||
|
|
7a9e2d733a | ||
|
|
4ed4b265a5 | ||
|
|
e689a38663 | ||
|
|
e5aa06991e | ||
|
|
cb40507b7b | ||
|
|
7d7a636f24 | ||
|
|
2450d00693 | ||
|
|
a4059d3e60 | ||
|
|
fe9cf673a2 | ||
|
|
b480c8ce79 | ||
|
|
94e535507c | ||
|
|
a027566295 | ||
|
|
e1f623f548 | ||
|
|
4573a4d69c | ||
|
|
a012aedb31 | ||
|
|
a9c8b75599 | ||
|
|
c64f38f0bf | ||
|
|
8f8c4cdd17 | ||
|
|
f889ad0fda | ||
|
|
166a2f91bd | ||
|
|
a069aec11d | ||
|
|
8a3cf144f2 | ||
|
|
a381ac2691 | ||
|
|
e2be71cbe4 | ||
|
|
b8181f9eb8 | ||
|
|
555ff00a30 | ||
|
|
6083c6fc72 | ||
|
|
940f264ee6 | ||
|
|
761be8ab7f | ||
|
|
51c2005ea2 | ||
|
|
510ff6a689 | ||
|
|
7229d7a326 | ||
|
|
1a7b33e8fb | ||
|
|
2d3f7babe3 | ||
|
|
0a32d96b27 | ||
|
|
174f5ba99a | ||
|
|
708e21f929 | ||
|
|
eb40baacfc | ||
|
|
133ba6e01b | ||
|
|
7f4908b0db | ||
|
|
9bfb4f1e11 | ||
|
|
ea435d35ad | ||
|
|
5b709eb5df | ||
|
|
5c25be51ea | ||
|
|
f6da9d4d5d | ||
|
|
f22864b813 | ||
|
|
22fd8e65ad | ||
|
|
190712d4b0 | ||
|
|
efb1467e4e | ||
|
|
6b75a4593b | ||
|
|
a04d5fd065 | ||
|
|
8643a5e266 | ||
|
|
47f97bbdd5 | ||
|
|
2e034e767f | ||
|
|
aed92b9a2c | ||
|
|
482e615fe0 | ||
|
|
cb46ed3701 | ||
|
|
9c78295a9a | ||
|
|
15cf06438e | ||
|
|
93b296d899 | ||
|
|
6e133c90e8 | ||
|
|
f1bd2b823d | ||
|
|
ac92f54ca6 | ||
|
|
1b4c85eb69 | ||
|
|
fb792c60cd | ||
|
|
38e153f568 | ||
|
|
6821f5ef4a | ||
|
|
ab433cfe65 | ||
|
|
6a57a50968 | ||
|
|
cb9ef98bed | ||
|
|
89f0b9abc3 | ||
|
|
0e5ddfd9f5 | ||
|
|
0a249c84ce | ||
|
|
fd70ae0b61 | ||
|
|
76aeae5db6 | ||
|
|
1facdd30fb | ||
|
|
4b7dc525b8 | ||
|
|
4acea72700 | ||
|
|
cf688f6ba2 | ||
|
|
5f3b0d9f1e | ||
|
|
05848038db | ||
|
|
664e2e5686 | ||
|
|
adbcecb456 | ||
|
|
3df9e20ca7 | ||
|
|
3f005c928a | ||
|
|
b3e28ac41a | ||
|
|
c39fe3433b | ||
|
|
668fa66d78 | ||
|
|
98ebb21489 | ||
|
|
137abd0cfa | ||
|
|
d7308fecbe | ||
|
|
73fb9915fd | ||
|
|
855a119654 | ||
|
|
cf7a6a6a65 | ||
|
|
509d152e54 | ||
|
|
35e6fb3788 | ||
|
|
9b79931265 | ||
|
|
14a7118499 | ||
|
|
afdabd97ff | ||
|
|
07f8fc7697 | ||
|
|
def7666609 | ||
|
|
c900f23662 | ||
|
|
7b093ee4b3 | ||
|
|
9f75cef5e5 | ||
|
|
a410c31bf8 | ||
|
|
1cd50ba572 | ||
|
|
1052eeee8c | ||
|
|
e22f0dda32 | ||
|
|
766a6b8309 | ||
|
|
d282bc4625 | ||
|
|
677cee44ad | ||
|
|
60e7726832 | ||
|
|
385b00a468 | ||
|
|
1c4223889b | ||
|
|
90a4fd34d2 | ||
|
|
2820c7a9cd | ||
|
|
edd4f3d5ad | ||
|
|
aa7fe3b132 | ||
|
|
1d9886d0f7 | ||
|
|
6068e85ef2 | ||
|
|
ced471d4ce | ||
|
|
2445ac4a53 | ||
|
|
1d0279eac5 | ||
|
|
f8b21fe199 | ||
|
|
0f330d7226 | ||
|
|
cb29350954 | ||
|
|
7fce9e2411 | ||
|
|
cc52a59e1a | ||
|
|
24ac7d2698 | ||
|
|
130619d6b0 | ||
|
|
71ab40e536 | ||
|
|
7638a7d531 | ||
|
|
b92a09d5e7 | ||
|
|
3d29cc8636 | ||
|
|
d6c5a1e0c4 | ||
|
|
9bcd4a6811 | ||
|
|
e90b1651e4 | ||
|
|
66ccae4bfe | ||
|
|
02a07164f3 | ||
|
|
9419191aa6 | ||
|
|
f71b10df8c | ||
|
|
0b7735d279 | ||
|
|
1f3a93a3af | ||
|
|
f9f773cc28 | ||
|
|
d9bf53c6e5 | ||
|
|
f549ada16c | ||
|
|
d8b955294a | ||
|
|
8aad53556d | ||
|
|
61ce9db4ba | ||
|
|
2da435712a | ||
|
|
9079ec459c | ||
|
|
aaddccfdb1 | ||
|
|
033373f078 | ||
|
|
d63db59ade | ||
|
|
20899f2df9 | ||
|
|
b9948ca297 | ||
|
|
f33e6a053e | ||
|
|
9f725bee1f | ||
|
|
3e2d68a059 | ||
|
|
2974025010 | ||
|
|
9a90e041f3 | ||
|
|
b0be15d4f7 | ||
|
|
a24998abac | ||
|
|
cc49042294 | ||
|
|
3981b644d6 | ||
|
|
4651919bd8 | ||
|
|
fed4bb5c07 | ||
|
|
ec903ce625 | ||
|
|
3ea956a0b4 | ||
|
|
d0c85471b4 | ||
|
|
3cc62c1fd2 | ||
|
|
079e369e91 | ||
|
|
06400b83b1 | ||
|
|
fe68d30be9 | ||
|
|
a3a11c2e0c | ||
|
|
3f526698ab | ||
|
|
78e2b7cc08 | ||
|
|
6ce74febc7 | ||
|
|
ede3d422a0 | ||
|
|
629a39b45b | ||
|
|
397249a8d5 | ||
|
|
b44b624ca5 | ||
|
|
6513c7eab8 | ||
|
|
276d90a45d | ||
|
|
c94b15a951 | ||
|
|
e4d6eaf17a | ||
|
|
60b9f8db18 | ||
|
|
cff928e2dc | ||
|
|
6aa701b3ee | ||
|
|
cb480dddf6 | ||
|
|
33c714ca03 | ||
|
|
bcda3f1baa | ||
|
|
4ae2753025 | ||
|
|
b5cd21c337 | ||
|
|
8844f0c142 | ||
|
|
4cb4fc3ef8 | ||
|
|
6cabd42ed2 | ||
|
|
0daee33ad6 | ||
|
|
b97a94ccc8 | ||
|
|
5cc3dcdbd8 | ||
|
|
7e3382340e | ||
|
|
87abcecca6 | ||
|
|
8ca88f14f7 | ||
|
|
b4a4a7c611 | ||
|
|
556680cf5e | ||
|
|
f4077bd41f | ||
|
|
cb5c560688 | ||
|
|
8ac0fdfea7 | ||
|
|
6dfd71670a | ||
|
|
4d4cc34aff | ||
|
|
c070a2aa3e | ||
|
|
af14cf8f8b | ||
|
|
35ba97cbdf | ||
|
|
9f59cf1468 | ||
|
|
6c80a3461c | ||
|
|
5591afff6e | ||
|
|
8144725739 | ||
|
|
52ae5f885e | ||
|
|
b6658c5497 | ||
|
|
aad5163b49 | ||
|
|
6d18bf5cd4 | ||
|
|
adabc2d7a0 | ||
|
|
d07ea3b66a | ||
|
|
2bb08a4ca0 | ||
|
|
30ae473d85 | ||
|
|
e9f870e25a | ||
|
|
317660c2fe | ||
|
|
5e60efefbf | ||
|
|
f6a89d13c2 | ||
|
|
3e01dd955f | ||
|
|
27fa0ea9d7 | ||
|
|
2de914d8c3 | ||
|
|
616fa85458 | ||
|
|
20ad496c00 | ||
|
|
fa88c42cf1 | ||
|
|
e84a762171 | ||
|
|
16e50c258a | ||
|
|
cce4265cef | ||
|
|
973dd6ffbd | ||
|
|
72e8489d50 | ||
|
|
cfa13ed84c | ||
|
|
29b3b6b31e | ||
|
|
533496e43a | ||
|
|
6f7a7459c1 | ||
|
|
6b062b07b4 | ||
|
|
bfd3a47380 | ||
|
|
0933e5cab4 | ||
|
|
cc565fc16c | ||
|
|
62d86b3d18 | ||
|
|
4bbbd2dde6 | ||
|
|
b884117a9e | ||
|
|
7def139020 | ||
|
|
b667eee351 | ||
|
|
891f55b2b3 | ||
|
|
7b12fd26f3 | ||
|
|
387ec5c06a | ||
|
|
dcc043df3b | ||
|
|
2457997cd9 | ||
|
|
d9bed68fe9 | ||
|
|
2eb65b3625 | ||
|
|
76fdfe6890 | ||
|
|
495adee269 | ||
|
|
383aaa236e | ||
|
|
8c89e6bce5 | ||
|
|
98297e5234 | ||
|
|
3915faf382 | ||
|
|
d5fa4b2ccb | ||
|
|
3ff104ba30 | ||
|
|
706286c289 | ||
|
|
18c1b12741 | ||
|
|
5cda1e55e0 | ||
|
|
195cd130f8 | ||
|
|
b19f45e15d | ||
|
|
3acd0dfe48 | ||
|
|
74cedbf1c5 | ||
|
|
7d47ec4c46 | ||
|
|
14cdd24f78 | ||
|
|
1cfd055f82 | ||
|
|
ed5e585684 | ||
|
|
32948b8dc6 | ||
|
|
ad5ad3d1ad | ||
|
|
3bc2dda00d | ||
|
|
ee8e9c0291 | ||
|
|
f4bc1ef4a2 | ||
|
|
3513ce3ac0 | ||
|
|
6277a2e4a4 | ||
|
|
84faa60c4e | ||
|
|
735195e8ea | ||
|
|
0f15ab8d05 | ||
|
|
17c2d76c5e | ||
|
|
11c1562512 | ||
|
|
ef646f0f78 | ||
|
|
7b3132d39d | ||
|
|
8345fc2b9e | ||
|
|
58f4182880 | ||
|
|
ecf56606dc | ||
|
|
be3e64e5ea | ||
|
|
741342ba1d | ||
|
|
d97e31b4ab | ||
|
|
ce4081af93 | ||
|
|
32f5edc9c5 | ||
|
|
b481128a93 | ||
|
|
ab62001b74 | ||
|
|
2dfd57bb8c | ||
|
|
20d7a142c5 | ||
|
|
9ae06c541f | ||
|
|
655293ece9 | ||
|
|
a983318501 | ||
|
|
8769c06350 | ||
|
|
5066710e60 | ||
|
|
451c97f35a | ||
|
|
8a577a9d4d | ||
|
|
950150469a | ||
|
|
3cbace98a7 | ||
|
|
e214df8980 | ||
|
|
e3cccdf571 | ||
|
|
a0bf841be2 | ||
|
|
73cbb0c65f | ||
|
|
2f89ddbead | ||
|
|
a526693915 | ||
|
|
31f2a3a7d7 | ||
|
|
147403f958 | ||
|
|
38c52cf9b5 | ||
|
|
64c1c75c42 | ||
|
|
2b11d1060c | ||
|
|
a73b903df9 | ||
|
|
30cfb3e795 | ||
|
|
a0e6d4375a | ||
|
|
c7aca5cc35 | ||
|
|
3225d7e169 | ||
|
|
6596d91c82 | ||
|
|
d554b7da08 | ||
|
|
cd7f1a15f8 | ||
|
|
fa68c2619f | ||
|
|
e97bec10ea | ||
|
|
7763718b60 | ||
|
|
7f2c4cbf8a | ||
|
|
91ebe12fc2 | ||
|
|
13e1e7e1e9 | ||
|
|
8a263952ad | ||
|
|
f27232bd0a | ||
|
|
16534ec644 | ||
|
|
7e44bcfd8a | ||
|
|
8cbd66b0f9 | ||
|
|
47a81c2b39 | ||
|
|
56bf209f84 | ||
|
|
333fb1bf97 | ||
|
|
cbef88a593 | ||
|
|
b13179d4f4 | ||
|
|
cf89d9bfb0 | ||
|
|
f49848c8a4 | ||
|
|
0101b39f6c | ||
|
|
4285baa6e1 | ||
|
|
e530af1ff7 | ||
|
|
60e94a4ec8 | ||
|
|
c66a574fa0 | ||
|
|
ef3259035d | ||
|
|
4226f4412b | ||
|
|
368983d8da | ||
|
|
16b982958b | ||
|
|
0c4819131c | ||
|
|
186b0f62eb | ||
|
|
77bc4c5725 | ||
|
|
dd47da92f5 | ||
|
|
f8e35de18d | ||
|
|
a7facfb760 | ||
|
|
f5e62f28bc | ||
|
|
60c8012e9e | ||
|
|
08d6e515c7 | ||
|
|
fac2f27dd3 | ||
|
|
ed37427f9e | ||
|
|
7a5a277c29 | ||
|
|
38da76804e | ||
|
|
a949f0b0c3 | ||
|
|
ffc23046a2 | ||
|
|
07944cfd20 | ||
|
|
91aadab3dd | ||
|
|
c3425bc55f | ||
|
|
55bc4168bf | ||
|
|
ba1b5e34a7 | ||
|
|
753c42a3d5 | ||
|
|
97c2ec8dcf | ||
|
|
4948508277 | ||
|
|
fb89c762fc | ||
|
|
58ebdd4a7e | ||
|
|
d7f22a0c27 | ||
|
|
3b4794ae94 | ||
|
|
c0989dce2d | ||
|
|
8412c867a5 | ||
|
|
10642a34f1 | ||
|
|
6a94b51cba | ||
|
|
36ef521c0e | ||
|
|
bf14668b2a | ||
|
|
a475dd15e6 | ||
|
|
bb0b82a110 | ||
|
|
2bbb59964f | ||
|
|
4fd32eb48e | ||
|
|
2872a98b2b | ||
|
|
023af5585f | ||
|
|
3d85000f13 | ||
|
|
3d1a204c83 | ||
|
|
1ce30deec3 | ||
|
|
8ed08872b9 | ||
|
|
7a75e7341b | ||
|
|
ec6dee8bd1 | ||
|
|
f2a507c4a7 | ||
|
|
17ab7bde44 | ||
|
|
fcc363333c | ||
|
|
7ef9e4d8e7 | ||
|
|
3180910fd1 | ||
|
|
b01d09d704 | ||
|
|
2f6551b3b1 | ||
|
|
50ae14cf7b | ||
|
|
79b7cd69bb | ||
|
|
cf237a0e4f | ||
|
|
c0d147c5c4 | ||
|
|
bd707b4a96 | ||
|
|
daaed863da | ||
|
|
2bdfac2036 | ||
|
|
d74a23e583 | ||
|
|
44b35f7735 | ||
|
|
0d3169ef70 | ||
|
|
fe3b439e31 | ||
|
|
6c987d6708 | ||
|
|
28fd1a4c5d | ||
|
|
bd895aa76c | ||
|
|
1177daecde | ||
|
|
42813eeb84 | ||
|
|
d4fafeb6d6 | ||
|
|
1270384ede | ||
|
|
aa1b065dd1 | ||
|
|
7248b2213d | ||
|
|
74b28f0a86 | ||
|
|
005edf71a8 | ||
|
|
c1f64ba017 | ||
|
|
42166be22e | ||
|
|
62b3ed17ba | ||
|
|
31bf50b2d4 | ||
|
|
0325c1ba65 | ||
|
|
f2a437bd3b | ||
|
|
7a7fb423b3 | ||
|
|
d533c1b1c8 | ||
|
|
2db013a5fa | ||
|
|
9fece3fdf1 | ||
|
|
b520a03c57 | ||
|
|
a4cafaad2e | ||
|
|
0d64bbed46 | ||
|
|
9718e70260 | ||
|
|
a67dd9fbdd | ||
|
|
aabed8279e | ||
|
|
06eb271bda | ||
|
|
12025e3050 | ||
|
|
ad6367018b | ||
|
|
c71b168402 | ||
|
|
4deb46290d | ||
|
|
e5ef45e4c0 | ||
|
|
e780637cf4 | ||
|
|
d659e55646 | ||
|
|
1c58b6d83e | ||
|
|
1305c02579 | ||
|
|
2c19ca0dbf | ||
|
|
3cfdc6d126 | ||
|
|
8ec73b2dd4 | ||
|
|
5f11854286 | ||
|
|
14f4e0e271 | ||
|
|
5c54ef7b0d | ||
|
|
73c2846d64 | ||
|
|
acd2038407 | ||
|
|
2442ae60db | ||
|
|
6c096191ba | ||
|
|
20f9dd9a6b | ||
|
|
44e94b8cfa | ||
|
|
8c21cf7761 | ||
|
|
d2851cf5c5 | ||
|
|
b0716253a2 | ||
|
|
eaf023b4d8 | ||
|
|
e47ad09130 | ||
|
|
689d0082d8 | ||
|
|
390a49072d | ||
|
|
7dc0b6f40b | ||
|
|
79d14521db | ||
|
|
8d6b0c8d76 | ||
|
|
1486774249 | ||
|
|
1fa9167f25 | ||
|
|
cc12225142 | ||
|
|
6b3a37c597 | ||
|
|
b187125b63 | ||
|
|
d232a0f951 | ||
|
|
84ea96f383 | ||
|
|
be33d3f2a4 | ||
|
|
0e991c596f | ||
|
|
858b6aa257 | ||
|
|
74135c0600 | ||
|
|
18dd6f58e3 | ||
|
|
ddcd2b0810 | ||
|
|
6d749789ce | ||
|
|
3224062b32 | ||
|
|
688ea28bed | ||
|
|
5e7c01c251 | ||
|
|
de2eea05b4 | ||
|
|
1de819e3de | ||
|
|
bc43409624 | ||
|
|
a57077aba3 | ||
|
|
8eaabacf44 | ||
|
|
adf5b036d6 | ||
|
|
3ab954644f | ||
|
|
64953e26fc | ||
|
|
2e1024d275 | ||
|
|
2253c57628 | ||
|
|
9c7d1dbb6f | ||
|
|
ef9f2ab31f | ||
|
|
64ca6c066c | ||
|
|
d1cf5ab286 | ||
|
|
b1545c5ce2 | ||
|
|
de8bae3f0f | ||
|
|
1fbf633817 | ||
|
|
f733dc5eae | ||
|
|
503bbd85b5 | ||
|
|
29ddb68da4 | ||
|
|
dd49399e45 | ||
|
|
3678f134d9 | ||
|
|
bbd784a2e8 | ||
|
|
77dbaf3aef | ||
|
|
9b9ee338c1 | ||
|
|
5ea7f52df2 | ||
|
|
414530c9c2 | ||
|
|
e632d39b1f | ||
|
|
09054a09fa | ||
|
|
01ec55366d | ||
|
|
e2388344b2 | ||
|
|
fd10844c2b | ||
|
|
35f2302352 | ||
|
|
e908b731ab | ||
|
|
b475325b5e | ||
|
|
7e769252e7 | ||
|
|
699d78bcfe | ||
|
|
7d345018af | ||
|
|
bac3b39227 | ||
|
|
c168e6f870 | ||
|
|
27b6fe682d | ||
|
|
a1b43b7a09 | ||
|
|
bfc78186f5 | ||
|
|
20130d89dc | ||
|
|
8490aac025 | ||
|
|
8fbffe250a | ||
|
|
60808a4820 | ||
|
|
d5cb16aa1f | ||
|
|
afd6ca314c | ||
|
|
441522f97b | ||
|
|
369229ea71 | ||
|
|
15a63805d9 | ||
|
|
7d8766980b | ||
|
|
5be3606236 | ||
|
|
ce4c145f1c | ||
|
|
b9372944f5 | ||
|
|
f58dff62c7 | ||
|
|
6d13b8bbc0 | ||
|
|
2139334c36 | ||
|
|
67bb12e569 | ||
|
|
2d43517914 | ||
|
|
df60c00d16 | ||
|
|
0fbddb0df1 | ||
|
|
4c5c1fc9ef | ||
|
|
4ffd2380c3 | ||
|
|
5849cd3a2e | ||
|
|
0a1960865e | ||
|
|
830ab99e6e | ||
|
|
2e4b7b3d19 | ||
|
|
8cb051d44d | ||
|
|
535445a555 | ||
|
|
f6afddd94b | ||
|
|
844b01cb6b | ||
|
|
0f2ee308de | ||
|
|
7d3f808e4c | ||
|
|
45465e0c45 | ||
|
|
4a9be7bf11 | ||
|
|
c8e0d18d18 | ||
|
|
ee9a4082b6 | ||
|
|
e6c70bf392 | ||
|
|
9edf9ad2ac | ||
|
|
f714d80c93 | ||
|
|
605c306bef | ||
|
|
5e2cda183a | ||
|
|
f284f00935 | ||
|
|
777e4fe49e | ||
|
|
8daf0223dc | ||
|
|
f77fb0b948 | ||
|
|
71992158bf | ||
|
|
fd8ab78372 | ||
|
|
1514ab8ec5 | ||
|
|
3591900070 | ||
|
|
44c6fa68cf | ||
|
|
7df4a966ea | ||
|
|
998ce1fe89 | ||
|
|
1279888567 | ||
|
|
d9d65577f4 | ||
|
|
f2f6055109 | ||
|
|
db0506c1df | ||
|
|
114f803a88 | ||
|
|
69778efb6b | ||
|
|
e7df20f69b | ||
|
|
1157d330a6 | ||
|
|
cd64a777c3 | ||
|
|
808bc42f2a | ||
|
|
3728fc7dba | ||
|
|
9920047b34 | ||
|
|
b758c0c335 | ||
|
|
32054b6f32 | ||
|
|
c6e5201e15 | ||
|
|
88eae68987 | ||
|
|
8b89bd7a1f | ||
|
|
fc68b9d7cd | ||
|
|
64b1b5ca38 | ||
|
|
8e77aca854 | ||
|
|
0627ae82fb | ||
|
|
0cd125b55c | ||
|
|
444cb894be | ||
|
|
8138b2080b | ||
|
|
d0c3cc6016 | ||
|
|
737b204b2c | ||
|
|
bd313b0b3d | ||
|
|
568de7e818 | ||
|
|
3106cffb65 | ||
|
|
21e9615243 | ||
|
|
9e27ba5109 | ||
|
|
7874cdf52a | ||
|
|
213e907044 | ||
|
|
c8d5131a42 | ||
|
|
fc21bb6eda | ||
|
|
3a9173858b | ||
|
|
dede320630 | ||
|
|
c25e2e611d | ||
|
|
54689f6087 | ||
|
|
370b47d23f | ||
|
|
53814983ff | ||
|
|
5953170f14 | ||
|
|
40897cd7da | ||
|
|
e2fe873049 | ||
|
|
9f3a16a4ae | ||
|
|
9da3d890e4 | ||
|
|
9684cbf850 | ||
|
|
295c8f48a6 | ||
|
|
7be8147b80 | ||
|
|
c22d94bba6 | ||
|
|
b0e94c15e6 | ||
|
|
874d3aca45 | ||
|
|
4a20febe96 | ||
|
|
28c7094f5b | ||
|
|
ff5e2746da | ||
|
|
dc8014562b | ||
|
|
b9394b9599 | ||
|
|
899dafb33f | ||
|
|
104cf87b89 | ||
|
|
290aae80e1 | ||
|
|
212eeaa77c | ||
|
|
eb28c710ba | ||
|
|
129d2f803a | ||
|
|
71f6986dd6 | ||
|
|
6fc1d7dc77 | ||
|
|
d9056081e7 | ||
|
|
95f87cdd56 | ||
|
|
746cc4c10b | ||
|
|
51c18e3f9a | ||
|
|
25b25e3e49 | ||
|
|
096f850433 | ||
|
|
ec469782c8 | ||
|
|
40e223c12d | ||
|
|
b2c78dbd57 | ||
|
|
89069fdaa4 | ||
|
|
75b02e1d27 | ||
|
|
1130e4782d | ||
|
|
2927514e68 | ||
|
|
0e9d159bc2 | ||
|
|
d69f408b14 | ||
|
|
e8d6c96c1e | ||
|
|
041120aab4 | ||
|
|
d20f45b949 | ||
|
|
02bd933c58 | ||
|
|
b34721b3f4 | ||
|
|
cb6be2a50d | ||
|
|
45852f0497 | ||
|
|
8160c85e44 | ||
|
|
426f58aa61 | ||
|
|
e0bfa1e422 | ||
|
|
bf75731bbe | ||
|
|
c8eec109b2 | ||
|
|
b8079953d8 | ||
|
|
993148552e | ||
|
|
1863be7be4 | ||
|
|
358145c4bd | ||
|
|
fb882f0b69 | ||
|
|
27cba56761 | ||
|
|
e2da73bf4f | ||
|
|
4402f73bf7 | ||
|
|
dc90cd6bc4 | ||
|
|
7356a0f6c8 | ||
|
|
f408bc4808 | ||
|
|
a302f37447 | ||
|
|
f501e30353 | ||
|
|
2587649ca2 | ||
|
|
d1faac58dd | ||
|
|
1efb120248 | ||
|
|
8078d29fda | ||
|
|
a9787b769f | ||
|
|
a42711e31c | ||
|
|
c632307eaa | ||
|
|
0f9de11a67 | ||
|
|
541db5fbbe | ||
|
|
715823a666 | ||
|
|
6ce4b344e4 | ||
|
|
a6ca809a4e | ||
|
|
c1a13ae8bc | ||
|
|
6536ffe178 | ||
|
|
562946d055 | ||
|
|
924b8cbe24 | ||
|
|
93f7c14ea6 | ||
|
|
5b1a532652 | ||
|
|
a3a918e900 | ||
|
|
b6af3e51ab | ||
|
|
3707dcbf33 | ||
|
|
ebc8bd6ff5 | ||
|
|
ed70195c7e | ||
|
|
e38217683c | ||
|
|
739e529416 | ||
|
|
12be83562d | ||
|
|
8bcb5e4ed7 | ||
|
|
5c96bca1ca | ||
|
|
384987cd5b | ||
|
|
af21dfd294 | ||
|
|
3e9153d955 | ||
|
|
0e421ea31d | ||
|
|
471f7f06f7 | ||
|
|
ddb37a47da | ||
|
|
5b24aac266 | ||
|
|
d61adfbc53 | ||
|
|
602f040940 | ||
|
|
5cf59de676 | ||
|
|
e25d49b80b | ||
|
|
d5d9b9284a | ||
|
|
0ec97c5d1e | ||
|
|
9bbda857c3 | ||
|
|
383b6aabf5 | ||
|
|
7a3f5afee7 | ||
|
|
5769fa6aed | ||
|
|
925fe65dd8 | ||
|
|
67b1f14a6f | ||
|
|
dd0cc5ed9f | ||
|
|
a23441109d | ||
|
|
ef4465efdb | ||
|
|
646180518a | ||
|
|
659541f4a5 | ||
|
|
0e7acaa3c4 | ||
|
|
f0946baeaa | ||
|
|
76ecf897ce | ||
|
|
7db755dd68 | ||
|
|
2efc0bad1c | ||
|
|
3978de2cde | ||
|
|
263f919beb | ||
|
|
4aaa9e7d9f | ||
|
|
e1608362d0 | ||
|
|
9f986d8a86 | ||
|
|
e0b78f7f2a | ||
|
|
1eb09f3eb2 | ||
|
|
0e7790df8c | ||
|
|
591abd340b | ||
|
|
44d13869ad | ||
|
|
9862eb930d | ||
|
|
0c4dab54f1 | ||
|
|
84483b4aac | ||
|
|
9f5547327e | ||
|
|
b04fc5a39e | ||
|
|
5121417725 | ||
|
|
2c39d5b6c0 | ||
|
|
8d1667e9e8 | ||
|
|
5b3397359f | ||
|
|
ded64758d5 | ||
|
|
2813dcc6cc | ||
|
|
0a54558ee2 | ||
|
|
168d25e780 | ||
|
|
63a15e232b | ||
|
|
cb86b8f8fc | ||
|
|
f2211ff3ad | ||
|
|
312977d5a6 | ||
|
|
3eac5f9ab7 | ||
|
|
fcb3f36065 | ||
|
|
ac7a461070 | ||
|
|
2a1fd421bd | ||
|
|
920adb8296 | ||
|
|
8ceb4b83a4 | ||
|
|
34540babdb | ||
|
|
9f6223311e | ||
|
|
90b78326d3 | ||
|
|
8fc26c1e58 | ||
|
|
6eb7530f75 | ||
|
|
76ab22f74c | ||
|
|
cfbb511d26 | ||
|
|
14b6d32fe6 | ||
|
|
0de26732bf | ||
|
|
0f02997bcc | ||
|
|
2271526d2f | ||
|
|
ea2e1f016f | ||
|
|
c4aa223698 | ||
|
|
63233655f4 | ||
|
|
63d93a2f9a | ||
|
|
ba2fcd9dae | ||
|
|
c0ad54fe02 | ||
|
|
fe3bca3a88 | ||
|
|
8621399d78 | ||
|
|
5d84e86d89 | ||
|
|
6640167410 | ||
|
|
6d542b8bb0 | ||
|
|
e86d31e7a5 | ||
|
|
c5c59d4acb | ||
|
|
4dc40b83e4 | ||
|
|
f186812f18 | ||
|
|
4a6592597a | ||
|
|
afb9401fc7 | ||
|
|
3c65cd41a5 | ||
|
|
8376a44f65 | ||
|
|
9a36435016 | ||
|
|
edc4614e63 | ||
|
|
964c7e6f3b | ||
|
|
9e424ed921 | ||
|
|
cf766b55cc | ||
|
|
03c65d7a96 | ||
|
|
e05743d0ba | ||
|
|
e204ced1ae | ||
|
|
be55d2c57f | ||
|
|
119dd06ea8 | ||
|
|
aed26f8c1e | ||
|
|
6482fd52fb | ||
|
|
44b091a7c6 | ||
|
|
8279a0d477 | ||
|
|
7709af7a62 | ||
|
|
59dd6678c3 | ||
|
|
137463dc6d | ||
|
|
b652920500 | ||
|
|
80a48be324 | ||
|
|
bc9e2266be | ||
|
|
fd25a6425c | ||
|
|
ff4d0ce1e1 | ||
|
|
5d8c776250 | ||
|
|
3d2315d596 | ||
|
|
892cc7da31 | ||
|
|
eb9e712f91 | ||
|
|
2a6eb83fb4 | ||
|
|
ef99a11001 | ||
|
|
2520019fb8 | ||
|
|
877a14c0b8 | ||
|
|
0ad6e6f459 | ||
|
|
885c23b453 | ||
|
|
7cb8f6e9fc | ||
|
|
04f518082c | ||
|
|
26926551cf | ||
|
|
2069094f55 | ||
|
|
976a0a6264 | ||
|
|
8edcf25ba3 | ||
|
|
e4029d00b6 | ||
|
|
044ff5e055 | ||
|
|
0de8c28cf4 | ||
|
|
a1bca962a7 | ||
|
|
f1a13c4ee5 | ||
|
|
5f6ec391e3 | ||
|
|
bf656577d9 | ||
|
|
171bcb1ccf | ||
|
|
5e53c1cde8 | ||
|
|
72431456ff | ||
|
|
b8deb49007 | ||
|
|
6b34f19396 | ||
|
|
c018bfdb4d | ||
|
|
f4f36e356f | ||
|
|
6de9a92582 | ||
|
|
630b0515ad | ||
|
|
b06e798373 | ||
|
|
3b25795ee5 | ||
|
|
ef18d6f70c | ||
|
|
838e784c5f | ||
|
|
1feec5a96c | ||
|
|
7d95768a92 | ||
|
|
9cb95274a6 | ||
|
|
3c5d5b344e | ||
|
|
4980959fce | ||
|
|
22d22f6aa8 | ||
|
|
e8ba3c2f4d | ||
|
|
ce857b0770 | ||
|
|
ce7c681462 | ||
|
|
41e562ebc2 | ||
|
|
ddf98661e4 | ||
|
|
1349d129c5 | ||
|
|
cbd8a27a6d | ||
|
|
b60db79866 | ||
|
|
ddec870d25 | ||
|
|
77e358a001 | ||
|
|
5490f54d00 | ||
|
|
58447c147f | ||
|
|
97e731e05c | ||
|
|
e763345f25 | ||
|
|
7b86b2e05a | ||
|
|
a51bd03a5c | ||
|
|
54d7c29221 | ||
|
|
997e3e16dd | ||
|
|
c6eef16664 | ||
|
|
4f718e83b3 | ||
|
|
20ccda69f4 | ||
|
|
14741518a7 | ||
|
|
dd91779442 | ||
|
|
553eb6ed40 | ||
|
|
8edb53e902 | ||
|
|
460bfc6853 | ||
|
|
3e5b8f1e97 | ||
|
|
fab7299d49 | ||
|
|
09ff1e7af0 | ||
|
|
ad5ae9ba3b | ||
|
|
3788f462b4 | ||
|
|
238bbfcbbb | ||
|
|
0efa211a05 | ||
|
|
00a890c8c7 | ||
|
|
6990871efd | ||
|
|
a62ebc9a69 | ||
|
|
6c82e7acda | ||
|
|
084e435883 | ||
|
|
2f33e5919d | ||
|
|
cbe615224d | ||
|
|
6c70ed79ae | ||
|
|
488652c23a | ||
|
|
bb3a00d1eb | ||
|
|
bf3cf2580f | ||
|
|
843944f558 | ||
|
|
991c900fc6 | ||
|
|
0d2af9e742 | ||
|
|
1c8c9a10b5 | ||
|
|
4aa9f76d06 | ||
|
|
fc7c489ab6 | ||
|
|
4856567a2a | ||
|
|
7d0722bc18 | ||
|
|
1235e60a29 | ||
|
|
4340368277 | ||
|
|
735af50ce9 | ||
|
|
7ce5f34d6f | ||
|
|
f76a16a727 | ||
|
|
f2a5237802 | ||
|
|
4ea92a97ea | ||
|
|
a7ed3658e3 | ||
|
|
061b872498 | ||
|
|
97ea61a407 | ||
|
|
44bd405ed3 | ||
|
|
73f1030bde | ||
|
|
fdef82f89c | ||
|
|
3d68d1bbe2 | ||
|
|
c2dcfc9176 | ||
|
|
df300e042b | ||
|
|
3996f178e5 | ||
|
|
7935b1613a | ||
|
|
8df81f93c8 | ||
|
|
95d5e55df2 | ||
|
|
daf3469ce4 | ||
|
|
1565f9d9c3 | ||
|
|
b56542a9f1 | ||
|
|
5b5b53872c | ||
|
|
1442a2abe8 | ||
|
|
e031fa7207 | ||
|
|
1b521d0822 | ||
|
|
e529f4d75f | ||
|
|
307a4ae9e8 | ||
|
|
46452e7634 | ||
|
|
ee3b355c34 | ||
|
|
61c5b631f3 | ||
|
|
b993dce12f | ||
|
|
cd1c2f74d3 | ||
|
|
a1020b3e61 | ||
|
|
1b1aa07414 | ||
|
|
5023ade7ac | ||
|
|
9921e9e79f | ||
|
|
5ef13d9011 | ||
|
|
3816abb9de | ||
|
|
7561075af8 | ||
|
|
fe10f98038 | ||
|
|
6709d1067d | ||
|
|
74e27a0a82 | ||
|
|
04c0ac9ee8 | ||
|
|
8159f55243 | ||
|
|
cca60adc35 | ||
|
|
16ba544edd | ||
|
|
f230da12c5 | ||
|
|
03aae47424 | ||
|
|
df0aaa1ebe | ||
|
|
68f9342060 | ||
|
|
c38a40d193 | ||
|
|
23ba7b5bff | ||
|
|
173fd4fd23 | ||
|
|
3a893ff17f | ||
|
|
da89591a53 | ||
|
|
097e2030b4 | ||
|
|
24f1da7f30 | ||
|
|
85ce80d72e | ||
|
|
ec1037fcbc | ||
|
|
7a1bedcab6 | ||
|
|
06b4964dd8 | ||
|
|
d2ffdc8986 | ||
|
|
7e1a3148fb | ||
|
|
5559962f6f | ||
|
|
1d67d8ff23 | ||
|
|
9f46881c16 | ||
|
|
dead45fa67 | ||
|
|
a8af974895 | ||
|
|
8605cc685d | ||
|
|
9a49b2c9fb | ||
|
|
b6f495d107 | ||
|
|
05233aa6f4 | ||
|
|
7541fac245 | ||
|
|
7b6780f712 | ||
|
|
d6791a836b | ||
|
|
69c6b007aa | ||
|
|
ee113a5632 | ||
|
|
4899086b3c | ||
|
|
f4f2847662 | ||
|
|
fb89e1a26f | ||
|
|
e849beabba | ||
|
|
2979d3bf16 | ||
|
|
88efc73797 | ||
|
|
77b13d02f0 | ||
|
|
588c520c4a | ||
|
|
d371af0504 | ||
|
|
3e115b7a85 | ||
|
|
ca8e4c08a7 | ||
|
|
6ec4591f02 | ||
|
|
679ef95257 | ||
|
|
5818289c2d | ||
|
|
d407d680ea | ||
|
|
feb36e7342 | ||
|
|
8ab81e6d4b | ||
|
|
4fc2ee1bd4 | ||
|
|
07c48590c0 | ||
|
|
4388b73077 | ||
|
|
d7c6855918 | ||
|
|
e5e7da1482 | ||
|
|
64921fe08a | ||
|
|
79d5ff0350 | ||
|
|
ada3ab4213 | ||
|
|
a00b979bb6 | ||
|
|
b1d8492c3f | ||
|
|
75fe438f21 | ||
|
|
8cdcfc2a91 | ||
|
|
2a06c72113 | ||
|
|
05563ab11e | ||
|
|
625a1cb0b5 | ||
|
|
e58b73179f | ||
|
|
8e07e55c1f | ||
|
|
6a6593335d | ||
|
|
876b9d49b4 | ||
|
|
ed8ff85d2a | ||
|
|
b482cab7be | ||
|
|
0bf5316249 | ||
|
|
969928e500 | ||
|
|
f30a5fe288 | ||
|
|
6f3d7209c2 | ||
|
|
82b589e390 | ||
|
|
b280cc5e75 | ||
|
|
1964b04ea9 | ||
|
|
c4bc216815 | ||
|
|
3af40efdb1 | ||
|
|
27d84ef8be | ||
|
|
680ac41bb1 | ||
|
|
b133137a1f | ||
|
|
be77b9201e | ||
|
|
0479f0ad63 | ||
|
|
aa8b3cb6d6 | ||
|
|
c62d9c37d2 | ||
|
|
70fbb4623f | ||
|
|
6aebeca1d0 | ||
|
|
e3ea953ff4 | ||
|
|
9dc91925e7 | ||
|
|
8dd9602f06 | ||
|
|
92d2e681d6 | ||
|
|
c82dbaca8b | ||
|
|
6faeb71770 | ||
|
|
d534b0ba81 | ||
|
|
87a0363ba7 | ||
|
|
0005702399 | ||
|
|
8642a1e68e | ||
|
|
ec1d2e86c8 | ||
|
|
2a46b984cd | ||
|
|
5a7b85adc7 | ||
|
|
914f83cb10 | ||
|
|
db969dc85a | ||
|
|
5b39d1819f | ||
|
|
3fe1adfc6d | ||
|
|
0af49d0533 | ||
|
|
d5c1bf98d7 | ||
|
|
5753fa2106 | ||
|
|
31b01f8de3 | ||
|
|
4f8d4f378c | ||
|
|
222e36ee3e | ||
|
|
3e3eefc2dc | ||
|
|
77b6b0a9b2 | ||
|
|
551d2dfebd | ||
|
|
f9c2a77c67 | ||
|
|
92099c7af2 | ||
|
|
58ad04b61c | ||
|
|
97bea94550 | ||
|
|
51ae9b3ed4 | ||
|
|
4726221d18 | ||
|
|
7353c6f94d | ||
|
|
91a04c7638 | ||
|
|
1511de68ed | ||
|
|
d6c9d3ce94 | ||
|
|
c64a86efae | ||
|
|
c522c0833a | ||
|
|
28fdfec7cb | ||
|
|
d3bb2a718a | ||
|
|
cabebd9f51 | ||
|
|
886c4320d6 | ||
|
|
93f27666db | ||
|
|
379cf3d249 | ||
|
|
0fe44f0e2a | ||
|
|
66d5436789 | ||
|
|
70b83a3bbb | ||
|
|
eba5b0e4c5 | ||
|
|
66af0c1a53 | ||
|
|
70c6ca76cb | ||
|
|
d840643cb3 | ||
|
|
07b7a65b86 | ||
|
|
7e7b50cd74 | ||
|
|
0b8f7d4fe7 | ||
|
|
93278dc7e3 | ||
|
|
b771e97ac6 | ||
|
|
a3c87fb30b | ||
|
|
228fa38240 | ||
|
|
a142c5e1ec | ||
|
|
4702283280 | ||
|
|
918df393e6 | ||
|
|
1e415a9943 | ||
|
|
c955379971 | ||
|
|
1debe4f055 | ||
|
|
9b9ce31550 | ||
|
|
bdd8ef5a52 | ||
|
|
292908c00a | ||
|
|
e027492e11 | ||
|
|
640118e781 | ||
|
|
c6ec2645dc | ||
|
|
2ffc2a288c | ||
|
|
5d75ee7721 | ||
|
|
4ca46b7883 | ||
|
|
827a9d640c | ||
|
|
70208eb33a | ||
|
|
e2a506e54a | ||
|
|
048f08080d | ||
|
|
0a02e0db4b | ||
|
|
825a7311ea | ||
|
|
09b0213738 | ||
|
|
f3e5262dc0 | ||
|
|
99494afd08 | ||
|
|
8214ae9b15 | ||
|
|
e63ef84ac1 | ||
|
|
697c44a293 | ||
|
|
18e34902a5 | ||
|
|
4b0c3ffc2f | ||
|
|
b4d33a58b1 | ||
|
|
c177965da5 | ||
|
|
220e1e8fb5 | ||
|
|
464187491f | ||
|
|
fd15d30987 | ||
|
|
03e36bda72 | ||
|
|
a259c37415 | ||
|
|
54c21f5974 | ||
|
|
08f378c359 | ||
|
|
58818e9738 | ||
|
|
599556d7d1 | ||
|
|
9e4d7b41e0 | ||
|
|
b35a2d568a | ||
|
|
9ca12e9f9d | ||
|
|
d54346b205 | ||
|
|
54f683fc6b | ||
|
|
908b07527e | ||
|
|
ee7339b661 | ||
|
|
35610da204 | ||
|
|
c06b1694a2 | ||
|
|
c238bdd861 | ||
|
|
d378904b98 | ||
|
|
3a4a2a6dac | ||
|
|
cfe815135e | ||
|
|
2eb97edf02 | ||
|
|
cdfb5c2bd8 | ||
|
|
8f9ba2cd09 | ||
|
|
ee95a7309a | ||
|
|
f32dfe2da6 | ||
|
|
9f0775c873 | ||
|
|
9169a673d5 | ||
|
|
37123ee053 | ||
|
|
c2616e385c | ||
|
|
5297d46017 | ||
|
|
2ef9126744 | ||
|
|
1d2cd99e96 | ||
|
|
994e9fe9de | ||
|
|
e63a2a2152 | ||
|
|
2997ce2e3c | ||
|
|
b8028c1b1d | ||
|
|
568de8157a | ||
|
|
924b646b79 | ||
|
|
f8786c25be | ||
|
|
92b2c28532 | ||
|
|
cc0c44f36b | ||
|
|
ce279e9c2d | ||
|
|
84978b7132 | ||
|
|
e4e9f6f221 | ||
|
|
77ec902ca7 | ||
|
|
7d9b0a00e4 | ||
|
|
f3c1ca3564 | ||
|
|
f109fa227d | ||
|
|
8befc474c1 | ||
|
|
622efba247 | ||
|
|
ce0c52d353 | ||
|
|
b03515276e | ||
|
|
30af350be0 | ||
|
|
1287b9d823 | ||
|
|
91aab03b90 | ||
|
|
e921dc50e0 | ||
|
|
dd6bb04ba7 | ||
|
|
c80bd104d2 | ||
|
|
22d1aaa27d | ||
|
|
2f5016262a | ||
|
|
47583877f1 | ||
|
|
1dbff80691 | ||
|
|
7abf6c71ad | ||
|
|
2da81b0ae7 | ||
|
|
d4c881791f | ||
|
|
516be01366 | ||
|
|
2b99190a1b | ||
|
|
3087f57453 | ||
|
|
4a4f8ec523 | ||
|
|
0c004147c0 | ||
|
|
451eb13e0e | ||
|
|
4e84cf1d38 | ||
|
|
72b7e64ad8 | ||
|
|
c3690b0878 | ||
|
|
b3f248fd19 | ||
|
|
d4686e6a59 | ||
|
|
14af6ba2af | ||
|
|
c3ee3af201 | ||
|
|
6496adf101 | ||
|
|
79f8d5c51e | ||
|
|
74ef1bc8ff | ||
|
|
26eeb9f37a | ||
|
|
ab385cd609 | ||
|
|
0f12f2b6b1 | ||
|
|
32c1d50887 | ||
|
|
956c94f30a | ||
|
|
3e69e5b082 | ||
|
|
330faab6cd | ||
|
|
fe6699f0bf | ||
|
|
807c5f2ef2 | ||
|
|
f7708955b6 | ||
|
|
be9024767e | ||
|
|
a1a83f8880 | ||
|
|
eb3a1f6739 | ||
|
|
03c1f2ef5b | ||
|
|
d215e86662 | ||
|
|
10962d7175 | ||
|
|
6889232b41 | ||
|
|
c54097af20 | ||
|
|
7c6695354e | ||
|
|
2d7fbf2476 | ||
|
|
1ef8206db1 | ||
|
|
b65f8d81fc | ||
|
|
e285d2939b | ||
|
|
6b602a4589 | ||
|
|
084542b943 | ||
|
|
ef8ea97044 | ||
|
|
dd6d0e774c | ||
|
|
f934310337 | ||
|
|
afe293c20a | ||
|
|
7f0a68f8d6 | ||
|
|
2517832718 | ||
|
|
bcf3accb74 | ||
|
|
1c5556334d | ||
|
|
299d803396 | ||
|
|
d513ace39d | ||
|
|
d5a9a4463c | ||
|
|
cf0baada2c | ||
|
|
49589e2da0 | ||
|
|
0e24676144 | ||
|
|
b0132821ac | ||
|
|
24afe544a3 | ||
|
|
3d7ff9f758 | ||
|
|
a81e70350b | ||
|
|
7f6f0ca103 | ||
|
|
c89bc73740 | ||
|
|
3100669b79 | ||
|
|
22c670c3d3 | ||
|
|
c37c7cee05 | ||
|
|
46579f3799 | ||
|
|
6de30028a8 | ||
|
|
c78c1427be | ||
|
|
953e7fd717 | ||
|
|
1ae08cfedf | ||
|
|
3c116cd077 | ||
|
|
bcab703e31 | ||
|
|
73046ec838 | ||
|
|
e1734468f5 | ||
|
|
aa78292c2a | ||
|
|
8bbd8ab073 | ||
|
|
b936be8e34 | ||
|
|
b8f34cdd35 | ||
|
|
993c028579 | ||
|
|
9285ade8a8 | ||
|
|
83e9f0dd91 | ||
|
|
c641f5cbdc | ||
|
|
c6302e3b3f | ||
|
|
94acb6ed5d | ||
|
|
42497d9932 | ||
|
|
3f172d13b2 | ||
|
|
437b4397b9 | ||
|
|
3a7ab3f030 | ||
|
|
fccf38a4d6 | ||
|
|
46edc49ede | ||
|
|
c05281492d | ||
|
|
5cebd3abf7 | ||
|
|
5ed5d637b8 | ||
|
|
516e18900c | ||
|
|
0970487cca | ||
|
|
d38f1380e9 | ||
|
|
2626b83b08 | ||
|
|
db0659aab4 | ||
|
|
e23a60a6bb | ||
|
|
3ea8d83d3f | ||
|
|
d9445f04b1 | ||
|
|
1543d02f96 | ||
|
|
11a444e914 | ||
|
|
2a6412481e | ||
|
|
b4447bfa4d | ||
|
|
72b5988e56 | ||
|
|
3a2c3c2288 | ||
|
|
9762a8ca1e | ||
|
|
e02e5e503d | ||
|
|
e4329f3ae7 | ||
|
|
f7082ee034 | ||
|
|
3ac9621f87 | ||
|
|
46e92e998e | ||
|
|
77dfd7b783 | ||
|
|
7d480ff579 | ||
|
|
37140d5e10 | ||
|
|
b04e874e43 | ||
|
|
d146f578a4 | ||
|
|
40c0c5a298 | ||
|
|
3a475a99fc | ||
|
|
9394583f96 | ||
|
|
3b4f4c5f59 | ||
|
|
34f2f77067 | ||
|
|
6b94708508 | ||
|
|
1d93e89eed | ||
|
|
e0e0bcdc1e | ||
|
|
1ed8af2ee8 | ||
|
|
3830c0adc4 | ||
|
|
5dbda6cd95 | ||
|
|
d8dbdc83c0 | ||
|
|
359a7cebde | ||
|
|
490ead52eb | ||
|
|
a5a7a32447 | ||
|
|
7e9652787b | ||
|
|
3b00d06a62 | ||
|
|
234fb7c2fe | ||
|
|
2c7e0ef577 | ||
|
|
2cbcc82968 | ||
|
|
b48e504522 | ||
|
|
4cce303c89 | ||
|
|
6a97b45ad1 | ||
|
|
1afdbb848e | ||
|
|
4d19bb17a9 | ||
|
|
b2012467b3 | ||
|
|
daf5ef1bbd | ||
|
|
85a5319c4b | ||
|
|
6ca11044a4 | ||
|
|
42be7733fe | ||
|
|
1d75c232ff | ||
|
|
97c9c9c9d1 | ||
|
|
ab52469fbb | ||
|
|
fba984272a | ||
|
|
fb3a41d3ad | ||
|
|
be7d02ebdd | ||
|
|
b989978dd3 | ||
|
|
d9c9760aac | ||
|
|
6ff88a44f0 | ||
|
|
cbcc439e03 | ||
|
|
bf282e9bd7 | ||
|
|
4c3d3af73e | ||
|
|
10648cac5b | ||
|
|
3bfcd5e105 | ||
|
|
87aca05e7f | ||
|
|
94b1d58cc2 | ||
|
|
c55cbd3f2f | ||
|
|
d89fcdcc5f | ||
|
|
76f715c486 | ||
|
|
bbab6b2fdc | ||
|
|
a8e92639af | ||
|
|
d99c2cb9a7 | ||
|
|
9f8fe3d5e3 | ||
|
|
3c8c8a7559 | ||
|
|
a61e2caadb | ||
|
|
f109d535b1 | ||
|
|
12095c721c | ||
|
|
7b873179ad | ||
|
|
f1d923714a | ||
|
|
b9ba227733 | ||
|
|
f7754a2927 | ||
|
|
125d12798d | ||
|
|
d3bec4e686 | ||
|
|
1b0e4a0067 | ||
|
|
286bef5eb7 | ||
|
|
c9b4163e23 | ||
|
|
fbedf020bc | ||
|
|
d3e9183303 | ||
|
|
aaa0c25ff7 | ||
|
|
2f43584727 | ||
|
|
e7c1cb7185 | ||
|
|
911c37e63e | ||
|
|
8b40f09e17 | ||
|
|
93dfb6f7d6 | ||
|
|
547b0a9850 | ||
|
|
4416753df0 | ||
|
|
dc54ec5b2b | ||
|
|
b682c4102e | ||
|
|
6d522e6ed6 | ||
|
|
635c87d629 | ||
|
|
a355cf24f1 | ||
|
|
bc7ad955a3 | ||
|
|
05125341f1 | ||
|
|
12332328c1 | ||
|
|
8d95d0834d | ||
|
|
db5eebd372 | ||
|
|
b119b4f1da | ||
|
|
694ab455cd | ||
|
|
46edc07ae4 | ||
|
|
2a7fc9c3a5 | ||
|
|
be23c0755e | ||
|
|
db55176212 | ||
|
|
66a445f043 | ||
|
|
6527a48897 | ||
|
|
3f9706a7f3 | ||
|
|
41fc3bcb74 | ||
|
|
d46859b9e8 | ||
|
|
51a955c75c | ||
|
|
9a89da3b33 | ||
|
|
e8da9999f6 | ||
|
|
3f5c02bf92 | ||
|
|
e918851902 | ||
|
|
e411bac592 | ||
|
|
ded81ec186 | ||
|
|
cd276030c1 | ||
|
|
818533f9f0 | ||
|
|
ff7cbab991 | ||
|
|
ad8d68dd43 | ||
|
|
0db1b6ce44 | ||
|
|
843d5a5977 | ||
|
|
406d7f1a47 | ||
|
|
7df89566f3 | ||
|
|
32b2c9fc9e | ||
|
|
3f8baeba20 | ||
|
|
1879dc4b59 | ||
|
|
ea8c6bc15e | ||
|
|
4683ce2771 | ||
|
|
798537d47b | ||
|
|
0257b02a8c | ||
|
|
27e71c5f37 | ||
|
|
cddf7e0986 | ||
|
|
2b35b3f06e | ||
|
|
92b2376c23 | ||
|
|
412902e4ae | ||
|
|
29fda9cb6c | ||
|
|
e7b3f5745c | ||
|
|
268d64d244 | ||
|
|
8f045b9ec5 | ||
|
|
2ea1c2be92 | ||
|
|
5e9ca72731 | ||
|
|
debfc0f712 | ||
|
|
1e65e7c996 | ||
|
|
d12b1650aa | ||
|
|
70a75dc88a | ||
|
|
fa090f2c9f | ||
|
|
b6bd6e399d | ||
|
|
a3b497b271 | ||
|
|
55b3cf4627 | ||
|
|
eb1c00c56b | ||
|
|
c58278758c | ||
|
|
3d0d9a250b | ||
|
|
274f018494 | ||
|
|
970d05df39 | ||
|
|
abae08a9fb | ||
|
|
a0edee51fa | ||
|
|
887474d607 | ||
|
|
3bf3c11b0b | ||
|
|
6d61919941 | ||
|
|
e07de09460 | ||
|
|
98a17f4046 | ||
|
|
f850c021b7 | ||
|
|
8600243683 | ||
|
|
c6e5987480 | ||
|
|
e0c858478a | ||
|
|
a3b15b995e | ||
|
|
57ef5289fe | ||
|
|
a63c0311bb | ||
|
|
9808829ece | ||
|
|
00b6431ad9 | ||
|
|
e020ad0c06 | ||
|
|
df0c1eb32c | ||
|
|
9057801c4b | ||
|
|
0f443ef37b | ||
|
|
a20e0b9e2e | ||
|
|
4b6bd7cae5 | ||
|
|
6f35792c74 | ||
|
|
f1b375b042 | ||
|
|
4e672427bc | ||
|
|
165068c81d | ||
|
|
89993e9cbf | ||
|
|
78ab7e7ba1 | ||
|
|
424bb589a2 | ||
|
|
664fee5c6e | ||
|
|
146a353085 | ||
|
|
214ef3dd0b | ||
|
|
406c8a6d1e | ||
|
|
6416cb45fb | ||
|
|
1db7c6233b | ||
|
|
640beafa8c | ||
|
|
44f70d2b52 | ||
|
|
acbb6fb8e2 | ||
|
|
1163961927 | ||
|
|
e1190eb1f3 | ||
|
|
dc37a8079e | ||
|
|
373cca0bf6 | ||
|
|
b32fcc7a8e | ||
|
|
e9c226b8be | ||
|
|
af9d611847 | ||
|
|
9d6c4fa678 | ||
|
|
b66233de78 | ||
|
|
ff49792f44 | ||
|
|
b2abd963f0 | ||
|
|
0ab9cf8054 | ||
|
|
c70e92e98d | ||
|
|
bf10d6c03b | ||
|
|
de084b4a0d | ||
|
|
e46cbea251 | ||
|
|
7f6e63aba5 | ||
|
|
25081f60c4 | ||
|
|
91bf41cfce | ||
|
|
552d8f394e | ||
|
|
f8e01628b2 | ||
|
|
3d1ad89963 | ||
|
|
2188bb9b88 | ||
|
|
f0000ea7d2 | ||
|
|
5b173dafae | ||
|
|
c939f2ee45 | ||
|
|
309dfeb6a8 | ||
|
|
bf3e4126b2 | ||
|
|
8a357e1866 | ||
|
|
b8135574c3 | ||
|
|
85fdf587c0 | ||
|
|
8d4a701f86 | ||
|
|
1c83144773 | ||
|
|
edb973fadc | ||
|
|
77f1b1f0fe | ||
|
|
a79d3c680c | ||
|
|
ac023f7588 | ||
|
|
f3c8f535a4 | ||
|
|
b02f6cf3bc | ||
|
|
b7c4a4fc3b | ||
|
|
9f33050a32 | ||
|
|
f73caeb6a3 | ||
|
|
15da4aaec7 | ||
|
|
9ee7b0a501 | ||
|
|
3c116f6ab3 | ||
|
|
431ef224e0 | ||
|
|
600aeb6ccc | ||
|
|
a4c646f75c | ||
|
|
7f35f98d7d | ||
|
|
8b10b0a614 | ||
|
|
a9ada13a23 | ||
|
|
1ae0e5d7cb | ||
|
|
808fac9b14 | ||
|
|
737972be2f | ||
|
|
4cb70e8e2a | ||
|
|
abf3ee6563 | ||
|
|
1a0a3d85ca | ||
|
|
1bbac9e5ce | ||
|
|
705793eae6 | ||
|
|
efa6e38741 | ||
|
|
183aea5c96 | ||
|
|
97ddf9a4f3 | ||
|
|
489366290a | ||
|
|
fb8f16373f | ||
|
|
fed352653d | ||
|
|
a697b2b60e | ||
|
|
efe9c82bc6 | ||
|
|
2bdb199169 | ||
|
|
d0dabb0ff6 | ||
|
|
27e4ece24f | ||
|
|
fc898eff65 | ||
|
|
dd317709f8 | ||
|
|
fde9842a8e | ||
|
|
3bf88110aa | ||
|
|
cc5c411039 | ||
|
|
37bdb20092 | ||
|
|
e31431140a | ||
|
|
8a66ba6c35 | ||
|
|
8a446f43ff | ||
|
|
d6b5558cf2 | ||
|
|
50c04752f5 | ||
|
|
2a91a7640c | ||
|
|
6b35250099 | ||
|
|
2ba92f92b7 | ||
|
|
0b1e371880 | ||
|
|
ce15abd577 | ||
|
|
30392bf66a | ||
|
|
71233ee894 | ||
|
|
af3059ab2a | ||
|
|
1f0ae8b06d | ||
|
|
d5af389d2e | ||
|
|
644607c29f | ||
|
|
aa477195d4 | ||
|
|
b0a9a5a756 | ||
|
|
882a62ad52 | ||
|
|
f9697c8e36 | ||
|
|
0479060858 | ||
|
|
c2e5403408 | ||
|
|
3d2b12e72a | ||
|
|
09b1eee5d0 | ||
|
|
28264423a4 | ||
|
|
87baa4d3d2 | ||
|
|
c5031c2b39 | ||
|
|
82223d3bad | ||
|
|
56dd25667d | ||
|
|
d4a171a791 | ||
|
|
978066a6de | ||
|
|
2628da4a59 | ||
|
|
ccb157c7a3 | ||
|
|
d43c803bfe | ||
|
|
eec6db0a23 | ||
|
|
983bc5cecc | ||
|
|
60435f99b9 | ||
|
|
332cda6b16 | ||
|
|
8d73f2af34 | ||
|
|
6a8219a02e | ||
|
|
c8f7d33a9a | ||
|
|
40ec2303ff | ||
|
|
19eddddcff | ||
|
|
b1e86d6fea | ||
|
|
b9283d48b5 | ||
|
|
33fc5c99ea | ||
|
|
a4581cb233 | ||
|
|
36dfc9f1bf | ||
|
|
4a55fff3b9 | ||
|
|
02f16e90b6 | ||
|
|
984a498063 | ||
|
|
c1b51c6530 | ||
|
|
224de547b3 | ||
|
|
43d2e15bb7 | ||
|
|
ac70772070 | ||
|
|
1feea366ca | ||
|
|
f599239fd4 | ||
|
|
a122d2eb50 | ||
|
|
17e7860700 | ||
|
|
34fab879cb | ||
|
|
b02ed0bbe6 | ||
|
|
165ba535f0 | ||
|
|
8253df7c3d | ||
|
|
4788da204b | ||
|
|
cf11d1e4e6 | ||
|
|
e557327860 | ||
|
|
e152cfac34 | ||
|
|
464f1f44aa | ||
|
|
bf27cb1f5e | ||
|
|
654010f639 | ||
|
|
918f84438f | ||
|
|
93e2415924 | ||
|
|
4837a2d0df | ||
|
|
be80e1a863 | ||
|
|
e53e00c4f9 | ||
|
|
90495f3ac5 | ||
|
|
6fc9e6f21e | ||
|
|
7117c4a5ee | ||
|
|
a3a7c48799 | ||
|
|
f545fb2491 | ||
|
|
e73be48d96 | ||
|
|
04b1b83039 | ||
|
|
e9d216bc84 | ||
|
|
87510ac77d | ||
|
|
44ce3e6731 | ||
|
|
26678682ca | ||
|
|
7d63900fb8 | ||
|
|
e47d56a84f | ||
|
|
9b52269a5b | ||
|
|
9992b8eb0e | ||
|
|
bab69f2672 | ||
|
|
2e33633698 | ||
|
|
eb7601d116 | ||
|
|
47df1ae40a |
10
.clang-format
Normal file
10
.clang-format
Normal file
@@ -0,0 +1,10 @@
|
||||
# Use the Google style with these modifications:
|
||||
#
|
||||
# 1) lines can be up to 100 chars long rather than 80, and
|
||||
# 2) use a four space indent rather than two spaces.
|
||||
#
|
||||
BasedOnStyle: Google
|
||||
ColumnLimit: 100
|
||||
IndentWidth: 4
|
||||
# We don't want OCLint pragmas to be reformatted.
|
||||
CommentPragmas: '^!OCLINT'
|
||||
26
.cppcheck.rules
Normal file
26
.cppcheck.rules
Normal file
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<![CDATA[
|
||||
<!-- Sadly we can't enable the following two rules since doing so causes false
|
||||
positives in standard header files rather than just project specific
|
||||
source files. If we can find a way to enable these rules by also
|
||||
excluding system include files we should do so.
|
||||
<rule version="1">
|
||||
<pattern> wcwidth \(</pattern>
|
||||
<message>
|
||||
<id>wcwidthForbidden</id>
|
||||
<severity>warning</severity>
|
||||
<summary>Always use fish_wcwidth rather than wcwidth.</summary>
|
||||
</message>
|
||||
</rule>
|
||||
|
||||
<rule version="1">
|
||||
<pattern> wcswidth \(</pattern>
|
||||
<message>
|
||||
<id>wcswidthForbidden</id>
|
||||
<severity>warning</severity>
|
||||
<summary>Always use fish_wcswidth rather than wcswidth.</summary>
|
||||
</message>
|
||||
</rule>
|
||||
<--!>
|
||||
]]>
|
||||
12
.cppcheck.suppressions
Normal file
12
.cppcheck.suppressions
Normal file
@@ -0,0 +1,12 @@
|
||||
// suppress all instances of varFuncNullUB: "Passing NULL after the last typed
|
||||
// argument to a variadic function leads to undefined behaviour." That's
|
||||
// because all the places we do this are valid and won't cause problems even
|
||||
// on a ILP64 platform because we're careful about using NULL rather than 0.
|
||||
varFuncNullUB
|
||||
// Suppress the warning about unmatched suppressions. At the moment these
|
||||
// warnings are emitted even when removing the suppression comment results in
|
||||
// the warning being suppressed. In other words this unmatchedSuppression
|
||||
// warnings are false positives.
|
||||
unmatchedSuppression
|
||||
// Suppress this one because it reports assert(condition && "message"), which we use all over the place
|
||||
incorrectStringBooleanError
|
||||
22
.editorconfig
Normal file
22
.editorconfig
Normal file
@@ -0,0 +1,22 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
max_line_length = 100
|
||||
|
||||
[{Makefile,*.in}]
|
||||
indent_style = tab
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{sh,ac}]
|
||||
indent_size = 2
|
||||
|
||||
[Dockerfile]
|
||||
indent_size = 2
|
||||
28
.gitattributes
vendored
28
.gitattributes
vendored
@@ -1,4 +1,30 @@
|
||||
# normalize newlines
|
||||
* text=auto
|
||||
*.fish text
|
||||
*.bat eol=crlf
|
||||
|
||||
# let git show off diff hunk headers, help git diff -L:
|
||||
# https://git-scm.com/docs/gitattributes
|
||||
*.cpp diff=cpp
|
||||
*.py diff=py
|
||||
# add a [diff "fish"] to git config with pattern
|
||||
*.fish diff=fish
|
||||
|
||||
# omit from git archive
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
/build_tools export-ignore
|
||||
/build_tools/make_tarball.sh export-ignore
|
||||
/debian export-ignore
|
||||
/debian/* export-ignore
|
||||
/.github export-ignore
|
||||
/.github/* export-ignore
|
||||
|
||||
# for linguist; let github identify our project as C++ instead of C due to pcre2
|
||||
/pcre2-10.22/ linguist-vendored
|
||||
/pcre2-10.22/* linguist-vendored
|
||||
/muparser-2.2.5/ linguist-vendored
|
||||
/muparser-2.2.5/* linguist-vendored
|
||||
angular.js linguist-vendored
|
||||
/doc_src/* linguist-documentation
|
||||
*.fish linguist-language=fish
|
||||
tests/*.in linguist-language=fish
|
||||
|
||||
14
.github/ISSUE_TEMPLATE.md
vendored
Normal file
14
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
<!--
|
||||
Please tell us which fish version you are using by executing the following:
|
||||
|
||||
fish --version
|
||||
echo $version
|
||||
|
||||
Please tell us which operating system and terminal you are using. The output of `uname -a` and `echo $TERM` may be helpful in this regard although other commands might be relevant in your specific situation.
|
||||
|
||||
Please tell us if you tried fish without third-party customizations by executing this command and whether it affected the behavior you are reporting:
|
||||
|
||||
sh -c 'env HOME=$(mktemp -d) fish'
|
||||
|
||||
Tell us how to reproduce the problem. Including an asciinema.org recording is useful for problems that involve the visual display of fish output such as its prompt.
|
||||
-->
|
||||
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
## Description
|
||||
|
||||
Talk about your changes here.
|
||||
|
||||
Fixes issue #
|
||||
|
||||
## TODOs:
|
||||
<!-- Just check off what what we know been done so far. We can help you with this stuff. -->
|
||||
- [ ] Changes to fish usage are reflected in user documentation/manpages.
|
||||
- [ ] Tests have been added for regressions fixed
|
||||
- [ ] User-visible changes noted in CHANGELOG.md
|
||||
128
.gitignore
vendored
128
.gitignore
vendored
@@ -1,34 +1,104 @@
|
||||
*.o
|
||||
*~
|
||||
# Note that some of the patterns below should be in an individual's
|
||||
# ~/.config/git/ignore file. For example, ".DS_Store" from people working on
|
||||
# MacOS.
|
||||
|
||||
Doxyfile.help
|
||||
# File extensions that should never be checked in regardless of which project
|
||||
# directory they reside in.
|
||||
*.DS_Store
|
||||
*.a
|
||||
*.app
|
||||
*.d
|
||||
*.dll
|
||||
*.dylib
|
||||
*.exe
|
||||
*.gch
|
||||
*.la
|
||||
*.lai
|
||||
*.lib
|
||||
*.lo
|
||||
*.log
|
||||
*.new
|
||||
*.o
|
||||
*.obj
|
||||
*.orig
|
||||
!tests/*.out
|
||||
*.out
|
||||
*.pch
|
||||
*.slo
|
||||
*.so
|
||||
*.xccheckout
|
||||
*bak
|
||||
*~
|
||||
*~HEAD
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
.Trash-*
|
||||
._*
|
||||
Desktop.ini
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
|
||||
# These file names can appear anywhere in the hierarchy. They tend to be OS
|
||||
# or build system artifacts.
|
||||
autom4te.cache
|
||||
aclocal.m4
|
||||
Makefile
|
||||
autom4te.cache/
|
||||
builtin_scripts.cpp
|
||||
builtin_scripts.h
|
||||
command_list.txt
|
||||
config.h
|
||||
config.cache
|
||||
config.h.in
|
||||
config.log
|
||||
config.status
|
||||
configure
|
||||
doc.h
|
||||
doc_src/commands.hdr
|
||||
doc_src/index.hdr
|
||||
po/*.gmo
|
||||
fish
|
||||
fish.spec
|
||||
fish_indent
|
||||
fish_pager
|
||||
fish_tests
|
||||
fishd
|
||||
mimedb
|
||||
seq
|
||||
set_color
|
||||
share/config.fish
|
||||
share/man/
|
||||
toc.txt
|
||||
user_doc/
|
||||
xsel-1.2.0/
|
||||
tests/*tmp.*
|
||||
tests/foo.txt
|
||||
messages.pot
|
||||
.directory
|
||||
.fuse_hidden*
|
||||
|
||||
|
||||
# Directories that only contain transitory files from building and testing.
|
||||
/doc/
|
||||
/obj/
|
||||
/share/man/
|
||||
/share/doc/
|
||||
/test/
|
||||
/user_doc/
|
||||
|
||||
# File names that can appear in the project root that represent artifacts from
|
||||
# building and testing.
|
||||
/FISH-BUILD-VERSION-FILE
|
||||
/command_list.txt
|
||||
/command_list_toc.txt
|
||||
/compile_commands.json
|
||||
/confdefs.h
|
||||
/configure
|
||||
/doc.h
|
||||
/fish
|
||||
/fish.pc
|
||||
/fish_indent
|
||||
/fish_key_reader
|
||||
/fish_tests
|
||||
/lexicon.txt
|
||||
/lexicon_filter
|
||||
/toc.txt
|
||||
/version
|
||||
fish-build-version-witness.txt
|
||||
|
||||
# File names that can appear below the project root that represent artifacts
|
||||
# from building and testing.
|
||||
/doc_src/commands.hdr
|
||||
/doc_src/index.hdr
|
||||
/pcre2-*/configure.lineno
|
||||
/po/*.gmo
|
||||
/share/__fish_build_paths.fish
|
||||
/share/pkgconfig
|
||||
/tests/*.tmp.*
|
||||
|
||||
# xcode
|
||||
## Build generated
|
||||
*.moved-aside
|
||||
*.xccheckout
|
||||
*.xcscmblueprin
|
||||
.vscode
|
||||
/DerivedData/
|
||||
/build/
|
||||
/tags
|
||||
xcuserdata/
|
||||
|
||||
|
||||
95
.oclint
Normal file
95
.oclint
Normal file
@@ -0,0 +1,95 @@
|
||||
rules:
|
||||
rule-configurations:
|
||||
#
|
||||
# This is the default value (as of the time I wrote this) but I'm making
|
||||
# it explicit since it needs to agree with the value used by clang-format.
|
||||
# Thus, if we ever change the fish style to allow longer or shorter lines
|
||||
# this should be changed (as well as the corresponding .clang-format file).
|
||||
#
|
||||
- key: LONG_LINE
|
||||
value: 100
|
||||
#
|
||||
# The default limit for the length of variable names is 20. Long names are
|
||||
# problematic but twenty chars results in way too many errors. So increase
|
||||
# the limit to something more reasonable.
|
||||
#
|
||||
- key: LONG_VARIABLE_NAME
|
||||
value: 30
|
||||
#
|
||||
# This allows us to avoid peppering our code with inline comments such as
|
||||
#
|
||||
# scoped_lock locker(m_lock); //!OCLINT(side-effect)
|
||||
#
|
||||
# Specifically, this config key tells oclint that the named classes have
|
||||
# RAII behavior so the local vars are actually used.
|
||||
#
|
||||
- key: RAII_CUSTOM_CLASSES
|
||||
value: scoped_lock scoped_buffer_t builtin_commandline_scoped_transient_t scoped_push
|
||||
|
||||
# We're slightly more persmissive regarding the total number of lines in a
|
||||
# function. Default is 50.
|
||||
- key: LONG_METHOD
|
||||
value: 60
|
||||
|
||||
# We're slightly more persmissive regarding the number of non-comment
|
||||
# lines in a function. Default is 30.
|
||||
- key: NCSS_METHOD
|
||||
value: 40
|
||||
|
||||
# We're willing to allow slighly more linearly independent paths through a
|
||||
# function. Most of our code has a lot of `switch` blocks or consecutive
|
||||
# `if` tests that are straightforward to interpret but which increase this
|
||||
# metric. Default is 10.
|
||||
- key: CYCLOMATIC_COMPLEXITY
|
||||
value: 14
|
||||
|
||||
# We're willing to allow slighly more execution paths through a function.
|
||||
# Default is 200.
|
||||
- key: NPATH_COMPLEXITY
|
||||
value: 300
|
||||
|
||||
disable-rules:
|
||||
#
|
||||
# A few instances of "useless parentheses" errors are meaningful. Mostly
|
||||
# in the context of the `return` statement. Unfortunately the vast
|
||||
# majority would result in removing parentheses that decreases
|
||||
# readability. So we're going to ignore this warning and rely on humans to
|
||||
# notice when the parentheses are truly not needed.
|
||||
#
|
||||
# Also, some macro expansions, such as FD_SET(), trigger this warning and
|
||||
# we don't want to suppress each of those individually.
|
||||
#
|
||||
- UselessParentheses
|
||||
#
|
||||
# OCLint wants variable names to be at least three characters in length.
|
||||
# Which would be fine if it supported a reasonable set of exceptions
|
||||
# (e.g., "i", "j", "k") and allowed adding additional exceptions to match
|
||||
# conventions employed by a project. Since it doesn't, and thus generates
|
||||
# a lot of really annoying warnings, we're going to disable this rule.
|
||||
#
|
||||
- ShortVariableName
|
||||
#
|
||||
# This rule flags perfectly reasonable conditions like `if (!some_condition)`
|
||||
# and is therefore just noise. Disable this rule.
|
||||
#
|
||||
- InvertedLogic
|
||||
#
|
||||
# The idea behind the "double negative" rule is sound since constructs
|
||||
# like "!!(var & flag)" should be written as "static_cast<bool>(var &
|
||||
# flag)". Unfortunately this rule has way too many false positives;
|
||||
# especially in the context of assert statements. So disable this rule.
|
||||
#
|
||||
- DoubleNegative
|
||||
#
|
||||
# Avoiding bitwise operators in a conditional is a good idea with one
|
||||
# exception: testing whether a bit flag is set. Which happens to be the
|
||||
# only time you'll see something like `if (j->flags & JOB_CONSTRUCTED)`
|
||||
# in fish source.
|
||||
#
|
||||
- BitwiseOperatorInConditional
|
||||
#
|
||||
# I don't think I've ever seen a case where assigning a value to a
|
||||
# parameter inside the function body was unclear, let along dangerous or
|
||||
# an error. This rule is therefore just noise. Disable this rule.
|
||||
#
|
||||
- ParameterReassignment
|
||||
94
.travis.yml
Normal file
94
.travis.yml
Normal file
@@ -0,0 +1,94 @@
|
||||
language: cpp
|
||||
dist: trusty
|
||||
sudo: required
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- bc
|
||||
- expect
|
||||
- gettext
|
||||
- libncurses5-dev
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- bc
|
||||
- expect
|
||||
- gettext
|
||||
- lib32ncurses5-dev
|
||||
- g++-multilib
|
||||
env:
|
||||
- CXXFLAGS="-g -O2 -m32" CFLAGS="-g -m32"
|
||||
- os: linux
|
||||
compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- bc
|
||||
- expect
|
||||
- gettext
|
||||
- libncurses5-dev
|
||||
- cmake
|
||||
env:
|
||||
- USE_CMAKE="1" # Dummy value, shows up in the Travis UI only
|
||||
script:
|
||||
- cmake -DCMAKE_INSTALL_PREFIX=$HOME/prefix . || cat CMakeFiles/CMakeError.log &&
|
||||
make -j2 &&
|
||||
make install &&
|
||||
make test SHOW_INTERACTIVE_LOG=1
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env:
|
||||
- CXXFLAGS="-g -O2 -fno-omit-frame-pointer -fsanitize=address" ASAN_OPTIONS=check_initialization_order=1:detect_stack_use_after_return=1:detect_leaks=1
|
||||
before_install: export CXX=clang++-3.8
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.8
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang-3.8
|
||||
- llvm-3.8 # for llvm-symbolizer
|
||||
- bc
|
||||
- expect
|
||||
- gettext
|
||||
- libncurses5-dev
|
||||
- os: osx
|
||||
before_install:
|
||||
- brew update
|
||||
- brew install pcre2 # use system PCRE2
|
||||
- brew outdated xctool || brew upgrade xctool # for xcode... soon.
|
||||
env:
|
||||
- CXXFLAGS="-g -O2 -lstdc++"
|
||||
fast_finish: true
|
||||
|
||||
script:
|
||||
- autoreconf --no-recursive
|
||||
- ./configure --prefix=$HOME/prefix || cat config.log
|
||||
- make -j2 &&
|
||||
make test DESTDIR=$HOME/prefix/ SHOW_INTERACTIVE_LOG=1 &&
|
||||
make uninstall &&
|
||||
echo "Checking for leftover files after make uninstall" &&
|
||||
find $HOME/prefix/ -type f -print -exec false '{}' +
|
||||
|
||||
notifications:
|
||||
# Some items are encrypted so that notifications from other repositories
|
||||
# don't flood the official repositories.
|
||||
irc:
|
||||
channels:
|
||||
#- "irc.oftc.net#fish"
|
||||
secure: "eRk9KGZ5+mrlD2SoI8yg2Sp8OYrh7YPyGe3WCDQUwTnNgNDII34rbM9a6UOA/l7AeWSNY8joLq5xVLCU4wpFgUcJ11SYIpMnLosZK29OW4ubDOHmdBDvJ971rLgAVG9cXngZtIxEVVxN/jnS1Qr8GKZx4DjkaTMgz1pemb4WxCc="
|
||||
template:
|
||||
- "%{repository}#%{build_number} (%{commit} on %{branch} by %{author}): %{message} Details at %{build_url}"
|
||||
use_notice: true
|
||||
skip_join: true
|
||||
webhooks:
|
||||
urls:
|
||||
#- https://webhooks.gitter.im/e/61821cec3015bf0f8bb1
|
||||
secure: fPfOmxnC3MCsfR1oocVFeWLawGcRZkn+8fNHlSOeZ+SqqoZfcCHgQTvQ22TqmVl1yvkXbNlaXjo6dbVzTOAh7r7H0bRMEKBVh3dQS7wqjB1sKivpXd8PAS3BTj5MQpGeJzdHnDuwVlwDktGtfHfhGeq1Go/4IosOq8u+6RTe28g=
|
||||
44
BSDmakefile
Normal file
44
BSDmakefile
Normal file
@@ -0,0 +1,44 @@
|
||||
# by default bmake will cd into ./obj first
|
||||
.OBJDIR: ./
|
||||
|
||||
.BEGIN:
|
||||
# test for cmake, which is the only requirement to be able to run this Makefile
|
||||
# cmake will perform the remaining dependency tests on its own
|
||||
@which cmake >/dev/null 2>/dev/null || (echo 'Please install cmake and then re-run the `make` command!' 1>&2 && false)
|
||||
|
||||
# Use ninja, if it is installed
|
||||
_GENERATOR!=which ninja 2>/dev/null >/dev/null && echo Ninja || echo "'Unix Makefiles'"
|
||||
GENERATOR?=$(_GENERATOR)
|
||||
PREFIX?=/usr/local
|
||||
|
||||
.if $(GENERATOR) == "Ninja"
|
||||
BUILDFILE=build/build.ninja
|
||||
.else
|
||||
BUILDFILE=build/Makefile
|
||||
.endif
|
||||
|
||||
.DEFAULT: build/fish
|
||||
build/fish: build/$(BUILDFILE)
|
||||
cmake --build build
|
||||
|
||||
build:
|
||||
mkdir -p build
|
||||
|
||||
build/$(BUILDFILE): build
|
||||
cd build; cmake .. -G $(GENERATOR) -DCMAKE_INSTALL_PREFIX=$(PREFIX) -DCMAKE_EXPORT_COMPILE_COMMANDS=1
|
||||
|
||||
.PHONY: install
|
||||
install: build/fish
|
||||
cmake --build build --target install
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf build
|
||||
|
||||
.PHONY: test
|
||||
test: build/fish
|
||||
cmake --build build --target test
|
||||
|
||||
.PHONY: run
|
||||
run: build/fish
|
||||
build/fish
|
||||
@@ -1,3 +0,0 @@
|
||||
24-01-2012 Jan Kanis
|
||||
* Added a changelog file
|
||||
* removed unescaping if the 'commandline' builtin is called without the -o (tokenise) flag
|
||||
913
CHANGELOG.md
Normal file
913
CHANGELOG.md
Normal file
@@ -0,0 +1,913 @@
|
||||
# fish 3.0.0 (released December 28, 2018)
|
||||
|
||||
fish 3 is a major release, which introduces some breaking changes alongside improved functionality. Although most existing scripts will continue to work, they should be reviewed against the list contained in the 3.0b1 release notes below.
|
||||
|
||||
Compared to the beta release of fish 3.0b1, fish version 3.0.0:
|
||||
|
||||
- builds correctly against musl libc (#5407)
|
||||
- handles huge numeric arguments to `test` correctly (#5414)
|
||||
- removes the history colouring introduced in 3.0b1, which did not always work correctly
|
||||
|
||||
There is one significant known issue which was not able to be corrected before the release:
|
||||
|
||||
- fish 3.0.0 builds on Cygwin (#5423), but does not run correctly (#5426) and will result in a hanging terminal when started. Cygwin users are encouraged to continue using 2.7.1 until a release which corrects this is available.
|
||||
|
||||
If you are upgrading from version 2.7.1 or before, please also review the release notes for 3.0b1 (included below).
|
||||
|
||||
---
|
||||
|
||||
# fish 3.0b1 (released December 11, 2018)
|
||||
|
||||
fish 3 is a major release, which introduces some breaking changes alongside improved functionality. Although most existing scripts will continue to work, they should be reviewed against the list below.
|
||||
|
||||
## Notable non-backward compatible changes
|
||||
- Process and job expansion has largely been removed. `%` will no longer perform these expansions, except for `%self` for the PID of the current shell. Additionally, job management commands (`disown`, `wait`, `bg`, `fg` and `kill`) will expand job specifiers starting with `%` (#4230, #1202).
|
||||
- `set x[1] x[2] a b`, to set multiple elements of an array at once, is no longer valid syntax (#4236).
|
||||
- A literal `{}` now expands to itself, rather than nothing. This makes working with `find -exec` easier (#1109, #4632).
|
||||
- Literally accessing a zero-index is now illegal syntax and is caught by the parser (#4862). (fish indices start at 1)
|
||||
- Successive commas in brace expansions are handled in less surprising manner. For example, `{,,,}` expands to four empty strings rather than an empty string, a comma and an empty string again (#3002, #4632).
|
||||
- `for` loop control variables are no longer local to the `for` block (#1935).
|
||||
- Variables set in `if` and `while` conditions are available outside the block (#4820).
|
||||
- Local exported (`set -lx`) vars are now visible to functions (#1091).
|
||||
- The new `math` builtin (see below) does not support logical expressions; `test` should be used instead (#4777).
|
||||
- Range expansion will now behave sensibly when given a single positive and negative index (`$foo[5..-1]` or `$foo[-1..5]`), clamping to the last valid index without changing direction if the list has fewer elements than expected.
|
||||
- `read` now uses `-s` as short for `--silent` (à la `bash`); `--shell`'s abbreviation (formerly `-s`) is now `-S` instead (#4490).
|
||||
- `cd` no longer resolves symlinks. fish now maintains a virtual path, matching other shells (#3350).
|
||||
- `source` now requires an explicit `-` as the filename to read from the terminal (#2633).
|
||||
- Arguments to `end` are now errors, instead of being silently ignored.
|
||||
- The names `argparse`, `read`, `set`, `status`, `test` and `[` are now reserved and not allowed as function names. This prevents users unintentionally breaking stuff (#3000).
|
||||
- The `fish_user_abbreviations` variable is no longer used; abbreviations will be migrated to the new storage format automatically.
|
||||
- The `FISH_READ_BYTE_LIMIT` variable is now called `fish_byte_limit` (#4414).
|
||||
- Environment variables are no longer split into arrays based on the record separator character on startup. Instead, variables are not split, unless their name ends in PATH, in which case they are split on colons (#436).
|
||||
- The `history` builtin's `--with-time` option has been removed; this has been deprecated in favor of `--show-time` since 2.7.0 (#4403).
|
||||
- The internal variables `__fish_datadir` and `__fish_sysconfdir` are now known as `__fish_data_dir` and `__fish_sysconf_dir` respectively.
|
||||
|
||||
## Deprecations
|
||||
|
||||
With the release of fish 3, a number of features have been marked for removal in the future. All users are encouraged to explore alternatives. A small number of these features are currently behind feature flags, which are turned on at present but may be turned off by default in the future.
|
||||
|
||||
A new feature flags mechanism is added for staging deprecations and breaking changes. Feature flags may be specified at launch with `fish --features ...` or by setting the universal `fish_features` variable. (#4940)
|
||||
|
||||
- The use of the `IFS` variable for `read` is deprecated; `IFS` will be ignored in the future (#4156). Use the `read --delimiter` option instead.
|
||||
- The `function --on-process-exit` switch will be removed in future (#4700). Use the `fish_exit` event instead: `function --on-event fish_exit`.
|
||||
- `$_` is deprecated and will removed in the future (#813). Use `status current-command` in a command substitution instead.
|
||||
- `^` as a redirection deprecated and will be removed in the future. (#4394). Use `2>` to redirect stderr. This is controlled by the `stderr-nocaret` feature flag.
|
||||
- `?` as a glob (wildcard) is deprecated and will be removed in the future (#4520). This is controlled by the `qmark-noglob` feature flag.
|
||||
|
||||
## Notable fixes and improvements
|
||||
### Syntax changes and new commands
|
||||
- fish now supports `&&` (like `and`), `||` (like `or`), and `!` (like `not`), for better migration from POSIX-compliant shells (#4620).
|
||||
- Variables may be used as commands (#154).
|
||||
- fish may be started in private mode via `fish --private`. Private mode fish sessions do not have access to the history file and any commands evaluated in private mode are not persisted for future sessions. A session variable `$fish_private_mode` can be queried to detect private mode and adjust the behavior of scripts accordingly to respect the user's wish for privacy.
|
||||
- A new `wait` command for waiting on backgrounded processes (#4498).
|
||||
- `math` is now a builtin rather than a wrapper around `bc` (#3157). Floating point computations is now used by default, and can be controlled with the new `--scale` option (#4478).
|
||||
- Setting `$PATH` no longer warns on non-existent directories, allowing for a single $PATH to be shared across machines (eg via dotfiles) (#2969).
|
||||
- `while` sets `$status` to a non-zero value if the loop is not executed (#4982).
|
||||
- Command substitution output is now limited to 10 MB by default, controlled by the `fish_read_limit` variable (#3822). Notably, this is larger than most operating systems' argument size limit, so trying to pass argument lists this size to external commands has never worked.
|
||||
- The machine hostname, where available, is now exposed as the `$hostname` reserved variable. This removes the dependency on the `hostname` executable (#4422).
|
||||
- Bare `bind` invocations in config.fish now work. The `fish_user_key_bindings` function is no longer necessary, but will still be executed if it exists (#5191).
|
||||
- `$fish_pid` and `$last_pid` are available as replacements for `%self` and `%last`.
|
||||
|
||||
### New features in commands
|
||||
- `alias` has a new `--save` option to save the generated function immediately (#4878).
|
||||
- `bind` has a new `--silent` option to ignore bind requests for named keys not available under the current terminal (#4188, #4431).
|
||||
- `complete` has a new `--keep-order` option to show the provided or dynamically-generated argument list in the same order as specified, rather than alphabetically (#361).
|
||||
- `exec` prompts for confirmation if background jobs are running.
|
||||
- `funced` has a new `--save` option to automatically save the edited function after successfully editing (#4668).
|
||||
- `functions` has a new ` --handlers` option to show functions registered as event handlers (#4694).
|
||||
- `history search` supports globs for wildcard searching (#3136) and has a new `--reverse` option to show entries from oldest to newest (#4375).
|
||||
- `jobs` has a new `--quiet` option to silence the output.
|
||||
- `read` has a new `--delimiter` option for splitting input into arrays (#4256).
|
||||
- `read` writes directly to stdout if called without arguments (#4407).
|
||||
- `read` can now read individual lines into separate variables without consuming the input in its entirety via the new `/--line` option.
|
||||
- `set` has new `--append` and `--prepend` options (#1326).
|
||||
- `set` has a new `--show` option to show lots of information about variables (#4265).
|
||||
- `string match` with an empty pattern and `--entire` in glob mode now matches everything instead of nothing (#4971).
|
||||
- `string split` supports a new `--no-empty` option to exclude empty strings from the result (#4779).
|
||||
- `string` has new subcommands `split0` and `join0` for working with NUL-delimited output.
|
||||
- `string` no longer stops processing text after NUL characters (#4605)
|
||||
- `string escape` has a new `--style regex` option for escaping strings to be matched literally in `string` regex operations.
|
||||
- `test` now supports floating point values in numeric comparisons.
|
||||
|
||||
### Interactive improvements
|
||||
- A pipe at the end of a line now allows the job to continue on the next line (#1285).
|
||||
- Italics and dim support out of the box on macOS for Terminal.app and iTerm (#4436).
|
||||
- `cd` tab completions no longer descend into the deepest unambiguous path (#4649).
|
||||
- Pager navigation has been improved. Most notably, moving down now wraps around, moving up from the commandline now jumps to the last element and moving right and left now reverse each other even when wrapping around (#4680).
|
||||
- Typing normal characters while the completion pager is active no longer shows the search field. Instead it enters them into the command line, and ends paging (#2249).
|
||||
- A new input binding `pager-toggle-search` toggles the search field in the completions pager on and off. By default, this is bound to Ctrl-S.
|
||||
- Searching in the pager now does a full fuzzy search (#5213).
|
||||
- The pager will now show the full command instead of just its last line if the number of completions is large (#4702).
|
||||
- Abbreviations can be tab-completed (#3233).
|
||||
- Tildes in file names are now properly escaped in completions (#2274).
|
||||
- Wrapping completions (from `complete --wraps` or `function --wraps`) can now inject arguments. For example, `complete gco --wraps 'git checkout'` now works properly (#1976). The `alias` function has been updated to respect this behavior.
|
||||
- Path completions now support expansions, meaning expressions like `python ~/<TAB>` now provides file suggestions just like any other relative or absolute path. (This includes support for other expansions, too.)
|
||||
- Autosuggestions try to avoid arguments that are already present in the command line.
|
||||
- Notifications about crashed processes are now always shown, even in command substitutions (#4962).
|
||||
- The screen is no longer reset after a BEL, fixing graphical glitches (#3693).
|
||||
- vi-mode now supports ';' and ',' motions. This introduces new {forward,backward}-jump-till and repeat-jump{,-reverse} bind functions (#5140).
|
||||
- The `*y` vi-mode binding now works (#5100).
|
||||
- True color is now enabled in neovim by default (#2792).
|
||||
- Terminal size variables (`$COLUMNS`/`$LINES`) are now updated before `fish_prompt` is called, allowing the prompt to react (#904).
|
||||
- Multi-line prompts no longer repeat when the terminal is resized (#2320).
|
||||
- `xclip` support has been added to the clipboard integration (#5020).
|
||||
- The Alt-P keybinding paginates the last command if the command line is empty.
|
||||
- `$cmd_duration` is no longer reset when no command is executed (#5011).
|
||||
- Deleting a one-character word no longer erases the next word as well (#4747).
|
||||
- Token history search (Alt-Up) omits duplicate entries (#4795).
|
||||
- The `fish_escape_delay_ms` timeout, allowing the use of the escape key both on its own and as part of a control sequence, was applied to all control characters; this has been reduced to just the escape key.
|
||||
- Completing a function shows the description properly (#5206).
|
||||
- Added completions for
|
||||
- `ansible`, including `ansible-galaxy`, `ansible-playbook` and `ansible-vault` (#4697)
|
||||
- `bb-power` (#4800)
|
||||
- `bd` (#4472)
|
||||
- `bower`
|
||||
- `clang` and `clang++` (#4174)
|
||||
- `conda` (#4837)
|
||||
- `configure` (for autoconf-generated files only)
|
||||
- `curl`
|
||||
- `doas` (#5196)
|
||||
- `ebuild` (#4911)
|
||||
- `emaint` (#4758)
|
||||
- `eopkg` (#4600)
|
||||
- `exercism` (#4495)
|
||||
- `hjson`
|
||||
- `hugo` (#4529)
|
||||
- `j` (from autojump #4344)
|
||||
- `jbake` (#4814)
|
||||
- `jhipster` (#4472)
|
||||
- `kitty`
|
||||
- `kldload`
|
||||
- `kldunload`
|
||||
- `makensis` (#5242)
|
||||
- `meson`
|
||||
- `mkdocs` (#4906)
|
||||
- `ngrok` (#4642)
|
||||
- OpenBSD's `pkg_add`, `pkg_delete`, `pkg_info`, `pfctl`, `rcctl`, `signify`, and `vmctl` (#4584)
|
||||
- `openocd`
|
||||
- `optipng`
|
||||
- `opkg` (#5168)
|
||||
- `pandoc` (#2937)
|
||||
- `port` (#4737)
|
||||
- `powerpill` (#4800)
|
||||
- `pstack` (#5135)
|
||||
- `serve` (#5026)
|
||||
- `ttx`
|
||||
- `unzip`
|
||||
- `virsh` (#5113)
|
||||
- `xclip` (#5126)
|
||||
- `xsv`
|
||||
- `zfs` and `zpool` (#4608)
|
||||
- Lots of improvements to completions (especially `darcs` (#5112), `git`, `hg` and `sudo`).
|
||||
- Completions for `yarn` and `npm` now require the `all-the-package-names` NPM package for full functionality.
|
||||
- Completions for `bower` and `yarn` now require the `jq` utility for full functionality.
|
||||
- Improved French translations.
|
||||
|
||||
### Other fixes and improvements
|
||||
- Significant performance improvements to `abbr` (#4048), setting variables (#4200, #4341), executing functions, globs (#4579), `string` reading from standard input (#4610), and slicing history (in particular, `$history[1]` for the last executed command).
|
||||
- Fish's internal wcwidth function has been updated to deal with newer Unicode, and the width of some characters can be configured via the `fish_ambiguous_width` (#5149) and `fish_emoji_width` (#2652) variables. Alternatively, a new build-time option INTERNAL_WCWIDTH can be used to use the system's wcwidth instead (#4816).
|
||||
- `functions` correctly supports `-d` as the short form of `--description`. (#5105)
|
||||
- `/etc/paths` is now parsed like macOS' bash `path_helper`, fixing $PATH order (#4336, #4852) on macOS.
|
||||
- Using a read-only variable in a `for` loop produces an error, rather than silently producing incorrect results (#4342).
|
||||
- The universal variables filename no longer contains the hostname or MAC address. It is now at the fixed location `.config/fish/fish_variables` (#1912).
|
||||
- Exported variables in the global or universal scope no longer have their exported status affected by local variables (#2611).
|
||||
- Major rework of terminal and job handling to eliminate bugs (#3805, #3952, #4178, #4235, #4238, #4540, #4929, #5210).
|
||||
- Improvements to the manual page completion generator (#2937, #4313).
|
||||
- `suspend --force` now works correctly (#4672).
|
||||
- Pressing Ctrl-C while running a script now reliably terminates fish (#5253).
|
||||
|
||||
### For distributors and developers
|
||||
- fish ships with a new build system based on CMake. CMake 3.2 is the minimum required version. Although the autotools-based Makefile and the Xcode project are still shipped with this release, they will be removed in the near future. All distributors and developers are encouraged to migrate to the CMake build.
|
||||
- Build scripts for most platforms no longer require bash, using the standard sh instead.
|
||||
- The `hostname` command is no longer required for fish to operate.
|
||||
|
||||
--
|
||||
|
||||
# fish 2.7.1 (released December 23, 2017)
|
||||
|
||||
This release of fish fixes an issue where iTerm 2 on macOS would display a warning about paste bracketing being left on when starting a new fish session (#4521).
|
||||
|
||||
If you are upgrading from version 2.6.0 or before, please also review the release notes for 2.7.0 and 2.7b1 (included below).
|
||||
|
||||
--
|
||||
|
||||
# fish 2.7.0 (released November 23, 2017)
|
||||
|
||||
There are no major changes between 2.7b1 and 2.7.0. If you are upgrading from version 2.6.0 or before, please also review the release notes for 2.7b1 (included below).
|
||||
|
||||
Xcode builds and macOS packages could not be produced with 2.7b1, but this is fixed in 2.7.0.
|
||||
|
||||
--
|
||||
|
||||
# fish 2.7b1 (released October 31, 2017)
|
||||
|
||||
## Notable improvements
|
||||
- A new `cdh` (change directory using recent history) command provides a more friendly alternative to prevd/nextd and pushd/popd (#2847).
|
||||
- A new `argparse` command is available to allow fish script to parse arguments with the same behavior as builtin commands. This also includes the `fish_opt` helper command. (#4190).
|
||||
- Invalid array indexes are now silently ignored (#826, #4127).
|
||||
- Improvements to the debugging facility, including a prompt specific to the debugger (`fish_breakpoint_prompt`) and a `status is-breakpoint` subcommand (#1310).
|
||||
- `string` supports new `lower` and `upper` subcommands, for altering the case of strings (#4080). The case changing is not locale-aware yet.- `string escape` has a new `--style=xxx` flag where `xxx` can be `script`, `var`, or `url` (#4150), and can be reversed with `string unescape` (#3543).
|
||||
- History can now be split into sessions with the `fish_history` variable, or not saved to disk at all (#102).
|
||||
- Read history is now controlled by the `fish_history` variable rather than the `--mode-name` flag (#1504).
|
||||
- `command` now supports an `--all` flag to report all directories with the command. `which` is no longer a runtime dependency (#2778).
|
||||
- fish can run commands before starting an interactive session using the new `--init-command`/`-C` options (#4164).
|
||||
- `set` has a new `--show` option to show lots of information about variables (#4265).
|
||||
|
||||
## Other significant changes
|
||||
- The `COLUMNS` and `LINES` environment variables are now correctly set the first time `fish_prompt` is run (#4141).
|
||||
- `complete`'s `--no-files` option works as intended (#112).
|
||||
- `echo -h` now correctly echoes `-h` in line with other shells (#4120).
|
||||
- The `export` compatibility function now returns zero on success, rather than always returning 1 (#4435).
|
||||
- Stop converting empty elements in MANPATH to "." (#4158). The behavior being changed was introduced in fish 2.6.0.
|
||||
- `count -h` and `count --help` now return 1 rather than produce command help output (#4189).
|
||||
- An attempt to `read` which stops because too much data is available still defines the variables given as parameters (#4180).
|
||||
- A regression in fish 2.4.0 which prevented `pushd +1` from working has been fixed (#4091).
|
||||
- A regression in fish 2.6.0 where multiple `read` commands in non-interactive scripts were broken has been fixed (#4206).
|
||||
- A regression in fish 2.6.0 involving universal variables with side-effects at startup such as `set -U fish_escape_delay_ms 10` has been fixed (#4196).
|
||||
- Added completions for:
|
||||
- `as` (#4130)
|
||||
- `cdh` (#2847)
|
||||
- `dhcpd` (#4115)
|
||||
- `ezjail-admin` (#4324)
|
||||
- Fabric's `fab` (#4153)
|
||||
- `grub-file` (#4119)
|
||||
- `grub-install` (#4119)
|
||||
- `jest` (#4142)
|
||||
- `kdeconnect-cli`
|
||||
- `magneto` (#4043, #4108)
|
||||
- `mdadm` (#4198)
|
||||
- `passwd` (#4209)
|
||||
- `pip` and `pipenv` (#4448)
|
||||
- `s3cmd` (#4332)
|
||||
- `sbt` (#4347)
|
||||
- `snap` (#4215)
|
||||
- Sublime Text 3's `subl` (#4277)
|
||||
- Lots of improvements to completions.
|
||||
- Updated Chinese and French translations.
|
||||
|
||||
- Improved completions for:
|
||||
- `apt`
|
||||
- `cd` (#4061)
|
||||
- `composer` (#4295)
|
||||
- `eopkg`
|
||||
- `flatpak` (#4456)
|
||||
- `git` (#4117, #4147, #4329, #4368)
|
||||
- `gphoto2`
|
||||
- `killall` (#4052)
|
||||
- `ln`
|
||||
- `npm` (#4241)
|
||||
- `ssh` (#4377)
|
||||
- `tail`
|
||||
- `xdg-mime` (#4333)
|
||||
- `zypper` (#4325)
|
||||
---
|
||||
|
||||
# fish 2.6.0 (released June 3, 2017)
|
||||
|
||||
Since the beta release of fish 2.6b1, fish version 2.6.0 contains a number of minor fixes, new completions for `magneto` (#4043), and improvements to the documentation.
|
||||
|
||||
## Known issues
|
||||
|
||||
- Apple macOS Sierra 10.12.5 introduced a problem with launching web browsers from other programs using AppleScript. This affects the fish Web configuration (`fish_config`); users on these platforms will need to manually open the address displayed in the terminal, such as by copying and pasting it into a browser. This problem will be fixed with macOS 10.12.6.
|
||||
|
||||
If you are upgrading from version 2.5.0 or before, please also review the release notes for 2.6b1 (included below).
|
||||
|
||||
---
|
||||
|
||||
# fish 2.6b1 (released May 14, 2017)
|
||||
|
||||
## Notable fixes and improvements
|
||||
|
||||
- Jobs running in the background can now be removed from the list of jobs with the new `disown` builtin, which behaves like the same command in other shells (#2810).
|
||||
- Command substitutions now have access to the terminal, like in other shells. This allows tools like `fzf` to work properly (#1362, #3922).
|
||||
- In cases where the operating system does not report the size of the terminal, the `COLUMNS` and `LINES` environment variables are used; if they are unset, a default of 80x24 is assumed.
|
||||
- New French (#3772 & #3788) and improved German (#3834) translations.
|
||||
- fish no longer depends on the `which` external command.
|
||||
|
||||
## Other significant changes
|
||||
|
||||
- Performance improvements in launching processes, including major reductions in signal blocking. Although this has been heavily tested, it may cause problems in some circumstances; set the `FISH_NO_SIGNAL_BLOCK` variable to 0 in your fish configuration file to return to the old behaviour (#2007).
|
||||
- Performance improvements in prompts and functions that set lots of colours (#3793).
|
||||
- The Delete key no longer deletes backwards (a regression in 2.5.0).
|
||||
- `functions` supports a new `--details` option, which identifies where the function was loaded from (#3295), and a `--details --verbose` option which includes the function description (#597).
|
||||
- `read` will read up to 10 MiB by default, leaving the target variable empty and exiting with status 122 if the line is too long. You can set a different limit with the `FISH_READ_BYTE_LIMIT` variable.
|
||||
- `read` supports a new `--silent` option to hide the characters typed (#838), for when reading sensitive data from the terminal. `read` also now accepts simple strings for the prompt (rather than scripts) with the new `-P` and `--prompt-str` options (#802).
|
||||
- `export` and `setenv` now understand colon-separated `PATH`, `CDPATH` and `MANPATH` variables.
|
||||
- `setenv` is no longer a simple alias for `set -gx` and will complain, just like the csh version, if given more than one value (#4103).
|
||||
- `bind` supports a new `--list-modes` option (#3872).
|
||||
- `bg` will check all of its arguments before backgrounding any jobs; any invalid arguments will cause a failure, but non-existent (eg recently exited) jobs are ignored (#3909).
|
||||
- `funced` warns if the function being edited has not been modified (#3961).
|
||||
- `printf` correctly outputs "long long" integers (#3352).
|
||||
- `status` supports a new `current-function` subcommand to print the current function name (#1743).
|
||||
- `string` supports a new `repeat` subcommand (#3864). `string match` supports a new `--entire` option to emit the entire line matched by a pattern (#3957). `string replace` supports a new `--filter` option to only emit lines which underwent a replacement (#3348).
|
||||
- `test` supports the `-k` option to test for sticky bits (#733).
|
||||
- `umask` understands symbolic modes (#738).
|
||||
- Empty components in the `CDPATH`, `MANPATH` and `PATH` variables are now converted to "." (#2106, #3914).
|
||||
- New versions of ncurses (6.0 and up) wipe terminal scrollback buffers with certain commands; the `C-l` binding tries to avoid this (#2855).
|
||||
- Some systems' `su` implementations do not set the `USER` environment variable; it is now reset for root users (#3916).
|
||||
- Under terminals which support it, bracketed paste is enabled, escaping problematic characters for security and convience (#3871). Inside single quotes (`'`), single quotes and backslashes in pasted text are escaped (#967). The `fish_clipboard_paste` function (bound to `C-v` by default) is still the recommended pasting method where possible as it includes this functionality and more.
|
||||
- Processes in pipelines are no longer signalled as soon as one command in the pipeline has completed (#1926). This behaviour matches other shells mre closely.
|
||||
- All functions requiring Python work with whichever version of Python is installed (#3970). Python 3 is preferred, but Python 2.6 remains the minimum version required.
|
||||
- The color of the cancellation character can be controlled by the `fish_color_cancel` variable (#3963).
|
||||
- Added completions for:
|
||||
- `caddy` (#4008)
|
||||
- `castnow` (#3744)
|
||||
- `climate` (#3760)
|
||||
- `flatpak`
|
||||
- `gradle` (#3859)
|
||||
- `gsettings` (#4001)
|
||||
- `helm` (#3829)
|
||||
- `i3-msg` (#3787)
|
||||
- `ipset` (#3924)
|
||||
- `jq` (#3804)
|
||||
- `light` (#3752)
|
||||
- `minikube` (#3778)
|
||||
- `mocha` (#3828)
|
||||
- `mkdosfs` (#4017)
|
||||
- `pv` (#3773)
|
||||
- `setsid` (#3791)
|
||||
- `terraform` (#3960)
|
||||
- `usermod` (#3775)
|
||||
- `xinput`
|
||||
- `yarn` (#3816)
|
||||
- Improved completions for `adb` (#3853), `apt` (#3771), `bzr` (#3769), `dconf`, `git` (including #3743), `grep` (#3789), `go` (#3789), `help` (#3789), `hg` (#3975), `htop` (#3789), `killall` (#3996), `lua`, `man` (#3762), `mount` (#3764 & #3841), `obnam` (#3924), `perl` (#3856), `portmaster` (#3950), `python` (#3840), `ssh` (#3781), `scp` (#3781), `systemctl` (#3757) and `udisks` (#3764).
|
||||
|
||||
---
|
||||
|
||||
# fish 2.5.0 (released February 3, 2017)
|
||||
|
||||
There are no major changes between 2.5b1 and 2.5.0. If you are upgrading from version 2.4.0 or before, please also review the release notes for 2.5b1 (included below).
|
||||
|
||||
## Notable fixes and improvements
|
||||
|
||||
- The Home, End, Insert, Delete, Page Up and Page Down keys work in Vi-style key bindings (#3731).
|
||||
|
||||
---
|
||||
|
||||
# fish 2.5b1 (released January 14, 2017)
|
||||
|
||||
## Platform Changes
|
||||
|
||||
Starting with version 2.5, fish requires a more up-to-date version of C++, specifically C++11 (from 2011). This affects some older platforms:
|
||||
|
||||
### Linux
|
||||
|
||||
For users building from source, GCC's g++ 4.8 or later, or LLVM's clang 3.3 or later, are known to work. Older platforms may require a newer compiler installed.
|
||||
|
||||
Unfortunately, because of the complexity of the toolchain, binary packages are no longer published by the fish-shell developers for the following platforms:
|
||||
|
||||
- Red Hat Enterprise Linux and CentOS 5 & 6 for 64-bit builds
|
||||
- Ubuntu 12.04 (EoLTS April 2017)
|
||||
- Debian 7 (EoLTS May 2018)
|
||||
|
||||
Installing newer version of fish on these systems will require building from source.
|
||||
|
||||
### OS X SnowLeopard
|
||||
|
||||
Starting with version 2.5, fish requires a C++11 standard library on OS X 10.6 ("SnowLeopard"). If this library is not installed, you will see this error: `dyld: Library not loaded: /usr/lib/libc++.1.dylib`
|
||||
|
||||
MacPorts is the easiest way to obtain this library. After installing the SnowLeopard MacPorts release from the install page, run:
|
||||
|
||||
```
|
||||
sudo port -v install libcxx
|
||||
```
|
||||
|
||||
Now fish should launch successfully. (Please open an issue if it does not.)
|
||||
|
||||
This is only necessary on 10.6. OS X 10.7 and later include the required library by default.
|
||||
|
||||
## Other significant changes
|
||||
|
||||
- Attempting to exit with running processes in the background produces a warning, then signals them to terminate if a second attempt to exit is made. This brings the behaviour for running background processes into line with stopped processes. (#3497)
|
||||
- `random` can now have start, stop and step values specified, or the new `choice` subcommand can be used to pick an argument from a list (#3619).
|
||||
- A new key bindings preset, `fish_hybrid_key_bindings`, including all the Emacs-style and Vi-style bindings, which behaves like `fish_vi_key_bindings` in fish 2.3.0 (#3556).
|
||||
- `function` now returns an error when called with invalid options, rather than defining the function anyway (#3574). This was a regression present in fish 2.3 and 2.4.0.
|
||||
- fish no longer prints a warning when it identifies a running instance of an old version (2.1.0 and earlier). Changes to universal variables may not propagate between these old versions and 2.5b1.
|
||||
- Improved compatiblity with Android (#3585), MSYS/mingw (#2360), and Solaris (#3456, #3340).
|
||||
- Like other shells, the `test` builting now returns an error for numeric operations on invalid integers (#3346, #3581).
|
||||
- `complete` no longer recognises `--authoritative` and `--unauthoritative` options, and they are marked as obsolete.
|
||||
- `status` accepts subcommands, and should be used like `status is-interactive`. The old options continue to be supported for the foreseeable future (#3526), although only one subcommand or option can be specified at a time.
|
||||
- Selection mode (used with "begin-selection") no longer selects a character the cursor does not move over (#3684).
|
||||
- List indexes are handled better, and a bit more liberally in some cases (`echo $PATH[1 .. 3]` is now valid) (#3579).
|
||||
- The `fish_mode_prompt` function is now simply a stub around `fish_default_mode_prompt`, which allows the mode prompt to be included more easily in customised prompt functions (#3641).
|
||||
|
||||
## Notable fixes and improvements
|
||||
- `alias`, run without options or arguments, lists all defined aliases, and aliases now include a description in the function signature that identifies them.
|
||||
- `complete` accepts empty strings as descriptions (#3557).
|
||||
- `command` accepts `-q`/`--quiet` in combination with `--search` (#3591), providing a simple way of checking whether a command exists in scripts.
|
||||
- Abbreviations can now be renamed with `abbr --rename OLD_KEY NEW_KEY` (#3610).
|
||||
- The command synopses printed by `--help` options work better with copying and pasting (#2673).
|
||||
- `help` launches the browser specified by the `$fish_help_browser variable` if it is set (#3131).
|
||||
- History merging could lose items under certain circumstances and is now fixed (#3496).
|
||||
- The `$status` variable is now set to 123 when a syntactically invalid command is entered (#3616).
|
||||
- Exiting fish now signals all background processes to terminate, not just stopped jobs (#3497).
|
||||
- A new `prompt_hostname` function which prints a hostname suitable for use in prompts (#3482).
|
||||
- The `__fish_man_page` function (bound to Alt-h by default) now tries to recognize subcommands (e.g. `git add` will now open the "git-add" man page) (#3678).
|
||||
- A new function `edit_command_buffer` (bound to Alt-e & Alt-v by default) to edit the command buffer in an external editor (#1215, #3627).
|
||||
- `set_color` now supports italics (`--italics`), dim (`--dim`) and reverse (`--reverse`) modes (#3650).
|
||||
- Filesystems with very slow locking (eg incorrectly-configured NFS) will no longer slow fish down (#685).
|
||||
- Improved completions for `apt` (#3695), `fusermount` (#3642), `make` (#3628), `netctl-auto` (#3378), `nmcli` (#3648), `pygmentize` (#3378), and `tar` (#3719).
|
||||
- Added completions for:
|
||||
- `VBoxHeadless` (#3378)
|
||||
- `VBoxSDL` (#3378)
|
||||
- `base64` (#3378)
|
||||
- `caffeinate` (#3524)
|
||||
- `dconf` (#3638)
|
||||
- `dig` (#3495)
|
||||
- `dpkg-reconfigure` (#3521 & #3522)
|
||||
- `feh` (#3378)
|
||||
- `launchctl` (#3682)
|
||||
- `lxc` (#3554 & #3564),
|
||||
- `mddiagnose` (#3524)
|
||||
- `mdfind` (#3524)
|
||||
- `mdimport` (#3524)
|
||||
- `mdls` (#3524)
|
||||
- `mdutil` (#3524)
|
||||
- `mkvextract` (#3492)
|
||||
- `nvram` (#3524)
|
||||
- `objdump` (#3378)
|
||||
- `sysbench` (#3491)
|
||||
- `tmutil` (#3524)
|
||||
|
||||
---
|
||||
|
||||
# fish 2.4.0 (released November 8, 2016)
|
||||
|
||||
There are no major changes between 2.4b1 and 2.4.0.
|
||||
|
||||
## Notable fixes and improvements
|
||||
- The documentation is now generated properly and with the correct version identifier.
|
||||
- Automatic cursor changes are now only enabled on the subset of XTerm versions known to support them, resolving a problem where older versions printed garbage to the terminal before and after every prompt (#3499).
|
||||
- Improved the title set in Apple Terminal.app.
|
||||
- Added completions for `defaults` and improved completions for `diskutil` (#3478).
|
||||
|
||||
---
|
||||
|
||||
# fish 2.4b1 (released October 18, 2016)
|
||||
|
||||
## Significant changes
|
||||
- The clipboard integration has been revamped with explicit bindings. The killring commands no longer copy from, or paste to, the X11 clipboard - use the new copy (`C-x`) and paste (`C-v`) bindings instead. The clipboard is now available on OS X as well as systems using X11 (e.g. Linux). (#3061)
|
||||
- `history` uses subcommands (`history delete`) rather than options (`history --delete`) for its actions (#3367). You can no longer specify multiple actions via flags (e.g., `history --delete --save something`).
|
||||
- New `history` options have been added, including `--max=n` to limit the number of history entries, `--show-time` option to show timestamps (#3175, #3244), and `--null` to null terminate history entries in the search output.
|
||||
- `history search` is now case-insensitive by default (which also affects `history delete`) (#3236).
|
||||
- `history delete` now correctly handles multiline commands (#31).
|
||||
- Vi-style bindings no longer include all of the default emacs-style bindings; instead, they share some definitions (#3068).
|
||||
- If there is no locale set in the environment, various known system configuration files will be checked for a default. If no locale can be found, `en_US-UTF.8` will be used (#277).
|
||||
- A number followed by a caret (e.g. `5^`) is no longer treated as a redirection (#1873).
|
||||
- The `$version` special variable can be overwritten, so that it can be used for other purposes if required.
|
||||
|
||||
## Notable fixes and improvements
|
||||
- The `fish_realpath` builtin has been renamed to `realpath` and made compatible with GNU `realpath` when run without arguments (#3400). It is used only for systems without a `realpath` or `grealpath` utility (#3374).
|
||||
- Improved color handling on terminals/consoles with 8-16 colors, particularly the use of bright named color (#3176, #3260).
|
||||
- `fish_indent` can now read from files given as arguments, rather than just standard input (#3037).
|
||||
- Fuzzy tab completions behave in a less surprising manner (#3090, #3211).
|
||||
- `jobs` should only print its header line once (#3127).
|
||||
- Wildcards in redirections are highlighted appropriately (#2789).
|
||||
- Suggestions will be offered more often, like after removing characters (#3069).
|
||||
- `history --merge` now correctly interleaves items in chronological order (#2312).
|
||||
- Options for `fish_indent` have been aligned with the other binaries - in particular, `-d` now means `--debug`. The `--dump` option has been renamed to `--dump-parse-tree` (#3191).
|
||||
- The display of bindings in the Web-based configuration has been greatly improved (#3325), as has the rendering of prompts (#2924).
|
||||
- fish should no longer hang using 100% CPU in the C locale (#3214).
|
||||
- A bug in FreeBSD 11 & 12, Dragonfly BSD & illumos prevented fish from working correctly on these platforms under UTF-8 locales; fish now avoids the buggy behaviour (#3050).
|
||||
- Prompts which show git repository information (via `__fish_git_prompt`) are faster in large repositories (#3294) and slow filesystems (#3083).
|
||||
- fish 2.3.0 reintroduced a problem where the greeting was printed even when using `read`; this has been corrected again (#3261).
|
||||
- Vi mode changes the cursor depending on the current mode (#3215).
|
||||
- Command lines with escaped space characters at the end tab-complete correctly (#2447).
|
||||
- Added completions for:
|
||||
- `arcanist` (#3256)
|
||||
- `connmanctl` (#3419)
|
||||
- `figlet` (#3378)
|
||||
- `mdbook` (#3378)
|
||||
- `ninja` (#3415)
|
||||
- `p4`, the Perforce client (#3314)
|
||||
- `pygmentize` (#3378)
|
||||
- `ranger` (#3378)
|
||||
- Improved completions for `aura` (#3297), `abbr` (#3267), `brew` (#3309), `chown` (#3380, #3383),`cygport` (#3392), `git` (#3274, #3226, #3225, #3094, #3087, #3035, #3021, #2982, #3230), `kill` & `pkill` (#3200), `screen` (#3271), `wget` (#3470), and `xz` (#3378).
|
||||
- Distributors, packagers and developers will notice that the build process produces more succinct output by default; use `make V=1` to get verbose output (#3248).
|
||||
- Improved compatibility with minor platforms including musl (#2988), Cygwin (#2993), Android (#3441, #3442), Haiku (#3322) and Solaris .
|
||||
|
||||
---
|
||||
|
||||
# fish 2.3.1 (released July 3, 2016)
|
||||
|
||||
This is a functionality and bugfix release. This release does not contain all the changes to fish since the last release, but fixes a number of issues directly affecting users at present and includes a small number of new features.
|
||||
|
||||
## Significant changes
|
||||
- A new `fish_key_reader` binary for decoding interactive keypresses (#2991).
|
||||
- `fish_mode_prompt` has been updated to reflect the changes in the way the Vi input mode is set up (#3067), making this more reliable.
|
||||
- `fish_config` can now properly be launched from the OS X app bundle (#3140).
|
||||
|
||||
## Notable fixes and improvements
|
||||
|
||||
- Extra lines were sometimes inserted into the output under Windows (Cygwin and Microsoft Windows Subsystem for Linux) due to TTY timestamps not being updated (#2859).
|
||||
- The `string` builtin's `match` mode now handles the combination of `-rnv` (match, invert and count) correctly (#3098).
|
||||
- Improvements to TTY special character handling (#3064), locale handling (#3124) and terminal environment variable handling (#3060).
|
||||
- Work towards handling the terminal modes for external commands launched from initialisation files (#2980).
|
||||
- Ease the upgrade path from fish 2.2.0 and before by warning users to restart fish if the `string` builtin is not available (#3057).
|
||||
- `type -a` now syntax-colorizes function source output.
|
||||
- Added completions for `alsamixer`, `godoc`, `gofmt`, `goimports`, `gorename`, `lscpu`, `mkdir`, `modinfo`, `netctl-auto`, `poweroff`, `termite`, `udisksctl` and `xz` (#3123).
|
||||
- Improved completions for `apt` (#3097), `aura` (#3102),`git` (#3114), `npm` (#3158), `string` and `suspend` (#3154).
|
||||
|
||||
---
|
||||
|
||||
# fish 2.3.0 (released May 20, 2016)
|
||||
|
||||
There are no significant changes between 2.3.0 and 2.3b2.
|
||||
|
||||
## Other notable fixes and improvements
|
||||
|
||||
- `abbr` now allows non-letter keys (#2996).
|
||||
- Define a few extra colours on first start (#2987).
|
||||
- Multiple documentation updates.
|
||||
- Added completions for rmmod (#3007).
|
||||
- Improved completions for git (#2998).
|
||||
|
||||
## Known issues
|
||||
|
||||
- Interactive commands started from fish configuration files or from the `-c` option may, under certain circumstances, be started with incorrect terminal modes and fail to behave as expected. A fix is planned but requires further testing (#2619).
|
||||
|
||||
---
|
||||
|
||||
# fish 2.3b2 (released May 5, 2016)
|
||||
|
||||
## Significant changes
|
||||
|
||||
- A new `fish_realpath` builtin and associated function to allow the use of `realpath` even on those platforms that don't ship an appropriate command (#2932).
|
||||
- Alt-# toggles the current command line between commented and uncommented states, making it easy to save a command in history without executing it.
|
||||
- The `fish_vi_mode` function is now deprecated in favour of `fish_vi_key_bindings`.
|
||||
|
||||
## Other notable fixes and improvements
|
||||
|
||||
- Fix the build on Cygwin (#2952) and RedHat Enterprise Linux/CentOS 5 (#2955).
|
||||
- Avoid confusing the terminal line driver with non-printing characters in `fish_title` (#2453).
|
||||
- Improved completions for busctl, git (#2585, #2879, #2984), and netctl.
|
||||
|
||||
---
|
||||
|
||||
# fish 2.3b1 (released April 19, 2016)
|
||||
|
||||
## Significant Changes
|
||||
|
||||
- A new `string` builtin to handle... strings! This builtin will measure, split, search and replace text strings, including using regular expressions. It can also be used to turn lists into plain strings using `join`. `string` can be used in place of `sed`, `grep`, `tr`, `cut`, and `awk` in many situations. (#2296)
|
||||
- Allow using escape as the Meta modifier key, by waiting after seeing an escape character wait up to 300ms for an additional character. This is consistent with readline (e.g. bash) and can be configured via the `fish_escape_delay_ms variable`. This allows using escape as the Meta modifier. (#1356)
|
||||
- Add new directories for vendor functions and configuration snippets (#2500)
|
||||
- A new `fish_realpath` builtin and associated `realpath` function should allow scripts to resolve path names via `realpath` regardless of whether there is an external command of that name; albeit with some limitations. See the associated documentation.
|
||||
|
||||
## Backward-incompatible changes
|
||||
|
||||
- Unmatched globs will now cause an error, except when used with `for`, `set` or `count` (#2719)
|
||||
- `and` and `or` will now bind to the closest `if` or `while`, allowing compound conditions without `begin` and `end` (#1428)
|
||||
- `set -ql` now searches up to function scope for variables (#2502)
|
||||
- `status -f` will now behave the same when run as the main script or using `source` (#2643)
|
||||
- `source` no longer puts the file name in `$argv` if no arguments are given (#139)
|
||||
- History files are stored under the `XDG_DATA_HOME` hierarchy (by default, in `~/.local/share`), and existing history will be moved on first use (#744)
|
||||
|
||||
## Other notable fixes and improvements
|
||||
|
||||
- Fish no longer silences errors in config.fish (#2702)
|
||||
- Directory autosuggestions will now descend as far as possible if there is only one child directory (#2531)
|
||||
- Add support for bright colors (#1464)
|
||||
- Allow Ctrl-J (\cj) to be bound separately from Ctrl-M (\cm) (#217)
|
||||
- psub now has a "-s"/"–suffix" option to name the temporary file with that suffix
|
||||
- Enable 24-bit colors on select terminals (#2495)
|
||||
- Support for SVN status in the prompt (#2582)
|
||||
- Mercurial and SVN support have been added to the Classic + Git (now Classic + VCS) prompt (via the new \__fish_vcs_prompt function) (#2592)
|
||||
- export now handles variables with a "=" in the value (#2403)
|
||||
- New completions for:
|
||||
- alsactl
|
||||
- Archlinux's asp, makepkg
|
||||
- Atom's apm (#2390)
|
||||
- entr - the "Event Notify Test Runner" (#2265)
|
||||
- Fedora's dnf (#2638)
|
||||
- OSX diskutil (#2738)
|
||||
- pkgng (#2395)
|
||||
- pulseaudio's pacmd and pactl
|
||||
- rust's rustc and cargo (#2409)
|
||||
- sysctl (#2214)
|
||||
- systemd's machinectl (#2158), busctl (#2144), systemd-nspawn, systemd-analyze, localectl, timedatectl
|
||||
- and more
|
||||
- Fish no longer has a function called sgrep, freeing it for user customization (#2245)
|
||||
- A rewrite of the completions for cd, fixing a few bugs (#2299, #2300, #562)
|
||||
- Linux VTs now run in a simplified mode to avoid issues (#2311)
|
||||
- The vi-bindings now inherit from the emacs bindings
|
||||
- Fish will also execute `fish_user_key_bindings` when in vi-mode
|
||||
- `funced` will now also check $VISUAL (#2268)
|
||||
- A new `suspend` function (#2269)
|
||||
- Subcommand completion now works better with split /usr (#2141)
|
||||
- The command-not-found-handler can now be overridden by defining a function called `__fish_command_not_found_handler` in config.fish (#2332)
|
||||
- A few fixes to the Sorin theme
|
||||
- PWD shortening in the prompt can now be configured via the `fish_prompt_pwd_dir_length` variable, set to the length per path component (#2473)
|
||||
- fish no longer requires `/etc/fish/config.fish` to correctly start, and now ships a skeleton file that only contains some documentation (#2799)
|
||||
|
||||
---
|
||||
|
||||
# fish 2.2.0 (released July 12, 2015)
|
||||
|
||||
### Significant changes ###
|
||||
|
||||
* Abbreviations: the new `abbr` command allows for interactively-expanded abbreviations, allowing quick access to frequently-used commands (#731).
|
||||
* Vi mode: run `fish_vi_mode` to switch fish into the key bindings and prompt familiar to users of the Vi editor (#65).
|
||||
* New inline and interactive pager, which will be familiar to users of zsh (#291).
|
||||
* Underlying architectural changes: the `fishd` universal variable server has been removed as it was a source of many bugs and security problems. Notably, old fish sessions will not be able to communicate universal variable changes with new fish sessions. For best results, restart all running instances of `fish`.
|
||||
* The web-based configuration tool has been redesigned, featuring a prompt theme chooser and other improvements.
|
||||
* New German, Brazilian Portuguese, and Chinese translations.
|
||||
|
||||
### Backward-incompatible changes ###
|
||||
|
||||
These are kept to a minimum, but either change undocumented features or are too hard to use in their existing forms. These changes may break existing scripts.
|
||||
|
||||
* `commandline` no longer interprets functions "in reverse", instead behaving as expected (#1567).
|
||||
* The previously-undocumented `CMD_DURATION` variable is now set for all commands and contains the execution time of the last command in milliseconds (#1585). It is no longer exported to other commands (#1896).
|
||||
* `if` / `else` conditional statements now return values consistent with the Single Unix Specification, like other shells (#1443).
|
||||
* A new "top-level" local scope has been added, allowing local variables declared on the commandline to be visible to subsequent commands. (#1908)
|
||||
|
||||
### Other notable fixes and improvements ###
|
||||
|
||||
* New documentation design (#1662), which requires a Doxygen version 1.8.7 or newer to build.
|
||||
* Fish now defines a default directory for other packages to provide completions. By default this is `/usr/share/fish/vendor-completions.d`; on systems with `pkgconfig` installed this path is discoverable with `pkg-config --variable completionsdir fish`.
|
||||
* A new parser removes many bugs; all existing syntax should keep working.
|
||||
* New `fish_preexec` and `fish_postexec` events are fired before and after job execution respectively (#1549).
|
||||
* Unmatched wildcards no longer prevent a job from running. Wildcards used interactively will still print an error, but the job will proceed and the wildcard will expand to zero arguments (#1482).
|
||||
* The `.` command is deprecated and the `source` command is preferred (#310).
|
||||
* `bind` supports "bind modes", which allows bindings to be set for a particular named mode, to support the implementation of Vi mode.
|
||||
* A new `export` alias, which behaves like other shells (#1833).
|
||||
* `command` has a new `--search` option to print the name of the disk file that would be executed, like other shells' `command -v` (#1540).
|
||||
* `commandline` has a new `--paging-mode` option to support the new pager.
|
||||
* `complete` has a new `--wraps` option, which allows a command to (recursively) inherit the completions of a wrapped command (#393), and `complete -e` now correctly erases completions (#380).
|
||||
* Completions are now generated from manual pages by default on the first run of fish (#997).
|
||||
* `fish_indent` can now produce colorized (`--ansi`) and HTML (`--html`) output (#1827).
|
||||
* `functions --erase` now prevents autoloaded functions from being reloaded in the current session.
|
||||
* `history` has a new `--merge` option, to incorporate history from other sessions into the current session (#825).
|
||||
* `jobs` returns 1 if there are no active jobs (#1484).
|
||||
* `read` has several new options:
|
||||
* `--array` to break input into an array (#1540)
|
||||
* `--null` to break lines on NUL characters rather than newlines (#1694)
|
||||
* `--nchars` to read a specific number of characters (#1616)
|
||||
* `--right-prompt` to display a right-hand-side prompt during interactive read (#1698).
|
||||
* `type` has a new `-q` option to suppress output (#1540 and, like other shells, `type -a` now prints all matches for a command (#261).
|
||||
* Pressing F1 now shows the manual page for the current command (#1063).
|
||||
* `fish_title` functions have access to the arguments of the currently running argument as `$argv[1]` (#1542).
|
||||
* The OS command-not-found handler is used on Arch Linux (#1925), nixOS (#1852), openSUSE and Fedora (#1280).
|
||||
* `Alt`+`.` searches backwards in the token history, mapping to the same behavior as inserting the last argument of the previous command, like other shells (#89).
|
||||
* The `SHLVL` environment variable is incremented correctly (#1634 & #1693).
|
||||
* Added completions for `adb` (#1165 & #1211), `apt` (#2018), `aura` (#1292), `composer` (#1607), `cygport` (#1841), `dropbox` (#1533), `elixir` (#1167), `fossil`, `heroku` (#1790), `iex` (#1167), `kitchen` (#2000), `nix` (#1167), `node`/`npm` (#1566), `opam` (#1615), `setfacl` (#1752), `tmuxinator` (#1863), and `yast2` (#1739).
|
||||
* Improved completions for `brew` (#1090 & #1810), `bundler` (#1779), `cd` (#1135), `emerge` (#1840),`git` (#1680, #1834 & #1951), `man` (#960), `modprobe` (#1124), `pacman` (#1292), `rpm` (#1236), `rsync` (#1872), `scp` (#1145), `ssh` (#1234), `sshfs` (#1268), `systemctl` (#1462, #1950 & #1972), `tmux` (#1853), `vagrant` (#1748), `yum` (#1269), and `zypper` (#1787).
|
||||
|
||||
---
|
||||
|
||||
# fish 2.1.2 (released Feb 24, 2015)
|
||||
|
||||
fish 2.1.2 contains a workaround for a filesystem bug in Mac OS X Yosemite. #1859
|
||||
|
||||
Specifically, after installing fish 2.1.1 and then rebooting, "Verify Disk" in Disk Utility will report "Invalid number of hard links." We don't have any reports of data loss or other adverse consequences. fish 2.1.2 avoids triggering the bug, but does not repair an already affected filesystem. To repair the filesystem, you can boot into Recovery Mode and use Repair Disk from Disk Utility. Linux and versions of OS X prior to Yosemite are believed to be unaffected.
|
||||
|
||||
There are no other changes in this release.
|
||||
|
||||
---
|
||||
|
||||
# fish 2.1.1 (released September 26, 2014)
|
||||
|
||||
__Important:__ if you are upgrading, stop all running instances of `fishd` as soon as possible after installing this release; it will be restarted automatically. On most systems, there will be no further action required. Note that some environments (where `XDG_RUNTIME_DIR` is set), such as Fedora 20, will require a restart of all running fish processes before universal variables work as intended.
|
||||
|
||||
Distributors are highly encouraged to call `killall fishd`, `pkill fishd` or similar in installation scripts, or to warn their users to do so.
|
||||
|
||||
### Security fixes
|
||||
* The fish_config web interface now uses an authentication token to protect requests and only responds to requests from the local machine with this token, preventing a remote code execution attack. (closing CVE-2014-2914). #1438
|
||||
* `psub` and `funced` are no longer vulnerable to attacks which allow local privilege escalation and data tampering (closing CVE-2014-2906 and CVE-2014-3856). #1437
|
||||
* `fishd` uses a secure path for its socket, preventing a local privilege escalation attack (closing CVE-2014-2905). #1436
|
||||
* `__fish_print_packages` is no longer vulnerable to attacks which would allow local privilege escalation and data tampering (closing CVE-2014-3219). #1440
|
||||
|
||||
### Other fixes
|
||||
* `fishd` now ignores SIGPIPE, fixing crashes using tools like GNU Parallel and which occurred more often as a result of the other `fishd` changes. #1084 & #1690
|
||||
|
||||
---
|
||||
|
||||
# fish 2.1.0
|
||||
|
||||
Significant Changes
|
||||
-------------------
|
||||
|
||||
* **Tab completions will fuzzy-match files.** #568
|
||||
|
||||
When tab-completing a file, fish will first attempt prefix matches (`foo` matches `foobar`), then substring matches (`ooba` matches `foobar`), and lastly subsequence matches (`fbr` matches `foobar`). For example, in a directory with files foo1.txt, foo2.txt, foo3.txt…, you can type only the numeric part and hit tab to fill in the rest.
|
||||
|
||||
This feature is implemented for files and executables. It is not yet implemented for options (like `--foobar`), and not yet implemented across path components (like `/u/l/b` to match `/usr/local/bin`).
|
||||
|
||||
* **Redirections now work better across pipelines.** #110, #877
|
||||
|
||||
In particular, you can pipe stderr and stdout together, for example, with `cmd ^&1 | tee log.txt`, or the more familiar `cmd 2>&1 | tee log.txt`.
|
||||
|
||||
* **A single `%` now expands to the last job backgrounded.** #1008
|
||||
|
||||
Previously, a single `%` would pid-expand to either all backgrounded jobs, or all jobs owned by your user. Now it expands to the last job backgrounded. If no job is in the background, it will fail to expand. In particular, `fg %` can be used to put the most recent background job in the foreground.
|
||||
|
||||
Other Notable Fixes
|
||||
-------------------
|
||||
|
||||
* alt-U and alt+C now uppercase and capitalize words, respectively. #995
|
||||
|
||||
* VTE based terminals should now know the working directory. #906
|
||||
|
||||
* The autotools build now works on Mavericks. #968
|
||||
|
||||
* The end-of-line binding (ctrl+E) now accepts autosuggestions. #932
|
||||
|
||||
* Directories in `/etc/paths` (used on OS X) are now prepended instead of appended, similar to other shells. #927
|
||||
|
||||
* Option-right-arrow (used for partial autosuggestion completion) now works on iTerm2. #920
|
||||
|
||||
* Tab completions now work properly within nested subcommands. #913
|
||||
|
||||
* `printf` supports \e, the escape character. #910
|
||||
|
||||
* `fish_config history` no longer shows duplicate items. #900
|
||||
|
||||
* `$fish_user_paths` is now prepended to $PATH instead of appended. #888
|
||||
|
||||
* Jobs complete when all processes complete. #876
|
||||
|
||||
|
||||
For example, in previous versions of fish, `sleep 10 | echo Done` returns control immediately, because echo does not read from stdin. Now it does not complete until sleep exits (presumably after 10 seconds).
|
||||
|
||||
* Better error reporting for square brackets. #875
|
||||
|
||||
* fish no longer tries to add `/bin` to `$PATH` unless PATH is totally empty. #852
|
||||
|
||||
* History token substitution (alt-up) now works correctly inside subshells. #833
|
||||
|
||||
* Flow control is now disabled, freeing up ctrl-S and ctrl-Q for other uses. #814
|
||||
|
||||
* sh-style variable setting like `foo=bar` now produces better error messages. #809
|
||||
|
||||
* Commands with wildcards no longer produce autosuggestions. #785
|
||||
|
||||
* funced no longer freaks out when supplied with no arguments. #780
|
||||
|
||||
* fish.app now works correctly in a directory containing spaces. #774
|
||||
|
||||
* Tab completion cycling no longer occasionally fails to repaint. #765
|
||||
|
||||
* Comments now work in eval'd strings. #684
|
||||
|
||||
* History search (up-arrow) now shows the item matching the autosuggestion, if that autosuggestion was truncated. #650
|
||||
|
||||
* Ctrl-T now transposes characters, as in other shells. #128
|
||||
|
||||
---
|
||||
|
||||
# fish 2.0.0
|
||||
|
||||
Significant Changes
|
||||
-------------------
|
||||
|
||||
* **Command substitutions now modify `$status` #547.**
|
||||
Previously the exit status of command substitutions (like `(pwd)`) was ignored; however now it modifies $status. Furthermore, the `set` command now only sets $status on failure; it is untouched on success. This allows for the following pattern:
|
||||
|
||||
```sh
|
||||
if set python_path (which python)
|
||||
...
|
||||
end
|
||||
```
|
||||
Because set does not modify $status on success, the if branch effectively tests whether `which` succeeded, and if so, whether the `set` also succeeded.
|
||||
* **Improvements to $PATH handling.**
|
||||
* There is a new variable, `$fish_user_paths`, which can be set universally, and whose contents are appended to $PATH #527
|
||||
* /etc/paths and /etc/paths.d are now respected on OS X
|
||||
* fish no longer modifies $PATH to find its own binaries
|
||||
* **Long lines no longer use ellipsis for line breaks**, and copy and paste
|
||||
should no longer include a newline even if the line was broken #300
|
||||
* **New syntax for index ranges** (sometimes known as "slices") #212
|
||||
* **fish now supports an `else if` statement** #134
|
||||
* **Process and pid completion now works on OS X** #129
|
||||
* **fish is now relocatable**, and no longer depends on compiled-in paths #125
|
||||
* **fish now supports a right prompt (RPROMPT)** through the fish_right_prompt function #80
|
||||
* **fish now uses posix_spawn instead of fork when possible**, which is much faster on BSD and OS X #11
|
||||
|
||||
Other Notable Fixes
|
||||
-------------------
|
||||
|
||||
* Updated VCS completions (darcs, cvs, svn, etc.)
|
||||
* Avoid calling getcwd on the main thread, as it can hang #696
|
||||
* Control-D (forward delete) no longer stops at a period #667
|
||||
* Completions for many new commands
|
||||
* fish now respects rxvt's unique keybindings #657
|
||||
* xsel is no longer built as part of fish. It will still be invoked if installed separately #633
|
||||
* __fish_filter_mime no longer spews #628
|
||||
* The --no-execute option to fish no longer falls over when reaching the end of a block #624
|
||||
* fish_config knows how to find fish even if it's not in the $PATH #621
|
||||
* A leading space now prevents writing to history, as is done in bash and zsh #615
|
||||
* Hitting enter after a backslash only goes to a new line if it is followed by whitespace or the end of the line #613
|
||||
* printf is now a builtin #611
|
||||
* Event handlers should no longer fire if signals are blocked #608
|
||||
* set_color is now a builtin #578
|
||||
* man page completions are now located in a new generated_completions directory, instead of your completions directory #576
|
||||
* tab now clears autosuggestions #561
|
||||
* tab completion from within a pair of quotes now attempts to "appropriate" the closing quote #552
|
||||
* $EDITOR can now be a list: for example, `set EDITOR gvim -f`) #541
|
||||
* `case` bodies are now indented #530
|
||||
* The profile switch `-p` no longer crashes #517
|
||||
* You can now control-C out of `read` #516
|
||||
* `umask` is now functional on OS X #515
|
||||
* Avoid calling getpwnam on the main thread, as it can hang #512
|
||||
* Alt-F or Alt-right-arrow (Option-F or option-right-arrow) now accepts one word of an autosuggestion #435
|
||||
* Setting fish as your login shell no longer kills OpenSUSE #367
|
||||
* Backslashes now join lines, instead of creating multiple commands #347
|
||||
* echo now implements the -e flag to interpret escapes #337
|
||||
* When the last token in the user's input contains capital letters, use its case in preference to that of the autosuggestion #335
|
||||
* Descriptions now have their own muted color #279
|
||||
* Wildcards beginning with a . (for example, `ls .*`) no longer match . and .. #270
|
||||
* Recursive wildcards now handle symlink loops #268
|
||||
* You can now delete history items from the fish_config web interface #250
|
||||
* The OS X build now weak links `wcsdup` and `wcscasecmp` #240
|
||||
* fish now saves and restores the process group, which prevents certain processes from being erroneously reported as stopped #197
|
||||
* funced now takes an editor option #187
|
||||
* Alternating row colors are available in fish pager through `fish_pager_color_secondary` #186
|
||||
* Universal variable values are now stored based on your MAC address, not your hostname #183
|
||||
* The caret ^ now only does a stderr redirection if it is the first character of a token, making git users happy #168
|
||||
* Autosuggestions will no longer cause line wrapping #167
|
||||
* Better handling of Unicode combining characters #155
|
||||
* fish SIGHUPs processes more often #138
|
||||
* fish no longer causes `sudo` to ask for a password every time
|
||||
* fish behaves better under Midnight Commander #121
|
||||
* `set -e` no longer crashes #100
|
||||
* fish now will automatically import history from bash, if there is no fish history #66
|
||||
* Backslashed-newlines inside quoted strings now behave more intuitively #52
|
||||
* Tab titles should be shown correctly in iTerm2 #47
|
||||
* scp remote path completion now sometimes works #42
|
||||
* The `read` builtin no longer shows autosuggestions #29
|
||||
* Custom key bindings can now be set via the `fish_user_key_bindings` function #21
|
||||
* All Python scripts now run correctly under both Python 2 and Python 3 #14
|
||||
* The "accept autosuggestion" key can now be configured #19
|
||||
* Autosuggestions will no longer suggest invalid commands #6
|
||||
|
||||
---
|
||||
|
||||
# fishfish Beta r2
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
* **Implicit cd** is back, for paths that start with one or two dots, a slash, or a tilde.
|
||||
* **Overrides of default functions should be fixed.** The "internalized scripts" feature is disabled for now.
|
||||
* **Disabled delayed suspend.** This is a strange job-control feature of BSD systems, including OS X. Disabling it frees up Control Y for other purposes; in particular, for yank, which now works on OS X.
|
||||
* **fish_indent is fixed.** In particular, the `funced` and `funcsave` functions work again.
|
||||
* A SIGTERM now ends the whole execution stack again (resolving #13).
|
||||
* Bumped the __fish_config_interactive version number so the default fish_color_autosuggestion kicks in.
|
||||
* fish_config better handles combined term256 and classic colors like "555 yellow".
|
||||
|
||||
New Features
|
||||
------------
|
||||
|
||||
* **A history builtin**, and associated interactive function that enables deleting history items. Example usage:
|
||||
* Print all history items beginning with echo: `history --prefix echo`
|
||||
* Print all history items containing foo: `history --contains foo`
|
||||
* Interactively delete some items containing foo: `history --delete --contains foo`
|
||||
|
||||
Credit to @siteshwar for implementation. Thanks @siteshwar!
|
||||
|
||||
---
|
||||
|
||||
# fishfish Beta r1
|
||||
|
||||
## Scripting
|
||||
* No changes! All existing fish scripts, config files, completions, etc. from trunk should continue to work.
|
||||
|
||||
## New Features
|
||||
* **Autosuggestions**. Think URL fields in browsers. When you type a command, fish will suggest the rest of the command after the cursor, in a muted gray when possible. You can accept the suggestion with the right arrow key or Ctrl-F. Suggestions come from command history, completions, and some custom code for cd; there's a lot of potential for improvement here. The suggestions are computed on a background pthread, so they never slow down your typing. The autosuggestion feature is incredible. I miss it dearly every time I use anything else.
|
||||
|
||||
* **term256 support** where available, specifically modern xterms and OS X Lion. You can specify colors the old way ('set_color cyan') or by specifying RGB hex values ('set_color FF3333'); fish will pick the closest supported color. Some xterms do not advertise term256 support either in the $TERM or terminfo max_colors field, but nevertheless support it. For that reason, fish will default into using it on any xterm (but it can be disabled with an environment variable).
|
||||
|
||||
* **Web-based configuration** page. There is a new function 'fish_config'. This spins up a simple Python web server and opens a browser window to it. From this web page, you can set your shell colors and view your functions, variables, and history; all changes apply immediately to all running shells. Eventually all configuration ought to be supported via this mechanism (but in addition to, not instead of, command line mechanisms).
|
||||
|
||||
* **Man page completions**. There is a new function 'fish_update_completions'. This function reads all the man1 files from your manpath, removes the roff formatting, parses them to find the commands and options, and outputs fish completions into ~/.config/fish/completions. It won't overwrite existing completion files (except ones that it generated itself).
|
||||
|
||||
## Programmatic Changes
|
||||
* fish is now entirely in C++. I have no particular love for C++, but it provides a ready memory-model to replace halloc. We've made an effort to keep it to a sane and portable subset (no C++11, no boost, no going crazy with templates or smart pointers), but we do use the STL and a little tr1.
|
||||
* halloc is entirely gone, replaced by normal C++ ownership semantics. If you don't know what halloc is, well, now you have two reasons to be happy.
|
||||
* All the crufty C data structures are entirely gone. array_list_t, priority_queue_t, hash_table_t, string_buffer_t have been removed and replaced by STL equivalents like std::vector, std::map, and std::wstring. A lot of the string handling now uses std::wstring instead of wchar_t *
|
||||
* fish now spawns pthreads for tasks like syntax highlighting that require blocking I/O.
|
||||
* History has been completely rewritten. History files now use an extensible YAML-style syntax. History "merging" (multiple shells writing to the same history file) now works better. There is now a maximum history length of about 250k items (256 * 1024).
|
||||
* The parser has been "instanced," so you can now create more than one.
|
||||
* Total #LoC has shrunk slightly even with the new features.
|
||||
|
||||
## Performance
|
||||
* fish now runs syntax highlighting in a background thread, so typing commands is always responsive even on slow filesystems.
|
||||
* echo, test, and pwd are now builtins, which eliminates many forks.
|
||||
* The files in share/functions and share/completions now get 'internalized' into C strings that get compiled in with fish. This substantially reduces the number of files touched at startup. A consequence is that you cannot change these functions without recompiling, but often other functions depend on these "standard" functions, so changing them is perhaps not a good idea anyways.
|
||||
|
||||
Here are some system call counts for launching and then exiting fish with the default configuration, on OS X. The first column is fish trunk, the next column is with our changes, and the last column is bash for comparison. This data was collected via dtrace.
|
||||
|
||||
<table>
|
||||
<tr> <th> <th> before <th> after <th> bash
|
||||
<tr> <th> open <td> 9 <td> 4 <td> 5
|
||||
<tr> <th> fork <td> 28 <td> 14 <td> 0
|
||||
<tr> <th> stat <td> 131 <td> 85 <td> 11
|
||||
<tr> <th> lstat <td> 670 <td> 0 <td> 0
|
||||
<tr> <th> read <td> 332 <td> 80 <td> 4
|
||||
<tr> <th> write <td> 172 <td> 149 <td> 0
|
||||
</table>
|
||||
|
||||
The large number of forks relative to bash are due to fish's insanely expensive default prompt, which is unchanged in my version. If we switch to a prompt comparable to bash's (lame) default, the forks drop to 16 with trunk, 4 after our changes.
|
||||
|
||||
The large reduction in lstat() numbers is due to fish no longer needing to call ttyname() on OS X.
|
||||
|
||||
We've got some work to do to be as lean as bash, but we're on the right track.
|
||||
163
CMakeLists.txt
Normal file
163
CMakeLists.txt
Normal file
@@ -0,0 +1,163 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
|
||||
|
||||
IF(POLICY CMP0066)
|
||||
CMAKE_POLICY(SET CMP0066 OLD)
|
||||
ENDIF()
|
||||
IF(POLICY CMP0067)
|
||||
CMAKE_POLICY(SET CMP0067 OLD)
|
||||
ENDIF()
|
||||
|
||||
PROJECT(fish)
|
||||
|
||||
# We are C++11.
|
||||
SET(CMAKE_CXX_STANDARD 11)
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
|
||||
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
|
||||
SET(CMAKE_CXX_FLAGS_RELEASE "-O2")
|
||||
SET(DEFAULT_BUILD_TYPE "RelWithDebInfo")
|
||||
|
||||
IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
MESSAGE(STATUS "Setting build type to default '${DEFAULT_BUILD_TYPE}'")
|
||||
SET(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}")
|
||||
ENDIF()
|
||||
|
||||
# Force colored warnings in Ninja's output, if the compiler has -fdiagnostics-color support.
|
||||
# Rationale in https://github.com/ninja-build/ninja/issues/814
|
||||
if (CMAKE_GENERATOR STREQUAL "Ninja" AND
|
||||
((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) OR
|
||||
(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5) OR
|
||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)))
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color=always")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always")
|
||||
endif()
|
||||
|
||||
# Disable exception handling.
|
||||
ADD_COMPILE_OPTIONS(-fno-exceptions)
|
||||
|
||||
# Hide the CMake Rules directories in Xcode projects.
|
||||
SOURCE_GROUP("CMake Rules" REGULAR_EXPRESSION "^$")
|
||||
|
||||
# Put source and header files at top level under targets.
|
||||
SOURCE_GROUP("Source Files" REGULAR_EXPRESSION "^$")
|
||||
SOURCE_GROUP("Header Files" REGULAR_EXPRESSION "^$")
|
||||
SOURCE_GROUP("Builtins" REGULAR_EXPRESSION "builtin_.*")
|
||||
|
||||
# Support folders.
|
||||
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
||||
|
||||
IF(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
|
||||
SET(FISH_IN_TREE_BUILD TRUE)
|
||||
ELSE()
|
||||
SET(FISH_IN_TREE_BUILD FALSE)
|
||||
ENDIF()
|
||||
|
||||
# All objects that the system needs to build fish, except fish.cpp
|
||||
SET(FISH_SRCS
|
||||
src/autoload.cpp src/builtin.cpp src/builtin_bg.cpp src/builtin_bind.cpp
|
||||
src/builtin_block.cpp src/builtin_builtin.cpp src/builtin_cd.cpp
|
||||
src/builtin_command.cpp src/builtin_commandline.cpp
|
||||
src/builtin_complete.cpp src/builtin_contains.cpp src/builtin_disown.cpp
|
||||
src/builtin_echo.cpp src/builtin_emit.cpp src/builtin_exit.cpp
|
||||
src/builtin_fg.cpp src/builtin_function.cpp src/builtin_functions.cpp
|
||||
src/builtin_argparse.cpp src/builtin_history.cpp src/builtin_jobs.cpp
|
||||
src/builtin_math.cpp src/builtin_printf.cpp src/builtin_pwd.cpp
|
||||
src/builtin_random.cpp src/builtin_read.cpp src/builtin_realpath.cpp
|
||||
src/builtin_return.cpp src/builtin_set.cpp src/builtin_set_color.cpp
|
||||
src/builtin_source.cpp src/builtin_status.cpp src/builtin_string.cpp
|
||||
src/builtin_test.cpp src/builtin_ulimit.cpp src/builtin_wait.cpp
|
||||
src/color.cpp src/common.cpp src/complete.cpp src/env.cpp
|
||||
src/env_universal_common.cpp src/event.cpp src/exec.cpp src/expand.cpp
|
||||
src/fallback.cpp src/fish_version.cpp src/function.cpp src/highlight.cpp
|
||||
src/history.cpp src/input.cpp src/input_common.cpp src/intern.cpp src/io.cpp
|
||||
src/iothread.cpp src/kill.cpp src/output.cpp src/pager.cpp
|
||||
src/parse_execution.cpp src/parse_productions.cpp src/parse_tree.cpp
|
||||
src/parse_util.cpp src/parser.cpp src/parser_keywords.cpp src/path.cpp
|
||||
src/postfork.cpp src/proc.cpp src/reader.cpp src/sanity.cpp src/screen.cpp
|
||||
src/signal.cpp src/tinyexpr.c src/tnode.cpp src/tokenizer.cpp src/utf8.cpp src/util.cpp
|
||||
src/wcstringutil.cpp src/wgetopt.cpp src/wildcard.cpp src/wutil.cpp
|
||||
src/future_feature_flags.cpp
|
||||
)
|
||||
|
||||
# Header files are just globbed.
|
||||
FILE(GLOB FISH_HEADERS src/*.h)
|
||||
|
||||
# Set up config.h
|
||||
INCLUDE(cmake/ConfigureChecks.cmake)
|
||||
INCLUDE(cmake/gettext.cmake)
|
||||
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config_cmake.h.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
# Set up standard directories.
|
||||
INCLUDE(GNUInstallDirs)
|
||||
ADD_DEFINITIONS(-D_UNICODE=1
|
||||
-DLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}"
|
||||
-DPREFIX=L"${CMAKE_INSTALL_PREFIX}"
|
||||
-DDATADIR=L"${CMAKE_INSTALL_FULL_DATADIR}"
|
||||
-DSYSCONFDIR=L"${CMAKE_INSTALL_FULL_SYSCONFDIR}"
|
||||
-DBINDIR=L"${CMAKE_INSTALL_FULL_BINDIR}"
|
||||
-DDOCDIR=L"${CMAKE_INSTALL_FULL_DOCDIR}")
|
||||
|
||||
# Set up the machinery around FISH-BUILD-VERSION-FILE
|
||||
# This defines the FBVF variable.
|
||||
INCLUDE(Version)
|
||||
|
||||
# Let fish pick up when we're running out of the build directory without installing
|
||||
ADD_DEFINITIONS(-DCMAKE_BINARY_DIR="${CMAKE_BINARY_DIR}")
|
||||
ADD_DEFINITIONS(-DCMAKE_SOURCE_DIR="${CMAKE_SOURCE_DIR}")
|
||||
|
||||
# Teach fish_version.o to rebuild when FBVF changes.
|
||||
# The standard C++ include detection machinery misses this.
|
||||
SET_SOURCE_FILES_PROPERTIES(src/fish_version.cpp
|
||||
PROPERTIES OBJECT_DEPENDS
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${FBVF})
|
||||
|
||||
OPTION(INTERNAL_WCWIDTH "use fallback wcwidth" ON)
|
||||
IF(INTERNAL_WCWIDTH)
|
||||
add_definitions(-DHAVE_BROKEN_WCWIDTH=1)
|
||||
ELSE()
|
||||
add_definitions(-DHAVE_BROKEN_WCWIDTH=0)
|
||||
ENDIF()
|
||||
|
||||
# Set up PCRE2
|
||||
INCLUDE(cmake/PCRE2.cmake)
|
||||
|
||||
# Set up the docs.
|
||||
INCLUDE(cmake/Docs.cmake)
|
||||
|
||||
# Define a function to link dependencies.
|
||||
FUNCTION(FISH_LINK_DEPS target)
|
||||
TARGET_LINK_LIBRARIES(${target} fishlib)
|
||||
ENDFUNCTION(FISH_LINK_DEPS)
|
||||
|
||||
# Define libfish.a.
|
||||
ADD_LIBRARY(fishlib STATIC ${FISH_SRCS})
|
||||
TARGET_SOURCES(fishlib PRIVATE ${FISH_HEADERS})
|
||||
TARGET_LINK_LIBRARIES(fishlib
|
||||
${CURSES_LIBRARY} ${CURSES_EXTRA_LIBRARY} Threads::Threads ${CMAKE_DL_LIBS}
|
||||
${PCRE2_LIB} ${Intl_LIBRARIES})
|
||||
|
||||
# Define fish.
|
||||
ADD_EXECUTABLE(fish src/fish.cpp)
|
||||
FISH_LINK_DEPS(fish)
|
||||
|
||||
# Define fish_indent.
|
||||
ADD_EXECUTABLE(fish_indent
|
||||
src/fish_indent.cpp src/print_help.cpp)
|
||||
FISH_LINK_DEPS(fish_indent)
|
||||
|
||||
# Define fish_key_reader.
|
||||
ADD_EXECUTABLE(fish_key_reader
|
||||
src/fish_key_reader.cpp src/print_help.cpp)
|
||||
FISH_LINK_DEPS(fish_key_reader)
|
||||
|
||||
# Set up tests.
|
||||
INCLUDE(cmake/Tests.cmake)
|
||||
|
||||
# Set up install.
|
||||
INCLUDE(cmake/Install.cmake)
|
||||
|
||||
INCLUDE(FeatureSummary)
|
||||
FEATURE_SUMMARY(WHAT ALL)
|
||||
308
CONTRIBUTING.md
Normal file
308
CONTRIBUTING.md
Normal file
@@ -0,0 +1,308 @@
|
||||
# Guidelines For Developers
|
||||
|
||||
This document provides guidelines for making changes to the fish-shell project. This includes rules for how to format the code, naming conventions, et cetera. Generally known as the style of the code. It also includes recommended best practices such as creating a Travis CI account so you can verify that your changes pass all the tests before making a pull request.
|
||||
|
||||
See the bottom of this document for help on installing the linting and style reformatting tools discussed in the following sections.
|
||||
|
||||
Fish source should limit the C++ features it uses to those available in C++11. It should not use exceptions.
|
||||
|
||||
Before introducing a new dependency, please make it optional with graceful failure if possible. Add
|
||||
any new dependencies to the README.md under the *Running* and/or *Building* sections.
|
||||
|
||||
## Versioning
|
||||
|
||||
The fish version is constructed by the *build_tools/git_version_gen.sh* script. For developers the version is the branch name plus the output of `git describe --always --dirty`. Normally the main part of the version will be the closest annotated tag. Which itself is usually the most recent release number (e.g., `2.6.0`).
|
||||
|
||||
## Include What You Use
|
||||
|
||||
You should not depend on symbols being visible to a `*.cpp` module from `#include` statements inside another header file. In other words if your module does `#include "common.h"` and that header does `#include "signal.h"` your module should not assume the sub-include is present. It should instead directly `#include "signal.h"` if it needs any symbol from that header. That makes the actual dependencies much clearer. It also makes it easy to modify the headers included by a specific header file without having to worry that will break any module (or header) that includes a particular header.
|
||||
|
||||
To help enforce this rule the `make lint` (and `make lint-all`) command will run the [include-what-you-use](https://include-what-you-use.org/) tool. You can find the IWYU project on [github](https://github.com/include-what-you-use/include-what-you-use).
|
||||
|
||||
To install the tool on OS X you'll need to add a [formula](https://github.com/jasonmp85/homebrew-iwyu) then install it:
|
||||
|
||||
```
|
||||
brew tap jasonmp85/iwyu
|
||||
brew install iwyu
|
||||
```
|
||||
|
||||
On Ubuntu you can install it via `apt-get`:
|
||||
|
||||
```
|
||||
sudo apt-get install iwyu
|
||||
```
|
||||
|
||||
## Lint Free Code
|
||||
|
||||
Automated analysis tools like cppcheck and oclint can point out potential bugs or code that is extremely hard to understand. They also help ensure the code has a consistent style and that it avoids patterns that tend to confuse people.
|
||||
|
||||
Ultimately we want lint free code. However, at the moment a lot of cleanup is required to reach that goal. For now simply try to avoid introducing new lint.
|
||||
|
||||
To make linting the code easy there are two make targets: `lint` and `lint-all`. The latter does exactly what the name implies. The former will lint any modified but not committed `*.cpp` files. If there is no uncommitted work it will lint the files in the most recent commit.
|
||||
|
||||
Fish has custom cppcheck rules in the file `.cppcheck.rule`. These help catch mistakes such as using `wcwidth()` rather than `fish_wcwidth()`. Please add a new rule if you find similar mistakes being made.
|
||||
|
||||
Fish also depends on `diff` and `expect` for its tests.
|
||||
|
||||
### Dealing With Lint Warnings
|
||||
|
||||
You are strongly encouraged to address a lint warning by refactoring the code, changing variable names, or whatever action is implied by the warning.
|
||||
|
||||
### Suppressing Lint Warnings
|
||||
|
||||
Once in a while the lint tools emit a false positive warning. For example, cppcheck might suggest a memory leak is present when that is not the case. To suppress that cppcheck warning you should insert a line like the following immediately prior to the line cppcheck warned about:
|
||||
|
||||
```
|
||||
// cppcheck-suppress memleak // addr not really leaked
|
||||
```
|
||||
|
||||
The explanatory portion of the suppression comment is optional. For other types of warnings replace "memleak" with the value inside the parenthesis (e.g., "nullPointerRedundantCheck") from a warning like the following:
|
||||
|
||||
```
|
||||
[src/complete.cpp:1727]: warning (nullPointerRedundantCheck): Either the condition 'cmd_node' is redundant or there is possible null pointer dereference: cmd_node.
|
||||
```
|
||||
|
||||
Suppressing oclint warnings is more complicated to describe so I'll refer you to the [OCLint HowTo](http://docs.oclint.org/en/latest/howto/suppress.html#annotations) on the topic.
|
||||
|
||||
## Ensuring Your Changes Conform to the Style Guides
|
||||
|
||||
The following sections discuss the specific rules for the style that should be used when writing fish code. To ensure your changes conform to the style rules you simply need to run
|
||||
|
||||
```
|
||||
make style
|
||||
```
|
||||
|
||||
before committing your change. That will run `git-clang-format` to rewrite only the lines you're modifying.
|
||||
|
||||
If you've already committed your changes that's okay since it will then check the files in the most recent commit. This can be useful after you've merged another person's change and want to check that it's style is acceptable. However, in that case it will run `clang-format` to ensure the entire file, not just the lines modified by the commit, conform to the style.
|
||||
|
||||
If you want to check the style of the entire code base run
|
||||
|
||||
```
|
||||
make style-all
|
||||
```
|
||||
|
||||
That command will refuse to restyle any files if you have uncommitted changes.
|
||||
|
||||
### Configuring Your Editor for Fish C++ Code
|
||||
|
||||
#### ViM
|
||||
|
||||
As of ViM 7.4 it does not recognize triple-slash comments as used by Doxygen and the OS X Xcode IDE to flag comments that explain the following C symbol. This means the `gq` key binding to reformat such comments doesn't behave as expected. You can fix that by adding the following to your vimrc:
|
||||
|
||||
```
|
||||
autocmd Filetype c,cpp setlocal comments^=:///
|
||||
```
|
||||
|
||||
If you use ViM I recommend the [vim-clang-format plugin](https://github.com/rhysd/vim-clang-format) by [@rhysd](https://github.com/rhysd).
|
||||
|
||||
You can also get ViM to provide reasonably correct behavior by installing
|
||||
|
||||
http://www.vim.org/scripts/script.php?script_id=2636
|
||||
|
||||
#### Emacs
|
||||
|
||||
If you use Emacs: TBD
|
||||
|
||||
### Configuring Your Editor for Fish Scripts
|
||||
|
||||
If you use ViM: Install [vim-fish](https://github.com/dag/vim-fish), make sure you have syntax and filetype functionality in `~/.vimrc`:
|
||||
|
||||
```
|
||||
syntax enable
|
||||
filetype plugin indent on
|
||||
```
|
||||
|
||||
Then turn on some options for nicer display of fish scripts in `~/.vim/ftplugin/fish.vim`:
|
||||
|
||||
```
|
||||
" Set up :make to use fish for syntax checking.
|
||||
compiler fish
|
||||
|
||||
" Set this to have long lines wrap inside comments.
|
||||
setlocal textwidth=79
|
||||
|
||||
" Enable folding of block structures in fish.
|
||||
setlocal foldmethod=expr
|
||||
```
|
||||
|
||||
If you use Emacs: Install [fish-mode](https://github.com/wwwjfy/emacs-fish) (also available in melpa and melpa-stable) and `(setq-default indent-tabs-mode nil)` for it (via a hook or in `use-package`s ":init" block). It can also be made to run fish_indent via e.g.
|
||||
|
||||
```elisp
|
||||
(add-hook 'fish-mode-hook (lambda ()
|
||||
(add-hook 'before-save-hook 'fish_indent-before-save)))
|
||||
```
|
||||
|
||||
### Suppressing Reformatting of C++ Code
|
||||
|
||||
If you have a good reason for doing so you can tell `clang-format` to not reformat a block of code by enclosing it in comments like this:
|
||||
|
||||
```
|
||||
// clang-format off
|
||||
code to ignore
|
||||
// clang-format on
|
||||
```
|
||||
|
||||
However, as I write this there are no places in the code where we use this and I can't think of any legitimate reasons for exempting blocks of code from clang-format.
|
||||
|
||||
## Fish Script Style Guide
|
||||
|
||||
1. All fish scripts, such as those in the *share/functions* and *tests* directories, should be formatted using the `fish_indent` command.
|
||||
|
||||
1. Function names should be in all lowercase with words separated by underscores. Private functions should begin with an underscore. The first word should be `fish` if the function is unique to fish.
|
||||
|
||||
1. The first word of global variable names should generally be `fish` for public vars or `_fish` for private vars to minimize the possibility of name clashes with user defined vars.
|
||||
|
||||
## C++ Style Guide
|
||||
|
||||
1. The [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) forms the basis of the fish C++ style guide. There are two major deviations for the fish project. First, a four, rather than two, space indent. Second, line lengths up to 100, rather than 80, characters.
|
||||
|
||||
1. The `clang-format` command is authoritative with respect to indentation, whitespace around operators, etc.
|
||||
|
||||
1. All names in code should be `small_snake_case`. No Hungarian notation is used. The names for classes and structs should be followed by `_t`.
|
||||
|
||||
1. Always attach braces to the surrounding context.
|
||||
|
||||
1. Indent with spaces, not tabs and use four spaces per indent.
|
||||
|
||||
1. Comments should always use the C++ style; i.e., each line of the comment should begin with a `//` and should be limited to 100 characters. Comments that do not begin a line should be separated from the previous text by two spaces.
|
||||
|
||||
1. Comments that document the purpose of a function or class should begin with three slashes, `///`, so that OS X Xcode (and possibly other IDEs) will extract the comment and show it in the "Quick Help" window when the cursor is on the symbol.
|
||||
|
||||
## Testing
|
||||
|
||||
The source code for fish includes a large collection of tests. If you are making any changes to fish, running these tests is mandatory to make sure the behaviour remains consistent and regressions are not introduced. Even if you don't run the tests on your machine, they will still be run via the [Travis CI](https://travis-ci.org/fish-shell/fish-shell) service.
|
||||
|
||||
You are strongly encouraged to add tests when changing the functionality of fish, especially if you are fixing a bug to help ensure there are no regressions in the future (i.e., we don't reintroduce the bug).
|
||||
|
||||
### Local testing
|
||||
|
||||
The tests can be run on your local computer on all operating systems.
|
||||
|
||||
Running the tests is only supported from the autotools build and not xcodebuild. On OS X, you will need to install autoconf — we suggest using [Homebrew](https://brew.sh/) to install these tools.
|
||||
|
||||
```
|
||||
autoconf
|
||||
./configure
|
||||
make test # or "gmake test" on BSD
|
||||
```
|
||||
|
||||
### Travis CI Build and Test
|
||||
|
||||
The Travis Continuous Integration services can be used to test your changes using multiple configurations. This is the same service that the fish-shell project uses to ensure new changes haven't broken anything. Thus it is a really good idea that you leverage Travis CI before making a pull request to avoid potential embarrassment at breaking the build.
|
||||
|
||||
You will need to [fork the fish-shell repository on GitHub](https://help.github.com/articles/fork-a-repo/), then setup Travis to test your changes before making a pull request.
|
||||
|
||||
1. [Sign in to Travis CI](https://travis-ci.org/auth) with your GitHub account, accepting the GitHub access permissions confirmation.
|
||||
1. Once you're signed in and your repositories are synchronized, go to your [profile page](https://travis-ci.org/profile) and enable the fish-shell repository.
|
||||
1. Push your changes to GitHub.
|
||||
|
||||
You'll receive an email when the tests are complete telling you whether or not any tests failed.
|
||||
|
||||
You'll find the configuration used to control Travis in the `.travis.yml` file.
|
||||
|
||||
### Git hooks
|
||||
|
||||
Since developers sometimes forget to run the tests, it can be helpful to use git hooks (see githooks(5)) to automate it.
|
||||
|
||||
One possibility is a pre-push hook script like this one:
|
||||
|
||||
```sh
|
||||
#!/bin/sh
|
||||
#### A pre-push hook for the fish-shell project
|
||||
# This will run the tests when a push to master is detected, and will stop that if the tests fail
|
||||
# Save this as .git/hooks/pre-push and make it executable
|
||||
|
||||
protected_branch='master'
|
||||
|
||||
# Git gives us lines like "refs/heads/frombranch SOMESHA1 refs/heads/tobranch SOMESHA1"
|
||||
# We're only interested in the branches
|
||||
while read from _ to _; do
|
||||
if [ "x$to" = "xrefs/heads/$protected_branch" ]; then
|
||||
isprotected=1
|
||||
fi
|
||||
done
|
||||
if [ "x$isprotected" = x1 ]; then
|
||||
echo "Running tests before push to master"
|
||||
make test
|
||||
RESULT=$?
|
||||
if [ $RESULT -ne 0 ]; then
|
||||
echo "Tests failed for a push to master, we can't let you do that" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
exit 0
|
||||
```
|
||||
|
||||
This will check if the push is to the master branch and, if it is, only allow the push if running `make test` succeeds. In some circumstances it may be advisable to circumvent this check with `git push --no-verify`, but usually that isn't necessary.
|
||||
|
||||
To install the hook, place the code in a new file `.git/hooks/pre-push` and make it executable.
|
||||
|
||||
### Coverity Scan
|
||||
|
||||
We use Coverity's static analysis tool which offers free access to open source projects. While access to the tool itself is restricted, fish-shell organization members should know that they can login [here](https://scan.coverity.com/projects/fish-shell-fish-shell?tab=overview) with their GitHub account. Currently, tests are triggered upon merging the `master` branch into `coverity_scan_master`. Even if you are not a fish developer, you can keep an eye on our statistics there.
|
||||
|
||||
## Installing the Required Tools
|
||||
|
||||
### Installing the Linting Tools
|
||||
|
||||
To install the lint checkers on Mac OS X using Homebrew:
|
||||
|
||||
```
|
||||
brew tap oclint/formulae
|
||||
brew install oclint
|
||||
brew install cppcheck
|
||||
```
|
||||
|
||||
To install the lint checkers on Debian-based Linux distributions:
|
||||
|
||||
```
|
||||
sudo apt-get install clang
|
||||
sudo apt-get install oclint
|
||||
sudo apt-get install cppcheck
|
||||
```
|
||||
|
||||
### Installing the Reformatting Tools
|
||||
|
||||
Mac OS X:
|
||||
|
||||
```
|
||||
brew install clang-format
|
||||
```
|
||||
|
||||
Debian-based:
|
||||
|
||||
```
|
||||
apt-cache search clang-format
|
||||
```
|
||||
|
||||
Above will list all the versions available. Pick the newest one available (3.9 for Ubuntu 16.10 as I write this) and install it:
|
||||
|
||||
```
|
||||
sudo apt-get install clang-format-3.9
|
||||
sudo ln -s /usr/bin/clang-format-3.9 /usr/bin/clang-format
|
||||
```
|
||||
|
||||
## Message Translations
|
||||
|
||||
Fish uses the GNU gettext library to translate messages from English to other languages. To create or update a translation run `make po/[LANGUAGE CODE].po` where `LANGUAGE CODE` is the two letter ISO 639-1 language code of the language you are translating to (e.g. `de` for German). Make sure that you have the `xgettext`, `msgfmt` and `msgmerge` commands installed in order to do this.
|
||||
|
||||
All messages in fish script must be enclosed in single or double quote characters. They must also be translated via a subcommand. This means that the following are **not** valid:
|
||||
|
||||
```
|
||||
echo (_ hello)
|
||||
_ "goodbye"
|
||||
```
|
||||
|
||||
Above should be written like this instead:
|
||||
|
||||
```
|
||||
echo (_ "hello")
|
||||
echo (_ "goodbye")
|
||||
```
|
||||
|
||||
Note that you can use either single or double quotes to enclose the message to be translated. You can also optionally include spaces after the opening parentheses and once again before the closing parentheses.
|
||||
|
||||
Be cautious about blindly updating an existing translation file. Trivial changes to an existing message (e.g., changing the punctuation) will cause existing translations to be removed, since the tools do literal string matching. Therefore, in general, you need to carefully review any recommended deletions.
|
||||
|
||||
Read the [translations wiki](https://github.com/fish-shell/fish-shell/wiki/Translations) for more information.
|
||||
19
COPYING
Normal file
19
COPYING
Normal file
@@ -0,0 +1,19 @@
|
||||
Fish is a smart and user-friendly command line shell.
|
||||
|
||||
Copyright (C) 2005-2009 Axel Liljencrantz
|
||||
|
||||
fish is free software.
|
||||
|
||||
Most of fish is licensed under the GNU General Public License version 2, and
|
||||
you can redistribute it and/or modify it under the terms of the GNU GPL as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
fish also includes software licensed under the GNU Lesser General Public
|
||||
License version 2, the OpenBSD license, the ISC license, and the NetBSD license.
|
||||
|
||||
Full licensing information is contained in doc_src/license.hdr.
|
||||
|
||||
This program 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.
|
||||
19
Dockerfile
Normal file
19
Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
||||
FROM centos:latest
|
||||
|
||||
# Build dependency
|
||||
RUN yum update -y &&\
|
||||
yum install -y autoconf automake bc clang gcc-c++ make ncurses-devel &&\
|
||||
yum clean all
|
||||
|
||||
# Test dependency
|
||||
RUN yum install -y expect vim-common
|
||||
|
||||
ADD . /src
|
||||
WORKDIR /src
|
||||
|
||||
# Build fish
|
||||
RUN autoreconf &&\
|
||||
./configure &&\
|
||||
make &&\
|
||||
make install
|
||||
|
||||
2357
Doxyfile.help
Normal file
2357
Doxyfile.help
Normal file
File diff suppressed because it is too large
Load Diff
1161
Doxyfile.help.in
1161
Doxyfile.help.in
File diff suppressed because it is too large
Load Diff
2360
Doxyfile.user
2360
Doxyfile.user
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
78
INSTALL
78
INSTALL
@@ -1,78 +0,0 @@
|
||||
|
||||
Known issues
|
||||
============
|
||||
|
||||
Fish is developed using GCC, with the goal of using only C89 language
|
||||
features. Fish does, however use the *wprintf family of functions,
|
||||
which are new to the C99 standrard. It is not unlikely that any given
|
||||
release contains a few GCC:isms, but ICC 9.0.030 has been found to
|
||||
produce working binaries. GCC 2.95.* won't compile fish, but GCC 3.2.3
|
||||
is known to work. Patches to fix any remaining GNU:isms are welcome.
|
||||
|
||||
Older versions of Doxygen has bugs in the man-page generation which
|
||||
cause the builtin help to render incorrectly. Doxygen 1.2.14 is known
|
||||
to have this problem.
|
||||
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
|
||||
Fish requires the following programs and libraries to build:
|
||||
|
||||
- Doxygen
|
||||
- Curses or Ncurses
|
||||
- GNU make
|
||||
- GCC
|
||||
|
||||
fish also relies on standard unix tools such as cat, cut, grep, sed,
|
||||
whoami, bc and echo. Fish does not yet support cross-compilation,
|
||||
separate build directories or any other fancy configure options.
|
||||
|
||||
|
||||
Simple install procedure
|
||||
========================
|
||||
|
||||
Always begin by uninstalling any previous fish versions. This is done
|
||||
by running the command 'make uninstall' in the source directory of
|
||||
your previous fish installation.
|
||||
|
||||
Next, if you have downloaded a fresh copy of the darcs repository of
|
||||
fish, you need to run the 'autoconf' command.
|
||||
|
||||
Then, use following commands to compile fish:
|
||||
|
||||
./configure
|
||||
make # Compile fish
|
||||
make install # Install fish
|
||||
echo /usr/local/bin/fish >>/etc/shells # Add fish to list of shells
|
||||
|
||||
Finally, if you wish to use fish as your default shell, use the
|
||||
following command:
|
||||
|
||||
% chsh -s /usr/local/bin/fish
|
||||
|
||||
chsh will prompt you for your password, and change your default shell.
|
||||
|
||||
To switch your default shell back, you can run:
|
||||
|
||||
% chsh -s /bin/bash
|
||||
|
||||
Substitute /bin/bash with /bin/tcsh or /bin/zsh as appropriate.
|
||||
|
||||
Local install procedure
|
||||
=======================
|
||||
|
||||
If you have downloaded the darcs repository of fish, you need to run
|
||||
autoconf to generate the configure script.
|
||||
|
||||
To install fish in your own home directory (typically as non-root),
|
||||
type:
|
||||
|
||||
% ./configure --prefix=$HOME
|
||||
% make # Compile fish
|
||||
% make install # Install fish
|
||||
|
||||
You will not be able to use fish as the default shell unless you also
|
||||
add the corresponding line to /etc/shells, which mostly defeats the
|
||||
point of a local install. As a workaround, you can add fish as the
|
||||
last command of the init files for your regular shell.
|
||||
1625
Makefile.in
1625
Makefile.in
File diff suppressed because it is too large
Load Diff
163
README.md
163
README.md
@@ -1,39 +1,164 @@
|
||||
[fish](http://ridiculousfish.com/shell/) - the friendly interactive shell
|
||||
[fish](https://fishshell.com/) - the friendly interactive shell [](https://travis-ci.org/fish-shell/fish-shell)
|
||||
================================================
|
||||
|
||||
fish is a smart and user-friendly command line shell for OS X, Linux, and the rest of the family. fish includes features like syntax highlighting, autosuggest-as-you-type, and fancy tab completions that just work, with no configuration required.
|
||||
fish is a smart and user-friendly command line shell for macOS, Linux, and the rest of the family.
|
||||
fish includes features like syntax highlighting, autosuggest-as-you-type, and fancy tab completions
|
||||
that just work, with no configuration required.
|
||||
|
||||
For more on fish's design philosophy, see the [design document](http://ridiculousfish.com/shell/user_doc/html/design.html).
|
||||
For more on fish's design philosophy, see the [design document](https://fishshell.com/docs/current/design.html).
|
||||
|
||||
## Quick Start
|
||||
|
||||
fish generally works like other shells, like bash or zsh. A few important differences are documented at <http://ridiculousfish.com/shell/faq.html>
|
||||
fish generally works like other shells, like bash or zsh. A few important differences can be found at <https://fishshell.com/docs/current/tutorial.html> by searching for the magic phrase "unlike other shells".
|
||||
|
||||
Detailed user documentation is available by running `help` within fish, and also at <http://ridiculousfish.com/shell/user_doc/html/>
|
||||
Detailed user documentation is available by running `help` within fish, and also at <https://fishshell.com/docs/current/index.html>
|
||||
|
||||
You can quickly play with fish right in your browser by clicking the button below:
|
||||
|
||||
[](https://rootnroll.com/d/fish-shell/)
|
||||
|
||||
## Getting fish
|
||||
|
||||
### macOS
|
||||
|
||||
fish can be installed:
|
||||
|
||||
* using [Homebrew](http://brew.sh/): `brew install fish`
|
||||
* using [MacPorts](https://www.macports.org/): `sudo port install fish`
|
||||
* using the [installer from fishshell.com](https://fishshell.com/)
|
||||
* as a [standalone app from fishshell.com](https://fishshell.com/)
|
||||
|
||||
### Packages for Linux
|
||||
|
||||
Packages for Debian, Fedora, openSUSE, and Red Hat Enterprise Linux/CentOS are available from the
|
||||
[openSUSE Build
|
||||
Service](https://software.opensuse.org/download.html?project=shells%3Afish%3Arelease%3A2&package=fish).
|
||||
|
||||
Packages for Ubuntu are available from the [fish
|
||||
PPA](https://launchpad.net/~fish-shell/+archive/ubuntu/release-2), and can be installed using the
|
||||
following commands:
|
||||
|
||||
```
|
||||
sudo apt-add-repository ppa:fish-shell/release-2
|
||||
sudo apt-get update
|
||||
sudo apt-get install fish
|
||||
```
|
||||
|
||||
Instructions for other distributions may be found at [fishshell.com](https://fishshell.com).
|
||||
|
||||
### Windows
|
||||
|
||||
- On Windows 10, fish can be installed under the WSL Windows Subsystem for Linux with `sudo apt install fish` or from source with the instructions below.
|
||||
- Fish can also be installed on all versions of Windows using [Cygwin](https://cygwin.com/) (from the **Shells** category).
|
||||
|
||||
### Building from source
|
||||
|
||||
If packages are not available for your platform, GPG-signed tarballs are available from
|
||||
[fishshell.com](https://fishshell.com/) and [fish-shell on
|
||||
GitHub](https://github.com/fish-shell/fish-shell/releases). See the *Building* section for instructions.
|
||||
|
||||
## Running fish
|
||||
|
||||
Once installed, run `fish` from your current shell to try fish out!
|
||||
|
||||
### Dependencies
|
||||
|
||||
Running fish requires:
|
||||
|
||||
* curses or ncurses (preinstalled on most \*nix systems)
|
||||
* some common \*nix system utilities (currently `mktemp` and `seq`), in addition to the basic POSIX utilities
|
||||
* gettext (library and `gettext` command), if compiled with translation support
|
||||
|
||||
The following optional features also have specific requirements:
|
||||
|
||||
* builtin commands that have the `--help` option or print usage messages require `nroff` and `ul`
|
||||
* automated completion generation from manual pages requires Python (2.7+ or 3.3+) and possibly the
|
||||
`backports.lzma` module for Python 2.7
|
||||
* the `fish_config` web configuration tool requires Python (2.7+ or 3.3 +) and a web browser
|
||||
* system clipboard integration (with the default Ctrl-V and Ctrl-X bindings) require either the
|
||||
`xsel` or `pbcopy`/`pbpaste` utilities
|
||||
* full completions for `yarn` and `bower` require the `jq` utility
|
||||
* full completions for `yarn` and `npm` require the `all-the-package-names` NPM module
|
||||
|
||||
### Switching to fish
|
||||
|
||||
If you wish to use fish as your default shell, use the following command:
|
||||
|
||||
chsh -s /usr/local/bin/fish
|
||||
|
||||
`chsh` will prompt you for your password and change your default shell. (Substitute `/usr/local/bin/fish` with whatever path fish was installed to, if it differs.)
|
||||
|
||||
Use the following command if fish isn't already added to `/etc/shells` to permit fish to be your login shell:
|
||||
|
||||
echo /usr/local/bin/fish | sudo tee -a /etc/shells
|
||||
|
||||
To switch your default shell back, you can run `chsh -s /bin/bash` (substituting `/bin/bash` with `/bin/tcsh` or `/bin/zsh` as appropriate).
|
||||
|
||||
## Building
|
||||
|
||||
fish can be built using autotools or Xcode.
|
||||
### Dependencies
|
||||
|
||||
### Autotools Build
|
||||
Compiling fish requires:
|
||||
|
||||
autoconf
|
||||
./configure [--without-xsel]
|
||||
make [gmake on BSD]
|
||||
sudo make install
|
||||
* a C++11 compiler (g++ 4.8 or later, or clang 3.3 or later)
|
||||
* any of CMake, GNU Make, or (on macOS only) Xcode
|
||||
* a curses implementation such as ncurses (headers and libraries)
|
||||
* PCRE2 (headers and libraries) - a copy is included with fish
|
||||
* gettext (headers and libraries) - optional, for translation support
|
||||
|
||||
### Xcode Development Build
|
||||
Additionally, if compiling fish with GNU Make from git (that is, not from an officially released tarball), `autoconf` 2.60+ and `automake` 1.13+ are required. Doxygen (1.8.7 or later) is also optionally required to build the documentation from a cloned git repository.
|
||||
|
||||
### Building from source (all platforms)
|
||||
|
||||
#### Using CMake (preferred)
|
||||
|
||||
```bash
|
||||
mkdir build; cd build
|
||||
cmake ..
|
||||
make
|
||||
sudo make install
|
||||
```
|
||||
|
||||
#### Using autotools
|
||||
|
||||
```bash
|
||||
autoreconf --no-recursive #if building from Git
|
||||
./configure
|
||||
make
|
||||
sudo make install
|
||||
```
|
||||
|
||||
### Building from source (macOS only)
|
||||
|
||||
* Build the `base` target in Xcode
|
||||
* Run the fish executable, for example, in `DerivedData/FishsFish/Build/Products/Debug/base/bin/fish`
|
||||
* Run the fish executable, for example, in `DerivedData/fish/Build/Products/Debug/base/bin/fish`
|
||||
|
||||
### Xcode Build and Install
|
||||
To build and install fish with Xcode on macOS, execute the following in a terminal:
|
||||
|
||||
mkdir /tmp/fish_build
|
||||
xcodebuild install -target install_tree DSTROOT=/tmp/fish_build
|
||||
sudo ditto /tmp/fish_build/ /
|
||||
```bash
|
||||
xcodebuild install
|
||||
sudo ditto /tmp/fish.dst /
|
||||
sudo make install-doc
|
||||
```
|
||||
|
||||
### Help, it didn't build!
|
||||
|
||||
If fish reports that it could not find curses, try installing a curses development package and build again.
|
||||
|
||||
On Debian or Ubuntu you want:
|
||||
|
||||
sudo apt-get install build-essential ncurses-dev libncurses5-dev gettext autoconf
|
||||
|
||||
On RedHat, CentOS, or Amazon EC2:
|
||||
|
||||
sudo yum install ncurses-devel
|
||||
|
||||
## Contributing Changes to the Code
|
||||
|
||||
See the [Guide for Developers](CONTRIBUTING.md).
|
||||
|
||||
## Contact Us
|
||||
|
||||
Questions, comments, rants and raves can be posted to the official fish mailing list at <https://lists.sourceforge.net/lists/listinfo/fish-users>
|
||||
Found a bug? Have an awesome idea? Please open an issue on this github page.
|
||||
Questions, comments, rants and raves can be posted to the official fish mailing list at <https://lists.sourceforge.net/lists/listinfo/fish-users> or join us on our [gitter.im channel](https://gitter.im/fish-shell/fish-shell) or IRC channel [#fish at irc.oftc.net](https://webchat.oftc.net/?channels=fish). Or use the [fish tag on Stackoverflow](https://stackoverflow.com/questions/tagged/fish) for questions related to fish script and the [fish tag on Superuser](https://superuser.com/questions/tagged/fish) for all other questions (e.g., customizing colors, changing key bindings).
|
||||
|
||||
Found a bug? Have an awesome idea? Please [open an issue](https://github.com/fish-shell/fish-shell/issues/new).
|
||||
|
||||
344
autoload.cpp
344
autoload.cpp
@@ -1,344 +0,0 @@
|
||||
/** \file autoload.cpp
|
||||
|
||||
The classes responsible for autoloading functions and completions.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "autoload.h"
|
||||
#include "wutil.h"
|
||||
#include "common.h"
|
||||
#include "signal.h"
|
||||
#include "env.h"
|
||||
#include "builtin_scripts.h"
|
||||
#include "exec.h"
|
||||
#include <assert.h>
|
||||
#include <algorithm>
|
||||
|
||||
/* The time before we'll recheck an autoloaded file */
|
||||
static const int kAutoloadStalenessInterval = 15;
|
||||
|
||||
file_access_attempt_t access_file(const wcstring &path, int mode) {
|
||||
//printf("Touch %ls\n", path.c_str());
|
||||
file_access_attempt_t result = {0};
|
||||
struct stat statbuf;
|
||||
if (wstat(path, &statbuf)) {
|
||||
result.error = errno;
|
||||
} else {
|
||||
result.mod_time = statbuf.st_mtime;
|
||||
if (waccess(path, mode)) {
|
||||
result.error = errno;
|
||||
} else {
|
||||
result.accessible = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Note that we record the last checked time after the call, on the assumption that in a slow filesystem, the lag comes before the kernel check, not after.
|
||||
result.stale = false;
|
||||
result.last_checked = time(NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
autoload_t::autoload_t(const wcstring &env_var_name_var, const builtin_script_t * const scripts, size_t script_count) :
|
||||
lock(),
|
||||
env_var_name(env_var_name_var),
|
||||
builtin_scripts(scripts),
|
||||
builtin_script_count(script_count),
|
||||
last_path(),
|
||||
is_loading_set()
|
||||
{
|
||||
pthread_mutex_init(&lock, NULL);
|
||||
}
|
||||
|
||||
autoload_t::~autoload_t() {
|
||||
pthread_mutex_destroy(&lock);
|
||||
}
|
||||
|
||||
void autoload_t::node_was_evicted(autoload_function_t *node) {
|
||||
// This should only ever happen on the main thread
|
||||
ASSERT_IS_MAIN_THREAD();
|
||||
|
||||
// Tell ourselves that the command was removed if it was loaded
|
||||
if (! node->is_loaded)
|
||||
this->command_removed(node->key);
|
||||
delete node;
|
||||
}
|
||||
|
||||
int autoload_t::unload( const wcstring &cmd )
|
||||
{
|
||||
return this->evict_node(cmd);
|
||||
}
|
||||
|
||||
int autoload_t::load( const wcstring &cmd, bool reload )
|
||||
{
|
||||
int res;
|
||||
CHECK_BLOCK( 0 );
|
||||
ASSERT_IS_MAIN_THREAD();
|
||||
|
||||
env_var_t path_var = env_get_string( env_var_name );
|
||||
|
||||
/*
|
||||
Do we know where to look?
|
||||
*/
|
||||
if( path_var.empty() )
|
||||
return 0;
|
||||
|
||||
/* Check if the lookup path has changed. If so, drop all loaded files. path_var may only be inspected on the main thread. */
|
||||
if( path_var != this->last_path )
|
||||
{
|
||||
this->last_path = path_var;
|
||||
scoped_lock locker(lock);
|
||||
this->evict_all_nodes();
|
||||
}
|
||||
|
||||
/** Warn and fail on infinite recursion. It's OK to do this because this function is only called on the main thread. */
|
||||
if (this->is_loading(cmd))
|
||||
{
|
||||
debug( 0,
|
||||
_( L"Could not autoload item '%ls', it is already being autoloaded. "
|
||||
L"This is a circular dependency in the autoloading scripts, please remove it."),
|
||||
cmd.c_str() );
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Mark that we're loading this */
|
||||
is_loading_set.insert(cmd);
|
||||
|
||||
/* Get the list of paths from which we will try to load */
|
||||
std::vector<wcstring> path_list;
|
||||
tokenize_variable_array( path_var, path_list );
|
||||
|
||||
/* Try loading it */
|
||||
res = this->locate_file_and_maybe_load_it( cmd, true, reload, path_list );
|
||||
|
||||
/* Clean up */
|
||||
bool erased = !! is_loading_set.erase(cmd);
|
||||
assert(erased);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
bool autoload_t::can_load( const wcstring &cmd, const env_vars_snapshot_t &vars )
|
||||
{
|
||||
const env_var_t path_var = vars.get(env_var_name);
|
||||
if (path_var.missing_or_empty())
|
||||
return false;
|
||||
|
||||
std::vector<wcstring> path_list;
|
||||
tokenize_variable_array( path_var, path_list );
|
||||
return this->locate_file_and_maybe_load_it( cmd, false, false, path_list );
|
||||
}
|
||||
|
||||
static bool script_name_precedes_script_name(const builtin_script_t &script1, const builtin_script_t &script2)
|
||||
{
|
||||
return wcscmp(script1.name, script2.name) < 0;
|
||||
}
|
||||
|
||||
void autoload_t::unload_all(void) {
|
||||
scoped_lock locker(lock);
|
||||
this->evict_all_nodes();
|
||||
}
|
||||
|
||||
/** Check whether the given command is loaded. */
|
||||
bool autoload_t::has_tried_loading( const wcstring &cmd )
|
||||
{
|
||||
scoped_lock locker(lock);
|
||||
autoload_function_t * func = this->get_node(cmd);
|
||||
return func != NULL;
|
||||
}
|
||||
|
||||
static bool is_stale(const autoload_function_t *func) {
|
||||
/** Return whether this function is stale. Internalized functions can never be stale. */
|
||||
return ! func->is_internalized && time(NULL) - func->access.last_checked > kAutoloadStalenessInterval;
|
||||
}
|
||||
|
||||
autoload_function_t *autoload_t::get_autoloaded_function_with_creation(const wcstring &cmd, bool allow_eviction)
|
||||
{
|
||||
ASSERT_IS_LOCKED(lock);
|
||||
autoload_function_t *func = this->get_node(cmd);
|
||||
if (! func) {
|
||||
func = new autoload_function_t(cmd);
|
||||
if (allow_eviction) {
|
||||
this->add_node(func);
|
||||
} else {
|
||||
this->add_node_without_eviction(func);
|
||||
}
|
||||
}
|
||||
return func;
|
||||
}
|
||||
|
||||
/**
|
||||
This internal helper function does all the real work. By using two
|
||||
functions, the internal function can return on various places in
|
||||
the code, and the caller can take care of various cleanup work.
|
||||
|
||||
cmd: the command name ('grep')
|
||||
really_load: whether to actually parse it as a function, or just check it it exists
|
||||
reload: whether to reload it if it's already loaded
|
||||
path_list: the set of paths to check
|
||||
|
||||
Result: if really_load is true, returns whether the function was loaded. Otherwise returns whether the function existed.
|
||||
*/
|
||||
bool autoload_t::locate_file_and_maybe_load_it( const wcstring &cmd, bool really_load, bool reload, const wcstring_list_t &path_list )
|
||||
{
|
||||
/* Note that we are NOT locked in this function! */
|
||||
size_t i;
|
||||
bool reloaded = 0;
|
||||
|
||||
/* Try using a cached function. If we really want the function to be loaded, require that it be really loaded. If we're not reloading, allow stale functions. */
|
||||
{
|
||||
bool allow_stale_functions = ! reload;
|
||||
|
||||
/* Take a lock */
|
||||
scoped_lock locker(lock);
|
||||
|
||||
/* Get the function */
|
||||
autoload_function_t * func = this->get_node(cmd);
|
||||
|
||||
/* Determine if we can use this cached function */
|
||||
bool use_cached;
|
||||
if (! func) {
|
||||
/* Can't use a function that doesn't exist */
|
||||
use_cached = false;
|
||||
} else if (really_load && ! func->is_placeholder && ! func->is_loaded) {
|
||||
/* Can't use an unloaded function */
|
||||
use_cached = false;
|
||||
} else if ( ! allow_stale_functions && is_stale(func)) {
|
||||
/* Can't use a stale function */
|
||||
use_cached = false;
|
||||
} else {
|
||||
/* I guess we can use it */
|
||||
use_cached = true;
|
||||
}
|
||||
|
||||
/* If we can use this function, return whether we were able to access it */
|
||||
if (use_cached) {
|
||||
return func->is_internalized || func->access.accessible;
|
||||
}
|
||||
}
|
||||
/* The source of the script will end up here */
|
||||
wcstring script_source;
|
||||
bool has_script_source = false;
|
||||
|
||||
/* Whether we found an accessible file */
|
||||
bool found_file = false;
|
||||
|
||||
/* Look for built-in scripts via a binary search */
|
||||
const builtin_script_t *matching_builtin_script = NULL;
|
||||
if (builtin_script_count > 0)
|
||||
{
|
||||
const builtin_script_t test_script = {cmd.c_str(), NULL};
|
||||
const builtin_script_t *array_end = builtin_scripts + builtin_script_count;
|
||||
const builtin_script_t *found = std::lower_bound(builtin_scripts, array_end, test_script, script_name_precedes_script_name);
|
||||
if (found != array_end && ! wcscmp(found->name, test_script.name))
|
||||
{
|
||||
/* We found it */
|
||||
matching_builtin_script = found;
|
||||
}
|
||||
}
|
||||
if (matching_builtin_script) {
|
||||
has_script_source = true;
|
||||
script_source = str2wcstring(matching_builtin_script->def);
|
||||
|
||||
/* Make a node representing this function */
|
||||
scoped_lock locker(lock);
|
||||
autoload_function_t *func = this->get_autoloaded_function_with_creation(cmd, really_load);
|
||||
|
||||
/* This function is internalized */
|
||||
func->is_internalized = true;
|
||||
|
||||
/* It's a fiction to say the script is loaded at this point, but we're definitely going to load it down below. */
|
||||
if (really_load) func->is_loaded = true;
|
||||
}
|
||||
|
||||
if (! has_script_source)
|
||||
{
|
||||
/* Iterate over path searching for suitable completion files */
|
||||
for( i=0; i<path_list.size(); i++ )
|
||||
{
|
||||
wcstring next = path_list.at(i);
|
||||
wcstring path = next + L"/" + cmd + L".fish";
|
||||
|
||||
const file_access_attempt_t access = access_file(path, R_OK);
|
||||
if (access.accessible) {
|
||||
/* Found it! */
|
||||
found_file = true;
|
||||
|
||||
/* Now we're actually going to take the lock. */
|
||||
scoped_lock locker(lock);
|
||||
autoload_function_t *func = this->get_node(cmd);
|
||||
|
||||
/* Generate the source if we need to load it */
|
||||
bool need_to_load_function = really_load && (func == NULL || func->access.mod_time != access.mod_time || ! func->is_loaded);
|
||||
if (need_to_load_function) {
|
||||
|
||||
/* Generate the script source */
|
||||
wcstring esc = escape_string(path, 1);
|
||||
script_source = L". " + esc;
|
||||
has_script_source = true;
|
||||
|
||||
/* Remove any loaded command because we are going to reload it. Note that this will deadlock if command_removed calls back into us. */
|
||||
if (func && func->is_loaded) {
|
||||
command_removed(cmd);
|
||||
func->is_placeholder = false;
|
||||
}
|
||||
|
||||
/* Mark that we're reloading it */
|
||||
reloaded = true;
|
||||
}
|
||||
|
||||
/* Create the function if we haven't yet. This does not load it. Do not trigger eviction unless we are actually loading, because we don't want to evict off of the main thread. */
|
||||
if (! func) {
|
||||
func = get_autoloaded_function_with_creation(cmd, really_load);
|
||||
}
|
||||
|
||||
/* It's a fiction to say the script is loaded at this point, but we're definitely going to load it down below. */
|
||||
if (need_to_load_function) func->is_loaded = true;
|
||||
|
||||
/* Unconditionally record our access time */
|
||||
func->access = access;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
If no file or builtin script was found we insert a placeholder function.
|
||||
Later we only research if the current time is at least five seconds later.
|
||||
This way, the files won't be searched over and over again.
|
||||
*/
|
||||
if( ! found_file && ! has_script_source )
|
||||
{
|
||||
scoped_lock locker(lock);
|
||||
/* Generate a placeholder */
|
||||
autoload_function_t *func = this->get_node(cmd);
|
||||
if (! func) {
|
||||
func = new autoload_function_t(cmd);
|
||||
func->is_placeholder = true;
|
||||
if (really_load) {
|
||||
this->add_node(func);
|
||||
} else {
|
||||
this->add_node_without_eviction(func);
|
||||
}
|
||||
}
|
||||
func->access.last_checked = time(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* If we have a script, either built-in or a file source, then run it */
|
||||
if (really_load && has_script_source)
|
||||
{
|
||||
if( exec_subshell( script_source) == -1 )
|
||||
{
|
||||
/*
|
||||
Do nothing on failiure
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (really_load) {
|
||||
return reloaded;
|
||||
} else {
|
||||
return found_file || has_script_source;
|
||||
}
|
||||
}
|
||||
129
autoload.h
129
autoload.h
@@ -1,129 +0,0 @@
|
||||
/** \file autoload.h
|
||||
|
||||
The classes responsible for autoloading functions and completions.
|
||||
*/
|
||||
|
||||
#ifndef FISH_AUTOLOAD_H
|
||||
#define FISH_AUTOLOAD_H
|
||||
|
||||
#include <wchar.h>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <list>
|
||||
#include "common.h"
|
||||
#include "lru.h"
|
||||
|
||||
/** A struct responsible for recording an attempt to access a file. */
|
||||
struct file_access_attempt_t {
|
||||
time_t mod_time; /** The modification time of the file */
|
||||
time_t last_checked; /** When we last checked the file */
|
||||
bool accessible; /** Whether we believe we could access this file */
|
||||
bool stale; /** Whether the access attempt is stale */
|
||||
int error; /** If we could not access the file, the error code */
|
||||
};
|
||||
|
||||
file_access_attempt_t access_file(const wcstring &path, int mode);
|
||||
|
||||
struct autoload_function_t : public lru_node_t
|
||||
{
|
||||
autoload_function_t(const wcstring &key) : lru_node_t(key), access(), is_loaded(false), is_placeholder(false), is_internalized(false) { }
|
||||
file_access_attempt_t access; /** The last access attempt */
|
||||
bool is_loaded; /** Whether we have actually loaded this function */
|
||||
bool is_placeholder; /** Whether we are a placeholder that stands in for "no such function". If this is true, then is_loaded must be false. */
|
||||
bool is_internalized; /** Whether this function came from a builtin "internalized" script */
|
||||
};
|
||||
|
||||
|
||||
struct builtin_script_t;
|
||||
class env_vars_snapshot_t;
|
||||
|
||||
/**
|
||||
A class that represents a path from which we can autoload, and the autoloaded contents.
|
||||
*/
|
||||
class autoload_t : private lru_cache_t<autoload_function_t> {
|
||||
private:
|
||||
|
||||
/** Lock for thread safety */
|
||||
pthread_mutex_t lock;
|
||||
|
||||
/** The environment variable name */
|
||||
const wcstring env_var_name;
|
||||
|
||||
/** Builtin script array */
|
||||
const struct builtin_script_t *const builtin_scripts;
|
||||
|
||||
/** Builtin script count */
|
||||
const size_t builtin_script_count;
|
||||
|
||||
/** The path from which we most recently autoloaded */
|
||||
wcstring last_path;
|
||||
|
||||
/**
|
||||
A table containing all the files that are currently being
|
||||
loaded. This is here to help prevent recursion.
|
||||
*/
|
||||
std::set<wcstring> is_loading_set;
|
||||
|
||||
bool is_loading(const wcstring &name) const {
|
||||
return is_loading_set.find(name) != is_loading_set.end();
|
||||
}
|
||||
|
||||
void remove_all_functions(void) {
|
||||
this->evict_all_nodes();
|
||||
}
|
||||
|
||||
bool locate_file_and_maybe_load_it( const wcstring &cmd, bool really_load, bool reload, const wcstring_list_t &path_list );
|
||||
|
||||
virtual void node_was_evicted(autoload_function_t *node);
|
||||
|
||||
autoload_function_t *get_autoloaded_function_with_creation(const wcstring &cmd, bool allow_eviction);
|
||||
|
||||
protected:
|
||||
/** Overridable callback for when a command is removed */
|
||||
virtual void command_removed(const wcstring &cmd) { }
|
||||
|
||||
public:
|
||||
|
||||
/** Create an autoload_t for the given environment variable name */
|
||||
autoload_t(const wcstring &env_var_name_var, const builtin_script_t *scripts, size_t script_count );
|
||||
|
||||
/** Destructor */
|
||||
virtual ~autoload_t();
|
||||
|
||||
/**
|
||||
Autoload the specified file, if it exists in the specified path. Do
|
||||
not load it multiple times unless it's timestamp changes or
|
||||
parse_util_unload is called.
|
||||
|
||||
Autoloading one file may unload another.
|
||||
|
||||
\param cmd the filename to search for. The suffix '.fish' is always added to this name
|
||||
\param on_unload a callback function to run if a suitable file is found, which has not already been run. unload will also be called for old files which are unloaded.
|
||||
\param reload wheter to recheck file timestamps on already loaded files
|
||||
*/
|
||||
int load( const wcstring &cmd, bool reload );
|
||||
|
||||
/** Check whether we have tried loading the given command. Does not do any I/O. */
|
||||
bool has_tried_loading( const wcstring &cmd );
|
||||
|
||||
/**
|
||||
Tell the autoloader that the specified file, in the specified path,
|
||||
is no longer loaded.
|
||||
|
||||
\param cmd the filename to search for. The suffix '.fish' is always added to this name
|
||||
\param on_unload a callback function which will be called before (re)loading a file, may be used to unload the previous file.
|
||||
\return non-zero if the file was removed, zero if the file had not yet been loaded
|
||||
*/
|
||||
int unload( const wcstring &cmd );
|
||||
|
||||
/**
|
||||
Unloads all files.
|
||||
*/
|
||||
void unload_all( );
|
||||
|
||||
/** Check whether the given command could be loaded, but do not load it. */
|
||||
bool can_load( const wcstring &cmd, const env_vars_snapshot_t &vars );
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
20
build_tools/build_commands_hdr.sh
Executable file
20
build_tools/build_commands_hdr.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Builds the commands.hdr file.
|
||||
# Usage: build_commands_hdr.sh ${HELP_SRC} < commands_hdr.in > commands.hdr
|
||||
|
||||
rm -f command_list.tmp command_list_toc.tmp
|
||||
for i in `printf "%s\n" $@ | LC_ALL=C.UTF-8 sort`; do
|
||||
echo "<hr>" >>command_list.tmp;
|
||||
cat $i >>command_list.tmp;
|
||||
echo >>command_list.tmp;
|
||||
echo >>command_list.tmp;
|
||||
NAME=`basename $i .txt`;
|
||||
echo '- <a href="#'$NAME'">'$NAME'</a>' >> command_list_toc.tmp;
|
||||
echo "Back to <a href='index.html#toc-commands'>command index</a>". >>command_list.tmp;
|
||||
done
|
||||
mv command_list.tmp command_list.txt
|
||||
mv command_list_toc.tmp command_list_toc.txt
|
||||
/usr/bin/env awk '{if ($0 ~ /@command_list_toc@/) { system("cat command_list_toc.txt"); }
|
||||
else if ($0 ~ /@command_list@/){ system("cat command_list.txt");}
|
||||
else{ print $0;}}'
|
||||
163
build_tools/build_documentation.sh
Executable file
163
build_tools/build_documentation.sh
Executable file
@@ -0,0 +1,163 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script is run as part of the build process
|
||||
|
||||
if test $# -eq 0
|
||||
then
|
||||
# Use fish's defaults
|
||||
DOXYFILE=Doxyfile.help
|
||||
INPUTDIR=doc_src
|
||||
OUTPUTDIR=share
|
||||
echo "Using defaults: $0 ${DOXYFILE} ${INPUTDIR} ${OUTPUTDIR}"
|
||||
elif test $# -eq 3
|
||||
then
|
||||
DOXYFILE="$1"
|
||||
INPUTDIR="$2"
|
||||
OUTPUTDIR="$3"
|
||||
else
|
||||
echo "Usage: $0 doxygen_file input_directory output_directory"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Determine which man pages we don't want to generate.
|
||||
# on OS X, don't make a man page for open, since we defeat fish's open function on OS X.
|
||||
# This is also done in the Makefile, but the Xcode build doesn't use that
|
||||
CONDEMNED_PAGES=
|
||||
if test `uname` = 'Darwin'; then
|
||||
CONDEMNED_PAGES="$CONDEMNED_PAGES open.1"
|
||||
fi
|
||||
|
||||
# Helper function to turn a relative path into an absolute path
|
||||
resolve_path()
|
||||
{
|
||||
D=`command dirname "$1"`
|
||||
B=`command basename "$1"`
|
||||
echo "`cd \"$D\" 2>/dev/null && pwd || echo \"$D\"`/$B"
|
||||
}
|
||||
|
||||
# Expand relative paths
|
||||
DOXYFILE=`resolve_path "$DOXYFILE"`
|
||||
INPUTDIR=`resolve_path "$INPUTDIR"`
|
||||
INPUTFILTER=`resolve_path "$INPUT_FILTER"`
|
||||
OUTPUTDIR=`resolve_path "$OUTPUTDIR"`
|
||||
|
||||
echo " doxygen file: $DOXYFILE"
|
||||
echo " input directory: $INPUTDIR"
|
||||
echo " input filter: $INPUTFILTER"
|
||||
echo " output directory: $OUTPUTDIR"
|
||||
echo " skipping: $CONDEMNED_PAGES"
|
||||
|
||||
#Until now the makefile likely has been affecting our output, reset for upcoming warnings
|
||||
tput sgr0
|
||||
|
||||
# Make sure INPUTDIR is found
|
||||
if test ! -d "$INPUTDIR"; then
|
||||
echo >&2 "Could not find input directory '${INPUTDIR}'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure doxygen is found
|
||||
DOXYGENPATH=`command -v doxygen`
|
||||
if test -z "$DOXYGENPATH" ; then
|
||||
for i in /usr/local/bin/doxygen /opt/bin/doxygen /Applications/Doxygen.app/Contents/Resources/doxygen ~/Applications/Doxygen.app/Contents/Resources/doxygen ; do
|
||||
if test -f "$i"; then
|
||||
DOXYGENPATH="$i"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if test -z "$DOXYGENPATH"; then
|
||||
echo >&2 "doxygen is not installed, so documentation will not be built."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Check we have the lexicon filter
|
||||
if test -z "$INPUT_FILTER"; then
|
||||
echo >&2 "Lexicon filter is not available. Continuing without."
|
||||
INPUTFILTER=''
|
||||
fi
|
||||
|
||||
# Determine where our output should go
|
||||
if ! mkdir -p "${OUTPUTDIR}" ; then
|
||||
echo "Could not create output directory '${OUTPUTDIR}'"
|
||||
fi
|
||||
|
||||
# Make a temporary directory
|
||||
TMPLOC=`mktemp -d -t fish_doc_build_XXXXXX` || { echo >&2 "Could not build documentation because mktemp failed"; exit 1; }
|
||||
|
||||
# Copy stuff to the temp directory
|
||||
for i in "$INPUTDIR"/*.txt; do
|
||||
BASENAME=`basename $i .txt`
|
||||
INPUTFILE=$TMPLOC/$BASENAME.doxygen
|
||||
echo "/** \\page" $BASENAME > $INPUTFILE
|
||||
cat $i | sed "s/\\\section $BASENAME $BASENAME/\\\section $BASENAME-man $BASENAME/" >> $INPUTFILE
|
||||
echo "*/" >> $INPUTFILE
|
||||
done
|
||||
|
||||
# Make some extra stuff to pass to doxygen
|
||||
# Input is kept as . because we cd to the input directory beforehand
|
||||
# This prevents doxygen from generating "documentation" for intermediate directories
|
||||
PROJECT_NUMBER=$(echo "$FISH_BUILD_VERSION" | env sed "s/-[a-z0-9-]*//")
|
||||
echo "PROJECT_NUMBER: $FISH_BUILD_VERSION"
|
||||
DOXYPARAMS=$(cat <<EOF
|
||||
PROJECT_NUMBER=${PROJECT_NUMBER}
|
||||
INPUT_FILTER=$INPUTFILTER
|
||||
INPUT=.
|
||||
OUTPUT_DIRECTORY=$OUTPUTDIR
|
||||
QUIET=YES
|
||||
EOF
|
||||
);
|
||||
|
||||
# echo "$DOXYPARAMS"
|
||||
|
||||
# Clear out the output directory first
|
||||
find "${OUTPUTDIR}" -name "*.1" -delete
|
||||
|
||||
# Run doxygen
|
||||
cd "$TMPLOC"
|
||||
(cat "${DOXYFILE}" ; echo "$DOXYPARAMS";) | "$DOXYGENPATH" -
|
||||
|
||||
# Remember errors
|
||||
RESULT=$?
|
||||
|
||||
cd "${OUTPUTDIR}/man/man1/"
|
||||
if test "$RESULT" = 0 ; then
|
||||
|
||||
# Postprocess the files
|
||||
for i in "$INPUTDIR"/*.txt; do
|
||||
# This command turns the following weirdness from Doxygen:
|
||||
# abbr \-
|
||||
# .SH "abbr - manage fish abbreviations"
|
||||
# into
|
||||
# \fBabbr\fP - manage fish abbreviations
|
||||
# It would be nice to use -i here for edit in place, but that is not portable
|
||||
CMD_NAME=`basename "$i" .txt`;
|
||||
sed -E < ${CMD_NAME}.1 > ${CMD_NAME}.1.tmp \
|
||||
-e "/^.SH NAME/{
|
||||
N; N
|
||||
s/${CMD_NAME} \\\\- \n.SH \"${CMD_NAME} (- .*)\"/\\\fB${CMD_NAME}\\\fP \1/g
|
||||
}"
|
||||
mv "${CMD_NAME}.1.tmp" "${CMD_NAME}.1"
|
||||
done
|
||||
|
||||
# Erase condemned pages
|
||||
rm -f $CONDEMNED_PAGES
|
||||
fi
|
||||
|
||||
# Destroy TMPLOC
|
||||
if test "$RESULT" -ne 0; then
|
||||
echo "Cleaning up '$TMPLOC'"
|
||||
fi
|
||||
rm -Rf "$TMPLOC"
|
||||
|
||||
if test "$RESULT" -ne 0; then
|
||||
tput smso 2> /dev/null || true
|
||||
echo "Doxygen failed creating manpages. See the output log for details."
|
||||
tput sgr0 2> /dev/null || true
|
||||
else
|
||||
tput bold 2> /dev/null || true
|
||||
echo Built manpages
|
||||
tput sgr0 2> /dev/null || true
|
||||
fi
|
||||
exit $RESULT
|
||||
5
build_tools/build_index_hdr.sh
Executable file
5
build_tools/build_index_hdr.sh
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
TOC_TXT=$1
|
||||
env awk "{if (\$0 ~ /@toc@/){ system(\"cat ${TOC_TXT}\");} else{ print \$0;}}"
|
||||
|
||||
51
build_tools/build_lexicon_filter.sh
Executable file
51
build_tools/build_lexicon_filter.sh
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Builds the lexicon filter
|
||||
# Usage: build_lexicon_filter.sh FUNCTIONS_DIR COMPLETIONS_DIR lexicon_filter.in [SED_BINARY] > lexicon_filter
|
||||
|
||||
set -e
|
||||
|
||||
# To enable the lexicon filter, we first need to be aware of what fish
|
||||
# considers to be a command, function, or external binary. We use
|
||||
# command_list_toc.txt for the base commands. Scan the share/functions
|
||||
# directory for other functions, some of which are mentioned in the docs, and
|
||||
# use /share/completions to find a good selection of binaries. Additionally,
|
||||
# colour defaults from __fish_config_interactive to set the docs colours when
|
||||
# used in a 'cli' style context.
|
||||
rm -f lexicon.tmp lexicon_catalog.tmp lexicon_catalog.txt lexicon.txt
|
||||
|
||||
FUNCTIONS_DIR=${1}
|
||||
FUNCTIONS_DIR_FILES=${1}/*.fish
|
||||
COMPLETIONS_DIR_FILES=${2}/*.fish
|
||||
LEXICON_FILTER_IN=${3}
|
||||
|
||||
SED=${4:-$(command -v sed)}
|
||||
|
||||
# Scan sources for commands/functions/binaries/colours. If GNU sed was portable, this could be much smarter.
|
||||
$SED <command_list_toc.txt >>lexicon.tmp -n \
|
||||
-e "s|^.*>\([a-z][a-z_]*\)</a>|'\1'|w lexicon_catalog.tmp" \
|
||||
-e "s|'\(.*\)'|bltn \1|p"; mv lexicon_catalog.tmp lexicon_catalog.txt
|
||||
printf "%s\n" ${COMPLETIONS_DIR_FILES} | $SED -n \
|
||||
-e "s|[^ ]*/\([a-z][a-z_-]*\).fish|'\1'|p" | grep -F -vx -f lexicon_catalog.txt | $SED >>lexicon.tmp -n \
|
||||
-e 'w lexicon_catalog.tmp' \
|
||||
-e "s|'\(.*\)'|cmnd \1|p"; cat lexicon_catalog.tmp >> lexicon_catalog.txt;
|
||||
printf "%s\n" ${FUNCTIONS_DIR_FILES} | $SED -n \
|
||||
-e "s|[^ ]*/\([a-z][a-z_-]*\).fish|'\1'|p" | grep -F -vx -f lexicon_catalog.txt | $SED >>lexicon.tmp -n \
|
||||
-e 'w lexicon_catalog.tmp' \
|
||||
-e "s|'\(.*\)'|func \1|p";
|
||||
$SED < ${FUNCTIONS_DIR}/__fish_config_interactive.fish >>lexicon.tmp -n \
|
||||
-e '/set_default/s/.*\(fish_[a-z][a-z_]*\).*$$/clrv \1/p'; \
|
||||
$SED < ${LEXICON_FILTER_IN} >>lexicon.tmp -n \
|
||||
-e '/^#.!#/s/^#.!# \(.... [a-z][a-z_]*\)/\1/p';
|
||||
mv lexicon.tmp lexicon.txt; rm -f lexicon_catalog.tmp lexicon_catalog.txt;
|
||||
|
||||
# Copy the filter to stdout. We're going to append sed commands to it after.
|
||||
$SED -e 's|@sed@|'$SED'|' < ${LEXICON_FILTER_IN}
|
||||
|
||||
# Scan through the lexicon, transforming each line to something useful to Doxygen.
|
||||
if echo x | $SED "/[[:<:]]x/d" 2>/dev/null; then
|
||||
WORDBL='[[:<:]]'; WORDBR='[[:>:]]';
|
||||
else
|
||||
WORDBL='\\<'; WORDBR='\\>';
|
||||
fi;
|
||||
$SED < lexicon.txt -n -e "s|^\([a-z][a-z][a-z][a-z]\) \([a-z_-]*\)$|s,$WORDBL\2$WORDBR,@\1{\2},g|p" -e '$G;s/.*\n/b tidy/p';
|
||||
17
build_tools/build_toc_txt.sh
Executable file
17
build_tools/build_toc_txt.sh
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Usage: build_toc_txt.sh $(HDR_FILES:index.hdr=index.hdr.in) > toc.txt
|
||||
|
||||
# Ugly hack to set the toc initial title for the main page
|
||||
echo "- <a href=\"index.html\" id=\"toc-index\">fish shell documentation - ${FISH_BUILD_VERSION}</a>" > toc.txt
|
||||
# The first sed command captures the page name, followed by the description
|
||||
# The second sed command captures the command name \1 and the description \2, but only up to a dash
|
||||
# This is to reduce the size of the TOC in the command listing on the main page
|
||||
for i in $@; do
|
||||
NAME=`basename $i .hdr`
|
||||
NAME=`basename $NAME .hdr.in`
|
||||
env sed <$i >>toc.txt -n \
|
||||
-e 's,.*\\page *\([^ ]*\) *\(.*\)$,- <a href="'$NAME'.html" id="toc-'$NAME'">\2</a>,p' \
|
||||
-e 's,.*\\section *\([^ ]*\) *\(.*\) - .*$, - <a href="'$NAME'.html#\1">\2</a>,p' \
|
||||
-e 's,.*\\section *\([^ ]*\) *\(.*\)$, - <a href="'$NAME'.html#\1">\2</a>,p'
|
||||
done
|
||||
16
build_tools/build_user_doc.sh
Executable file
16
build_tools/build_user_doc.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Usage: Doxyfile.user lexicon_filter
|
||||
DOXYFILE=$1
|
||||
LEXICON_FILTER=$2
|
||||
|
||||
(cat "${DOXYFILE}" ;\
|
||||
echo INPUT_FILTER="${LEXICON_FILTER}"; \
|
||||
echo PROJECT_NUMBER=${FISH_BUILD_VERSION} \
|
||||
| /usr/bin/env sed "s/-[a-z0-9-]*//") \
|
||||
| doxygen - && touch user_doc
|
||||
|
||||
(cd ./user_doc/html/ && \
|
||||
rm -f bc_s.png bdwn.png closed.png doc.png folder*.png ftv2*.png \
|
||||
nav*.png open.png splitbar.png sync_*.png tab*.* doxygen.* \
|
||||
dynsections.js jquery.js pages.html)
|
||||
3
build_tools/cppcheck.sh
Executable file
3
build_tools/cppcheck.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/usr/local/bin/fish
|
||||
|
||||
cppcheck --enable=all --std=posix --quiet ./src/
|
||||
@@ -1,3 +0,0 @@
|
||||
This is the_ridiculous'fish s delightful fork of, fish friendly interactive shell. For more information, visit http://ridiculousfish.com/shell/ .
|
||||
|
||||
This installer will install fish, but will not modify your /etc/shells file or your default shell. I trust you know how to do that yourself if you care to!
|
||||
46
build_tools/diff_profiles.fish
Normal file
46
build_tools/diff_profiles.fish
Normal file
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env fish
|
||||
#
|
||||
# Compares the output of two fish profile runs and emits the time difference between
|
||||
# the first and second set of results.
|
||||
#
|
||||
# Usage: ./diff_profiles.fish profile1.log profile2.log > profile_diff.log
|
||||
|
||||
set profile1 (cat $argv[1])
|
||||
set profile2 (cat $argv[2])
|
||||
|
||||
set line_no 0
|
||||
while set next_line_no (math $line_no + 1) && set -q profile1[$next_line_no] && set -q profile2[$next_line_no]
|
||||
set line_no $next_line_no
|
||||
|
||||
set line1 $profile1[$line_no]
|
||||
set line2 $profile2[$line_no]
|
||||
|
||||
if not string match -qr '^\d+\t\d+' $line1
|
||||
echo $line1
|
||||
continue
|
||||
end
|
||||
|
||||
set results1 (string match -r '^(\d+)\t(\d+)\s+(.*)' $line1)
|
||||
set results2 (string match -r '^(\d+)\t(\d+)\s+(.*)' $line2)
|
||||
|
||||
# times from both files
|
||||
set time1 $results1[2..3]
|
||||
set time2 $results2[2..3]
|
||||
|
||||
# leftover from both files
|
||||
set remainder1 $results1[4]
|
||||
set remainder2 $results2[4]
|
||||
|
||||
if not string match -q -- $remainder1 $remainder2
|
||||
echo Mismatch on line $line_no:
|
||||
echo - $remainder1
|
||||
echo + $remainder2
|
||||
exit 1
|
||||
end
|
||||
|
||||
set -l diff
|
||||
set diff[1] (math $time1[1] - $time2[1])
|
||||
set diff[2] (math $time1[2] - $time2[2])
|
||||
|
||||
echo $diff[1] $diff[2] $remainder1
|
||||
end
|
||||
43
build_tools/find_globals.fish
Executable file
43
build_tools/find_globals.fish
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env fish
|
||||
|
||||
# Finds global variables by parsing the output of 'nm'
|
||||
# for object files in this directory.
|
||||
# This was written for macOS nm.
|
||||
|
||||
set total_globals 0
|
||||
set boring_files \
|
||||
fish_key_reader.cpp.o \
|
||||
fish_tests.cpp.o \
|
||||
fish_indent.cpp.o \
|
||||
|
||||
|
||||
set whitelist \
|
||||
termsize_lock termsize \
|
||||
initial_pid initial_fg_process_group \
|
||||
_debug_level \
|
||||
sitm_esc ritm_esc dim_esc \
|
||||
iothread_init()::inited \
|
||||
s_result_queue s_main_thread_request_queue s_read_pipe s_write_pipe \
|
||||
s_main_thread_performer_lock s_main_thread_performer_cond s_main_thread_request_q_lock \
|
||||
locked_consumed_job_ids \
|
||||
env_initialized \
|
||||
|
||||
|
||||
for file in ./**.o
|
||||
set filename (basename $file)
|
||||
# Skip boring files.
|
||||
contains $filename $boring_files
|
||||
and continue
|
||||
for line in (nm -p -P -U $file)
|
||||
# Look in data (dD) and bss (bB) segments.
|
||||
set matches (string match --regex '^([^ ]+) ([dDbB])' -- $line)
|
||||
or continue
|
||||
set symname (echo $matches[2] | c++filt)
|
||||
contains $symname $whitelist
|
||||
and continue
|
||||
echo $filename $symname $matches[3]
|
||||
set total_globals (math $total_globals + 1)
|
||||
end
|
||||
end
|
||||
|
||||
echo "Total: $total_globals"
|
||||
@@ -1 +0,0 @@
|
||||
<pkg-contents spec="1.12"/>
|
||||
@@ -1 +0,0 @@
|
||||
<pkgref spec="1.12" uuid="6A7E1ED5-E40E-4ACE-959B-B9D77555AD39"><config><identifier>com.ridiculousfish.fish-shell.fishShell.fish_pkg.pkg</identifier><version>1.0</version><description></description><post-install type="none"/><requireAuthorization/><installFrom>/private/tmp/fish_pkg</installFrom><installTo>/</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>parent</mod><mod>installTo</mod></config></pkgref>
|
||||
@@ -1,40 +0,0 @@
|
||||
<pkmkdoc spec="1.12"><properties><title>fish shell</title><organization>com.ridiculousfish.fish-shell</organization><userSees ui="easy"/><min-target os="3"/><domain anywhere="true"/></properties><distribution><versions min-spec="1.000000"/><scripts></scripts></distribution><contents><choice title="fish_pkg" id="fish shell" starts_selected="true" starts_enabled="true" starts_hidden="false"><pkgref id="com.ridiculousfish.fish-shell.fishShell.fish_pkg.pkg"/></choice></contents><resources bg-scale="proportional" bg-align="bottomleft"><locale lang="en"><resource mod="true" type="background">/Users/peter/Desktop/Untitled.pdf</resource><resource mime-type="text/rtf" kind="embedded" type="welcome"><![CDATA[{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
|
||||
|
||||
\f0\fs30 \cf0 This installs ridiculous_fish's fork of fish, a command line shell for Mac OS X, Linux, and the rest of the family. For more information on fish, visit {\field{\*\fldinst{HYPERLINK "http://ridiculousfish.com/shell/"}}{\fldrslt http://ridiculousfish.com/shell/}}\
|
||||
\
|
||||
The path to fish will be added to /etc/shells, but your default shell will not be modified. \
|
||||
\
|
||||
This release is beta r2.\
|
||||
}]]></resource><resource mime-type="text/rtf" kind="embedded" type="conclusion"><![CDATA[{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 Monaco;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
|
||||
|
||||
\f0\fs26 \cf0 Run
|
||||
\f1 fish
|
||||
\f0 at the command line to start it up! Some useful commands:\
|
||||
\
|
||||
Interactively set your colors from a web page:\
|
||||
\
|
||||
|
||||
\f1 fish_config
|
||||
\f0 \
|
||||
\
|
||||
Update man-page completions:\
|
||||
\
|
||||
|
||||
\f1 fish_update_completions
|
||||
\f0 \
|
||||
\
|
||||
Make fish your default shell:\
|
||||
\
|
||||
|
||||
\f1 chsh -s /usr/local/bin/fish\
|
||||
|
||||
\f0 \
|
||||
\
|
||||
Enjoy!\
|
||||
}]]></resource></locale></resources><flags/><item type="file">01fish.xml</item><mod>properties.title</mod><mod>description</mod></pkmkdoc>
|
||||
42
build_tools/fish_xgettext.fish
Executable file
42
build_tools/fish_xgettext.fish
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env fish
|
||||
#
|
||||
# This script was originally motivated to work around a quirk (or bug depending on your viewpoint)
|
||||
# of the xgettext command. See https://lists.gnu.org/archive/html/bug-gettext/2014-11/msg00006.html.
|
||||
# However, it turns out that even if that quirk did not exist we would still need something like
|
||||
# this script to properly extract descriptions. That's because we need to normalize the strings to
|
||||
# a format that xgettext will handle correctly. Also, `xgettext -LShell` doesn't correctly extract
|
||||
# all the strings we want translated. So we extract and normalize all such strings into a format
|
||||
# that `xgettext` can handle.
|
||||
|
||||
# This regex handles descriptions for `complete` and `function` statements. These messages are not
|
||||
# particularly important to translate. Hence the "implicit" label.
|
||||
set implicit_regex '(?:^| +)(?:complete|function) .*? (?:-d|--description) (([\'"]).+?(?<!\\\\)\\2).*'
|
||||
|
||||
# This regex handles explicit requests to translate a message. These are more important to translate
|
||||
# than messages which should be implicitly translated.
|
||||
set explicit_regex '.*\( *_ (([\'"]).+?(?<!\\\\)\\2) *\).*'
|
||||
|
||||
mkdir -p /tmp/fish/implicit/share/completions /tmp/fish/implicit/share/functions
|
||||
mkdir -p /tmp/fish/explicit/share/completions /tmp/fish/explicit/share/functions
|
||||
|
||||
for f in share/config.fish share/completions/*.fish share/functions/*.fish
|
||||
# Extract explicit attempts to translate a message. That is, those that are of the form
|
||||
# `(_ "message")`.
|
||||
string replace --filter --regex $explicit_regex 'echo $1' <$f | fish >/tmp/fish/explicit/$f.tmp ^/dev/null
|
||||
while read description
|
||||
echo 'N_ "'(string replace --all '"' '\\"' -- $description)'"'
|
||||
end </tmp/fish/explicit/$f.tmp >/tmp/fish/explicit/$f
|
||||
rm /tmp/fish/explicit/$f.tmp
|
||||
|
||||
# Handle `complete` / `function` description messages. The `| fish` is subtle. It basically
|
||||
# avoids the need to use `source` with a command substituion that could affect the current
|
||||
# shell.
|
||||
string replace --filter --regex $implicit_regex 'echo $1' <$f | fish >/tmp/fish/implicit/$f.tmp ^/dev/null
|
||||
while read description
|
||||
# We don't use `string escape` as shown in the next comment because it produces output that
|
||||
# is not parsed correctly by xgettext. Instead just escape double-quotes and quote the
|
||||
# resulting string.
|
||||
echo 'N_ "'(string replace --all '"' '\\"' -- $description)'"'
|
||||
end </tmp/fish/implicit/$f.tmp >/tmp/fish/implicit/$f
|
||||
rm /tmp/fish/implicit/$f.tmp
|
||||
end
|
||||
42
build_tools/git_version_gen.sh
Executable file
42
build_tools/git_version_gen.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env sh
|
||||
# Originally from the git sources (GIT-VERSION-GEN)
|
||||
# Presumably (C) Junio C Hamano <junkio@cox.net>
|
||||
# Reused under GPL v2.0
|
||||
# Modified for fish by David Adam <zanchey@ucc.gu.uwa.edu.au>
|
||||
|
||||
set -e
|
||||
|
||||
# Find the fish git directory as two levels up from script directory.
|
||||
GIT_DIR="$( cd "$( dirname $( dirname "$0" ) )" && pwd )"
|
||||
|
||||
# Set the output directory as either the first param or cwd.
|
||||
test -n "$1" && OUTPUT_DIR=$1/ || OUTPUT_DIR=
|
||||
FBVF=${OUTPUT_DIR}FISH-BUILD-VERSION-FILE
|
||||
DEF_VER=unknown
|
||||
|
||||
# First see if there is a version file (included in release tarballs),
|
||||
# then try git-describe, then default.
|
||||
if test -f version
|
||||
then
|
||||
VN=$(cat version) || VN="$DEF_VER"
|
||||
elif ! VN=$(git -C "$GIT_DIR" describe --always --dirty 2>/dev/null); then
|
||||
VN="$DEF_VER"
|
||||
fi
|
||||
|
||||
if test -r $FBVF
|
||||
then
|
||||
VC=$(grep -v '^#' $FBVF | tr -d '"' | sed -e 's/^FISH_BUILD_VERSION=//')
|
||||
else
|
||||
VC=unset
|
||||
fi
|
||||
|
||||
# Maybe output the FBVF
|
||||
# It looks like FISH_BUILD_VERSION="2.7.1-621-ga2f065e6"
|
||||
test "$VN" = "$VC" || {
|
||||
echo >&2 "FISH_BUILD_VERSION=$VN"
|
||||
echo "FISH_BUILD_VERSION=\"$VN\"" >${FBVF}
|
||||
}
|
||||
|
||||
# Output the fish-build-version-witness.txt
|
||||
# See https://cmake.org/cmake/help/v3.4/policy/CMP0058.html
|
||||
date +%s > ${OUTPUT_DIR}fish-build-version-witness.txt
|
||||
28
build_tools/iwyu.linux.imp
Normal file
28
build_tools/iwyu.linux.imp
Normal file
@@ -0,0 +1,28 @@
|
||||
# Map file for the include-what-you-use tool on Linux.
|
||||
[
|
||||
{ include: ["<bits/fcntl-linux.h>", "private", "<fcntl.h>", "public"] },
|
||||
{ include: ["<bits/mman-linux.h>", "private", "<sys/mman.h>", "public"] },
|
||||
{ include: ["<bits/socket-linux.h>", "private", "<sys/socket.h>", "public"] },
|
||||
{ include: ["<bits/socket_type.h>", "private", "<sys/socket.h>", "public"] },
|
||||
{ include: ["<bits/local_lim.h>", "private", "<limits.h>", "public"] },
|
||||
{ include: ["<tr1/memory>", "public", "<memory>", "public"] },
|
||||
{ include: ["<features.h>", "public", "<stdio.h>", "public"] },
|
||||
{ include: ["<features.h>", "public", "<stddef.h>", "public"] },
|
||||
{ include: ["<features.h>", "public", "<unistd.h>", "public"] },
|
||||
|
||||
{ symbol: ["size_t", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["size_t", "private", "<stddef.h>", "public"] },
|
||||
{ symbol: ["size_t", "private", "<stdlib.h>", "public"] },
|
||||
{ symbol: ["intmax_t", "private", "<sys/stdint.h>", "public"] },
|
||||
{ symbol: ["intmax_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["uint32_t", "private", "<sys/stdint.h>", "public"] },
|
||||
{ symbol: ["uint32_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["uint64_t", "private", "<sys/stdint.h>", "public"] },
|
||||
{ symbol: ["uint64_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["uintmax_t", "private", "<sys/stdint.h>", "public"] },
|
||||
{ symbol: ["uintmax_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["clock_gettime", "private", "<sys/time.h>", "public"] },
|
||||
{ symbol: ["timespec", "private", "<sys/time.h>", "public"] },
|
||||
{ symbol: ["memset", "private", "<string.h>", "public"] },
|
||||
{ symbol: ["strerror", "private", "<string.h>", "public"] },
|
||||
]
|
||||
109
build_tools/iwyu.osx.imp
Normal file
109
build_tools/iwyu.osx.imp
Normal file
@@ -0,0 +1,109 @@
|
||||
# Map file for the include-what-you-use tool on OS X. For some reason
|
||||
# the version installed by HomeBrew doesn't have useful mappings for the
|
||||
# system provided headers. This also has mappings for FreeBSD.
|
||||
[
|
||||
{ include: ["<sys/_pthread/_pthread_once_t.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_pthread/_pthread_mutex_t.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_pthread/_pthread_rwlock_t.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_pthread/_pthread_mutexattr_t.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_pthread/_pthread_cond_t.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_pthread/_pthread_t.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_pthread/_pthread_key_t.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_pthreadtypes.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_types/_posix_vdisable.h>", "private", "<pthread.h>", "public"] },
|
||||
{ include: ["<sys/_types/_time_t.h>", "private", "<time.h>", "public"] },
|
||||
{ include: ["<sys/_types/_suseconds_t.h>", "private", "<time.h>", "public"] },
|
||||
{ include: ["<sys/_types/_suseconds_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/errno.h>", "private", "<errno.h>", "public"] },
|
||||
{ include: ["<sys/unistd.h>", "private", "<unistd.h>", "public"] },
|
||||
{ include: ["<_wctype.h>", "private", "<wctype.h>", "public"] },
|
||||
{ include: ["<sys/fcntl.h>", "private", "<fcntl.h>", "public"] },
|
||||
{ include: ["<sys/_types/_seek_set.h>", "private", "<fcntl.h>", "public"] },
|
||||
{ include: ["<sys/_types/_mbstate_t.h>", "private", "<wchar.h>", "public"] },
|
||||
{ include: ["<iosfwd>", "private", "<string>", "public"] },
|
||||
{ include: ["<sys/_stdint.h>", "private", "<stdint.h>", "public"] },
|
||||
{ include: ["<sys/_types/_s_ifmt.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_size_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_size_t.h>", "private", "<stdlib.h>", "public"] },
|
||||
{ include: ["<sys/_types/_mode_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_pid_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_fd_def.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_fd_isset.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_fd_set.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_fd_zero.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_timeval.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_uid_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<_types/_intmax_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<_types/_uintmax_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<_types/_uint8_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_int32_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<_types/_uint64_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_uintptr_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_dev_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_ino_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_va_list.h>", "private", "<stdio.h>", "public"] },
|
||||
{ include: ["<__functional_base>", "private", "<memory>", "public"] },
|
||||
{ include: ["<__functional_base>", "private", "<vector>", "public"] },
|
||||
{ include: ["<__functional_base>", "private", "<string>", "public"] },
|
||||
{ include: ["<__tree>", "private", "<map>", "public"] },
|
||||
{ include: ["<__tree>", "private", "<set>", "public"] },
|
||||
{ include: ["<_types/_uint32_t.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_va_list.h>", "private", "<sys/types.h>", "public"] },
|
||||
{ include: ["<sys/_types/_sigset_t.h>", "private", "<signal.h>", "public"] },
|
||||
{ include: ["<sys/signal.h>", "private", "<signal.h>", "public"] },
|
||||
{ include: ["<strings.h>", "private", "<string.h>", "public"] },
|
||||
{ include: ["<sys/termios.h>", "private", "<termios.h>", "public"] },
|
||||
{ include: ["<sys/_termios.h>", "private", "<termios.h>", "public"] },
|
||||
{ include: ["<sys/ttycom.h>", "private", "<termios.h>", "public"] },
|
||||
{ include: ["<sys/syslimits.h>", "private", "<limits.h>", "public"] },
|
||||
{ include: ["<i386/limits.h>", "private", "<limits.h>", "public"] },
|
||||
{ include: ["<sys/limits.h>", "private", "<limits.h>", "public"] },
|
||||
{ include: ["<sys/_types/_wint_t.h>", "private", "<stddef.h>", "public"] },
|
||||
{ include: ["<sys/_select.h>", "private", "<select.h>", "public"] },
|
||||
{ include: ["<sys/cdefs.h>", "private", "<unistd.h>", "public"] },
|
||||
{ include: ["<istream>", "private", "<iostream>", "public"] },
|
||||
{ include: ["<sys/_endian.h>", "private", "<netinet/in.h>", "public"] },
|
||||
{ include: ["<sys/_types/_timespec.h>", "private", "<time.h>", "public"] },
|
||||
{ include: ["<sys/_timespec.h>", "private", "<time.h>", "public"] },
|
||||
{ include: ["<sys/spawn.h>", "private", "<spawn.h>", "public"] },
|
||||
{ include: ["<sys/dirent.h>", "private", "<dirent.h>", "public"] },
|
||||
{ include: ["<__mutex_base>", "private", "<mutex>", "public"] },
|
||||
{ include: ["<__hash_table>", "private", "<unordered_map>", "public"] },
|
||||
{ include: ["<__hash_table>", "private", "<unordered_set>", "public"] },
|
||||
# { include: ["<>", "private", "<>", "public"] },
|
||||
|
||||
{ symbol: ["size_t", "private", "<cstddef>", "public"] },
|
||||
{ symbol: ["mutex", "private", "<mutex>", "public"] },
|
||||
{ symbol: ["sig_atomic_t", "private", "<csignal>", "public"] },
|
||||
{ symbol: ["va_end", "private", "<stdarg.h>", "public"] },
|
||||
{ symbol: ["va_list", "private", "<stdarg.h>", "public"] },
|
||||
{ symbol: ["va_start", "private", "<stdarg.h>", "public"] },
|
||||
{ symbol: ["NULL", "private", "<stddef.h>", "public"] },
|
||||
{ symbol: ["NULL", "private", "<stdlib.h>", "public"] },
|
||||
{ symbol: ["NULL", "private", "<stdio.h>", "public"] },
|
||||
{ symbol: ["NULL", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["off_t", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["off_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["size_t", "private", "<stddef.h>", "public"] },
|
||||
{ symbol: ["ssize_t", "private", "<stddef.h>", "public"] },
|
||||
{ symbol: ["intptr_t", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["gid_t", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["uid_t", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["pid_t", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["pid_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["uid_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["gid_t", "private", "<sys/types.h>", "public"] },
|
||||
{ symbol: ["timeval", "private", "<sys/time.h>", "public"] },
|
||||
{ symbol: ["__uint32_t", "private", "<stdint.h>", "public"] },
|
||||
{ symbol: ["uint32_t", "private", "<stdint.h>", "public"] },
|
||||
{ symbol: ["intptr_t", "private", "<stdint.h>", "public"] },
|
||||
{ symbol: ["tparm", "private", "<ncurses.h>", "public"] },
|
||||
{ symbol: ["tigetflag", "private", "<ncurses.h>", "public"] },
|
||||
{ symbol: ["ERR", "private", "<ncurses.h>", "public"] },
|
||||
{ symbol: ["OK", "private", "<ncurses.h>", "public"] },
|
||||
{ symbol: ["select", "private", "<sys/select.h>", "public"] },
|
||||
{ symbol: ["_LIBCPP_VERSION", "private", "<stddef.h>", "public"] },
|
||||
{ symbol: ["_LIBCPP_VERSION", "private", "<unistd.h>", "public"] },
|
||||
{ symbol: ["MB_CUR_MAX", "private", "<xlocale.h>", "public"] },
|
||||
{ symbol: ["MB_CUR_MAX", "private", "<stdlib.h>", "public"] },
|
||||
]
|
||||
156
build_tools/lint.fish
Executable file
156
build_tools/lint.fish
Executable file
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/env fish
|
||||
#
|
||||
# This is meant to be run by "make lint" or "make lint-all". It is not meant to
|
||||
# be run directly from a shell prompt.
|
||||
#
|
||||
set cppchecks warning,performance,portability,information,missingInclude
|
||||
set cppcheck_args
|
||||
set c_files
|
||||
set all no
|
||||
set kernel_name (uname -s)
|
||||
set machine_type (uname -m)
|
||||
|
||||
set -gx CXX $argv[1]
|
||||
set -e argv[1]
|
||||
|
||||
if test "$argv[1]" = "--all"
|
||||
set all yes
|
||||
set cppchecks "$cppchecks,unusedFunction"
|
||||
set -e argv[1]
|
||||
end
|
||||
|
||||
if test $kernel_name = Linux
|
||||
# This is an awful hack. However, the include-what-you-use program spews lots of errors like
|
||||
# /usr/include/unistd.h:226:10: fatal error: 'stddef.h' file not found
|
||||
# if we don't explicitly tell it where to find the system headers on Linux. See
|
||||
# http://stackoverflow.com/questions/19642590/libtooling-cant-find-stddef-h-nor-other-headers/
|
||||
set -l sys_includes (eval $CXX -v -c src/builtin.cpp 2>&1 | \
|
||||
sed -n -e '/^#include <...> search/,/^End of search list/s/^ *//p')[2..-2]
|
||||
set -x CPLUS_INCLUDE_PATH (string join ':' $sys_includes)
|
||||
end
|
||||
|
||||
# We only want -D and -I options to be passed thru to cppcheck.
|
||||
for arg in $argv
|
||||
if string match -q -- '-D*' $arg
|
||||
set cppcheck_args $cppcheck_args $arg
|
||||
else if string match -q -- '-I*' $arg
|
||||
set cppcheck_args $cppcheck_args $arg
|
||||
else if string match -q -- '-iquote*' $arg
|
||||
set cppcheck_args $cppcheck_args $arg
|
||||
end
|
||||
end
|
||||
|
||||
# Not sure when this became necessary but without these flags cppcheck no longer works on macOS.
|
||||
# It complains that "Cppcheck cannot find all the include files." Adding these include paths should
|
||||
# be harmless everywhere else.
|
||||
set cppcheck_args $cppcheck_args -I /usr/include -I .
|
||||
|
||||
if test "$machine_type" = "x86_64"
|
||||
set cppcheck_args -D__x86_64__ -D__LP64__ $cppcheck_args
|
||||
end
|
||||
|
||||
if test $all = yes
|
||||
set c_files src/*.cpp
|
||||
else
|
||||
# We haven't been asked to lint all the source. If there are uncommitted
|
||||
# changes lint those, else lint the files in the most recent commit.
|
||||
# Select (cached files) (modified but not cached, and untracked files)
|
||||
set files (git diff-index --cached HEAD --name-only)
|
||||
set files $files (git ls-files --exclude-standard --others --modified)
|
||||
if not set -q files[1]
|
||||
# No pending changes so lint the files in the most recent commit.
|
||||
set files (git diff-tree --no-commit-id --name-only -r HEAD)
|
||||
end
|
||||
|
||||
# Extract just the C/C++ files that exist.
|
||||
set c_files
|
||||
for file in (string match -r '.*\.c(?:pp)?$' -- $files)
|
||||
test -f $file; and set c_files $c_files $file
|
||||
end
|
||||
end
|
||||
|
||||
# We now have a list of files to check so run the linters.
|
||||
if set -q c_files[1]
|
||||
if type -q include-what-you-use
|
||||
echo
|
||||
echo ========================================
|
||||
echo Running IWYU
|
||||
echo ========================================
|
||||
for c_file in $c_files
|
||||
switch $kernel_name
|
||||
case Darwin FreeBSD
|
||||
include-what-you-use -Xiwyu --no_default_mappings -Xiwyu \
|
||||
--mapping_file=build_tools/iwyu.osx.imp --std=c++11 \
|
||||
$cppcheck_args $c_file 2>&1
|
||||
case Linux
|
||||
include-what-you-use -Xiwyu --mapping_file=build_tools/iwyu.linux.imp \
|
||||
$cppcheck_args $c_file 2>&1
|
||||
case '*' # hope for the best
|
||||
include-what-you-use --std=c++11 $cppcheck_args $c_file 2>&1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if type -q cppcheck
|
||||
echo
|
||||
echo ========================================
|
||||
echo Running cppcheck
|
||||
echo ========================================
|
||||
# The stderr to stdout redirection is because cppcheck, incorrectly IMHO, writes its
|
||||
# diagnostic messages to stderr. Anyone running this who wants to capture its output will
|
||||
# expect those messages to be written to stdout.
|
||||
set -l cn (set_color normal)
|
||||
set -l cb (set_color --bold)
|
||||
set -l cu (set_color --underline)
|
||||
set -l cm (set_color magenta)
|
||||
set -l cbrm (set_color brmagenta)
|
||||
set -l template "[$cb$cu{file}$cn$cb:{line}$cn] $cbrm{severity}$cm ({id}):$cn\n {message}"
|
||||
set cppcheck_args -q --verbose --std=c++11 --std=posix --language=c++ --template $template \
|
||||
--suppress=missingIncludeSystem --inline-suppr --enable=$cppchecks \
|
||||
--rule-file=.cppcheck.rules --suppressions-list=.cppcheck.suppressions $cppcheck_args
|
||||
|
||||
cppcheck $cppcheck_args $c_files 2>&1
|
||||
|
||||
echo
|
||||
echo ========================================
|
||||
echo 'Running `cppcheck --check-config` to identify missing includes and similar problems.'
|
||||
echo 'Ignore unmatchedSuppression warnings as they are probably false positives we'
|
||||
echo 'cannot suppress.'
|
||||
echo ========================================
|
||||
cppcheck $cppcheck_args --check-config $c_files 2>&1
|
||||
end
|
||||
|
||||
if type -q oclint
|
||||
echo
|
||||
echo ========================================
|
||||
echo Running oclint
|
||||
echo ========================================
|
||||
# The stderr to stdout redirection is because oclint, incorrectly writes its final summary
|
||||
# counts of the errors detected to stderr. Anyone running this who wants to capture its
|
||||
# output will expect those messages to be written to stdout.
|
||||
if test "$kernel_name" = "Darwin"
|
||||
if not test -f compile_commands.json
|
||||
xcodebuild -alltargets >xcodebuild.log
|
||||
oclint-xcodebuild xcodebuild.log >/dev/null
|
||||
end
|
||||
if test $all = yes
|
||||
oclint-json-compilation-database -e '/pcre2-10.22/' -- -enable-global-analysis 2>&1
|
||||
else
|
||||
set i_files
|
||||
for f in $c_files
|
||||
set i_files $i_files -i $f
|
||||
end
|
||||
echo oclint-json-compilation-database -e '/pcre2-10.22/' $i_files
|
||||
oclint-json-compilation-database -e '/pcre2-10.22/' $i_files 2>&1
|
||||
end
|
||||
else
|
||||
# Presumably we're on Linux or other platform not requiring special
|
||||
# handling for oclint to work.
|
||||
oclint $c_files -- $argv 2>&1
|
||||
end
|
||||
end
|
||||
else
|
||||
echo
|
||||
echo 'WARNING: No C/C++ files to check'
|
||||
echo
|
||||
end
|
||||
34
build_tools/list_committers_since.fish
Executable file
34
build_tools/list_committers_since.fish
Executable file
@@ -0,0 +1,34 @@
|
||||
#! /usr/bin/env fish
|
||||
|
||||
set TAG $argv[1]
|
||||
|
||||
if test -z "$TAG"
|
||||
echo "Tag name required."
|
||||
exit 1
|
||||
end
|
||||
|
||||
if not contains -- $TAG (git tag)
|
||||
echo "$TAG is not a valid tag name."
|
||||
exit 1
|
||||
end
|
||||
|
||||
set committers_to_tag (mktemp)
|
||||
set committers_from_tag (mktemp)
|
||||
|
||||
# You might think it would be better to case-insensitively sort/compare the names
|
||||
# to produce a more natural-looking list.
|
||||
# Unicode collation tables mean that this is fraught with danger; for example, the
|
||||
# "“" character will not case-fold in UTF-8 locales. sort suggests using the C locale!
|
||||
|
||||
git log "$TAG" --format="%aN" --reverse | sort -u > $committers_to_tag
|
||||
git log "$TAG".. --format="%aN" --reverse | sort -u > $committers_from_tag
|
||||
|
||||
echo New committers:
|
||||
echo (comm -13 $committers_to_tag $committers_from_tag)','
|
||||
|
||||
echo
|
||||
|
||||
echo Returning committers:
|
||||
echo (comm -12 $committers_to_tag $committers_from_tag)','
|
||||
|
||||
rm $committers_to_tag $committers_from_tag
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Terminate on error
|
||||
set -e
|
||||
|
||||
sudo rm -Rf /tmp/fishfish
|
||||
mkdir /tmp/fishfish
|
||||
git archive --format=tar fish_fish | tar -x -C /tmp/fishfish
|
||||
mkdir /tmp/fishfish/doc-pak
|
||||
cp README INSTALL CHANGELOG release_notes.html /tmp/fishfish/doc-pak/
|
||||
cp build_tools/description-pak /tmp/fishfish/
|
||||
cd /tmp/fishfish
|
||||
autoconf
|
||||
./configure
|
||||
make -j 3
|
||||
sudo checkinstall --default --pakdir ~/fish_built/ --pkgversion 0.9 make install
|
||||
mv ~/fish_built/fishfish_0.9-1_i386.deb ~/fish_built/fishfish_0.9_i386.deb
|
||||
|
||||
@@ -1,31 +1,41 @@
|
||||
#!/bin/sh -x
|
||||
#!/bin/sh
|
||||
|
||||
# Script to produce an OS X installer .pkg and .app(.zip)
|
||||
|
||||
VERSION=`git describe --always --dirty 2>/dev/null`
|
||||
if test -z "$VERSION" ; then
|
||||
echo "Could not get version from git"
|
||||
VERSION=`sed -E -n 's/^.*PACKAGE_VERSION "([0-9a-z.\-]+)"/\1/p' osx/config.h`
|
||||
if test -z "$VERSION"; then
|
||||
echo "Could not get version from osx/config.h"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Version is $VERSION"
|
||||
|
||||
set -x
|
||||
|
||||
make distclean
|
||||
rm -rf /tmp/fish_pkg
|
||||
mkdir -p /tmp/fish_pkg/
|
||||
|
||||
# Make sure what we build can run on SnowLeopard
|
||||
export OSX_SDK="/Developer/SDKs/MacOSX10.6.sdk"
|
||||
export MACOSX_DEPLOYMENT_TARGET="10.6"
|
||||
export CC="clang -isysroot $OSX_SDK -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
|
||||
export CCX="clang++ -isysroot $OSX_SDK -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
|
||||
export CFLAGS="$CFLAGS -isysroot $OSX_SDK -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
|
||||
export CXXFLAGS="$CXXFLAGS -isysroot $OSX_SDK -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
|
||||
export LDFLAGS="$LDFLAGS -isysroot $OSX_SDK -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
|
||||
autoconf
|
||||
./configure --without-xsel
|
||||
#Exit on error
|
||||
set -e
|
||||
|
||||
# Actually build it now
|
||||
if make -j 4 DESTDIR=/tmp/fish_pkg install
|
||||
then
|
||||
echo "Root written to /tmp/fish_pkg/"
|
||||
if /Developer/usr/bin/packagemaker --doc ./build_tools/fish_shell.pmdoc --out ~/fish_built/fishfish.pkg
|
||||
then
|
||||
echo "Package written to ~/fish_built/fishfish.pkg"
|
||||
else
|
||||
echo "Package could not be written"
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Root could not be written"
|
||||
fi
|
||||
PKGDIR=`mktemp -d`
|
||||
|
||||
OUTPUT_PATH=${FISH_ARTEFACT_PATH:-~/fish_built}
|
||||
|
||||
mkdir -p $PKGDIR/root $PKGDIR/intermediates $PKGDIR/dst
|
||||
xcodebuild install -scheme install_tree -configuration Release DSTROOT=$PKGDIR/root/
|
||||
pkgbuild --scripts build_tools/osx_package_scripts --root $PKGDIR/root/ --identifier 'com.ridiculousfish.fish-shell-pkg' --version "$VERSION" $PKGDIR/intermediates/fish.pkg
|
||||
|
||||
productbuild --package-path $PKGDIR/intermediates --distribution build_tools/osx_distribution.xml --resources build_tools/osx_package_resources/ $OUTPUT_PATH/fish-$VERSION.pkg
|
||||
|
||||
|
||||
# Make the app
|
||||
xcodebuild -scheme fish.app -configuration Release DSTROOT=/tmp/fish_app/ SYMROOT=DerivedData/fish/Build/Products
|
||||
|
||||
cd DerivedData/fish/Build/Products/Release/
|
||||
zip -r $OUTPUT_PATH/fish-$VERSION.app.zip fish.app
|
||||
|
||||
rm -r $PKGDIR
|
||||
|
||||
@@ -4,43 +4,74 @@
|
||||
# We use git to output a tree. But we also want to build the user documentation
|
||||
# and put that in the tarball, so that nobody needs to have doxygen installed
|
||||
# to build it.
|
||||
# Outputs to $FISH_ARTEFACT_PATH or ~/fish_built by default
|
||||
|
||||
# Exit on error
|
||||
set -e
|
||||
|
||||
# We wil generate a tarball with a prefix "fish"
|
||||
# We wil generate a tarball with a prefix "fish-VERSION"
|
||||
# git can do that automatically for us via git-archive
|
||||
# but to get the documentation in, we need to make a symlink called "fish"
|
||||
# but to get the documentation in, we need to make a symlink called "fish-VERSION"
|
||||
# and tar from that, so that the documentation gets the right prefix
|
||||
|
||||
# We need GNU tar as that supports the --mtime option
|
||||
# BSD tar supports --mtree but keeping them in sync sounds too hard
|
||||
TAR=notfound
|
||||
for try in tar gtar gnutar; do
|
||||
if $try -Pcf /dev/null --mtime now /dev/null >/dev/null 2>&1; then
|
||||
TAR=$try
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$TAR" = "notfound" ]; then
|
||||
echo 'No suitable tar (supporting --mtime) found as tar/gtar/gnutar in PATH'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get the current directory, which we'll use for symlinks
|
||||
wd="$PWD"
|
||||
|
||||
# Get the version from git-describe
|
||||
VERSION=`git describe --dirty 2>/dev/null`
|
||||
|
||||
# The name of the prefix, which is the directory that you get when you untar
|
||||
prefix="fish"
|
||||
prefix="fish-$VERSION"
|
||||
|
||||
# The path where we will output the tar file
|
||||
path=~/fish_built/fish-2.0.tar
|
||||
# Defaults to ~/fish_built
|
||||
path=${FISH_ARTEFACT_PATH:-~/fish_built}/$prefix.tar
|
||||
|
||||
# Clean up stuff we've written before
|
||||
rm -f "$path" "$path".gz
|
||||
|
||||
# git starts the archive
|
||||
git archive --format=tar --prefix="$prefix"/ master > "$path"
|
||||
git archive --format=tar --prefix="$prefix"/ HEAD > "$path"
|
||||
|
||||
# tarball out the documentation, generate a configure script and version file
|
||||
autoreconf --no-recursive
|
||||
./configure --with-doxygen
|
||||
make doc share/man
|
||||
echo $VERSION > version
|
||||
|
||||
PREFIX_TMPDIR=`mktemp -d`
|
||||
cd $PREFIX_TMPDIR
|
||||
|
||||
# tarball out the documentation
|
||||
make user_doc
|
||||
make share/man
|
||||
cd /tmp
|
||||
rm -f "$prefix"
|
||||
ln -s "$wd" "$prefix"
|
||||
tar --append --file="$path" "$prefix"/user_doc/html
|
||||
tar --append --file="$path" "$prefix"/share/man
|
||||
rm -f "$prefix"
|
||||
TAR_APPEND="$TAR --append --file=$path --mtime=now --owner=0 --group=0 --mode=g+w,a+rX"
|
||||
$TAR_APPEND --no-recursion "$prefix"/user_doc
|
||||
$TAR_APPEND "$prefix"/user_doc/html "$prefix"/share/man
|
||||
$TAR_APPEND "$prefix"/version
|
||||
$TAR_APPEND "$prefix"/configure "$prefix"/config.h.in
|
||||
rm "$prefix"/version
|
||||
unlink "$prefix"
|
||||
|
||||
cd -
|
||||
rmdir $PREFIX_TMPDIR
|
||||
|
||||
# gzip it
|
||||
gzip "$path"
|
||||
|
||||
# Output what we did, and the sha1 hash
|
||||
echo "Tarball written to $path".gz
|
||||
openssl sha1 "$path".gz
|
||||
openssl dgst -sha256 "$path".gz
|
||||
|
||||
18
build_tools/osx_distribution.xml
Normal file
18
build_tools/osx_distribution.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<installer-gui-script minSpecVersion="1">
|
||||
<title>fish shell</title>
|
||||
<welcome file="welcome.rtf"/>
|
||||
<background file="terminal_logo.png" scaling="proportional" alignment="bottomleft"/>
|
||||
<pkg-ref id="com.ridiculousfish.fish-shell-pkg"/>
|
||||
<options customize="never" require-scripts="false"/>
|
||||
<choices-outline>
|
||||
<line choice="default">
|
||||
<line choice="com.ridiculousfish.fish-shell-pkg"/>
|
||||
</line>
|
||||
</choices-outline>
|
||||
<choice id="default"/>
|
||||
<choice id="com.ridiculousfish.fish-shell-pkg" visible="false">
|
||||
<pkg-ref id="com.ridiculousfish.fish-shell-pkg"/>
|
||||
</choice>
|
||||
<pkg-ref id="com.ridiculousfish.fish-shell-pkg" version="0" onConclusion="none">fish.pkg</pkg-ref>
|
||||
</installer-gui-script>
|
||||
BIN
build_tools/osx_package_resources/terminal_logo.png
Normal file
BIN
build_tools/osx_package_resources/terminal_logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
26
build_tools/osx_package_resources/welcome.rtf
Normal file
26
build_tools/osx_package_resources/welcome.rtf
Normal file
@@ -0,0 +1,26 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1485\cocoasubrtf410
|
||||
{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;\f1\fnil\fcharset0 Menlo-Regular;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\expandedcolortbl;\csgenericrgb\c100000\c100000\c100000;}
|
||||
{\info
|
||||
{\author dlkfjslfjsfdlkfk}}\margl1440\margr1440\vieww10800\viewh8400\viewkind0
|
||||
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0
|
||||
|
||||
\f0\fs30 \cf0 Fish is a smart and user friendly command line shell. For more information, visit {\field{\*\fldinst{HYPERLINK "https://fishshell.com"}}{\fldrslt https://fishshell.com}}\
|
||||
\
|
||||
fish will be installed into
|
||||
\f1\fs26 /usr/local/
|
||||
\f0\fs30 , and fish will be added to
|
||||
\f1\fs26 /etc/shells
|
||||
\f0\fs30 if necessary.\
|
||||
\
|
||||
Your default shell will
|
||||
\i not
|
||||
\i0 be changed. To make fish your default, run:\
|
||||
\
|
||||
|
||||
\f1 chsh -s /usr/local/bin/fish
|
||||
\f0 \
|
||||
\
|
||||
Enjoy!\
|
||||
}
|
||||
115
build_tools/style.fish
Executable file
115
build_tools/style.fish
Executable file
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env fish
|
||||
#
|
||||
# This is meant to be run by "make style" or "make style-all". It is not meant to
|
||||
# be run directly from a shell prompt although it can be.
|
||||
#
|
||||
# This runs C++ files and fish scripts (*.fish) through their respective code
|
||||
# formatting programs.
|
||||
#
|
||||
set git_clang_format no
|
||||
set c_files
|
||||
set f_files
|
||||
set all no
|
||||
|
||||
if test "$argv[1]" = "--all"
|
||||
set all yes
|
||||
set -e argv[1]
|
||||
end
|
||||
|
||||
if set -q argv[1]
|
||||
echo "Unexpected arguments: '$argv'"
|
||||
exit 1
|
||||
end
|
||||
|
||||
if test $all = yes
|
||||
set files (git status --porcelain --short --untracked-files=all | sed -e 's/^ *[^ ]* *//')
|
||||
if set -q files[1]
|
||||
echo
|
||||
echo You have uncommited changes. Cowardly refusing to restyle the entire code base.
|
||||
echo
|
||||
exit 1
|
||||
end
|
||||
set c_files src/*.h src/*.cpp src/*.c
|
||||
# For now we don't restyle all fish scripts other than completion scripts. That's because people
|
||||
# really like to vertically align the elements of the `complete` command and fish_indent
|
||||
# currently does not honor that whitespace.
|
||||
set f_files (printf '%s\n' share/***.fish | grep -v /completions/)
|
||||
else
|
||||
# We haven't been asked to reformat all the source. If there are uncommitted changes reformat
|
||||
# those using `git clang-format`. Else reformat the files in the most recent commit.
|
||||
# Select (cached files) (modified but not cached, and untracked files)
|
||||
set files (git diff-index --cached HEAD --name-only) (git ls-files --exclude-standard --others --modified)
|
||||
if set -q files[1]
|
||||
set git_clang_format yes
|
||||
else
|
||||
# No pending changes so lint the files in the most recent commit.
|
||||
set files (git diff-tree --no-commit-id --name-only -r HEAD)
|
||||
end
|
||||
|
||||
# Extract just the C/C++ files that exist.
|
||||
set c_files
|
||||
for file in (string match -r '^.*\.(?:c|cpp|h)$' -- $files)
|
||||
test -f $file; and set c_files $c_files $file
|
||||
end
|
||||
# Extract just the fish files.
|
||||
set f_files (string match -r '^.*\.fish$' -- $files)
|
||||
end
|
||||
|
||||
# Run the C++ reformatter if we have any C++ files.
|
||||
if set -q c_files[1]
|
||||
if test $git_clang_format = yes
|
||||
if type -q git-clang-format
|
||||
echo
|
||||
echo ========================================
|
||||
echo Running git-clang-format
|
||||
echo ========================================
|
||||
git add $c_files
|
||||
git-clang-format
|
||||
else
|
||||
echo
|
||||
echo 'WARNING: Cannot find git-clang-format command'
|
||||
echo
|
||||
end
|
||||
else if type -q clang-format
|
||||
echo
|
||||
echo ========================================
|
||||
echo Running clang-format
|
||||
echo ========================================
|
||||
for file in $c_files
|
||||
cp $file $file.new # preserves mode bits
|
||||
clang-format $file >$file.new
|
||||
if cmp --quiet $file $file.new
|
||||
rm $file.new
|
||||
else
|
||||
echo $file was NOT correctly formatted
|
||||
mv $file.new $file
|
||||
end
|
||||
end
|
||||
else
|
||||
echo
|
||||
echo 'WARNING: Cannot find clang-format command'
|
||||
echo
|
||||
end
|
||||
end
|
||||
|
||||
# Run the fish reformatter if we have any fish files.
|
||||
if set -q f_files[1]
|
||||
if not type -q fish_indent
|
||||
make fish_indent
|
||||
set PATH . $PATH
|
||||
end
|
||||
echo
|
||||
echo ========================================
|
||||
echo Running fish_indent
|
||||
echo ========================================
|
||||
for file in $f_files
|
||||
cp $file $file.new # preserves mode bits
|
||||
fish_indent <$file >$file.new
|
||||
if cmp --quiet $file $file.new
|
||||
rm $file.new
|
||||
else
|
||||
echo $file was NOT correctly formatted
|
||||
mv $file.new $file
|
||||
end
|
||||
end
|
||||
end
|
||||
12
build_tools/xcode_version_gen.sh
Executable file
12
build_tools/xcode_version_gen.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
# Expects to be called from Xcode (Run Script build phase),
|
||||
# write version number C preprocessor macro to header file.
|
||||
|
||||
ver="$SCRIPT_OUTPUT_FILE_0"
|
||||
|
||||
./build_tools/git_version_gen.sh
|
||||
|
||||
cmp --quiet "FISH-BUILD-VERSION-FILE" "$ver"
|
||||
if [ $? -ne 0 ]; then
|
||||
/bin/cp FISH-BUILD-VERSION-FILE "$ver"
|
||||
fi
|
||||
4105
builtin.cpp
4105
builtin.cpp
File diff suppressed because it is too large
Load Diff
182
builtin.h
182
builtin.h
@@ -1,182 +0,0 @@
|
||||
/** \file builtin.h
|
||||
Prototypes for functions for executing builtin functions.
|
||||
*/
|
||||
|
||||
#ifndef FISH_BUILTIN_H
|
||||
#define FISH_BUILTIN_H
|
||||
|
||||
#include <wchar.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "io.h"
|
||||
#include "common.h"
|
||||
|
||||
class parser_t;
|
||||
|
||||
enum
|
||||
{
|
||||
COMMAND_NOT_BUILTIN,
|
||||
BUILTIN_REGULAR,
|
||||
BUILTIN_FUNCTION
|
||||
}
|
||||
;
|
||||
|
||||
/**
|
||||
Error message on missing argument
|
||||
*/
|
||||
#define BUILTIN_ERR_MISSING _( L"%ls: Expected argument\n" )
|
||||
|
||||
/**
|
||||
Error message on invalid combination of options
|
||||
*/
|
||||
#define BUILTIN_ERR_COMBO _( L"%ls: Invalid combination of options\n" )
|
||||
|
||||
/**
|
||||
Error message on invalid combination of options
|
||||
*/
|
||||
#define BUILTIN_ERR_COMBO2 _( L"%ls: Invalid combination of options,\n%ls\n" )
|
||||
|
||||
/**
|
||||
Error message on multiple scope levels for variables
|
||||
*/
|
||||
#define BUILTIN_ERR_GLOCAL _( L"%ls: Variable scope can only be one of universal, global and local\n" )
|
||||
|
||||
/**
|
||||
Error message for specifying both export and unexport to set/read
|
||||
*/
|
||||
#define BUILTIN_ERR_EXPUNEXP _( L"%ls: Variable can't be both exported and unexported\n" )
|
||||
|
||||
/**
|
||||
Error message for unknown switch
|
||||
*/
|
||||
#define BUILTIN_ERR_UNKNOWN _( L"%ls: Unknown option '%ls'\n" )
|
||||
|
||||
/**
|
||||
Error message for invalid character in variable name
|
||||
*/
|
||||
#define BUILTIN_ERR_VARCHAR _( L"%ls: Invalid character '%lc' in variable name. Only alphanumerical characters and underscores are valid in a variable name.\n" )
|
||||
|
||||
/**
|
||||
Error message for invalid (empty) variable name
|
||||
*/
|
||||
#define BUILTIN_ERR_VARNAME_ZERO _( L"%ls: Variable name can not be the empty string\n" )
|
||||
|
||||
/**
|
||||
Error message when second argument to for isn't 'in'
|
||||
*/
|
||||
#define BUILTIN_FOR_ERR_IN _( L"%ls: Second argument must be 'in'\n" )
|
||||
|
||||
/**
|
||||
Error message for insufficient number of arguments
|
||||
*/
|
||||
#define BUILTIN_FOR_ERR_COUNT _( L"%ls: Expected at least two arguments, got %d\n")
|
||||
|
||||
#define BUILTIN_FOR_ERR_NAME _( L"%ls: '%ls' is not a valid variable name\n" )
|
||||
|
||||
/** Error messages for 'else if' */
|
||||
#define BUILTIN_ELSEIF_ERR_COUNT _( L"%ls: can only take 'if' and then another command as an argument\n")
|
||||
#define BUILTIN_ELSEIF_ERR_ARGUMENT _( L"%ls: any second argument must be 'if'\n")
|
||||
|
||||
/**
|
||||
Error message when too many arguments are supplied to a builtin
|
||||
*/
|
||||
#define BUILTIN_ERR_TOO_MANY_ARGUMENTS _( L"%ls: Too many arguments\n" )
|
||||
|
||||
/**
|
||||
Error message when block types mismatch in the end builtin, e.g. 'begin; end for'
|
||||
*/
|
||||
#define BUILTIN_END_BLOCK_MISMATCH _( L"%ls: Block mismatch: '%ls' vs. '%ls'\n" )
|
||||
|
||||
/**
|
||||
Error message for unknown block type in the end builtin, e.g. 'begin; end beggin'
|
||||
*/
|
||||
#define BUILTIN_END_BLOCK_UNKNOWN _( L"%ls: Unknown block type '%ls'\n" )
|
||||
|
||||
#define BUILTIN_ERR_NOT_NUMBER _( L"%ls: Argument '%ls' is not a number\n" )
|
||||
|
||||
/** Get the string used to represent stdout and stderr */
|
||||
const wcstring &get_stdout_buffer();
|
||||
const wcstring &get_stderr_buffer();
|
||||
|
||||
/** Output an error */
|
||||
void builtin_show_error(const wcstring &err);
|
||||
|
||||
/**
|
||||
Kludge. Tells builtins if output is to screen
|
||||
*/
|
||||
extern int builtin_out_redirect;
|
||||
|
||||
/**
|
||||
Kludge. Tells builtins if error is to screen
|
||||
*/
|
||||
extern int builtin_err_redirect;
|
||||
|
||||
|
||||
/**
|
||||
Initialize builtin data.
|
||||
*/
|
||||
void builtin_init();
|
||||
|
||||
/**
|
||||
Destroy builtin data.
|
||||
*/
|
||||
void builtin_destroy();
|
||||
|
||||
/**
|
||||
Is there a builtin command with the given name?
|
||||
*/
|
||||
int builtin_exists( const wcstring &cmd );
|
||||
|
||||
/**
|
||||
Execute a builtin command
|
||||
|
||||
\param parser The parser being used
|
||||
\param argv Array containing the command and parameters
|
||||
of the builtin. The list is terminated by a
|
||||
null pointer. This syntax resembles the syntax
|
||||
for exec.
|
||||
\param io the io redirections to perform on this builtin.
|
||||
|
||||
\return the exit status of the builtin command
|
||||
*/
|
||||
int builtin_run( parser_t &parser, const wchar_t * const *argv, const io_chain_t &io );
|
||||
|
||||
/** Returns a list of all builtin names */
|
||||
wcstring_list_t builtin_get_names(void);
|
||||
|
||||
/** Insert all builtin names into list. */
|
||||
void builtin_get_names(std::vector<completion_t> &list);
|
||||
|
||||
/**
|
||||
Pushes a new set of input/output to the stack. The new stdin is supplied, a new set of output strings is created.
|
||||
*/
|
||||
void builtin_push_io( parser_t &parser, int stdin_fd );
|
||||
|
||||
/**
|
||||
Pops a set of input/output from the stack. The output strings are destroued, but the input file is not closed.
|
||||
*/
|
||||
void builtin_pop_io(parser_t &parser);
|
||||
|
||||
|
||||
/**
|
||||
Return a one-line description of the specified builtin.
|
||||
*/
|
||||
wcstring builtin_get_desc( const wcstring &b );
|
||||
|
||||
|
||||
/**
|
||||
Slightly kludgy function used with 'complete -C' in order to make
|
||||
the commandline builtin operate on the string to complete instead
|
||||
of operating on whatever is to be completed.
|
||||
*/
|
||||
const wchar_t *builtin_complete_get_temporary_buffer();
|
||||
|
||||
|
||||
/**
|
||||
Run the __fish_print_help function to obtain the help information
|
||||
for the specified command.
|
||||
*/
|
||||
|
||||
wcstring builtin_help_get( parser_t &parser, const wchar_t *cmd );
|
||||
|
||||
#endif
|
||||
@@ -1,646 +0,0 @@
|
||||
/** \file builtin_commandline.c Functions defining the commandline builtin
|
||||
|
||||
Functions used for implementing the commandline builtin.
|
||||
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "fallback.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "wutil.h"
|
||||
#include "builtin.h"
|
||||
#include "common.h"
|
||||
#include "wgetopt.h"
|
||||
#include "reader.h"
|
||||
#include "proc.h"
|
||||
#include "parser.h"
|
||||
#include "tokenizer.h"
|
||||
#include "input_common.h"
|
||||
#include "input.h"
|
||||
|
||||
#include "parse_util.h"
|
||||
|
||||
/**
|
||||
Which part of the comandbuffer are we operating on
|
||||
*/
|
||||
enum
|
||||
{
|
||||
STRING_MODE=1, /**< Operate on entire buffer */
|
||||
JOB_MODE, /**< Operate on job under cursor */
|
||||
PROCESS_MODE, /**< Operate on process under cursor */
|
||||
TOKEN_MODE /**< Operate on token under cursor */
|
||||
}
|
||||
;
|
||||
|
||||
/**
|
||||
For text insertion, how should it be done
|
||||
*/
|
||||
enum
|
||||
{
|
||||
REPLACE_MODE=1, /**< Replace current text */
|
||||
INSERT_MODE, /**< Insert at cursor position */
|
||||
APPEND_MODE /**< Insert at end of current token/command/buffer */
|
||||
}
|
||||
;
|
||||
|
||||
/**
|
||||
Pointer to what the commandline builtin considers to be the current
|
||||
contents of the command line buffer.
|
||||
*/
|
||||
static const wchar_t *current_buffer=0;
|
||||
/**
|
||||
What the commandline builtin considers to be the current cursor
|
||||
position.
|
||||
*/
|
||||
static size_t current_cursor_pos = (size_t)(-1);
|
||||
|
||||
/**
|
||||
Returns the current commandline buffer.
|
||||
*/
|
||||
static const wchar_t *get_buffer()
|
||||
{
|
||||
return current_buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
Returns the position of the cursor
|
||||
*/
|
||||
static size_t get_cursor_pos()
|
||||
{
|
||||
return current_cursor_pos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Replace/append/insert the selection with/at/after the specified string.
|
||||
|
||||
\param begin beginning of selection
|
||||
\param end end of selection
|
||||
\param insert the string to insert
|
||||
\param append_mode can be one of REPLACE_MODE, INSERT_MODE or APPEND_MODE, affects the way the test update is performed
|
||||
*/
|
||||
static void replace_part( const wchar_t *begin,
|
||||
const wchar_t *end,
|
||||
const wchar_t *insert,
|
||||
int append_mode )
|
||||
{
|
||||
const wchar_t *buff = get_buffer();
|
||||
size_t out_pos = get_cursor_pos();
|
||||
|
||||
wcstring out;
|
||||
|
||||
out.append(buff, begin - buff);
|
||||
|
||||
switch( append_mode)
|
||||
{
|
||||
case REPLACE_MODE:
|
||||
{
|
||||
|
||||
out.append(insert);
|
||||
out_pos = wcslen( insert ) + (begin-buff);
|
||||
break;
|
||||
|
||||
}
|
||||
case APPEND_MODE:
|
||||
{
|
||||
out.append( begin, end-begin );
|
||||
out.append( insert );
|
||||
break;
|
||||
}
|
||||
case INSERT_MODE:
|
||||
{
|
||||
long cursor = get_cursor_pos() -(begin-buff);
|
||||
out.append( begin, cursor );
|
||||
out.append( insert );
|
||||
out.append( begin+cursor, end-begin-cursor );
|
||||
out_pos += wcslen( insert );
|
||||
break;
|
||||
}
|
||||
}
|
||||
out.append( end );
|
||||
reader_set_buffer( out, out_pos );
|
||||
}
|
||||
|
||||
/**
|
||||
Output the specified selection.
|
||||
|
||||
\param begin start of selection
|
||||
\param end end of selection
|
||||
\param cut_at_cursor whether printing should stop at the surrent cursor position
|
||||
\param tokenize whether the string should be tokenized, printing one string token on every line and skipping non-string tokens
|
||||
*/
|
||||
static void write_part( const wchar_t *begin,
|
||||
const wchar_t *end,
|
||||
int cut_at_cursor,
|
||||
int tokenize )
|
||||
{
|
||||
tokenizer tok;
|
||||
wcstring out;
|
||||
wchar_t *buff;
|
||||
size_t pos;
|
||||
|
||||
pos = get_cursor_pos()-(begin-get_buffer());
|
||||
|
||||
if( tokenize )
|
||||
{
|
||||
buff = wcsndup( begin, end-begin );
|
||||
// fwprintf( stderr, L"Subshell: %ls, end char %lc\n", buff, *end );
|
||||
out.clear();
|
||||
|
||||
for( tok_init( &tok, buff, TOK_ACCEPT_UNFINISHED );
|
||||
tok_has_next( &tok );
|
||||
tok_next( &tok ) )
|
||||
{
|
||||
if( (cut_at_cursor) &&
|
||||
(tok_get_pos( &tok)+wcslen(tok_last( &tok)) >= pos) )
|
||||
break;
|
||||
|
||||
switch( tok_last_type( &tok ) )
|
||||
{
|
||||
case TOK_STRING:
|
||||
{
|
||||
out.append(escape_string(tok_last( &tok ), UNESCAPE_INCOMPLETE));
|
||||
out.push_back(L'\n');
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
stdout_buffer.append(out);
|
||||
|
||||
free( buff );
|
||||
tok_destroy( &tok );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( cut_at_cursor )
|
||||
{
|
||||
end = begin+pos;
|
||||
}
|
||||
|
||||
// debug( 0, L"woot2 %ls -> %ls", buff, esc );
|
||||
|
||||
stdout_buffer.append(begin, end - begin);
|
||||
stdout_buffer.append(L"\n");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
The commandline builtin. It is used for specifying a new value for
|
||||
the commandline.
|
||||
*/
|
||||
static int builtin_commandline( parser_t &parser, wchar_t **argv )
|
||||
{
|
||||
|
||||
int buffer_part=0;
|
||||
int cut_at_cursor=0;
|
||||
|
||||
int argc = builtin_count_args( argv );
|
||||
int append_mode=0;
|
||||
|
||||
int function_mode = 0;
|
||||
|
||||
int tokenize = 0;
|
||||
|
||||
int cursor_mode = 0;
|
||||
int line_mode = 0;
|
||||
int search_mode = 0;
|
||||
const wchar_t *begin, *end;
|
||||
|
||||
current_buffer = (wchar_t *)builtin_complete_get_temporary_buffer();
|
||||
if( current_buffer )
|
||||
{
|
||||
current_cursor_pos = wcslen( current_buffer );
|
||||
}
|
||||
else
|
||||
{
|
||||
current_buffer = reader_get_buffer();
|
||||
current_cursor_pos = reader_get_cursor_pos();
|
||||
}
|
||||
|
||||
if( !get_buffer() )
|
||||
{
|
||||
if (is_interactive_session)
|
||||
{
|
||||
/*
|
||||
Prompt change requested while we don't have
|
||||
a prompt, most probably while reading the
|
||||
init files. Just ignore it.
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
|
||||
stderr_buffer.append(argv[0]);
|
||||
stderr_buffer.append(L": Can not set commandline in non-interactive mode\n");
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
woptind=0;
|
||||
|
||||
while( 1 )
|
||||
{
|
||||
static const struct woption
|
||||
long_options[] =
|
||||
{
|
||||
{
|
||||
L"append", no_argument, 0, 'a'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"insert", no_argument, 0, 'i'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"replace", no_argument, 0, 'r'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"current-job", no_argument, 0, 'j'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"current-process", no_argument, 0, 'p'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"current-token", no_argument, 0, 't'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"current-buffer", no_argument, 0, 'b'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"cut-at-cursor", no_argument, 0, 'c'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"function", no_argument, 0, 'f'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"tokenize", no_argument, 0, 'o'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"help", no_argument, 0, 'h'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"input", required_argument, 0, 'I'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"cursor", no_argument, 0, 'C'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"line", no_argument, 0, 'L'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"search-mode", no_argument, 0, 'S'
|
||||
}
|
||||
,
|
||||
{
|
||||
0, 0, 0, 0
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
int opt_index = 0;
|
||||
|
||||
int opt = wgetopt_long( argc,
|
||||
argv,
|
||||
L"abijpctwforhI:CLS",
|
||||
long_options,
|
||||
&opt_index );
|
||||
if( opt == -1 )
|
||||
break;
|
||||
|
||||
switch( opt )
|
||||
{
|
||||
case 0:
|
||||
if(long_options[opt_index].flag != 0)
|
||||
break;
|
||||
append_format( stderr_buffer,
|
||||
BUILTIN_ERR_UNKNOWN,
|
||||
argv[0],
|
||||
long_options[opt_index].name );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
|
||||
return 1;
|
||||
|
||||
case L'a':
|
||||
append_mode = APPEND_MODE;
|
||||
break;
|
||||
|
||||
case L'b':
|
||||
buffer_part = STRING_MODE;
|
||||
break;
|
||||
|
||||
|
||||
case L'i':
|
||||
append_mode = INSERT_MODE;
|
||||
break;
|
||||
|
||||
case L'r':
|
||||
append_mode = REPLACE_MODE;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
cut_at_cursor=1;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
buffer_part = TOKEN_MODE;
|
||||
break;
|
||||
|
||||
case 'j':
|
||||
buffer_part = JOB_MODE;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
buffer_part = PROCESS_MODE;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
function_mode=1;
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
tokenize=1;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
current_buffer = woptarg;
|
||||
current_cursor_pos = wcslen( woptarg );
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
cursor_mode = 1;
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
line_mode = 1;
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
search_mode = 1;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
builtin_print_help( parser, argv[0], stdout_buffer );
|
||||
return 0;
|
||||
|
||||
case L'?':
|
||||
builtin_unknown_option( parser, argv[0], argv[woptind-1] );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if( function_mode )
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
Check for invalid switch combinations
|
||||
*/
|
||||
if( buffer_part || cut_at_cursor || append_mode || tokenize || cursor_mode || line_mode || search_mode )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_COMBO,
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if( argc == woptind )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_MISSING,
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
for( i=woptind; i<argc; i++ )
|
||||
{
|
||||
wint_t c = input_function_get_code( argv[i] );
|
||||
if( c != -1 )
|
||||
{
|
||||
/*
|
||||
input_unreadch inserts the specified keypress or
|
||||
readline function at the top of the stack of unused
|
||||
keypresses
|
||||
*/
|
||||
input_unreadch(c);
|
||||
}
|
||||
else
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
_(L"%ls: Unknown input function '%ls'\n"),
|
||||
argv[0],
|
||||
argv[i] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Check for invalid switch combinations
|
||||
*/
|
||||
if( (search_mode || line_mode || cursor_mode) && (argc-woptind > 1) )
|
||||
{
|
||||
|
||||
append_format(stderr_buffer,
|
||||
argv[0],
|
||||
L": Too many arguments\n",
|
||||
NULL );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
if( (buffer_part || tokenize || cut_at_cursor) && (cursor_mode || line_mode || search_mode) )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_COMBO,
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if( (tokenize || cut_at_cursor) && (argc-woptind) )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_COMBO2,
|
||||
argv[0],
|
||||
L"--cut-at-cursor and --tokenize can not be used when setting the commandline" );
|
||||
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
if( append_mode && !(argc-woptind) )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_COMBO2,
|
||||
argv[0],
|
||||
L"insertion mode switches can not be used when not in insertion mode" );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Set default modes
|
||||
*/
|
||||
if( !append_mode )
|
||||
{
|
||||
append_mode = REPLACE_MODE;
|
||||
}
|
||||
|
||||
if( !buffer_part )
|
||||
{
|
||||
buffer_part = STRING_MODE;
|
||||
}
|
||||
|
||||
if( cursor_mode )
|
||||
{
|
||||
if( argc-woptind )
|
||||
{
|
||||
wchar_t *endptr;
|
||||
long new_pos;
|
||||
errno = 0;
|
||||
|
||||
new_pos = wcstol( argv[woptind], &endptr, 10 );
|
||||
if( *endptr || errno )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_NOT_NUMBER,
|
||||
argv[0],
|
||||
argv[woptind] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
}
|
||||
|
||||
current_buffer = reader_get_buffer();
|
||||
new_pos = maxi( 0L, mini( new_pos, (long)wcslen( current_buffer ) ) );
|
||||
reader_set_buffer( current_buffer, (size_t)new_pos );
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
append_format(stdout_buffer, L"%lu\n", (unsigned long)reader_get_cursor_pos() );
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( line_mode )
|
||||
{
|
||||
size_t pos = reader_get_cursor_pos();
|
||||
const wchar_t *buff = reader_get_buffer();
|
||||
append_format(stdout_buffer, L"%lu\n", (unsigned long)parse_util_lineno( buff, pos ) );
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
if( search_mode )
|
||||
{
|
||||
return !reader_search_mode();
|
||||
}
|
||||
|
||||
|
||||
switch( buffer_part )
|
||||
{
|
||||
case STRING_MODE:
|
||||
{
|
||||
begin = get_buffer();
|
||||
end = begin+wcslen(begin);
|
||||
break;
|
||||
}
|
||||
|
||||
case PROCESS_MODE:
|
||||
{
|
||||
parse_util_process_extent( get_buffer(),
|
||||
get_cursor_pos(),
|
||||
&begin,
|
||||
&end );
|
||||
break;
|
||||
}
|
||||
|
||||
case JOB_MODE:
|
||||
{
|
||||
parse_util_job_extent( get_buffer(),
|
||||
get_cursor_pos(),
|
||||
&begin,
|
||||
&end );
|
||||
break;
|
||||
}
|
||||
|
||||
case TOKEN_MODE:
|
||||
{
|
||||
parse_util_token_extent( get_buffer(),
|
||||
get_cursor_pos(),
|
||||
&begin,
|
||||
&end,
|
||||
0, 0 );
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
switch(argc-woptind)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
write_part( begin, end, cut_at_cursor, tokenize );
|
||||
break;
|
||||
}
|
||||
|
||||
case 1:
|
||||
{
|
||||
replace_part( begin, end, argv[woptind], append_mode );
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
wcstring sb = argv[woptind];
|
||||
int i;
|
||||
|
||||
for( i=woptind+1; i<argc; i++ )
|
||||
{
|
||||
sb.push_back(L'\n');
|
||||
sb.append(argv[i]);
|
||||
}
|
||||
|
||||
replace_part( begin, end, sb.c_str(), append_mode );
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,626 +0,0 @@
|
||||
/** \file builtin_complete.c Functions defining the complete builtin
|
||||
|
||||
Functions used for implementing the complete builtin.
|
||||
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "fallback.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "wutil.h"
|
||||
#include "builtin.h"
|
||||
#include "common.h"
|
||||
#include "complete.h"
|
||||
#include "wgetopt.h"
|
||||
#include "parser.h"
|
||||
#include "reader.h"
|
||||
|
||||
|
||||
/**
|
||||
Internal storage for the builtin_complete_get_temporary_buffer() function.
|
||||
*/
|
||||
static const wchar_t *temporary_buffer;
|
||||
|
||||
/*
|
||||
builtin_complete_* are a set of rather silly looping functions that
|
||||
make sure that all the proper combinations of complete_add or
|
||||
complete_remove get called. This is needed since complete allows you
|
||||
to specify multiple switches on a single commandline, like 'complete
|
||||
-s a -s b -s c', but the complete_add function only accepts one
|
||||
short switch and one long switch.
|
||||
*/
|
||||
|
||||
/**
|
||||
Silly function
|
||||
*/
|
||||
static void builtin_complete_add2( const wchar_t *cmd,
|
||||
int cmd_type,
|
||||
const wchar_t *short_opt,
|
||||
const wcstring_list_t &gnu_opt,
|
||||
const wcstring_list_t &old_opt,
|
||||
int result_mode,
|
||||
const wchar_t *condition,
|
||||
const wchar_t *comp,
|
||||
const wchar_t *desc,
|
||||
int flags )
|
||||
{
|
||||
size_t i;
|
||||
const wchar_t *s;
|
||||
|
||||
for( s=short_opt; *s; s++ )
|
||||
{
|
||||
complete_add( cmd,
|
||||
cmd_type,
|
||||
*s,
|
||||
0,
|
||||
0,
|
||||
result_mode,
|
||||
condition,
|
||||
comp,
|
||||
desc,
|
||||
flags );
|
||||
}
|
||||
|
||||
for( i=0; i<gnu_opt.size(); i++ )
|
||||
{
|
||||
complete_add( cmd,
|
||||
cmd_type,
|
||||
0,
|
||||
gnu_opt.at(i).c_str(),
|
||||
0,
|
||||
result_mode,
|
||||
condition,
|
||||
comp,
|
||||
desc,
|
||||
flags );
|
||||
}
|
||||
|
||||
for( i=0; i<old_opt.size(); i++ )
|
||||
{
|
||||
complete_add( cmd,
|
||||
cmd_type,
|
||||
0,
|
||||
old_opt.at(i).c_str(),
|
||||
1,
|
||||
result_mode,
|
||||
condition,
|
||||
comp,
|
||||
desc,
|
||||
flags );
|
||||
}
|
||||
|
||||
if( old_opt.size() == 0 && gnu_opt.size() == 0 && wcslen(short_opt) == 0 )
|
||||
{
|
||||
complete_add( cmd,
|
||||
cmd_type,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
result_mode,
|
||||
condition,
|
||||
comp,
|
||||
desc,
|
||||
flags );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Silly function
|
||||
*/
|
||||
static void builtin_complete_add( const wcstring_list_t &cmd,
|
||||
const wcstring_list_t &path,
|
||||
const wchar_t *short_opt,
|
||||
wcstring_list_t &gnu_opt,
|
||||
wcstring_list_t &old_opt,
|
||||
int result_mode,
|
||||
int authoritative,
|
||||
const wchar_t *condition,
|
||||
const wchar_t *comp,
|
||||
const wchar_t *desc,
|
||||
int flags )
|
||||
{
|
||||
for( size_t i=0; i<cmd.size(); i++ )
|
||||
{
|
||||
builtin_complete_add2( cmd.at(i).c_str(),
|
||||
COMMAND,
|
||||
short_opt,
|
||||
gnu_opt,
|
||||
old_opt,
|
||||
result_mode,
|
||||
condition,
|
||||
comp,
|
||||
desc,
|
||||
flags );
|
||||
|
||||
if( authoritative != -1 )
|
||||
{
|
||||
complete_set_authoritative( cmd.at(i).c_str(),
|
||||
COMMAND,
|
||||
authoritative );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for( size_t i=0; i<path.size(); i++ )
|
||||
{
|
||||
builtin_complete_add2( path.at(i).c_str(),
|
||||
PATH,
|
||||
short_opt,
|
||||
gnu_opt,
|
||||
old_opt,
|
||||
result_mode,
|
||||
condition,
|
||||
comp,
|
||||
desc,
|
||||
flags );
|
||||
|
||||
if( authoritative != -1 )
|
||||
{
|
||||
complete_set_authoritative( path.at(i).c_str(),
|
||||
PATH,
|
||||
authoritative );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Silly function
|
||||
*/
|
||||
static void builtin_complete_remove3( const wchar_t *cmd,
|
||||
int cmd_type,
|
||||
wchar_t short_opt,
|
||||
const wcstring_list_t &long_opt )
|
||||
{
|
||||
for( size_t i=0; i<long_opt.size(); i++ )
|
||||
{
|
||||
complete_remove( cmd,
|
||||
cmd_type,
|
||||
short_opt,
|
||||
long_opt.at(i).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Silly function
|
||||
*/
|
||||
static void builtin_complete_remove2( const wchar_t *cmd,
|
||||
int cmd_type,
|
||||
const wchar_t *short_opt,
|
||||
const wcstring_list_t &gnu_opt,
|
||||
const wcstring_list_t &old_opt )
|
||||
{
|
||||
const wchar_t *s = (wchar_t *)short_opt;
|
||||
if( *s )
|
||||
{
|
||||
for( ; *s; s++ )
|
||||
{
|
||||
if( old_opt.size() == 0 && gnu_opt.size() == 0 )
|
||||
{
|
||||
complete_remove(cmd,
|
||||
cmd_type,
|
||||
*s,
|
||||
0 );
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
builtin_complete_remove3( cmd,
|
||||
cmd_type,
|
||||
*s,
|
||||
gnu_opt );
|
||||
builtin_complete_remove3( cmd,
|
||||
cmd_type,
|
||||
*s,
|
||||
old_opt );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
builtin_complete_remove3( cmd,
|
||||
cmd_type,
|
||||
0,
|
||||
gnu_opt );
|
||||
builtin_complete_remove3( cmd,
|
||||
cmd_type,
|
||||
0,
|
||||
old_opt );
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
Silly function
|
||||
*/
|
||||
static void builtin_complete_remove( const wcstring_list_t &cmd,
|
||||
const wcstring_list_t &path,
|
||||
const wchar_t *short_opt,
|
||||
const wcstring_list_t &gnu_opt,
|
||||
const wcstring_list_t &old_opt )
|
||||
{
|
||||
for( size_t i=0; i<cmd.size(); i++ )
|
||||
{
|
||||
builtin_complete_remove2( cmd.at(i).c_str(),
|
||||
COMMAND,
|
||||
short_opt,
|
||||
gnu_opt,
|
||||
old_opt );
|
||||
}
|
||||
|
||||
for( size_t i=0; i<path.size(); i++ )
|
||||
{
|
||||
builtin_complete_remove2( path.at(i).c_str(),
|
||||
PATH,
|
||||
short_opt,
|
||||
gnu_opt,
|
||||
old_opt );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
const wchar_t *builtin_complete_get_temporary_buffer()
|
||||
{
|
||||
ASSERT_IS_MAIN_THREAD();
|
||||
return temporary_buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
The complete builtin. Used for specifying programmable
|
||||
tab-completions. Calls the functions in complete.c for any heavy
|
||||
lifting. Defined in builtin_complete.c
|
||||
*/
|
||||
static int builtin_complete( parser_t &parser, wchar_t **argv )
|
||||
{
|
||||
ASSERT_IS_MAIN_THREAD();
|
||||
bool res=false;
|
||||
int argc=0;
|
||||
int result_mode=SHARED;
|
||||
int remove = 0;
|
||||
int authoritative = -1;
|
||||
int flags = COMPLETE_AUTO_SPACE;
|
||||
|
||||
wcstring short_opt;
|
||||
wcstring_list_t gnu_opt, old_opt;
|
||||
const wchar_t *comp=L"", *desc=L"", *condition=L"";
|
||||
|
||||
bool do_complete = false;
|
||||
wcstring do_complete_param;
|
||||
|
||||
wcstring_list_t cmd;
|
||||
wcstring_list_t path;
|
||||
|
||||
static int recursion_level=0;
|
||||
|
||||
argc = builtin_count_args( argv );
|
||||
|
||||
woptind=0;
|
||||
|
||||
while( ! res )
|
||||
{
|
||||
static const struct woption
|
||||
long_options[] =
|
||||
{
|
||||
{
|
||||
L"exclusive", no_argument, 0, 'x'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"no-files", no_argument, 0, 'f'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"require-parameter", no_argument, 0, 'r'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"path", required_argument, 0, 'p'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"command", required_argument, 0, 'c'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"short-option", required_argument, 0, 's'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"long-option", required_argument, 0, 'l'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"old-option", required_argument, 0, 'o'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"description", required_argument, 0, 'd'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"arguments", required_argument, 0, 'a'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"erase", no_argument, 0, 'e'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"unauthoritative", no_argument, 0, 'u'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"authoritative", no_argument, 0, 'A'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"condition", required_argument, 0, 'n'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"do-complete", optional_argument, 0, 'C'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"help", no_argument, 0, 'h'
|
||||
}
|
||||
,
|
||||
{
|
||||
0, 0, 0, 0
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
int opt_index = 0;
|
||||
|
||||
int opt = wgetopt_long( argc,
|
||||
argv,
|
||||
L"a:c:p:s:l:o:d:frxeuAn:C::h",
|
||||
long_options,
|
||||
&opt_index );
|
||||
if( opt == -1 )
|
||||
break;
|
||||
|
||||
switch( opt )
|
||||
{
|
||||
case 0:
|
||||
if(long_options[opt_index].flag != 0)
|
||||
break;
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_UNKNOWN,
|
||||
argv[0],
|
||||
long_options[opt_index].name );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
|
||||
|
||||
res = true;
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
result_mode |= EXCLUSIVE;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
result_mode |= NO_FILES;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
result_mode |= NO_COMMON;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
case 'c':
|
||||
{
|
||||
wcstring tmp = woptarg;
|
||||
if (unescape_string(tmp, 1))
|
||||
{
|
||||
if (opt=='p')
|
||||
path.push_back(tmp);
|
||||
else
|
||||
cmd.push_back(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
append_format(stderr_buffer, L"%ls: Invalid token '%ls'\n", argv[0], woptarg );
|
||||
res = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'd':
|
||||
desc = woptarg;
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
authoritative=0;
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
authoritative=1;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
short_opt.append(woptarg);
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
gnu_opt.push_back(woptarg);
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
old_opt.push_back(woptarg);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
comp = woptarg;
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
remove = 1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
condition = woptarg;
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
do_complete = true;
|
||||
do_complete_param = woptarg ? woptarg : reader_get_buffer();
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
builtin_print_help( parser, argv[0], stdout_buffer );
|
||||
return 0;
|
||||
|
||||
case '?':
|
||||
builtin_unknown_option( parser, argv[0], argv[woptind-1] );
|
||||
res = true;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( !res )
|
||||
{
|
||||
if( condition && wcslen( condition ) )
|
||||
{
|
||||
if( parser.test( condition, 0, 0, 0 ) )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
L"%ls: Condition '%ls' contained a syntax error\n",
|
||||
argv[0],
|
||||
condition );
|
||||
|
||||
parser.test( condition, 0, &stderr_buffer, argv[0] );
|
||||
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !res )
|
||||
{
|
||||
if( comp && wcslen( comp ) )
|
||||
{
|
||||
if( parser.test_args( comp, 0, 0 ) )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
L"%ls: Completion '%ls' contained a syntax error\n",
|
||||
argv[0],
|
||||
comp );
|
||||
|
||||
parser.test_args( comp, &stderr_buffer, argv[0] );
|
||||
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !res )
|
||||
{
|
||||
if( do_complete )
|
||||
{
|
||||
const wchar_t *token;
|
||||
|
||||
parse_util_token_extent( do_complete_param.c_str(), do_complete_param.size(), &token, 0, 0, 0 );
|
||||
|
||||
const wchar_t *prev_temporary_buffer = temporary_buffer;
|
||||
temporary_buffer = do_complete_param.c_str();
|
||||
|
||||
if( recursion_level < 1 )
|
||||
{
|
||||
recursion_level++;
|
||||
|
||||
std::vector<completion_t> comp;
|
||||
complete( do_complete_param, comp, COMPLETE_DEFAULT );
|
||||
|
||||
for( size_t i=0; i< comp.size() ; i++ )
|
||||
{
|
||||
const completion_t &next = comp.at( i );
|
||||
|
||||
const wchar_t *prepend;
|
||||
|
||||
if( next.flags & COMPLETE_NO_CASE )
|
||||
{
|
||||
prepend = L"";
|
||||
}
|
||||
else
|
||||
{
|
||||
prepend = token;
|
||||
}
|
||||
|
||||
|
||||
if( !(next.description).empty() )
|
||||
{
|
||||
append_format(stdout_buffer, L"%ls%ls\t%ls\n", prepend, next.completion.c_str(), next.description.c_str() );
|
||||
}
|
||||
else
|
||||
{
|
||||
append_format(stdout_buffer, L"%ls%ls\n", prepend, next.completion.c_str() );
|
||||
}
|
||||
}
|
||||
|
||||
recursion_level--;
|
||||
}
|
||||
|
||||
temporary_buffer = prev_temporary_buffer;
|
||||
|
||||
}
|
||||
else if( woptind != argc )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
_( L"%ls: Too many arguments\n" ),
|
||||
argv[0] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
|
||||
res = true;
|
||||
}
|
||||
else if( cmd.empty() && path.empty() )
|
||||
{
|
||||
/* No arguments specified, meaning we print the definitions of
|
||||
* all specified completions to stdout.*/
|
||||
complete_print( stdout_buffer );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( remove )
|
||||
{
|
||||
builtin_complete_remove( cmd,
|
||||
path,
|
||||
short_opt.c_str(),
|
||||
gnu_opt,
|
||||
old_opt );
|
||||
}
|
||||
else
|
||||
{
|
||||
builtin_complete_add( cmd,
|
||||
path,
|
||||
short_opt.c_str(),
|
||||
gnu_opt,
|
||||
old_opt,
|
||||
result_mode,
|
||||
authoritative,
|
||||
condition,
|
||||
comp,
|
||||
desc,
|
||||
flags );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return res ? 1 : 0;
|
||||
}
|
||||
351
builtin_jobs.cpp
351
builtin_jobs.cpp
@@ -1,351 +0,0 @@
|
||||
/** \file builtin_jobs.c
|
||||
Functions for executing the jobs builtin.
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <unistd.h>
|
||||
#include <termios.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <wctype.h>
|
||||
|
||||
#include "fallback.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "wutil.h"
|
||||
#include "builtin.h"
|
||||
#include "proc.h"
|
||||
#include "parser.h"
|
||||
#include "common.h"
|
||||
#include "wgetopt.h"
|
||||
|
||||
|
||||
/**
|
||||
Print modes for the jobs builtin
|
||||
*/
|
||||
enum
|
||||
{
|
||||
JOBS_DEFAULT, /**< Print lots of general info */
|
||||
JOBS_PRINT_PID, /**< Print pid of each process in job */
|
||||
JOBS_PRINT_COMMAND, /**< Print command name of each process in job */
|
||||
JOBS_PRINT_GROUP, /**< Print group id of job */
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
|
||||
#ifdef HAVE__PROC_SELF_STAT
|
||||
/**
|
||||
Calculates the cpu usage (in percent) of the specified job.
|
||||
*/
|
||||
static int cpu_use( const job_t *j )
|
||||
{
|
||||
double u=0;
|
||||
process_t *p;
|
||||
|
||||
for( p=j->first_process; p; p=p->next )
|
||||
{
|
||||
struct timeval t;
|
||||
int jiffies;
|
||||
gettimeofday( &t, 0 );
|
||||
jiffies = proc_get_jiffies( p );
|
||||
|
||||
double t1 = 1000000.0*p->last_time.tv_sec+p->last_time.tv_usec;
|
||||
double t2 = 1000000.0*t.tv_sec+t.tv_usec;
|
||||
|
||||
/* fwprintf( stderr, L"t1 %f t2 %f p1 %d p2 %d\n",
|
||||
t1, t2, jiffies, p->last_jiffies );
|
||||
*/
|
||||
|
||||
u += ((double)(jiffies-p->last_jiffies))/(t2-t1);
|
||||
}
|
||||
return u*1000000;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
Print information about the specified job
|
||||
*/
|
||||
static void builtin_jobs_print( const job_t *j, int mode, int header )
|
||||
{
|
||||
process_t *p;
|
||||
switch( mode )
|
||||
{
|
||||
case JOBS_DEFAULT:
|
||||
{
|
||||
|
||||
if( header )
|
||||
{
|
||||
/*
|
||||
Print table header before first job
|
||||
*/
|
||||
stdout_buffer.append( _( L"Job\tGroup\t" ));
|
||||
#ifdef HAVE__PROC_SELF_STAT
|
||||
stdout_buffer.append( _( L"CPU\t" ) );
|
||||
#endif
|
||||
stdout_buffer.append( _( L"State\tCommand\n" ) );
|
||||
}
|
||||
|
||||
append_format(stdout_buffer, L"%d\t%d\t", j->job_id, j->pgid );
|
||||
|
||||
#ifdef HAVE__PROC_SELF_STAT
|
||||
append_format(stdout_buffer, L"%d%%\t", cpu_use(j) );
|
||||
#endif
|
||||
stdout_buffer.append(job_is_stopped(j)?_(L"stopped"):_(L"running"));
|
||||
stdout_buffer.append(L"\t");
|
||||
stdout_buffer.append(j->command_wcstr());
|
||||
stdout_buffer.append(L"\n");
|
||||
break;
|
||||
}
|
||||
|
||||
case JOBS_PRINT_GROUP:
|
||||
{
|
||||
if( header )
|
||||
{
|
||||
/*
|
||||
Print table header before first job
|
||||
*/
|
||||
stdout_buffer.append( _( L"Group\n" ));
|
||||
}
|
||||
append_format(stdout_buffer, L"%d\n", j->pgid );
|
||||
break;
|
||||
}
|
||||
|
||||
case JOBS_PRINT_PID:
|
||||
{
|
||||
if( header )
|
||||
{
|
||||
/*
|
||||
Print table header before first job
|
||||
*/
|
||||
stdout_buffer.append( _( L"Procces\n" ));
|
||||
}
|
||||
|
||||
for( p=j->first_process; p; p=p->next )
|
||||
{
|
||||
append_format(stdout_buffer, L"%d\n", p->pid );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case JOBS_PRINT_COMMAND:
|
||||
{
|
||||
if( header )
|
||||
{
|
||||
/*
|
||||
Print table header before first job
|
||||
*/
|
||||
stdout_buffer.append( _( L"Command\n" ));
|
||||
}
|
||||
|
||||
for( p=j->first_process; p; p=p->next )
|
||||
{
|
||||
append_format(stdout_buffer, L"%ls\n", p->argv0() );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
The jobs builtin. Used fopr printing running jobs. Defined in builtin_jobs.c.
|
||||
*/
|
||||
static int builtin_jobs( parser_t &parser, wchar_t **argv )
|
||||
{
|
||||
int argc=0;
|
||||
int found=0;
|
||||
int mode=JOBS_DEFAULT;
|
||||
int print_last = 0;
|
||||
const job_t *j;
|
||||
|
||||
argc = builtin_count_args( argv );
|
||||
woptind=0;
|
||||
|
||||
while( 1 )
|
||||
{
|
||||
static const struct woption
|
||||
long_options[] =
|
||||
{
|
||||
{
|
||||
L"pid", no_argument, 0, 'p'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"command", no_argument, 0, 'c'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"group", no_argument, 0, 'g'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"last", no_argument, 0, 'l'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"help", no_argument, 0, 'h'
|
||||
}
|
||||
,
|
||||
{
|
||||
0, 0, 0, 0
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
int opt_index = 0;
|
||||
|
||||
int opt = wgetopt_long( argc,
|
||||
argv,
|
||||
L"pclgh",
|
||||
long_options,
|
||||
&opt_index );
|
||||
if( opt == -1 )
|
||||
break;
|
||||
|
||||
switch( opt )
|
||||
{
|
||||
case 0:
|
||||
if(long_options[opt_index].flag != 0)
|
||||
break;
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_UNKNOWN,
|
||||
argv[0],
|
||||
long_options[opt_index].name );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
|
||||
|
||||
return 1;
|
||||
|
||||
|
||||
case 'p':
|
||||
mode=JOBS_PRINT_PID;
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
mode=JOBS_PRINT_COMMAND;
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
mode=JOBS_PRINT_GROUP;
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
{
|
||||
print_last = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'h':
|
||||
builtin_print_help( parser, argv[0], stdout_buffer );
|
||||
return 0;
|
||||
|
||||
case '?':
|
||||
builtin_unknown_option( parser, argv[0], argv[woptind-1] );
|
||||
return 1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Do not babble if not interactive
|
||||
*/
|
||||
if( builtin_out_redirect )
|
||||
{
|
||||
found=1;
|
||||
}
|
||||
|
||||
if( print_last )
|
||||
{
|
||||
/*
|
||||
Ignore unconstructed jobs, i.e. ourself.
|
||||
*/
|
||||
job_iterator_t jobs;
|
||||
const job_t *j;
|
||||
while ((j = jobs.next()))
|
||||
{
|
||||
|
||||
if( (j->flags & JOB_CONSTRUCTED) && !job_is_completed(j) )
|
||||
{
|
||||
builtin_jobs_print( j, mode, !found );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if( woptind < argc )
|
||||
{
|
||||
int i;
|
||||
|
||||
found = 1;
|
||||
|
||||
for( i=woptind; i<argc; i++ )
|
||||
{
|
||||
int pid;
|
||||
wchar_t *end;
|
||||
errno=0;
|
||||
pid=fish_wcstoi( argv[i], &end, 10 );
|
||||
if( errno || *end )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
_( L"%ls: '%ls' is not a job\n" ),
|
||||
argv[0],
|
||||
argv[i] );
|
||||
return 1;
|
||||
}
|
||||
|
||||
j = job_get_from_pid( pid );
|
||||
|
||||
if( j && !job_is_completed( j ) )
|
||||
{
|
||||
builtin_jobs_print( j, mode, !found );
|
||||
}
|
||||
else
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
_( L"%ls: No suitable job: %d\n" ),
|
||||
argv[0],
|
||||
pid );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
job_iterator_t jobs;
|
||||
const job_t *j;
|
||||
while ((j = jobs.next()))
|
||||
{
|
||||
/*
|
||||
Ignore unconstructed jobs, i.e. ourself.
|
||||
*/
|
||||
if( (j->flags & JOB_CONSTRUCTED) && !job_is_completed(j) )
|
||||
{
|
||||
builtin_jobs_print( j, mode, !found );
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !found )
|
||||
{
|
||||
append_format(stdout_buffer,
|
||||
_( L"%ls: There are no jobs\n" ),
|
||||
argv[0] );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
836
builtin_set.cpp
836
builtin_set.cpp
@@ -1,836 +0,0 @@
|
||||
/** \file builtin_set.c Functions defining the set builtin
|
||||
|
||||
Functions used for implementing the set builtin.
|
||||
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <termios.h>
|
||||
#include <signal.h>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include "fallback.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "wutil.h"
|
||||
#include "builtin.h"
|
||||
#include "env.h"
|
||||
#include "expand.h"
|
||||
#include "common.h"
|
||||
#include "wgetopt.h"
|
||||
#include "proc.h"
|
||||
#include "parser.h"
|
||||
|
||||
/* We know about these buffers */
|
||||
extern wcstring stdout_buffer, stderr_buffer;
|
||||
|
||||
/**
|
||||
Error message for invalid path operations
|
||||
*/
|
||||
#define BUILTIN_SET_PATH_ERROR L"%ls: Warning: path component %ls may not be valid in %ls.\n"
|
||||
|
||||
/**
|
||||
Hint for invalid path operation with a colon
|
||||
*/
|
||||
#define BUILTIN_SET_PATH_HINT L"%ls: Did you mean 'set %ls $%ls %ls'?\n"
|
||||
|
||||
/**
|
||||
Error for mismatch between index count and elements
|
||||
*/
|
||||
#define BUILTIN_SET_ARG_COUNT L"%ls: The number of variable indexes does not match the number of values\n"
|
||||
|
||||
/**
|
||||
Test if the specified variable should be subject to path validation
|
||||
*/
|
||||
static int is_path_variable( const wchar_t *env )
|
||||
{
|
||||
return contains(env, L"PATH", L"CDPATH" );
|
||||
}
|
||||
|
||||
/**
|
||||
Call env_set. If this is a path variable, e.g. PATH, validate the
|
||||
elements. On error, print a description of the problem to stderr.
|
||||
*/
|
||||
static int my_env_set( const wchar_t *key, const wcstring_list_t &val, int scope )
|
||||
{
|
||||
size_t i;
|
||||
int retcode = 0;
|
||||
const wchar_t *val_str=NULL;
|
||||
|
||||
if( is_path_variable( key ) )
|
||||
{
|
||||
/* Fix for https://github.com/fish-shell/fish-shell/issues/199 . Return success if any path setting succeeds. */
|
||||
bool any_success = false, any_error = false;
|
||||
|
||||
for( i=0; i< val.size() ; i++ )
|
||||
{
|
||||
bool show_perror = false;
|
||||
int show_hint = 0;
|
||||
bool error = false;
|
||||
|
||||
struct stat buff;
|
||||
const wchar_t *dir = val[i].c_str();
|
||||
|
||||
if( wstat( dir, &buff ) )
|
||||
{
|
||||
error = true;
|
||||
show_perror = true;
|
||||
}
|
||||
|
||||
if( !( S_ISDIR(buff.st_mode) ) )
|
||||
{
|
||||
error = true;
|
||||
}
|
||||
|
||||
if( !error )
|
||||
{
|
||||
any_success = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
any_error = true;
|
||||
const wchar_t *colon;
|
||||
append_format(stderr_buffer, _(BUILTIN_SET_PATH_ERROR), L"set", dir, key);
|
||||
colon = wcschr( dir, L':' );
|
||||
|
||||
if( colon && *(colon+1) )
|
||||
{
|
||||
show_hint = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( show_perror )
|
||||
{
|
||||
builtin_wperror( L"set" );
|
||||
}
|
||||
|
||||
if( show_hint )
|
||||
{
|
||||
append_format(stderr_buffer, _(BUILTIN_SET_PATH_HINT), L"set", key, key, wcschr( dir, L':' )+1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Fail at setting the path if we tried to set it to something non-empty, but it wound up empty. */
|
||||
if( ! val.empty() && ! any_success )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
wcstring sb;
|
||||
if( val.size() )
|
||||
{
|
||||
for( i=0; i< val.size() ; i++ )
|
||||
{
|
||||
sb.append(val[i]);
|
||||
if( i<val.size() - 1 )
|
||||
{
|
||||
sb.append( ARRAY_SEP_STR );
|
||||
}
|
||||
}
|
||||
val_str = sb.c_str();
|
||||
}
|
||||
|
||||
switch( env_set( key, val_str, scope | ENV_USER ) )
|
||||
{
|
||||
case ENV_PERM:
|
||||
{
|
||||
append_format(stderr_buffer, _(L"%ls: Tried to change the read-only variable '%ls'\n"), L"set", key);
|
||||
retcode=1;
|
||||
break;
|
||||
}
|
||||
|
||||
case ENV_INVALID:
|
||||
{
|
||||
append_format(stderr_buffer, _(L"%ls: Unknown error"), L"set" );
|
||||
retcode=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Extract indexes from a destination argument of the form name[index1 index2...]
|
||||
|
||||
\param indexes the list to insert the new indexes into
|
||||
\param src the source string to parse
|
||||
\param name the name of the element. Return null if the name in \c src does not match this name
|
||||
\param var_count the number of elements in the array to parse.
|
||||
|
||||
\return the total number of indexes parsed, or -1 on error
|
||||
*/
|
||||
static int parse_index( std::vector<long> &indexes,
|
||||
const wchar_t *src,
|
||||
const wchar_t *name,
|
||||
size_t var_count )
|
||||
{
|
||||
size_t len;
|
||||
|
||||
int count = 0;
|
||||
const wchar_t *src_orig = src;
|
||||
|
||||
if (src == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (*src != L'\0' && (iswalnum(*src) || *src == L'_'))
|
||||
{
|
||||
src++;
|
||||
}
|
||||
|
||||
if (*src != L'[')
|
||||
{
|
||||
append_format(stderr_buffer, _(BUILTIN_SET_ARG_COUNT), L"set" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
len = src-src_orig;
|
||||
|
||||
if( (wcsncmp( src_orig, name, len )!=0) || (wcslen(name) != (len)) )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
_(L"%ls: Multiple variable names specified in single call (%ls and %.*ls)\n"),
|
||||
L"set",
|
||||
name,
|
||||
len,
|
||||
src_orig);
|
||||
return 0;
|
||||
}
|
||||
|
||||
src++;
|
||||
|
||||
while (iswspace(*src))
|
||||
{
|
||||
src++;
|
||||
}
|
||||
|
||||
while (*src != L']')
|
||||
{
|
||||
wchar_t *end;
|
||||
|
||||
long l_ind;
|
||||
|
||||
errno = 0;
|
||||
|
||||
l_ind = wcstol(src, &end, 10);
|
||||
|
||||
if( end==src || errno )
|
||||
{
|
||||
append_format(stderr_buffer, _(L"%ls: Invalid index starting at '%ls'\n"), L"set", src);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( l_ind < 0 )
|
||||
{
|
||||
l_ind = var_count+l_ind+1;
|
||||
}
|
||||
|
||||
src = end;
|
||||
if ( *src==L'.' && *(src+1)==L'.' ){
|
||||
src+=2;
|
||||
long l_ind2 = wcstol( src, &end, 10 );
|
||||
if( end==src || errno )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
src = end;
|
||||
|
||||
if( l_ind2 < 0 )
|
||||
{
|
||||
l_ind2 = var_count+l_ind2+1;
|
||||
}
|
||||
int direction = l_ind2<l_ind ? -1 : 1 ;
|
||||
for (long jjj = l_ind; jjj*direction <= l_ind2*direction; jjj+=direction) {
|
||||
// debug(0, L"Expand range [set]: %i\n", jjj);
|
||||
indexes.push_back( jjj );
|
||||
count++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
indexes.push_back( l_ind );
|
||||
count++;
|
||||
}
|
||||
while (iswspace(*src)) src++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int update_values( wcstring_list_t &list,
|
||||
std::vector<long> &indexes,
|
||||
wcstring_list_t &values )
|
||||
{
|
||||
size_t i;
|
||||
|
||||
/* Replace values where needed */
|
||||
for( i = 0; i < indexes.size(); i++ )
|
||||
{
|
||||
/*
|
||||
The '- 1' below is because the indices in fish are
|
||||
one-based, but the vector uses zero-based indices
|
||||
*/
|
||||
long ind = indexes[i] - 1;
|
||||
const wcstring newv = values[ i ];
|
||||
if( ind < 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( (size_t)ind >= list.size() )
|
||||
{
|
||||
list.resize( ind+1 );
|
||||
}
|
||||
|
||||
// free((void *) al_get(list, ind));
|
||||
list[ ind ] = newv;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Erase from a list of wcstring values at specified indexes
|
||||
*/
|
||||
static void erase_values(wcstring_list_t &list, const std::vector<long> &indexes)
|
||||
{
|
||||
// Make a set of indexes.
|
||||
// This both sorts them into ascending order and removes duplicates.
|
||||
const std::set<long> indexes_set(indexes.begin(), indexes.end());
|
||||
|
||||
// Now walk the set backwards, so we encounter larger indexes first, and remove elements at the given (1-based) indexes.
|
||||
std::set<long>::const_reverse_iterator iter;
|
||||
for (iter = indexes_set.rbegin(); iter != indexes_set.rend(); iter++) {
|
||||
long val = *iter;
|
||||
if (val > 0 && (size_t)val <= list.size()) {
|
||||
// One-based indexing!
|
||||
list.erase(list.begin() + val - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Print the names of all environment variables in the scope, with or without shortening,
|
||||
with or without values, with or without escaping
|
||||
*/
|
||||
static void print_variables(int include_values, int esc, bool shorten_ok, int scope)
|
||||
{
|
||||
wcstring_list_t names = env_get_names(scope);
|
||||
sort(names.begin(), names.end());
|
||||
|
||||
for( size_t i = 0; i < names.size(); i++ )
|
||||
{
|
||||
const wcstring key = names.at(i);
|
||||
const wcstring e_key = escape_string(key, 0);
|
||||
|
||||
stdout_buffer.append(e_key);
|
||||
|
||||
if( include_values )
|
||||
{
|
||||
env_var_t value = env_get_string(key);
|
||||
if( !value.missing() )
|
||||
{
|
||||
int shorten = 0;
|
||||
|
||||
if( shorten_ok && value.length() > 64 )
|
||||
{
|
||||
shorten = 1;
|
||||
value.resize(60);
|
||||
}
|
||||
|
||||
wcstring e_value = esc ? expand_escape_variable(value) : value;
|
||||
|
||||
stdout_buffer.append(L" ");
|
||||
stdout_buffer.append(e_value);
|
||||
|
||||
if( shorten )
|
||||
{
|
||||
stdout_buffer.append(L"\u2026");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
stdout_buffer.append(L"\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
The set builtin. Creates, updates and erases environment variables
|
||||
and environemnt variable arrays.
|
||||
*/
|
||||
static int builtin_set( parser_t &parser, wchar_t **argv )
|
||||
{
|
||||
|
||||
/**
|
||||
Variables used for parsing the argument list
|
||||
*/
|
||||
static const struct woption
|
||||
long_options[] =
|
||||
{
|
||||
{
|
||||
L"export", no_argument, 0, 'x'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"global", no_argument, 0, 'g'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"local", no_argument, 0, 'l'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"erase", no_argument, 0, 'e'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"names", no_argument, 0, 'n'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"unexport", no_argument, 0, 'u'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"universal", no_argument, 0, 'U'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"long", no_argument, 0, 'L'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"query", no_argument, 0, 'q'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"help", no_argument, 0, 'h'
|
||||
}
|
||||
,
|
||||
{
|
||||
0, 0, 0, 0
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
const wchar_t *short_options = L"+xglenuULqh";
|
||||
|
||||
int argc = builtin_count_args(argv);
|
||||
|
||||
/*
|
||||
Flags to set the work mode
|
||||
*/
|
||||
int local = 0, global = 0, exportv = 0;
|
||||
int erase = 0, list = 0, unexport=0;
|
||||
int universal = 0, query=0;
|
||||
bool shorten_ok = true;
|
||||
|
||||
/*
|
||||
Variables used for performing the actual work
|
||||
*/
|
||||
wchar_t *dest = 0;
|
||||
int retcode=0;
|
||||
int scope;
|
||||
int slice=0;
|
||||
int i;
|
||||
|
||||
wchar_t *bad_char;
|
||||
|
||||
|
||||
/* Parse options to obtain the requested operation and the modifiers */
|
||||
woptind = 0;
|
||||
while (1)
|
||||
{
|
||||
int c = wgetopt_long(argc, argv, short_options, long_options, 0);
|
||||
|
||||
if (c == -1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
erase = 1;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
list = 1;
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
exportv = 1;
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
local = 1;
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
global = 1;
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
unexport = 1;
|
||||
break;
|
||||
|
||||
case 'U':
|
||||
universal = 1;
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
shorten_ok = false;
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
query = 1;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
builtin_print_help( parser, argv[0], stdout_buffer );
|
||||
return 0;
|
||||
|
||||
case '?':
|
||||
builtin_unknown_option( parser, argv[0], argv[woptind-1] );
|
||||
return 1;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Ok, all arguments have been parsed, let's validate them
|
||||
*/
|
||||
|
||||
/*
|
||||
If we are checking the existance of a variable (-q) we can not
|
||||
also specify scope
|
||||
*/
|
||||
|
||||
if( query && (erase || list) )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_COMBO,
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* We can't both list and erase varaibles */
|
||||
if( erase && list )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_COMBO,
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Variables can only have one scope
|
||||
*/
|
||||
if( local + global + universal > 1 )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_GLOCAL,
|
||||
argv[0] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Variables can only have one export status
|
||||
*/
|
||||
if( exportv && unexport )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_EXPUNEXP,
|
||||
argv[0] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
Calculate the scope value for variable assignement
|
||||
*/
|
||||
scope = (local ? ENV_LOCAL : 0) | (global ? ENV_GLOBAL : 0) | (exportv ? ENV_EXPORT : 0) | (unexport ? ENV_UNEXPORT : 0) | (universal ? ENV_UNIVERSAL:0) | ENV_USER;
|
||||
|
||||
if( query )
|
||||
{
|
||||
/*
|
||||
Query mode. Return the number of variables that do not exist
|
||||
out of the specified variables.
|
||||
*/
|
||||
int i;
|
||||
for( i=woptind; i<argc; i++ )
|
||||
{
|
||||
wchar_t *arg = argv[i];
|
||||
int slice=0;
|
||||
|
||||
if( !(dest = wcsdup(arg)))
|
||||
{
|
||||
DIE_MEM();
|
||||
}
|
||||
|
||||
if( wcschr( dest, L'[' ) )
|
||||
{
|
||||
slice = 1;
|
||||
*wcschr( dest, L'[' )=0;
|
||||
}
|
||||
|
||||
if( slice )
|
||||
{
|
||||
std::vector<long> indexes;
|
||||
wcstring_list_t result;
|
||||
size_t j;
|
||||
|
||||
env_var_t dest_str = env_get_string(dest);
|
||||
if (! dest_str.missing())
|
||||
tokenize_variable_array( dest_str, result );
|
||||
|
||||
if( !parse_index( indexes, arg, dest, result.size() ) )
|
||||
{
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
retcode = 1;
|
||||
break;
|
||||
}
|
||||
for( j=0; j < indexes.size() ; j++ )
|
||||
{
|
||||
long idx = indexes[j];
|
||||
if( idx < 1 || (size_t)idx > result.size() )
|
||||
{
|
||||
retcode++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !env_exist( arg, scope ) )
|
||||
{
|
||||
retcode++;
|
||||
}
|
||||
}
|
||||
|
||||
free( dest );
|
||||
|
||||
}
|
||||
return retcode;
|
||||
}
|
||||
|
||||
if( list )
|
||||
{
|
||||
/* Maybe we should issue an error if there are any other arguments? */
|
||||
print_variables(0, 0, shorten_ok, scope);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if( woptind == argc )
|
||||
{
|
||||
/*
|
||||
Print values of variables
|
||||
*/
|
||||
|
||||
if( erase )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
_(L"%ls: Erase needs a variable name\n"),
|
||||
argv[0] );
|
||||
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
retcode = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
print_variables( 1, 1, shorten_ok, scope );
|
||||
}
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
||||
if( !(dest = wcsdup(argv[woptind])))
|
||||
{
|
||||
DIE_MEM();
|
||||
}
|
||||
|
||||
if( wcschr( dest, L'[' ) )
|
||||
{
|
||||
slice = 1;
|
||||
*wcschr( dest, L'[' )=0;
|
||||
}
|
||||
|
||||
if( !wcslen( dest ) )
|
||||
{
|
||||
free( dest );
|
||||
append_format(stderr_buffer, BUILTIN_ERR_VARNAME_ZERO, argv[0] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
if( (bad_char = wcsvarname( dest ) ) )
|
||||
{
|
||||
append_format(stderr_buffer, BUILTIN_ERR_VARCHAR, argv[0], *bad_char );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
free( dest );
|
||||
return 1;
|
||||
}
|
||||
|
||||
if( slice && erase && (scope != ENV_USER) )
|
||||
{
|
||||
free( dest );
|
||||
append_format(stderr_buffer, _(L"%ls: Can not specify scope when erasing array slice\n"), argv[0] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
set assignment can work in two modes, either using slices or
|
||||
using the whole array. We detect which mode is used here.
|
||||
*/
|
||||
|
||||
if( slice )
|
||||
{
|
||||
|
||||
/*
|
||||
Slice mode
|
||||
*/
|
||||
size_t idx_count, val_count;
|
||||
wcstring_list_t values;
|
||||
std::vector<long> indexes;
|
||||
wcstring_list_t result;
|
||||
|
||||
const env_var_t dest_str = env_get_string(dest);
|
||||
if (! dest_str.missing())
|
||||
tokenize_variable_array( dest_str, result );
|
||||
|
||||
for( ; woptind<argc; woptind++ )
|
||||
{
|
||||
if( !parse_index( indexes, argv[woptind], dest, result.size() ) )
|
||||
{
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
retcode = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
val_count = argc-woptind-1;
|
||||
idx_count = indexes.size();
|
||||
|
||||
if( !erase )
|
||||
{
|
||||
if( val_count < idx_count )
|
||||
{
|
||||
append_format(stderr_buffer, _(BUILTIN_SET_ARG_COUNT), argv[0] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
retcode=1;
|
||||
break;
|
||||
}
|
||||
if( val_count == idx_count )
|
||||
{
|
||||
woptind++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !retcode )
|
||||
{
|
||||
/*
|
||||
Slice indexes have been calculated, do the actual work
|
||||
*/
|
||||
|
||||
if( erase )
|
||||
{
|
||||
erase_values(result, indexes);
|
||||
my_env_set( dest, result, scope);
|
||||
}
|
||||
else
|
||||
{
|
||||
wcstring_list_t value;
|
||||
// al_init(&value);
|
||||
|
||||
while( woptind < argc )
|
||||
{
|
||||
value.push_back( argv[woptind++] );
|
||||
}
|
||||
|
||||
if( update_values( result,
|
||||
indexes,
|
||||
value ) )
|
||||
{
|
||||
append_format(stderr_buffer, L"%ls: ", argv[0] );
|
||||
append_format(stderr_buffer, ARRAY_BOUNDS_ERR );
|
||||
stderr_buffer.push_back(L'\n');
|
||||
}
|
||||
|
||||
my_env_set(dest, result, scope);
|
||||
|
||||
// al_destroy( &value );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// al_foreach( &result, &free );
|
||||
// al_destroy( &result );
|
||||
|
||||
// al_destroy(&indexes);
|
||||
// al_destroy(&values);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
woptind++;
|
||||
|
||||
/*
|
||||
No slicing
|
||||
*/
|
||||
if( erase )
|
||||
{
|
||||
if( woptind != argc )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
_(L"%ls: Values cannot be specfied with erase\n"),
|
||||
argv[0] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
retcode=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
retcode = env_remove( dest, scope );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wcstring_list_t val;
|
||||
for( i=woptind; i<argc; i++ )
|
||||
val.push_back(argv[i]);
|
||||
retcode = my_env_set( dest, val, scope );
|
||||
}
|
||||
}
|
||||
|
||||
free( dest );
|
||||
|
||||
return retcode;
|
||||
|
||||
}
|
||||
|
||||
745
builtin_test.cpp
745
builtin_test.cpp
@@ -1,745 +0,0 @@
|
||||
/** \file builtin_test.cpp Functions defining the test builtin
|
||||
|
||||
Functions used for implementing the test builtin.
|
||||
Implemented from scratch (yes, really) by way of IEEE 1003.1 as reference.
|
||||
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "common.h"
|
||||
#include "builtin.h"
|
||||
#include "wutil.h"
|
||||
#include "proc.h"
|
||||
#include <sys/stat.h>
|
||||
#include <memory>
|
||||
|
||||
|
||||
enum {
|
||||
BUILTIN_TEST_SUCCESS = STATUS_BUILTIN_OK,
|
||||
BUILTIN_TEST_FAIL = STATUS_BUILTIN_ERROR
|
||||
};
|
||||
|
||||
|
||||
int builtin_test( parser_t &parser, wchar_t **argv );
|
||||
|
||||
static const wchar_t * const condstr[] = {
|
||||
L"!", L"&&", L"||", L"==", L"!=", L"<", L">", L"-nt", L"-ot", L"-ef", L"-eq",
|
||||
L"-ne", L"-lt", L"-gt", L"-le", L"-ge", L"=~"
|
||||
};
|
||||
|
||||
namespace test_expressions {
|
||||
|
||||
enum token_t {
|
||||
test_unknown, // arbitrary string
|
||||
|
||||
test_bang, // "!", inverts sense
|
||||
|
||||
test_filetype_b, // "-b", for block special files
|
||||
test_filetype_c, // "-c" for character special files
|
||||
test_filetype_d, // "-d" for directories
|
||||
test_filetype_e, // "-e" for files that exist
|
||||
test_filetype_f, // "-f" for for regular files
|
||||
test_filetype_g, // "-g" for set-group-id
|
||||
test_filetype_h, // "-h" for symbolic links
|
||||
test_filetype_L, // "-L", same as -h
|
||||
test_filetype_p, // "-p", for FIFO
|
||||
test_filetype_S, // "-S", socket
|
||||
|
||||
test_filesize_s, // "-s", size greater than zero
|
||||
|
||||
test_filedesc_t, // "-t", whether the fd is associated with a terminal
|
||||
|
||||
test_fileperm_r, // "-r", read permission
|
||||
test_fileperm_u, // "-u", whether file is setuid
|
||||
test_fileperm_w, // "-w", whether file write permission is allowed
|
||||
test_fileperm_x, // "-x", whether file execute/search is allowed
|
||||
|
||||
test_string_n, // "-n", non-empty string
|
||||
test_string_z, // "-z", true if length of string is 0
|
||||
test_string_equal, // "=", true if strings are identical
|
||||
test_string_not_equal, // "!=", true if strings are not identical
|
||||
|
||||
test_number_equal, // "-eq", true if numbers are equal
|
||||
test_number_not_equal, // "-ne", true if numbers are not equal
|
||||
test_number_greater, // "-gt", true if first number is larger than second
|
||||
test_number_greater_equal, // "-ge", true if first number is at least second
|
||||
test_number_lesser, // "-lt", true if first number is smaller than second
|
||||
test_number_lesser_equal, // "-le", true if first number is at most second
|
||||
|
||||
test_combine_and, // "-a", true if left and right are both true
|
||||
test_combine_or, // "-o", true if either left or right is true
|
||||
|
||||
test_paren_open, // "(", open paren
|
||||
test_paren_close, // ")", close paren
|
||||
};
|
||||
|
||||
static bool binary_primary_evaluate(test_expressions::token_t token, const wcstring &left, const wcstring &right, wcstring_list_t &errors);
|
||||
static bool unary_primary_evaluate(test_expressions::token_t token, const wcstring &arg, wcstring_list_t &errors);
|
||||
|
||||
|
||||
enum {
|
||||
UNARY_PRIMARY = 1 << 0,
|
||||
BINARY_PRIMARY = 1 << 1
|
||||
};
|
||||
|
||||
static const struct token_info_t { token_t tok; const wchar_t *string; unsigned int flags; } token_infos[] =
|
||||
{
|
||||
{test_unknown, L"", 0},
|
||||
{test_bang, L"!", 0},
|
||||
{test_filetype_b, L"-b", UNARY_PRIMARY},
|
||||
{test_filetype_c, L"-c", UNARY_PRIMARY},
|
||||
{test_filetype_d, L"-d", UNARY_PRIMARY},
|
||||
{test_filetype_e, L"-e", UNARY_PRIMARY},
|
||||
{test_filetype_f, L"-f", UNARY_PRIMARY},
|
||||
{test_filetype_g, L"-g", UNARY_PRIMARY},
|
||||
{test_filetype_h, L"-h", UNARY_PRIMARY},
|
||||
{test_filetype_L, L"-L", UNARY_PRIMARY},
|
||||
{test_filetype_p, L"-p", UNARY_PRIMARY},
|
||||
{test_filetype_S, L"-S", UNARY_PRIMARY},
|
||||
{test_filesize_s, L"-s", UNARY_PRIMARY},
|
||||
{test_filedesc_t, L"-t", UNARY_PRIMARY},
|
||||
{test_fileperm_r, L"-r", UNARY_PRIMARY},
|
||||
{test_fileperm_u, L"-u", UNARY_PRIMARY},
|
||||
{test_fileperm_w, L"-w", UNARY_PRIMARY},
|
||||
{test_fileperm_x, L"-x", UNARY_PRIMARY},
|
||||
{test_string_n, L"-n", UNARY_PRIMARY},
|
||||
{test_string_z, L"-z", UNARY_PRIMARY},
|
||||
{test_string_equal, L"=", BINARY_PRIMARY},
|
||||
{test_string_not_equal, L"!=", BINARY_PRIMARY},
|
||||
{test_number_equal, L"-eq", BINARY_PRIMARY},
|
||||
{test_number_not_equal, L"-ne", BINARY_PRIMARY},
|
||||
{test_number_greater, L"-gt", BINARY_PRIMARY},
|
||||
{test_number_greater_equal, L"-ge", BINARY_PRIMARY},
|
||||
{test_number_lesser, L"-lt", BINARY_PRIMARY},
|
||||
{test_number_lesser_equal, L"-le", BINARY_PRIMARY},
|
||||
{test_combine_and, L"-a", 0},
|
||||
{test_combine_or, L"-o", 0},
|
||||
{test_paren_open, L"(", 0},
|
||||
{test_paren_close, L")", 0}
|
||||
};
|
||||
|
||||
const token_info_t *token_for_string(const wcstring &str) {
|
||||
for (size_t i=0; i < sizeof token_infos / sizeof *token_infos; i++) {
|
||||
if (str == token_infos[i].string) {
|
||||
return &token_infos[i];
|
||||
}
|
||||
}
|
||||
return &token_infos[0]; //unknown
|
||||
}
|
||||
|
||||
|
||||
/* Grammar.
|
||||
|
||||
<expr> = <combining_expr>
|
||||
|
||||
<combining_expr> = <unary_expr> and/or <combining_expr> |
|
||||
<unary_expr>
|
||||
|
||||
<unary_expr> = bang <unary_expr> |
|
||||
<primary>
|
||||
|
||||
<primary> = <unary_primary> arg |
|
||||
arg <binary_primary> arg |
|
||||
'(' <expr> ')'
|
||||
|
||||
*/
|
||||
|
||||
class expression;
|
||||
class test_parser {
|
||||
private:
|
||||
wcstring_list_t strings;
|
||||
wcstring_list_t errors;
|
||||
|
||||
expression *error(const wchar_t *fmt, ...);
|
||||
void add_error(const wchar_t *fmt, ...);
|
||||
|
||||
const wcstring &arg(unsigned int idx) { return strings.at(idx); }
|
||||
|
||||
public:
|
||||
test_parser(const wcstring_list_t &val) : strings(val)
|
||||
{ }
|
||||
|
||||
expression *parse_expression(unsigned int start, unsigned int end);
|
||||
expression *parse_combining_expression(unsigned int start, unsigned int end);
|
||||
expression *parse_unary_expression(unsigned int start, unsigned int end);
|
||||
|
||||
expression *parse_primary(unsigned int start, unsigned int end);
|
||||
expression *parse_parenthentical(unsigned int start, unsigned int end);
|
||||
expression *parse_unary_primary(unsigned int start, unsigned int end);
|
||||
expression *parse_binary_primary(unsigned int start, unsigned int end);
|
||||
expression *parse_just_a_string(unsigned int start, unsigned int end);
|
||||
|
||||
static expression *parse_args(const wcstring_list_t &args, wcstring &err);
|
||||
};
|
||||
|
||||
struct range_t {
|
||||
unsigned int start;
|
||||
unsigned int end;
|
||||
|
||||
range_t(unsigned s, unsigned e) : start(s), end(e) { }
|
||||
};
|
||||
|
||||
|
||||
/* Base class for expressions */
|
||||
class expression {
|
||||
protected:
|
||||
expression(token_t what, range_t where) : token(what), range(where) { }
|
||||
|
||||
public:
|
||||
const token_t token;
|
||||
range_t range;
|
||||
|
||||
virtual ~expression() { }
|
||||
|
||||
// evaluate returns true if the expression is true (i.e. BUILTIN_TEST_SUCCESS)
|
||||
virtual bool evaluate(wcstring_list_t &errors) = 0;
|
||||
};
|
||||
|
||||
typedef std::auto_ptr<expression> expr_ref_t;
|
||||
|
||||
/* Single argument like -n foo or "just a string" */
|
||||
class unary_primary : public expression {
|
||||
public:
|
||||
wcstring arg;
|
||||
unary_primary(token_t tok, range_t where, const wcstring &what) : expression(tok, where), arg(what) { }
|
||||
bool evaluate(wcstring_list_t &errors);
|
||||
};
|
||||
|
||||
/* Two argument primary like foo != bar */
|
||||
class binary_primary : public expression {
|
||||
public:
|
||||
wcstring arg_left;
|
||||
wcstring arg_right;
|
||||
|
||||
binary_primary(token_t tok, range_t where, const wcstring &left, const wcstring &right) : expression(tok, where), arg_left(left), arg_right(right)
|
||||
{ }
|
||||
bool evaluate(wcstring_list_t &errors);
|
||||
};
|
||||
|
||||
/* Unary operator like bang */
|
||||
class unary_operator : public expression {
|
||||
public:
|
||||
expr_ref_t subject;
|
||||
unary_operator(token_t tok, range_t where, expr_ref_t &exp) : expression(tok, where), subject(exp) { }
|
||||
bool evaluate(wcstring_list_t &errors);
|
||||
};
|
||||
|
||||
/* Combining expression. Contains a list of AND or OR expressions. It takes more than two so that we don't have to worry about precedence in the parser. */
|
||||
class combining_expression : public expression {
|
||||
public:
|
||||
const std::vector<expression *> subjects;
|
||||
const std::vector<token_t> combiners;
|
||||
|
||||
combining_expression(token_t tok, range_t where, const std::vector<expression *> &exprs, const std::vector<token_t> &combs) : expression(tok, where), subjects(exprs), combiners(combs)
|
||||
{
|
||||
/* We should have one more subject than combiner */
|
||||
assert(subjects.size() == combiners.size() + 1);
|
||||
}
|
||||
|
||||
/* We are responsible for destroying our expressions */
|
||||
virtual ~combining_expression() {
|
||||
for (size_t i=0; i < subjects.size(); i++) {
|
||||
delete subjects[i];
|
||||
}
|
||||
}
|
||||
|
||||
bool evaluate(wcstring_list_t &errors);
|
||||
};
|
||||
|
||||
/* Parenthetical expression */
|
||||
class parenthetical_expression : public expression {
|
||||
public:
|
||||
expr_ref_t contents;
|
||||
parenthetical_expression(token_t tok, range_t where, expr_ref_t &expr) : expression(tok, where), contents(expr) { }
|
||||
|
||||
virtual bool evaluate(wcstring_list_t &errors);
|
||||
};
|
||||
|
||||
void test_parser::add_error(const wchar_t *fmt, ...) {
|
||||
assert(fmt != NULL);
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
this->errors.push_back(vformat_string(fmt, va));
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
expression *test_parser::error(const wchar_t *fmt, ...) {
|
||||
assert(fmt != NULL);
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
this->errors.push_back(vformat_string(fmt, va));
|
||||
va_end(va);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
expression *test_parser::parse_unary_expression(unsigned int start, unsigned int end) {
|
||||
if (start >= end) {
|
||||
return error(L"Missing argument at index %u", start);
|
||||
}
|
||||
token_t tok = token_for_string(arg(start))->tok;
|
||||
if (tok == test_bang) {
|
||||
expr_ref_t subject(parse_unary_expression(start + 1, end));
|
||||
if (subject.get()) {
|
||||
return new unary_operator(tok, range_t(start, subject->range.end), subject);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
return parse_primary(start, end);
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse a combining expression (AND, OR) */
|
||||
expression *test_parser::parse_combining_expression(unsigned int start, unsigned int end) {
|
||||
if (start >= end)
|
||||
return NULL;
|
||||
|
||||
std::vector<expression *> subjects;
|
||||
std::vector<token_t> combiners;
|
||||
unsigned int idx = start;
|
||||
|
||||
while (idx < end) {
|
||||
|
||||
if (! subjects.empty()) {
|
||||
/* This is not the first expression, so we expect a combiner. */
|
||||
token_t combiner = token_for_string(arg(idx))->tok;
|
||||
if (combiner != test_combine_and && combiner != test_combine_or) {
|
||||
/* Not a combiner, we're done */
|
||||
break;
|
||||
}
|
||||
combiners.push_back(combiner);
|
||||
idx++;
|
||||
}
|
||||
|
||||
/* Parse another expression */
|
||||
expression *expr = parse_unary_expression(idx, end);
|
||||
if (! expr) {
|
||||
add_error(L"Missing argument at index %u", idx);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Go to the end of this expression */
|
||||
idx = expr->range.end;
|
||||
subjects.push_back(expr);
|
||||
}
|
||||
|
||||
if (! subjects.empty()) {
|
||||
/* Our new expression takes ownership of all expressions we created. The token we pass is irrelevant. */
|
||||
return new combining_expression(test_combine_and, range_t(start, idx), subjects, combiners);
|
||||
} else {
|
||||
/* No subjects */
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
expression *test_parser::parse_unary_primary(unsigned int start, unsigned int end) {
|
||||
/* We need two arguments */
|
||||
if (start >= end) {
|
||||
return error(L"Missing argument at index %u", start);
|
||||
}
|
||||
if (start + 1 >= end) {
|
||||
return error(L"Missing argument at index %u", start + 1);
|
||||
}
|
||||
|
||||
/* All our unary primaries are prefix, so the operator is at start. */
|
||||
const token_info_t *info = token_for_string(arg(start));
|
||||
if (! (info->flags & UNARY_PRIMARY))
|
||||
return NULL;
|
||||
|
||||
return new unary_primary(info->tok, range_t(start, start + 2), arg(start + 1));
|
||||
}
|
||||
|
||||
expression *test_parser::parse_just_a_string(unsigned int start, unsigned int end) {
|
||||
/* Handle a string as a unary primary that is not a token of any other type.
|
||||
e.g. 'test foo -a bar' should evaluate to true
|
||||
We handle this with a unary primary of test_string_n
|
||||
*/
|
||||
|
||||
/* We need one arguments */
|
||||
if (start >= end) {
|
||||
return error(L"Missing argument at index %u", start);
|
||||
}
|
||||
|
||||
const token_info_t *info = token_for_string(arg(start));
|
||||
if (info->tok != test_unknown) {
|
||||
return error(L"Unexpected argument type at index %u", start);
|
||||
}
|
||||
|
||||
/* This is hackish; a nicer way to implement this would be with a "just a string" expression type */
|
||||
return new unary_primary(test_string_n, range_t(start, start + 1), arg(start));
|
||||
}
|
||||
|
||||
#if 0
|
||||
expression *test_parser::parse_unary_primary(unsigned int start, unsigned int end) {
|
||||
/* We need either one or two arguments */
|
||||
if (start >= end) {
|
||||
return error(L"Missing argument at index %u", start);
|
||||
}
|
||||
|
||||
/* The index of the argument to the unary primary */
|
||||
unsigned int arg_idx;
|
||||
|
||||
/* All our unary primaries are prefix, so any operator is at start. But it also may just be a string, with no operator. */
|
||||
const token_info_t *info = token_for_string(arg(start));
|
||||
if (info->flags & UNARY_PRIMARY) {
|
||||
/* We have an operator. Skip the operator argument */
|
||||
arg_idx = start + 1;
|
||||
|
||||
/* We have some freedom here...do we allow other tokens for the argument to operate on?
|
||||
For example, should 'test -n =' work? I say yes. So no typechecking on the next token. */
|
||||
|
||||
} else if (info->tok == test_unknown) {
|
||||
/* "Just a string. */
|
||||
arg_idx = start;
|
||||
} else {
|
||||
/* Here we don't allow arbitrary tokens as "just a string." I.e. 'test = -a =' should have a parse error. We could relax this at some point. */
|
||||
return error(L"Parse error at argument index %u", start);
|
||||
}
|
||||
|
||||
/* Verify we have the argument we want, i.e. test -n should fail to parse */
|
||||
if (arg_idx >= end) {
|
||||
return error(L"Missing argument at index %u", arg_idx);
|
||||
}
|
||||
|
||||
return new unary_primary(info->tok, range_t(start, arg_idx + 1), arg(arg_idx));
|
||||
}
|
||||
#endif
|
||||
|
||||
expression *test_parser::parse_binary_primary(unsigned int start, unsigned int end) {
|
||||
/* We need three arguments */
|
||||
for (unsigned int idx = start; idx < start + 3; idx++) {
|
||||
if (idx >= end) {
|
||||
return error(L"Missing argument at index %u", idx);
|
||||
}
|
||||
}
|
||||
|
||||
/* All our binary primaries are infix, so the operator is at start + 1. */
|
||||
const token_info_t *info = token_for_string(arg(start + 1));
|
||||
if (! (info->flags & BINARY_PRIMARY))
|
||||
return NULL;
|
||||
|
||||
return new binary_primary(info->tok, range_t(start, start + 3), arg(start), arg(start + 2));
|
||||
}
|
||||
|
||||
expression *test_parser::parse_parenthentical(unsigned int start, unsigned int end) {
|
||||
/* We need at least three arguments: open paren, argument, close paren */
|
||||
if (start + 3 >= end)
|
||||
return NULL;
|
||||
|
||||
/* Must start with an open expression */
|
||||
const token_info_t *open_paren = token_for_string(arg(start));
|
||||
if (open_paren->tok != test_paren_open)
|
||||
return NULL;
|
||||
|
||||
/* Parse a subexpression */
|
||||
expression *subexr_ptr = parse_expression(start + 1, end);
|
||||
if (! subexr_ptr)
|
||||
return NULL;
|
||||
expr_ref_t subexpr(subexr_ptr);
|
||||
|
||||
/* Parse a close paren */
|
||||
unsigned close_index = subexpr->range.end;
|
||||
assert(close_index <= end);
|
||||
if (close_index == end) {
|
||||
return error(L"Missing close paren at index %u", close_index);
|
||||
}
|
||||
const token_info_t *close_paren = token_for_string(arg(close_index));
|
||||
if (close_paren->tok != test_paren_close) {
|
||||
return error(L"Expected close paren at index %u", close_index);
|
||||
}
|
||||
|
||||
/* Success */
|
||||
return new parenthetical_expression(test_paren_open, range_t(start, close_index+1), subexpr);
|
||||
}
|
||||
|
||||
expression *test_parser::parse_primary(unsigned int start, unsigned int end) {
|
||||
if (start >= end) {
|
||||
return error(L"Missing argument at index %u", start);
|
||||
}
|
||||
|
||||
expression *expr = NULL;
|
||||
if (! expr) expr = parse_parenthentical(start, end);
|
||||
if (! expr) expr = parse_unary_primary(start, end);
|
||||
if (! expr) expr = parse_binary_primary(start, end);
|
||||
if (! expr) expr = parse_just_a_string(start, end);
|
||||
return expr;
|
||||
}
|
||||
|
||||
expression *test_parser::parse_expression(unsigned int start, unsigned int end) {
|
||||
if (start >= end) {
|
||||
return error(L"Missing argument at index %u", start);
|
||||
}
|
||||
|
||||
return parse_combining_expression(start, end);
|
||||
}
|
||||
|
||||
expression *test_parser::parse_args(const wcstring_list_t &args, wcstring &err) {
|
||||
/* Empty list and one-arg list should be handled by caller */
|
||||
assert(args.size() > 1);
|
||||
|
||||
test_parser parser(args);
|
||||
expression *result = parser.parse_expression(0, (unsigned int)args.size());
|
||||
|
||||
/* Handle errors */
|
||||
bool errored = false;
|
||||
for (size_t i = 0; i < parser.errors.size(); i++) {
|
||||
err.append(L"test: ");
|
||||
err.append(parser.errors.at(i));
|
||||
err.push_back(L'\n');
|
||||
errored = true;
|
||||
// For now we only show the first error
|
||||
break;
|
||||
}
|
||||
|
||||
if (! errored && result) {
|
||||
/* It's also an error if there are any unused arguments. This is not detected by parse_expression() */
|
||||
assert(result->range.end <= args.size());
|
||||
if (result->range.end < args.size()) {
|
||||
append_format(err, L"test: unexpected argument at index %lu: '%ls'\n", (unsigned long)result->range.end, args.at(result->range.end).c_str());
|
||||
delete result;
|
||||
result = NULL;
|
||||
errored = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool unary_primary::evaluate(wcstring_list_t &errors) {
|
||||
return unary_primary_evaluate(token, arg, errors);
|
||||
}
|
||||
|
||||
bool binary_primary::evaluate(wcstring_list_t &errors) {
|
||||
return binary_primary_evaluate(token, arg_left, arg_right, errors);
|
||||
}
|
||||
|
||||
bool unary_operator::evaluate(wcstring_list_t &errors) {
|
||||
switch (token) {
|
||||
case test_bang:
|
||||
assert(subject.get());
|
||||
return ! subject->evaluate(errors);
|
||||
default:
|
||||
errors.push_back(format_string(L"Unknown token type in %s", __func__));
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
bool combining_expression::evaluate(wcstring_list_t &errors) {
|
||||
switch (token) {
|
||||
case test_combine_and:
|
||||
case test_combine_or:
|
||||
{
|
||||
/* One-element case */
|
||||
if (subjects.size() == 1)
|
||||
return subjects.at(0)->evaluate(errors);
|
||||
|
||||
/* Evaluate our lists, remembering that AND has higher precedence than OR. We can visualize this as a sequence of OR expressions of AND expressions. */
|
||||
assert(combiners.size() + 1 == subjects.size());
|
||||
assert(! subjects.empty());
|
||||
|
||||
size_t idx = 0, max = subjects.size();
|
||||
bool or_result = false;
|
||||
while (idx < max) {
|
||||
if (or_result) {
|
||||
/* Short circuit */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Evaluate a stream of AND starting at given subject index. It may only have one element. */
|
||||
bool and_result = true;
|
||||
for (; idx < max; idx++) {
|
||||
/* Evaluate it, short-circuiting */
|
||||
and_result = and_result && subjects.at(idx)->evaluate(errors);
|
||||
|
||||
/* If the combiner at this index (which corresponding to how we combine with the next subject) is not AND, then exit the loop */
|
||||
if (idx + 1 < max && combiners.at(idx) != test_combine_and) {
|
||||
idx++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* OR it in */
|
||||
or_result = or_result || and_result;
|
||||
}
|
||||
return or_result;
|
||||
}
|
||||
|
||||
default:
|
||||
errors.push_back(format_string(L"Unknown token type in %s", __func__));
|
||||
return BUILTIN_TEST_FAIL;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
bool parenthetical_expression::evaluate(wcstring_list_t &errors) {
|
||||
return contents->evaluate(errors);
|
||||
}
|
||||
|
||||
/* IEEE 1003.1 says nothing about what it means for two strings to be "algebraically equal". For example, should we interpret 0x10 as 0, 10, or 16? Here we use only base 10 and use wcstoll, which allows for leading + and -, and leading whitespace. This matches bash. */
|
||||
static bool parse_number(const wcstring &arg, long long *out) {
|
||||
const wchar_t *str = arg.c_str();
|
||||
wchar_t *endptr = NULL;
|
||||
*out = wcstoll(str, &endptr, 10);
|
||||
return endptr && *endptr == L'\0';
|
||||
}
|
||||
|
||||
static bool binary_primary_evaluate(test_expressions::token_t token, const wcstring &left, const wcstring &right, wcstring_list_t &errors) {
|
||||
using namespace test_expressions;
|
||||
long long left_num, right_num;
|
||||
switch (token) {
|
||||
case test_string_equal:
|
||||
return left == right;
|
||||
|
||||
case test_string_not_equal:
|
||||
return left != right;
|
||||
|
||||
case test_number_equal:
|
||||
return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num == right_num;
|
||||
|
||||
case test_number_not_equal:
|
||||
return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num != right_num;
|
||||
|
||||
case test_number_greater:
|
||||
return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num > right_num;
|
||||
|
||||
case test_number_greater_equal:
|
||||
return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num >= right_num;
|
||||
|
||||
case test_number_lesser:
|
||||
return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num < right_num;
|
||||
|
||||
case test_number_lesser_equal:
|
||||
return parse_number(left, &left_num) && parse_number(right, &right_num) && left_num <= right_num;
|
||||
|
||||
default:
|
||||
errors.push_back(format_string(L"Unknown token type in %s", __func__));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static bool unary_primary_evaluate(test_expressions::token_t token, const wcstring &arg, wcstring_list_t &errors) {
|
||||
using namespace test_expressions;
|
||||
struct stat buf;
|
||||
long long num;
|
||||
switch (token) {
|
||||
case test_filetype_b: // "-b", for block special files
|
||||
return !wstat(arg, &buf) && S_ISBLK(buf.st_mode);
|
||||
|
||||
case test_filetype_c: // "-c" for character special files
|
||||
return !wstat(arg, &buf) && S_ISCHR(buf.st_mode);
|
||||
|
||||
case test_filetype_d: // "-d" for directories
|
||||
return !wstat(arg, &buf) && S_ISDIR(buf.st_mode);
|
||||
|
||||
case test_filetype_e: // "-e" for files that exist
|
||||
return !wstat(arg, &buf);
|
||||
|
||||
case test_filetype_f: // "-f" for for regular files
|
||||
return !wstat(arg, &buf) && S_ISREG(buf.st_mode);
|
||||
|
||||
case test_filetype_g: // "-g" for set-group-id
|
||||
return !wstat(arg, &buf) && (S_ISGID & buf.st_mode);
|
||||
|
||||
case test_filetype_h: // "-h" for symbolic links
|
||||
case test_filetype_L: // "-L", same as -h
|
||||
return !lwstat(arg, &buf) && S_ISLNK(buf.st_mode);
|
||||
|
||||
case test_filetype_p: // "-p", for FIFO
|
||||
return !wstat(arg, &buf) && S_ISFIFO(buf.st_mode);
|
||||
|
||||
case test_filetype_S: // "-S", socket
|
||||
return !wstat(arg, &buf) && S_ISSOCK(buf.st_mode);
|
||||
|
||||
case test_filesize_s: // "-s", size greater than zero
|
||||
return !wstat(arg, &buf) && buf.st_size > 0;
|
||||
|
||||
case test_filedesc_t: // "-t", whether the fd is associated with a terminal
|
||||
return parse_number(arg, &num) && num == (int)num && isatty((int)num);
|
||||
|
||||
case test_fileperm_r: // "-r", read permission
|
||||
return !waccess(arg, R_OK);
|
||||
|
||||
case test_fileperm_u: // "-u", whether file is setuid
|
||||
return !wstat(arg, &buf) && (S_ISUID & buf.st_mode);
|
||||
|
||||
case test_fileperm_w: // "-w", whether file write permission is allowed
|
||||
return !waccess(arg, W_OK);
|
||||
|
||||
case test_fileperm_x: // "-x", whether file execute/search is allowed
|
||||
return !waccess(arg, X_OK);
|
||||
|
||||
case test_string_n: // "-n", non-empty string
|
||||
return ! arg.empty();
|
||||
|
||||
case test_string_z: // "-z", true if length of string is 0
|
||||
return arg.empty();
|
||||
|
||||
default:
|
||||
errors.push_back(format_string(L"Unknown token type in %s", __func__));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Evaluate a conditional expression given the arguments.
|
||||
* If fromtest is set, the caller is the test or [ builtin;
|
||||
* with the pointer giving the name of the command.
|
||||
* for POSIX conformance this supports a more limited range
|
||||
* of functionality.
|
||||
*
|
||||
* Return status is the final shell status, i.e. 0 for true,
|
||||
* 1 for false and 2 for error.
|
||||
*/
|
||||
int builtin_test( parser_t &parser, wchar_t **argv )
|
||||
{
|
||||
using namespace test_expressions;
|
||||
|
||||
/* The first argument should be the name of the command ('test') */
|
||||
if (! argv[0])
|
||||
return BUILTIN_TEST_FAIL;
|
||||
|
||||
size_t argc = 0;
|
||||
while (argv[argc + 1])
|
||||
argc++;
|
||||
const wcstring_list_t args(argv + 1, argv + 1 + argc);
|
||||
|
||||
if (argc == 0) {
|
||||
// Per 1003.1, exit false
|
||||
return BUILTIN_TEST_FAIL;
|
||||
} else if (argc == 1) {
|
||||
// Per 1003.1, exit true if the arg is non-empty
|
||||
return args.at(0).empty() ? BUILTIN_TEST_FAIL : BUILTIN_TEST_SUCCESS;
|
||||
} else {
|
||||
// Try parsing. If expr is not nil, we are responsible for deleting it.
|
||||
wcstring err;
|
||||
expression *expr = test_parser::parse_args(args, err);
|
||||
if (! expr) {
|
||||
#if 0
|
||||
printf("Oops! test was given args:\n");
|
||||
for (size_t i=0; i < argc; i++) {
|
||||
printf("\t%ls\n", args.at(i).c_str());
|
||||
}
|
||||
printf("and returned parse error: %ls\n", err.c_str());
|
||||
#endif
|
||||
builtin_show_error(err);
|
||||
return BUILTIN_TEST_FAIL;
|
||||
} else {
|
||||
wcstring_list_t eval_errors;
|
||||
bool result = expr->evaluate(eval_errors);
|
||||
if (! eval_errors.empty()) {
|
||||
printf("test returned eval errors:\n");
|
||||
for (size_t i=0; i < eval_errors.size(); i++) {
|
||||
printf("\t%ls\n", eval_errors.at(i).c_str());
|
||||
}
|
||||
}
|
||||
delete expr;
|
||||
return result ? BUILTIN_TEST_SUCCESS : BUILTIN_TEST_FAIL;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -1,512 +0,0 @@
|
||||
/** \file builtin_ulimit.c Functions defining the ulimit builtin
|
||||
|
||||
Functions used for implementing the ulimit builtin.
|
||||
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "fallback.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "builtin.h"
|
||||
#include "common.h"
|
||||
#include "wgetopt.h"
|
||||
|
||||
|
||||
/**
|
||||
Struct describing a resource limit
|
||||
*/
|
||||
struct resource_t
|
||||
{
|
||||
/**
|
||||
Resource id
|
||||
*/
|
||||
int resource;
|
||||
/**
|
||||
Description of resource
|
||||
*/
|
||||
const wchar_t *desc;
|
||||
/**
|
||||
Switch used on commandline to specify resource
|
||||
*/
|
||||
wchar_t switch_char;
|
||||
/**
|
||||
The implicit multiplier used when setting getting values
|
||||
*/
|
||||
int multiplier;
|
||||
}
|
||||
;
|
||||
|
||||
/**
|
||||
Array of resource_t structs, describing all known resource types.
|
||||
*/
|
||||
static const struct resource_t resource_arr[] =
|
||||
{
|
||||
{
|
||||
RLIMIT_CORE, L"Maximum size of core files created", L'c', 1024
|
||||
}
|
||||
,
|
||||
{
|
||||
RLIMIT_DATA, L"Maximum size of a process’s data segment", L'd', 1024
|
||||
}
|
||||
,
|
||||
{
|
||||
RLIMIT_FSIZE, L"Maximum size of files created by the shell", L'f', 1024
|
||||
}
|
||||
,
|
||||
#ifdef RLIMIT_MEMLOCK
|
||||
{
|
||||
RLIMIT_MEMLOCK, L"Maximum size that may be locked into memory", L'l', 1024
|
||||
}
|
||||
,
|
||||
#endif
|
||||
#ifdef RLIMIT_RSS
|
||||
{
|
||||
RLIMIT_RSS, L"Maximum resident set size", L'm', 1024
|
||||
}
|
||||
,
|
||||
#endif
|
||||
{
|
||||
RLIMIT_NOFILE, L"Maximum number of open file descriptors", L'n', 1
|
||||
}
|
||||
,
|
||||
{
|
||||
RLIMIT_STACK, L"Maximum stack size", L's', 1024
|
||||
}
|
||||
,
|
||||
{
|
||||
RLIMIT_CPU, L"Maximum amount of cpu time in seconds", L't', 1
|
||||
}
|
||||
,
|
||||
#ifdef RLIMIT_NPROC
|
||||
{
|
||||
RLIMIT_NPROC, L"Maximum number of processes available to a single user", L'u', 1
|
||||
}
|
||||
,
|
||||
#endif
|
||||
#ifdef RLIMIT_AS
|
||||
{
|
||||
RLIMIT_AS, L"Maximum amount of virtual memory available to the shell", L'v', 1024
|
||||
}
|
||||
,
|
||||
#endif
|
||||
{
|
||||
0, 0, 0, 0
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
/**
|
||||
Get the implicit multiplication factor for the specified resource limit
|
||||
*/
|
||||
static int get_multiplier( int what )
|
||||
{
|
||||
int i;
|
||||
|
||||
for( i=0; resource_arr[i].desc; i++ )
|
||||
{
|
||||
if( resource_arr[i].resource == what )
|
||||
{
|
||||
return resource_arr[i].multiplier;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
Return the value for the specified resource limit. This function
|
||||
does _not_ multiply the limit value by the multiplier constant used
|
||||
by the commandline ulimit.
|
||||
*/
|
||||
static rlim_t get( int resource, int hard )
|
||||
{
|
||||
struct rlimit ls;
|
||||
|
||||
getrlimit( resource, &ls );
|
||||
|
||||
return hard ? ls.rlim_max:ls.rlim_cur;
|
||||
}
|
||||
|
||||
/**
|
||||
Print the value of the specified resource limit
|
||||
*/
|
||||
static void print( int resource, int hard )
|
||||
{
|
||||
rlim_t l = get( resource, hard );
|
||||
|
||||
if( l == RLIM_INFINITY )
|
||||
stdout_buffer.append( L"unlimited\n" );
|
||||
else
|
||||
append_format(stdout_buffer, L"%d\n", l / get_multiplier( resource ) );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
Print values of all resource limits
|
||||
*/
|
||||
static void print_all( int hard )
|
||||
{
|
||||
int i;
|
||||
int w=0;
|
||||
|
||||
for( i=0; resource_arr[i].desc; i++ )
|
||||
{
|
||||
w=maxi( w, my_wcswidth(resource_arr[i].desc));
|
||||
}
|
||||
|
||||
for( i=0; resource_arr[i].desc; i++ )
|
||||
{
|
||||
struct rlimit ls;
|
||||
rlim_t l;
|
||||
getrlimit( resource_arr[i].resource, &ls );
|
||||
l = hard ? ls.rlim_max:ls.rlim_cur;
|
||||
|
||||
const wchar_t *unit = ((resource_arr[i].resource==RLIMIT_CPU)?L"(seconds, ":(get_multiplier(resource_arr[i].resource)==1?L"(":L"(kB, "));
|
||||
|
||||
append_format(stdout_buffer,
|
||||
L"%-*ls %10ls-%lc) ",
|
||||
w,
|
||||
resource_arr[i].desc,
|
||||
unit,
|
||||
resource_arr[i].switch_char);
|
||||
|
||||
if( l == RLIM_INFINITY )
|
||||
{
|
||||
stdout_buffer.append( L"unlimited\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
append_format(stdout_buffer, L"%d\n", l/get_multiplier(resource_arr[i].resource) );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
Returns the description for the specified resource limit
|
||||
*/
|
||||
static const wchar_t *get_desc( int what )
|
||||
{
|
||||
int i;
|
||||
|
||||
for( i=0; resource_arr[i].desc; i++ )
|
||||
{
|
||||
if( resource_arr[i].resource == what )
|
||||
{
|
||||
return resource_arr[i].desc;
|
||||
}
|
||||
}
|
||||
return L"Not a resource";
|
||||
}
|
||||
|
||||
/**
|
||||
Set the new value of the specified resource limit. This function
|
||||
does _not_ multiply the limit value by the multiplier constant used
|
||||
by the commandline ulimit.
|
||||
*/
|
||||
static int set( int resource, int hard, int soft, rlim_t value )
|
||||
{
|
||||
struct rlimit ls;
|
||||
getrlimit( resource, &ls );
|
||||
|
||||
if( hard )
|
||||
{
|
||||
ls.rlim_max = value;
|
||||
}
|
||||
|
||||
if( soft )
|
||||
{
|
||||
ls.rlim_cur = value;
|
||||
|
||||
/*
|
||||
Do not attempt to set the soft limit higher than the hard limit
|
||||
*/
|
||||
if( ( value == RLIM_INFINITY && ls.rlim_max != RLIM_INFINITY ) ||
|
||||
( value != RLIM_INFINITY && ls.rlim_max != RLIM_INFINITY && value > ls.rlim_max))
|
||||
{
|
||||
ls.rlim_cur = ls.rlim_max;
|
||||
}
|
||||
}
|
||||
|
||||
if( setrlimit( resource, &ls ) )
|
||||
{
|
||||
if( errno == EPERM )
|
||||
append_format(stderr_buffer, L"ulimit: Permission denied when changing resource of type '%ls'\n", get_desc( resource ) );
|
||||
else
|
||||
builtin_wperror( L"ulimit" );
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
The ulimit builtin, used for setting resource limits. Defined in
|
||||
builtin_ulimit.c.
|
||||
*/
|
||||
static int builtin_ulimit( parser_t &parser, wchar_t ** argv )
|
||||
{
|
||||
int hard=0;
|
||||
int soft=0;
|
||||
|
||||
int what = RLIMIT_FSIZE;
|
||||
int report_all = 0;
|
||||
|
||||
int argc = builtin_count_args( argv );
|
||||
|
||||
woptind=0;
|
||||
|
||||
while( 1 )
|
||||
{
|
||||
static const struct woption
|
||||
long_options[] =
|
||||
{
|
||||
{
|
||||
L"all", no_argument, 0, 'a'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"hard", no_argument, 0, 'H'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"soft", no_argument, 0, 'S'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"core-size", no_argument, 0, 'c'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"data-size", no_argument, 0, 'd'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"file-size", no_argument, 0, 'f'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"lock-size", no_argument, 0, 'l'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"resident-set-size", no_argument, 0, 'm'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"file-descriptor-count", no_argument, 0, 'n'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"stack-size", no_argument, 0, 's'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"cpu-time", no_argument, 0, 't'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"process-count", no_argument, 0, 'u'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"virtual-memory-size", no_argument, 0, 'v'
|
||||
}
|
||||
,
|
||||
{
|
||||
L"help", no_argument, 0, 'h'
|
||||
}
|
||||
,
|
||||
{
|
||||
0, 0, 0, 0
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
int opt_index = 0;
|
||||
|
||||
int opt = wgetopt_long( argc,
|
||||
argv,
|
||||
L"aHScdflmnstuvh",
|
||||
long_options,
|
||||
&opt_index );
|
||||
if( opt == -1 )
|
||||
break;
|
||||
|
||||
switch( opt )
|
||||
{
|
||||
case 0:
|
||||
if(long_options[opt_index].flag != 0)
|
||||
break;
|
||||
append_format(stderr_buffer,
|
||||
BUILTIN_ERR_UNKNOWN,
|
||||
argv[0],
|
||||
long_options[opt_index].name );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
|
||||
return 1;
|
||||
|
||||
case L'a':
|
||||
report_all=1;
|
||||
break;
|
||||
|
||||
case L'H':
|
||||
hard=1;
|
||||
break;
|
||||
|
||||
case L'S':
|
||||
soft=1;
|
||||
break;
|
||||
|
||||
case L'c':
|
||||
what=RLIMIT_CORE;
|
||||
break;
|
||||
|
||||
case L'd':
|
||||
what=RLIMIT_DATA;
|
||||
break;
|
||||
|
||||
case L'f':
|
||||
what=RLIMIT_FSIZE;
|
||||
break;
|
||||
#ifdef RLIMIT_MEMLOCK
|
||||
case L'l':
|
||||
what=RLIMIT_MEMLOCK;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef RLIMIT_RSS
|
||||
case L'm':
|
||||
what=RLIMIT_RSS;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case L'n':
|
||||
what=RLIMIT_NOFILE;
|
||||
break;
|
||||
|
||||
case L's':
|
||||
what=RLIMIT_STACK;
|
||||
break;
|
||||
|
||||
case L't':
|
||||
what=RLIMIT_CPU;
|
||||
break;
|
||||
|
||||
#ifdef RLIMIT_NPROC
|
||||
case L'u':
|
||||
what=RLIMIT_NPROC;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef RLIMIT_AS
|
||||
case L'v':
|
||||
what=RLIMIT_AS;
|
||||
break;
|
||||
#endif
|
||||
|
||||
case L'h':
|
||||
builtin_print_help( parser, argv[0], stdout_buffer );
|
||||
return 0;
|
||||
|
||||
case L'?':
|
||||
builtin_unknown_option( parser, argv[0], argv[woptind-1] );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if( report_all )
|
||||
{
|
||||
if( argc - woptind == 0 )
|
||||
{
|
||||
print_all( hard );
|
||||
}
|
||||
else
|
||||
{
|
||||
stderr_buffer.append(argv[0]);
|
||||
stderr_buffer.append(L": Too many arguments\n");
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch( argc - woptind )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
/*
|
||||
Show current limit value
|
||||
*/
|
||||
print( what, hard );
|
||||
break;
|
||||
}
|
||||
|
||||
case 1:
|
||||
{
|
||||
/*
|
||||
Change current limit value
|
||||
*/
|
||||
rlim_t new_limit;
|
||||
wchar_t *end;
|
||||
|
||||
/*
|
||||
Set both hard and soft limits if nothing else was specified
|
||||
*/
|
||||
if( !(hard+soft) )
|
||||
{
|
||||
hard=soft=1;
|
||||
}
|
||||
|
||||
if( wcscasecmp( argv[woptind], L"unlimited" )==0)
|
||||
{
|
||||
new_limit = RLIM_INFINITY;
|
||||
}
|
||||
else if( wcscasecmp( argv[woptind], L"hard" )==0)
|
||||
{
|
||||
new_limit = get( what, 1 );
|
||||
}
|
||||
else if( wcscasecmp( argv[woptind], L"soft" )==0)
|
||||
{
|
||||
new_limit = get( what, soft );
|
||||
}
|
||||
else
|
||||
{
|
||||
errno=0;
|
||||
new_limit = wcstol( argv[woptind], &end, 10 );
|
||||
if( errno || *end )
|
||||
{
|
||||
append_format(stderr_buffer,
|
||||
L"%ls: Invalid limit '%ls'\n",
|
||||
argv[0],
|
||||
argv[woptind] );
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
new_limit *= get_multiplier( what );
|
||||
}
|
||||
|
||||
return set( what, hard, soft, new_limit );
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
stderr_buffer.append(argv[0]);
|
||||
stderr_buffer.append(L": Too many arguments\n");
|
||||
builtin_print_help( parser, argv[0], stderr_buffer );
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
123
cmake/CheckIncludeFiles.cmake
Normal file
123
cmake/CheckIncludeFiles.cmake
Normal file
@@ -0,0 +1,123 @@
|
||||
# Distributed under the OSI-approved BSD 3-Clause License. See full license information in
|
||||
# doc_src/license.hdr or https://cmake.org/licensing for details.
|
||||
|
||||
#.rst:
|
||||
# CheckIncludeFiles
|
||||
# -----------------
|
||||
#
|
||||
# Provides a macro to check if a list of one or more header files can
|
||||
# be included together in ``C``.
|
||||
#
|
||||
# .. command:: CHECK_INCLUDE_FILES
|
||||
#
|
||||
# ::
|
||||
#
|
||||
# CHECK_INCLUDE_FILES("<includes>" <variable> [LANGUAGE <language>])
|
||||
#
|
||||
# Check if the given ``<includes>`` list may be included together
|
||||
# in a ``C`` source file and store the result in an internal cache
|
||||
# entry named ``<variable>``. Specify the ``<includes>`` argument
|
||||
# as a :ref:`;-list <CMake Language Lists>` of header file names.
|
||||
#
|
||||
# If LANGUAGE is set, the specified compiler will be used to perform the
|
||||
# check. Acceptable values are C and CXX.
|
||||
#
|
||||
# The following variables may be set before calling this macro to modify
|
||||
# the way the check is run:
|
||||
#
|
||||
# ``CMAKE_REQUIRED_FLAGS``
|
||||
# string of compile command line flags
|
||||
# ``CMAKE_REQUIRED_DEFINITIONS``
|
||||
# list of macros to define (-DFOO=bar)
|
||||
# ``CMAKE_REQUIRED_INCLUDES``
|
||||
# list of include directories
|
||||
# ``CMAKE_REQUIRED_QUIET``
|
||||
# execute quietly without messages
|
||||
#
|
||||
# See modules :module:`CheckIncludeFile` and :module:`CheckIncludeFileCXX`
|
||||
# to check for a single header file in ``C`` or ``CXX`` languages.
|
||||
|
||||
macro(CHECK_INCLUDE_FILES INCLUDE VARIABLE)
|
||||
if(NOT DEFINED "${VARIABLE}")
|
||||
set(CMAKE_CONFIGURABLE_FILE_CONTENT "/* */\n")
|
||||
|
||||
if("x${ARGN}" STREQUAL "x")
|
||||
if(CMAKE_C_COMPILER_LOADED)
|
||||
set(_lang C)
|
||||
elseif(CMAKE_CXX_COMPILER_LOADED)
|
||||
set(_lang CXX)
|
||||
else()
|
||||
message(FATAL_ERROR "CHECK_INCLUDE_FILES needs either C or CXX language enabled")
|
||||
endif()
|
||||
elseif("x${ARGN}" MATCHES "^xLANGUAGE;([a-zA-Z]+)$")
|
||||
set(_lang "${CMAKE_MATCH_1}")
|
||||
else()
|
||||
message(FATAL_ERROR "Unknown arguments:\n ${ARGN}\n")
|
||||
endif()
|
||||
|
||||
if(_lang STREQUAL "C")
|
||||
set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckIncludeFiles/${var}.c)
|
||||
elseif(_lang STREQUAL "CXX")
|
||||
set(src ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckIncludeFiles/${var}.cpp)
|
||||
else()
|
||||
message(FATAL_ERROR "Unknown language:\n ${_lang}\nSupported languages: C, CXX.\n")
|
||||
endif()
|
||||
|
||||
if(CMAKE_REQUIRED_INCLUDES)
|
||||
set(CHECK_INCLUDE_FILES_INCLUDE_DIRS "-DINCLUDE_DIRECTORIES=${CMAKE_REQUIRED_INCLUDES}")
|
||||
else()
|
||||
set(CHECK_INCLUDE_FILES_INCLUDE_DIRS)
|
||||
endif()
|
||||
set(CHECK_INCLUDE_FILES_CONTENT "/* */\n")
|
||||
set(MACRO_CHECK_INCLUDE_FILES_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||
foreach(FILE ${INCLUDE})
|
||||
string(APPEND CMAKE_CONFIGURABLE_FILE_CONTENT
|
||||
"#include <${FILE}>\n")
|
||||
endforeach()
|
||||
string(APPEND CMAKE_CONFIGURABLE_FILE_CONTENT
|
||||
"\n\nint main(void){return 0;}\n")
|
||||
configure_file("${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in"
|
||||
"${src}" @ONLY)
|
||||
|
||||
set(_INCLUDE ${INCLUDE}) # remove empty elements
|
||||
if("${_INCLUDE}" MATCHES "^([^;]+);.+;([^;]+)$")
|
||||
list(LENGTH _INCLUDE _INCLUDE_LEN)
|
||||
set(_description "${_INCLUDE_LEN} include files ${CMAKE_MATCH_1}, ..., ${CMAKE_MATCH_2}")
|
||||
elseif("${_INCLUDE}" MATCHES "^([^;]+);([^;]+)$")
|
||||
set(_description "include files ${CMAKE_MATCH_1}, ${CMAKE_MATCH_2}")
|
||||
else()
|
||||
set(_description "include file ${_INCLUDE}")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Looking for ${_description}")
|
||||
endif()
|
||||
try_compile(${VARIABLE}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${src}
|
||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
||||
CMAKE_FLAGS
|
||||
-DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_INCLUDE_FILES_FLAGS}
|
||||
"${CHECK_INCLUDE_FILES_INCLUDE_DIRS}"
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
if(${VARIABLE})
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Looking for ${_description} - found")
|
||||
endif()
|
||||
set(${VARIABLE} 1 CACHE INTERNAL "Have include ${INCLUDE}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"Determining if files ${INCLUDE} "
|
||||
"exist passed with the following output:\n"
|
||||
"${OUTPUT}\n\n")
|
||||
else()
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Looking for ${_description} - not found")
|
||||
endif()
|
||||
set(${VARIABLE} "" CACHE INTERNAL "Have includes ${INCLUDE}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Determining if files ${INCLUDE} "
|
||||
"exist failed with the following output:\n"
|
||||
"${OUTPUT}\nSource:\n${CMAKE_CONFIGURABLE_FILE_CONTENT}\n")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
133
cmake/ConfigureChecks.cmake
Normal file
133
cmake/ConfigureChecks.cmake
Normal file
@@ -0,0 +1,133 @@
|
||||
# Detect curses.
|
||||
FIND_PACKAGE(Curses REQUIRED)
|
||||
|
||||
# Get threads.
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
# FindThreads < 3.4.0 doesn't work for C++-only projects
|
||||
IF(CMAKE_VERSION VERSION_LESS 3.4.0)
|
||||
ENABLE_LANGUAGE(C)
|
||||
ENDIF()
|
||||
FIND_PACKAGE(Threads REQUIRED)
|
||||
|
||||
IF(APPLE)
|
||||
# 10.7+ only.
|
||||
SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Werror=unguarded-availability")
|
||||
ENDIF()
|
||||
|
||||
# Detect WSL. Does not match against native Windows/WIN32.
|
||||
if (CMAKE_HOST_SYSTEM_VERSION MATCHES ".*-Microsoft")
|
||||
SET(WSL 1)
|
||||
endif()
|
||||
|
||||
# Set up the config.h file.
|
||||
SET(PACKAGE_NAME "fish")
|
||||
SET(PACKAGE_TARNAME "fish")
|
||||
INCLUDE(CheckCXXSymbolExists)
|
||||
INCLUDE(CheckIncludeFileCXX)
|
||||
INCLUDE(CheckIncludeFiles)
|
||||
INCLUDE(CheckStructHasMember)
|
||||
INCLUDE(CheckCXXSourceCompiles)
|
||||
INCLUDE(CheckTypeSize)
|
||||
CHECK_CXX_SYMBOL_EXISTS(backtrace_symbols execinfo.h HAVE_BACKTRACE_SYMBOLS)
|
||||
CHECK_CXX_SYMBOL_EXISTS(clock_gettime time.h HAVE_CLOCK_GETTIME)
|
||||
CHECK_CXX_SYMBOL_EXISTS(ctermid_r stdio.h HAVE_CTERMID_R)
|
||||
CHECK_STRUCT_HAS_MEMBER("struct dirent" d_type dirent.h HAVE_STRUCT_DIRENT_D_TYPE LANGUAGE CXX)
|
||||
CHECK_CXX_SYMBOL_EXISTS(dirfd "sys/types.h;dirent.h" HAVE_DIRFD)
|
||||
CHECK_INCLUDE_FILE_CXX(execinfo.h HAVE_EXECINFO_H)
|
||||
CHECK_CXX_SYMBOL_EXISTS(flock sys/file.h HAVE_FLOCK)
|
||||
# futimens is new in OS X 10.13 but is a weak symbol.
|
||||
# Don't assume it exists just because we can link - it may be null.
|
||||
CHECK_CXX_SYMBOL_EXISTS(futimens sys/stat.h HAVE_FUTIMENS)
|
||||
CHECK_CXX_SYMBOL_EXISTS(futimes sys/time.h HAVE_FUTIMES)
|
||||
CHECK_CXX_SYMBOL_EXISTS(getifaddrs ifaddrs.h HAVE_GETIFADDRS)
|
||||
CHECK_CXX_SYMBOL_EXISTS(getpwent pwd.h HAVE_GETPWENT)
|
||||
CHECK_CXX_SYMBOL_EXISTS(gettext libintl.h HAVE_GETTEXT)
|
||||
CHECK_CXX_SYMBOL_EXISTS(killpg "sys/types.h;signal.h" HAVE_KILLPG)
|
||||
CHECK_CXX_SYMBOL_EXISTS(lrand48_r stdlib.h HAVE_LRAND48_R)
|
||||
# mkostemp is in stdlib in glibc and FreeBSD, but unistd on macOS
|
||||
CHECK_CXX_SYMBOL_EXISTS(mkostemp "stdlib.h;unistd.h" HAVE_MKOSTEMP)
|
||||
SET(HAVE_CURSES_H ${CURSES_HAVE_CURSES_H})
|
||||
SET(HAVE_NCURSES_CURSES_H ${CURSES_HAVE_NCURSES_CURSES_H})
|
||||
SET(HAVE_NCURSES_H ${CURSES_HAVE_NCURSES_H})
|
||||
CHECK_INCLUDE_FILES("curses.h;term.h" HAVE_TERM_H)
|
||||
CHECK_INCLUDE_FILE_CXX("ncurses/term.h" HAVE_NCURSES_TERM_H)
|
||||
CHECK_INCLUDE_FILE_CXX(siginfo.h HAVE_SIGINFO_H)
|
||||
CHECK_INCLUDE_FILE_CXX(spawn.h HAVE_SPAWN_H)
|
||||
CHECK_CXX_SYMBOL_EXISTS(std::wcscasecmp wchar.h HAVE_STD__WCSCASECMP)
|
||||
CHECK_CXX_SYMBOL_EXISTS(std::wcsdup wchar.h HAVE_STD__WCSDUP)
|
||||
CHECK_CXX_SYMBOL_EXISTS(std::wcsncasecmp wchar.h HAVE_STD__WCSNCASECMP)
|
||||
CHECK_STRUCT_HAS_MEMBER("struct stat" st_ctime_nsec "sys/stat.h" HAVE_STRUCT_STAT_ST_CTIME_NSEC
|
||||
LANGUAGE CXX)
|
||||
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec "sys/stat.h"
|
||||
HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC LANGUAGE CXX)
|
||||
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec "sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
|
||||
LANGUAGE CXX)
|
||||
CHECK_CXX_SYMBOL_EXISTS(sys_errlist stdio.h HAVE_SYS_ERRLIST)
|
||||
CHECK_INCLUDE_FILE_CXX(sys/ioctl.h HAVE_SYS_IOCTL_H)
|
||||
CHECK_INCLUDE_FILE_CXX(sys/select.h HAVE_SYS_SELECT_H)
|
||||
CHECK_INCLUDE_FILES("sys/types.h;sys/sysctl.h" HAVE_SYS_SYSCTL_H)
|
||||
CHECK_INCLUDE_FILE_CXX(termios.h HAVE_TERMIOS_H) # Needed for TIOCGWINSZ
|
||||
CHECK_CXX_SYMBOL_EXISTS(wcscasecmp wchar.h HAVE_WCSCASECMP)
|
||||
CHECK_CXX_SYMBOL_EXISTS(wcsdup wchar.h HAVE_WCSDUP)
|
||||
CHECK_CXX_SYMBOL_EXISTS(wcslcpy wchar.h HAVE_WCSLCPY)
|
||||
CHECK_CXX_SYMBOL_EXISTS(wcsncasecmp wchar.h HAVE_WCSNCASECMP)
|
||||
CHECK_CXX_SYMBOL_EXISTS(wcsndup wchar.h HAVE_WCSNDUP)
|
||||
CHECK_CXX_SYMBOL_EXISTS(wcstod_l wchar.h HAVE_WCSTOD_L)
|
||||
|
||||
CHECK_CXX_SYMBOL_EXISTS(_sys_errs stdlib.h HAVE__SYS__ERRS)
|
||||
|
||||
SET(CMAKE_EXTRA_INCLUDE_FILES termios.h sys/ioctl.h)
|
||||
CHECK_TYPE_SIZE("struct winsize" STRUCT_WINSIZE LANGUAGE CXX)
|
||||
CHECK_CXX_SYMBOL_EXISTS("TIOCGWINSZ" "termios.h;sys/ioctl.h" HAVE_TIOCGWINSZ)
|
||||
IF(STRUCT_WINSIZE GREATER -1 AND HAVE_TIOCGWINSZ EQUAL 1)
|
||||
SET(HAVE_WINSIZE 1)
|
||||
ENDIF()
|
||||
SET(CMAKE_EXTRA_INCLUDE_FILES)
|
||||
|
||||
IF(EXISTS "/proc/self/stat")
|
||||
SET(HAVE__PROC_SELF_STAT 1)
|
||||
ENDIF()
|
||||
CHECK_TYPE_SIZE("wchar_t[8]" WCHAR_T_BITS LANGUAGE CXX)
|
||||
|
||||
# Solaris, NetBSD and X/Open-conforming systems have a fixed-args tparm
|
||||
SET(TPARM_INCLUDES)
|
||||
IF(HAVE_NCURSES_H)
|
||||
SET(TPARM_INCLUDES "${TPARM_INCLUDES}#include <ncurses.h>\n")
|
||||
ELSEIF(HAVE_NCURSES_CURSES_H)
|
||||
SET(TPARM_INCLUDES "${TPARM_INCLUDES}#include <ncurses/curses.h>\n")
|
||||
ELSE()
|
||||
SET(TPARM_INCLUDES "${TPARM_INCLUDES}#include <curses.h>\n")
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_TERM_H)
|
||||
SET(TPARM_INCLUDES "${TPARM_INCLUDES}#include <term.h>\n")
|
||||
ELSEIF(HAVE_NCURSES_TERM_H)
|
||||
SET(TPARM_INCLUDES "${TPARM_INCLUDES}#include <ncurses/term.h>\n")
|
||||
ENDIF()
|
||||
|
||||
SET(CMAKE_REQUIRED_LIBRARIES ${CURSES_LIBRARY})
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
${TPARM_INCLUDES}
|
||||
|
||||
int main () {
|
||||
tparm( \"\" );
|
||||
}
|
||||
"
|
||||
TPARM_TAKES_VARARGS
|
||||
)
|
||||
SET(CMAKE_REQUIRED_LIBRARIES)
|
||||
IF(NOT TPARM_TAKES_VARARGS)
|
||||
SET(TPARM_SOLARIS_KLUDGE 1)
|
||||
ENDIF()
|
||||
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <memory>
|
||||
|
||||
int main () {
|
||||
std::unique_ptr<int> foo = std::make_unique<int>();
|
||||
}
|
||||
"
|
||||
HAVE_STD__MAKE_UNIQUE
|
||||
)
|
||||
|
||||
FIND_PROGRAM(SED sed)
|
||||
150
cmake/Docs.cmake
Normal file
150
cmake/Docs.cmake
Normal file
@@ -0,0 +1,150 @@
|
||||
FIND_PACKAGE(Doxygen 1.8.7)
|
||||
|
||||
INCLUDE(FeatureSummary)
|
||||
|
||||
IF(DOXYGEN_FOUND)
|
||||
OPTION(BUILD_DOCS "build documentation (requires Doxygen)" ON)
|
||||
ELSE(DOXYGEN_FOUND)
|
||||
OPTION(BUILD_DOCS "build documentation (requires Doxygen)" OFF)
|
||||
ENDIF(DOXYGEN_FOUND)
|
||||
|
||||
IF(BUILD_DOCS AND NOT DOXYGEN_FOUND)
|
||||
MESSAGE(FATAL_ERROR "build documentation selected, but Doxygen could not be found")
|
||||
ENDIF()
|
||||
|
||||
IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/user_doc/html
|
||||
AND IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/share/man/man1)
|
||||
SET(HAVE_PREBUILT_DOCS TRUE)
|
||||
ELSE()
|
||||
SET(HAVE_PREBUILT_DOCS FALSE)
|
||||
ENDIF()
|
||||
|
||||
IF(BUILD_DOCS OR HAVE_PREBUILT_DOCS)
|
||||
SET(INSTALL_DOCS ON)
|
||||
ELSE()
|
||||
SET(INSTALL_DOCS OFF)
|
||||
ENDIF()
|
||||
|
||||
ADD_FEATURE_INFO(Documentation INSTALL_DOCS "user manual and documentation")
|
||||
|
||||
IF(BUILD_DOCS)
|
||||
# Files in ./share/completions/
|
||||
FILE(GLOB COMPLETIONS_DIR_FILES share/completions/*.fish)
|
||||
|
||||
# Files in ./share/functions/
|
||||
FILE(GLOB FUNCTIONS_DIR_FILES share/functions/*.fish)
|
||||
|
||||
# Files in doc_src
|
||||
FILE(GLOB DOC_SRC_FILES doc_src/*)
|
||||
|
||||
# .txt files in doc_src
|
||||
FILE(GLOB HELP_SRC doc_src/*.txt)
|
||||
|
||||
# These files are the source files, they contain a few @FOO@-style substitutions.
|
||||
# Note that this order defines the order that they appear in the documentation.
|
||||
SET(HDR_FILES_SRC doc_src/index.hdr.in doc_src/tutorial.hdr doc_src/design.hdr
|
||||
doc_src/license.hdr doc_src/commands.hdr.in doc_src/faq.hdr)
|
||||
|
||||
# These are the generated result files.
|
||||
STRING(REPLACE ".in" "" HDR_FILES "${HDR_FILES_SRC}")
|
||||
|
||||
# Header files except for index.hdr
|
||||
SET(HDR_FILES_NO_INDEX ${HDR_FILES})
|
||||
LIST(REMOVE_ITEM HDR_FILES_NO_INDEX doc_src/index.hdr)
|
||||
|
||||
# Copy doc_src files
|
||||
FILE(COPY ${DOC_SRC_FILES} DESTINATION doc_src)
|
||||
|
||||
# Build lexicon_filter.
|
||||
ADD_CUSTOM_COMMAND(OUTPUT lexicon_filter
|
||||
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_lexicon_filter.sh
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/share/functions/
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/share/completions/
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/lexicon_filter.in
|
||||
${SED}
|
||||
> ${CMAKE_CURRENT_BINARY_DIR}/lexicon_filter
|
||||
&& chmod a+x ${CMAKE_CURRENT_BINARY_DIR}/lexicon_filter
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
DEPENDS ${FUNCTIONS_DIR_FILES} ${COMPLETIONS_DIR_FILES}
|
||||
doc_src/commands.hdr ${CMAKE_CURRENT_SOURCE_DIR}/lexicon_filter.in
|
||||
share/functions/__fish_config_interactive.fish
|
||||
build_tools/build_lexicon_filter.sh command_list_toc.txt)
|
||||
|
||||
# Other targets should depend on this target, otherwise the lexicon
|
||||
# filter can be built twice.
|
||||
ADD_CUSTOM_TARGET(build_lexicon_filter DEPENDS lexicon_filter)
|
||||
|
||||
#
|
||||
# commands.hdr collects documentation on all commands, functions and
|
||||
# builtins
|
||||
#
|
||||
FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc_src)
|
||||
ADD_CUSTOM_COMMAND(OUTPUT doc_src/commands.hdr command_list_toc.txt
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_commands_hdr.sh ${HELP_SRC}
|
||||
< doc_src/commands.hdr.in
|
||||
> ${CMAKE_CURRENT_BINARY_DIR}/doc_src/commands.hdr
|
||||
DEPENDS ${HELP_SRC}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/doc_src/commands.hdr.in
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_commands_hdr.sh)
|
||||
|
||||
# doc.h is a compilation of the various snippets of text used both for
|
||||
# the user documentation and for internal help functions into a single
|
||||
# file that can be parsed by Doxygen to generate the user
|
||||
# documentation.
|
||||
ADD_CUSTOM_COMMAND(OUTPUT doc.h
|
||||
COMMAND cat ${HDR_FILES} > ${CMAKE_CURRENT_BINARY_DIR}/doc.h
|
||||
DEPENDS ${HDR_FILES})
|
||||
|
||||
# toc.txt: $(HDR_FILES:index.hdr=index.hdr.in) build_tools/build_toc_txt.sh | show-SED
|
||||
# FISH_BUILD_VERSION=${FISH_BUILD_VERSION} build_tools/build_toc_txt.sh \
|
||||
# $(HDR_FILES:index.hdr=index.hdr.in) > toc.txt
|
||||
# Note we would like to add doc_src/index.hdr.in as a dependency but CMake replaces this with
|
||||
# doc_src/index.hdr; CMake bug?
|
||||
ADD_CUSTOM_COMMAND(OUTPUT toc.txt
|
||||
COMMAND env `cat ${FBVF} | tr -d '\"'` ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_toc_txt.sh
|
||||
doc_src/index.hdr.in ${HDR_FILES_NO_INDEX}
|
||||
> ${CMAKE_CURRENT_BINARY_DIR}/toc.txt
|
||||
DEPENDS ${CFBVF} ${HDR_FILES_NO_INDEX})
|
||||
|
||||
# doc_src/index.hdr: toc.txt doc_src/index.hdr.in | show-AWK
|
||||
# @echo " AWK CAT $(em)$@$(sgr0)"
|
||||
# $v cat $@.in | $(AWK) '{if ($$0 ~ /@toc@/){ system("cat toc.txt");} else{ print $$0;}}' >$@
|
||||
ADD_CUSTOM_COMMAND(OUTPUT doc_src/index.hdr
|
||||
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_index_hdr.sh toc.txt
|
||||
< doc_src/index.hdr.in
|
||||
> ${CMAKE_CURRENT_BINARY_DIR}/doc_src/index.hdr
|
||||
DEPENDS toc.txt)
|
||||
|
||||
# doc: $(HDR_FILES_SRC) Doxyfile.user $(HTML_SRC) $(HELP_SRC) doc.h $(HDR_FILES) lexicon_filter
|
||||
# @echo " doxygen $(em)user_doc$(sgr0)"
|
||||
# $v (cat Doxyfile.user; echo INPUT_FILTER=./lexicon_filter; echo PROJECT_NUMBER=$(FISH_BUILD_VERSION) | $(SED) "s/-.*//") | doxygen - && touch user_doc
|
||||
# $v rm -f $(wildcard $(addprefix ./user_doc/html/,arrow*.png bc_s.png bdwn.png closed.png doc.png folder*.png ftv2*.png nav*.png open.png splitbar.png sync_*.png tab*.* doxygen.* dynsections.js jquery.js pages.html))
|
||||
ADD_CUSTOM_TARGET(doc ALL
|
||||
COMMAND env `cat ${FBVF}`
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_user_doc.sh
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.user ./lexicon_filter
|
||||
DEPENDS ${CFBVF} Doxyfile.user ${DOC_SRC_FILES} doc.h ${HDR_FILES} build_lexicon_filter command_list_toc.txt)
|
||||
|
||||
ADD_CUSTOM_COMMAND(OUTPUT share/man/
|
||||
COMMAND env `cat ${FBVF} | tr -d '\"' `
|
||||
INPUT_FILTER=lexicon_filter ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/build_documentation.sh ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.help doc_src ./share
|
||||
DEPENDS ${CFBVF} ${HELP_SRC} build_lexicon_filter)
|
||||
|
||||
ADD_CUSTOM_TARGET(BUILD_MANUALS ALL DEPENDS share/man/)
|
||||
|
||||
# Group docs targets into a DocsTargets folder
|
||||
SET_PROPERTY(TARGET doc BUILD_MANUALS build_lexicon_filter
|
||||
PROPERTY FOLDER cmake/DocTargets)
|
||||
ELSEIF(HAVE_PREBUILT_DOCS)
|
||||
IF(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
|
||||
# Out of tree build - link the prebuilt documentation to the build tree
|
||||
ADD_CUSTOM_TARGET(link_doc ALL)
|
||||
ADD_CUSTOM_COMMAND(TARGET link_doc
|
||||
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/share/man ${CMAKE_CURRENT_BINARY_DIR}/share/man
|
||||
POST_BUILD)
|
||||
ADD_CUSTOM_COMMAND(TARGET link_doc
|
||||
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/user_doc ${CMAKE_CURRENT_BINARY_DIR}/user_doc
|
||||
POST_BUILD)
|
||||
ENDIF()
|
||||
ENDIF(BUILD_DOCS)
|
||||
229
cmake/Install.cmake
Normal file
229
cmake/Install.cmake
Normal file
@@ -0,0 +1,229 @@
|
||||
# -DLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}"
|
||||
# -DPREFIX=L"${CMAKE_INSTALL_PREFIX}"
|
||||
# -DDATADIR=L"${CMAKE_INSTALL_FULL_DATADIR}"
|
||||
# -DSYSCONFDIR=L"${CMAKE_INSTALL_FULL_SYSCONFDIR}"
|
||||
# -DBINDIR=L"${CMAKE_INSTALL_FULL_BINDIR}"
|
||||
# -DDOCDIR=L"${CMAKE_INSTALL_FULL_DOCDIR}")
|
||||
|
||||
SET(CMAKE_INSTALL_MESSAGE NEVER)
|
||||
|
||||
SET(PROGRAMS fish fish_indent fish_key_reader)
|
||||
|
||||
SET(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
SET(bindir ${CMAKE_INSTALL_BINDIR})
|
||||
SET(sysconfdir ${CMAKE_INSTALL_SYSCONFDIR})
|
||||
SET(mandir ${CMAKE_INSTALL_MANDIR})
|
||||
|
||||
SET(rel_datadir ${CMAKE_INSTALL_DATADIR})
|
||||
SET(datadir ${CMAKE_INSTALL_FULL_DATADIR})
|
||||
|
||||
SET(docdir ${CMAKE_INSTALL_DOCDIR})
|
||||
|
||||
# Comment at the top of some .in files
|
||||
SET(configure_input
|
||||
"This file was generated from a corresponding .in file.\
|
||||
DO NOT MANUALLY EDIT THIS FILE!")
|
||||
|
||||
SET(extra_completionsdir
|
||||
${datadir}/fish/vendor_completions.d
|
||||
CACHE STRING "Path for extra completions")
|
||||
|
||||
SET(extra_functionsdir
|
||||
${datadir}/fish/vendor_functions.d
|
||||
CACHE STRING "Path for extra completions")
|
||||
|
||||
SET(extra_confdir
|
||||
${datadir}/fish/vendor_conf.d
|
||||
CACHE STRING "Path for extra configuration")
|
||||
|
||||
# These are the man pages that go in system manpath; all manpages go in the fish-specific manpath.
|
||||
SET(MANUALS ${CMAKE_CURRENT_BINARY_DIR}/share/man/man1/fish.1
|
||||
${CMAKE_CURRENT_BINARY_DIR}/share/man/man1/fish_indent.1
|
||||
${CMAKE_CURRENT_BINARY_DIR}/share/man/man1/fish_key_reader.1)
|
||||
|
||||
# Determine which man page we don't want to install.
|
||||
# On OS X, don't install a man page for open, since we defeat fish's open
|
||||
# function on OS X.
|
||||
IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||
SET(CONDEMNED_PAGE "open.1")
|
||||
ELSE()
|
||||
SET(CONDEMNED_PAGE "none")
|
||||
ENDIF()
|
||||
|
||||
# Define a function to help us create directories.
|
||||
FUNCTION(FISH_CREATE_DIRS)
|
||||
FOREACH(dir ${ARGV})
|
||||
IF(NOT EXISTS ${CMAKE_INSTALL_PREFIX}/${dir})
|
||||
INSTALL(DIRECTORY DESTINATION ${dir})
|
||||
ENDIF()
|
||||
ENDFOREACH(dir)
|
||||
ENDFUNCTION(FISH_CREATE_DIRS)
|
||||
|
||||
FUNCTION(FISH_TRY_CREATE_DIRS)
|
||||
FOREACH(dir ${ARGV})
|
||||
IF(NOT IS_ABSOLUTE ${dir})
|
||||
SET(abs_dir "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${dir}")
|
||||
ELSE()
|
||||
SET(abs_dir "\$ENV{DESTDIR}${dir}")
|
||||
ENDIF()
|
||||
INSTALL(SCRIPT CODE "EXECUTE_PROCESS(COMMAND mkdir -p ${abs_dir} OUTPUT_QUIET ERROR_QUIET)
|
||||
EXECUTE_PROCESS(COMMAND chmod 755 ${abs_dir} OUTPUT_QUIET ERROR_QUIET)
|
||||
")
|
||||
ENDFOREACH()
|
||||
ENDFUNCTION(FISH_TRY_CREATE_DIRS)
|
||||
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(bindir)
|
||||
# $v for i in $(PROGRAMS); do\
|
||||
# $(INSTALL) -m 755 $$i $(DESTDIR)$(bindir);\
|
||||
# echo " Installing $(bo)$$i$(sgr0)";\
|
||||
# true ;\
|
||||
# done;
|
||||
|
||||
INSTALL(TARGETS ${PROGRAMS}
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
|
||||
GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
|
||||
DESTINATION ${bindir})
|
||||
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)/fish
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)/fish/conf.d
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)/fish/completions
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)/fish/functions
|
||||
# $v $(INSTALL) -m 644 etc/config.fish $(DESTDIR)$(sysconfdir)/fish/
|
||||
FISH_CREATE_DIRS(${sysconfdir}/fish/conf.d ${sysconfdir}/fish/completions
|
||||
${sysconfdir}/fish/functions)
|
||||
INSTALL(FILES etc/config.fish DESTINATION ${sysconfdir}/fish/)
|
||||
|
||||
FISH_CREATE_DIRS(${rel_datadir}/fish ${rel_datadir}/fish/completions
|
||||
${rel_datadir}/fish/functions ${rel_datadir}/fish/groff
|
||||
${rel_datadir}/fish/man/man1 ${rel_datadir}/fish/tools
|
||||
${rel_datadir}/fish/tools/web_config
|
||||
${rel_datadir}/fish/tools/web_config/js
|
||||
${rel_datadir}/fish/tools/web_config/partials
|
||||
${rel_datadir}/fish/tools/web_config/sample_prompts)
|
||||
|
||||
# $v $(INSTALL) -m 644 share/config.fish $(DESTDIR)$(datadir)/fish/
|
||||
# $v $(INSTALL) -m 644 share/__fish_build_paths.fish $(DESTDIR)$(datadir)/fish/
|
||||
CONFIGURE_FILE(share/__fish_build_paths.fish.in share/__fish_build_paths.fish)
|
||||
INSTALL(FILES share/config.fish
|
||||
${CMAKE_CURRENT_BINARY_DIR}/share/__fish_build_paths.fish
|
||||
DESTINATION ${rel_datadir}/fish)
|
||||
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/pkgconfig
|
||||
# @echo "Creating placeholder vendor/'extra_' directories"
|
||||
# -$v $(INSTALL) -m 755 -d $(DESTDIR)$(extra_completionsdir)
|
||||
# -$v $(INSTALL) -m 755 -d $(DESTDIR)$(extra_functionsdir)
|
||||
# -$v $(INSTALL) -m 755 -d $(DESTDIR)$(extra_confdir)
|
||||
FISH_CREATE_DIRS(${rel_datadir}/pkgconfig)
|
||||
# Don't try too hard to create these directories as they may be outside our writeable area
|
||||
# https://github.com/Homebrew/homebrew-core/pull/2813
|
||||
FISH_TRY_CREATE_DIRS(${extra_completionsdir} ${extra_functionsdir} ${extra_confdir})
|
||||
|
||||
# @echo "Installing pkgconfig file"
|
||||
# $v $(INSTALL) -m 644 fish.pc $(DESTDIR)$(datadir)/pkgconfig
|
||||
CONFIGURE_FILE(fish.pc.in fish.pc.noversion)
|
||||
|
||||
ADD_CUSTOM_COMMAND(OUTPUT fish.pc
|
||||
COMMAND sed '/Version/d' fish.pc.noversion > fish.pc
|
||||
COMMAND printf "Version: " >> fish.pc
|
||||
COMMAND sed 's/FISH_BUILD_VERSION=//\;s/\"//g' ${FBVF} >> fish.pc
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${FBVF} ${CMAKE_CURRENT_BINARY_DIR}/fish.pc.noversion)
|
||||
|
||||
ADD_CUSTOM_TARGET(build_fish_pc ALL DEPENDS fish.pc)
|
||||
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/fish.pc
|
||||
DESTINATION ${rel_datadir}/pkgconfig)
|
||||
|
||||
# @echo "Installing the $(bo)fish completion library$(sgr0)...";
|
||||
# $v $(INSTALL) -m 644 $(COMPLETIONS_DIR_FILES:%='%') $(DESTDIR)$(datadir)/fish/completions/
|
||||
INSTALL(DIRECTORY share/completions/
|
||||
DESTINATION ${rel_datadir}/fish/completions
|
||||
FILES_MATCHING PATTERN "*.fish")
|
||||
|
||||
# @echo "Installing $(bo)fish functions$(sgr0)";
|
||||
# $v $(INSTALL) -m 644 $(FUNCTIONS_DIR_FILES:%='%') $(DESTDIR)$(datadir)/fish/functions/
|
||||
INSTALL(DIRECTORY share/functions/
|
||||
DESTINATION ${rel_datadir}/fish/functions
|
||||
FILES_MATCHING PATTERN "*.fish")
|
||||
|
||||
# @echo "Installing $(bo)man pages$(sgr0)";
|
||||
# $v $(INSTALL) -m 644 share/groff/* $(DESTDIR)$(datadir)/fish/groff/
|
||||
INSTALL(DIRECTORY share/groff
|
||||
DESTINATION ${rel_datadir}/fish)
|
||||
|
||||
# $v test -z "$(wildcard share/man/man1/*.1)" || $(INSTALL) -m 644 $(filter-out $(addprefix share/man/man1/, $(CONDEMNED_PAGES)), $(wildcard share/man/man1/*.1)) $(DESTDIR)$(datadir)/fish/man/man1/
|
||||
# CONDEMNED_PAGE is managed by the conditional above
|
||||
# Building the man pages is optional: if doxygen isn't installed, they're not built
|
||||
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/share/man/man1/
|
||||
DESTINATION ${rel_datadir}/fish/man/man1
|
||||
FILES_MATCHING
|
||||
PATTERN "*.1"
|
||||
PATTERN ${CONDEMNED_PAGE} EXCLUDE)
|
||||
|
||||
# @echo "Installing helper tools";
|
||||
# $v $(INSTALL) -m 755 share/tools/*.py $(DESTDIR)$(datadir)/fish/tools/
|
||||
INSTALL(PROGRAMS share/tools/create_manpage_completions.py share/tools/deroff.py
|
||||
DESTINATION ${rel_datadir}/fish/tools/)
|
||||
|
||||
# $v $(INSTALL) -m 644 share/tools/web_config/*.* $(DESTDIR)$(datadir)/fish/tools/web_config/
|
||||
# $v $(INSTALL) -m 644 share/tools/web_config/js/*.* $(DESTDIR)$(datadir)/fish/tools/web_config/js/
|
||||
# $v $(INSTALL) -m 644 share/tools/web_config/partials/* $(DESTDIR)$(datadir)/fish/tools/web_config/partials/
|
||||
# $v $(INSTALL) -m 644 share/tools/web_config/sample_prompts/*.fish $(DESTDIR)$(datadir)/fish/tools/web_config/sample_prompts/
|
||||
# $v $(INSTALL) -m 755 share/tools/web_config/*.py $(DESTDIR)$(datadir)/fish/tools/web_config/
|
||||
|
||||
INSTALL(DIRECTORY share/tools/web_config
|
||||
DESTINATION ${rel_datadir}/fish/tools/
|
||||
FILES_MATCHING
|
||||
PATTERN "*.png"
|
||||
PATTERN "*.css"
|
||||
PATTERN "*.html"
|
||||
PATTERN "*.py"
|
||||
PATTERN "*.js"
|
||||
PATTERN "*.fish")
|
||||
|
||||
# @echo "Installing more man pages";
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man1;
|
||||
# $v for i in $(MANUALS); do \
|
||||
# $(INSTALL) -m 644 $$i $(DESTDIR)$(mandir)/man1/; \
|
||||
# true; \
|
||||
# done;
|
||||
# Building the man pages is optional: if doxygen isn't installed, they're not built
|
||||
INSTALL(FILES ${MANUALS} DESTINATION ${mandir}/man1/ OPTIONAL)
|
||||
|
||||
#install-doc: $(user_doc)
|
||||
# @echo "Installing online user documentation";
|
||||
# $v $(INSTALL) -m 755 -d $(DESTDIR)$(docdir)
|
||||
# $v for i in user_doc/html/* CHANGELOG.md; do \
|
||||
# if test -f $$i; then \
|
||||
# $(INSTALL) -m 644 $$i $(DESTDIR)$(docdir); \
|
||||
# fi; \
|
||||
# done;
|
||||
# Building the manual is optional
|
||||
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/user_doc/html/ # Trailing slash is important!
|
||||
DESTINATION ${docdir} OPTIONAL)
|
||||
INSTALL(FILES CHANGELOG.md DESTINATION ${docdir})
|
||||
|
||||
# $v $(INSTALL) -m 644 share/lynx.lss $(DESTDIR)$(datadir)/fish/
|
||||
INSTALL(FILES share/lynx.lss DESTINATION ${rel_datadir}/fish/)
|
||||
|
||||
# These files are built by cmake/gettext.cmake, but using GETTEXT_PROCESS_PO_FILES's
|
||||
# INSTALL_DESTINATION leads to them being installed as ${lang}.gmo, not fish.mo
|
||||
# The ${languages} array comes from cmake/gettext.cmake
|
||||
IF(GETTEXT_FOUND)
|
||||
FOREACH(lang ${languages})
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${lang}.gmo DESTINATION
|
||||
${CMAKE_INSTALL_LOCALEDIR}/${lang}/LC_MESSAGES/ RENAME fish.mo)
|
||||
ENDFOREACH()
|
||||
ENDIF()
|
||||
|
||||
# Group install targets into a InstallTargets folder
|
||||
SET_PROPERTY(TARGET build_fish_pc CHECK-FISH-BUILD-VERSION-FILE
|
||||
test_invocation test_fishscript
|
||||
test_prep tests_buildroot_target
|
||||
PROPERTY FOLDER cmake/InstallTargets)
|
||||
|
||||
# Make a target build_root that installs into the buildroot directory, for testing.
|
||||
SET(BUILDROOT_DIR ${CMAKE_CURRENT_BINARY_DIR}/buildroot)
|
||||
ADD_CUSTOM_TARGET(build_root
|
||||
COMMAND DESTDIR=${BUILDROOT_DIR} ${CMAKE_COMMAND}
|
||||
--build ${CMAKE_CURRENT_BINARY_DIR} --target install)
|
||||
20
cmake/PCRE2.cmake
Normal file
20
cmake/PCRE2.cmake
Normal file
@@ -0,0 +1,20 @@
|
||||
# PCRE2 needs some settings.
|
||||
SET(PCRE2_WIDTH ${WCHAR_T_BITS})
|
||||
SET(PCRE2_BUILD_PCRE2_8 OFF CACHE BOOL "Build 8bit PCRE2 library")
|
||||
SET(PCRE2_BUILD_PCRE2_${PCRE2_WIDTH} ON CACHE BOOL "Build ${PCRE2_WIDTH}bit PCRE2 library")
|
||||
SET(PCRE2_SHOW_REPORT OFF CACHE BOOL "Show the final configuration report")
|
||||
SET(PCRE2_BUILD_PCRE2GREP OFF CACHE BOOL "Build pcre2grep")
|
||||
|
||||
|
||||
SET(PCRE2_MIN_VERSION 10.21)
|
||||
FIND_LIBRARY(PCRE2_LIB pcre2-${PCRE2_WIDTH})
|
||||
FIND_PATH(PCRE2_INCLUDE_DIR pcre2.h)
|
||||
IF (PCRE2_LIB AND PCRE2_INCLUDE_DIR)
|
||||
MESSAGE(STATUS "Found system PCRE2 library ${PCRE2_INCLUDE_DIR}")
|
||||
ELSE()
|
||||
MESSAGE(STATUS "Using bundled PCRE2 library")
|
||||
ADD_SUBDIRECTORY(pcre2-10.22 EXCLUDE_FROM_ALL)
|
||||
SET(PCRE2_INCLUDE_DIR ${CMAKE_BINARY_DIR}/pcre2-10.22/)
|
||||
SET(PCRE2_LIB pcre2-${PCRE2_WIDTH})
|
||||
endif(PCRE2_LIB AND PCRE2_INCLUDE_DIR)
|
||||
INCLUDE_DIRECTORIES(${PCRE2_INCLUDE_DIR})
|
||||
131
cmake/Tests.cmake
Normal file
131
cmake/Tests.cmake
Normal file
@@ -0,0 +1,131 @@
|
||||
# Define fish_tests.
|
||||
ADD_EXECUTABLE(fish_tests EXCLUDE_FROM_ALL
|
||||
src/fish_tests.cpp)
|
||||
FISH_LINK_DEPS(fish_tests)
|
||||
|
||||
# The "test" directory.
|
||||
SET(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/test)
|
||||
|
||||
# The directory into which fish is installed.
|
||||
SET(TEST_INSTALL_DIR ${TEST_DIR}/buildroot)
|
||||
|
||||
# The directory where the tests expect to find the fish root (./bin, etc)
|
||||
SET(TEST_ROOT_DIR ${TEST_DIR}/root)
|
||||
|
||||
# Copy tests files.
|
||||
FILE(GLOB TESTS_FILES tests/*)
|
||||
ADD_CUSTOM_TARGET(tests_dir DEPENDS tests)
|
||||
|
||||
IF(NOT FISH_IN_TREE_BUILD)
|
||||
ADD_CUSTOM_COMMAND(TARGET tests_dir
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
||||
${CMAKE_SOURCE_DIR}/tests/ ${CMAKE_BINARY_DIR}/tests/
|
||||
COMMENT "Copying test files to binary dir"
|
||||
VERBATIM)
|
||||
|
||||
ADD_DEPENDENCIES(fish_tests tests_dir)
|
||||
ENDIF()
|
||||
|
||||
# Create the 'test' target.
|
||||
# Set a policy so CMake stops complaining about the name 'test'.
|
||||
CMAKE_POLICY(PUSH)
|
||||
IF(POLICY CMP0037)
|
||||
CMAKE_POLICY(SET CMP0037 OLD)
|
||||
ENDIF()
|
||||
ADD_CUSTOM_TARGET(test)
|
||||
CMAKE_POLICY(POP)
|
||||
|
||||
ADD_CUSTOM_TARGET(test_low_level
|
||||
COMMAND env XDG_DATA_HOME=test/data XDG_CONFIG_HOME=test/home ./fish_tests
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
DEPENDS fish_tests
|
||||
USES_TERMINAL)
|
||||
ADD_DEPENDENCIES(test test_low_level tests_dir)
|
||||
|
||||
# Make the directory in which to run tests.
|
||||
# Also symlink fish to where the tests expect it to be.
|
||||
ADD_CUSTOM_TARGET(tests_buildroot_target
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_INSTALL_DIR}
|
||||
COMMAND DESTDIR=${TEST_INSTALL_DIR} ${CMAKE_COMMAND}
|
||||
--build ${CMAKE_CURRENT_BINARY_DIR} --target install
|
||||
COMMAND ${CMAKE_COMMAND} -E create_symlink
|
||||
${TEST_INSTALL_DIR}/${CMAKE_INSTALL_PREFIX}
|
||||
${TEST_ROOT_DIR}
|
||||
DEPENDS fish)
|
||||
|
||||
IF(NOT FISH_IN_TREE_BUILD)
|
||||
# We need to symlink share/functions for the tests.
|
||||
# This should be simplified.
|
||||
ADD_CUSTOM_TARGET(symlink_functions
|
||||
COMMAND ${CMAKE_COMMAND} -E create_symlink
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/share/functions
|
||||
${CMAKE_CURRENT_BINARY_DIR}/share/functions)
|
||||
ADD_DEPENDENCIES(tests_buildroot_target symlink_functions)
|
||||
ELSE()
|
||||
ADD_CUSTOM_TARGET(symlink_functions)
|
||||
ENDIF()
|
||||
|
||||
#
|
||||
# Prep the environment for running the unit tests.
|
||||
# test-prep: show-DESTDIR show-LN_S show-FISH_VERSION
|
||||
# $v rm -rf test
|
||||
# $v $(MKDIR_P) test/data test/home test/temp
|
||||
# ifdef DESTDIR
|
||||
# $v $(LN_S) $(DESTDIR) test/root
|
||||
# else
|
||||
# $v $(MKDIR_P) test/root
|
||||
# endif
|
||||
ADD_CUSTOM_TARGET(test_prep
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/data
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/home
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory ${TEST_DIR}/temp
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory
|
||||
${TEST_DIR}/data ${TEST_DIR}/home ${TEST_DIR}/temp
|
||||
DEPENDS tests_buildroot_target
|
||||
USES_TERMINAL)
|
||||
|
||||
|
||||
# test_high_level_test_deps = test_fishscript test_interactive test_invocation
|
||||
# test_high_level: DESTDIR = $(PWD)/test/root/
|
||||
# test_high_level: prefix = .
|
||||
# test_high_level: test-prep install-force test_fishscript test_interactive test_invocation
|
||||
# .PHONY: test_high_level
|
||||
#
|
||||
# test_invocation: $(call filter_up_to,test_invocation,$(active_test_goals))
|
||||
# cd tests; ./invocation.sh
|
||||
# .PHONY: test_invocation
|
||||
ADD_CUSTOM_TARGET(test_invocation
|
||||
COMMAND ./invocation.sh
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tests/
|
||||
DEPENDS test_prep test_low_level
|
||||
USES_TERMINAL)
|
||||
|
||||
#
|
||||
# test_fishscript: $(call filter_up_to,test_fishscript,$(active_test_goals))
|
||||
# cd tests; ../test/root/bin/fish test.fish
|
||||
# .PHONY: test_fishscript
|
||||
|
||||
ADD_CUSTOM_TARGET(test_fishscript
|
||||
COMMAND cd tests && ${TEST_ROOT_DIR}/bin/fish test.fish
|
||||
DEPENDS test_prep test_invocation
|
||||
USES_TERMINAL)
|
||||
#
|
||||
# test_interactive: $(call filter_up_to,test_interactive,$(active_test_goals))
|
||||
# cd tests; ../test/root/bin/fish interactive.fish
|
||||
# .PHONY: test_interactive
|
||||
|
||||
ADD_CUSTOM_TARGET(test_interactive
|
||||
COMMAND cd tests && ${TEST_ROOT_DIR}/bin/fish interactive.fish
|
||||
DEPENDS test_prep test_invocation test_fishscript
|
||||
USES_TERMINAL)
|
||||
|
||||
ADD_CUSTOM_TARGET(test_high_level
|
||||
DEPENDS test_invocation test_fishscript test_interactive)
|
||||
ADD_DEPENDENCIES(test test_high_level)
|
||||
|
||||
# Group test targets into a TestTargets folder
|
||||
SET_PROPERTY(TARGET test test_low_level test_high_level tests_dir
|
||||
test_invocation test_fishscript test_prep
|
||||
tests_buildroot_target
|
||||
symlink_functions
|
||||
PROPERTY FOLDER cmake/TestTargets)
|
||||
55
cmake/Version.cmake
Normal file
55
cmake/Version.cmake
Normal file
@@ -0,0 +1,55 @@
|
||||
# This file adds commands to manage the FISH-BUILD-VERSION-FILE (hereafter
|
||||
# FBVF). This file exists in the build directory and is used to populate the
|
||||
# documentation and also the version string in fish_version.o (printed with
|
||||
# `echo $version` and also fish --version). The essential idea is that we are
|
||||
# going to invoke git_version_gen.sh, which will update the
|
||||
# FISH-BUILD-VERSION-FILE only if it needs to change; this is what makes
|
||||
# incremental rebuilds fast.
|
||||
#
|
||||
# This code is delicate, with the chief subtlety revolving around Ninja. A
|
||||
# natural and naive approach would tell the generated build system that FBVF is
|
||||
# a dependency of fish_version.o, and that git_version_gen.sh updates it. Make
|
||||
# will then invoke the script, check the timestamp on fish_version.o and FBVF,
|
||||
# see that FBVF is earlier, and then not rebuild fish_version.o. Ninja,
|
||||
# however, decides what to build up-front and will unconditionally rebuild
|
||||
# fish_version.o.
|
||||
#
|
||||
# To avoid this with Ninja, we want to hook into its 'restat' option which we
|
||||
# can do through the BYPRODUCTS feature of CMake. See
|
||||
# https://cmake.org/cmake/help/latest/policy/CMP0058.html
|
||||
#
|
||||
# Unfortunately BYPRODUCTS behaves strangely with the Makefile generator: it
|
||||
# marks FBVF as generated and then CMake itself will `touch` it on every build,
|
||||
# meaning that using BYPRODUCTS will cause fish_version.o to be rebuilt
|
||||
# unconditionally with the Makefile generator. Thus we want to use the
|
||||
# natural-and-naive approach for Makefiles.
|
||||
|
||||
# **IMPORTANT** If you touch these build rules, please test both Ninja and
|
||||
# Makefile generators with both a clean and dirty git tree. Verify that both
|
||||
# generated build systems rebuild fish when the git tree goes from dirty to
|
||||
# clean (and vice versa), and verify they do NOT rebuild it when the git tree
|
||||
# stays the same (incremental builds must be fast).
|
||||
|
||||
# Just a handy abbreviation.
|
||||
SET(FBVF FISH-BUILD-VERSION-FILE)
|
||||
|
||||
# TODO: find a cleaner way to do this.
|
||||
IF (${CMAKE_GENERATOR} STREQUAL Ninja)
|
||||
SET(FBVF-OUTPUT fish-build-version-witness.txt)
|
||||
SET(CFBVF-BYPRODUCTS ${FBVF})
|
||||
ELSE(${CMAKE_GENERATOR} STREQUAL Ninja)
|
||||
SET(FBVF-OUTPUT ${FBVF})
|
||||
SET(CFBVF-BYPRODUCTS)
|
||||
ENDIF(${CMAKE_GENERATOR} STREQUAL Ninja)
|
||||
|
||||
# Set up the version targets
|
||||
ADD_CUSTOM_TARGET(CHECK-FISH-BUILD-VERSION-FILE
|
||||
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build_tools/git_version_gen.sh ${CMAKE_CURRENT_BINARY_DIR}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
BYPRODUCTS ${CFBVF-BYPRODUCTS})
|
||||
|
||||
ADD_CUSTOM_COMMAND(OUTPUT ${FBVF-OUTPUT}
|
||||
DEPENDS CHECK-FISH-BUILD-VERSION-FILE)
|
||||
|
||||
# Abbreviation for the target.
|
||||
SET(CFBVF CHECK-FISH-BUILD-VERSION-FILE)
|
||||
42
cmake/gettext.cmake
Normal file
42
cmake/gettext.cmake
Normal file
@@ -0,0 +1,42 @@
|
||||
SET(languages de en fr nb nn pl pt_BR sv zh_CN)
|
||||
|
||||
INCLUDE(FeatureSummary)
|
||||
|
||||
OPTION(WITH_GETTEXT "translate messages if gettext is available" ON)
|
||||
IF(WITH_GETTEXT)
|
||||
FIND_PACKAGE(Intl)
|
||||
FIND_PACKAGE(Gettext)
|
||||
IF(GETTEXT_FOUND)
|
||||
SET(HAVE_GETTEXT 1)
|
||||
INCLUDE_DIRECTORIES(${Intl_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ADD_FEATURE_INFO(gettext GETTEXT_FOUND "translate messages with gettext")
|
||||
|
||||
# Define translations
|
||||
IF(GETTEXT_FOUND)
|
||||
FOREACH(lang ${languages})
|
||||
# Our translations aren't set up entirely as CMake expects, so installation is done in
|
||||
# cmake/Install.cmake instead of using INSTALL_DESTINATION
|
||||
GETTEXT_PROCESS_PO_FILES(${lang} ALL
|
||||
PO_FILES po/${lang}.po)
|
||||
ENDFOREACH()
|
||||
ENDIF()
|
||||
|
||||
|
||||
# libintl.h can be compiled into the stdlib on some GLibC systems
|
||||
IF(Intl_FOUND AND Intl_LIBRARIES)
|
||||
SET(LIBINTL_INCLUDE "#include <libintl.h>")
|
||||
SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${Intl_INCLUDE_DIR})
|
||||
SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${Intl_LIBRARIES})
|
||||
ENDIF()
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
${LIBINTL_INCLUDE}
|
||||
#include <stdlib.h>
|
||||
int main () {
|
||||
extern int _nl_msg_cat_cntr;
|
||||
int tmp = _nl_msg_cat_cntr;
|
||||
exit(tmp);
|
||||
}
|
||||
"
|
||||
HAVE__NL_MSG_CAT_CNTR)
|
||||
266
color.cpp
266
color.cpp
@@ -1,266 +0,0 @@
|
||||
/** \file color.cpp Color class implementation
|
||||
*/
|
||||
|
||||
#include "color.h"
|
||||
#include "fallback.h"
|
||||
|
||||
bool rgb_color_t::try_parse_special(const wcstring &special) {
|
||||
bzero(&data, sizeof data);
|
||||
const wchar_t *name = special.c_str();
|
||||
if (! wcscasecmp(name, L"normal")) {
|
||||
this->type = type_normal;
|
||||
} else if (! wcscasecmp(name, L"reset")) {
|
||||
this->type = type_reset;
|
||||
} else if (! wcscasecmp(name, L"ignore")) {
|
||||
this->type = type_ignore;
|
||||
} else {
|
||||
this->type = type_none;
|
||||
}
|
||||
return this->type != type_none;
|
||||
}
|
||||
|
||||
static int parse_hex_digit(wchar_t x) {
|
||||
switch (x) {
|
||||
case L'0': return 0x0;
|
||||
case L'1': return 0x1;
|
||||
case L'2': return 0x2;
|
||||
case L'3': return 0x3;
|
||||
case L'4': return 0x4;
|
||||
case L'5': return 0x5;
|
||||
case L'6': return 0x6;
|
||||
case L'7': return 0x7;
|
||||
case L'8': return 0x8;
|
||||
case L'9': return 0x9;
|
||||
case L'a':case L'A': return 0xA;
|
||||
case L'b':case L'B': return 0xB;
|
||||
case L'c':case L'C': return 0xC;
|
||||
case L'd':case L'D': return 0xD;
|
||||
case L'e':case L'E': return 0xE;
|
||||
case L'f':case L'F': return 0xF;
|
||||
default: return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned long squared_difference(long p1, long p2)
|
||||
{
|
||||
unsigned long diff = (unsigned long)labs(p1 - p2);
|
||||
return diff * diff;
|
||||
}
|
||||
|
||||
static unsigned char convert_color(const unsigned char rgb[3], const uint32_t *colors, size_t color_count) {
|
||||
long r = rgb[0], g = rgb[1], b = rgb[2];
|
||||
unsigned long best_distance = (unsigned long)(-1);
|
||||
unsigned char best_index = (unsigned char)(-1);
|
||||
for (unsigned char idx = 0; idx < color_count; idx++) {
|
||||
uint32_t color = colors[idx];
|
||||
long test_r = (color >> 16) & 0xFF, test_g = (color >> 8) & 0xFF, test_b = (color >> 0) & 0xFF;
|
||||
unsigned long distance = squared_difference(r, test_r) + squared_difference(g, test_g) + squared_difference(b, test_b);
|
||||
if (distance <= best_distance) {
|
||||
best_index = idx;
|
||||
best_distance = distance;
|
||||
}
|
||||
}
|
||||
return best_index;
|
||||
|
||||
}
|
||||
|
||||
bool rgb_color_t::try_parse_rgb(const wcstring &name) {
|
||||
bzero(&data, sizeof data);
|
||||
/* We support the following style of rgb formats (case insensitive):
|
||||
#FA3
|
||||
#F3A035
|
||||
FA3
|
||||
F3A035
|
||||
*/
|
||||
|
||||
size_t digit_idx = 0, len = name.size();
|
||||
|
||||
/* Skip any leading # */
|
||||
if (len > 0 && name.at(0) == L'#')
|
||||
digit_idx++;
|
||||
|
||||
bool success = false;
|
||||
size_t i;
|
||||
if (len - digit_idx == 3) {
|
||||
// type FA3
|
||||
for (i=0; i < 3; i++) {
|
||||
int val = parse_hex_digit(name.at(digit_idx++));
|
||||
if (val < 0) break;
|
||||
data.rgb[i] = val*16+val;
|
||||
}
|
||||
success = (i == 3);
|
||||
} else if (len - digit_idx == 6) {
|
||||
// type F3A035
|
||||
for (i=0; i < 3; i++) {
|
||||
int hi = parse_hex_digit(name.at(digit_idx++));
|
||||
int lo = parse_hex_digit(name.at(digit_idx++));
|
||||
if (lo < 0 || hi < 0) break;
|
||||
data.rgb[i] = hi*16+lo;
|
||||
}
|
||||
success = (i == 3);
|
||||
}
|
||||
if (success) {
|
||||
this->type = type_rgb;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
struct named_color_t {
|
||||
const wchar_t * name;
|
||||
unsigned char idx;
|
||||
unsigned char rgb[3];
|
||||
};
|
||||
|
||||
static const named_color_t named_colors[11] = {
|
||||
{L"black", 0, {0, 0, 0}},
|
||||
{L"red", 1, {0xFF, 0, 0}},
|
||||
{L"green", 2, {0, 0xFF, 0}},
|
||||
{L"brown", 3, {0x72, 0x50, 0}},
|
||||
{L"yellow", 3, {0xFF, 0xFF, 0}},
|
||||
{L"blue", 4, {0, 0, 0xFF}},
|
||||
{L"magenta", 5, {0xFF, 0, 0xFF}},
|
||||
{L"purple", 5, {0xFF, 0, 0xFF}},
|
||||
{L"cyan", 6, {0, 0xFF, 0xFF}},
|
||||
{L"white", 7, {0xFF, 0xFF, 0xFF}},
|
||||
{L"normal", 8, {0xFF, 0xFF, 0XFF}}
|
||||
};
|
||||
|
||||
bool rgb_color_t::try_parse_named(const wcstring &str) {
|
||||
bzero(&data, sizeof data);
|
||||
size_t max = sizeof named_colors / sizeof *named_colors;
|
||||
for (size_t idx=0; idx < max; idx++) {
|
||||
if (0 == wcscasecmp(str.c_str(), named_colors[idx].name)) {
|
||||
data.name_idx = named_colors[idx].idx;
|
||||
this->type = type_named;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static const wchar_t *name_for_color_idx(unsigned char idx) {
|
||||
size_t max = sizeof named_colors / sizeof *named_colors;
|
||||
for (size_t i=0; i < max; i++) {
|
||||
if (named_colors[i].idx == idx) {
|
||||
return named_colors[i].name;
|
||||
}
|
||||
}
|
||||
return L"unknown";
|
||||
}
|
||||
|
||||
rgb_color_t::rgb_color_t(unsigned char t, unsigned char i) : type(t), flags(), data() {
|
||||
data.name_idx = i;
|
||||
}
|
||||
|
||||
rgb_color_t rgb_color_t::normal() { return rgb_color_t(type_normal); }
|
||||
rgb_color_t rgb_color_t::reset() { return rgb_color_t(type_reset); }
|
||||
rgb_color_t rgb_color_t::ignore() { return rgb_color_t(type_ignore); }
|
||||
rgb_color_t rgb_color_t::none() { return rgb_color_t(type_none); }
|
||||
rgb_color_t rgb_color_t::white() { return rgb_color_t(type_named, 7); }
|
||||
rgb_color_t rgb_color_t::black() { return rgb_color_t(type_named, 0); }
|
||||
|
||||
static unsigned char term8_color_for_rgb(const unsigned char rgb[3]) {
|
||||
const uint32_t kColors[] = {
|
||||
0x000000, //Black
|
||||
0xFF0000, //Red
|
||||
0x00FF00, //Green
|
||||
0xFFFF00, //Yellow
|
||||
0x0000FF, //Blue
|
||||
0xFF00FF, //Magenta
|
||||
0x00FFFF, //Cyan
|
||||
0xFFFFFF, //White
|
||||
};
|
||||
return convert_color(rgb, kColors, sizeof kColors / sizeof *kColors);
|
||||
}
|
||||
|
||||
static unsigned char term256_color_for_rgb(const unsigned char rgb[3]) {
|
||||
const uint32_t kColors[240] = {
|
||||
0x000000, 0x00005f, 0x000087, 0x0000af, 0x0000d7, 0x0000ff, 0x005f00, 0x005f5f,
|
||||
0x005f87, 0x005faf, 0x005fd7, 0x005fff, 0x008700, 0x00875f, 0x008787, 0x0087af,
|
||||
0x0087d7, 0x0087ff, 0x00af00, 0x00af5f, 0x00af87, 0x00afaf, 0x00afd7, 0x00afff,
|
||||
0x00d700, 0x00d75f, 0x00d787, 0x00d7af, 0x00d7d7, 0x00d7ff, 0x00ff00, 0x00ff5f,
|
||||
0x00ff87, 0x00ffaf, 0x00ffd7, 0x00ffff, 0x5f0000, 0x5f005f, 0x5f0087, 0x5f00af,
|
||||
0x5f00d7, 0x5f00ff, 0x5f5f00, 0x5f5f5f, 0x5f5f87, 0x5f5faf, 0x5f5fd7, 0x5f5fff,
|
||||
0x5f8700, 0x5f875f, 0x5f8787, 0x5f87af, 0x5f87d7, 0x5f87ff, 0x5faf00, 0x5faf5f,
|
||||
0x5faf87, 0x5fafaf, 0x5fafd7, 0x5fafff, 0x5fd700, 0x5fd75f, 0x5fd787, 0x5fd7af,
|
||||
0x5fd7d7, 0x5fd7ff, 0x5fff00, 0x5fff5f, 0x5fff87, 0x5fffaf, 0x5fffd7, 0x5fffff,
|
||||
0x870000, 0x87005f, 0x870087, 0x8700af, 0x8700d7, 0x8700ff, 0x875f00, 0x875f5f,
|
||||
0x875f87, 0x875faf, 0x875fd7, 0x875fff, 0x878700, 0x87875f, 0x878787, 0x8787af,
|
||||
0x8787d7, 0x8787ff, 0x87af00, 0x87af5f, 0x87af87, 0x87afaf, 0x87afd7, 0x87afff,
|
||||
0x87d700, 0x87d75f, 0x87d787, 0x87d7af, 0x87d7d7, 0x87d7ff, 0x87ff00, 0x87ff5f,
|
||||
0x87ff87, 0x87ffaf, 0x87ffd7, 0x87ffff, 0xaf0000, 0xaf005f, 0xaf0087, 0xaf00af,
|
||||
0xaf00d7, 0xaf00ff, 0xaf5f00, 0xaf5f5f, 0xaf5f87, 0xaf5faf, 0xaf5fd7, 0xaf5fff,
|
||||
0xaf8700, 0xaf875f, 0xaf8787, 0xaf87af, 0xaf87d7, 0xaf87ff, 0xafaf00, 0xafaf5f,
|
||||
0xafaf87, 0xafafaf, 0xafafd7, 0xafafff, 0xafd700, 0xafd75f, 0xafd787, 0xafd7af,
|
||||
0xafd7d7, 0xafd7ff, 0xafff00, 0xafff5f, 0xafff87, 0xafffaf, 0xafffd7, 0xafffff,
|
||||
0xd70000, 0xd7005f, 0xd70087, 0xd700af, 0xd700d7, 0xd700ff, 0xd75f00, 0xd75f5f,
|
||||
0xd75f87, 0xd75faf, 0xd75fd7, 0xd75fff, 0xd78700, 0xd7875f, 0xd78787, 0xd787af,
|
||||
0xd787d7, 0xd787ff, 0xd7af00, 0xd7af5f, 0xd7af87, 0xd7afaf, 0xd7afd7, 0xd7afff,
|
||||
0xd7d700, 0xd7d75f, 0xd7d787, 0xd7d7af, 0xd7d7d7, 0xd7d7ff, 0xd7ff00, 0xd7ff5f,
|
||||
0xd7ff87, 0xd7ffaf, 0xd7ffd7, 0xd7ffff, 0xff0000, 0xff005f, 0xff0087, 0xff00af,
|
||||
0xff00d7, 0xff00ff, 0xff5f00, 0xff5f5f, 0xff5f87, 0xff5faf, 0xff5fd7, 0xff5fff,
|
||||
0xff8700, 0xff875f, 0xff8787, 0xff87af, 0xff87d7, 0xff87ff, 0xffaf00, 0xffaf5f,
|
||||
0xffaf87, 0xffafaf, 0xffafd7, 0xffafff, 0xffd700, 0xffd75f, 0xffd787, 0xffd7af,
|
||||
0xffd7d7, 0xffd7ff, 0xffff00, 0xffff5f, 0xffff87, 0xffffaf, 0xffffd7, 0xffffff,
|
||||
0x080808, 0x121212, 0x1c1c1c, 0x262626, 0x303030, 0x3a3a3a, 0x444444, 0x4e4e4e,
|
||||
0x585858, 0x626262, 0x6c6c6c, 0x767676, 0x808080, 0x8a8a8a, 0x949494, 0x9e9e9e,
|
||||
0xa8a8a8, 0xb2b2b2, 0xbcbcbc, 0xc6c6c6, 0xd0d0d0, 0xdadada, 0xe4e4e4, 0xeeeeee
|
||||
};
|
||||
return 16 + convert_color(rgb, kColors, sizeof kColors / sizeof *kColors);
|
||||
}
|
||||
|
||||
unsigned char rgb_color_t::to_term256_index() const {
|
||||
assert(type == type_rgb);
|
||||
return term256_color_for_rgb(data.rgb);
|
||||
}
|
||||
|
||||
unsigned char rgb_color_t::to_name_index() const {
|
||||
assert(type == type_named || type == type_rgb);
|
||||
if (type == type_named) {
|
||||
return data.name_idx;
|
||||
} else if (type == type_rgb) {
|
||||
return term8_color_for_rgb(data.rgb);
|
||||
} else {
|
||||
/* This is an error */
|
||||
return (unsigned char)(-1);
|
||||
}
|
||||
}
|
||||
|
||||
void rgb_color_t::parse(const wcstring &str) {
|
||||
bool success = false;
|
||||
if (! success) success = try_parse_special(str);
|
||||
if (! success) success = try_parse_named(str);
|
||||
if (! success) success = try_parse_rgb(str);
|
||||
if (! success) {
|
||||
bzero(this->data.rgb, sizeof this->data.rgb);
|
||||
this->type = type_none;
|
||||
}
|
||||
}
|
||||
|
||||
rgb_color_t::rgb_color_t(const wcstring &str) {
|
||||
this->parse(str);
|
||||
}
|
||||
|
||||
rgb_color_t::rgb_color_t(const std::string &str) {
|
||||
this->parse(str2wcstring(str));
|
||||
}
|
||||
|
||||
wcstring rgb_color_t::description() const {
|
||||
switch (type) {
|
||||
case type_none:
|
||||
return L"none";
|
||||
case type_named:
|
||||
return format_string(L"named(%d: %ls)", (int)data.name_idx, name_for_color_idx(data.name_idx));
|
||||
case type_rgb:
|
||||
return format_string(L"rgb(0x%02x%02x%02x)", data.rgb[0], data.rgb[1], data.rgb[2]);
|
||||
case type_reset:
|
||||
return L"reset";
|
||||
case type_normal:
|
||||
return L"normal";
|
||||
case type_ignore:
|
||||
return L"ignore";
|
||||
default:
|
||||
abort();
|
||||
return L"";
|
||||
}
|
||||
}
|
||||
133
color.h
133
color.h
@@ -1,133 +0,0 @@
|
||||
/** \file color.h Color class.
|
||||
*/
|
||||
#ifndef FISH_COLOR_H
|
||||
#define FISH_COLOR_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <cstddef>
|
||||
#include "config.h"
|
||||
#include "common.h"
|
||||
|
||||
|
||||
/* A type that represents a color. We work hard to keep it at a size of 4 bytes. */
|
||||
class rgb_color_t {
|
||||
|
||||
/* Types */
|
||||
enum {
|
||||
type_none,
|
||||
type_named,
|
||||
type_rgb,
|
||||
type_normal,
|
||||
type_reset,
|
||||
type_ignore
|
||||
};
|
||||
unsigned char type:4;
|
||||
|
||||
/* Flags */
|
||||
enum {
|
||||
flag_bold = 1 << 0,
|
||||
flag_underline = 1 << 1
|
||||
};
|
||||
unsigned char flags:4;
|
||||
|
||||
union {
|
||||
unsigned char name_idx; //0-10
|
||||
unsigned char rgb[3];
|
||||
} data;
|
||||
|
||||
/** Try parsing a special color name like "normal" */
|
||||
bool try_parse_special(const wcstring &str);
|
||||
|
||||
/** Try parsing an rgb color like "#F0A030" */
|
||||
bool try_parse_rgb(const wcstring &str);
|
||||
|
||||
/** Try parsing an explicit color name like "magenta" */
|
||||
bool try_parse_named(const wcstring &str);
|
||||
|
||||
/* Parsing entry point */
|
||||
void parse(const wcstring &str);
|
||||
|
||||
/** Private constructor */
|
||||
explicit rgb_color_t(unsigned char t, unsigned char i=0);
|
||||
|
||||
public:
|
||||
|
||||
/** Default constructor of type none */
|
||||
explicit rgb_color_t() : type(type_none), flags(), data() {}
|
||||
|
||||
/** Parse a color from a string */
|
||||
explicit rgb_color_t(const wcstring &str);
|
||||
explicit rgb_color_t(const std::string &str);
|
||||
|
||||
/** Returns white */
|
||||
static rgb_color_t white();
|
||||
|
||||
/** Returns black */
|
||||
static rgb_color_t black();
|
||||
|
||||
/** Returns the reset special color */
|
||||
static rgb_color_t reset();
|
||||
|
||||
/** Returns the normal special color */
|
||||
static rgb_color_t normal();
|
||||
|
||||
/** Returns the ignore special color */
|
||||
static rgb_color_t ignore();
|
||||
|
||||
/** Returns the none special color */
|
||||
static rgb_color_t none();
|
||||
|
||||
/** Returns whether the color is the ignore special color */
|
||||
bool is_ignore(void) const { return type == type_ignore; }
|
||||
|
||||
/** Returns whether the color is the normal special color */
|
||||
bool is_normal(void) const { return type == type_normal; }
|
||||
|
||||
/** Returns whether the color is the reset special color */
|
||||
bool is_reset(void) const { return type == type_reset; }
|
||||
|
||||
/** Returns whether the color is the none special color */
|
||||
bool is_none(void) const { return type == type_none; }
|
||||
|
||||
/** Returns whether the color is a named color (like "magenta") */
|
||||
bool is_named(void) const { return type == type_named; }
|
||||
|
||||
/** Returns whether the color is specified via RGB components */
|
||||
bool is_rgb(void) const { return type == type_rgb; }
|
||||
|
||||
/** Returns whether the color is special, that is, not rgb or named */
|
||||
bool is_special(void) const { return type != type_named && type != type_rgb; }
|
||||
|
||||
/** Returns a description of the color */
|
||||
wcstring description() const;
|
||||
|
||||
/** Returns the name index for the given color. Requires that the color be named or RGB. */
|
||||
unsigned char to_name_index() const;
|
||||
|
||||
/** Returns the term256 index for the given color. Requires that the color be named or RGB. */
|
||||
unsigned char to_term256_index() const;
|
||||
|
||||
/** Returns whether the color is bold */
|
||||
bool is_bold() const { return flags & flag_bold; }
|
||||
|
||||
/** Set whether the color is bold */
|
||||
void set_bold(bool x) { if (x) flags |= flag_bold; else flags &= ~flag_bold; }
|
||||
|
||||
/** Returns whether the color is underlined */
|
||||
bool is_underline() const { return !! (flags & flag_underline); }
|
||||
|
||||
/** Set whether the color is underlined */
|
||||
void set_underline(bool x) { if (x) flags |= flag_underline; else flags &= ~flag_underline; }
|
||||
|
||||
/** Compare two colors for equality */
|
||||
bool operator==(const rgb_color_t &other) const {
|
||||
return type == other.type && ! memcmp(&data, &other.data, sizeof data);
|
||||
}
|
||||
|
||||
/** Compare two colors for inequality */
|
||||
bool operator!=(const rgb_color_t &other) const {
|
||||
return !(*this == other);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
2035
common.cpp
2035
common.cpp
File diff suppressed because it is too large
Load Diff
747
common.h
747
common.h
@@ -1,747 +0,0 @@
|
||||
/** \file common.h
|
||||
Prototypes for various functions, mostly string utilities, that are used by most parts of fish.
|
||||
*/
|
||||
|
||||
#ifndef FISH_COMMON_H
|
||||
/**
|
||||
Header guard
|
||||
*/
|
||||
#define FISH_COMMON_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
#include <termios.h>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <pthread.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include "util.h"
|
||||
|
||||
class completion_t;
|
||||
|
||||
/* Common string type */
|
||||
typedef std::wstring wcstring;
|
||||
typedef std::vector<wcstring> wcstring_list_t;
|
||||
|
||||
/**
|
||||
Maximum number of bytes used by a single utf-8 character
|
||||
*/
|
||||
#define MAX_UTF8_BYTES 6
|
||||
|
||||
/**
|
||||
This is in the unicode private use area.
|
||||
*/
|
||||
#define ENCODE_DIRECT_BASE 0xf100
|
||||
|
||||
/**
|
||||
Highest legal ascii value
|
||||
*/
|
||||
#define ASCII_MAX 127u
|
||||
|
||||
/**
|
||||
Highest legal 16-bit unicode value
|
||||
*/
|
||||
#define UCS2_MAX 0xffffu
|
||||
|
||||
/**
|
||||
Highest legal byte value
|
||||
*/
|
||||
#define BYTE_MAX 0xffu
|
||||
|
||||
/**
|
||||
Escape special fish syntax characters like the semicolon
|
||||
*/
|
||||
#define UNESCAPE_SPECIAL 1
|
||||
|
||||
/**
|
||||
Allow incomplete escape sequences
|
||||
*/
|
||||
#define UNESCAPE_INCOMPLETE 2
|
||||
|
||||
/* Flags for the escape() and escape_string() functions */
|
||||
enum {
|
||||
/** Escape all characters, including magic characters like the semicolon */
|
||||
ESCAPE_ALL = 1 << 0,
|
||||
|
||||
/** Do not try to use 'simplified' quoted escapes, and do not use empty quotes as the empty string */
|
||||
ESCAPE_NO_QUOTED = 1 << 1,
|
||||
|
||||
/** Do not escape tildes */
|
||||
ESCAPE_NO_TILDE = 1 << 2
|
||||
};
|
||||
typedef unsigned int escape_flags_t;
|
||||
|
||||
/**
|
||||
Helper macro for errors
|
||||
*/
|
||||
#define VOMIT_ON_FAILURE(a) do { if (0 != (a)) { int err = errno; fprintf(stderr, "%s failed on line %d in file %s: %d (%s)\n", #a, __LINE__, __FILE__, err, strerror(err)); abort(); }} while (0)
|
||||
|
||||
/** Exits without invoking destructors (via _exit), useful for code after fork. */
|
||||
void exit_without_destructors(int code) __attribute__ ((noreturn));
|
||||
|
||||
/**
|
||||
Save the shell mode on startup so we can restore them on exit
|
||||
*/
|
||||
extern struct termios shell_modes;
|
||||
|
||||
/**
|
||||
The character to use where the text has been truncated. Is an
|
||||
ellipsis on unicode system and a $ on other systems.
|
||||
*/
|
||||
extern wchar_t ellipsis_char;
|
||||
|
||||
/**
|
||||
The verbosity level of fish. If a call to debug has a severity
|
||||
level higher than \c debug_level, it will not be printed.
|
||||
*/
|
||||
extern int debug_level;
|
||||
|
||||
/**
|
||||
Profiling flag. True if commands should be profiled.
|
||||
*/
|
||||
extern char *profile;
|
||||
|
||||
/**
|
||||
Name of the current program. Should be set at startup. Used by the
|
||||
debug function.
|
||||
*/
|
||||
extern const wchar_t *program_name;
|
||||
|
||||
/**
|
||||
This macro is used to check that an input argument is not null. It
|
||||
is a bit lika a non-fatal form of assert. Instead of exit-ing on
|
||||
failiure, the current function is ended at once. The second
|
||||
parameter is the return value of the current function on failiure.
|
||||
*/
|
||||
#define CHECK( arg, retval ) \
|
||||
if( !(arg) ) \
|
||||
{ \
|
||||
debug( 0, \
|
||||
"function %s called with null value for argument %s. ", \
|
||||
__func__, \
|
||||
#arg ); \
|
||||
bugreport(); \
|
||||
show_stackframe(); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
/**
|
||||
Pause for input, then exit the program. If supported, print a backtrace first.
|
||||
*/
|
||||
#define FATAL_EXIT() \
|
||||
{ \
|
||||
char exit_read_buff; \
|
||||
show_stackframe(); \
|
||||
read( 0, &exit_read_buff, 1 ); \
|
||||
exit_without_destructors( 1 ); \
|
||||
} \
|
||||
|
||||
|
||||
/**
|
||||
Exit program at once, leaving an error message about running out of memory.
|
||||
*/
|
||||
#define DIE_MEM() \
|
||||
{ \
|
||||
fwprintf( stderr, \
|
||||
L"fish: Out of memory on line %ld of file %s, shutting down fish\n", \
|
||||
(long)__LINE__, \
|
||||
__FILE__ ); \
|
||||
FATAL_EXIT(); \
|
||||
}
|
||||
|
||||
/**
|
||||
Check if signals are blocked. If so, print an error message and
|
||||
return from the function performing this check.
|
||||
*/
|
||||
#define CHECK_BLOCK( retval ) \
|
||||
if( signal_is_blocked() ) \
|
||||
{ \
|
||||
debug( 0, \
|
||||
"function %s called while blocking signals. ", \
|
||||
__func__); \
|
||||
bugreport(); \
|
||||
show_stackframe(); \
|
||||
return retval; \
|
||||
}
|
||||
|
||||
/**
|
||||
Shorthand for wgettext call
|
||||
*/
|
||||
#define _(wstr) wgettext((const wchar_t *)wstr)
|
||||
|
||||
/**
|
||||
Noop, used to tell xgettext that a string should be translated,
|
||||
even though it is not directly sent to wgettext.
|
||||
*/
|
||||
#define N_(wstr) wstr
|
||||
|
||||
/**
|
||||
Check if the specified string element is a part of the specified string list
|
||||
*/
|
||||
#define contains( str,... ) contains_internal( str, __VA_ARGS__, NULL )
|
||||
|
||||
/**
|
||||
Print a stack trace to stderr
|
||||
*/
|
||||
void show_stackframe();
|
||||
|
||||
|
||||
/**
|
||||
Read a line from the stream f into the string. Returns
|
||||
the number of bytes read or -1 on failiure.
|
||||
|
||||
If the carriage return character is encountered, it is
|
||||
ignored. fgetws() considers the line to end if reading the file
|
||||
results in either a newline (L'\n') character, the null (L'\\0')
|
||||
character or the end of file (WEOF) character.
|
||||
*/
|
||||
int fgetws2(wcstring *s, FILE *f);
|
||||
|
||||
/**
|
||||
Returns a newly allocated wide character string equivalent of the
|
||||
specified multibyte character string
|
||||
|
||||
This function encodes illegal character sequences in a reversible
|
||||
way using the private use area.
|
||||
*/
|
||||
wchar_t *str2wcs( const char *in );
|
||||
|
||||
/**
|
||||
Returns a newly allocated wide character string equivalent of the
|
||||
specified multibyte character string
|
||||
|
||||
This function encodes illegal character sequences in a reversible
|
||||
way using the private use area.
|
||||
*/
|
||||
wcstring str2wcstring( const char *in );
|
||||
wcstring str2wcstring( const std::string &in );
|
||||
|
||||
/**
|
||||
Converts the narrow character string \c in into it's wide
|
||||
equivalent, stored in \c out. \c out must have enough space to fit
|
||||
the entire string.
|
||||
|
||||
This function encodes illegal character sequences in a reversible
|
||||
way using the private use area.
|
||||
*/
|
||||
wchar_t *str2wcs_internal( const char *in, wchar_t *out );
|
||||
|
||||
/**
|
||||
Returns a newly allocated multibyte character string equivalent of
|
||||
the specified wide character string
|
||||
|
||||
This function decodes illegal character sequences in a reversible
|
||||
way using the private use area.
|
||||
*/
|
||||
char *wcs2str( const wchar_t *in );
|
||||
std::string wcs2string(const wcstring &input);
|
||||
|
||||
/** Test if a string prefixes another. Returns true if a is a prefix of b */
|
||||
bool string_prefixes_string(const wcstring &proposed_prefix, const wcstring &value);
|
||||
bool string_prefixes_string(const wchar_t *proposed_prefix, const wcstring &value);
|
||||
|
||||
/** Test if a string is a suffix of another */
|
||||
bool string_suffixes_string(const wcstring &proposed_suffix, const wcstring &value);
|
||||
bool string_suffixes_string(const wchar_t *proposed_suffix, const wcstring &value);
|
||||
|
||||
|
||||
/** Test if a string prefixes another without regard to case. Returns true if a is a prefix of b */
|
||||
bool string_prefixes_string_case_insensitive(const wcstring &proposed_prefix, const wcstring &value);
|
||||
|
||||
/** Test if a list contains a string using a linear search. */
|
||||
bool list_contains_string(const wcstring_list_t &list, const wcstring &str);
|
||||
|
||||
|
||||
void assert_is_main_thread(const char *who);
|
||||
#define ASSERT_IS_MAIN_THREAD_TRAMPOLINE(x) assert_is_main_thread(x)
|
||||
#define ASSERT_IS_MAIN_THREAD() ASSERT_IS_MAIN_THREAD_TRAMPOLINE(__FUNCTION__)
|
||||
|
||||
void assert_is_background_thread(const char *who);
|
||||
#define ASSERT_IS_BACKGROUND_THREAD_TRAMPOLINE(x) assert_is_background_thread(x)
|
||||
#define ASSERT_IS_BACKGROUND_THREAD() ASSERT_IS_BACKGROUND_THREAD_TRAMPOLINE(__FUNCTION__)
|
||||
|
||||
/* Useful macro for asserting that a lock is locked. This doesn't check whether this thread locked it, which it would be nice if it did, but here it is anyways. */
|
||||
void assert_is_locked(void *mutex, const char *who, const char *caller);
|
||||
#define ASSERT_IS_LOCKED(x) assert_is_locked((void *)(&x), #x, __FUNCTION__)
|
||||
|
||||
/**
|
||||
Converts the wide character string \c in into it's narrow
|
||||
equivalent, stored in \c out. \c out must have enough space to fit
|
||||
the entire string.
|
||||
|
||||
This function decodes illegal character sequences in a reversible
|
||||
way using the private use area.
|
||||
*/
|
||||
char *wcs2str_internal( const wchar_t *in, char *out );
|
||||
|
||||
/** Format the specified size (in bytes, kilobytes, etc.) into the specified stringbuffer. */
|
||||
wcstring format_size(long long sz);
|
||||
|
||||
/** Version of format_size that does not allocate memory. */
|
||||
void format_size_safe(char buff[128], unsigned long long sz);
|
||||
|
||||
/** Our crappier versions of debug which is guaranteed to not allocate any memory, or do anything other than call write(). This is useful after a call to fork() with threads. */
|
||||
void debug_safe(int level, const char *msg, const char *param1 = NULL, const char *param2 = NULL, const char *param3 = NULL, const char *param4 = NULL, const char *param5 = NULL, const char *param6 = NULL, const char *param7 = NULL, const char *param8 = NULL, const char *param9 = NULL, const char *param10 = NULL, const char *param11 = NULL, const char *param12 = NULL);
|
||||
|
||||
/** Writes out a long safely */
|
||||
void format_long_safe(char buff[128], long val);
|
||||
void format_long_safe(wchar_t buff[128], long val);
|
||||
|
||||
|
||||
template<typename T>
|
||||
T from_string(const wcstring &x) {
|
||||
T result;
|
||||
std::wstringstream stream(x);
|
||||
stream >> result;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T from_string(const std::string &x) {
|
||||
T result = T();
|
||||
std::stringstream stream(x);
|
||||
stream >> result;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
wcstring to_string(const T &x) {
|
||||
std::wstringstream stream;
|
||||
stream << x;
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
/* wstringstream is a huge memory pig. Let's provide some specializations where we can. */
|
||||
template<>
|
||||
inline wcstring to_string(const long &x) {
|
||||
wchar_t buff[128];
|
||||
format_long_safe(buff, x);
|
||||
return wcstring(buff);
|
||||
}
|
||||
|
||||
template<>
|
||||
inline bool from_string(const std::string &x) {
|
||||
return ! x.empty() && strchr("YTyt1", x.at(0));
|
||||
}
|
||||
|
||||
template<>
|
||||
inline bool from_string(const wcstring &x) {
|
||||
return ! x.empty() && wcschr(L"YTyt1", x.at(0));
|
||||
}
|
||||
|
||||
template<>
|
||||
inline wcstring to_string(const int &x) {
|
||||
return to_string(static_cast<long>(x));
|
||||
}
|
||||
|
||||
|
||||
/* Helper class for managing a null-terminated array of null-terminated strings (of some char type) */
|
||||
template <typename CharType_t>
|
||||
class null_terminated_array_t {
|
||||
CharType_t **array;
|
||||
|
||||
typedef std::basic_string<CharType_t> string_t;
|
||||
typedef std::vector<string_t> string_list_t;
|
||||
|
||||
void swap(null_terminated_array_t<CharType_t> &him) { std::swap(array, him.array); }
|
||||
|
||||
/* Silly function to get the length of a null terminated array of...something */
|
||||
template <typename T>
|
||||
static size_t count_not_null(const T *arr) {
|
||||
size_t len;
|
||||
for (len=0; arr[len] != T(0); len++)
|
||||
;
|
||||
return len;
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return count_not_null(array);
|
||||
}
|
||||
|
||||
void free(void) {
|
||||
if (array != NULL) {
|
||||
for (size_t i = 0; array[i] != NULL; i++) {
|
||||
delete [] array[i];
|
||||
}
|
||||
delete [] array;
|
||||
array = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
null_terminated_array_t() : array(NULL) { }
|
||||
null_terminated_array_t(const string_list_t &argv) : array(NULL) { this->set(argv); }
|
||||
~null_terminated_array_t() { this->free(); }
|
||||
|
||||
/** operator=. Notice the pass-by-value parameter. */
|
||||
null_terminated_array_t& operator=(null_terminated_array_t rhs) {
|
||||
if (this != &rhs)
|
||||
this->swap(rhs);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/* Copy constructor. */
|
||||
null_terminated_array_t(const null_terminated_array_t &him) : array(NULL) {
|
||||
this->set(him.array);
|
||||
}
|
||||
|
||||
void set(const string_list_t &argv) {
|
||||
/* Get rid of the old argv */
|
||||
this->free();
|
||||
|
||||
/* Allocate our null-terminated array of null-terminated strings */
|
||||
size_t i, count = argv.size();
|
||||
this->array = new CharType_t * [count + 1];
|
||||
for (i=0; i < count; i++) {
|
||||
const string_t &str = argv.at(i);
|
||||
this->array[i] = new CharType_t [1 + str.size()];
|
||||
std::copy(str.begin(), str.end(), this->array[i]);
|
||||
this->array[i][str.size()] = CharType_t(0);
|
||||
}
|
||||
this->array[count] = NULL;
|
||||
}
|
||||
|
||||
void set(const CharType_t * const *new_array) {
|
||||
if (new_array == array)
|
||||
return;
|
||||
|
||||
/* Get rid of the old argv */
|
||||
this->free();
|
||||
|
||||
/* Copy the new one */
|
||||
if (new_array) {
|
||||
size_t i, count = count_not_null(new_array);
|
||||
this->array = new CharType_t * [count + 1];
|
||||
for (i=0; i < count; i++) {
|
||||
size_t len = count_not_null(new_array[i]);
|
||||
this->array[i] = new CharType_t [1 + len];
|
||||
std::copy(new_array[i], new_array[i] + len, this->array[i]);
|
||||
this->array[i][len] = CharType_t(0);
|
||||
}
|
||||
this->array[count] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
CharType_t **get() { return array; }
|
||||
const CharType_t * const *get() const { return array; }
|
||||
|
||||
string_list_t to_list() const {
|
||||
string_list_t lst;
|
||||
if (array != NULL) {
|
||||
size_t count = this->size();
|
||||
lst.reserve(count);
|
||||
lst.insert(lst.end(), array, array + count);
|
||||
}
|
||||
return lst;
|
||||
}
|
||||
};
|
||||
|
||||
/* Helper function to convert from a null_terminated_array_t<wchar_t> to a null_terminated_array_t<char_t> */
|
||||
null_terminated_array_t<char> convert_wide_array_to_narrow(const null_terminated_array_t<wchar_t> &arr);
|
||||
|
||||
/* Helper class to cache a narrow version of a wcstring in a malloc'd buffer, so that we can read it after fork() */
|
||||
class narrow_string_rep_t {
|
||||
private:
|
||||
const char *str;
|
||||
|
||||
/* No copying */
|
||||
narrow_string_rep_t &operator=(const narrow_string_rep_t &);
|
||||
narrow_string_rep_t(const narrow_string_rep_t &x);
|
||||
|
||||
public:
|
||||
~narrow_string_rep_t() {
|
||||
free((void *)str);
|
||||
}
|
||||
|
||||
narrow_string_rep_t() : str(NULL) {}
|
||||
|
||||
void set(const wcstring &s) {
|
||||
free((void *)str);
|
||||
str = wcs2str(s.c_str());
|
||||
}
|
||||
|
||||
const char *get() const {
|
||||
return str;
|
||||
}
|
||||
};
|
||||
|
||||
bool is_forked_child();
|
||||
|
||||
/* Basic scoped lock class */
|
||||
class scoped_lock {
|
||||
pthread_mutex_t *lock_obj;
|
||||
bool locked;
|
||||
|
||||
/* No copying */
|
||||
scoped_lock &operator=(const scoped_lock &);
|
||||
scoped_lock(const scoped_lock &);
|
||||
|
||||
public:
|
||||
void lock(void);
|
||||
void unlock(void);
|
||||
scoped_lock(pthread_mutex_t &mutex);
|
||||
~scoped_lock();
|
||||
};
|
||||
|
||||
/* Wrapper around wcstok */
|
||||
class wcstokenizer {
|
||||
wchar_t *buffer, *str, *state;
|
||||
const wcstring sep;
|
||||
|
||||
/* No copying */
|
||||
wcstokenizer &operator=(const wcstokenizer &);
|
||||
wcstokenizer(const wcstokenizer &);
|
||||
|
||||
public:
|
||||
wcstokenizer(const wcstring &s, const wcstring &separator);
|
||||
bool next(wcstring &result);
|
||||
~wcstokenizer();
|
||||
};
|
||||
|
||||
/**
|
||||
Appends a path component, with a / if necessary
|
||||
*/
|
||||
void append_path_component(wcstring &path, const wcstring &component);
|
||||
|
||||
wcstring format_string(const wchar_t *format, ...);
|
||||
wcstring vformat_string(const wchar_t *format, va_list va_orig);
|
||||
void append_format(wcstring &str, const wchar_t *format, ...);
|
||||
|
||||
/**
|
||||
Returns a newly allocated wide character string array equivalent of
|
||||
the specified multibyte character string array
|
||||
*/
|
||||
char **wcsv2strv( const wchar_t * const *in );
|
||||
|
||||
/**
|
||||
Test if the given string is a valid variable name.
|
||||
|
||||
\return null if this is a valid name, and a pointer to the first invalid character otherwise
|
||||
*/
|
||||
|
||||
wchar_t *wcsvarname( const wchar_t *str );
|
||||
|
||||
|
||||
/**
|
||||
Test if the given string is a valid function name.
|
||||
|
||||
\return null if this is a valid name, and a pointer to the first invalid character otherwise
|
||||
*/
|
||||
|
||||
const wchar_t *wcsfuncname( const wchar_t *str );
|
||||
|
||||
/**
|
||||
Test if the given string is valid in a variable name
|
||||
|
||||
\return 1 if this is a valid name, 0 otherwise
|
||||
*/
|
||||
|
||||
int wcsvarchr( wchar_t chr );
|
||||
|
||||
|
||||
/**
|
||||
A wcswidth workalike. Fish uses this since the regular wcswidth seems flaky.
|
||||
*/
|
||||
int my_wcswidth( const wchar_t *c );
|
||||
|
||||
/**
|
||||
This functions returns the end of the quoted substring beginning at
|
||||
\c in. The type of quoting character is detemrined by examining \c
|
||||
in. Returns 0 on error.
|
||||
|
||||
\param in the position of the opening quote
|
||||
*/
|
||||
wchar_t *quote_end( const wchar_t *in );
|
||||
|
||||
/**
|
||||
A call to this function will reset the error counter. Some
|
||||
functions print out non-critical error messages. These should check
|
||||
the error_count before, and skip printing the message if
|
||||
MAX_ERROR_COUNT messages have been printed. The error_reset()
|
||||
should be called after each interactive command executes, to allow
|
||||
new messages to be printed.
|
||||
*/
|
||||
void error_reset();
|
||||
|
||||
/**
|
||||
This function behaves exactly like a wide character equivalent of
|
||||
the C function setlocale, except that it will also try to detect if
|
||||
the user is using a Unicode character set, and if so, use the
|
||||
unicode ellipsis character as ellipsis, instead of '$'.
|
||||
*/
|
||||
wcstring wsetlocale( int category, const wchar_t *locale );
|
||||
|
||||
/**
|
||||
Checks if \c needle is included in the list of strings specified. A warning is printed if needle is zero.
|
||||
|
||||
\param needle the string to search for in the list
|
||||
|
||||
\return zero if needle is not found, of if needle is null, non-zero otherwise
|
||||
*/
|
||||
__sentinel bool contains_internal( const wchar_t *needle, ... );
|
||||
__sentinel bool contains_internal( const wcstring &needle, ... );
|
||||
|
||||
/**
|
||||
Call read while blocking the SIGCHLD signal. Should only be called
|
||||
if you _know_ there is data available for reading, or the program
|
||||
will hang until there is data.
|
||||
*/
|
||||
long read_blocked(int fd, void *buf, size_t count);
|
||||
|
||||
/**
|
||||
Loop a write request while failiure is non-critical. Return -1 and set errno
|
||||
in case of critical error.
|
||||
*/
|
||||
ssize_t write_loop(int fd, const char *buff, size_t count);
|
||||
|
||||
/**
|
||||
Loop a read request while failiure is non-critical. Return -1 and set errno
|
||||
in case of critical error.
|
||||
*/
|
||||
ssize_t read_loop(int fd, void *buff, size_t count);
|
||||
|
||||
|
||||
/**
|
||||
Issue a debug message with printf-style string formating and
|
||||
automatic line breaking. The string will begin with the string \c
|
||||
program_name, followed by a colon and a whitespace.
|
||||
|
||||
Because debug is often called to tell the user about an error,
|
||||
before using wperror to give a specific error message, debug will
|
||||
never ever modify the value of errno.
|
||||
|
||||
\param level the priority of the message. Lower number means higher priority. Messages with a priority_number higher than \c debug_level will be ignored..
|
||||
\param msg the message format string.
|
||||
|
||||
Example:
|
||||
|
||||
<code>debug( 1, L"Pi = %.3f", M_PI );</code>
|
||||
|
||||
will print the string 'fish: Pi = 3.141', given that debug_level is 1 or higher, and that program_name is 'fish'.
|
||||
*/
|
||||
void debug( int level, const char *msg, ... );
|
||||
void debug( int level, const wchar_t *msg, ... );
|
||||
|
||||
/**
|
||||
Replace special characters with backslash escape sequences. Newline is
|
||||
replaced with \n, etc.
|
||||
|
||||
\param in The string to be escaped
|
||||
\param escape_all Whether all characters wich hold special meaning in fish (Pipe, semicolon, etc,) should be escaped, or only unprintable characters
|
||||
\return The escaped string, or 0 if there is not enough memory
|
||||
*/
|
||||
|
||||
wchar_t *escape( const wchar_t *in, escape_flags_t flags );
|
||||
wcstring escape_string( const wcstring &in, escape_flags_t flags );
|
||||
|
||||
/**
|
||||
Expand backslashed escapes and substitute them with their unescaped
|
||||
counterparts. Also optionally change the wildcards, the tilde
|
||||
character and a few more into constants which are defined in a
|
||||
private use area of Unicode. This assumes wchar_t is a unicode
|
||||
character set.
|
||||
|
||||
The result must be free()d. The original string is not modified. If
|
||||
an invalid sequence is specified, 0 is returned.
|
||||
|
||||
*/
|
||||
wchar_t *unescape( const wchar_t * in,
|
||||
int escape_special );
|
||||
|
||||
bool unescape_string( wcstring &str,
|
||||
int escape_special );
|
||||
|
||||
|
||||
/**
|
||||
Returns the width of the terminal window, so that not all
|
||||
functions that use these values continually have to keep track of
|
||||
it separately.
|
||||
|
||||
Only works if common_handle_winch is registered to handle winch signals.
|
||||
*/
|
||||
int common_get_width();
|
||||
/**
|
||||
Returns the height of the terminal window, so that not all
|
||||
functions that use these values continually have to keep track of
|
||||
it separatly.
|
||||
|
||||
Only works if common_handle_winch is registered to handle winch signals.
|
||||
*/
|
||||
int common_get_height();
|
||||
|
||||
/**
|
||||
Handle a window change event by looking up the new window size and
|
||||
saving it in an internal variable used by common_get_wisth and
|
||||
common_get_height().
|
||||
*/
|
||||
void common_handle_winch( int signal );
|
||||
|
||||
/**
|
||||
Write paragraph of output to the specified stringbuffer, and redo
|
||||
the linebreaks to fit the current screen.
|
||||
*/
|
||||
void write_screen( const wcstring &msg, wcstring &buff );
|
||||
|
||||
/**
|
||||
Tokenize the specified string into the specified wcstring_list_t.
|
||||
\param val the input string. The contents of this string is not changed.
|
||||
\param out the list in which to place the elements.
|
||||
*/
|
||||
void tokenize_variable_array( const wcstring &val, wcstring_list_t &out);
|
||||
|
||||
/**
|
||||
Make sure the specified direcotry exists. If needed, try to create
|
||||
it and any currently not existing parent directories..
|
||||
|
||||
\return 0 if, at the time of function return the directory exists, -1 otherwise.
|
||||
*/
|
||||
int create_directory( const wcstring &d );
|
||||
|
||||
/**
|
||||
Print a short message about how to file a bug report to stderr
|
||||
*/
|
||||
void bugreport();
|
||||
|
||||
/**
|
||||
Return the number of seconds from the UNIX epoch, with subsecond
|
||||
precision. This function uses the gettimeofday function, and will
|
||||
have the same precision as that function.
|
||||
|
||||
If an error occurs, NAN is returned.
|
||||
*/
|
||||
double timef();
|
||||
|
||||
/**
|
||||
Call the following function early in main to set the main thread.
|
||||
This is our replacement for pthread_main_np().
|
||||
*/
|
||||
void set_main_thread();
|
||||
bool is_main_thread();
|
||||
|
||||
/** Configures thread assertions for testing */
|
||||
void configure_thread_assertions_for_testing();
|
||||
|
||||
/** Set up a guard to complain if we try to do certain things (like take a lock) after calling fork */
|
||||
void setup_fork_guards(void);
|
||||
|
||||
/** Save the value of tcgetpgrp so we can restore it on exit */
|
||||
void save_term_foreground_process_group(void);
|
||||
void restore_term_foreground_process_group(void);
|
||||
|
||||
/** Return whether we are the child of a fork */
|
||||
bool is_forked_child(void);
|
||||
void assert_is_not_forked_child(const char *who);
|
||||
#define ASSERT_IS_NOT_FORKED_CHILD_TRAMPOLINE(x) assert_is_not_forked_child(x)
|
||||
#define ASSERT_IS_NOT_FORKED_CHILD() ASSERT_IS_NOT_FORKED_CHILD_TRAMPOLINE(__FUNCTION__)
|
||||
|
||||
extern "C" {
|
||||
__attribute__((noinline)) void debug_thread_error(void);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
2034
complete.cpp
2034
complete.cpp
File diff suppressed because it is too large
Load Diff
279
complete.h
279
complete.h
@@ -1,279 +0,0 @@
|
||||
/** \file complete.h
|
||||
Prototypes for functions related to tab-completion.
|
||||
|
||||
These functions are used for storing and retrieving tab-completion
|
||||
data, as well as for performing tab-completion.
|
||||
*/
|
||||
|
||||
#ifndef FISH_COMPLETE_H
|
||||
|
||||
/**
|
||||
Header guard
|
||||
*/
|
||||
#define FISH_COMPLETE_H
|
||||
|
||||
|
||||
#include <wchar.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "common.h"
|
||||
/**
|
||||
Use all completions
|
||||
*/
|
||||
#define SHARED 0
|
||||
/**
|
||||
Do not use file completion
|
||||
*/
|
||||
#define NO_FILES 1
|
||||
/**
|
||||
Require a parameter after completion
|
||||
*/
|
||||
#define NO_COMMON 2
|
||||
/**
|
||||
Only use the argument list specifies with completion after
|
||||
option. This is the same as (NO_FILES & NO_COMMON)
|
||||
*/
|
||||
#define EXCLUSIVE 3
|
||||
|
||||
/**
|
||||
Command is a path
|
||||
*/
|
||||
#define PATH 1
|
||||
/**
|
||||
Command is not a path
|
||||
*/
|
||||
#define COMMAND 0
|
||||
|
||||
/**
|
||||
Separator between completion and description
|
||||
*/
|
||||
#define COMPLETE_SEP L'\004'
|
||||
|
||||
/**
|
||||
Separator between completion and description
|
||||
*/
|
||||
#define COMPLETE_SEP_STR L"\004"
|
||||
|
||||
/**
|
||||
Separator between completion items in fish_pager. This is used for
|
||||
completion grouping, e.g. when putting completions with the same
|
||||
descriptions on the same line.
|
||||
*/
|
||||
#define COMPLETE_ITEM_SEP L'\uf500'
|
||||
|
||||
/**
|
||||
Character that separates the completion and description on
|
||||
programmable completions
|
||||
*/
|
||||
#define PROG_COMPLETE_SEP L'\t'
|
||||
|
||||
enum {
|
||||
/**
|
||||
Do not insert space afterwards if this is the only completion. (The
|
||||
default is to try insert a space)
|
||||
*/
|
||||
COMPLETE_NO_SPACE = 1 << 0,
|
||||
|
||||
/**
|
||||
This compeltion is case insensitive.
|
||||
|
||||
Warning: The contents of the completion_t structure is actually
|
||||
different if this flag is set! Specifically, the completion string
|
||||
contains the _entire_ completion token, not only the current
|
||||
*/
|
||||
COMPLETE_NO_CASE = 1 << 1,
|
||||
|
||||
/**
|
||||
This compeltion is the whole argument, not just the remainder. This
|
||||
flag must never be set on completions returned from the complete()
|
||||
function. It is strictly for internal use in the completion code.
|
||||
*/
|
||||
COMPLETE_WHOLE_ARGUMENT = 1 << 2,
|
||||
|
||||
/**
|
||||
This completion may or may not want a space at the end - guess by
|
||||
checking the last character of the completion.
|
||||
*/
|
||||
COMPLETE_AUTO_SPACE = 1 << 3,
|
||||
|
||||
/**
|
||||
This completion should be inserted as-is, without escaping.
|
||||
*/
|
||||
COMPLETE_DONT_ESCAPE = 1 << 4
|
||||
};
|
||||
typedef int complete_flags_t;
|
||||
|
||||
|
||||
class completion_t
|
||||
{
|
||||
|
||||
private:
|
||||
/* No public default constructor */
|
||||
completion_t();
|
||||
public:
|
||||
|
||||
/**
|
||||
The completion string
|
||||
*/
|
||||
wcstring completion;
|
||||
|
||||
/**
|
||||
The description for this completion
|
||||
*/
|
||||
wcstring description;
|
||||
|
||||
/**
|
||||
Flags determining the completion behaviour.
|
||||
|
||||
Determines whether a space should be inserted after this
|
||||
compeltion if it is the only possible completion using the
|
||||
COMPLETE_NO_SPACE flag.
|
||||
|
||||
The COMPLETE_NO_CASE can be used to signal that this completion
|
||||
is case insensitive.
|
||||
*/
|
||||
int flags;
|
||||
|
||||
bool is_case_insensitive() const { return !! (flags & COMPLETE_NO_CASE); }
|
||||
|
||||
/* Construction. Note: defining these so that they are not inlined reduces the executable size. */
|
||||
completion_t(const wcstring &comp, const wcstring &desc = L"", int flags_val = 0);
|
||||
completion_t(const completion_t &);
|
||||
completion_t &operator=(const completion_t &);
|
||||
|
||||
/* The following are needed for sorting and uniquing completions */
|
||||
bool operator < (const completion_t& rhs) const;
|
||||
bool operator == (const completion_t& rhs) const;
|
||||
bool operator != (const completion_t& rhs) const;
|
||||
};
|
||||
|
||||
enum complete_type_t {
|
||||
COMPLETE_DEFAULT,
|
||||
COMPLETE_AUTOSUGGEST
|
||||
};
|
||||
|
||||
/** Given a list of completions, returns a list of their completion fields */
|
||||
wcstring_list_t completions_to_wcstring_list( const std::vector<completion_t> &completions );
|
||||
|
||||
/** Sorts a list of completions */
|
||||
void sort_completions( std::vector<completion_t> &completions);
|
||||
|
||||
/**
|
||||
|
||||
Add a completion.
|
||||
|
||||
All supplied values are copied, they should be freed by or otherwise
|
||||
disposed by the caller.
|
||||
|
||||
Examples:
|
||||
|
||||
The command 'gcc -o' requires that a file follows it, so the
|
||||
NO_COMMON option is suitable. This can be done using the following
|
||||
line:
|
||||
|
||||
complete -c gcc -s o -r
|
||||
|
||||
The command 'grep -d' required that one of the strings 'read',
|
||||
'skip' or 'recurse' is used. As such, it is suitable to specify that
|
||||
a completion requires one of them. This can be done using the
|
||||
following line:
|
||||
|
||||
complete -c grep -s d -x -a "read skip recurse"
|
||||
|
||||
|
||||
\param cmd Command to complete.
|
||||
\param cmd_type If cmd_type is PATH, cmd will be interpreted as the absolute
|
||||
path of the program (optionally containing wildcards), otherwise it
|
||||
will be interpreted as the command name.
|
||||
\param short_opt The single character name of an option. (-a is a short option, --all and -funroll are long options)
|
||||
\param long_opt The multi character name of an option. (-a is a short option, --all and -funroll are long options)
|
||||
\param long_mode Whether to use old style, single dash long options.
|
||||
\param result_mode Whether to search further completions when this
|
||||
completion has been succesfully matched. If result_mode is SHARED,
|
||||
any other completions may also be used. If result_mode is NO_FILES,
|
||||
file completion should not be used, but other completions may be
|
||||
used. If result_mode is NO_COMMON, on option may follow it - only a
|
||||
parameter. If result_mode is EXCLUSIVE, no option may follow it, and
|
||||
file completion is not performed.
|
||||
\param comp A space separated list of completions which may contain subshells.
|
||||
\param desc A description of the completion.
|
||||
\param condition a command to be run to check it this completion should be used. If \c condition is empty, the completion is always used.
|
||||
\param flags A set of completion flags
|
||||
*/
|
||||
void complete_add( const wchar_t *cmd,
|
||||
bool cmd_is_path,
|
||||
wchar_t short_opt,
|
||||
const wchar_t *long_opt,
|
||||
int long_mode,
|
||||
int result_mode,
|
||||
const wchar_t *condition,
|
||||
const wchar_t *comp,
|
||||
const wchar_t *desc,
|
||||
int flags );
|
||||
/**
|
||||
Sets whether the completion list for this command is complete. If
|
||||
true, any options not matching one of the provided options will be
|
||||
flagged as an error by syntax highlighting.
|
||||
*/
|
||||
void complete_set_authoritative( const wchar_t *cmd, bool cmd_type, bool authoritative );
|
||||
|
||||
/**
|
||||
Remove a previously defined completion
|
||||
*/
|
||||
void complete_remove( const wchar_t *cmd,
|
||||
bool cmd_is_path,
|
||||
wchar_t short_opt,
|
||||
const wchar_t *long_opt );
|
||||
|
||||
|
||||
/** Find all completions of the command cmd, insert them into out. If to_load is not NULL, append all commands that we would autoload, but did not (presumably because this is not the main thread) */
|
||||
void complete( const wcstring &cmd, std::vector<completion_t> &comp, complete_type_t type, wcstring_list_t *to_load = NULL );
|
||||
|
||||
/**
|
||||
Print a list of all current completions into the string.
|
||||
|
||||
\param out The string to write completions to
|
||||
*/
|
||||
void complete_print( wcstring &out );
|
||||
|
||||
/**
|
||||
Tests if the specified option is defined for the specified command
|
||||
*/
|
||||
int complete_is_valid_option( const wcstring &str,
|
||||
const wcstring &opt,
|
||||
wcstring_list_t *inErrorsOrNull,
|
||||
bool allow_autoload );
|
||||
|
||||
/**
|
||||
Tests if the specified argument is valid for the specified option
|
||||
and command
|
||||
*/
|
||||
bool complete_is_valid_argument( const wcstring &str,
|
||||
const wcstring &opt,
|
||||
const wcstring &arg );
|
||||
|
||||
|
||||
/**
|
||||
Load command-specific completions for the specified command. This
|
||||
is done automatically whenever completing any given command, so
|
||||
there is no need to call this except in the case of completions
|
||||
with internal dependencies.
|
||||
|
||||
\param cmd the command for which to load command-specific completions
|
||||
\param reload should the commands completions be reloaded, even if they where previously loaded. (This is set to true on actual completions, so that changed completion are updated in running shells)
|
||||
*/
|
||||
void complete_load( const wcstring &cmd, bool reload );
|
||||
|
||||
/**
|
||||
Create a new completion entry
|
||||
|
||||
\param completions The array of completions to append to
|
||||
\param comp The completion string
|
||||
\param desc The description of the completion
|
||||
\param flags completion flags
|
||||
|
||||
*/
|
||||
void append_completion(std::vector<completion_t> &completions, const wcstring &comp, const wcstring &desc = L"", int flags = 0);
|
||||
|
||||
|
||||
#endif
|
||||
840
config.guess
vendored
840
config.guess
vendored
File diff suppressed because it is too large
Load Diff
423
config.sub
vendored
423
config.sub
vendored
@@ -1,44 +1,40 @@
|
||||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
|
||||
# Inc.
|
||||
# Copyright 1992-2015 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2006-02-27'
|
||||
timestamp='2015-03-08'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
# can handle that machine. It does not imply ALL GNU software can.
|
||||
#
|
||||
# This file 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
|
||||
# This file 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program 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.
|
||||
# This program 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 this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
# the same distribution terms that you use for the rest of that
|
||||
# program. This Exception is an additional permission under section 7
|
||||
# of the GNU General Public License, version 3 ("GPLv3").
|
||||
|
||||
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted ChangeLog entry.
|
||||
# Please send patches to <config-patches@gnu.org>.
|
||||
#
|
||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||
# Supply the specified configuration type as an argument.
|
||||
# If it is invalid, we print an error message on stderr and exit with code 1.
|
||||
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||
|
||||
# You can get the latest version of this script from:
|
||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
|
||||
|
||||
# This file is supposed to be the same for all GNU packages
|
||||
# and recognize all the CPU types, system types and aliases
|
||||
# that are meaningful with *any* GNU software.
|
||||
@@ -72,8 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
||||
version="\
|
||||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
Copyright 1992-2015 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
@@ -120,12 +115,18 @@ esac
|
||||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
|
||||
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||
knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
|
||||
kopensolaris*-gnu* | \
|
||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
android-linux)
|
||||
os=-linux-android
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
|
||||
;;
|
||||
*)
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
@@ -148,10 +149,13 @@ case $os in
|
||||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple | -axis | -knuth | -cray)
|
||||
-apple | -axis | -knuth | -cray | -microblaze*)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-bluegene*)
|
||||
os=-cnk
|
||||
;;
|
||||
-sim | -cisco | -oki | -wec | -winbond)
|
||||
os=
|
||||
basic_machine=$1
|
||||
@@ -166,10 +170,10 @@ case $os in
|
||||
os=-chorusos
|
||||
basic_machine=$1
|
||||
;;
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
basic_machine=$1
|
||||
;;
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
@@ -214,6 +218,12 @@ case $os in
|
||||
-isc*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-lynx*178)
|
||||
os=-lynxos178
|
||||
;;
|
||||
-lynx*5)
|
||||
os=-lynxos5
|
||||
;;
|
||||
-lynx*)
|
||||
os=-lynxos
|
||||
;;
|
||||
@@ -238,60 +248,90 @@ case $basic_machine in
|
||||
# Some are omitted here because they have special meanings below.
|
||||
1750a | 580 \
|
||||
| a29k \
|
||||
| aarch64 | aarch64_be \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| am33_2.0 \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
|
||||
| arc | arceb \
|
||||
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
|
||||
| avr | avr32 \
|
||||
| be32 | be64 \
|
||||
| bfin \
|
||||
| c4x | clipper \
|
||||
| c4x | c8051 | clipper \
|
||||
| d10v | d30v | dlx | dsp16xx \
|
||||
| fr30 | frv \
|
||||
| e2k | epiphany \
|
||||
| fido | fr30 | frv | ft32 \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| hexagon \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
|
||||
| k1om \
|
||||
| le32 | le64 \
|
||||
| lm32 \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64octeon | mips64octeonel \
|
||||
| mips64orion | mips64orionel \
|
||||
| mips64r5900 | mips64r5900el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64vr4100 | mips64vr4100el \
|
||||
| mips64vr4300 | mips64vr4300el \
|
||||
| mips64vr5000 | mips64vr5000el \
|
||||
| mips64vr5900 | mips64vr5900el \
|
||||
| mipsisa32 | mipsisa32el \
|
||||
| mipsisa32r2 | mipsisa32r2el \
|
||||
| mipsisa32r6 | mipsisa32r6el \
|
||||
| mipsisa64 | mipsisa64el \
|
||||
| mipsisa64r2 | mipsisa64r2el \
|
||||
| mipsisa64r6 | mipsisa64r6el \
|
||||
| mipsisa64sb1 | mipsisa64sb1el \
|
||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||
| mipsr5900 | mipsr5900el \
|
||||
| mipstx39 | mipstx39el \
|
||||
| mn10200 | mn10300 \
|
||||
| moxie \
|
||||
| mt \
|
||||
| msp430 \
|
||||
| nios | nios2 \
|
||||
| nds32 | nds32le | nds32be \
|
||||
| nios | nios2 | nios2eb | nios2el \
|
||||
| ns16k | ns32k \
|
||||
| or32 \
|
||||
| open8 | or1k | or1knd | or32 \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||
| pyramid \
|
||||
| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| riscv32 | riscv64 \
|
||||
| rl78 | rx \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh64 | sh64le \
|
||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
| strongarm \
|
||||
| tahoe | thumb | tic4x | tic80 | tron \
|
||||
| v850 | v850e \
|
||||
| spu \
|
||||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||
| ubicom32 \
|
||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||
| visium \
|
||||
| we32k \
|
||||
| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
|
||||
| z8k)
|
||||
| x86 | xc16x | xstormy16 | xtensa \
|
||||
| z8k | z80)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
m32c)
|
||||
basic_machine=$basic_machine-unknown
|
||||
c54x)
|
||||
basic_machine=tic54x-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12)
|
||||
# Motorola 68HC11/12.
|
||||
c55x)
|
||||
basic_machine=tic55x-unknown
|
||||
;;
|
||||
c6x)
|
||||
basic_machine=tic6x-unknown
|
||||
;;
|
||||
leon|leon[3-9])
|
||||
basic_machine=sparc-$basic_machine
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
@@ -301,6 +341,21 @@ case $basic_machine in
|
||||
basic_machine=mt-unknown
|
||||
;;
|
||||
|
||||
strongarm | thumb | xscale)
|
||||
basic_machine=arm-unknown
|
||||
;;
|
||||
xgate)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
xscaleeb)
|
||||
basic_machine=armeb-unknown
|
||||
;;
|
||||
|
||||
xscaleel)
|
||||
basic_machine=armel-unknown
|
||||
;;
|
||||
|
||||
# We use `pc' rather than `unknown'
|
||||
# because (1) that's what they normally are, and
|
||||
# (2) the word "unknown" tends to confuse beginning users.
|
||||
@@ -315,66 +370,87 @@ case $basic_machine in
|
||||
# Recognize the basic CPU types with company name.
|
||||
580-* \
|
||||
| a29k-* \
|
||||
| aarch64-* | aarch64_be-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
|
||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||
| avr-* \
|
||||
| avr-* | avr32-* \
|
||||
| be32-* | be64-* \
|
||||
| bfin-* | bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
|
||||
| clipper-* | craynv-* | cydra-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||
| c8051-* | clipper-* | craynv-* | cydra-* \
|
||||
| d10v-* | d30v-* | dlx-* \
|
||||
| elxsi-* \
|
||||
| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
|
||||
| e2k-* | elxsi-* \
|
||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| hexagon-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| ip2k-* | iq2000-* \
|
||||
| m32r-* | m32rle-* \
|
||||
| k1om-* \
|
||||
| le32-* | le64-* \
|
||||
| lm32-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
|
||||
| microblaze-* | microblazeel-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64octeon-* | mips64octeonel-* \
|
||||
| mips64orion-* | mips64orionel-* \
|
||||
| mips64r5900-* | mips64r5900el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64vr4100-* | mips64vr4100el-* \
|
||||
| mips64vr4300-* | mips64vr4300el-* \
|
||||
| mips64vr5000-* | mips64vr5000el-* \
|
||||
| mips64vr5900-* | mips64vr5900el-* \
|
||||
| mipsisa32-* | mipsisa32el-* \
|
||||
| mipsisa32r2-* | mipsisa32r2el-* \
|
||||
| mipsisa32r6-* | mipsisa32r6el-* \
|
||||
| mipsisa64-* | mipsisa64el-* \
|
||||
| mipsisa64r2-* | mipsisa64r2el-* \
|
||||
| mipsisa64r6-* | mipsisa64r6el-* \
|
||||
| mipsisa64sb1-* | mipsisa64sb1el-* \
|
||||
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
|
||||
| mipsr5900-* | mipsr5900el-* \
|
||||
| mipstx39-* | mipstx39el-* \
|
||||
| mmix-* \
|
||||
| mt-* \
|
||||
| msp430-* \
|
||||
| nios-* | nios2-* \
|
||||
| nds32-* | nds32le-* | nds32be-* \
|
||||
| nios-* | nios2-* | nios2eb-* | nios2el-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| open8-* \
|
||||
| or1k*-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||
| pyramid-* \
|
||||
| romp-* | rs6000-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
|
||||
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
||||
| tahoe-* | thumb-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
||||
| tahoe-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tile*-* \
|
||||
| tron-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| ubicom32-* \
|
||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||
| vax-* \
|
||||
| visium-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||
| xstormy16-* | xtensa-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||
| xstormy16-* | xtensa*-* \
|
||||
| ymp-* \
|
||||
| z8k-*)
|
||||
| z8k-* | z80-*)
|
||||
;;
|
||||
m32c-*)
|
||||
# Recognize the basic CPU types without company name, with glob match.
|
||||
xtensa*)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
# Recognize the various machine names and aliases which stand
|
||||
# for a CPU type and a company and sometimes even an OS.
|
||||
@@ -392,7 +468,7 @@ case $basic_machine in
|
||||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
abacus)
|
||||
abacus)
|
||||
basic_machine=abacus-unknown
|
||||
;;
|
||||
adobe68k)
|
||||
@@ -438,6 +514,13 @@ case $basic_machine in
|
||||
basic_machine=m68k-apollo
|
||||
os=-bsd
|
||||
;;
|
||||
aros)
|
||||
basic_machine=i386-pc
|
||||
os=-aros
|
||||
;;
|
||||
asmjs)
|
||||
basic_machine=asmjs-unknown
|
||||
;;
|
||||
aux)
|
||||
basic_machine=m68k-apple
|
||||
os=-aux
|
||||
@@ -446,10 +529,35 @@ case $basic_machine in
|
||||
basic_machine=ns32k-sequent
|
||||
os=-dynix
|
||||
;;
|
||||
blackfin)
|
||||
basic_machine=bfin-unknown
|
||||
os=-linux
|
||||
;;
|
||||
blackfin-*)
|
||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
bluegene*)
|
||||
basic_machine=powerpc-ibm
|
||||
os=-cnk
|
||||
;;
|
||||
c54x-*)
|
||||
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c55x-*)
|
||||
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c6x-*)
|
||||
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c90)
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
cegcc)
|
||||
basic_machine=arm-unknown
|
||||
os=-cegcc
|
||||
;;
|
||||
convex-c1)
|
||||
basic_machine=c1-convex
|
||||
os=-bsd
|
||||
@@ -478,8 +586,8 @@ case $basic_machine in
|
||||
basic_machine=craynv-cray
|
||||
os=-unicosmp
|
||||
;;
|
||||
cr16c)
|
||||
basic_machine=cr16c-unknown
|
||||
cr16 | cr16-*)
|
||||
basic_machine=cr16-unknown
|
||||
os=-elf
|
||||
;;
|
||||
crds | unos)
|
||||
@@ -517,6 +625,10 @@ case $basic_machine in
|
||||
basic_machine=m88k-motorola
|
||||
os=-sysv3
|
||||
;;
|
||||
dicos)
|
||||
basic_machine=i686-pc
|
||||
os=-dicos
|
||||
;;
|
||||
djgpp)
|
||||
basic_machine=i586-pc
|
||||
os=-msdosdjgpp
|
||||
@@ -632,7 +744,6 @@ case $basic_machine in
|
||||
i370-ibm* | ibm*)
|
||||
basic_machine=i370-ibm
|
||||
;;
|
||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||
i*86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv32
|
||||
@@ -671,6 +782,17 @@ case $basic_machine in
|
||||
basic_machine=m68k-isi
|
||||
os=-sysv
|
||||
;;
|
||||
leon-*|leon[3-9]-*)
|
||||
basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
|
||||
;;
|
||||
m68knommu)
|
||||
basic_machine=m68k-unknown
|
||||
os=-linux
|
||||
;;
|
||||
m68knommu-*)
|
||||
basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
m88k-omron*)
|
||||
basic_machine=m88k-omron
|
||||
;;
|
||||
@@ -682,10 +804,21 @@ case $basic_machine in
|
||||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
microblaze*)
|
||||
basic_machine=microblaze-xilinx
|
||||
;;
|
||||
mingw64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-mingw64
|
||||
;;
|
||||
mingw32)
|
||||
basic_machine=i386-pc
|
||||
basic_machine=i686-pc
|
||||
os=-mingw32
|
||||
;;
|
||||
mingw32ce)
|
||||
basic_machine=arm-unknown
|
||||
os=-mingw32ce
|
||||
;;
|
||||
miniframe)
|
||||
basic_machine=m68000-convergent
|
||||
;;
|
||||
@@ -707,6 +840,10 @@ case $basic_machine in
|
||||
basic_machine=powerpc-unknown
|
||||
os=-morphos
|
||||
;;
|
||||
moxiebox)
|
||||
basic_machine=moxie-unknown
|
||||
os=-moxiebox
|
||||
;;
|
||||
msdos)
|
||||
basic_machine=i386-pc
|
||||
os=-msdos
|
||||
@@ -714,10 +851,18 @@ case $basic_machine in
|
||||
ms1-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||
;;
|
||||
msys)
|
||||
basic_machine=i686-pc
|
||||
os=-msys
|
||||
;;
|
||||
mvs)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
;;
|
||||
nacl)
|
||||
basic_machine=le32-unknown
|
||||
os=-nacl
|
||||
;;
|
||||
ncr3000)
|
||||
basic_machine=i486-ncr
|
||||
os=-sysv4
|
||||
@@ -782,6 +927,12 @@ case $basic_machine in
|
||||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
neo-tandem)
|
||||
basic_machine=neo-tandem
|
||||
;;
|
||||
nse-tandem)
|
||||
basic_machine=nse-tandem
|
||||
;;
|
||||
nsr-tandem)
|
||||
basic_machine=nsr-tandem
|
||||
;;
|
||||
@@ -812,6 +963,14 @@ case $basic_machine in
|
||||
basic_machine=i860-intel
|
||||
os=-osf
|
||||
;;
|
||||
parisc)
|
||||
basic_machine=hppa-unknown
|
||||
os=-linux
|
||||
;;
|
||||
parisc-*)
|
||||
basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
pbd)
|
||||
basic_machine=sparc-tti
|
||||
;;
|
||||
@@ -856,9 +1015,10 @@ case $basic_machine in
|
||||
;;
|
||||
power) basic_machine=power-ibm
|
||||
;;
|
||||
ppc) basic_machine=powerpc-unknown
|
||||
ppc | ppcbe) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
ppc-* | ppcbe-*)
|
||||
basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
basic_machine=powerpcle-unknown
|
||||
@@ -883,7 +1043,11 @@ case $basic_machine in
|
||||
basic_machine=i586-unknown
|
||||
os=-pw32
|
||||
;;
|
||||
rdos)
|
||||
rdos | rdos64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-rdos
|
||||
;;
|
||||
rdos32)
|
||||
basic_machine=i386-pc
|
||||
os=-rdos
|
||||
;;
|
||||
@@ -913,6 +1077,10 @@ case $basic_machine in
|
||||
sb1el)
|
||||
basic_machine=mipsisa64sb1el-unknown
|
||||
;;
|
||||
sde)
|
||||
basic_machine=mipsisa32-sde
|
||||
os=-elf
|
||||
;;
|
||||
sei)
|
||||
basic_machine=mips-sei
|
||||
os=-seiux
|
||||
@@ -924,6 +1092,9 @@ case $basic_machine in
|
||||
basic_machine=sh-hitachi
|
||||
os=-hms
|
||||
;;
|
||||
sh5el)
|
||||
basic_machine=sh5le-unknown
|
||||
;;
|
||||
sh64)
|
||||
basic_machine=sh64-unknown
|
||||
;;
|
||||
@@ -945,6 +1116,9 @@ case $basic_machine in
|
||||
basic_machine=i860-stratus
|
||||
os=-sysv4
|
||||
;;
|
||||
strongarm-* | thumb-*)
|
||||
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
;;
|
||||
@@ -1001,17 +1175,9 @@ case $basic_machine in
|
||||
basic_machine=t90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
tic54x | c54x*)
|
||||
basic_machine=tic54x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic55x | c55x*)
|
||||
basic_machine=tic55x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic6x | c6x*)
|
||||
basic_machine=tic6x-unknown
|
||||
os=-coff
|
||||
tile*)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-linux-gnu
|
||||
;;
|
||||
tx39)
|
||||
basic_machine=mipstx39-unknown
|
||||
@@ -1080,6 +1246,9 @@ case $basic_machine in
|
||||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
xscale-* | xscalee[bl]-*)
|
||||
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
||||
;;
|
||||
ymp)
|
||||
basic_machine=ymp-cray
|
||||
os=-unicos
|
||||
@@ -1088,6 +1257,10 @@ case $basic_machine in
|
||||
basic_machine=z8k-unknown
|
||||
os=-sim
|
||||
;;
|
||||
z80-*-coff)
|
||||
basic_machine=z80-unknown
|
||||
os=-sim
|
||||
;;
|
||||
none)
|
||||
basic_machine=none-none
|
||||
os=-none
|
||||
@@ -1126,7 +1299,7 @@ case $basic_machine in
|
||||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
basic_machine=sh-unknown
|
||||
;;
|
||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
||||
@@ -1173,9 +1346,12 @@ esac
|
||||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-auroraux)
|
||||
os=-auroraux
|
||||
;;
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
@@ -1196,29 +1372,31 @@ case $os in
|
||||
# Each alternative MUST END IN A *, to match a version number.
|
||||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||
| -sym* | -kopensolaris* | -plan9* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* \
|
||||
| -aos* | -aros* | -cloudabi* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
| -openbsd* | -solidbsd* \
|
||||
| -bitrig* | -openbsd* | -solidbsd* \
|
||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||
| -skyos* | -haiku* | -rdos*)
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
@@ -1257,7 +1435,7 @@ case $os in
|
||||
-opened*)
|
||||
os=-openedition
|
||||
;;
|
||||
-os400*)
|
||||
-os400*)
|
||||
os=-os400
|
||||
;;
|
||||
-wince*)
|
||||
@@ -1306,7 +1484,7 @@ case $os in
|
||||
-sinix*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-tpf*)
|
||||
-tpf*)
|
||||
os=-tpf
|
||||
;;
|
||||
-triton*)
|
||||
@@ -1342,12 +1520,14 @@ case $os in
|
||||
-aros*)
|
||||
os=-aros
|
||||
;;
|
||||
-kaos*)
|
||||
os=-kaos
|
||||
;;
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-dicos*)
|
||||
os=-dicos
|
||||
;;
|
||||
-nacl*)
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
@@ -1370,6 +1550,12 @@ else
|
||||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
score-*)
|
||||
os=-elf
|
||||
;;
|
||||
spu-*)
|
||||
os=-elf
|
||||
;;
|
||||
*-acorn)
|
||||
os=-riscix1.2
|
||||
;;
|
||||
@@ -1379,9 +1565,24 @@ case $basic_machine in
|
||||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
c8051-*)
|
||||
os=-elf
|
||||
;;
|
||||
hexagon-*)
|
||||
os=-elf
|
||||
;;
|
||||
tic54x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic55x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic6x-*)
|
||||
os=-coff
|
||||
;;
|
||||
# This must come before the *-dec entry.
|
||||
pdp10-*)
|
||||
os=-tops20
|
||||
@@ -1400,13 +1601,13 @@ case $basic_machine in
|
||||
;;
|
||||
m68000-sun)
|
||||
os=-sunos3
|
||||
# This also exists in the configure program, but was not the
|
||||
# default.
|
||||
# os=-sunos4
|
||||
;;
|
||||
m68*-cisco)
|
||||
os=-aout
|
||||
;;
|
||||
mep-*)
|
||||
os=-elf
|
||||
;;
|
||||
mips*-cisco)
|
||||
os=-elf
|
||||
;;
|
||||
@@ -1431,7 +1632,7 @@ case $basic_machine in
|
||||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-knuth)
|
||||
*-knuth)
|
||||
os=-mmixware
|
||||
;;
|
||||
*-wec)
|
||||
@@ -1536,7 +1737,7 @@ case $basic_machine in
|
||||
-sunos*)
|
||||
vendor=sun
|
||||
;;
|
||||
-aix*)
|
||||
-cnk*|-aix*)
|
||||
vendor=ibm
|
||||
;;
|
||||
-beos*)
|
||||
|
||||
172
config_cmake.h.in
Normal file
172
config_cmake.h.in
Normal file
@@ -0,0 +1,172 @@
|
||||
/* Define to 1 if you have the `backtrace_symbols' function. */
|
||||
#cmakedefine HAVE_BACKTRACE_SYMBOLS 1
|
||||
|
||||
/* Define to 1 if compiled on WSL */
|
||||
#cmakedefine WSL 1
|
||||
|
||||
/* Define to 1 if you have the `clock_gettime' function. */
|
||||
#cmakedefine HAVE_CLOCK_GETTIME 1
|
||||
|
||||
/* Define to 1 if you have the `ctermid_r' function. */
|
||||
#cmakedefine HAVE_CTERMID_R 1
|
||||
|
||||
/* Define to 1 if you have the `dirfd' function. */
|
||||
#cmakedefine HAVE_DIRFD 1
|
||||
|
||||
/* Define to 1 if you have the <execinfo.h> header file. */
|
||||
#cmakedefine HAVE_EXECINFO_H 1
|
||||
|
||||
/* Define to 1 if you have the `flock' function. */
|
||||
#cmakedefine HAVE_FLOCK 1
|
||||
|
||||
/* Define to 1 if you have the `futimens' function. */
|
||||
#cmakedefine HAVE_FUTIMENS 1
|
||||
|
||||
/* Define to 1 if you have the `futimes' function. */
|
||||
#cmakedefine HAVE_FUTIMES 1
|
||||
|
||||
/* Define to 1 if you have the `getifaddrs' function. */
|
||||
#cmakedefine HAVE_GETIFADDRS 1
|
||||
|
||||
/* Define to 1 if you have the `getpwent' function. */
|
||||
#cmakedefine HAVE_GETPWENT 1
|
||||
|
||||
/* Define to 1 if you have the `gettext' function. */
|
||||
#cmakedefine HAVE_GETTEXT 1
|
||||
|
||||
/* Define to 1 if you have the `killpg' function. */
|
||||
#cmakedefine HAVE_KILLPG 1
|
||||
|
||||
/* Define to 1 if you have the `lrand48_r' function. */
|
||||
#cmakedefine HAVE_LRAND48_R 1
|
||||
|
||||
/* Define to 1 if you have the `mkostemp' function. */
|
||||
#cmakedefine HAVE_MKOSTEMP 1
|
||||
|
||||
/* Define to 1 if you have the <curses.h> header file. */
|
||||
#cmakedefine HAVE_CURSES_H 1
|
||||
|
||||
/* Define to 1 if you have the <ncurses/curses.h> header file. */
|
||||
#cmakedefine HAVE_NCURSES_CURSES_H 1
|
||||
|
||||
/* Define to 1 if you have the <ncurses.h> header file. */
|
||||
#cmakedefine HAVE_NCURSES_H 1
|
||||
|
||||
/* Define to 1 if you have the <ncurses/term.h> header file. */
|
||||
#cmakedefine HAVE_NCURSES_TERM_H 1
|
||||
|
||||
/* Define to 1 if you have the <siginfo.h> header file. */
|
||||
#cmakedefine HAVE_SIGINFO_H 1
|
||||
|
||||
/* Define to 1 if you have the <spawn.h> header file. */
|
||||
#cmakedefine HAVE_SPAWN_H 1
|
||||
|
||||
/* Define to 1 if you have the `std::wcscasecmp' function. */
|
||||
#cmakedefine HAVE_STD__WCSCASECMP 1
|
||||
|
||||
/* Define to 1 if you have the `std::wcsdup' function. */
|
||||
#cmakedefine HAVE_STD__WCSDUP 1
|
||||
|
||||
/* Define to 1 if you have the `std::wcsncasecmp' function. */
|
||||
#cmakedefine HAVE_STD__WCSNCASECMP 1
|
||||
|
||||
/* Define to 1 if `d_type' is a member of `struct dirent'. */
|
||||
#cmakedefine HAVE_STRUCT_DIRENT_D_TYPE 1
|
||||
|
||||
/* Define to 1 if `st_ctime_nsec' is a member of `struct stat'. */
|
||||
#cmakedefine HAVE_STRUCT_STAT_ST_CTIME_NSEC 1
|
||||
|
||||
/* Define to 1 if `st_mtimespec.tv_nsec' is a member of `struct stat'. */
|
||||
#cmakedefine HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1
|
||||
|
||||
/* Define to 1 if `st_mtim.tv_nsec' is a member of `struct stat'. */
|
||||
#cmakedefine HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
|
||||
|
||||
/* Define to 1 if the sys_errlist array is available. */
|
||||
#cmakedefine HAVE_SYS_ERRLIST 1
|
||||
|
||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
||||
#cmakedefine HAVE_SYS_IOCTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/select.h> header file. */
|
||||
#cmakedefine HAVE_SYS_SELECT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/sysctl.h> header file. */
|
||||
#cmakedefine HAVE_SYS_SYSCTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <termios.h> header file. */
|
||||
#cmakedefine HAVE_TERMIOS_H 1
|
||||
|
||||
/* Define to 1 if you have the <term.h> header file. */
|
||||
#cmakedefine HAVE_TERM_H 1
|
||||
|
||||
/* Define to 1 if you have the `wcscasecmp' function. */
|
||||
#cmakedefine HAVE_WCSCASECMP 1
|
||||
|
||||
/* Define to 1 if you have the `wcsdup' function. */
|
||||
#cmakedefine HAVE_WCSDUP 1
|
||||
|
||||
/* Define to 1 if you have the `wcslcpy' function. */
|
||||
#cmakedefine HAVE_WCSLCPY 1
|
||||
|
||||
/* Define to 1 if you have the `wcsncasecmp' function. */
|
||||
#cmakedefine HAVE_WCSNCASECMP 1
|
||||
|
||||
/* Define to 1 if you have the `wcsndup' function. */
|
||||
#cmakedefine HAVE_WCSNDUP 1
|
||||
|
||||
/* Define to 1 if the winsize struct and TIOCGWINSZ macro exist */
|
||||
#cmakedefine HAVE_WINSIZE 1
|
||||
|
||||
/* Define to 1 if the _nl_msg_cat_cntr symbol is exported. */
|
||||
#cmakedefine HAVE__NL_MSG_CAT_CNTR 1
|
||||
|
||||
/* Define to 1 if you have the file `/proc/self/stat'. */
|
||||
#cmakedefine HAVE__PROC_SELF_STAT 1
|
||||
|
||||
/* Define to 1 if the _sys_errs array is available. */
|
||||
#cmakedefine HAVE__SYS__ERRS 1
|
||||
|
||||
/* Define to 1 to disable ncurses macros that conflict with the STL */
|
||||
#define NCURSES_NOMACROS 1
|
||||
|
||||
/* Define to 1 to disable curses macros that conflict with the STL */
|
||||
#define NOMACROS 1
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "https://github.com/fish-shell/fish-shell/issues"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "fish"
|
||||
|
||||
/* Define to 1 if tparm accepts a fixed amount of paramters. */
|
||||
#cmakedefine TPARM_SOLARIS_KLUDGE 1
|
||||
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE 1
|
||||
#endif
|
||||
|
||||
/* The size of wchar_t in bits. */
|
||||
#define WCHAR_T_BITS ${WCHAR_T_BITS}
|
||||
|
||||
/* Enable large inode numbers on Mac OS X 10.5. */
|
||||
#ifndef _DARWIN_USE_64_BIT_INODE
|
||||
# define _DARWIN_USE_64_BIT_INODE 1
|
||||
#endif
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
#ifndef __warn_unused
|
||||
#define __warn_unused __attribute__ ((warn_unused_result))
|
||||
#endif
|
||||
#ifndef __sentinel
|
||||
#define __sentinel __attribute__ ((sentinel))
|
||||
#endif
|
||||
#ifndef __packed
|
||||
#define __packed __attribute__ ((packed))
|
||||
#endif
|
||||
#else
|
||||
#define __warn_unused
|
||||
#define __sentinel
|
||||
#define __packed
|
||||
#endif
|
||||
1338
configure.ac
1338
configure.ac
File diff suppressed because it is too large
Load Diff
@@ -1,121 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- python -*-
|
||||
|
||||
# Program to generate fish completion function for wajig.
|
||||
# It runs 'wajig command' and analyzes the output to build a
|
||||
# completion file which it writes to stdout.
|
||||
# To use the result, direct stdout to
|
||||
# ~/.fish.d/completions/wajig.fish.
|
||||
|
||||
# Author Reuben Thomas, from Don Rozenberg's bash_completion.py and
|
||||
# fish's apt-get.fish.
|
||||
|
||||
import os
|
||||
import re
|
||||
import pprint
|
||||
pp = pprint.PrettyPrinter()
|
||||
|
||||
def escape_quotes(s):
|
||||
return re.sub('\'', '\\\'', s)
|
||||
|
||||
# Run wajig command
|
||||
f = os.popen('wajig commands', 'r')
|
||||
|
||||
lines = f.readlines()
|
||||
|
||||
option_patt = r'^-([a-z]*)\|--([a-z]*) +([^ ].*)'
|
||||
option_patt_r = re.compile(option_patt)
|
||||
|
||||
command_patt = r'^([a-z-]*) +([^ ].*)'
|
||||
command_patt_r = re.compile(command_patt)
|
||||
|
||||
os_str = []
|
||||
os_str.append('')
|
||||
ol_str = []
|
||||
ol_str.append('')
|
||||
oh_str = []
|
||||
oh_str.append('')
|
||||
o_i = 0
|
||||
|
||||
c_str = []
|
||||
c_str.append('')
|
||||
ch_str = []
|
||||
ch_str.append('')
|
||||
c_i = 0
|
||||
|
||||
for l in lines:
|
||||
l = l.strip()
|
||||
if l == '' or l.find(':') > -1 or l.find('Run') == 0:
|
||||
continue
|
||||
if l.find('-') == 0:
|
||||
mo = option_patt_r.search(l)
|
||||
if mo == None:
|
||||
continue
|
||||
os_str[o_i] = mo.group(1)
|
||||
os_str.append('')
|
||||
ol_str[o_i] = mo.group(2)
|
||||
ol_str.append('')
|
||||
oh_str[o_i] = escape_quotes(mo.group(3))
|
||||
oh_str.append('')
|
||||
o_i += 1
|
||||
else:
|
||||
mo = command_patt_r.search(l)
|
||||
if mo == None:
|
||||
continue
|
||||
c_str[c_i] = mo.group(1)
|
||||
c_str.append('')
|
||||
ch_str[c_i] = escape_quotes(mo.group(2))
|
||||
ch_str.append('')
|
||||
c_i += 1
|
||||
|
||||
# For debugging, print the commands and options.
|
||||
#print
|
||||
#pp.pprint(c_str)
|
||||
|
||||
#print
|
||||
#pp.pprint(os_str)
|
||||
#print
|
||||
#pp.pprint(ol_str)
|
||||
|
||||
part1 = '''function __fish_wajig_no_subcommand -d (N_ 'Test if wajig has yet to be given the subcommand')
|
||||
for i in (commandline -opc)
|
||||
if contains -- $i'''
|
||||
|
||||
part2 = '''
|
||||
return 1
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
function __fish_wajig_use_package -d (N_ 'Test if wajig command should have packages as potential completion')
|
||||
for i in (commandline -opc)
|
||||
if contains -- $i contains bug build build-depend changelog dependents describe detail hold install installr installrs installs list list-files news package purge purge-depend readme recursive recommended reconfigure reinstall remove remove-depend repackage show showinstall showremove showupgrade size sizes source suggested unhold upgrade versions whatis
|
||||
return 0
|
||||
end
|
||||
end
|
||||
return 1
|
||||
end
|
||||
|
||||
complete -c wajig -n '__fish_wajig_use_package' -a '(__fish_print_packages)' -d (N_ 'Package')'''
|
||||
|
||||
wajig = part1
|
||||
|
||||
#add the commands.
|
||||
for i in range(0, len(c_str) - 1):
|
||||
wajig = "%s %s" % (wajig, c_str[i])
|
||||
|
||||
#add part2
|
||||
wajig = "%s%s" % (wajig, part2)
|
||||
|
||||
#add the options.
|
||||
wajig = "%s%s" % (wajig, os_str[0].lstrip())
|
||||
for i in range(1, len(os_str) - 1):
|
||||
wajig = "%s\ncomplete -c apt-get -s %s -l %s -d (N_ '%s')" % (wajig, os_str[i], ol_str[i], oh_str[i])
|
||||
|
||||
#add the commands.
|
||||
for i in range(0, len(c_str) - 1):
|
||||
wajig = "%s\ncomplete -f -n '__fish_wajig_no_subcommand' -c wajig -a '%s' -d(N_ '%s')" % (wajig, c_str[i], ch_str[i])
|
||||
|
||||
#print it all
|
||||
print wajig
|
||||
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
@@ -0,0 +1 @@
|
||||
9
|
||||
45
debian/control
vendored
Normal file
45
debian/control
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
Source: fish
|
||||
Section: shells
|
||||
Priority: extra
|
||||
Maintainer: ridiculous_fish <corydoras@ridiculousfish.com>
|
||||
Uploaders: David Adam <zanchey@ucc.gu.uwa.edu.au>
|
||||
Build-Depends: debhelper (>= 9.0.0), libncurses5-dev, cmake3 (>= 3.2.0) | cmake (>= 3.2.0), gettext
|
||||
# When libpcre2-dev is available on all supported Debian versions, add a dependency on that.
|
||||
Standards-Version: 3.9.4
|
||||
Homepage: https://fishshell.com/
|
||||
Vcs-Git: https://github.com/fish-shell/fish-shell.git
|
||||
Vcs-Browser: https://github.com/fish-shell/fish-shell
|
||||
|
||||
Package: fish
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, fish-common (= ${source:Version}), passwd (>= 4.0.3-10), bc, gettext-base, man-db
|
||||
Recommends: xsel (>=1.2.0)
|
||||
Description: friendly interactive shell
|
||||
Fish is a command-line shell for modern systems, focusing on user-friendliness,
|
||||
sensibility and discoverability in interactive use. The syntax is simple, but
|
||||
not POSIX compliant.
|
||||
|
||||
Package: fish-common
|
||||
Architecture: all
|
||||
Depends: ${misc:Depends}
|
||||
Recommends: fish, python (>=2.6)
|
||||
Suggests: xdg-utils
|
||||
Replaces: fish (<= 2.1.1.dfsg-2)
|
||||
Description: friendly interactive shell (architecture-independent files)
|
||||
Fish is a command-line shell for modern systems, focusing on user-friendliness,
|
||||
sensibility and discoverability in interactive use. The syntax is simple, but
|
||||
not POSIX compliant.
|
||||
.
|
||||
This package contains the common fish files shared by all architectures.
|
||||
|
||||
Package: fish-dbg
|
||||
Architecture: any
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Depends: fish (= ${binary:Version}), ${misc:Depends}
|
||||
Description: debugging symbols for friendly interactive shell
|
||||
Fish is a command-line shell for modern systems, focusing on user-friendliness,
|
||||
sensibility and discoverability in interactive use. The syntax is simple, but
|
||||
not POSIX compliant.
|
||||
.
|
||||
This package contains the debugging symbols for fish.
|
||||
101
debian/copyright
vendored
Normal file
101
debian/copyright
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
This work was packaged for Debian by David Adam <zanchey@ucc.gu.uwa.edu.au>
|
||||
on Thu, 14 Jun 2012 20:33:34 +0800, based on work by James Vega
|
||||
<jamessan@jamessan.com>. Modifications from the downstream Debian maintainer,
|
||||
Tristan Seligmann <mithrandi@debian.org>, have also been included.
|
||||
|
||||
It was downloaded from:
|
||||
|
||||
https://github.com/fish-shell/fish-shell
|
||||
|
||||
Upstream Authors:
|
||||
|
||||
Axel Liljencrantz
|
||||
ridiculous_fish
|
||||
|
||||
Copyright:
|
||||
|
||||
Copyright (C) 2005-2008 Axel Liljencrantz
|
||||
Copyright (C) 2011-2012 ridiculous_fish
|
||||
|
||||
License:
|
||||
|
||||
Copyright (C) 2005-2008 Axel Liljencrantz
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program 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 this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA.
|
||||
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
||||
|
||||
Fish contains code from the PCRE2 library to support regular expressions. This
|
||||
code, created by Philip Hazel, is distributed under the terms of the BSD
|
||||
license. Copyright © 1997-2015 University of Cambridge.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
- Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
- Neither the name of the University of Cambridge nor the names of any
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Fish also contains small amounts of code under the OpenBSD license, namely a
|
||||
version of the function strlcpy, modified for use with wide character strings.
|
||||
This code is copyrighted by Todd C. Miller (1998). It also contains code from
|
||||
tmux, copyrighted by Nicholas Marriott <nicm@users.sourceforge.net> (2007), and
|
||||
made available under an identical license.
|
||||
|
||||
Permission to use, copy, modify, and distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
Fish contains code from the glibc library, namely the wcstok function
|
||||
in fallback.c. This code is licensed under the LGPL.
|
||||
|
||||
On Debian systems, the complete text of the GNU Lesser General
|
||||
Public License can be found in `/usr/share/common-licenses/LGPL'.
|
||||
|
||||
The Debian packaging is:
|
||||
|
||||
Copyright (C) 2005 James Vega <jamessan@jamessan.com>
|
||||
Copyright (C) 2012 David Adam <zanchey@ucc.gu.uwa.edu.au>
|
||||
Copyright (C) 2015 Tristan Seligmann <mithrandi@debian.org>
|
||||
|
||||
and is licensed under the GPL version 2, see above.
|
||||
11
debian/fish-common.doc-base
vendored
Normal file
11
debian/fish-common.doc-base
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
Document: fish
|
||||
Title: Debian fish Manual
|
||||
Author: Axel Liljencrantz <axel@liljencrantz.se>
|
||||
Abstract: This guide documents fish, a shell
|
||||
geared towards interactive use.
|
||||
Section: Shells
|
||||
|
||||
Format: HTML
|
||||
Index: /usr/share/doc/fish/index.html
|
||||
Files: /usr/share/doc/fish/*.html
|
||||
|
||||
1
debian/fish-common.docs
vendored
Normal file
1
debian/fish-common.docs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
README.md
|
||||
2
debian/fish-common.install
vendored
Normal file
2
debian/fish-common.install
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
debian/tmp/etc
|
||||
debian/tmp/usr/share
|
||||
4
debian/fish-common.lintian-overrides
vendored
Normal file
4
debian/fish-common.lintian-overrides
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
# These directories are intentionally empty.
|
||||
fish-common: package-contains-empty-directory usr/share/fish/vendor_completions.d/
|
||||
fish-common: package-contains-empty-directory usr/share/fish/vendor_conf.d/
|
||||
fish-common: package-contains-empty-directory usr/share/fish/vendor_functions.d/
|
||||
1
debian/fish.install
vendored
Normal file
1
debian/fish.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
debian/tmp/usr/bin
|
||||
47
debian/fish.postinst
vendored
Normal file
47
debian/fish.postinst
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
#!/bin/sh
|
||||
# postinst script for fish
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <postinst> `configure' <most-recently-configured-version>
|
||||
# * <old-postinst> `abort-upgrade' <new version>
|
||||
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
|
||||
# <new-version>
|
||||
# * <postinst> `abort-remove'
|
||||
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
|
||||
# <failed-install-package> <version> `removing'
|
||||
# <conflicting-package> <version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
add_shell() {
|
||||
if ! type add-shell > /dev/null 2>&1; then
|
||||
return
|
||||
fi
|
||||
|
||||
add-shell /usr/bin/fish
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
add_shell
|
||||
;;
|
||||
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "postinst called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
37
debian/fish.postrm
vendored
Normal file
37
debian/fish.postrm
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
#!/bin/sh
|
||||
# postrm script for fish
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <postrm> `remove'
|
||||
# * <postrm> `purge'
|
||||
# * <old-postrm> `upgrade' <new-version>
|
||||
# * <new-postrm> `failed-upgrade' <old-version>
|
||||
# * <new-postrm> `abort-install'
|
||||
# * <new-postrm> `abort-install' <old-version>
|
||||
# * <new-postrm> `abort-upgrade' <old-version>
|
||||
# * <disappearer's-postrm> `disappear' <overwriter>
|
||||
# <overwriter-version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
|
||||
case "$1" in
|
||||
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "postrm called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
46
debian/fish.prerm
vendored
Normal file
46
debian/fish.prerm
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
# prerm script for fish
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <prerm> `remove'
|
||||
# * <old-prerm> `upgrade' <new-version>
|
||||
# * <new-prerm> `failed-upgrade' <old-version>
|
||||
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
|
||||
# * <deconfigured's-prerm> `deconfigure' `in-favour'
|
||||
# <package-being-installed> <version> `removing'
|
||||
# <conflicting-package> <version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
remove_shell() {
|
||||
if ! type remove-shell > /dev/null 2>&1; then
|
||||
return
|
||||
fi
|
||||
|
||||
remove-shell /usr/bin/fish
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
remove|deconfigure)
|
||||
remove_shell
|
||||
;;
|
||||
|
||||
upgrade|failed-upgrade)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "prerm called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
2
debian/menu
vendored
Normal file
2
debian/menu
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
?package(fish):needs="text" section="Applications/Shells"\
|
||||
title="fish" command="/usr/bin/fish"
|
||||
23
debian/rules
vendored
Executable file
23
debian/rules
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/make -f
|
||||
# -*- makefile -*-
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
export DH_VERBOSE=1
|
||||
|
||||
%:
|
||||
dh $@
|
||||
|
||||
override_dh_auto_configure:
|
||||
# Until all platforms have debhelper 9.20151004, Debian bug 719148 needs to be worked around
|
||||
dh_auto_configure --buildsystem=cmake --parallel -- -DCMAKE_INSTALL_SYSCONFDIR=/etc
|
||||
|
||||
override_dh_installdocs:
|
||||
dh_installdocs --link-doc=fish
|
||||
|
||||
# Still needed until all platforms have debhelper 9.20151219
|
||||
# Consider transitioning https://wiki.debian.org/DebugPackage
|
||||
override_dh_strip:
|
||||
dh_strip --dbg-package=fish-dbg
|
||||
|
||||
# Don't run tests; they don't work until fish is installed
|
||||
override_dh_auto_test:
|
||||
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
@@ -0,0 +1 @@
|
||||
3.0 (quilt)
|
||||
253
doc_src/FORMATTING.md
Normal file
253
doc_src/FORMATTING.md
Normal file
@@ -0,0 +1,253 @@
|
||||
# Formatting guide for fish docs
|
||||
|
||||
The fish documentation has been updated to support Doxygen 1.8.7+, and while the main benefit of this change is extensive Markdown support, the addition of a fish lexicon and syntax filter, combined with semantic markup rules allows for automatic formatting enhancements across the HTML user_docs and man pages.
|
||||
|
||||
Initially my motivation was to fix a problem with long options ([Issue #1557](https://github.com/fish-shell/fish-shell/issues/1557) on GitHub), but as I worked on fixing the issue I realised there was an opportunity to simplify, reinforce and clarify the current documentation, hopefully making further contribution easier and cleaner, while allowing the documentation examples to presented more clearly with less author effort.
|
||||
|
||||
While the documentation is pretty robust to variations in the documentation source, adherence to the following style guide will help keep the already excellent documentation in good shape moving forward.
|
||||
|
||||
## Line breaks and wrapping
|
||||
|
||||
Contrary to the rest of the fish source code, the documentation greatly benefits from the use of long lines and soft wrapping. Doxygen is able to treat paragraphs as complete blocks. The semantic filter can see complete lines when deciding on how to apply syntax highlighting. In advanced pagers, such as 'most', man pages will consistently wrap to the width of the user's console.
|
||||
|
||||
## Doxygen special commands and aliases
|
||||
|
||||
While Markdown syntax forms the basis of the documentation content, there are some exceptions that require the use of Doxygen special commands. On the whole, Doxygen commands should be avoided, especially inline word formatting such as \\c as this would allow Doxygen to make unhelpful assumptions, such as converting double dashes (\--) to n-dashes (–).
|
||||
|
||||
### Structure: \\page, \\section and \\subsection
|
||||
|
||||
Use of Doxygen sections markers are important, as these determine what will be eventually output as a web page, man page or included in the developer docs.
|
||||
|
||||
Currently the make process for the documentation is quite convoluted, but basically the HTML docs are produced from a single, compiled file, doc.h. This contains a number of \\page markers that produce the various pages used in the documentation. The format of a \\page mark is:
|
||||
|
||||
\page universally_unique_page_id Page title
|
||||
|
||||
The source files that contain the page markers are currently:
|
||||
|
||||
- __index.hdr.in__: Core documentation
|
||||
- __commands.hdr.in__: Individual commands
|
||||
- __tutorial.hdr__: Tutorial
|
||||
- __design.hdr__: Design document
|
||||
- __faq.hdr__: Frequently Asked Questions
|
||||
- __license.hdr__: Fish and 3rd party licences
|
||||
|
||||
Unless there is a _VERY_ good reason and developer consensus, new pages should never be added.
|
||||
|
||||
The rest of the documentation is structured using \\section and \\subsection markers. Most of the source files (listed above) contain their full content, the exception being commands, which are separated out into source text files in the doc_src directory. These files are concatenated into one file, so each one starts with a \\section declaration. The synopsis, description and examples (if present) are declared as \\subsections. The format of these marks is practically identical to the page mark.
|
||||
|
||||
\section universally_unique_section_id Section title
|
||||
\subsection universally_unique_subsection_id Subsection title
|
||||
|
||||
Each page, section and subsection id _must_ be unique across the whole of the documentation, otherwise Doxygen will issue a warning.
|
||||
|
||||
### Semantic markup: the \\fish .. \\endfish block
|
||||
|
||||
While Doxygen has support for \\code..\\endcode blocks with enhanced markup and syntax colouring, it only understands the core Doxygen languages: C, C++, Objective C, Java, PHP, Python, Tcl and Fortran. To enhance Fish's syntax presentation, use the special \\fish..\\endfish blocks instead.
|
||||
|
||||
Text placed in this block will be parsed by Doxygen using the included lexicon filter (see lexicon_filter.in) as a Doxygen input filter. The filter is built during make so that it can pick up information on builtins, functions and shell commands mentioned in completions and apply markup to keywords found inside the \\fish block.
|
||||
|
||||
Basically, preformatted plain text inside the \\fish block is fed through the filter and is returned marked up so that Doxygen aliases can convert it back to a presentable form, according to the output document type.
|
||||
|
||||
For instance:
|
||||
|
||||
`echo hello world`
|
||||
|
||||
is transformed into:
|
||||
|
||||
`@cmnd{echo} @args{hello} @args{world}`
|
||||
|
||||
which is then transformed by Doxygen into an HTML version (`make doc`):
|
||||
|
||||
`<span class="command">echo</span> <span class="argument">hello</span> <span class="argument">world</span>`
|
||||
|
||||
And a man page version (`make share/man`):
|
||||
|
||||
__echo__ hello world
|
||||
|
||||
### Fonts
|
||||
|
||||
In older browsers, it was easy to set the fonts used for the three basic type styles (serif, sans-serif and monospace). Modern browsers have removed these options in their respective quests for simplification, assuming the content author will provide suitable styles for the content in the site's CSS, or the end user will provide overriding styles manually. Doxygen's default styling is very simple and most users will just accept this default.
|
||||
|
||||
I've tried to use a sensible set of fonts in the documentation's CSS based on 'good' terminal fonts and as a result the first preference font used throughout the documentation is '[DejaVu](https://dejavu-fonts.github.io)'. The rationale behind this is that while DejaVu is getting a little long in the tooth, it still provides the most complete support across serif, sans-serif and monospace styles (giving a well balanced feel and consistent [x-height](https://en.wikipedia.org/wiki/X-height)), has the widest support for extended Unicode characters and has a free, permissive licenses (though it's still incompatible with GPLv2, though arguably less so than the SIL Open Font license, though this is a moot point when using it solely in the docs).
|
||||
|
||||
#### Fonts inside \\fish blocks and \`backticks\`
|
||||
|
||||
As the point of these constructs is to make fish's syntax clearer to the user, it makes sense to mimic what the user will see in the console, therefore any content is formatted using the monospaced style, specifically monospaced fonts are chosen in the following order:
|
||||
|
||||
1. __DejaVu Sans Mono__: Explained above. [[↓](https://dejavu-fonts.github.io)]
|
||||
2. __Source Code Pro__: Monospaced code font, part of Adobe's free Edge Web Fonts. [[↓](https://edgewebfonts.adobe.com)]
|
||||
3. __Menlo__: Apple supplied variant of DejaVu.
|
||||
4. __Ubuntu Mono__: Ubuntu Linux's default monospaced font. [[↓](http://font.ubuntu.com)]
|
||||
5. __Consolas__: Modern Microsoft supplied console font.
|
||||
6. __Monaco__: Apple supplied console font since 1984!
|
||||
7. __Lucida Console__: Generic mono terminal font, standard in many OS's and distros.
|
||||
8. __monospace__: Catchall style. Chooses default monospaced font, often Courier.
|
||||
9. __fixed__: As above, more often used on mobile devices.
|
||||
|
||||
#### General Fonts
|
||||
|
||||
1. __DejaVu Sans__: As above.[[↓](https://dejavu-fonts.github.io)]
|
||||
2. __Roboto__: Elegant Google free font and is Doxygen's default [[↓](https://fonts.google.com/specimen/Roboto)]
|
||||
3. __Lucida Grande__: Default Apple OS X content font.
|
||||
4. __Calibri__: Default Microsoft Office font (since 2007).
|
||||
5. __Verdana__: Good general font found in a lot of OSs.
|
||||
6. __Helvetica Neue__: Better spaced and balanced Helvetica/Arial variant.
|
||||
7. __Helvetica__: Standard humanist typeface found almost everywhere.
|
||||
8. __Arial__: Microsoft's Helvetica.
|
||||
9. __sans-serif__: Catchall style. Chooses default sans-serif typeface, often Helvetica.
|
||||
|
||||
The ordering of the fonts is important as it's designed to allow the documentation to settle into a number of different identities according to the fonts available. If you have the complete DejaVu family installed, then the docs are presented using that, and if your Console is set up to use the same fonts, presentation will be completely consistent.
|
||||
|
||||
On OS X, with nothing extra installed, the docs will default to Menlo and Lucida Grande giving a Mac feel. Under Windows, it will default to using Consolas and Calibri on recent versions, giving a modern Windows style.
|
||||
|
||||
#### Other sources:
|
||||
|
||||
- [Font Squirrel](https://www.fontsquirrel.com): Good source of open source font packages.
|
||||
|
||||
### Choosing a CLI style: using a \\fish{style} block
|
||||
|
||||
By default, when output as HTML, a \\fish block uses syntax colouring suited to the style of the documentation rather than trying to mimic the terminal. The block has a light, bordered background and a colour scheme that 'suggests' what the user would see in a console.
|
||||
|
||||
Additional stying can be applied adding a style declaration:
|
||||
|
||||
\fish{additional_style [another_style...]}
|
||||
...
|
||||
\endfish
|
||||
|
||||
This will translate to classes applied to the `<div>` tag, like so:
|
||||
|
||||
<div class="fish additional_style another_style">
|
||||
...
|
||||
</div>
|
||||
|
||||
The various classes are defined in `doc_src/user_doc.css` and new style can be simply added
|
||||
|
||||
The documentation currently defines a couple of additional styles:
|
||||
|
||||
- __cli-dark__: Used in the _tutorial_ and _FAQ_ to simulate a dark background terminal, with fish's default colours (slightly tweaked for legibility in the browser).
|
||||
|
||||
- __synopsis__: A simple colour theme helpful for displaying the logical 'summary' of a command's syntax, options and structure.
|
||||
|
||||
## Markdown
|
||||
|
||||
Apart from the exceptions discussed above, the rest of the documentation now supports the use of Markdown. As such the use of Doxygen special commands for HTML tags is unnecessary.
|
||||
|
||||
There are a few exceptions and extensions to the Markdown [standard](https://daringfireball.net/projects/markdown/) that are documented in the Doxygen [documentation](https://www.stack.nl/~dimitri/doxygen/manual/markdown.html).
|
||||
|
||||
### \`Backticks\`
|
||||
|
||||
As is standard in Markdown and 'Github Flavoured Markdown' (GFM), backticks can be used to denote inline technical terms in the documentation, `like so`. In the documentation this will set the font to the monospaced 'console' typeface and will cause the enclosed term to stand out.
|
||||
|
||||
However, fenced code blocks using 4 spaces or 3 backticks (\`\`\`) should be avoided as Doxygen will interpret these as \\code blocks and try to apply standard syntax colouring, which doesn't work so well for fish examples. Use `\fish..\endfish` blocks instead.
|
||||
|
||||
### Lists
|
||||
|
||||
Standard Markdown list rules apply, but as Doxygen will collapse white space on output, combined with the use of long lines, it's a good idea to include an extra new line between long list items to assist future editing.
|
||||
|
||||
## Special cases
|
||||
|
||||
The following can be used in \\fish blocks to render some fish scenarios. These are mostly used in the tutorial when an interactive situation needs to be displayed.
|
||||
|
||||
### Custom formatting tags
|
||||
|
||||
```html
|
||||
<u>: <u>These words are underlined.</u>
|
||||
<s>: auto<s>suggestion</s>.
|
||||
<m>: <m>Matched</m> items, such as tab completions.
|
||||
<sm>: Matched items <sm>searched</sm> for, like grep results.
|
||||
<bs>: Render the contents with a preceding backslash. Useful when presenting output.
|
||||
<eror>: <eror>This would be shown as an error. (Note eror, not error).</eror>
|
||||
<asis>: <asis>This text will not be parsed for fish markup.</asis>
|
||||
<outp>: <outp>This would be rendered as command/script output.</outp>
|
||||
{{ and }}: Required when wanting curly braces in regular expression example.
|
||||
```
|
||||
|
||||
### Prompts and cursors
|
||||
|
||||
```html
|
||||
>_: Display a basic prompt.
|
||||
~>_: Display a prompt with a the home directory as the current working directory.
|
||||
___ (3 underscores): Display a cursor.
|
||||
```
|
||||
|
||||
### Keyboard shortcuts: @key{} and @cursor_key{}
|
||||
|
||||
Graphical keyboard shortcuts can be defined using the following special commands. These allow for the different text requirements across the html and man pages. The HTML uses CSS to create a keyboard style, whereas the man page would display the key as text.
|
||||
|
||||
- `@key{lable}`
|
||||
Displays a key with a purely textual lable, such as: 'Tab', 'Page Up', 'Page Down', 'Home', 'End', 'F1', 'F19' and so on.
|
||||
|
||||
- `@key{modifier,lable}`
|
||||
Displays a keystroke requiring the use of a 'modifier' key, such as 'Control-A', 'Shift-X', 'Alt-Tab' etc.
|
||||
|
||||
- `@key{modifier,entity,lable}`
|
||||
Displays a keystroke using a graphical entity, such as an arrow symbol for cursor key based shortcuts.
|
||||
|
||||
- `@cursor_key{entity,lable}`
|
||||
A special case for cursor keys, when no modifier is needed. i.e. `@cursor_key{↑,up}` for the up arrow key.
|
||||
|
||||
Some useful Unicode/HTML5 entities:
|
||||
|
||||
- Up arrow: `↑`
|
||||
- Down arrow: `↓`
|
||||
- Left arrow: `←`
|
||||
- Right arrow `→`
|
||||
- Shift: `⇧`
|
||||
- Tab: `⇥`
|
||||
- Mac option: `⌥`
|
||||
- Mac command: `⌘`
|
||||
|
||||
## Notes
|
||||
|
||||
### Doxygen
|
||||
|
||||
Tested on:
|
||||
- Ubuntu 14.04 with Doxygen 1.8.8, built from [GitHub source](https://github.com/doxygen/doxygen.git).
|
||||
- CentOS 6.5 with Doxygen 1.8.8, built from [GitHub source](https://github.com/doxygen/doxygen.git).
|
||||
- Mac OS X 10.9 with Homebrew install Doxygen 1.8.7 and 1.8.8.
|
||||
|
||||
Graphviz was also installed in all the above testing.
|
||||
|
||||
Doxygen 1.8.6 and lower do not have the \\htmlonly[block] directive which fixes a multitude of problems in the rendering of the docs. In Doxygen 1.8.7 the list of understood HTML entities was greatly increased. I tested earlier versions and many little issues returned.
|
||||
|
||||
As fish ships with pre-built documentation, I don't see this as an issue.
|
||||
|
||||
### Updated Configure/Makefile
|
||||
|
||||
- Tested on Ubuntu 14.04, CentOS 6.5 and Mac OS X 10.9.
|
||||
- Makefile has GNU/BSD sed/grep detection.
|
||||
|
||||
### HTML output
|
||||
|
||||
- The output HTML is HTML5 compliant, but should quickly and elegantly degrade on older browsers without losing basic structure.
|
||||
- The CSS avoids the use or browser specific extensions (i.e. -webkit, -moz etc), using the W3C HTML5 standard instead.
|
||||
- It's been tested in Chrome 37.0 and Firefox 32.0 on Mac OS X 10.9 (+Safari 7), Windows 8.1 (+Internet Explorer 11) and Ubuntu Desktop 14.04.
|
||||
- My assumption is basically that if someone cares enough to want to install fish, they'll be keeping a browser current.
|
||||
|
||||
### Man page output
|
||||
|
||||
- Tested on Ubuntu 14.04, CentOS 6.5 and Mac OS X 10.9.
|
||||
- Output is substantially cleaner.
|
||||
- Tested in cat, less, more and most pagers using the following fish script:
|
||||
|
||||
```
|
||||
function manTest --description 'Test manpage' --argument page
|
||||
set -l pager
|
||||
for i in $argv
|
||||
switch $i
|
||||
case "-l"
|
||||
set pager -P '/usr/bin/less -is'
|
||||
case "-m"
|
||||
set pager -P '/usr/bin/more -s'
|
||||
case "-c"
|
||||
set pager -P '/bin/cat'
|
||||
end
|
||||
end
|
||||
man $pager ~/Projects/OpenSource/fish-shell/share/man/man1/$page.1
|
||||
end
|
||||
|
||||
# Assumes 'most' is the default system pager.
|
||||
# NOT PORTABLE! Paths would be need to be updated on other systems.
|
||||
```
|
||||
|
||||
#### Author: Mark Griffiths [@GitHub](https://github.com/MarkGriffiths)
|
||||
80
doc_src/abbr.txt
Normal file
80
doc_src/abbr.txt
Normal file
@@ -0,0 +1,80 @@
|
||||
\section abbr abbr - manage fish abbreviations
|
||||
|
||||
\subsection abbr-synopsis Synopsis
|
||||
\fish{synopsis}
|
||||
abbr --add [SCOPE] WORD EXPANSION
|
||||
abbr --erase word
|
||||
abbr --rename [SCOPE] OLD_WORD NEW_WORD
|
||||
abbr --show
|
||||
abbr --list
|
||||
\endfish
|
||||
|
||||
\subsection abbr-description Description
|
||||
|
||||
`abbr` manages abbreviations - user-defined words that are replaced with longer phrases after they are entered.
|
||||
|
||||
For example, a frequently-run command like `git checkout` can be abbreviated to `gco`. After entering `gco` and pressing @key{Space} or @key{Enter}, the full text `git checkout` will appear in the command line.
|
||||
|
||||
\subsection abbr-options Options
|
||||
|
||||
The following options are available:
|
||||
|
||||
- `-a WORD EXPANSION` or `--add WORD EXPANSION` Adds a new abbreviation, causing WORD to be expanded to PHRASE.
|
||||
|
||||
- `-r OLD_WORD NEW_WORD` or `--rename OLD_WORD NEW_WORD` Renames an abbreviation, from OLD_WORD to NEW_WORD.
|
||||
|
||||
- `-s` or `--show` Show all abbreviations in a manner suitable for export and import.
|
||||
|
||||
- `-l` or `--list` Lists all abbreviated words.
|
||||
|
||||
- `-e WORD` or `--erase WORD` Erase the abbreviation WORD.
|
||||
|
||||
In addition, when adding abbreviations:
|
||||
|
||||
- `-g` or `--global` to use a global variable.
|
||||
- `-U` or `--universal` to use a universal variable (default).
|
||||
|
||||
See the "Internals" section for more on them.
|
||||
|
||||
\subsection abbr-example Examples
|
||||
|
||||
\fish
|
||||
abbr -a -g gco git checkout
|
||||
\endfish
|
||||
Add a new abbreviation where `gco` will be replaced with `git checkout` global to the current shell. This abbreviation will not be automatically visible to other shells unless the same command is run in those shells (such as when executing the commands in config.fish).
|
||||
|
||||
\fish
|
||||
abbr -a -U l less
|
||||
\endfish
|
||||
Add a new abbreviation where `l` will be replaced with `less` universal so all shells. Note that you omit the `-U` since it is the default.
|
||||
|
||||
\fish
|
||||
abbr -r gco gch
|
||||
\endfish
|
||||
Renames an existing abbreviation from `gco` to `gch`.
|
||||
|
||||
\fish
|
||||
abbr -e gco
|
||||
\endfish
|
||||
Erase the `gco` abbreviation.
|
||||
|
||||
\fish
|
||||
ssh another_host abbr -s | source
|
||||
\endfish
|
||||
Import the abbreviations defined on another_host over SSH.
|
||||
|
||||
\subsection abbr-internals Internals
|
||||
Each abbreviation is stored in its own global or universal variable. The name consists of the prefix `_fish_abbr_` followed by the WORD after being transformed by `string escape style=var`. The WORD cannot contain a space but all other characters are legal.
|
||||
|
||||
Defining an abbreviation with global scope is slightly faster than universal scope (which is the default). But in general you'll only want to use the global scope when defining abbreviations in a startup script like `~/.config/fish/config.fish` like this:
|
||||
|
||||
\fish
|
||||
if status --is-interactive
|
||||
abbr --add --global first 'echo my first abbreviation'
|
||||
abbr --add --global second 'echo my second abbreviation'
|
||||
abbr --add --global gco git checkout
|
||||
# etcetera
|
||||
end
|
||||
\endfish
|
||||
|
||||
You can create abbreviations interactively and they will be visible to other fish sessions if you use the `-U` or `--universal` flag or don't explicitly specify the scope and the abbreviation isn't already defined with global scope. If you want it to be visible only to the current shell use the `-g` or `--global` flag.
|
||||
@@ -1,18 +1,41 @@
|
||||
\section alias alias - create a function
|
||||
|
||||
\subsection alias-synopsis Synopsis
|
||||
<pre>alias NAME DEFINITION
|
||||
alias NAME=DEFINITION</pre>
|
||||
\fish{synopsis}
|
||||
alias
|
||||
alias [OPTIONS] NAME DEFINITION
|
||||
alias [OPTIONS] NAME=DEFINITION
|
||||
\endfish
|
||||
|
||||
\subsection alias-description Description
|
||||
|
||||
Alias is a shellscript wrapper around the function builtin.
|
||||
It exists for backwards compatibility with Posix
|
||||
shells. For other uses, it is recommended to define a <a
|
||||
href='#function'>function</a>.
|
||||
`alias` is a simple wrapper for the `function` builtin, which creates a function wrapping a command. It has similar syntax to POSIX shell `alias`. For other uses, it is recommended to define a <a href='#function'>function</a>.
|
||||
|
||||
Alias does not keep track of which functions have been defined using
|
||||
alias, nor does it allow erasing of aliases.
|
||||
`fish` marks functions that have been created by `alias` by including the command used to create them in the function description. You can list `alias`-created functions by running `alias` without arguments. They must be erased using `functions -e`.
|
||||
|
||||
- NAME is the name of the function to define
|
||||
- DEFINITION is the body of the function. The string " $argv" will be appended to the body.
|
||||
- `NAME` is the name of the alias
|
||||
- `DEFINITION` is the actual command to execute. The string `$argv` will be appended.
|
||||
|
||||
You cannot create an alias to a function with the same name. Note that spaces need to be escaped in the call to `alias` just like at the command line, _even inside quoted parts_.
|
||||
|
||||
The following options are available:
|
||||
|
||||
- `-h` or `--help` displays help about using this command.
|
||||
|
||||
- `-s` or `--save` Automatically save the function created by the alias into your fish configuration directory using <a href='#funcsave'>funcsave</a>.
|
||||
|
||||
\subsection alias-example Example
|
||||
|
||||
The following code will create `rmi`, which runs `rm` with additional arguments on every invocation.
|
||||
|
||||
\fish
|
||||
alias rmi="rm -i"
|
||||
|
||||
# This is equivalent to entering the following function:
|
||||
function rmi --wraps rm --description 'alias rmi=rm -i'
|
||||
rm -i $argv
|
||||
end
|
||||
|
||||
# This needs to have the spaces escaped or "Chrome.app..." will be seen as an argument to "/Applications/Google":
|
||||
alias chrome='/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome banana'
|
||||
\endfish
|
||||
|
||||
@@ -1,27 +1,23 @@
|
||||
\section and and - conditionally execute a command
|
||||
|
||||
\subsection and-synopsis Synopsis
|
||||
<tt>COMMAND1; and COMMAND2</tt>
|
||||
\fish{synopsis}
|
||||
COMMAND1; and COMMAND2
|
||||
\endfish
|
||||
|
||||
\subsection and-description Description
|
||||
|
||||
The \c and builtin is used to execute a command if the current exit
|
||||
status (as set by the last previous command) is 0.
|
||||
`and` is used to execute a command if the previous command was successful (returned a status of 0).
|
||||
|
||||
The and command does not change the current exit status.
|
||||
`and` statements may be used as part of the condition in an <a href="#if">`if`</a> or <a href="#while">`while`</a> block. See the documentation for <a href="#if">`if`</a> and <a href="#while">`while`</a> for examples.
|
||||
|
||||
The exit status of the last foreground command to exit can always be
|
||||
accessed using the <a href="index.html#variables-status">$status</a>
|
||||
variable.
|
||||
`and` does not change the current exit status itself, but the command it runs most likely will. The exit status of the last foreground command to exit can always be accessed using the <a href="index.html#variables-status">$status</a> variable.
|
||||
|
||||
\subsection and-example Example
|
||||
|
||||
The following code runs the \c make command to build a program, if the
|
||||
build succeeds, the program is installed. If either step fails,
|
||||
<tt>make clean</tt> is run, which removes the files created by the
|
||||
build process
|
||||
The following code runs the `make` command to build a program. If the build succeeds, `make`'s exit status is 0, and the program is installed. If either step fails, the exit status is 1, and `make clean` is run, which removes the files created by the build process.
|
||||
|
||||
<pre>
|
||||
\fish
|
||||
make; and make install; or make clean
|
||||
</pre>
|
||||
\endfish
|
||||
|
||||
|
||||
131
doc_src/argparse.txt
Normal file
131
doc_src/argparse.txt
Normal file
@@ -0,0 +1,131 @@
|
||||
\section argparse argparse - parse options passed to a fish script or function
|
||||
|
||||
\subsection argparse-synopsis Synopsis
|
||||
\fish{synopsis}
|
||||
argparse [OPTIONS] OPTION_SPEC... -- [ARG...]
|
||||
\endfish
|
||||
|
||||
\subsection argparse-description Description
|
||||
|
||||
This command makes it easy for fish scripts and functions to handle arguments in a manner 100% identical to how fish builtin commands handle their arguments. You pass a sequence of arguments that define the options recognized, followed by a literal `--`, then the arguments to be parsed (which might also include a literal `--`). More on this in the <a href="#argparse-usage">usage</a> section below.
|
||||
|
||||
Each OPTION_SPEC can be written in the domain specific language <a href="#argparse-option-specs">described below</a> or created using the companion <a href="#fish-opt">`fish_opt`</a> command. All OPTION_SPECs must appear after any argparse flags and before the `--` that separates them from the arguments to be parsed.
|
||||
|
||||
Each option that is seen in the ARG list will result in a var name of the form `_flag_X`, where `X` is the short flag letter and the long flag name. The OPTION_SPEC always requires a short flag even if it can't be used. So there will always be `_flag_X` var set using the short flag letter if the corresponding short or long flag is seen. The long flag name var (e.g., `_flag_help`) will only be defined, obviously, if the OPTION_SPEC includes a long flag name.
|
||||
|
||||
For example `_flag_h` and `_flag_help` if `-h` or `--help` is seen. The var will be set with local scope (i.e., as if the script had done `set -l _flag_X`). If the flag is a boolean (that is, does not have an associated value) the values are the short and long flags seen. If the option is not a boolean flag the values will be zero or more values corresponding to the values collected when the ARG list is processed. If the flag was not seen the flag var will not be set.
|
||||
|
||||
\subsection argparse-options Options
|
||||
|
||||
The following `argparse` options are available. They must appear before all OPTION_SPECs:
|
||||
|
||||
- `-n` or `--name` is the command name to insert into any error messages. If you don't provide this value `argparse` will be used.
|
||||
|
||||
- `-x` or `--exclusive` should be followed by a comma separated list of short of long options that are mutually exclusive. You can use this option more than once to define multiple sets of mutually exclusive options.
|
||||
|
||||
- `-N` or `--min-args` is followed by an integer that defines the minimum number of acceptable non-option arguments. The default is zero.
|
||||
|
||||
- `-X` or `--max-args` is followed by an integer that defines the maximum number of acceptable non-option arguments. The default is infinity.
|
||||
|
||||
- `-s` or `--stop-nonopt` causes scanning the arguments to stop as soon as the first non-option argument is seen. Using this arg is equivalent to calling the C function `getopt_long()` with the short options starting with a `+` symbol. This is sometimes known as "POSIXLY CORRECT". If this flag is not used then arguments are reordered (i.e., permuted) so that all non-option arguments are moved after option arguments. This mode has several uses but the main one is to implement a command that has subcommands.
|
||||
|
||||
- `-h` or `--help` displays help about using this command.
|
||||
|
||||
\subsection argparse-usage Usage
|
||||
|
||||
Using this command involves passing two sets of arguments separated by `--`. The first set consists of one or more option specifications (`OPTION_SPEC` above) and options that modify the behavior of `argparse`. These must be listed before the `--` argument. The second set are the arguments to be parsed in accordance with the option specifications. They occur after the `--` argument and can be empty. More about this below but here is a simple example that might be used in a function named `my_function`:
|
||||
|
||||
\fish
|
||||
argparse --name=my_function 'h/help' 'n/name=' -- $argv
|
||||
or return
|
||||
\endfish
|
||||
|
||||
If `$argv` is empty then there is nothing to parse and `argparse` returns zero to indicate success. If `$argv` is not empty then it is checked for flags `-h`, `--help`, `-n` and `--name`. If they are found they are removed from the arguments and local variables (more on this <a href="argparse-local-variables">below</a>) are set so the script can determine which options were seen. Assuming `$argv` doesn't have any errors, such as a missing mandatory value for an option, then `argparse` exits with status zero. Otherwise it writes appropriate error messages to stderr and exits with a status of one.
|
||||
|
||||
The `--` argument is required. You do not have to include any arguments after the `--` but you must include the `--`. For example, this is acceptable:
|
||||
|
||||
\fish
|
||||
set -l argv
|
||||
argparse 'h/help' 'n/name' -- $argv
|
||||
\endfish
|
||||
|
||||
But this is not:
|
||||
|
||||
\fish
|
||||
set -l argv
|
||||
argparse 'h/help' 'n/name' $argv
|
||||
\endfish
|
||||
|
||||
The first `--` seen is what allows the `argparse` command to reliably separate the option specifications from the command arguments.
|
||||
|
||||
\subsection argparse-option-specs Option Specifications
|
||||
|
||||
Each option specification is a string composed of
|
||||
|
||||
- A short flag letter (which is mandatory). It must be an alphanumeric or "#". The "#" character is special and means that a flag of the form `-123` is valid. The short flag "#" must be followed by "-" (since the short name isn't otherwise valid since `_flag_#` is not a valid var name) and must be followed by a long flag name with no modifiers.
|
||||
|
||||
- A `/` if the short flag can be used by someone invoking your command else `-` if it should not be exposed as a valid short flag. If there is no long flag name these characters should be omitted. You can also specify a '#' to indicate the short and long flag names can be used and the value can be specified as an implicit int; i.e., a flag of the form `-NNN`.
|
||||
|
||||
- A long flag name which is optional. If not present then only the short flag letter can be used.
|
||||
|
||||
- Nothing if the flag is a boolean that takes no argument or is an implicit int flag, else
|
||||
|
||||
- `=` if it requires a value and only the last instance of the flag is saved, else
|
||||
|
||||
- `=?` it takes an optional value and only the last instance of the flag is saved, else
|
||||
|
||||
- `=+` if it requires a value and each instance of the flag is saved.
|
||||
|
||||
- Optionally a `!` followed by fish script to validate the value. Typically this will be a function to run. If the return status is zero the value for the flag is valid. If non-zero the value is invalid. Any error messages should be written to stdout (not stderr). See the section on <a href="#arparse-validation">Flag Value Validation</a> for more information.
|
||||
|
||||
See the <a href="#fish-opt">`fish_opt`</a> command for a friendlier but more verbose way to create option specifications.
|
||||
|
||||
In the following examples if a flag is not seen when parsing the arguments then the corresponding _flag_X var(s) will not be set.
|
||||
|
||||
\subsection argparse-validation Flag Value Validation
|
||||
|
||||
It is common to want to validate the the value provided for an option satisfies some criteria. For example, that it is a valid integer within a specific range. You can always do this after `argparse` returns but you can also request that `argparse` perform the validation by executing arbitrary fish script. To do so simply append an `!` (exclamation-mark) then the fish script to be run. When that code is executed three vars will be defined:
|
||||
|
||||
- `_argparse_cmd` will be set to the value of the value of the `argparse --name` value.
|
||||
|
||||
- `_flag_name` will be set to the short or long flag that being processed.
|
||||
|
||||
- `_flag_value` will be set to the value associated with the flag being processed.
|
||||
|
||||
If you do this via a function it should be defined with the `--no-scope-shadowing` flag. Otherwise it won't have access to those variables.
|
||||
|
||||
The script should write any error messages to stdout, not stderr. It should return a status of zero if the flag value is valid otherwise a non-zero status to indicate it is invalid.
|
||||
|
||||
Fish ships with a `_validate_int` function that accepts a `--min` and `--max` flag. Let's say your command accepts a `-m` or `--max` flag and the minimum allowable value is zero and the maximum is 5. You would define the option like this: `m/max=!_validate_int --min 0 --max 5`. The default if you just call `_validate_int` without those flags is to simply check that the value is a valid integer with no limits on the min or max value allowed.
|
||||
|
||||
\subsection argparse-optspec-examples Example OPTION_SPECs
|
||||
|
||||
Some OPTION_SPEC examples:
|
||||
|
||||
- `h/help` means that both `-h` and `--help` are valid. The flag is a boolean and can be used more than once. If either flag is used then `_flag_h` and `_flag_help` will be set to the count of how many times either flag was seen.
|
||||
|
||||
- `h-help` means that only `--help` is valid. The flag is a boolean and can be used more than once. If the long flag is used then `_flag_h` and `_flag_help` will be set to the count of how many times the long flag was seen.
|
||||
|
||||
- `n/name=` means that both `-n` and `--name` are valid. It requires a value and can be used at most once. If the flag is seen then `_flag_n` and `_flag_name` will be set with the single mandatory value associated with the flag.
|
||||
|
||||
- `n/name=?` means that both `-n` and `--name` are valid. It accepts an optional value and can be used at most once. If the flag is seen then `_flag_n` and `_flag_name` will be set with the value associated with the flag if one was provided else it will be set with no values.
|
||||
|
||||
- `n-name=+` means that only `--name` is valid. It requires a value and can be used more than once. If the flag is seen then `_flag_n` and `_flag_name` will be set with the values associated with each occurrence of the flag.
|
||||
|
||||
- `x` means that only `-x` is valid. It is a boolean can can be used more than once. If it is seen then `_flag_x` will be set to the count of how many times the flag was seen.
|
||||
|
||||
- `x=`, `x=?`, and `x=+` are similar to the n/name examples above but there is no long flag alternative to the short flag `-x`.
|
||||
|
||||
- `x-` is not valid since there is no long flag name and therefore the short flag, `-x`, has to be usable.
|
||||
|
||||
- `#-max` means that flags matching the regex "^--?\d+$" are valid. When seen they are assigned to the variable `_flag_max`. This allows any valid positive or negative integer to be specified by prefixing it with a single "-". Many commands support this idiom. For example `head -3 /a/file` to emit only the first three lines of /a/file.
|
||||
|
||||
- `n#max` means that flags matching the regex "^--?\d+$" are valid. When seen they are assigned to the variables `_flag_n` and `_flag_max`. This allows any valid positive or negative integer to be specified by prefixing it with a single "-". Many commands support this idiom. For example `head -3 /a/file` to emit only the first three lines of /a/file. You can also specify the value using either flag: `-n NNN` or `--max NNN` in this example.
|
||||
|
||||
After parsing the arguments the `argv` var is set with local scope to any values not already consumed during flag processing. If there are not unbound values the var is set but `count $argv` will be zero.
|
||||
|
||||
If an error occurs during argparse processing it will exit with a non-zero status and print error messages to stderr.
|
||||
|
||||
\subsection argparse-notes Notes
|
||||
|
||||
Prior to the addition of this builtin command in the 2.7.0 release there were two main ways to parse the arguments passed to a fish script or function. One way was to use the OS provided `getopt` command. The problem with that is that the GNU and BSD implementations are not compatible. Which makes using that external command difficult other than in trivial situations. The other way is to iterate over `$argv` and use the fish `switch` statement to decide how to handle the argument. That, however, involves a huge amount of boilerplate code. It is also borderline impossible to implement the same behavior as builtin commands.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user