mirror of
https://github.com/restic/restic.git
synced 2026-02-22 16:56:24 +00:00
Compare commits
1756 Commits
v0.2.0
...
add-webdav
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0912a8db07 | ||
|
|
eefeb387d9 | ||
|
|
c7d789ab04 | ||
|
|
92918ef1b6 | ||
|
|
f49f5c5903 | ||
|
|
d89f2e5226 | ||
|
|
02f4f5dc66 | ||
|
|
5723636b35 | ||
|
|
5632ca4f44 | ||
|
|
539599d1f1 | ||
|
|
d77a326bb0 | ||
|
|
99f0fce673 | ||
|
|
b708cfee3f | ||
|
|
b8620429e2 | ||
|
|
aab414b368 | ||
|
|
e120b17abd | ||
|
|
5f43e17918 | ||
|
|
489eef5a6f | ||
|
|
8c550ca011 | ||
|
|
032621289b | ||
|
|
92316a9853 | ||
|
|
180741609e | ||
|
|
70250762f3 | ||
|
|
39ba17a2d6 | ||
|
|
cfe8c8c9cd | ||
|
|
b45fc89512 | ||
|
|
aabc0ccaa7 | ||
|
|
2bc4d200d4 | ||
|
|
0247fe01c0 | ||
|
|
c912b38bf0 | ||
|
|
559946c58a | ||
|
|
a99637c613 | ||
|
|
36501dda73 | ||
|
|
18ecd9df30 | ||
|
|
c686dd0448 | ||
|
|
6d91d468e7 | ||
|
|
5f9b5b0219 | ||
|
|
3f7d85360a | ||
|
|
8d8456590c | ||
|
|
85f9f3e290 | ||
|
|
9e1180a29b | ||
|
|
e17c1096a0 | ||
|
|
546d6f36b2 | ||
|
|
6ecd14d780 | ||
|
|
f6ed7dc013 | ||
|
|
e290f2591e | ||
|
|
75f90ca303 | ||
|
|
ca1430184f | ||
|
|
a297ab9d7c | ||
|
|
f078525d98 | ||
|
|
e03cc81a9a | ||
|
|
af27f1dde5 | ||
|
|
32505c3916 | ||
|
|
9a8d5a1bff | ||
|
|
740ee787c1 | ||
|
|
2eba0bfeec | ||
|
|
d780ec4bce | ||
|
|
6b564d21b3 | ||
|
|
6c2b2a58ad | ||
|
|
b80b68dcb3 | ||
|
|
29c92ca415 | ||
|
|
bc04ce8e6b | ||
|
|
6b6b75fa4a | ||
|
|
84e493beba | ||
|
|
323376efa2 | ||
|
|
e353b00501 | ||
|
|
2510d770ab | ||
|
|
7d8765a937 | ||
|
|
81a04656c5 | ||
|
|
2f26fb8834 | ||
|
|
d3ebe1311f | ||
|
|
42a8c19aae | ||
|
|
27ccea6371 | ||
|
|
4f46b4f393 | ||
|
|
221e741537 | ||
|
|
8b3b7bc5ef | ||
|
|
934ae1b559 | ||
|
|
0e7e3cb714 | ||
|
|
95b6e4e9e9 | ||
|
|
3a5e040b7e | ||
|
|
28c826868b | ||
|
|
1695c8ed55 | ||
|
|
366622f09a | ||
|
|
0dc31c03e1 | ||
|
|
0405e67f8b | ||
|
|
df350e1f6e | ||
|
|
06cb3f7058 | ||
|
|
56b884be17 | ||
|
|
a25d280f3e | ||
|
|
2253a73837 | ||
|
|
946c8399e2 | ||
|
|
9d0f13c4c0 | ||
|
|
eb9e2bc79a | ||
|
|
0722c44ba1 | ||
|
|
2424012d75 | ||
|
|
82ded35706 | ||
|
|
69fcb604c8 | ||
|
|
88607fc625 | ||
|
|
7092af6329 | ||
|
|
23d7d91597 | ||
|
|
ad82781743 | ||
|
|
20d78ab0d9 | ||
|
|
be24237063 | ||
|
|
d886cb5c27 | ||
|
|
63bb1933e5 | ||
|
|
81e6a9d0d0 | ||
|
|
5d4110d2a7 | ||
|
|
0cedb3ac9f | ||
|
|
0b44c629f2 | ||
|
|
2579fe6b7b | ||
|
|
812ce4bfc4 | ||
|
|
410efe0694 | ||
|
|
b2d944d5cb | ||
|
|
b846c3915c | ||
|
|
ffbc68aa2e | ||
|
|
eddb8549ef | ||
|
|
bb44855078 | ||
|
|
2567026ccb | ||
|
|
0cc8fc6f18 | ||
|
|
cc81b916a6 | ||
|
|
27fadd2c6e | ||
|
|
dc38265b54 | ||
|
|
1ea518d5ef | ||
|
|
901cd5edef | ||
|
|
e1fd47765b | ||
|
|
c02923fbfc | ||
|
|
7c5ce83044 | ||
|
|
37e2e9a844 | ||
|
|
26e5db1849 | ||
|
|
a2766ffe0c | ||
|
|
0f5e38609f | ||
|
|
f178cbf93d | ||
|
|
c8096ca8d2 | ||
|
|
27d29b9853 | ||
|
|
8a171731ba | ||
|
|
abde9e2fba | ||
|
|
6a4a328bbc | ||
|
|
8253fadc96 | ||
|
|
134abbd82b | ||
|
|
fe557b022a | ||
|
|
cd8226130a | ||
|
|
1ebf0e8de8 | ||
|
|
37ea764000 | ||
|
|
0fdb9a6129 | ||
|
|
47b326b7b5 | ||
|
|
e2cf6eb434 | ||
|
|
f79698dcdd | ||
|
|
35a5307db3 | ||
|
|
6341c7d72c | ||
|
|
f4bab789b8 | ||
|
|
fa893ee477 | ||
|
|
014cec06f1 | ||
|
|
431ab5aa6a | ||
|
|
262b0cd9d4 | ||
|
|
e83ec17e95 | ||
|
|
ea593fca1b | ||
|
|
fe1f151ae1 | ||
|
|
b12bba4e2a | ||
|
|
e2005e02bb | ||
|
|
41c8c946ba | ||
|
|
fe08686558 | ||
|
|
0ed2401711 | ||
|
|
06bd606d85 | ||
|
|
c347431907 | ||
|
|
f63d7048f9 | ||
|
|
f39f7c76dd | ||
|
|
0268d0e7d6 | ||
|
|
8515d093e0 | ||
|
|
fe3f326d8d | ||
|
|
8170db40c7 | ||
|
|
99ac0da4bc | ||
|
|
7e2c93420f | ||
|
|
6d46824fb0 | ||
|
|
bb435b39d9 | ||
|
|
2a67d7a6c2 | ||
|
|
ba43c8bab5 | ||
|
|
931e6ed2ac | ||
|
|
a5f0e9ab65 | ||
|
|
6fc133ad6a | ||
|
|
e1b80859f2 | ||
|
|
d069ee31b2 | ||
|
|
981752ade0 | ||
|
|
d01d07fc0a | ||
|
|
526aaca6f5 | ||
|
|
2f8147af59 | ||
|
|
f3016a9096 | ||
|
|
f854a41ba9 | ||
|
|
ca3cadef5e | ||
|
|
3304b0fcf0 | ||
|
|
d8938e259a | ||
|
|
53a554c89d | ||
|
|
e71db01230 | ||
|
|
178e946fc7 | ||
|
|
f3bff12939 | ||
|
|
7a99418dc5 | ||
|
|
c71ba466ea | ||
|
|
8ce5d35543 | ||
|
|
134f834c60 | ||
|
|
8a37c07295 | ||
|
|
bd0ada7842 | ||
|
|
eea96f652d | ||
|
|
38c3061df7 | ||
|
|
f5fa602482 | ||
|
|
e44ac55f63 | ||
|
|
f1cfb73a8b | ||
|
|
5b96885c6d | ||
|
|
c5da90a5b7 | ||
|
|
bcdebfb84e | ||
|
|
359b273649 | ||
|
|
2e2c8dc620 | ||
|
|
8d37b723ca | ||
|
|
315b7f282f | ||
|
|
a3f8e9dfa7 | ||
|
|
982810f7cc | ||
|
|
90b96d19cd | ||
|
|
6a52bb6f54 | ||
|
|
cacaa4393f | ||
|
|
d63ab4e9a4 | ||
|
|
ca6daec8dd | ||
|
|
c87f2420a6 | ||
|
|
f5bbbc52f4 | ||
|
|
9e3dde8ec7 | ||
|
|
9dba182e51 | ||
|
|
944fc857eb | ||
|
|
7507a658ac | ||
|
|
9fa4f5eb6b | ||
|
|
ce4d71d626 | ||
|
|
8e2ef3f38b | ||
|
|
8dc952775e | ||
|
|
99b6163e27 | ||
|
|
beaf55f1fc | ||
|
|
980bb9059f | ||
|
|
0e7281eb71 | ||
|
|
0b6133d7b5 | ||
|
|
b57ca64275 | ||
|
|
faadbd734b | ||
|
|
88b0a93409 | ||
|
|
4a995105a9 | ||
|
|
7fe496f983 | ||
|
|
e56370eb5b | ||
|
|
b8af7f63a0 | ||
|
|
3eea555155 | ||
|
|
897c923cc9 | ||
|
|
67193e3deb | ||
|
|
0e722efb09 | ||
|
|
3736f33ebf | ||
|
|
d1d9c3f9d7 | ||
|
|
cd5cbe0910 | ||
|
|
814e992c0b | ||
|
|
660fe78735 | ||
|
|
87d084e18c | ||
|
|
9ce2a73fc5 | ||
|
|
f2314b26ba | ||
|
|
74dcf41f25 | ||
|
|
b6ba30186f | ||
|
|
32637a0328 | ||
|
|
0addd90e14 | ||
|
|
1b5ee5b10a | ||
|
|
042adeb5d0 | ||
|
|
7e4ce0dacc | ||
|
|
8ceb22fe8a | ||
|
|
c5553ec855 | ||
|
|
bb3ed54291 | ||
|
|
513ba3b6f7 | ||
|
|
17d688afef | ||
|
|
d81eee26b3 | ||
|
|
cc5ada63a4 | ||
|
|
88fb60e0b5 | ||
|
|
02200acad0 | ||
|
|
1a2d190bdb | ||
|
|
2db4ff168a | ||
|
|
a77c8cc5d2 | ||
|
|
b8866c1fe4 | ||
|
|
f0f17db847 | ||
|
|
a5c003acb0 | ||
|
|
7b44fd0f9d | ||
|
|
cebee0b8fa | ||
|
|
d886bc6c48 | ||
|
|
d81adcfaa5 | ||
|
|
6da9bfbbce | ||
|
|
69a6e622d0 | ||
|
|
1dcfd64028 | ||
|
|
5d1c1f721e | ||
|
|
fbc8bbf305 | ||
|
|
cdef55bb88 | ||
|
|
26df48b2aa | ||
|
|
a7baea0522 | ||
|
|
55e6003749 | ||
|
|
846acd5d4c | ||
|
|
43f8145858 | ||
|
|
79759928f6 | ||
|
|
eb59d28154 | ||
|
|
79f63a2e74 | ||
|
|
6a62254048 | ||
|
|
657a1d75af | ||
|
|
2694def56a | ||
|
|
7843341da3 | ||
|
|
d46314648e | ||
|
|
e45011af57 | ||
|
|
fb09884893 | ||
|
|
d1eecafa63 | ||
|
|
b47d991f56 | ||
|
|
553ea812a7 | ||
|
|
216e374310 | ||
|
|
034b0b8040 | ||
|
|
5ab9e12b46 | ||
|
|
abe6e0d22d | ||
|
|
f5b550191c | ||
|
|
3dcacb3730 | ||
|
|
033589a66b | ||
|
|
e46a647c45 | ||
|
|
f26492fc2d | ||
|
|
3473c3f7b6 | ||
|
|
1b5242b4f9 | ||
|
|
6d897def1b | ||
|
|
2f10e25738 | ||
|
|
555bd257bd | ||
|
|
3afd974dea | ||
|
|
f4120c9d45 | ||
|
|
61cb1cc6f8 | ||
|
|
49bc1d0b3b | ||
|
|
ba23d24dd1 | ||
|
|
556a63de19 | ||
|
|
fae3c4d437 | ||
|
|
89c2ed2a1c | ||
|
|
23f1cb06d6 | ||
|
|
ac92e2dd2d | ||
|
|
bf58425351 | ||
|
|
a3dc0ab398 | ||
|
|
224ebdb8b9 | ||
|
|
cf80d295f3 | ||
|
|
2133869127 | ||
|
|
97330ac621 | ||
|
|
1ee1559506 | ||
|
|
eccc336319 | ||
|
|
7fe657ec71 | ||
|
|
77c07bfd19 | ||
|
|
4de938d97a | ||
|
|
dad1c87afe | ||
|
|
801dbb6d03 | ||
|
|
fa0be82da8 | ||
|
|
7e8bc8d362 | ||
|
|
0bb2a8e0d0 | ||
|
|
2e72b57f2f | ||
|
|
bff1039e3a | ||
|
|
5a999cb77f | ||
|
|
3a2539e0ac | ||
|
|
e262f35d0a | ||
|
|
176bfa6529 | ||
|
|
240c4cf2fd | ||
|
|
db5ec5d876 | ||
|
|
e1dfaf5d87 | ||
|
|
5436154f0d | ||
|
|
809e218d20 | ||
|
|
1eaad6cebb | ||
|
|
56fccecd06 | ||
|
|
3890a947ca | ||
|
|
e299272378 | ||
|
|
70248bd05a | ||
|
|
7a5fde8f5a | ||
|
|
62ba9f1950 | ||
|
|
610b676444 | ||
|
|
58699e3c90 | ||
|
|
9be24a1c9f | ||
|
|
5ace41471e | ||
|
|
3b2106ed30 | ||
|
|
5f4f997126 | ||
|
|
49d397a419 | ||
|
|
ea1ab96749 | ||
|
|
24c62e719a | ||
|
|
9c6b7f688e | ||
|
|
d41dce5ecb | ||
|
|
52a3eafede | ||
|
|
55dfc85159 | ||
|
|
a7a478a19e | ||
|
|
2080afd9de | ||
|
|
9aa136b982 | ||
|
|
3a191f37cb | ||
|
|
429106340f | ||
|
|
530c73b457 | ||
|
|
fb9729fdb9 | ||
|
|
45a09c76ff | ||
|
|
efd65a1b65 | ||
|
|
ae60188eb9 | ||
|
|
3b904525d9 | ||
|
|
1e31f5202f | ||
|
|
f12d41138a | ||
|
|
98369f6a5d | ||
|
|
8f9bf1995b | ||
|
|
e7de3b5f9d | ||
|
|
3541d06d07 | ||
|
|
db0e3cd772 | ||
|
|
d3fee08f9a | ||
|
|
727fb6eabe | ||
|
|
d610c60991 | ||
|
|
3f6e11d26e | ||
|
|
a4577769ae | ||
|
|
7f927d4774 | ||
|
|
e091673f8f | ||
|
|
9842eff887 | ||
|
|
c40b3d3983 | ||
|
|
ac5eefdee4 | ||
|
|
bf508643a5 | ||
|
|
02fc16e97d | ||
|
|
1a83a739dc | ||
|
|
81473f4538 | ||
|
|
e1a847e4d1 | ||
|
|
0f426c3795 | ||
|
|
6df3d169b8 | ||
|
|
5479daa6d4 | ||
|
|
397fec0152 | ||
|
|
d7e644272f | ||
|
|
e91749bbb0 | ||
|
|
bcd1e45ba7 | ||
|
|
4c6b626db6 | ||
|
|
835ba16c27 | ||
|
|
3b6a580b32 | ||
|
|
01c486d486 | ||
|
|
6342a08a16 | ||
|
|
94c8ee11f8 | ||
|
|
9b38980ed9 | ||
|
|
649c536250 | ||
|
|
dd49e2b12d | ||
|
|
f61dab1774 | ||
|
|
40edf00182 | ||
|
|
c35518a865 | ||
|
|
7a0b4428e3 | ||
|
|
c784a15aaa | ||
|
|
ce180de9b8 | ||
|
|
fca9a523e9 | ||
|
|
8a3889be11 | ||
|
|
2a1633621b | ||
|
|
e2deeceb1b | ||
|
|
d4e994de7b | ||
|
|
a60e751217 | ||
|
|
81c5d8a968 | ||
|
|
5b1e4df177 | ||
|
|
4d80744cbb | ||
|
|
e243d4b7ee | ||
|
|
dce35fcb00 | ||
|
|
e45a21b0b6 | ||
|
|
fda563d606 | ||
|
|
f3b49987f8 | ||
|
|
c8c01a5cae | ||
|
|
f7ece90129 | ||
|
|
0f25ef9498 | ||
|
|
5bf2228596 | ||
|
|
227b01395f | ||
|
|
9f52fe1a10 | ||
|
|
affc6c3390 | ||
|
|
951a34dcbf | ||
|
|
36eaa22ed0 | ||
|
|
62df316356 | ||
|
|
00797fdd85 | ||
|
|
9eb39cef05 | ||
|
|
ee6150f67c | ||
|
|
9fa909ccd6 | ||
|
|
b1af544b1d | ||
|
|
7d5b17ac72 | ||
|
|
7a221f2473 | ||
|
|
bdbe956c5c | ||
|
|
8e5b1e6f2f | ||
|
|
257a454515 | ||
|
|
b6aeea425b | ||
|
|
c8e05d1f2a | ||
|
|
a8aa4eb06c | ||
|
|
c1a02cc081 | ||
|
|
e66adc42da | ||
|
|
89938bc21c | ||
|
|
0b2947dedb | ||
|
|
47ddd34266 | ||
|
|
2fdca5d310 | ||
|
|
e5d4e33509 | ||
|
|
e117f613af | ||
|
|
0dfdf02885 | ||
|
|
4a0129fc2b | ||
|
|
a9c705009c | ||
|
|
d937ad8cf6 | ||
|
|
1a08a8219f | ||
|
|
9924c311c9 | ||
|
|
e846e14965 | ||
|
|
36e70228f2 | ||
|
|
a677f1139a | ||
|
|
6f8eba9c28 | ||
|
|
c22c582546 | ||
|
|
ea75509d6e | ||
|
|
ed30bd7b76 | ||
|
|
7090c5ceeb | ||
|
|
bee09c1a0f | ||
|
|
8f9ef4402b | ||
|
|
f26c0cb70f | ||
|
|
81d7ecba2b | ||
|
|
087c3fe1dc | ||
|
|
43ff971dfd | ||
|
|
5c75a98053 | ||
|
|
7ce47402fb | ||
|
|
1e48141648 | ||
|
|
dbda892542 | ||
|
|
b46774be21 | ||
|
|
1073bfba37 | ||
|
|
5dfb4d1195 | ||
|
|
0a2219c5f7 | ||
|
|
ff3149831e | ||
|
|
c935d0558c | ||
|
|
83eb075e3a | ||
|
|
204c2bf09c | ||
|
|
2444522243 | ||
|
|
92eb1cbffd | ||
|
|
8c40ae5a03 | ||
|
|
fa2ee78a5c | ||
|
|
e4a5cdc5bc | ||
|
|
2d73a273af | ||
|
|
761af08889 | ||
|
|
0ee1650f82 | ||
|
|
0e647417f3 | ||
|
|
d1bf5a4882 | ||
|
|
b8414b240c | ||
|
|
3fbdd12b04 | ||
|
|
a3f6bf3e5a | ||
|
|
3a5805db50 | ||
|
|
de8c64e767 | ||
|
|
73d6b15095 | ||
|
|
5d396b9302 | ||
|
|
61d2519111 | ||
|
|
e61c94a846 | ||
|
|
7ed0f61f3f | ||
|
|
85055d1c68 | ||
|
|
e4c469c149 | ||
|
|
9940e8d9f1 | ||
|
|
3dccca1f27 | ||
|
|
22e96a37f8 | ||
|
|
48b1ab5aaf | ||
|
|
0230fa188f | ||
|
|
4118ce876e | ||
|
|
9537bc561d | ||
|
|
ae43c47ca8 | ||
|
|
2fa4060991 | ||
|
|
f9a934759f | ||
|
|
3686b1ffe5 | ||
|
|
ea017a49c3 | ||
|
|
3559f9c776 | ||
|
|
637f57ca71 | ||
|
|
4e60156b45 | ||
|
|
af9946b098 | ||
|
|
b7d4b0f821 | ||
|
|
62ed776a8c | ||
|
|
f880ff21aa | ||
|
|
4a36993c19 | ||
|
|
d87b2f189d | ||
|
|
f9a097a8c0 | ||
|
|
d43358b6dd | ||
|
|
8058f196e1 | ||
|
|
e13e6f34d2 | ||
|
|
c2ff7150aa | ||
|
|
a899621930 | ||
|
|
a0966e1d1d | ||
|
|
e2464382ed | ||
|
|
095bc79dc3 | ||
|
|
1fd3c2488e | ||
|
|
2ee8485886 | ||
|
|
b67c178672 | ||
|
|
7ac4f0a525 | ||
|
|
c4613c51d1 | ||
|
|
77bf17076b | ||
|
|
8dd6beba15 | ||
|
|
a345386967 | ||
|
|
bdd43bd430 | ||
|
|
1716501598 | ||
|
|
d9a5b9178e | ||
|
|
8ca6a9a240 | ||
|
|
ba75a3884c | ||
|
|
d91d89eef6 | ||
|
|
a726c91116 | ||
|
|
d00fe95f10 | ||
|
|
072b7a014e | ||
|
|
618ce115d7 | ||
|
|
d973aa82fe | ||
|
|
3a85b6b7c6 | ||
|
|
2c22ff175c | ||
|
|
6bc43a4198 | ||
|
|
e348b3deeb | ||
|
|
6724b9a583 | ||
|
|
41c35b2218 | ||
|
|
4477d76f03 | ||
|
|
14f5f6235a | ||
|
|
739350fd8e | ||
|
|
14ed97102b | ||
|
|
db389058fa | ||
|
|
b557d04007 | ||
|
|
52c5da997b | ||
|
|
57d198f99a | ||
|
|
a3ab17b470 | ||
|
|
9bf3141893 | ||
|
|
d35eb6a0c3 | ||
|
|
37aad2e3aa | ||
|
|
efc5d0699a | ||
|
|
893bc9f777 | ||
|
|
61b8729ef9 | ||
|
|
b89d3cc4d0 | ||
|
|
e8cc11ea34 | ||
|
|
2e804511ca | ||
|
|
b6790c491b | ||
|
|
c95e2b009e | ||
|
|
d5615a67c8 | ||
|
|
d9b9bbd4a8 | ||
|
|
d780b1eede | ||
|
|
608adf15a3 | ||
|
|
1717391f6c | ||
|
|
2e6e9ff6f8 | ||
|
|
23c903074c | ||
|
|
94030a12cf | ||
|
|
f63d7de9da | ||
|
|
13ee6792df | ||
|
|
6302444f34 | ||
|
|
61c5e4b54a | ||
|
|
d6118871be | ||
|
|
94b27e8933 | ||
|
|
05500dc5f8 | ||
|
|
c5a72971fe | ||
|
|
5bc6486e3b | ||
|
|
59e18bce0a | ||
|
|
898c5b6df5 | ||
|
|
9cd422791a | ||
|
|
91edebf1fe | ||
|
|
df8a5792f1 | ||
|
|
cda7b417cd | ||
|
|
d2ac35af26 | ||
|
|
6caeff2408 | ||
|
|
83d1a46526 | ||
|
|
d1bd160b0a | ||
|
|
bc88a8bb03 | ||
|
|
04cfb984ae | ||
|
|
02a245941a | ||
|
|
7fb1352aa1 | ||
|
|
4c555bad2e | ||
|
|
75c789bab4 | ||
|
|
626d020e62 | ||
|
|
3830117735 | ||
|
|
042cee8e36 | ||
|
|
03cc5b47e9 | ||
|
|
46fa45942e | ||
|
|
0cb4104aa7 | ||
|
|
f2bbc5fbc4 | ||
|
|
16340ce811 | ||
|
|
2cf8153f4a | ||
|
|
2f00287e45 | ||
|
|
0de17f64e9 | ||
|
|
c30838878f | ||
|
|
bd31281f1e | ||
|
|
7fc54ed98e | ||
|
|
0abdcedcab | ||
|
|
6c05353086 | ||
|
|
e7575bf380 | ||
|
|
89ace85903 | ||
|
|
68a91d66b7 | ||
|
|
724b5bf4fe | ||
|
|
d6da9211bc | ||
|
|
f45abac27f | ||
|
|
00b9a1d87d | ||
|
|
20b835b5a4 | ||
|
|
7bb1a474df | ||
|
|
750ee35dbf | ||
|
|
fda5e1f543 | ||
|
|
78d090aea5 | ||
|
|
7362569cf5 | ||
|
|
f5b1c7e5f1 | ||
|
|
c554cdac4c | ||
|
|
41b624ea1b | ||
|
|
7cdcaadcf5 | ||
|
|
4ad33d3c3b | ||
|
|
2778ac21de | ||
|
|
cb3cd57926 | ||
|
|
ba6815d413 | ||
|
|
52004cdde8 | ||
|
|
1d2045cb61 | ||
|
|
357e2e404a | ||
|
|
38e5640cda | ||
|
|
c4c731bd9a | ||
|
|
04d27acd60 | ||
|
|
80f0303b21 | ||
|
|
d651d9b427 | ||
|
|
3b2648bd5e | ||
|
|
73cc11f000 | ||
|
|
637de0149c | ||
|
|
855575e5a7 | ||
|
|
ed2999a163 | ||
|
|
a18c16e19e | ||
|
|
9032ab2eec | ||
|
|
03f66b8d74 | ||
|
|
8c30ae7c65 | ||
|
|
453c9c9199 | ||
|
|
993e370f92 | ||
|
|
2bcd3a3acc | ||
|
|
c54c632ca1 | ||
|
|
28a4a35625 | ||
|
|
e7577d7bb4 | ||
|
|
27ea0623d7 | ||
|
|
390e2bbddc | ||
|
|
b50fc08f39 | ||
|
|
b2ce7e8d84 | ||
|
|
2b1c6d3cf8 | ||
|
|
c658305a1b | ||
|
|
63235d8f94 | ||
|
|
d702227af0 | ||
|
|
b7251dbea5 | ||
|
|
144b7f3386 | ||
|
|
9583dc820f | ||
|
|
a03076f2d8 | ||
|
|
d76fa22b4b | ||
|
|
f960831f10 | ||
|
|
b0fb95dfc9 | ||
|
|
bca9566849 | ||
|
|
8760de42fe | ||
|
|
2c02efd1fe | ||
|
|
4b4a63ed44 | ||
|
|
64f434eca4 | ||
|
|
f4e85a53e7 | ||
|
|
f8176a74ec | ||
|
|
e60a96a71a | ||
|
|
216e2607ca | ||
|
|
53f8026018 | ||
|
|
de92ce7a88 | ||
|
|
eb8041b943 | ||
|
|
9c6e9bcf33 | ||
|
|
154816ffd0 | ||
|
|
c86e425df6 | ||
|
|
3883c7a190 | ||
|
|
a66760d86d | ||
|
|
52752659c1 | ||
|
|
f676c0c41b | ||
|
|
f31e993f09 | ||
|
|
56f610e548 | ||
|
|
052a6a0acc | ||
|
|
77037e33c9 | ||
|
|
5a34799554 | ||
|
|
47282abfa4 | ||
|
|
c9cc724b31 | ||
|
|
0d3674245b | ||
|
|
82b21cdf4a | ||
|
|
c4592f577a | ||
|
|
3cd851e578 | ||
|
|
e074833a7d | ||
|
|
c5f1a83cb4 | ||
|
|
1baaa778ee | ||
|
|
6a948d5afd | ||
|
|
ea66ae0811 | ||
|
|
bf8a155fb1 | ||
|
|
4ae59bef96 | ||
|
|
eadf5dcb2d | ||
|
|
91a24e8229 | ||
|
|
e3c979a7a4 | ||
|
|
05365706c0 | ||
|
|
bbca31b661 | ||
|
|
eb7fc12e01 | ||
|
|
98ae7b1210 | ||
|
|
51877cecf7 | ||
|
|
9053b2000b | ||
|
|
dd6ce5f9d8 | ||
|
|
9a8301fc74 | ||
|
|
aabe2a0a30 | ||
|
|
c79fb6fcdd | ||
|
|
af9ba3be91 | ||
|
|
6f24d038f8 | ||
|
|
cf65893c4b | ||
|
|
bd7d5a429f | ||
|
|
7b54f6e642 | ||
|
|
422c0dfb5e | ||
|
|
73b296918b | ||
|
|
907c201693 | ||
|
|
58de8bf392 | ||
|
|
a89a7a783a | ||
|
|
c422010597 | ||
|
|
08e1d9ffad | ||
|
|
a4e8dc3371 | ||
|
|
19da56a6ea | ||
|
|
d3c06c39f9 | ||
|
|
6301620428 | ||
|
|
a6f157f346 | ||
|
|
8d4417ec92 | ||
|
|
0b55be2581 | ||
|
|
88a59fd0ca | ||
|
|
539674614b | ||
|
|
9d1b9157d4 | ||
|
|
5f449045d2 | ||
|
|
3e4d236751 | ||
|
|
4fe6593fbe | ||
|
|
635633379a | ||
|
|
48fecd791d | ||
|
|
a325a20fb4 | ||
|
|
1f0916b01b | ||
|
|
eb767ab15f | ||
|
|
92c0aa3854 | ||
|
|
a61016cb55 | ||
|
|
eb7ddd6e11 | ||
|
|
ff3d2e42f4 | ||
|
|
1aab123b6c | ||
|
|
d11f8d294f | ||
|
|
04ded881f6 | ||
|
|
4f9bf5312b | ||
|
|
7cf8f59987 | ||
|
|
b8b5c8e8c9 | ||
|
|
a46baf7685 | ||
|
|
f2a51aa37c | ||
|
|
233eaf8ee9 | ||
|
|
067be2c551 | ||
|
|
550e1feaec | ||
|
|
f90ce23f30 | ||
|
|
29f8f8fe68 | ||
|
|
48c1e7b00d | ||
|
|
2175ccedd2 | ||
|
|
d4e74f20aa | ||
|
|
aa5bc39311 | ||
|
|
46049b4236 | ||
|
|
683ebef6c6 | ||
|
|
5010e95c23 | ||
|
|
46b7a270a6 | ||
|
|
cf497c2728 | ||
|
|
16fcd07110 | ||
|
|
a9a2798910 | ||
|
|
9cd664caa3 | ||
|
|
a90e0c6595 | ||
|
|
7b5efaf7b0 | ||
|
|
3b7ca4ac35 | ||
|
|
40a61b82ce | ||
|
|
028f43299a | ||
|
|
3a4727f0f5 | ||
|
|
fec89f95fb | ||
|
|
5681d41f76 | ||
|
|
efd61d97ef | ||
|
|
3ed56f2192 | ||
|
|
122462b9b1 | ||
|
|
2217b9277e | ||
|
|
b5e0e3631b | ||
|
|
be68e43871 | ||
|
|
f6034c0882 | ||
|
|
f693781bf0 | ||
|
|
3ae9be987f | ||
|
|
ec0975c388 | ||
|
|
c2ce484e93 | ||
|
|
e5c7c314a7 | ||
|
|
6d36dcd46e | ||
|
|
96c9ecd20e | ||
|
|
997be9a036 | ||
|
|
31fd8e98b9 | ||
|
|
aa0f874c8d | ||
|
|
5c59484d2b | ||
|
|
fba6211c99 | ||
|
|
a8386e7d71 | ||
|
|
04b262d8f1 | ||
|
|
4dbbc24a44 | ||
|
|
725d50554a | ||
|
|
ed91cafce2 | ||
|
|
de48a5ac9c | ||
|
|
1d167f4680 | ||
|
|
efad7ee197 | ||
|
|
820c88ea73 | ||
|
|
e7f031c9b3 | ||
|
|
f3f6924b61 | ||
|
|
c5244abad9 | ||
|
|
1f5954e2c1 | ||
|
|
e046a2a6da | ||
|
|
8395b53400 | ||
|
|
24ec14738d | ||
|
|
79477fdfe4 | ||
|
|
7ec0543af3 | ||
|
|
e73e3cb4ba | ||
|
|
317d9c4559 | ||
|
|
5247de552a | ||
|
|
37b107b90b | ||
|
|
17ff41af47 | ||
|
|
772f647a73 | ||
|
|
5c4facd9dc | ||
|
|
40ad1df6ee | ||
|
|
c49da4c6f7 | ||
|
|
d1cc87ba28 | ||
|
|
89be1d496a | ||
|
|
69e114c5c4 | ||
|
|
5d9a4ce90c | ||
|
|
84f1037b8f | ||
|
|
120af801cf | ||
|
|
f3d09ce7c8 | ||
|
|
2b9323529f | ||
|
|
971ecee171 | ||
|
|
4640d1a28e | ||
|
|
8b461a7456 | ||
|
|
2fa1238b8a | ||
|
|
55ae5dab2b | ||
|
|
fa41183a53 | ||
|
|
959aa0f595 | ||
|
|
069752cb42 | ||
|
|
0c537837d9 | ||
|
|
f19852a738 | ||
|
|
61cade6222 | ||
|
|
a4e3a0dd97 | ||
|
|
22a6cd3a26 | ||
|
|
7f10828dfa | ||
|
|
04264c6338 | ||
|
|
13393c76dc | ||
|
|
13c12ca83d | ||
|
|
7fffd408af | ||
|
|
089b04c8a9 | ||
|
|
b192dacc13 | ||
|
|
250a45ab15 | ||
|
|
3b44b87137 | ||
|
|
26c16b9fd3 | ||
|
|
0bd40bae6e | ||
|
|
246ccf09b9 | ||
|
|
9452f416bf | ||
|
|
1e0e6ee573 | ||
|
|
be0e53c07b | ||
|
|
9dd58196e3 | ||
|
|
66b4999765 | ||
|
|
403e201e1a | ||
|
|
77a55fbe5c | ||
|
|
90c1608d88 | ||
|
|
7a51640262 | ||
|
|
13946e7db7 | ||
|
|
e009c002ba | ||
|
|
d24e0cc6cc | ||
|
|
5b8131e2d3 | ||
|
|
8fc25cc567 | ||
|
|
77ebb95d3d | ||
|
|
f142b1c22f | ||
|
|
1c9159d6a0 | ||
|
|
82e15dc6dc | ||
|
|
ee68f9298b | ||
|
|
5c6ec78789 | ||
|
|
4ac0d3ad40 | ||
|
|
c7209ef231 | ||
|
|
0249c16b04 | ||
|
|
f43d34899d | ||
|
|
19daefd04e | ||
|
|
ec5e984ed9 | ||
|
|
88de3cfecc | ||
|
|
a654f41ddb | ||
|
|
fbf2462325 | ||
|
|
85e4831198 | ||
|
|
091dc29f72 | ||
|
|
59d1986660 | ||
|
|
db4fa48f66 | ||
|
|
f2b83ece10 | ||
|
|
860b52273e | ||
|
|
bafceb56fb | ||
|
|
9271b3662a | ||
|
|
554013ca9f | ||
|
|
3250fdc2ca | ||
|
|
3678d34b16 | ||
|
|
16276853a1 | ||
|
|
f10c24e404 | ||
|
|
6f5fd72738 | ||
|
|
103a491ac0 | ||
|
|
929f90344e | ||
|
|
a963052d64 | ||
|
|
898613e14f | ||
|
|
b84e63d503 | ||
|
|
63870d2830 | ||
|
|
54e46f5984 | ||
|
|
0096eca7fe | ||
|
|
ce3acbd30a | ||
|
|
c5ae5524ff | ||
|
|
fbf5a8123b | ||
|
|
edbd6ad584 | ||
|
|
faf11c4a46 | ||
|
|
68a9e5f963 | ||
|
|
fa7f0ef44f | ||
|
|
bcfe7afbfd | ||
|
|
46e6e8984d | ||
|
|
0f057bd440 | ||
|
|
ba91a76f5f | ||
|
|
c09e005cc8 | ||
|
|
2c42629c51 | ||
|
|
f93e5a39e5 | ||
|
|
02eafe94b3 | ||
|
|
7d914768bb | ||
|
|
db6541b24c | ||
|
|
228566c0a1 | ||
|
|
1e4bcf3367 | ||
|
|
51e7d26053 | ||
|
|
e42627d2cb | ||
|
|
548d4eed95 | ||
|
|
8a5034d289 | ||
|
|
5a68641f27 | ||
|
|
ce28584dda | ||
|
|
ab870dd691 | ||
|
|
aed0126102 | ||
|
|
d0db1bf9b3 | ||
|
|
90ba606633 | ||
|
|
5b80cb8b6b | ||
|
|
e6ca604d24 | ||
|
|
9940b7f853 | ||
|
|
faca9276e9 | ||
|
|
5a7e463ef6 | ||
|
|
27c5a2825a | ||
|
|
e9d939ff2d | ||
|
|
88e8eaa575 | ||
|
|
3bbcf89105 | ||
|
|
1794bdc663 | ||
|
|
bcf97ebf1f | ||
|
|
a1496547fd | ||
|
|
0befa06cd0 | ||
|
|
407b8c179b | ||
|
|
aafee25d58 | ||
|
|
adb602dbfe | ||
|
|
085b6bede8 | ||
|
|
096aab592b | ||
|
|
2f117982e9 | ||
|
|
b05603eb6c | ||
|
|
9344b0b3a8 | ||
|
|
89ea1171db | ||
|
|
28968caf33 | ||
|
|
16fd1c2352 | ||
|
|
b942f61272 | ||
|
|
e3d1badfcf | ||
|
|
76f6a9e597 | ||
|
|
69dd1d2544 | ||
|
|
dd65ac56ef | ||
|
|
c796d84fca | ||
|
|
525db875b0 | ||
|
|
e73038cbcb | ||
|
|
00a8edb4a0 | ||
|
|
ee7e0d05f5 | ||
|
|
6357dc8a91 | ||
|
|
5bd95b3ce1 | ||
|
|
be06983c80 | ||
|
|
55bdc1fa16 | ||
|
|
a634c22ae0 | ||
|
|
859ee23d2e | ||
|
|
b7671dafc8 | ||
|
|
541484d142 | ||
|
|
f531ca3b48 | ||
|
|
0da7264e75 | ||
|
|
7f3bcdb4cc | ||
|
|
5eaa51eeff | ||
|
|
7b64b890d7 | ||
|
|
ccc201ea5f | ||
|
|
e6578857cf | ||
|
|
320c22f1f5 | ||
|
|
e2af5890f3 | ||
|
|
36b1c0898c | ||
|
|
94441dcbee | ||
|
|
c723cdf808 | ||
|
|
c2ee0d9c84 | ||
|
|
e8780f1ec6 | ||
|
|
783fd73ea1 | ||
|
|
74eb293733 | ||
|
|
42ea4d257b | ||
|
|
a849edf19a | ||
|
|
0cbd59856c | ||
|
|
698ba57597 | ||
|
|
27ce6a85e9 | ||
|
|
ae290ab374 | ||
|
|
ab602c9d14 | ||
|
|
2e53af1b75 | ||
|
|
a725e065d9 | ||
|
|
db7e23b423 | ||
|
|
dc8493535d | ||
|
|
10a395ca33 | ||
|
|
522c7ade91 | ||
|
|
a3d6099892 | ||
|
|
280028290e | ||
|
|
c195139d31 | ||
|
|
6f1b03415c | ||
|
|
ffcb015581 | ||
|
|
67a2ac292b | ||
|
|
6674b2a70c | ||
|
|
c855d6bb9a | ||
|
|
1086528ab7 | ||
|
|
c26dd6b76f | ||
|
|
d3b6f75848 | ||
|
|
d1efdcd78e | ||
|
|
95ab5adda1 | ||
|
|
c5eb36fe9d | ||
|
|
e3e3a8a695 | ||
|
|
24ebf95f33 | ||
|
|
54465c92cc | ||
|
|
f7c4b3a922 | ||
|
|
50dfa64a54 | ||
|
|
c6b8ffbb61 | ||
|
|
3e81dcdfc2 | ||
|
|
782b740c95 | ||
|
|
3fd6fa6f86 | ||
|
|
6a201f7962 | ||
|
|
80a864c52c | ||
|
|
c8eea49909 | ||
|
|
95c354fe81 | ||
|
|
6935f82389 | ||
|
|
719bb18316 | ||
|
|
a8a7701f60 | ||
|
|
2924ebc124 | ||
|
|
f587a5f4f0 | ||
|
|
946b4f4b86 | ||
|
|
d0a5e86da1 | ||
|
|
2e0b19f63f | ||
|
|
9861f3d435 | ||
|
|
482a6e9840 | ||
|
|
6a8700d86c | ||
|
|
1733b24f9d | ||
|
|
c85055bb03 | ||
|
|
280f05b174 | ||
|
|
990b0f1c15 | ||
|
|
6f76a6db66 | ||
|
|
0c2834edb7 | ||
|
|
f1ba45723c | ||
|
|
b523eef294 | ||
|
|
bf30b2831b | ||
|
|
642cd3bebf | ||
|
|
057dd6c590 | ||
|
|
0bd7db9efe | ||
|
|
f678c97346 | ||
|
|
887e81188f | ||
|
|
8d0140aabe | ||
|
|
2a8f275a28 | ||
|
|
55c3150946 | ||
|
|
b56e16acd0 | ||
|
|
b75186533d | ||
|
|
8958efba60 | ||
|
|
a9707a5728 | ||
|
|
7635feb591 | ||
|
|
087c2917aa | ||
|
|
deddedd88f | ||
|
|
b38294f236 | ||
|
|
fdb9872cef | ||
|
|
f8dd5d5088 | ||
|
|
9e0207e534 | ||
|
|
9eae789cd2 | ||
|
|
d6104935d7 | ||
|
|
406af5916c | ||
|
|
93e4e4f4fb | ||
|
|
8a05de537f | ||
|
|
8a92687d9a | ||
|
|
3432e7edcd | ||
|
|
3c6c17abcd | ||
|
|
11d237c252 | ||
|
|
0f7b6ec5ac | ||
|
|
b4526c4e6e | ||
|
|
3eaaa0f286 | ||
|
|
b1c8071163 | ||
|
|
3468108d4c | ||
|
|
33c8dd4ee5 | ||
|
|
5e2c4caa32 | ||
|
|
7c989ca487 | ||
|
|
e9a2982ecd | ||
|
|
f5a55a81f7 | ||
|
|
340f2c80a0 | ||
|
|
bb144436c7 | ||
|
|
b50d3ba805 | ||
|
|
00e7158381 | ||
|
|
221bef48c0 | ||
|
|
afcc1ba706 | ||
|
|
bf88a62a16 | ||
|
|
cc140744d6 | ||
|
|
354e8ffb82 | ||
|
|
e1c828be3e | ||
|
|
d50dc9f649 | ||
|
|
07695b3622 | ||
|
|
be15a9261a | ||
|
|
1fa2313aef | ||
|
|
26e266a951 | ||
|
|
208edaa3d1 | ||
|
|
f6a258b4a8 | ||
|
|
db08581352 | ||
|
|
0afeb68e6c | ||
|
|
a809c9ac5f | ||
|
|
45e9f35654 | ||
|
|
edd5c8b44d | ||
|
|
7238a3ee89 | ||
|
|
bbcab800c9 | ||
|
|
5564c78e53 | ||
|
|
792b81725e | ||
|
|
b101efe26e | ||
|
|
becc34a159 | ||
|
|
1273c6f3d4 | ||
|
|
82458d4de0 | ||
|
|
7066cc17bb | ||
|
|
12ed2f65e3 | ||
|
|
90bc187355 | ||
|
|
5ecaaea90b | ||
|
|
f9fc8674eb | ||
|
|
039e81b04b | ||
|
|
efb4315a1e | ||
|
|
f53d33ba34 | ||
|
|
9b776dc7ab | ||
|
|
1d64a1dcbb | ||
|
|
7c92994f10 | ||
|
|
bf97cc7efa | ||
|
|
4f5e9e939b | ||
|
|
92ad35848a | ||
|
|
bb69b20aff | ||
|
|
80e93621e1 | ||
|
|
31ff506309 | ||
|
|
4a51ddf741 | ||
|
|
3d1dc636d0 | ||
|
|
8609ba28d0 | ||
|
|
685f5ebbd1 | ||
|
|
4e2f8145f5 | ||
|
|
11b63d3417 | ||
|
|
2c81bc35dc | ||
|
|
b8ce1b4e69 | ||
|
|
23c2717ab2 | ||
|
|
132afbe83b | ||
|
|
ef52d15edd | ||
|
|
6df2f9e5ba | ||
|
|
eb9be4e884 | ||
|
|
0674f32d79 | ||
|
|
49cae0904f | ||
|
|
40685a0e61 | ||
|
|
4772a4986b | ||
|
|
c973a1f875 | ||
|
|
50d066befb | ||
|
|
c35e48291d | ||
|
|
511278b66a | ||
|
|
514a11346d | ||
|
|
2eb75bb941 | ||
|
|
9922ce97bf | ||
|
|
3ed4127297 | ||
|
|
c83e608cce | ||
|
|
3e2ae15882 | ||
|
|
3047702ded | ||
|
|
05cae4911d | ||
|
|
8c34eaad15 | ||
|
|
0492eabff1 | ||
|
|
7797e084f9 | ||
|
|
b40aa66985 | ||
|
|
76c06c5f2a | ||
|
|
83538c745a | ||
|
|
f266741f40 | ||
|
|
4795a5c5d1 | ||
|
|
c14cb62cd7 | ||
|
|
b3ec01521e | ||
|
|
6483df5ee4 | ||
|
|
6275d69a36 | ||
|
|
6300c8df56 | ||
|
|
366bf4eb0c | ||
|
|
21b358c742 | ||
|
|
7a0303f7ae | ||
|
|
64165ea4c8 | ||
|
|
c8fc789393 | ||
|
|
f145e1de0f | ||
|
|
36dee7d892 | ||
|
|
98ae30b513 | ||
|
|
073edd914d | ||
|
|
316b520ffb | ||
|
|
25e459659a | ||
|
|
fdebb022e4 | ||
|
|
ed1739acbd | ||
|
|
1f81919d4a | ||
|
|
436b5dc20c | ||
|
|
0c867b21ff | ||
|
|
4cacb622eb | ||
|
|
24acb09a2a | ||
|
|
ec45cdba84 | ||
|
|
4ca134a41c | ||
|
|
b85eae2aea | ||
|
|
aee58a8c17 | ||
|
|
22f3e21266 | ||
|
|
d0de1ed2e4 | ||
|
|
807fcf07d9 | ||
|
|
f5faff9020 | ||
|
|
769a52df16 | ||
|
|
dfb94290ae | ||
|
|
f366a636e6 | ||
|
|
a7c2f28f06 | ||
|
|
79e198451c | ||
|
|
844c959912 | ||
|
|
19ec8f4a77 | ||
|
|
f5aeda359c | ||
|
|
5a5687a506 | ||
|
|
7e9bfa51e9 | ||
|
|
c7d60279f7 | ||
|
|
7d49c65dd0 | ||
|
|
32dfbad414 | ||
|
|
abd44ca7c5 | ||
|
|
44f4ff9d37 | ||
|
|
658bee17e9 | ||
|
|
524ce01423 | ||
|
|
41f59ffc78 | ||
|
|
d7f52fd7e5 | ||
|
|
1f9db97d33 | ||
|
|
f806d8818d | ||
|
|
1a538509d0 | ||
|
|
b2d00b2a86 | ||
|
|
31f6093513 | ||
|
|
b9bddeff39 | ||
|
|
54c2f622a4 | ||
|
|
d55b56edd3 | ||
|
|
8d6fdb7a3e | ||
|
|
dceaae33ed | ||
|
|
e8995b85b8 | ||
|
|
925a3cfad7 | ||
|
|
c99a44b122 | ||
|
|
439d3107f9 | ||
|
|
afc593676a | ||
|
|
17d7af6ccc | ||
|
|
0b982d3316 | ||
|
|
26da14f315 | ||
|
|
2de7e03698 | ||
|
|
3d2fbed55f | ||
|
|
0e445ec0f5 | ||
|
|
31055d88a5 | ||
|
|
0d125725bc | ||
|
|
8b09b5b3cd | ||
|
|
2d8a699515 | ||
|
|
0d95507909 | ||
|
|
8e722d8fee | ||
|
|
03292d10cc | ||
|
|
cfc9e8b2fa | ||
|
|
f382696ccf | ||
|
|
e8fcc7e74c | ||
|
|
2bd9c9247c | ||
|
|
fc235317fe | ||
|
|
82d9163955 | ||
|
|
4a354befe5 | ||
|
|
212936eb52 | ||
|
|
05afedd950 | ||
|
|
a36c01372d | ||
|
|
9b48da5b4e | ||
|
|
c93f79f0f3 | ||
|
|
89a5152f7d | ||
|
|
47bd9cdf2f | ||
|
|
84255f4f4f | ||
|
|
668a36a652 | ||
|
|
30ff7413be | ||
|
|
af1cc0717b | ||
|
|
5e3365d233 | ||
|
|
4f780a01f9 | ||
|
|
dc6a832cc3 | ||
|
|
164ba823e5 | ||
|
|
8dd7fe82ff | ||
|
|
6c1032548b | ||
|
|
f0eeb16b33 | ||
|
|
c88b0d20e8 | ||
|
|
fbecae7362 | ||
|
|
38ba5fbceb | ||
|
|
d47758a540 | ||
|
|
dac18e3bf8 | ||
|
|
c4f44c7bcb | ||
|
|
73ad3d418d | ||
|
|
36276c41b2 | ||
|
|
d40f566e41 | ||
|
|
cd9b526203 | ||
|
|
caabc4ec44 | ||
|
|
73e7a2bea8 | ||
|
|
e463587bad | ||
|
|
e571b6a656 | ||
|
|
710499cf46 | ||
|
|
32a5c2c1f6 | ||
|
|
91dcb958e0 | ||
|
|
9a5b9253c4 | ||
|
|
215af5c60a | ||
|
|
8734c2466c | ||
|
|
0556687584 | ||
|
|
094e80f4a4 | ||
|
|
c13a0953c8 | ||
|
|
9f1f174c99 | ||
|
|
7e0a4c66e7 | ||
|
|
62b1056860 | ||
|
|
a3181dbead | ||
|
|
02c02283cf | ||
|
|
4d93da9f68 | ||
|
|
4a6086a14b | ||
|
|
0a34a2d5d8 | ||
|
|
a394b675b0 | ||
|
|
04846b10bc | ||
|
|
f9501e97a2 | ||
|
|
3ef788765a | ||
|
|
8e16931949 | ||
|
|
2267aca296 | ||
|
|
c70bc7ed0b | ||
|
|
8e3b81c5ec | ||
|
|
30975f7116 | ||
|
|
0ef463d56a | ||
|
|
5132f5bfe6 | ||
|
|
80457018d7 | ||
|
|
b0997d05fb | ||
|
|
3add2f0acb | ||
|
|
166d1811a1 | ||
|
|
e1fc455079 | ||
|
|
98237bf942 | ||
|
|
75f21f23ff | ||
|
|
9885aeac3b | ||
|
|
85c87b9ab9 | ||
|
|
51cd78e16c | ||
|
|
e6a40af06d | ||
|
|
3fcbb4ac25 | ||
|
|
7d71bad4eb | ||
|
|
dbdfed6343 | ||
|
|
5e48c1fadc | ||
|
|
deb6dd7f72 | ||
|
|
c265673c8e | ||
|
|
0fceeb20f1 | ||
|
|
c5897e0d62 | ||
|
|
8d13f22c50 | ||
|
|
1815536534 | ||
|
|
9267c25aa0 | ||
|
|
281cbbdf2e | ||
|
|
5996d671a0 | ||
|
|
ef9b974bcd | ||
|
|
7e66b73ce0 | ||
|
|
505a2097ad | ||
|
|
07380878fb | ||
|
|
3b29ae3c99 | ||
|
|
e5617b5fd1 | ||
|
|
11f23ae663 | ||
|
|
2828003d60 | ||
|
|
16cef3b4c6 | ||
|
|
699f39e3cf | ||
|
|
33b6a7381b | ||
|
|
190673b24a | ||
|
|
b7b03dbd4a | ||
|
|
56009dd16e | ||
|
|
b56bde3f61 | ||
|
|
b1ed74eb43 | ||
|
|
d8f0e7cbd1 | ||
|
|
5e721afb5d | ||
|
|
149c01a86a | ||
|
|
51322a1055 | ||
|
|
c5bc802ff0 | ||
|
|
6b88d3b5d0 | ||
|
|
ecc1f92787 | ||
|
|
d4f76fbe26 | ||
|
|
1dd72693f9 | ||
|
|
fe1013e779 | ||
|
|
84ca5172f0 | ||
|
|
7c49255c2a | ||
|
|
a5a9c42185 | ||
|
|
5f8a6cea6f | ||
|
|
50212805aa | ||
|
|
cd7feb0148 | ||
|
|
974f2f78a9 | ||
|
|
250b36eeb1 | ||
|
|
6f72164bbe | ||
|
|
ba8d960c8f | ||
|
|
84421a7c68 | ||
|
|
5c7325f44a | ||
|
|
c45b498a8b | ||
|
|
a4261dcc9c | ||
|
|
d1ecdf7441 | ||
|
|
088ca033f8 | ||
|
|
5b7dd32c20 | ||
|
|
eb94395f3d | ||
|
|
22f5fc5739 | ||
|
|
e994cacbfe | ||
|
|
3114d41cb7 | ||
|
|
968b2ece43 | ||
|
|
feed54caef | ||
|
|
4eddcb344e | ||
|
|
2ae06a7a01 | ||
|
|
25945718a1 | ||
|
|
254188f38f | ||
|
|
3601c39177 | ||
|
|
02f7bb0d4c | ||
|
|
565d72ef36 | ||
|
|
3806623c23 | ||
|
|
0fa12839a5 | ||
|
|
a257a613d7 | ||
|
|
0a752b9fab | ||
|
|
eeec0d63c2 | ||
|
|
04d6b5da2f | ||
|
|
1dfd3b8aa3 | ||
|
|
0873821b98 | ||
|
|
0a9cbd47c7 | ||
|
|
b61027b48d | ||
|
|
53701891a1 | ||
|
|
68b462d057 | ||
|
|
649f789190 | ||
|
|
7b3e319398 | ||
|
|
5494c1858e | ||
|
|
c5763e59d5 | ||
|
|
b090c73bd4 | ||
|
|
2b9a408ccc | ||
|
|
83c35bd6b5 | ||
|
|
98b012a04e | ||
|
|
a9af896ddd | ||
|
|
309dca8179 | ||
|
|
8144cd24d6 | ||
|
|
0ce8191be5 | ||
|
|
595f2582fa | ||
|
|
da83bd8265 | ||
|
|
799cc37c22 | ||
|
|
35ba817128 | ||
|
|
29a61950dd | ||
|
|
acd39eaab5 | ||
|
|
3d55b54f3d | ||
|
|
daae3500dd | ||
|
|
64fe9ec048 | ||
|
|
cb80a70aca | ||
|
|
24398d2b9d | ||
|
|
d4a2d70089 | ||
|
|
9add72e9d6 | ||
|
|
e7fc908ff1 | ||
|
|
4ffca0f4b4 | ||
|
|
a0f3e94655 | ||
|
|
6485a6cdc0 | ||
|
|
931f5cdd33 | ||
|
|
3975d76f23 | ||
|
|
bf6602bc1b | ||
|
|
a85ffc66ae | ||
|
|
828267aaa3 | ||
|
|
a77c615909 | ||
|
|
cfdf4c92f7 | ||
|
|
0f9fb37c78 | ||
|
|
673bce936e | ||
|
|
1f83635267 | ||
|
|
2d7e1b5804 | ||
|
|
085cf36199 | ||
|
|
ceb4a3ecc0 | ||
|
|
cf7795ce64 | ||
|
|
223dc78acb | ||
|
|
f63cd12569 | ||
|
|
65afeba19a | ||
|
|
791f73e0db | ||
|
|
8ded453ab0 | ||
|
|
e443454c4b | ||
|
|
1dd9a58e5a | ||
|
|
b628bcee27 | ||
|
|
dfc0cbf3a8 | ||
|
|
512a92895f | ||
|
|
6ab425f130 | ||
|
|
f5b9ee53a3 | ||
|
|
ea073f58cf | ||
|
|
bef5c4acb8 | ||
|
|
b5b3c0eaf8 | ||
|
|
1fb80bf0e2 | ||
|
|
436332d5f2 | ||
|
|
fe8c12c798 | ||
|
|
1cc59010f5 | ||
|
|
878c1cd936 | ||
|
|
5170c4898a | ||
|
|
2054e3c026 | ||
|
|
ffbe05af9b | ||
|
|
84f95a09d7 | ||
|
|
573410afab | ||
|
|
619939ccd9 | ||
|
|
714a5d1dc4 | ||
|
|
bc42dbdf87 | ||
|
|
765b5437bd | ||
|
|
5d7b38cabf | ||
|
|
debf1fce54 | ||
|
|
0045f2fb61 | ||
|
|
5764b55aee | ||
|
|
5e3a41dbd2 | ||
|
|
88d0f24ce7 | ||
|
|
eb6e3ba8b3 | ||
|
|
528c301891 | ||
|
|
f7ae0cb78f | ||
|
|
3695ba5882 | ||
|
|
4c95d2cfdc | ||
|
|
cc6a8b6e15 | ||
|
|
51d8e6aa28 | ||
|
|
f0600c1d5f | ||
|
|
90da66261a | ||
|
|
82c2dafb23 | ||
|
|
bfdd26c541 | ||
|
|
e699f6d1bd | ||
|
|
fae65ebc61 | ||
|
|
f744c3534d | ||
|
|
9ce40761c8 | ||
|
|
48924009fe | ||
|
|
d497fb6966 | ||
|
|
5bc7f150f8 | ||
|
|
a6eda344a4 | ||
|
|
1aa52e5e1e | ||
|
|
769f06cea2 | ||
|
|
8d90588020 | ||
|
|
9cf63c99cf | ||
|
|
4a0f77650b | ||
|
|
b53679a24d | ||
|
|
b06845c545 | ||
|
|
c55b6ee544 | ||
|
|
045f545085 | ||
|
|
038b63f7f7 | ||
|
|
d3f4c816c7 | ||
|
|
72aa6be38d | ||
|
|
444a268ce0 | ||
|
|
17a38faa43 | ||
|
|
24385ff56e | ||
|
|
f51bc8e9b9 | ||
|
|
6f5bf45212 | ||
|
|
3af8f53097 | ||
|
|
6c6b0e2395 | ||
|
|
26351522c5 | ||
|
|
dec2e4788e | ||
|
|
f9cd736b33 | ||
|
|
553dd00741 | ||
|
|
88634dac3a | ||
|
|
83924d0864 | ||
|
|
22bde5b277 | ||
|
|
cdbdf74811 | ||
|
|
db16702263 | ||
|
|
5dd137d53e | ||
|
|
8de06bd453 | ||
|
|
a7e64afc0d | ||
|
|
ed09887d9e | ||
|
|
d097d40237 | ||
|
|
196bbbd25b | ||
|
|
93e62c6f18 | ||
|
|
3acf03986a | ||
|
|
12a904eb4b | ||
|
|
7f06ec98b8 | ||
|
|
d62264c837 | ||
|
|
b2a67d458c | ||
|
|
de88fb2022 | ||
|
|
71263b5090 | ||
|
|
3fd1e4a992 | ||
|
|
9f752b8306 | ||
|
|
e07ae7631c | ||
|
|
9fd941f6fc | ||
|
|
91c458bf74 | ||
|
|
374b1144de | ||
|
|
f05b0871e9 | ||
|
|
4cb8fe3210 | ||
|
|
08eb5b42eb | ||
|
|
1c703e4161 | ||
|
|
ebd3723a06 | ||
|
|
06b23edb39 | ||
|
|
e893be3dec | ||
|
|
ca14942c80 | ||
|
|
11d01fcd32 | ||
|
|
5061607e77 | ||
|
|
69d8fe5b4f | ||
|
|
916efa4e1a | ||
|
|
a3492d69dd | ||
|
|
8e24c51233 | ||
|
|
d8107f77aa | ||
|
|
79e950b710 | ||
|
|
f0d7f3f1bd | ||
|
|
9afec53c55 | ||
|
|
11098d6eb0 | ||
|
|
7e6fc15ece | ||
|
|
78c0995853 | ||
|
|
84c14e623d | ||
|
|
d965d703d1 | ||
|
|
b20921d836 | ||
|
|
a78493f549 | ||
|
|
2be0aa9dbc | ||
|
|
aa29c68189 | ||
|
|
d3da30e8fb | ||
|
|
3337b5d3c4 | ||
|
|
458448357c | ||
|
|
27d0909302 | ||
|
|
5f0ebb71b2 | ||
|
|
00f647dc92 | ||
|
|
8e7202bd6a | ||
|
|
5cf7c827b8 | ||
|
|
71f7f4f543 | ||
|
|
bf47dba1c4 | ||
|
|
cbd457e557 | ||
|
|
6cf4b81558 | ||
|
|
bb84d351f1 | ||
|
|
a107e3cc84 | ||
|
|
e934966b54 | ||
|
|
bd9f23f1d2 | ||
|
|
2a2fb74ba8 | ||
|
|
bd819a5e81 | ||
|
|
162629571d | ||
|
|
2c04ad3c29 | ||
|
|
238d3807e9 | ||
|
|
7f9d227725 | ||
|
|
8de6e5a627 | ||
|
|
8d735cf6a9 | ||
|
|
29bb845f0e | ||
|
|
1bb2d59e38 | ||
|
|
3ceb2ad3cf | ||
|
|
009c803c8a | ||
|
|
c0ef1ec6fd | ||
|
|
69c2e8ce7e | ||
|
|
f102406cd7 | ||
|
|
302619a11a | ||
|
|
80bcae44e2 | ||
|
|
1f263a7683 | ||
|
|
3b57075109 | ||
|
|
3fa7304e94 | ||
|
|
47950b82a0 | ||
|
|
9ecf7070af | ||
|
|
2310773798 | ||
|
|
a60e3b5030 | ||
|
|
b350b443d0 | ||
|
|
2c517e4a33 | ||
|
|
4bdd59b4ad | ||
|
|
f5daf33322 | ||
|
|
1058a91b39 | ||
|
|
240b8f273a | ||
|
|
6808523d34 | ||
|
|
bad6184ab5 | ||
|
|
6b384287f3 | ||
|
|
ef33cf12ca | ||
|
|
a5cbbb8b5a | ||
|
|
71924fb7c0 | ||
|
|
b0565015cc | ||
|
|
fa283c6ecd | ||
|
|
94d157d97a | ||
|
|
f72f3dbc6a | ||
|
|
3c3a180417 | ||
|
|
fd6c854a21 | ||
|
|
e9cddc0be5 | ||
|
|
d7e5f11b78 | ||
|
|
2b1b6d8c2a | ||
|
|
acc2fa5816 | ||
|
|
6285f31604 | ||
|
|
3cca831b2e | ||
|
|
cff6fea32a | ||
|
|
17e1872544 | ||
|
|
246302375d | ||
|
|
231da4ff80 | ||
|
|
1b4b469440 | ||
|
|
35e3762e37 | ||
|
|
7e732dbd2d | ||
|
|
8b4d4ec25f | ||
|
|
035d0aeb31 | ||
|
|
f1bc181c5b | ||
|
|
50b724ca23 | ||
|
|
6227821b4e | ||
|
|
810056c2bc | ||
|
|
34b3e3a095 | ||
|
|
bdd085e9f1 | ||
|
|
ffc3503e6f | ||
|
|
51b16ad57d | ||
|
|
723592d923 | ||
|
|
22aa17091b | ||
|
|
4720a7d807 | ||
|
|
d5323223f4 | ||
|
|
fe79177b40 | ||
|
|
5c32ae15c2 | ||
|
|
6c2334f505 | ||
|
|
b55ac2afd6 | ||
|
|
d9012b4a64 | ||
|
|
952f124238 | ||
|
|
14db71d3fa | ||
|
|
f59ffcaeae | ||
|
|
d609e4a986 | ||
|
|
0e6c72ad1d | ||
|
|
d5f42201c5 | ||
|
|
122a0944a6 | ||
|
|
fa26ecc8f9 | ||
|
|
00139648a0 | ||
|
|
6ba38e9a38 | ||
|
|
812cb0ba77 | ||
|
|
b5c397435c | ||
|
|
043424824c | ||
|
|
c88c48a29f | ||
|
|
2fa93b291a | ||
|
|
1ad4d1aafd | ||
|
|
b108966b12 | ||
|
|
1fe8deeb6e | ||
|
|
fa4570bde8 | ||
|
|
f6c2787d80 | ||
|
|
4b8b625b90 | ||
|
|
be00d91967 | ||
|
|
e4a9905d6f | ||
|
|
68ec29e7ec | ||
|
|
d860ce0570 | ||
|
|
fc9b27c533 | ||
|
|
d4a9b546c1 | ||
|
|
628fb0fb72 | ||
|
|
2de233fe8b | ||
|
|
d2834b61fb |
51
.github/ISSUE_TEMPLATE.md
vendored
51
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,12 +1,63 @@
|
||||
<!--
|
||||
NOTE: Not filling out the issue template needs a good reason, otherwise it may
|
||||
take a lot longer to find the problem! Please take the time to help us
|
||||
debugging the problem by collecting information, even if it seems irrelevant to
|
||||
you. Thanks!
|
||||
|
||||
If you have a question, the forum at https://discourse.restic.net is a better place.
|
||||
Please do not create issues for usage or documentation questions! We're using
|
||||
the GitHub issue tracker mainly for tracking bugs and feature requests.
|
||||
-->
|
||||
|
||||
## Output of `restic version`
|
||||
|
||||
|
||||
## How did you run restic exactly?
|
||||
|
||||
<!--
|
||||
This section should include at least:
|
||||
|
||||
* The complete command line and any environment variables you used to
|
||||
configure restic's backend access. Make sure to replace sensitive values!
|
||||
|
||||
* The output of the commands, what restic prints gives may give us much
|
||||
information to diagnose the problem!
|
||||
-->
|
||||
|
||||
|
||||
## What backend/server/service did you use to store the repository?
|
||||
|
||||
|
||||
## Expected behavior
|
||||
|
||||
<!--
|
||||
Describe what you'd like restic to do differently.
|
||||
-->
|
||||
|
||||
## Actual behavior
|
||||
|
||||
<!--
|
||||
In this section, please try to concentrate on observations, so only describe
|
||||
what you observed directly.
|
||||
-->
|
||||
|
||||
## Steps to reproduce the behavior
|
||||
|
||||
<!--
|
||||
The more time you spend describing an easy way to reproduce the behavior (if
|
||||
this is possible), the easier it is for the project developers to fix it!
|
||||
-->
|
||||
|
||||
|
||||
## Do you have any idea what may have caused this?
|
||||
|
||||
|
||||
## Do you have an idea how to solve the issue?
|
||||
|
||||
## Did restic help you or made you happy in any way?
|
||||
|
||||
<!--
|
||||
Answering this question is not required, but if you have anything positive to share, please do so here!
|
||||
Sometimes we get tired of reading bug reports all day and a little positive end note does wonders.
|
||||
Idea by Joey Hess, https://joeyh.name/blog/entry/two_holiday_stories/
|
||||
-->
|
||||
|
||||
31
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
31
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
<!--
|
||||
Thank you very much for contributing code or documentation to restic! Please
|
||||
fill out the following questions to make it easier for us to review your
|
||||
changes.
|
||||
|
||||
You do not need to check all the boxes below all at once, feel free to take
|
||||
your time and add more commits. If you're done and ready for review, please
|
||||
check the last box.
|
||||
-->
|
||||
|
||||
### What is the purpose of this change? What does it change?
|
||||
|
||||
<!--
|
||||
Describe the changes here, as detailed as needed.
|
||||
-->
|
||||
|
||||
### Was the change discussed in an issue or in the forum before?
|
||||
|
||||
<!--
|
||||
Link issues and relevant forum posts here.
|
||||
-->
|
||||
|
||||
### Checklist
|
||||
|
||||
- [ ] I have read the [Contribution Guidelines](https://github.com/restic/restic/blob/master/CONTRIBUTING.md#providing-patches)
|
||||
- [ ] I have added tests for all changes in this PR
|
||||
- [ ] I have added documentation for the changes (in the manual)
|
||||
- [ ] There's a new file in a subdir of `changelog/x.y.z` that describe the changes for our users (template [here](https://github.com/restic/restic/blob/master/changelog/changelog-entry.tmpl))
|
||||
- [ ] I have run `gofmt` on the code in all commits
|
||||
- [ ] All commit messages are formatted in the same style as [the other commits in the repo](https://github.com/restic/restic/blob/master/CONTRIBUTING.md#git-commits)
|
||||
- [ ] I'm done, this Pull Request is ready for review
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,5 +1,3 @@
|
||||
/pkg
|
||||
/bin
|
||||
/restic
|
||||
/.vagrant
|
||||
/vendor/pkg
|
||||
/doc/_build
|
||||
|
||||
31
.travis.yml
31
.travis.yml
@@ -2,23 +2,33 @@ language: go
|
||||
sudo: false
|
||||
|
||||
go:
|
||||
- 1.3.3
|
||||
- 1.4.3
|
||||
- 1.5.4
|
||||
- 1.6.2
|
||||
- 1.8.x
|
||||
- 1.9.x
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
env:
|
||||
matrix:
|
||||
RESTIC_TEST_FUSE=0
|
||||
|
||||
matrix:
|
||||
exclude:
|
||||
- os: osx
|
||||
go: 1.3.3
|
||||
- os: osx
|
||||
go: 1.4.3
|
||||
- os: osx
|
||||
go: 1.5.4
|
||||
go: 1.8.x
|
||||
- os: linux
|
||||
go: 1.9.x
|
||||
include:
|
||||
- os: linux
|
||||
go: 1.9.x
|
||||
sudo: true
|
||||
env:
|
||||
RESTIC_TEST_FUSE=1
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
notifications:
|
||||
irc:
|
||||
@@ -33,10 +43,9 @@ install:
|
||||
- export GOBIN="$GOPATH/bin"
|
||||
- export PATH="$PATH:$GOBIN"
|
||||
- go env
|
||||
- ulimit -n 2048
|
||||
|
||||
script:
|
||||
- go run run_integration_tests.go
|
||||
|
||||
after_success:
|
||||
- GOPATH=$PWD:$PWD/vendor goveralls -coverprofile=all.cov -service=travis-ci -repotoken "$COVERALLS_TOKEN"
|
||||
- bash <(curl -s https://codecov.io/bash) -f all.cov
|
||||
|
||||
700
CHANGELOG.md
Normal file
700
CHANGELOG.md
Normal file
@@ -0,0 +1,700 @@
|
||||
Changelog for restic 0.8.1 (2017-12-27)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.8.1 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Fix #1457: Improve s3 backend with DigitalOcean Spaces
|
||||
* Fix #1454: Correct cache dir location for Windows and Darwin
|
||||
* Fix #1459: Disable handling SIGPIPE
|
||||
* Chg #1452: Do not save atime by default
|
||||
* Enh #1436: Add code to detect old cache directories
|
||||
* Enh #1439: Improve cancellation logic
|
||||
* Enh #11: Add the `diff` command
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Bugfix #1457: Improve s3 backend with DigitalOcean Spaces
|
||||
|
||||
https://github.com/restic/restic/issues/1457
|
||||
https://github.com/restic/restic/pull/1459
|
||||
|
||||
* Bugfix #1454: Correct cache dir location for Windows and Darwin
|
||||
|
||||
The cache directory on Windows and Darwin was not correct, instead the directory `.cache` was
|
||||
used.
|
||||
|
||||
https://github.com/restic/restic/pull/1454
|
||||
|
||||
* Bugfix #1459: Disable handling SIGPIPE
|
||||
|
||||
We've disabled handling SIGPIPE again. Turns out, writing to broken TCP connections also
|
||||
raised SIGPIPE, so restic exits on the first write to a broken connection. Instead, restic
|
||||
should retry the request.
|
||||
|
||||
https://github.com/restic/restic/issues/1457
|
||||
https://github.com/restic/restic/issues/1466
|
||||
https://github.com/restic/restic/pull/1459
|
||||
|
||||
* Change #1452: Do not save atime by default
|
||||
|
||||
By default, the access time for files and dirs is not saved any more. It is not possible to
|
||||
reliably disable updating the access time during a backup, so for the next backup the access
|
||||
time is different again. This means a lot of metadata is saved. If you want to save the access time
|
||||
anyway, pass `--with-atime` to the `backup` command.
|
||||
|
||||
https://github.com/restic/restic/pull/1452
|
||||
|
||||
* Enhancement #1436: Add code to detect old cache directories
|
||||
|
||||
We've added code to detect old cache directories of repositories that haven't been used in a
|
||||
long time, restic now prints a note when it detects that such dirs exist. Also, the option
|
||||
`--cleanup-cache` was added to automatically remove such directories. That's not a problem
|
||||
because the cache will be rebuild once a repo is accessed again.
|
||||
|
||||
https://github.com/restic/restic/pull/1436
|
||||
|
||||
* Enhancement #1439: Improve cancellation logic
|
||||
|
||||
The cancellation logic was improved, restic can now shut down cleanly when requested to do so
|
||||
(e.g. via ctrl+c).
|
||||
|
||||
https://github.com/restic/restic/pull/1439
|
||||
|
||||
* Enhancement #11: Add the `diff` command
|
||||
|
||||
The command `diff` was added, it allows comparing two snapshots and listing all differences.
|
||||
|
||||
https://github.com/restic/restic/issues/11
|
||||
https://github.com/restic/restic/issues/1460
|
||||
https://github.com/restic/restic/pull/1462
|
||||
|
||||
|
||||
Changelog for restic 0.8.0 (2017-11-26)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.8.0 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Sec #1445: Prevent writing outside the target directory during restore
|
||||
* Fix #1256: Re-enable workaround for S3 backend
|
||||
* Fix #1291: Reuse backend TCP connections to BackBlaze B2
|
||||
* Fix #1317: Run prune when `forget --prune` is called with just snapshot IDs
|
||||
* Fix #1437: Remove implicit path `/restic` for the s3 backend
|
||||
* Enh #1102: Add subdirectory `ids` to fuse mount
|
||||
* Enh #1114: Add `--cacert` to specify TLS certificates to check against
|
||||
* Enh #1216: Add upload/download limiting
|
||||
* Enh #1271: Cache results for excludes for `backup`
|
||||
* Enh #1274: Add `generate` command, replaces `manpage` and `autocomplete`
|
||||
* Enh #1367: Allow comments in files read from via `--file-from`
|
||||
* Enh #448: Sftp backend prompts for password
|
||||
* Enh #510: Add `dump` command
|
||||
* Enh #1040: Add local metadata cache
|
||||
* Enh #1249: Add `latest` symlink in fuse mount
|
||||
* Enh #1269: Add `--compact` to `forget` command
|
||||
* Enh #1281: Google Cloud Storage backend needs less permissions
|
||||
* Enh #1319: Make `check` print `no errors found` explicitly
|
||||
* Enh #1353: Retry failed backend requests
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Security #1445: Prevent writing outside the target directory during restore
|
||||
|
||||
A vulnerability was found in the restic restorer, which allowed attackers in special
|
||||
circumstances to restore files to a location outside of the target directory. Due to the
|
||||
circumstances we estimate this to be a low-risk vulnerability, but urge all users to upgrade to
|
||||
the latest version of restic.
|
||||
|
||||
Exploiting the vulnerability requires a Linux/Unix system which saves backups via restic and
|
||||
a Windows systems which restores files from the repo. In addition, the attackers need to be able
|
||||
to create create files with arbitrary names which are then saved to the restic repo. For
|
||||
example, by creating a file named "..\test.txt" (which is a perfectly legal filename on Linux)
|
||||
and restoring a snapshot containing this file on Windows, it would be written to the parent of
|
||||
the target directory.
|
||||
|
||||
We'd like to thank Tyler Spivey for reporting this responsibly!
|
||||
|
||||
https://github.com/restic/restic/pull/1445
|
||||
|
||||
* Bugfix #1256: Re-enable workaround for S3 backend
|
||||
|
||||
We've re-enabled a workaround for `minio-go` (the library we're using to access s3 backends),
|
||||
this reduces memory usage.
|
||||
|
||||
https://github.com/restic/restic/issues/1256
|
||||
https://github.com/restic/restic/pull/1267
|
||||
|
||||
* Bugfix #1291: Reuse backend TCP connections to BackBlaze B2
|
||||
|
||||
A bug was discovered in the library we're using to access Backblaze, it now reuses already
|
||||
established TCP connections which should be a lot faster and not cause network failures any
|
||||
more.
|
||||
|
||||
https://github.com/restic/restic/issues/1291
|
||||
https://github.com/restic/restic/pull/1301
|
||||
|
||||
* Bugfix #1317: Run prune when `forget --prune` is called with just snapshot IDs
|
||||
|
||||
A bug in the `forget` command caused `prune` not to be run when `--prune` was specified without a
|
||||
policy, e.g. when only snapshot IDs that should be forgotten are listed manually.
|
||||
|
||||
https://github.com/restic/restic/pull/1317
|
||||
|
||||
* Bugfix #1437: Remove implicit path `/restic` for the s3 backend
|
||||
|
||||
The s3 backend used the subdir `restic` within a bucket if no explicit path after the bucket name
|
||||
was specified. Since this version, restic does not use this default path any more. If you
|
||||
created a repo on s3 in a bucket without specifying a path within the bucket, you need to add
|
||||
`/restic` at the end of the repository specification to access your repo:
|
||||
`s3:s3.amazonaws.com/bucket/restic`
|
||||
|
||||
https://github.com/restic/restic/issues/1292
|
||||
https://github.com/restic/restic/pull/1437
|
||||
|
||||
* Enhancement #1102: Add subdirectory `ids` to fuse mount
|
||||
|
||||
The fuse mount now has an `ids` subdirectory which contains the snapshots below their (short)
|
||||
IDs.
|
||||
|
||||
https://github.com/restic/restic/issues/1102
|
||||
https://github.com/restic/restic/pull/1299
|
||||
https://github.com/restic/restic/pull/1320
|
||||
|
||||
* Enhancement #1114: Add `--cacert` to specify TLS certificates to check against
|
||||
|
||||
We've added the `--cacert` option which can be used to pass one (or more) CA certificates to
|
||||
restic. These are used in addition to the system CA certificates to verify HTTPS certificates
|
||||
(e.g. for the REST backend).
|
||||
|
||||
https://github.com/restic/restic/issues/1114
|
||||
https://github.com/restic/restic/pull/1276
|
||||
|
||||
* Enhancement #1216: Add upload/download limiting
|
||||
|
||||
We've added support for rate limiting through `--limit-upload` and `--limit-download`
|
||||
flags.
|
||||
|
||||
https://github.com/restic/restic/issues/1216
|
||||
https://github.com/restic/restic/pull/1336
|
||||
https://github.com/restic/restic/pull/1358
|
||||
|
||||
* Enhancement #1271: Cache results for excludes for `backup`
|
||||
|
||||
The `backup` command now caches the result of excludes for a directory.
|
||||
|
||||
https://github.com/restic/restic/issues/1271
|
||||
https://github.com/restic/restic/pull/1326
|
||||
|
||||
* Enhancement #1274: Add `generate` command, replaces `manpage` and `autocomplete`
|
||||
|
||||
The `generate` command has been added, which replaces the now removed commands `manpage` and
|
||||
`autocomplete`. This release of restic contains the most recent manpages in `doc/man` and the
|
||||
auto-completion files for bash and zsh in `doc/bash-completion.sh` and
|
||||
`doc/zsh-completion.zsh`
|
||||
|
||||
https://github.com/restic/restic/issues/1274
|
||||
https://github.com/restic/restic/pull/1282
|
||||
|
||||
* Enhancement #1367: Allow comments in files read from via `--file-from`
|
||||
|
||||
When the list of files/dirs to be saved is read from a file with `--files-from`, comment lines
|
||||
(starting with `#`) are now ignored.
|
||||
|
||||
https://github.com/restic/restic/issues/1367
|
||||
https://github.com/restic/restic/pull/1368
|
||||
|
||||
* Enhancement #448: Sftp backend prompts for password
|
||||
|
||||
The sftp backend now prompts for the password if a password is necessary for login.
|
||||
|
||||
https://github.com/restic/restic/issues/448
|
||||
https://github.com/restic/restic/pull/1270
|
||||
|
||||
* Enhancement #510: Add `dump` command
|
||||
|
||||
We've added the `dump` command which prints a file from a snapshot to stdout. This can e.g. be
|
||||
used to restore files read with `backup --stdin`.
|
||||
|
||||
https://github.com/restic/restic/issues/510
|
||||
https://github.com/restic/restic/pull/1346
|
||||
|
||||
* Enhancement #1040: Add local metadata cache
|
||||
|
||||
We've added a local cache for metadata so that restic doesn't need to load all metadata
|
||||
(snapshots, indexes, ...) from the repo each time it starts. By default the cache is active, but
|
||||
there's a new global option `--no-cache` that can be used to disable the cache. By deafult, the
|
||||
cache a standard cache folder for the OS, which can be overridden with `--cache-dir`. The cache
|
||||
will automatically populate, indexes and snapshots are saved as they are loaded. Cache
|
||||
directories for repos that haven't been used recently can automatically be removed by restic
|
||||
with the `--cleanup-cache` option.
|
||||
|
||||
A related change was to by default create pack files in the repo that contain either data or
|
||||
metadata, not both mixed together. This allows easy caching of only the metadata files. The
|
||||
next run of `restic prune` will untangle mixed files automatically.
|
||||
|
||||
https://github.com/restic/restic/issues/29
|
||||
https://github.com/restic/restic/issues/738
|
||||
https://github.com/restic/restic/issues/282
|
||||
https://github.com/restic/restic/pull/1040
|
||||
https://github.com/restic/restic/pull/1287
|
||||
https://github.com/restic/restic/pull/1436
|
||||
https://github.com/restic/restic/pull/1265
|
||||
|
||||
* Enhancement #1249: Add `latest` symlink in fuse mount
|
||||
|
||||
The directory structure in the fuse mount now exposes a symlink `latest` which points to the
|
||||
latest snapshot in that particular directory.
|
||||
|
||||
https://github.com/restic/restic/pull/1249
|
||||
|
||||
* Enhancement #1269: Add `--compact` to `forget` command
|
||||
|
||||
The option `--compact` was added to the `forget` command to provide the same compact view as the
|
||||
`snapshots` command.
|
||||
|
||||
https://github.com/restic/restic/pull/1269
|
||||
|
||||
* Enhancement #1281: Google Cloud Storage backend needs less permissions
|
||||
|
||||
The Google Cloud Storage backend no longer requires the service account to have the
|
||||
`storage.buckets.get` permission ("Storage Admin" role) in `restic init` if the bucket
|
||||
already exists.
|
||||
|
||||
https://github.com/restic/restic/pull/1281
|
||||
|
||||
* Enhancement #1319: Make `check` print `no errors found` explicitly
|
||||
|
||||
The `check` command now explicetly prints `No errors were found` when no errors could be found.
|
||||
|
||||
https://github.com/restic/restic/issues/1303
|
||||
https://github.com/restic/restic/pull/1319
|
||||
|
||||
* Enhancement #1353: Retry failed backend requests
|
||||
|
||||
https://github.com/restic/restic/pull/1353
|
||||
|
||||
|
||||
Changelog for restic 0.7.3 (2017-09-20)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.7.3 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Fix #1246: List all files stored in Google Cloud Storage
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Bugfix #1246: List all files stored in Google Cloud Storage
|
||||
|
||||
For large backups stored in Google Cloud Storage, the `prune` command fails because listing
|
||||
only returns the first 1000 files. This has been corrected, no data is lost in the process. In
|
||||
addition, a plausibility check was added to `prune`.
|
||||
|
||||
https://github.com/restic/restic/issues/1246
|
||||
https://github.com/restic/restic/pull/1247
|
||||
|
||||
|
||||
Changelog for restic 0.7.2 (2017-09-13)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.7.2 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Fix #1167: Do not create a local repo unless `init` is used
|
||||
* Fix #1164: Make the `key remove` command behave as documented
|
||||
* Fix #1191: Make sure to write profiling files on interrupt
|
||||
* Enh #1132: Make `key` command always prompt for a password
|
||||
* Enh #1179: Resolve name conflicts, append a counter
|
||||
* Enh #1218: Add `--compact` to `snapshots` command
|
||||
* Enh #317: Add `--exclude-caches` and `--exclude-if-present`
|
||||
* Enh #697: Automatically generate man pages for all restic commands
|
||||
* Enh #1044: Improve `restore`, do not traverse/load excluded directories
|
||||
* Enh #1061: Add Dockerfile and official Docker image
|
||||
* Enh #1126: Use the standard Go git repository layout, use `dep` for vendoring
|
||||
* Enh #1134: Add support for storing backups on Google Cloud Storage
|
||||
* Enh #1144: Properly report errors when reading files with exclude patterns.
|
||||
* Enh #1149: Add support for storing backups on Microsoft Azure Blob Storage
|
||||
* Enh #1196: Add `--group-by` to `forget` command for flexible grouping
|
||||
* Enh #1203: Print stats on all BSD systems when SIGINFO (ctrl+t) is received
|
||||
* Enh #1205: Allow specifying time/date for a backup with `--time`
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Bugfix #1167: Do not create a local repo unless `init` is used
|
||||
|
||||
When a restic command other than `init` is used with a local repository and the repository
|
||||
directory does not exist, restic creates the directory structure. That's an error, only the
|
||||
`init` command should create the dir.
|
||||
|
||||
https://github.com/restic/restic/issues/1167
|
||||
https://github.com/restic/restic/pull/1182
|
||||
|
||||
* Bugfix #1164: Make the `key remove` command behave as documented
|
||||
|
||||
https://github.com/restic/restic/pull/1164
|
||||
|
||||
* Bugfix #1191: Make sure to write profiling files on interrupt
|
||||
|
||||
Since a few releases restic had the ability to write profiling files for memory and CPU usage
|
||||
when `debug` is enabled. It was discovered that when restic is interrupted (ctrl+c is
|
||||
pressed), the proper shutdown hook is not run. This is now corrected.
|
||||
|
||||
https://github.com/restic/restic/pull/1191
|
||||
|
||||
* Enhancement #1132: Make `key` command always prompt for a password
|
||||
|
||||
The `key` command now prompts for a password even if the original password to access a repo has
|
||||
been specified via the `RESTIC_PASSWORD` environment variable or a password file.
|
||||
|
||||
https://github.com/restic/restic/issues/1132
|
||||
https://github.com/restic/restic/pull/1133
|
||||
|
||||
* Enhancement #1179: Resolve name conflicts, append a counter
|
||||
|
||||
https://github.com/restic/restic/issues/1179
|
||||
https://github.com/restic/restic/pull/1209
|
||||
|
||||
* Enhancement #1218: Add `--compact` to `snapshots` command
|
||||
|
||||
The option `--compact` was added to the `snapshots` command to get a better overview of the
|
||||
snapshots in a repo. It limits each snapshot to a single line.
|
||||
|
||||
https://github.com/restic/restic/issues/1218
|
||||
https://github.com/restic/restic/pull/1223
|
||||
|
||||
* Enhancement #317: Add `--exclude-caches` and `--exclude-if-present`
|
||||
|
||||
A new option `--exclude-caches` was added that allows excluding cache directories (that are
|
||||
tagged as such). This is a special case of a more generic option `--exclude-if-present` which
|
||||
excludes a directory if a file with a specific name (and contents) is present.
|
||||
|
||||
https://github.com/restic/restic/issues/317
|
||||
https://github.com/restic/restic/pull/1170
|
||||
https://github.com/restic/restic/pull/1224
|
||||
|
||||
* Enhancement #697: Automatically generate man pages for all restic commands
|
||||
|
||||
https://github.com/restic/restic/issues/697
|
||||
https://github.com/restic/restic/pull/1147
|
||||
|
||||
* Enhancement #1044: Improve `restore`, do not traverse/load excluded directories
|
||||
|
||||
https://github.com/restic/restic/pull/1044
|
||||
|
||||
* Enhancement #1061: Add Dockerfile and official Docker image
|
||||
|
||||
https://github.com/restic/restic/pull/1061
|
||||
|
||||
* Enhancement #1126: Use the standard Go git repository layout, use `dep` for vendoring
|
||||
|
||||
The git repository layout was changed to resemble the layout typically used in Go projects,
|
||||
we're not using `gb` for building restic any more and vendoring the dependencies is now taken
|
||||
care of by `dep`.
|
||||
|
||||
https://github.com/restic/restic/pull/1126
|
||||
|
||||
* Enhancement #1134: Add support for storing backups on Google Cloud Storage
|
||||
|
||||
https://github.com/restic/restic/issues/211
|
||||
https://github.com/restic/restic/pull/1134
|
||||
https://github.com/restic/restic/pull/1052
|
||||
|
||||
* Enhancement #1144: Properly report errors when reading files with exclude patterns.
|
||||
|
||||
https://github.com/restic/restic/pull/1144
|
||||
|
||||
* Enhancement #1149: Add support for storing backups on Microsoft Azure Blob Storage
|
||||
|
||||
The library we're using to access the service requires Go 1.8, so restic now needs at least Go
|
||||
1.8.
|
||||
|
||||
https://github.com/restic/restic/issues/609
|
||||
https://github.com/restic/restic/pull/1149
|
||||
https://github.com/restic/restic/pull/1059
|
||||
|
||||
* Enhancement #1196: Add `--group-by` to `forget` command for flexible grouping
|
||||
|
||||
https://github.com/restic/restic/pull/1196
|
||||
|
||||
* Enhancement #1203: Print stats on all BSD systems when SIGINFO (ctrl+t) is received
|
||||
|
||||
https://github.com/restic/restic/pull/1203
|
||||
https://github.com/restic/restic/pull/1082
|
||||
|
||||
* Enhancement #1205: Allow specifying time/date for a backup with `--time`
|
||||
|
||||
https://github.com/restic/restic/pull/1205
|
||||
|
||||
|
||||
Changelog for restic 0.7.1 (2017-07-22)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.7.1 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Fix #1115: Fix `prune`, only include existing files in indexes
|
||||
* Enh #1055: Create subdirs below `data/` for local/sftp backends
|
||||
* Enh #1067: Allow loading credentials for s3 from IAM
|
||||
* Enh #1073: Add `migrate` cmd to migrate from `s3legacy` to `default` layout
|
||||
* Enh #1081: Clarify semantic for `--tasg` for the `forget` command
|
||||
* Enh #1080: Ignore chmod() errors on filesystems which do not support it
|
||||
* Enh #1082: Print stats on SIGINFO on Darwin and FreeBSD (ctrl+t)
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Bugfix #1115: Fix `prune`, only include existing files in indexes
|
||||
|
||||
A bug was found (and corrected) in the index rebuilding after prune, which led to indexes which
|
||||
include blobs that were not present in the repo any more. There were already checks in place
|
||||
which detected this situation and aborted with an error message. A new run of either `prune` or
|
||||
`rebuild-index` corrected the index files. This is now fixed and a test has been added to detect
|
||||
this.
|
||||
|
||||
https://github.com/restic/restic/pull/1115
|
||||
|
||||
* Enhancement #1055: Create subdirs below `data/` for local/sftp backends
|
||||
|
||||
The local and sftp backends now create the subdirs below `data/` on open/init. This way, restic
|
||||
makes sure that they always exist. This is connected to an issue for the sftp server:
|
||||
|
||||
https://github.com/restic/restic/issues/1055
|
||||
https://github.com/restic/restic/pull/1077
|
||||
https://github.com/restic/restic/pull/1105
|
||||
https://github.com/restic/rest-server/pull/11#issuecomment-309879710
|
||||
|
||||
* Enhancement #1067: Allow loading credentials for s3 from IAM
|
||||
|
||||
When no S3 credentials are specified in the environment variables, restic now tries to load
|
||||
credentials from an IAM instance profile when the s3 backend is used.
|
||||
|
||||
https://github.com/restic/restic/issues/1067
|
||||
https://github.com/restic/restic/pull/1086
|
||||
|
||||
* Enhancement #1073: Add `migrate` cmd to migrate from `s3legacy` to `default` layout
|
||||
|
||||
The `migrate` command for chaning the `s3legacy` layout to the `default` layout for s3
|
||||
backends has been improved: It can now be restarted with `restic migrate --force s3_layout`
|
||||
and automatically retries operations on error.
|
||||
|
||||
https://github.com/restic/restic/issues/1073
|
||||
https://github.com/restic/restic/pull/1075
|
||||
|
||||
* Enhancement #1081: Clarify semantic for `--tasg` for the `forget` command
|
||||
|
||||
https://github.com/restic/restic/issues/1081
|
||||
https://github.com/restic/restic/pull/1090
|
||||
|
||||
* Enhancement #1080: Ignore chmod() errors on filesystems which do not support it
|
||||
|
||||
https://github.com/restic/restic/pull/1080
|
||||
https://github.com/restic/restic/pull/1112
|
||||
|
||||
* Enhancement #1082: Print stats on SIGINFO on Darwin and FreeBSD (ctrl+t)
|
||||
|
||||
https://github.com/restic/restic/pull/1082
|
||||
|
||||
|
||||
Changelog for restic 0.7.0 (2017-07-01)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.7.0 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Fix #1013: Switch back to using the high-level minio-go API for s3
|
||||
* Fix #965: Switch to `default` repo layout for the s3 backend
|
||||
* Enh #1021: Detect invalid backend name and print error
|
||||
* Enh #1029: Remove invalid pack files when `prune` is run
|
||||
* Enh #512: Add Backblaze B2 backend
|
||||
* Enh #636: Add dirs `tags` and `hosts` to fuse mount
|
||||
* Enh #989: Improve performance of the `find` command
|
||||
* Enh #975: Add new backend for OpenStack Swift
|
||||
* Enh #998: Improve performance of the fuse mount
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Bugfix #1013: Switch back to using the high-level minio-go API for s3
|
||||
|
||||
For the s3 backend we're back to using the high-level API the s3 client library for uploading
|
||||
data, a few users reported dropped connections (which the library will automatically retry
|
||||
now).
|
||||
|
||||
https://github.com/restic/restic/issues/1013
|
||||
https://github.com/restic/restic/issues/1023
|
||||
https://github.com/restic/restic/pull/1025
|
||||
|
||||
* Bugfix #965: Switch to `default` repo layout for the s3 backend
|
||||
|
||||
The default layout for the s3 backend is now `default` (instead of `s3legacy`). Also, there's a
|
||||
new `migrate` command to convert an existing repo, it can be run like this: `restic migrate
|
||||
s3_layout`
|
||||
|
||||
https://github.com/restic/restic/issues/965
|
||||
https://github.com/restic/restic/pull/1004
|
||||
|
||||
* Enhancement #1021: Detect invalid backend name and print error
|
||||
|
||||
Restic now tries to detect when an invalid/unknown backend is used and returns an error
|
||||
message.
|
||||
|
||||
https://github.com/restic/restic/issues/1021
|
||||
https://github.com/restic/restic/pull/1070
|
||||
|
||||
* Enhancement #1029: Remove invalid pack files when `prune` is run
|
||||
|
||||
The `prune` command has been improved and will now remove invalid pack files, for example files
|
||||
that have not been uploaded completely because a backup was interrupted.
|
||||
|
||||
https://github.com/restic/restic/issues/1029
|
||||
https://github.com/restic/restic/pull/1036
|
||||
|
||||
* Enhancement #512: Add Backblaze B2 backend
|
||||
|
||||
https://github.com/restic/restic/issues/512
|
||||
https://github.com/restic/restic/pull/978
|
||||
|
||||
* Enhancement #636: Add dirs `tags` and `hosts` to fuse mount
|
||||
|
||||
The fuse mount now has two more directories: `tags` contains a subdir for each tag, which in turn
|
||||
contains only the snapshots that have this tag. The subdir `hosts` contains a subdir for each
|
||||
host that has a snapshot, and the subdir contains the snapshots for that host.
|
||||
|
||||
https://github.com/restic/restic/issues/636
|
||||
https://github.com/restic/restic/pull/1050
|
||||
|
||||
* Enhancement #989: Improve performance of the `find` command
|
||||
|
||||
Improved performance for the `find` command: Restic recognizes paths it has already checked
|
||||
for the files in question, so the number of backend requests is reduced a lot.
|
||||
|
||||
https://github.com/restic/restic/issues/989
|
||||
https://github.com/restic/restic/pull/993
|
||||
|
||||
* Enhancement #975: Add new backend for OpenStack Swift
|
||||
|
||||
https://github.com/restic/restic/pull/975
|
||||
https://github.com/restic/restic/pull/648
|
||||
|
||||
* Enhancement #998: Improve performance of the fuse mount
|
||||
|
||||
Listing directories which contain large files now is significantly faster.
|
||||
|
||||
https://github.com/restic/restic/pull/998
|
||||
|
||||
|
||||
Changelog for restic 0.6.1 (2017-06-01)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.6.1 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Enh #985: Allow multiple parallel idle HTTP connections
|
||||
* Enh #981: Remove temporary path from binary in `build.go`
|
||||
* Enh #974: Remove regular status reports
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Enhancement #985: Allow multiple parallel idle HTTP connections
|
||||
|
||||
Backends based on HTTP now allow several idle connections in parallel. This is especially
|
||||
important for the REST backend, which (when used with a local server) may create a lot
|
||||
connections and exhaust available ports quickly.
|
||||
|
||||
https://github.com/restic/restic/issues/985
|
||||
https://github.com/restic/restic/pull/986
|
||||
|
||||
* Enhancement #981: Remove temporary path from binary in `build.go`
|
||||
|
||||
The `build.go` now strips the temporary directory used for compilation from the binary. This
|
||||
is the first step in enabling reproducible builds.
|
||||
|
||||
https://github.com/restic/restic/pull/981
|
||||
|
||||
* Enhancement #974: Remove regular status reports
|
||||
|
||||
Regular status report: We've removed the status report that was printed every 10 seconds when
|
||||
restic is run non-interactively. You can still force reporting the current status by sending a
|
||||
`USR1` signal to the process.
|
||||
|
||||
https://github.com/restic/restic/pull/974
|
||||
|
||||
|
||||
Changelog for restic 0.6.0 (2017-05-29)
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic 0.6.0 relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
|
||||
* Enh #957: Make `forget` consistent
|
||||
* Enh #966: Unify repository layout for all backends
|
||||
* Enh #962: Improve memory and runtime for the s3 backend
|
||||
|
||||
Details
|
||||
-------
|
||||
|
||||
* Enhancement #957: Make `forget` consistent
|
||||
|
||||
The `forget` command was corrected to be more consistent in which snapshots are to be
|
||||
forgotten. It is possible that the new code removes more snapshots than before, so please
|
||||
review what would be deleted by using the `--dry-run` option.
|
||||
|
||||
https://github.com/restic/restic/issues/953
|
||||
https://github.com/restic/restic/pull/957
|
||||
|
||||
* Enhancement #966: Unify repository layout for all backends
|
||||
|
||||
Up to now the s3 backend used a special repository layout. We've decided to unify the repository
|
||||
layout and implemented the default layout also for the s3 backend. For creating a new
|
||||
repository on s3 with the default layout, use `restic -o s3.layout=default init`. For further
|
||||
commands the option is not necessary any more, restic will automatically detect the correct
|
||||
layout to use. A future version will switch to the default layout for new repositories.
|
||||
|
||||
https://github.com/restic/restic/issues/965
|
||||
https://github.com/restic/restic/pull/966
|
||||
|
||||
* Enhancement #962: Improve memory and runtime for the s3 backend
|
||||
|
||||
We've updated the library used for accessing s3, switched to using a lower level API and added
|
||||
caching for some requests. This lead to a decrease in memory usage and a great speedup. In
|
||||
addition, we added benchmark functions for all backends, so we can track improvements over
|
||||
time. The Continuous Integration test service we're using (Travis) now runs the s3 backend
|
||||
tests not only against a Minio server, but also against the Amazon s3 live service, so we should
|
||||
be notified of any regressions much sooner.
|
||||
|
||||
https://github.com/restic/restic/pull/962
|
||||
https://github.com/restic/restic/pull/960
|
||||
https://github.com/restic/restic/pull/946
|
||||
https://github.com/restic/restic/pull/938
|
||||
https://github.com/restic/restic/pull/883
|
||||
|
||||
|
||||
@@ -3,7 +3,10 @@ This document describes the way you can contribute to the restic project.
|
||||
Ways to Help Out
|
||||
================
|
||||
|
||||
Thank you for your contribution!
|
||||
Thank you for your contribution! Please **open an issue first** (or add a
|
||||
comment to an existing issue) if you plan to work on any code or add a new
|
||||
feature. This way, duplicate work is prevented and we can discuss your ideas
|
||||
and design first.
|
||||
|
||||
There are several ways you can help us out. First of all code contributions and
|
||||
bug fixes are most welcome. However even "minor" details as fixing spelling
|
||||
@@ -57,40 +60,35 @@ uploading it somewhere or post only the parts that are really relevant.
|
||||
Development Environment
|
||||
=======================
|
||||
|
||||
For development you need the build tool [`gb`](https://getgb.io), it can be
|
||||
installed by running the following command:
|
||||
In order to compile restic with the `go` tool directly, it needs to be checked
|
||||
out at the right path within a `GOPATH`. The concept of a `GOPATH` is explained
|
||||
in ["How to write Go code"](https://golang.org/doc/code.html).
|
||||
|
||||
$ go get github.com/constabulary/gb/...
|
||||
|
||||
The repository contains two directories with code: `src/` contains the code
|
||||
written for restic, whereas `vendor/` contains copies of libraries restic
|
||||
depends on. The libraries are managed with the `gb vendor` command.
|
||||
|
||||
Just clone the repository, `cd` to it and run `gb build` to build the binary:
|
||||
If you do not have a directory with Go code yet, executing the following
|
||||
instructions in your shell will create one for you and check out the restic
|
||||
repo:
|
||||
|
||||
$ export GOPATH="$HOME/go"
|
||||
$ mkdir -p "$GOPATH/src/github.com/restic"
|
||||
$ cd "$GOPATH/src/github.com/restic"
|
||||
$ git clone https://github.com/restic/restic
|
||||
$ cd restic
|
||||
$ gb build
|
||||
[...]
|
||||
$ bin/restic version
|
||||
|
||||
You can then build restic as follows:
|
||||
|
||||
$ go build ./cmd/restic
|
||||
$ ./restic version
|
||||
restic compiled manually
|
||||
compiled at unknown time with go1.6
|
||||
compiled with go1.8.3 on linux/amd64
|
||||
|
||||
The following commands can be used to run all the tests:
|
||||
|
||||
$ gb test
|
||||
ok github.com/restic/restic 8.174s
|
||||
[...]
|
||||
$ go test ./cmd/... ./internal/...
|
||||
|
||||
If you want to run your tests on Linux, OpenBSD or FreeBSD, you can use
|
||||
[vagrant](https://www.vagrantup.com/) with the proveded `Vagrantfile` to
|
||||
quickly set up VMs and run the tests, e.g.:
|
||||
|
||||
$ vagrant up freebsd
|
||||
[...]
|
||||
|
||||
$ vagrant ssh freebsd -c 'cd restic/restic; go test -v ./...'
|
||||
[...]
|
||||
The repository contains two sets of directories with code: `cmd/` and
|
||||
`internal/` contain the code written for restic, whereas `vendor/` contains
|
||||
copies of libraries restic depends on. The libraries are managed with the
|
||||
[`dep`](https://github.com/golang/dep) tool.
|
||||
|
||||
Providing Patches
|
||||
=================
|
||||
@@ -109,7 +107,8 @@ down to the following steps:
|
||||
|
||||
2. Clone the repository locally and create a new branch. If you are working on
|
||||
the code itself, please set up the development environment as described in
|
||||
the previous section.
|
||||
the previous section. Especially take care to place your forked repository
|
||||
at the correct path (`src/github.com/restic/restic`) within your `GOPATH`.
|
||||
|
||||
3. Then commit your changes as fine grained as possible, as smaller patches,
|
||||
that handle one and only one issue are easier to discuss and merge.
|
||||
@@ -124,8 +123,14 @@ down to the following steps:
|
||||
commits to the branch you created for the pull request, they will be
|
||||
automatically added to the pull request.
|
||||
|
||||
7. Once your code looks good and passes all the tests, we'll merge it. Thanks
|
||||
a low for your contribution!
|
||||
7. If your pull request changes anything that users should be aware of (a
|
||||
bugfix, a new feature, ...) please add an entry to the file
|
||||
['CHANGELOG.md'](CHANGELOG.md). It will be used in the announcement of the
|
||||
next stable release. While writing, ask yourself: If I were the user, what
|
||||
would I need to be aware of with this change.
|
||||
|
||||
8. Once your code looks good and passes all the tests, we'll merge it. Thanks
|
||||
a lot for your contribution!
|
||||
|
||||
Please provide the patches for each bug or feature in a separate branch and
|
||||
open up a pull request for each.
|
||||
@@ -151,7 +156,7 @@ what the tests are there for.
|
||||
Git Commits
|
||||
-----------
|
||||
|
||||
I would be good if you could follow the same general style regarding Git
|
||||
It would be good if you could follow the same general style regarding Git
|
||||
commits as the rest of the project, this makes reviewing code, browsing the
|
||||
history and triaging bugs much easier.
|
||||
|
||||
|
||||
58
Dockerfile
58
Dockerfile
@@ -1,58 +0,0 @@
|
||||
# This Dockerfiles configures a container that is similar to the Travis CI
|
||||
# environment and can be used to run tests locally.
|
||||
#
|
||||
# build the image:
|
||||
# docker build -t restic/test .
|
||||
#
|
||||
# run all tests and cross-compile restic:
|
||||
# docker run --rm -v $PWD:/home/travis/restic restic/test go run run_integration_tests.go -minio minio
|
||||
#
|
||||
# run interactively:
|
||||
# docker run --interactive --tty --rm -v $PWD:/home/travis/restic restic/test /bin/bash
|
||||
#
|
||||
# run a subset of tests:
|
||||
# docker run --rm -v $PWD:/home/travis/restic restic/test gb test -v ./backend
|
||||
#
|
||||
# build the image for an older version of Go:
|
||||
# docker build --build-arg GOVERSION=1.3.3 -t restic/test:go1.3.3 .
|
||||
|
||||
FROM ubuntu:14.04
|
||||
|
||||
ARG GOVERSION=1.6
|
||||
ARG GOARCH=amd64
|
||||
|
||||
# install dependencies
|
||||
RUN apt-get update
|
||||
RUN apt-get install -y --no-install-recommends ca-certificates wget git build-essential openssh-server
|
||||
|
||||
# add and configure user
|
||||
ENV HOME /home/travis
|
||||
RUN useradd -m -d $HOME -s /bin/bash travis
|
||||
|
||||
# run everything below as user travis
|
||||
USER travis
|
||||
WORKDIR $HOME
|
||||
|
||||
# download and install Go
|
||||
RUN wget -q -O /tmp/go.tar.gz https://storage.googleapis.com/golang/go${GOVERSION}.linux-${GOARCH}.tar.gz
|
||||
RUN tar xf /tmp/go.tar.gz && rm -f /tmp/go.tar.gz
|
||||
ENV GOROOT $HOME/go
|
||||
ENV GOPATH $HOME/gopath
|
||||
ENV PATH $PATH:$GOROOT/bin:$GOPATH/bin:$HOME/bin
|
||||
|
||||
RUN mkdir -p $HOME/restic
|
||||
|
||||
# pre-install tools, this speeds up running the tests itself
|
||||
RUN go get github.com/constabulary/gb/...
|
||||
RUN go get golang.org/x/tools/cmd/cover
|
||||
RUN go get github.com/mattn/goveralls
|
||||
RUN go get github.com/mitchellh/gox
|
||||
RUN go get github.com/pierrre/gotestcover
|
||||
RUN mkdir $HOME/bin \
|
||||
&& wget -q -O $HOME/bin/minio https://dl.minio.io/server/minio/release/linux-${GOARCH}/minio \
|
||||
&& chmod +x $HOME/bin/minio
|
||||
|
||||
# set TRAVIS_BUILD_DIR for integration script
|
||||
ENV TRAVIS_BUILD_DIR $HOME/restic
|
||||
|
||||
WORKDIR $HOME/restic
|
||||
219
Gopkg.lock
generated
Normal file
219
Gopkg.lock
generated
Normal file
@@ -0,0 +1,219 @@
|
||||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "bazil.org/fuse"
|
||||
packages = [".","fs","fuseutil"]
|
||||
revision = "371fbbdaa8987b715bdd21d6adc4c9b20155f748"
|
||||
|
||||
[[projects]]
|
||||
name = "cloud.google.com/go"
|
||||
packages = ["compute/metadata"]
|
||||
revision = "2d3a6656c17a60b0815b7e06ab0be04eacb6e613"
|
||||
version = "v0.16.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/Azure/azure-sdk-for-go"
|
||||
packages = ["storage"]
|
||||
revision = "7692b0cef22674113fcf71cc17ac3ccc1a7fef48"
|
||||
version = "v11.2.2-beta"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/Azure/go-autorest"
|
||||
packages = ["autorest","autorest/adal","autorest/azure","autorest/date"]
|
||||
revision = "c67b24a8e30d876542a85022ebbdecf0e5a935e8"
|
||||
version = "v9.4.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/cenkalti/backoff"
|
||||
packages = ["."]
|
||||
revision = "61153c768f31ee5f130071d08fc82b85208528de"
|
||||
version = "v1.1.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/cpuguy83/go-md2man"
|
||||
packages = ["md2man"]
|
||||
revision = "1d903dcb749992f3741d744c0f8376b4bd7eb3e1"
|
||||
version = "v1.0.7"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/dgrijalva/jwt-go"
|
||||
packages = ["."]
|
||||
revision = "dbeaa9332f19a944acb5736b4456cfcc02140e29"
|
||||
version = "v3.1.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/dustin/go-humanize"
|
||||
packages = ["."]
|
||||
revision = "bb3d318650d48840a39aa21a027c6630e198e626"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/elithrar/simple-scrypt"
|
||||
packages = ["."]
|
||||
revision = "2325946f714c95de4a6088202c402fbdfa64163b"
|
||||
version = "v1.2.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/go-ini/ini"
|
||||
packages = ["."]
|
||||
revision = "32e4c1e6bc4e7d0d8451aa6b75200d19e37a536a"
|
||||
version = "v1.32.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/golang/protobuf"
|
||||
packages = ["proto"]
|
||||
revision = "1e59b77b52bf8e4b449a57e6f79f21226d571845"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/inconshreveable/mousetrap"
|
||||
packages = ["."]
|
||||
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
|
||||
version = "v1.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/juju/ratelimit"
|
||||
packages = ["."]
|
||||
revision = "59fac5042749a5afb9af70e813da1dd5474f0167"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/kr/fs"
|
||||
packages = ["."]
|
||||
revision = "2788f0dbd16903de03cb8186e5c7d97b69ad387b"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/kurin/blazer"
|
||||
packages = ["b2","base","internal/b2types","internal/blog"]
|
||||
revision = "e269a1a17bb6aec278c06a57cb7e8f8d0d333e04"
|
||||
version = "v0.2.1"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/minio/go-homedir"
|
||||
packages = ["."]
|
||||
revision = "21304a94172ae3a09dee2cd86a12fb6f842138c7"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/minio/minio-go"
|
||||
packages = [".","pkg/credentials","pkg/encrypt","pkg/policy","pkg/s3signer","pkg/s3utils","pkg/set"]
|
||||
revision = "57a8ae886b49af6eb0d2c27c2d007ed2f71e1da5"
|
||||
version = "4.0.3"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/ncw/swift"
|
||||
packages = ["."]
|
||||
revision = "c95c6e5c2d1a3d37fc44c8c6dc9e231c7500667d"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pkg/errors"
|
||||
packages = ["."]
|
||||
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||
version = "v0.8.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pkg/profile"
|
||||
packages = ["."]
|
||||
revision = "5b67d428864e92711fcbd2f8629456121a56d91f"
|
||||
version = "v1.2.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pkg/sftp"
|
||||
packages = ["."]
|
||||
revision = "98203f5a8333288eb3163b7c667d4260fe1333e9"
|
||||
version = "1.0.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pkg/xattr"
|
||||
packages = ["."]
|
||||
revision = "23c75e3f6c1d8b13b3dd905b011a7f38a06044b7"
|
||||
version = "v0.2.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/restic/chunker"
|
||||
packages = ["."]
|
||||
revision = "db83917be3b88cc307464b7d8a221c173e34a0db"
|
||||
version = "v0.2.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/russross/blackfriday"
|
||||
packages = ["."]
|
||||
revision = "4048872b16cc0fc2c5fd9eacf0ed2c2fedaa0c8c"
|
||||
version = "v1.5"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/satori/uuid"
|
||||
packages = ["."]
|
||||
revision = "879c5887cd475cd7864858769793b2ceb0d44feb"
|
||||
version = "v1.1.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/sirupsen/logrus"
|
||||
packages = ["."]
|
||||
revision = "f006c2ac4710855cf0f916dd6b77acf6b048dc6e"
|
||||
version = "v1.0.3"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/spf13/cobra"
|
||||
packages = [".","doc"]
|
||||
revision = "7b2c5ac9fc04fc5efafb60700713d4fa609b777b"
|
||||
version = "v0.0.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/spf13/pflag"
|
||||
packages = ["."]
|
||||
revision = "e57e3eeb33f795204c1ca35f56c44f83227c6e66"
|
||||
version = "v1.0.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/crypto"
|
||||
packages = ["curve25519","ed25519","ed25519/internal/edwards25519","pbkdf2","poly1305","scrypt","ssh","ssh/terminal"]
|
||||
revision = "94eea52f7b742c7cbe0b03b22f0c4c8631ece122"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/net"
|
||||
packages = ["context","context/ctxhttp","webdav","webdav/internal/xml"]
|
||||
revision = "a8b9294777976932365dabb6640cf1468d95c70f"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/oauth2"
|
||||
packages = [".","google","internal","jws","jwt"]
|
||||
revision = "f95fa95eaa936d9d87489b15d1d18b97c1ba9c28"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/sys"
|
||||
packages = ["unix","windows"]
|
||||
revision = "8b4580aae2a0dd0c231a45d3ccb8434ff533b840"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "google.golang.org/api"
|
||||
packages = ["gensupport","googleapi","googleapi/internal/uritemplates","storage/v1"]
|
||||
revision = "3a1d936b7575b82197a1fea0632218dd07b1e65c"
|
||||
|
||||
[[projects]]
|
||||
name = "google.golang.org/appengine"
|
||||
packages = [".","internal","internal/app_identity","internal/base","internal/datastore","internal/log","internal/modules","internal/remote_api","internal/urlfetch","urlfetch"]
|
||||
revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a"
|
||||
version = "v1.0.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "v2"
|
||||
name = "gopkg.in/yaml.v2"
|
||||
packages = ["."]
|
||||
revision = "287cf08546ab5e7e37d55a84f7ed3fd1db036de5"
|
||||
|
||||
[solve-meta]
|
||||
analyzer-name = "dep"
|
||||
analyzer-version = 1
|
||||
inputs-digest = "b01eeeb2be041c7cd11f9ee50324ef456ac1e1cd0720408c6d72f88f92f09320"
|
||||
solver-name = "gps-cdcl"
|
||||
solver-version = 1
|
||||
21
Gopkg.toml
Normal file
21
Gopkg.toml
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
# Gopkg.toml example
|
||||
#
|
||||
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
|
||||
# for detailed Gopkg.toml documentation.
|
||||
#
|
||||
# required = ["github.com/user/thing/cmd/thing"]
|
||||
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project"
|
||||
# version = "1.0.0"
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project2"
|
||||
# branch = "dev"
|
||||
# source = "github.com/myfork/project2"
|
||||
#
|
||||
# [[override]]
|
||||
# name = "github.com/x/y"
|
||||
# version = "2.4.0"
|
||||
18
LICENSE
18
LICENSE
@@ -1,19 +1,21 @@
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2014, Alexander Neumann <alexander@bumpern.de>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. 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.
|
||||
* 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.
|
||||
|
||||
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
|
||||
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 HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
|
||||
5
Makefile
5
Makefile
@@ -6,7 +6,8 @@ restic:
|
||||
go run build.go
|
||||
|
||||
clean:
|
||||
rm -rf restic
|
||||
rm -f restic
|
||||
|
||||
test:
|
||||
go test ./...
|
||||
go test ./cmd/... ./internal/...
|
||||
|
||||
|
||||
80
README.md
80
README.md
@@ -1,80 +0,0 @@
|
||||
[](https://restic.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://travis-ci.org/restic/restic)
|
||||
[](https://ci.appveyor.com/project/fd0/restic/branch/master)
|
||||
[](http://goreportcard.com/report/github.com/restic/restic)
|
||||
[](https://coveralls.io/r/restic/restic)
|
||||
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
restic is a backup program that is fast, efficient and secure. Detailed
|
||||
information can be found in [the documentation](doc/index.md) and [the user
|
||||
manual](doc/Manual.md). The [design document](doc/Design.md) lists the
|
||||
technical background and gives detailed information about the structure of the
|
||||
repository and the data saved therein.
|
||||
|
||||
The latest documentation can be viewed online at
|
||||
<https://restic.readthedocs.io/en/latest>. On the bottom left corner there is
|
||||
a menu that allows switching to the documentation and user manual for the
|
||||
latest released version.
|
||||
|
||||
Build restic
|
||||
============
|
||||
|
||||
Install Go/Golang (at least version 1.3), then run `go run build.go`,
|
||||
afterwards you'll find the binary in the current directory:
|
||||
|
||||
$ go run build.go
|
||||
|
||||
$ ./restic --help
|
||||
Usage:
|
||||
restic [OPTIONS] <command>
|
||||
[...]
|
||||
|
||||
More documentation can be found in the [user manual](doc/Manual.md).
|
||||
|
||||
At the moment, the only tested compiler for restic is the official Go compiler.
|
||||
Building restic with gccgo may work, but is not supported.
|
||||
|
||||
Contribute and Documentation
|
||||
============================
|
||||
|
||||
Contributions are welcome! More information can be found in
|
||||
[`CONTRIBUTING.md`](CONTRIBUTING.md). A document describing the design of
|
||||
restic and the data structures stored on the back end is contained in
|
||||
[`doc/Design.md`](doc/Design.md).
|
||||
The development environment is described in [`CONTRIBUTING.md`](CONTRIBUTING.md).
|
||||
|
||||
If you'd like to start contributing to restic, but don't know exactly what do
|
||||
to, have a look at this great article by Dave Cheney:
|
||||
[Suggestions for contributing to an Open Source project](http://dave.cheney.net/2016/03/12/suggestions-for-contributing-to-an-open-source-project)
|
||||
A few issues have been tagged with the label `help wanted`, you can start
|
||||
looking at those: https://github.com/restic/restic/labels/help%20wanted
|
||||
|
||||
Contact
|
||||
=======
|
||||
|
||||
If you discover a bug, find something surprising or if you would like to
|
||||
discuss or ask something, please [open a github issue](https://github.com/restic/restic/issues/new).
|
||||
If you would like to chat about restic, there is also the IRC channel #restic
|
||||
on irc.freenode.net.
|
||||
|
||||
**Important**: If you discover something that you believe to be a possible critical
|
||||
security problem, please do *not* open a GitHub issue but send an email directly to
|
||||
alexander@bumpern.de. If possible, please encrypt your email using the following PGP key
|
||||
([0x91A6868BD3F7A907](https://pgp.mit.edu/pks/lookup?op=get&search=0xCF8F18F2844575973F79D4E191A6868BD3F7A907)):
|
||||
|
||||
```
|
||||
pub 4096R/91A6868BD3F7A907 2014-11-01
|
||||
Key fingerprint = CF8F 18F2 8445 7597 3F79 D4E1 91A6 868B D3F7 A907
|
||||
uid Alexander Neumann <alexander@bumpern.de>
|
||||
uid Alexander Neumann <alexander@debian.org>
|
||||
sub 4096R/D5FC2ACF4043FDF1 2014-11-01
|
||||
```
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
Restic is licensed under "BSD 2-Clause License". You can find the complete text
|
||||
in the file `LICENSE`.
|
||||
124
README.rst
Normal file
124
README.rst
Normal file
@@ -0,0 +1,124 @@
|
||||
|Documentation| |Build Status| |Build status| |Report Card| |Say Thanks| |TestCoverage|
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
restic is a backup program that is fast, efficient and secure.
|
||||
|
||||
For detailed usage and installation instructions check out the `documentation <https://restic.readthedocs.io/en/latest>`__.
|
||||
|
||||
You can ask questions in our `Discourse forum <https://forum.restic.net>`__.
|
||||
|
||||
Quick start
|
||||
-----------
|
||||
|
||||
Once you've `installed
|
||||
<https://restic.readthedocs.io/en/latest/020_installation.html>`__ restic, start
|
||||
off with creating a repository for your backups:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ restic init --repo /tmp/backup
|
||||
enter password for new backend:
|
||||
enter password again:
|
||||
created restic backend 085b3c76b9 at /tmp/backup
|
||||
Please note that knowledge of your password is required to access the repository.
|
||||
Losing your password means that your data is irrecoverably lost.
|
||||
|
||||
and add some data:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ restic -r /tmp/backup backup ~/work
|
||||
enter password for repository:
|
||||
scan [/home/user/work]
|
||||
scanned 764 directories, 1816 files in 0:00
|
||||
[0:29] 100.00% 54.732 MiB/s 1.582 GiB / 1.582 GiB 2580 / 2580 items 0 errors ETA 0:00
|
||||
duration: 0:29, 54.47MiB/s
|
||||
snapshot 40dc1520 saved
|
||||
|
||||
Next you can either use ``restic restore`` to restore files or use ``restic
|
||||
mount`` to mount the repository via fuse and browse the files from previous
|
||||
snapshots.
|
||||
|
||||
For more options check out the `online documentation <https://restic.readthedocs.io/en/latest/>`__.
|
||||
|
||||
Backends
|
||||
--------
|
||||
|
||||
Saving a backup on the same machine is nice but not a real backup strategy.
|
||||
Therefore, restic supports the following backends for storing backups natively:
|
||||
|
||||
- `Local directory <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#local>`__
|
||||
- `sftp server (via SSH) <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#sftp>`__
|
||||
- `HTTP REST server <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server>`__ (`protocol <doc/100_references.rst#rest-backend>`__ `rest-server <https://github.com/restic/rest-server>`__)
|
||||
- `AWS S3 <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#amazon-s3>`__ (either from Amazon or using the `Minio <https://minio.io>`__ server)
|
||||
- `OpenStack Swift <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#openstack-swift>`__
|
||||
- `BackBlaze B2 <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#backblaze-b2>`__
|
||||
- `Microsoft Azure Blob Storage <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#microsoft-azure-blob-storage>`__
|
||||
- `Google Cloud Storage <https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#google-cloud-storage>`__
|
||||
|
||||
Design Principles
|
||||
-----------------
|
||||
|
||||
Restic is a program that does backups right and was designed with the
|
||||
following principles in mind:
|
||||
|
||||
- **Easy:** Doing backups should be a frictionless process, otherwise
|
||||
you might be tempted to skip it. Restic should be easy to configure
|
||||
and use, so that, in the event of a data loss, you can just restore
|
||||
it. Likewise, restoring data should not be complicated.
|
||||
|
||||
- **Fast**: Backing up your data with restic should only be limited by
|
||||
your network or hard disk bandwidth so that you can backup your files
|
||||
every day. Nobody does backups if it takes too much time. Restoring
|
||||
backups should only transfer data that is needed for the files that
|
||||
are to be restored, so that this process is also fast.
|
||||
|
||||
- **Verifiable**: Much more important than backup is restore, so restic
|
||||
enables you to easily verify that all data can be restored.
|
||||
|
||||
- **Secure**: Restic uses cryptography to guarantee confidentiality and
|
||||
integrity of your data. The location the backup data is stored is
|
||||
assumed not to be a trusted environment (e.g. a shared space where
|
||||
others like system administrators are able to access your backups).
|
||||
Restic is built to secure your data against such attackers.
|
||||
|
||||
- **Efficient**: With the growth of data, additional snapshots should
|
||||
only take the storage of the actual increment. Even more, duplicate
|
||||
data should be de-duplicated before it is actually written to the
|
||||
storage back end to save precious backup space.
|
||||
|
||||
Reproducible Builds
|
||||
-------------------
|
||||
|
||||
The binaries released with each restic version starting at 0.6.1 are
|
||||
`reproducible <https://reproducible-builds.org/>`__, which means that you can
|
||||
easily reproduce a byte identical version from the source code for that
|
||||
release. Instructions on how to do that are contained in the
|
||||
`builder repository <https://github.com/restic/builder>`__.
|
||||
|
||||
News
|
||||
----
|
||||
|
||||
You can follow the restic project on Twitter `@resticbackup <https://twitter.com/resticbackup>`__ or by subscribing to
|
||||
the `development blog <https://restic.net/blog/>`__.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Restic is licensed under `BSD 2-Clause License <https://opensource.org/licenses/BSD-2-Clause>`__. You can find the
|
||||
complete text in ``LICENSE``.
|
||||
|
||||
.. |Documentation| image:: https://readthedocs.org/projects/restic/badge/?version=latest
|
||||
:target: https://restic.readthedocs.io/en/latest/?badge=latest
|
||||
.. |Build Status| image:: https://travis-ci.org/restic/restic.svg?branch=master
|
||||
:target: https://travis-ci.org/restic/restic
|
||||
.. |Build status| image:: https://ci.appveyor.com/api/projects/status/nuy4lfbgfbytw92q/branch/master?svg=true
|
||||
:target: https://ci.appveyor.com/project/fd0/restic/branch/master
|
||||
.. |Report Card| image:: https://goreportcard.com/badge/github.com/restic/restic
|
||||
:target: https://goreportcard.com/report/github.com/restic/restic
|
||||
.. |Say Thanks| image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg
|
||||
:target: https://saythanks.io/to/restic
|
||||
.. |TestCoverage| image:: https://codecov.io/gh/restic/restic/branch/master/graph/badge.svg
|
||||
:target: https://codecov.io/gh/restic/restic
|
||||
124
Vagrantfile
vendored
124
Vagrantfile
vendored
@@ -1,124 +0,0 @@
|
||||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
GO_VERSION = '1.6'
|
||||
|
||||
def packages_freebsd
|
||||
return <<-EOF
|
||||
pkg install -y git
|
||||
pkg install -y curl
|
||||
|
||||
echo 'fuse_load="YES"' >> /boot/loader.conf
|
||||
echo 'vfs.usermount=1' >> /etc/sysctl.conf
|
||||
|
||||
kldload fuse
|
||||
sysctl vfs.usermount=1
|
||||
pw groupmod operator -M vagrant
|
||||
EOF
|
||||
end
|
||||
|
||||
def packages_openbsd
|
||||
return <<-EOF
|
||||
. ~/.profile
|
||||
pkg_add git curl bash gtar--
|
||||
ln -sf /usr/local/bin/gtar /usr/local/bin/tar
|
||||
EOF
|
||||
end
|
||||
|
||||
def packages_linux
|
||||
return <<-EOF
|
||||
apt-get update
|
||||
apt-get install -y git curl
|
||||
EOF
|
||||
end
|
||||
|
||||
def packages_darwin
|
||||
return <<-EOF
|
||||
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
||||
brew cask install osxfuse
|
||||
EOF
|
||||
end
|
||||
|
||||
def install_gimme
|
||||
return <<-EOF
|
||||
rm -rf /opt/gimme
|
||||
mkdir -p /opt/gimme || true
|
||||
git clone https://github.com/meatballhat/gimme /opt/gimme
|
||||
perl -p -i -e 's,/bin/bash,/usr/bin/env bash,' /opt/gimme/gimme
|
||||
ln -sf /opt/gimme/gimme /usr/bin/gimme
|
||||
EOF
|
||||
end
|
||||
|
||||
def prepare_user(boxname)
|
||||
return <<-EOF
|
||||
mkdir -p ~/go/src
|
||||
export PATH=/usr/local/bin:$PATH
|
||||
|
||||
gimme #{GO_VERSION} >> ~/.profile
|
||||
echo export 'GOPATH=/vagrant/go' >> ~/.profile
|
||||
echo export 'PATH=$GOPATH/bin:/usr/local/bin:$PATH' >> ~/.profile
|
||||
|
||||
. ~/.profile
|
||||
|
||||
go get golang.org/x/tools/cmd/cover
|
||||
go get github.com/constabulary/gb/...
|
||||
|
||||
echo
|
||||
echo "Run:"
|
||||
echo " vagrant rsync #{boxname}"
|
||||
echo " vagrant ssh #{boxname} -c 'cd /vagrant; gb build && gb test'"
|
||||
EOF
|
||||
end
|
||||
|
||||
def fix_perms
|
||||
return <<-EOF
|
||||
chown -R vagrant /vagrant
|
||||
EOF
|
||||
end
|
||||
|
||||
# All Vagrant configuration is done below. The "2" in Vagrant.configure
|
||||
# configures the configuration version (we support older styles for
|
||||
# backwards compatibility). Please don't change it unless you know what
|
||||
# you're doing.
|
||||
Vagrant.configure(2) do |config|
|
||||
# use rsync to copy content to the folder
|
||||
config.vm.synced_folder ".", "/vagrant", :type => "rsync"
|
||||
|
||||
# fix permissions on synced folder
|
||||
config.vm.provision "fix perms", :type => :shell, :inline => fix_perms
|
||||
|
||||
config.vm.define "linux" do |b|
|
||||
b.vm.box = "ubuntu/trusty64"
|
||||
b.vm.provision "packages linux", :type => :shell, :inline => packages_linux
|
||||
b.vm.provision "install gimme", :type => :shell, :inline => install_gimme
|
||||
b.vm.provision "prepare user", :type => :shell, :privileged => false, :inline => prepare_user("linux")
|
||||
|
||||
# fix network card
|
||||
config.vm.provider "virtualbox" do |v|
|
||||
v.customize ["modifyvm", :id, "--nictype1", "virtio"]
|
||||
end
|
||||
end
|
||||
|
||||
config.vm.define "freebsd" do |b|
|
||||
b.vm.box = "geoffgarside/freebsd-10.1"
|
||||
b.vm.provision "packages freebsd", :type => :shell, :inline => packages_freebsd
|
||||
b.vm.provision "install gimme", :type => :shell, :inline => install_gimme
|
||||
b.vm.provision "prepare user", :type => :shell, :privileged => false, :inline => prepare_user("freebsd")
|
||||
end
|
||||
|
||||
config.vm.define "openbsd" do |b|
|
||||
b.vm.box = "tmatilai/openbsd-5.6"
|
||||
b.vm.provision "packages openbsd", :type => :shell, :inline => packages_openbsd
|
||||
b.vm.provision "install gimme", :type => :shell, :inline => install_gimme
|
||||
b.vm.provision "prepare user", :type => :shell, :privileged => false, :inline => prepare_user("openbsd")
|
||||
end
|
||||
|
||||
config.vm.define "darwin" do |b|
|
||||
#b.vm.box = "jhcook/osx-yosemite-10.10"
|
||||
b.vm.box = "jhcook/yosemite-clitools"
|
||||
b.vm.provision "packages darwin", :type => :shell, :privileged => false, :inline => packages_darwin
|
||||
b.vm.provision "install gimme", :type => :shell, :inline => install_gimme
|
||||
b.vm.provision "prepare user", :type => :shell, :privileged => false, :inline => prepare_user("darwin")
|
||||
end
|
||||
|
||||
end
|
||||
@@ -3,6 +3,10 @@ clone_folder: c:\restic
|
||||
environment:
|
||||
GOPATH: c:\gopath
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
init:
|
||||
- ps: >-
|
||||
$app = Get-WmiObject -Class Win32_Product -Filter "Vendor = 'http://golang.org'"
|
||||
@@ -13,8 +17,8 @@ init:
|
||||
|
||||
install:
|
||||
- rmdir c:\go /s /q
|
||||
- appveyor DownloadFile https://storage.googleapis.com/golang/go1.6.1.windows-amd64.msi
|
||||
- msiexec /i go1.6.1.windows-amd64.msi /q
|
||||
- appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.windows-amd64.msi
|
||||
- msiexec /i go1.9.windows-amd64.msi /q
|
||||
- go version
|
||||
- go env
|
||||
- appveyor DownloadFile http://sourceforge.netcologne.de/project/gnuwin32/tar/1.13-1/tar-1.13-1-bin.zip -FileName tar.zip
|
||||
|
||||
187
build.go
187
build.go
@@ -11,17 +11,32 @@ import (
|
||||
"path"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
verbose bool
|
||||
keepGopath bool
|
||||
runTests bool
|
||||
enableCGO bool
|
||||
)
|
||||
|
||||
const timeFormat = "2006-01-02 15:04:05"
|
||||
var config = struct {
|
||||
Name string
|
||||
Namespace string
|
||||
Main string
|
||||
Tests []string
|
||||
MinVersion GoVersion
|
||||
}{
|
||||
Name: "restic", // name of the program executable and directory
|
||||
Namespace: "github.com/restic/restic", // subdir of GOPATH, e.g. "github.com/foo/bar"
|
||||
Main: "github.com/restic/restic/cmd/restic", // package name for the main package
|
||||
Tests: []string{ // tests to run
|
||||
"github.com/restic/restic/internal/...",
|
||||
"github.com/restic/restic/cmd/..."},
|
||||
MinVersion: GoVersion{Major: 1, Minor: 8, Patch: 0}, // minimum Go version supported
|
||||
}
|
||||
|
||||
// specialDir returns true if the file begins with a special character ('.' or '_').
|
||||
func specialDir(name string) bool {
|
||||
@@ -40,7 +55,7 @@ func specialDir(name string) bool {
|
||||
// excludePath returns true if the file should not be copied to the new GOPATH.
|
||||
func excludePath(name string) bool {
|
||||
ext := path.Ext(name)
|
||||
if ext == ".go" || ext == ".s" {
|
||||
if ext == ".go" || ext == ".s" || ext == ".h" {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -67,7 +82,12 @@ func excludePath(name string) bool {
|
||||
// └── restic
|
||||
// └── foo.go
|
||||
func updateGopath(dst, src, prefix string) error {
|
||||
verbosePrintf("copy contents of %v to %v\n", src, filepath.Join(dst, prefix))
|
||||
return filepath.Walk(src, func(name string, fi os.FileInfo, err error) error {
|
||||
if name == src {
|
||||
return err
|
||||
}
|
||||
|
||||
if specialDir(name) {
|
||||
if fi.IsDir() {
|
||||
return filepath.SkipDir
|
||||
@@ -76,6 +96,10 @@ func updateGopath(dst, src, prefix string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if fi.IsDir() {
|
||||
return nil
|
||||
}
|
||||
@@ -96,6 +120,15 @@ func updateGopath(dst, src, prefix string) error {
|
||||
})
|
||||
}
|
||||
|
||||
func directoryExists(dirname string) bool {
|
||||
stat, err := os.Stat(dirname)
|
||||
if err != nil && os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
|
||||
return stat.IsDir()
|
||||
}
|
||||
|
||||
// copyFile creates dst from src, preserving file attributes and timestamps.
|
||||
func copyFile(dst, src string) error {
|
||||
fi, err := os.Stat(src)
|
||||
@@ -156,6 +189,8 @@ func showUsage(output io.Writer) {
|
||||
fmt.Fprintf(output, " -t --tags specify additional build tags\n")
|
||||
fmt.Fprintf(output, " -k --keep-gopath do not remove the GOPATH after build\n")
|
||||
fmt.Fprintf(output, " -T --test run tests\n")
|
||||
fmt.Fprintf(output, " -o --output set output file name\n")
|
||||
fmt.Fprintf(output, " --enable-cgo use CGO to link against libc\n")
|
||||
fmt.Fprintf(output, " --goos value set GOOS for cross-compilation\n")
|
||||
fmt.Fprintf(output, " --goarch value set GOARCH for cross-compilation\n")
|
||||
}
|
||||
@@ -184,9 +219,16 @@ func cleanEnv() (env []string) {
|
||||
|
||||
// build runs "go build args..." with GOPATH set to gopath.
|
||||
func build(cwd, goos, goarch, gopath string, args ...string) error {
|
||||
args = append([]string{"build"}, args...)
|
||||
cmd := exec.Command("go", args...)
|
||||
a := []string{"build"}
|
||||
a = append(a, "-asmflags", fmt.Sprintf("-trimpath=%s", gopath))
|
||||
a = append(a, "-gcflags", fmt.Sprintf("-trimpath=%s", gopath))
|
||||
a = append(a, args...)
|
||||
cmd := exec.Command("go", a...)
|
||||
cmd.Env = append(cleanEnv(), "GOPATH="+gopath, "GOARCH="+goarch, "GOOS="+goos)
|
||||
if !enableCGO {
|
||||
cmd.Env = append(cmd.Env, "CGO_ENABLED=0")
|
||||
}
|
||||
|
||||
cmd.Dir = cwd
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
@@ -264,21 +306,90 @@ type Constants map[string]string
|
||||
func (cs Constants) LDFlags() string {
|
||||
l := make([]string, 0, len(cs))
|
||||
|
||||
v := runtime.Version()
|
||||
if strings.HasPrefix(v, "go1.5") || strings.HasPrefix(v, "go1.6") || strings.HasPrefix(v, "go1.7") {
|
||||
for k, v := range cs {
|
||||
l = append(l, fmt.Sprintf(`-X "%s=%s"`, k, v))
|
||||
}
|
||||
} else {
|
||||
for k, v := range cs {
|
||||
l = append(l, fmt.Sprintf(`-X %q %q`, k, v))
|
||||
}
|
||||
for k, v := range cs {
|
||||
l = append(l, fmt.Sprintf(`-X "%s=%s"`, k, v))
|
||||
}
|
||||
|
||||
return strings.Join(l, " ")
|
||||
}
|
||||
|
||||
// GoVersion is the version of Go used to compile the project.
|
||||
type GoVersion struct {
|
||||
Major int
|
||||
Minor int
|
||||
Patch int
|
||||
}
|
||||
|
||||
// ParseGoVersion parses the Go version s. If s cannot be parsed, the returned GoVersion is null.
|
||||
func ParseGoVersion(s string) (v GoVersion) {
|
||||
if !strings.HasPrefix(s, "go") {
|
||||
return
|
||||
}
|
||||
|
||||
s = s[2:]
|
||||
data := strings.Split(s, ".")
|
||||
if len(data) != 3 {
|
||||
return
|
||||
}
|
||||
|
||||
major, err := strconv.Atoi(data[0])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
minor, err := strconv.Atoi(data[1])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
patch, err := strconv.Atoi(data[2])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
v = GoVersion{
|
||||
Major: major,
|
||||
Minor: minor,
|
||||
Patch: patch,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// AtLeast returns true if v is at least as new as other. If v is empty, true is returned.
|
||||
func (v GoVersion) AtLeast(other GoVersion) bool {
|
||||
var empty GoVersion
|
||||
|
||||
// the empty version satisfies all versions
|
||||
if v == empty {
|
||||
return true
|
||||
}
|
||||
|
||||
if v.Major < other.Major {
|
||||
return false
|
||||
}
|
||||
|
||||
if v.Minor < other.Minor {
|
||||
return false
|
||||
}
|
||||
|
||||
if v.Patch < other.Patch {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (v GoVersion) String() string {
|
||||
return fmt.Sprintf("Go %d.%d.%d", v.Major, v.Minor, v.Patch)
|
||||
}
|
||||
|
||||
func main() {
|
||||
ver := ParseGoVersion(runtime.Version())
|
||||
if !ver.AtLeast(config.MinVersion) {
|
||||
fmt.Fprintf(os.Stderr, "%s detected, this program requires at least %s\n", ver, config.MinVersion)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
buildTags := []string{}
|
||||
|
||||
skipNext := false
|
||||
@@ -287,6 +398,8 @@ func main() {
|
||||
targetGOOS := runtime.GOOS
|
||||
targetGOARCH := runtime.GOARCH
|
||||
|
||||
var outputFilename string
|
||||
|
||||
for i, arg := range params {
|
||||
if skipNext {
|
||||
skipNext = false
|
||||
@@ -299,10 +412,18 @@ func main() {
|
||||
case "-k", "--keep-gopath":
|
||||
keepGopath = true
|
||||
case "-t", "-tags", "--tags":
|
||||
if i+1 >= len(params) {
|
||||
die("-t given but no tag specified")
|
||||
}
|
||||
skipNext = true
|
||||
buildTags = strings.Split(params[i+1], " ")
|
||||
case "-o", "--output":
|
||||
skipNext = true
|
||||
outputFilename = params[i+1]
|
||||
case "-T", "--test":
|
||||
runTests = true
|
||||
case "--enable-cgo":
|
||||
enableCGO = true
|
||||
case "--goos":
|
||||
skipNext = true
|
||||
targetGOOS = params[i+1]
|
||||
@@ -335,23 +456,21 @@ func main() {
|
||||
die("Getwd(): %v\n", err)
|
||||
}
|
||||
|
||||
gopath, err := ioutil.TempDir("", "restic-build-")
|
||||
gopath, err := ioutil.TempDir("", fmt.Sprintf("%v-build-", config.Name))
|
||||
if err != nil {
|
||||
die("TempDir(): %v\n", err)
|
||||
}
|
||||
|
||||
verbosePrintf("create GOPATH at %v\n", gopath)
|
||||
if err = updateGopath(gopath, filepath.Join(root, "src", "restic"), "restic"); err != nil {
|
||||
die("copying files from %v/src/restic to %v/src/restic failed: %v\n", root, gopath, err)
|
||||
if err = updateGopath(gopath, root, config.Namespace); err != nil {
|
||||
die("copying files from %v/src to %v/src failed: %v\n", root, gopath, err)
|
||||
}
|
||||
|
||||
if err = updateGopath(gopath, filepath.Join(root, "src", "cmds"), "cmds"); err != nil {
|
||||
die("copying files from %v/src/cmds to %v/src/restic/cmds failed: %v\n", root, gopath, err)
|
||||
}
|
||||
|
||||
vendor := filepath.Join(root, "vendor", "src")
|
||||
if err = updateGopath(gopath, vendor, ""); err != nil {
|
||||
die("copying files from %v to %v/src failed: %v\n", vendor, gopath, err)
|
||||
vendor := filepath.Join(root, "vendor")
|
||||
if directoryExists(vendor) {
|
||||
if err = updateGopath(gopath, vendor, filepath.Join(config.Namespace, "vendor")); err != nil {
|
||||
die("copying files from %v to %v failed: %v\n", root, gopath, err)
|
||||
}
|
||||
}
|
||||
|
||||
defer func() {
|
||||
@@ -365,20 +484,24 @@ func main() {
|
||||
}
|
||||
}()
|
||||
|
||||
outputFilename := "restic"
|
||||
if targetGOOS == "windows" {
|
||||
outputFilename = "restic.exe"
|
||||
if outputFilename == "" {
|
||||
outputFilename = config.Name
|
||||
if targetGOOS == "windows" {
|
||||
outputFilename += ".exe"
|
||||
}
|
||||
}
|
||||
|
||||
cwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
die("Getwd() returned %v\n", err)
|
||||
}
|
||||
output := filepath.Join(cwd, outputFilename)
|
||||
output := outputFilename
|
||||
if !filepath.IsAbs(output) {
|
||||
output = filepath.Join(cwd, output)
|
||||
}
|
||||
|
||||
version := getVersion()
|
||||
compileTime := time.Now().Format(timeFormat)
|
||||
constants := Constants{`main.compiledAt`: compileTime}
|
||||
constants := Constants{}
|
||||
if version != "" {
|
||||
constants["main.version"] = version
|
||||
}
|
||||
@@ -388,7 +511,7 @@ func main() {
|
||||
args := []string{
|
||||
"-tags", strings.Join(buildTags, " "),
|
||||
"-ldflags", ldflags,
|
||||
"-o", output, "cmds/restic",
|
||||
"-o", output, config.Main,
|
||||
}
|
||||
|
||||
err = build(filepath.Join(gopath, "src"), targetGOOS, targetGOARCH, gopath, args...)
|
||||
@@ -399,7 +522,7 @@ func main() {
|
||||
if runTests {
|
||||
verbosePrintf("running tests\n")
|
||||
|
||||
err = test(filepath.Join(gopath, "src"), gopath, "restic/...")
|
||||
err = test(cwd, gopath, config.Tests...)
|
||||
if err != nil {
|
||||
die("running tests failed: %v\n", err)
|
||||
}
|
||||
|
||||
8
changelog/0.6.0/issue-953
Normal file
8
changelog/0.6.0/issue-953
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Make `forget` consistent
|
||||
|
||||
The `forget` command was corrected to be more consistent in which snapshots are
|
||||
to be forgotten. It is possible that the new code removes more snapshots than
|
||||
before, so please review what would be deleted by using the `--dry-run` option.
|
||||
|
||||
https://github.com/restic/restic/pull/957
|
||||
https://github.com/restic/restic/issues/953
|
||||
11
changelog/0.6.0/issue-965
Normal file
11
changelog/0.6.0/issue-965
Normal file
@@ -0,0 +1,11 @@
|
||||
Enhancement: Unify repository layout for all backends
|
||||
|
||||
Up to now the s3 backend used a special repository layout. We've decided to
|
||||
unify the repository layout and implemented the default layout also for the s3
|
||||
backend. For creating a new repository on s3 with the default layout, use
|
||||
`restic -o s3.layout=default init`. For further commands the option is not
|
||||
necessary any more, restic will automatically detect the correct layout to use.
|
||||
A future version will switch to the default layout for new repositories.
|
||||
|
||||
https://github.com/restic/restic/pull/966
|
||||
https://github.com/restic/restic/issues/965
|
||||
15
changelog/0.6.0/pull-962
Normal file
15
changelog/0.6.0/pull-962
Normal file
@@ -0,0 +1,15 @@
|
||||
Enhancement: Improve memory and runtime for the s3 backend
|
||||
|
||||
We've updated the library used for accessing s3, switched to using a lower
|
||||
level API and added caching for some requests. This lead to a decrease in
|
||||
memory usage and a great speedup. In addition, we added benchmark functions for
|
||||
all backends, so we can track improvements over time. The Continuous
|
||||
Integration test service we're using (Travis) now runs the s3 backend tests not
|
||||
only against a Minio server, but also against the Amazon s3 live service, so we
|
||||
should be notified of any regressions much sooner.
|
||||
|
||||
https://github.com/restic/restic/pull/962
|
||||
https://github.com/restic/restic/pull/960
|
||||
https://github.com/restic/restic/pull/946
|
||||
https://github.com/restic/restic/pull/938
|
||||
https://github.com/restic/restic/pull/883
|
||||
8
changelog/0.6.1/issue-985
Normal file
8
changelog/0.6.1/issue-985
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Allow multiple parallel idle HTTP connections
|
||||
|
||||
Backends based on HTTP now allow several idle connections in parallel. This
|
||||
is especially important for the REST backend, which (when used with a local
|
||||
server) may create a lot connections and exhaust available ports quickly.
|
||||
|
||||
https://github.com/restic/restic/issues/985
|
||||
https://github.com/restic/restic/pull/986
|
||||
6
changelog/0.6.1/pull-891
Normal file
6
changelog/0.6.1/pull-891
Normal file
@@ -0,0 +1,6 @@
|
||||
Enhancement: Remove temporary path from binary in `build.go`
|
||||
|
||||
The `build.go` now strips the temporary directory used for compilation from
|
||||
the binary. This is the first step in enabling reproducible builds.
|
||||
|
||||
https://github.com/restic/restic/pull/981
|
||||
7
changelog/0.6.1/pull-974
Normal file
7
changelog/0.6.1/pull-974
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Remove regular status reports
|
||||
|
||||
Regular status report: We've removed the status report that was printed
|
||||
every 10 seconds when restic is run non-interactively. You can still force
|
||||
reporting the current status by sending a `USR1` signal to the process.
|
||||
|
||||
https://github.com/restic/restic/pull/974
|
||||
9
changelog/0.7.0/issue-1013
Normal file
9
changelog/0.7.0/issue-1013
Normal file
@@ -0,0 +1,9 @@
|
||||
Bugfix: Switch back to using the high-level minio-go API for s3
|
||||
|
||||
For the s3 backend we're back to using the high-level API the s3 client library
|
||||
for uploading data, a few users reported dropped connections (which the library
|
||||
will automatically retry now).
|
||||
|
||||
https://github.com/restic/restic/issues/1013
|
||||
https://github.com/restic/restic/issues/1023
|
||||
https://github.com/restic/restic/pull/1025
|
||||
7
changelog/0.7.0/issue-1021
Normal file
7
changelog/0.7.0/issue-1021
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Detect invalid backend name and print error
|
||||
|
||||
restic now tries to detect when an invalid/unknown backend is used and
|
||||
returns an error message.
|
||||
|
||||
https://github.com/restic/restic/issues/1021
|
||||
https://github.com/restic/restic/pull/1070
|
||||
8
changelog/0.7.0/issue-1029
Normal file
8
changelog/0.7.0/issue-1029
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Remove invalid pack files when `prune` is run
|
||||
|
||||
The `prune` command has been improved and will now remove invalid pack files,
|
||||
for example files that have not been uploaded completely because a backup was
|
||||
interrupted.
|
||||
|
||||
https://github.com/restic/restic/issues/1029
|
||||
https://github.com/restic/restic/pull/1036
|
||||
4
changelog/0.7.0/issue-512
Normal file
4
changelog/0.7.0/issue-512
Normal file
@@ -0,0 +1,4 @@
|
||||
Enhancement: Add Backblaze B2 backend
|
||||
|
||||
https://github.com/restic/restic/issues/512
|
||||
https://github.com/restic/restic/pull/978
|
||||
9
changelog/0.7.0/issue-636
Normal file
9
changelog/0.7.0/issue-636
Normal file
@@ -0,0 +1,9 @@
|
||||
Enhancement: Add dirs `tags` and `hosts` to fuse mount
|
||||
|
||||
The fuse mount now has two more directories: `tags` contains a subdir for
|
||||
each tag, which in turn contains only the snapshots that have this tag. The
|
||||
subdir `hosts` contains a subdir for each host that has a snapshot, and the
|
||||
subdir contains the snapshots for that host.
|
||||
|
||||
https://github.com/restic/restic/issues/636
|
||||
https://github.com/restic/restic/pull/1050
|
||||
8
changelog/0.7.0/issue-965
Normal file
8
changelog/0.7.0/issue-965
Normal file
@@ -0,0 +1,8 @@
|
||||
Bugfix: Switch to `default` repo layout for the s3 backend
|
||||
|
||||
The default layout for the s3 backend is now `default` (instead of `s3legacy`).
|
||||
Also, there's a new `migrate` command to convert an existing repo, it can be
|
||||
run like this: `restic migrate s3_layout`
|
||||
|
||||
https://github.com/restic/restic/issues/965
|
||||
https://github.com/restic/restic/pull/1004
|
||||
8
changelog/0.7.0/issue-989
Normal file
8
changelog/0.7.0/issue-989
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Improve performance of the `find` command
|
||||
|
||||
Improved performance for the `find` command: Restic recognizes paths it has
|
||||
already checked for the files in question, so the number of backend requests
|
||||
is reduced a lot.
|
||||
|
||||
https://github.com/restic/restic/issues/989
|
||||
https://github.com/restic/restic/pull/993
|
||||
4
changelog/0.7.0/pull-975
Normal file
4
changelog/0.7.0/pull-975
Normal file
@@ -0,0 +1,4 @@
|
||||
Enhancement: Add new backend for OpenStack Swift
|
||||
|
||||
https://github.com/restic/restic/pull/975
|
||||
https://github.com/restic/restic/pull/648
|
||||
5
changelog/0.7.0/pull-998
Normal file
5
changelog/0.7.0/pull-998
Normal file
@@ -0,0 +1,5 @@
|
||||
Enhancement: Improve performance of the fuse mount
|
||||
|
||||
Listing directories which contain large files now is significantly faster.
|
||||
|
||||
https://github.com/restic/restic/pull/998
|
||||
10
changelog/0.7.1/issue-1055
Normal file
10
changelog/0.7.1/issue-1055
Normal file
@@ -0,0 +1,10 @@
|
||||
Enhancement: Create subdirs below `data/` for local/sftp backends
|
||||
|
||||
The local and sftp backends now create the subdirs below `data/` on
|
||||
open/init. This way, restic makes sure that they always exist. This is
|
||||
connected to an issue for the sftp server:
|
||||
|
||||
https://github.com/restic/rest-server/pull/11#issuecomment-309879710
|
||||
https://github.com/restic/restic/issues/1055
|
||||
https://github.com/restic/restic/pull/1077
|
||||
https://github.com/restic/restic/pull/1105
|
||||
8
changelog/0.7.1/issue-1067
Normal file
8
changelog/0.7.1/issue-1067
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Allow loading credentials for s3 from IAM
|
||||
|
||||
When no S3 credentials are specified in the environment variables, restic
|
||||
now tries to load credentials from an IAM instance profile when the s3
|
||||
backend is used.
|
||||
|
||||
https://github.com/restic/restic/issues/1067
|
||||
https://github.com/restic/restic/pull/1086
|
||||
8
changelog/0.7.1/issue-1073
Normal file
8
changelog/0.7.1/issue-1073
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Add `migrate` cmd to migrate from `s3legacy` to `default` layout
|
||||
|
||||
The `migrate` command for chaning the `s3legacy` layout to the `default` layout
|
||||
for s3 backends has been improved: It can now be restarted with `restic migrate
|
||||
--force s3_layout` and automatically retries operations on error.
|
||||
|
||||
https://github.com/restic/restic/issues/1073
|
||||
https://github.com/restic/restic/pull/1075
|
||||
4
changelog/0.7.1/issue-1081
Normal file
4
changelog/0.7.1/issue-1081
Normal file
@@ -0,0 +1,4 @@
|
||||
Enhancement: Clarify semantic for `--tasg` for the `forget` command
|
||||
|
||||
https://github.com/restic/restic/issues/1081
|
||||
https://github.com/restic/restic/pull/1090
|
||||
5
changelog/0.7.1/plul-1080
Normal file
5
changelog/0.7.1/plul-1080
Normal file
@@ -0,0 +1,5 @@
|
||||
Enhancement: Ignore chmod() errors on filesystems which do not support it
|
||||
|
||||
https://github.com/restic/restic/pull/1080
|
||||
https://github.com/restic/restic/pull/1112
|
||||
|
||||
3
changelog/0.7.1/pull-1082
Normal file
3
changelog/0.7.1/pull-1082
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Print stats on SIGINFO on Darwin and FreeBSD (ctrl+t)
|
||||
|
||||
https://github.com/restic/restic/pull/1082
|
||||
9
changelog/0.7.1/pull-1115
Normal file
9
changelog/0.7.1/pull-1115
Normal file
@@ -0,0 +1,9 @@
|
||||
Bugfix: Fix `prune`, only include existing files in indexes
|
||||
|
||||
A bug was found (and corrected) in the index rebuilding after prune, which led
|
||||
to indexes which include blobs that were not present in the repo any more.
|
||||
There were already checks in place which detected this situation and aborted
|
||||
with an error message. A new run of either `prune` or `rebuild-index` corrected
|
||||
the index files. This is now fixed and a test has been added to detect this.
|
||||
|
||||
https://github.com/restic/restic/pull/1115
|
||||
8
changelog/0.7.2/issue-1132
Normal file
8
changelog/0.7.2/issue-1132
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Make `key` command always prompt for a password
|
||||
|
||||
The `key` command now prompts for a password even if the original password
|
||||
to access a repo has been specified via the `RESTIC_PASSWORD` environment
|
||||
variable or a password file.
|
||||
|
||||
https://github.com/restic/restic/issues/1132
|
||||
https://github.com/restic/restic/pull/1133
|
||||
8
changelog/0.7.2/issue-1167
Normal file
8
changelog/0.7.2/issue-1167
Normal file
@@ -0,0 +1,8 @@
|
||||
Bugfix: Do not create a local repo unless `init` is used
|
||||
|
||||
When a restic command other than `init` is used with a local repository and the
|
||||
repository directory does not exist, restic creates the directory structure.
|
||||
That's an error, only the `init` command should create the dir.
|
||||
|
||||
https://github.com/restic/restic/issues/1167
|
||||
https://github.com/restic/restic/pull/1182
|
||||
4
changelog/0.7.2/issue-1179
Normal file
4
changelog/0.7.2/issue-1179
Normal file
@@ -0,0 +1,4 @@
|
||||
Enhancement: Resolve name conflicts, append a counter
|
||||
|
||||
https://github.com/restic/restic/issues/1179
|
||||
https://github.com/restic/restic/pull/1209
|
||||
7
changelog/0.7.2/issue-1208
Normal file
7
changelog/0.7.2/issue-1208
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Add `--compact` to `snapshots` command
|
||||
|
||||
The option `--compact` was added to the `snapshots` command to get a better
|
||||
overview of the snapshots in a repo. It limits each snapshot to a single line.
|
||||
|
||||
https://github.com/restic/restic/issues/1218
|
||||
https://github.com/restic/restic/pull/1223
|
||||
10
changelog/0.7.2/issue-317
Normal file
10
changelog/0.7.2/issue-317
Normal file
@@ -0,0 +1,10 @@
|
||||
Enhancement: Add `--exclude-caches` and `--exclude-if-present`
|
||||
|
||||
A new option `--exclude-caches` was added that allows excluding cache
|
||||
directories (that are tagged as such). This is a special case of a more generic
|
||||
option `--exclude-if-present` which excludes a directory if a file with a
|
||||
specific name (and contents) is present.
|
||||
|
||||
https://github.com/restic/restic/issues/317
|
||||
https://github.com/restic/restic/pull/1170
|
||||
https://github.com/restic/restic/pull/1224
|
||||
4
changelog/0.7.2/issues-697
Normal file
4
changelog/0.7.2/issues-697
Normal file
@@ -0,0 +1,4 @@
|
||||
Enhancement: Automatically generate man pages for all restic commands
|
||||
|
||||
https://github.com/restic/restic/issues/697
|
||||
https://github.com/restic/restic/pull/1147
|
||||
3
changelog/0.7.2/pull-1044
Normal file
3
changelog/0.7.2/pull-1044
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Improve `restore`, do not traverse/load excluded directories
|
||||
|
||||
https://github.com/restic/restic/pull/1044
|
||||
3
changelog/0.7.2/pull-1061
Normal file
3
changelog/0.7.2/pull-1061
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Add Dockerfile and official Docker image
|
||||
|
||||
https://github.com/restic/restic/pull/1061
|
||||
7
changelog/0.7.2/pull-1126
Normal file
7
changelog/0.7.2/pull-1126
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Use the standard Go git repository layout, use `dep` for vendoring
|
||||
|
||||
The git repository layout was changed to resemble the layout typically used in
|
||||
Go projects, we're not using `gb` for building restic any more and vendoring
|
||||
the dependencies is now taken care of by `dep`.
|
||||
|
||||
https://github.com/restic/restic/pull/1126
|
||||
5
changelog/0.7.2/pull-1134
Normal file
5
changelog/0.7.2/pull-1134
Normal file
@@ -0,0 +1,5 @@
|
||||
Enhancement: Add support for storing backups on Google Cloud Storage
|
||||
|
||||
https://github.com/restic/restic/pull/1134
|
||||
https://github.com/restic/restic/pull/1052
|
||||
https://github.com/restic/restic/issues/211
|
||||
3
changelog/0.7.2/pull-1144
Normal file
3
changelog/0.7.2/pull-1144
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Properly report errors when reading files with exclude patterns.
|
||||
|
||||
https://github.com/restic/restic/pull/1144
|
||||
8
changelog/0.7.2/pull-1149
Normal file
8
changelog/0.7.2/pull-1149
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Add support for storing backups on Microsoft Azure Blob Storage
|
||||
|
||||
The library we're using to access the service requires Go 1.8, so restic now
|
||||
needs at least Go 1.8.
|
||||
|
||||
https://github.com/restic/restic/pull/1149
|
||||
https://github.com/restic/restic/pull/1059
|
||||
https://github.com/restic/restic/issues/609
|
||||
3
changelog/0.7.2/pull-1164
Normal file
3
changelog/0.7.2/pull-1164
Normal file
@@ -0,0 +1,3 @@
|
||||
Bugfix: Make the `key remove` command behave as documented
|
||||
|
||||
https://github.com/restic/restic/pull/1164
|
||||
8
changelog/0.7.2/pull-1191
Normal file
8
changelog/0.7.2/pull-1191
Normal file
@@ -0,0 +1,8 @@
|
||||
Bugfix: Make sure to write profiling files on interrupt
|
||||
|
||||
Since a few releases restic had the ability to write profiling files for memory
|
||||
and CPU usage when `debug` is enabled. It was discovered that when restic is
|
||||
interrupted (ctrl+c is pressed), the proper shutdown hook is not run. This is
|
||||
now corrected.
|
||||
|
||||
https://github.com/restic/restic/pull/1191
|
||||
3
changelog/0.7.2/pull-1196
Normal file
3
changelog/0.7.2/pull-1196
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Add `--group-by` to `forget` command for flexible grouping
|
||||
|
||||
https://github.com/restic/restic/pull/1196
|
||||
5
changelog/0.7.2/pull-1203
Normal file
5
changelog/0.7.2/pull-1203
Normal file
@@ -0,0 +1,5 @@
|
||||
Enhancement: Print stats on all BSD systems when SIGINFO (ctrl+t) is received
|
||||
|
||||
https://github.com/restic/restic/pull/1203
|
||||
https://github.com/restic/restic/pull/1082#issuecomment-326279920
|
||||
|
||||
3
changelog/0.7.2/pull-1205
Normal file
3
changelog/0.7.2/pull-1205
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Allow specifying time/date for a backup with `--time`
|
||||
|
||||
https://github.com/restic/restic/pull/1205
|
||||
9
changelog/0.7.3/issue-1246
Normal file
9
changelog/0.7.3/issue-1246
Normal file
@@ -0,0 +1,9 @@
|
||||
Bugfix: List all files stored in Google Cloud Storage
|
||||
|
||||
For large backups stored in Google Cloud Storage, the `prune` command fails
|
||||
because listing only returns the first 1000 files. This has been corrected, no
|
||||
data is lost in the process. In addition, a plausibility check was added to
|
||||
`prune`.
|
||||
|
||||
https://github.com/restic/restic/issues/1246
|
||||
https://github.com/restic/restic/pull/1247
|
||||
9
changelog/0.8.0/issue-1102
Normal file
9
changelog/0.8.0/issue-1102
Normal file
@@ -0,0 +1,9 @@
|
||||
Enhancement: Add subdirectory `ids` to fuse mount
|
||||
|
||||
The fuse mount now has an `ids` subdirectory which contains the snapshots below
|
||||
their (short) IDs.
|
||||
|
||||
https://github.com/restic/restic/issues/1102
|
||||
https://github.com/restic/restic/pull/1299
|
||||
https://github.com/restic/restic/pull/1320
|
||||
|
||||
10
changelog/0.8.0/issue-1114
Normal file
10
changelog/0.8.0/issue-1114
Normal file
@@ -0,0 +1,10 @@
|
||||
Enhancement: Add `--cacert` to specify TLS certificates to check against
|
||||
|
||||
We've added the `--cacert` option which can be used to pass one (or more) CA
|
||||
certificates to restic. These are used in addition to the system CA
|
||||
certificates to verify HTTPS certificates (e.g. for the REST backend).
|
||||
|
||||
https://github.com/restic/restic/issues/1114
|
||||
https://github.com/restic/restic/pull/1276
|
||||
|
||||
|
||||
9
changelog/0.8.0/issue-1216
Normal file
9
changelog/0.8.0/issue-1216
Normal file
@@ -0,0 +1,9 @@
|
||||
Enhancement: Add upload/download limiting
|
||||
|
||||
We've added support for rate limiting through `--limit-upload` and
|
||||
`--limit-download` flags.
|
||||
|
||||
https://github.com/restic/restic/issues/1216
|
||||
https://github.com/restic/restic/pull/1336
|
||||
https://github.com/restic/restic/pull/1358
|
||||
|
||||
7
changelog/0.8.0/issue-1256
Normal file
7
changelog/0.8.0/issue-1256
Normal file
@@ -0,0 +1,7 @@
|
||||
Bugfix: Re-enable workaround for S3 backend
|
||||
|
||||
We've re-enabled a workaround for `minio-go` (the library we're using to
|
||||
access s3 backends), this reduces memory usage.
|
||||
|
||||
https://github.com/restic/restic/issues/1256
|
||||
https://github.com/restic/restic/pull/1267
|
||||
6
changelog/0.8.0/issue-1271
Normal file
6
changelog/0.8.0/issue-1271
Normal file
@@ -0,0 +1,6 @@
|
||||
Enhancement: Cache results for excludes for `backup`
|
||||
|
||||
The `backup` command now caches the result of excludes for a directory.
|
||||
|
||||
https://github.com/restic/restic/issues/1271
|
||||
https://github.com/restic/restic/pull/1326
|
||||
9
changelog/0.8.0/issue-1274
Normal file
9
changelog/0.8.0/issue-1274
Normal file
@@ -0,0 +1,9 @@
|
||||
Enhancement: Add `generate` command, replaces `manpage` and `autocomplete`
|
||||
|
||||
The `generate` command has been added, which replaces the now removed
|
||||
commands `manpage` and `autocomplete`. This release of restic contains the
|
||||
most recent manpages in `doc/man` and the auto-completion files for bash and
|
||||
zsh in `doc/bash-completion.sh` and `doc/zsh-completion.zsh`
|
||||
|
||||
https://github.com/restic/restic/issues/1274
|
||||
https://github.com/restic/restic/pull/1282
|
||||
8
changelog/0.8.0/issue-1291
Normal file
8
changelog/0.8.0/issue-1291
Normal file
@@ -0,0 +1,8 @@
|
||||
Bugfix: Reuse backend TCP connections to BackBlaze B2
|
||||
|
||||
A bug was discovered in the library we're using to access Backblaze, it now
|
||||
reuses already established TCP connections which should be a lot faster and
|
||||
not cause network failures any more.
|
||||
|
||||
https://github.com/restic/restic/issues/1291
|
||||
https://github.com/restic/restic/pull/1301
|
||||
7
changelog/0.8.0/issue-1367
Normal file
7
changelog/0.8.0/issue-1367
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Allow comments in files read from via `--file-from`
|
||||
|
||||
When the list of files/dirs to be saved is read from a file with
|
||||
`--files-from`, comment lines (starting with `#`) are now ignored.
|
||||
|
||||
https://github.com/restic/restic/issues/1367
|
||||
https://github.com/restic/restic/pull/1368
|
||||
18
changelog/0.8.0/issue-1445
Normal file
18
changelog/0.8.0/issue-1445
Normal file
@@ -0,0 +1,18 @@
|
||||
Security: Prevent writing outside the target directory during restore
|
||||
|
||||
A vulnerability was found in the restic restorer, which allowed attackers in
|
||||
special circumstances to restore files to a location outside of the target
|
||||
directory. Due to the circumstances we estimate this to be a low-risk
|
||||
vulnerability, but urge all users to upgrade to the latest version of restic.
|
||||
|
||||
Exploiting the vulnerability requires a Linux/Unix system which saves backups
|
||||
via restic and a Windows systems which restores files from the repo. In
|
||||
addition, the attackers need to be able to create create files with arbitrary
|
||||
names which are then saved to the restic repo. For example, by creating a file
|
||||
named "..\test.txt" (which is a perfectly legal filename on Linux) and
|
||||
restoring a snapshot containing this file on Windows, it would be written to
|
||||
the parent of the target directory.
|
||||
|
||||
We'd like to thank Tyler Spivey for reporting this responsibly!
|
||||
|
||||
https://github.com/restic/restic/pull/1445
|
||||
9
changelog/0.8.0/issue-448
Normal file
9
changelog/0.8.0/issue-448
Normal file
@@ -0,0 +1,9 @@
|
||||
Enhancement: sftp backend prompts for password
|
||||
|
||||
The sftp backend now prompts for the password if a password is necessary for
|
||||
login.
|
||||
|
||||
https://github.com/restic/restic/issues/448
|
||||
https://github.com/restic/restic/pull/1270
|
||||
|
||||
|
||||
7
changelog/0.8.0/issue-510
Normal file
7
changelog/0.8.0/issue-510
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Add `dump` command
|
||||
|
||||
We've added the `dump` command which prints a file from a snapshot to
|
||||
stdout. This can e.g. be used to restore files read with `backup --stdin`.
|
||||
|
||||
https://github.com/restic/restic/issues/510
|
||||
https://github.com/restic/restic/pull/1346
|
||||
23
changelog/0.8.0/pull-1040
Normal file
23
changelog/0.8.0/pull-1040
Normal file
@@ -0,0 +1,23 @@
|
||||
Enhancement: Add local metadata cache
|
||||
|
||||
We've added a local cache for metadata so that restic doesn't need to load
|
||||
all metadata (snapshots, indexes, ...) from the repo each time it starts. By
|
||||
default the cache is active, but there's a new global option `--no-cache`
|
||||
that can be used to disable the cache. By deafult, the cache a standard
|
||||
cache folder for the OS, which can be overridden with `--cache-dir`. The
|
||||
cache will automatically populate, indexes and snapshots are saved as they
|
||||
are loaded. Cache directories for repos that haven't been used recently can
|
||||
automatically be removed by restic with the `--cleanup-cache` option.
|
||||
|
||||
A related change was to by default create pack files in the repo that contain
|
||||
either data or metadata, not both mixed together. This allows easy caching of
|
||||
only the metadata files. The next run of `restic prune` will untangle mixed
|
||||
files automatically.
|
||||
|
||||
https://github.com/restic/restic/pull/1040
|
||||
https://github.com/restic/restic/issues/29
|
||||
https://github.com/restic/restic/issues/738
|
||||
https://github.com/restic/restic/issues/282
|
||||
https://github.com/restic/restic/pull/1287
|
||||
https://github.com/restic/restic/pull/1436
|
||||
https://github.com/restic/restic/pull/1265
|
||||
6
changelog/0.8.0/pull-1249
Normal file
6
changelog/0.8.0/pull-1249
Normal file
@@ -0,0 +1,6 @@
|
||||
Enhancement: Add `latest` symlink in fuse mount
|
||||
|
||||
The directory structure in the fuse mount now exposes a symlink `latest`
|
||||
which points to the latest snapshot in that particular directory.
|
||||
|
||||
https://github.com/restic/restic/pull/1249
|
||||
6
changelog/0.8.0/pull-1269
Normal file
6
changelog/0.8.0/pull-1269
Normal file
@@ -0,0 +1,6 @@
|
||||
Enhancement: Add `--compact` to `forget` command
|
||||
|
||||
The option `--compact` was added to the `forget` command to provide the same
|
||||
compact view as the `snapshots` command.
|
||||
|
||||
https://github.com/restic/restic/pull/1269
|
||||
7
changelog/0.8.0/pull-1281
Normal file
7
changelog/0.8.0/pull-1281
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Google Cloud Storage backend needs less permissions
|
||||
|
||||
The Google Cloud Storage backend no longer requires the service account to
|
||||
have the `storage.buckets.get` permission ("Storage Admin" role) in `restic
|
||||
init` if the bucket already exists.
|
||||
|
||||
https://github.com/restic/restic/pull/1281
|
||||
7
changelog/0.8.0/pull-1317
Normal file
7
changelog/0.8.0/pull-1317
Normal file
@@ -0,0 +1,7 @@
|
||||
Bugfix: Run prune when `forget --prune` is called with just snapshot IDs
|
||||
|
||||
A bug in the `forget` command caused `prune` not to be run when `--prune` was
|
||||
specified without a policy, e.g. when only snapshot IDs that should be
|
||||
forgotten are listed manually.
|
||||
|
||||
https://github.com/restic/restic/pull/1317
|
||||
8
changelog/0.8.0/pull-1319
Normal file
8
changelog/0.8.0/pull-1319
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Make `check` print `no errors found` explicitly
|
||||
|
||||
The `check` command now explicetly prints `No errors were found` when no errors
|
||||
could be found.
|
||||
|
||||
https://github.com/restic/restic/pull/1319
|
||||
https://github.com/restic/restic/issues/1303
|
||||
|
||||
3
changelog/0.8.0/pull-1353
Normal file
3
changelog/0.8.0/pull-1353
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Retry failed backend requests
|
||||
|
||||
https://github.com/restic/restic/pull/1353
|
||||
10
changelog/0.8.0/pull-1437
Normal file
10
changelog/0.8.0/pull-1437
Normal file
@@ -0,0 +1,10 @@
|
||||
Bugfix: Remove implicit path `/restic` for the s3 backend
|
||||
|
||||
The s3 backend used the subdir `restic` within a bucket if no explicit path
|
||||
after the bucket name was specified. Since this version, restic does not use
|
||||
this default path any more. If you created a repo on s3 in a bucket without
|
||||
specifying a path within the bucket, you need to add `/restic` at the end of
|
||||
the repository specification to access your repo: `s3:s3.amazonaws.com/bucket/restic`
|
||||
|
||||
https://github.com/restic/restic/pull/1437
|
||||
https://github.com/restic/restic/issues/1292
|
||||
4
changelog/0.8.1/issue-1457
Normal file
4
changelog/0.8.1/issue-1457
Normal file
@@ -0,0 +1,4 @@
|
||||
Bugfix: Improve s3 backend with DigitalOcean Spaces
|
||||
|
||||
https://github.com/restic/restic/issues/1457
|
||||
https://github.com/restic/restic/pull/1459
|
||||
9
changelog/0.8.1/pull-1436
Normal file
9
changelog/0.8.1/pull-1436
Normal file
@@ -0,0 +1,9 @@
|
||||
Enhancement: Add code to detect old cache directories
|
||||
|
||||
We've added code to detect old cache directories of repositories that
|
||||
haven't been used in a long time, restic now prints a note when it detects
|
||||
that such dirs exist. Also, the option `--cleanup-cache` was added to
|
||||
automatically remove such directories. That's not a problem because the
|
||||
cache will be rebuild once a repo is accessed again.
|
||||
|
||||
https://github.com/restic/restic/pull/1436
|
||||
6
changelog/0.8.1/pull-1439
Normal file
6
changelog/0.8.1/pull-1439
Normal file
@@ -0,0 +1,6 @@
|
||||
Enhancement: Improve cancellation logic
|
||||
|
||||
The cancellation logic was improved, restic can now shut down cleanly when
|
||||
requested to do so (e.g. via ctrl+c).
|
||||
|
||||
https://github.com/restic/restic/pull/1439
|
||||
9
changelog/0.8.1/pull-1452
Normal file
9
changelog/0.8.1/pull-1452
Normal file
@@ -0,0 +1,9 @@
|
||||
Change: Do not save atime by default
|
||||
|
||||
By default, the access time for files and dirs is not saved any more. It is
|
||||
not possible to reliably disable updating the access time during a backup,
|
||||
so for the next backup the access time is different again. This means a lot
|
||||
of metadata is saved. If you want to save the access time anyway, pass
|
||||
`--with-atime` to the `backup` command.
|
||||
|
||||
https://github.com/restic/restic/pull/1452
|
||||
6
changelog/0.8.1/pull-1454
Normal file
6
changelog/0.8.1/pull-1454
Normal file
@@ -0,0 +1,6 @@
|
||||
Bugfix: Correct cache dir location for Windows and Darwin
|
||||
|
||||
The cache directory on Windows and Darwin was not correct, instead the
|
||||
directory `.cache` was used.
|
||||
|
||||
https://github.com/restic/restic/pull/1454
|
||||
9
changelog/0.8.1/pull-1459
Normal file
9
changelog/0.8.1/pull-1459
Normal file
@@ -0,0 +1,9 @@
|
||||
Bugfix: Disable handling SIGPIPE
|
||||
|
||||
We've disabled handling SIGPIPE again. Turns out, writing to broken TCP
|
||||
connections also raised SIGPIPE, so restic exits on the first write to a
|
||||
broken connection. Instead, restic should retry the request.
|
||||
|
||||
https://github.com/restic/restic/pull/1459
|
||||
https://github.com/restic/restic/issues/1457
|
||||
https://github.com/restic/restic/issues/1466
|
||||
8
changelog/0.8.1/pull-1462
Normal file
8
changelog/0.8.1/pull-1462
Normal file
@@ -0,0 +1,8 @@
|
||||
Enhancement: Add the `diff` command
|
||||
|
||||
The command `diff` was added, it allows comparing two snapshots and listing
|
||||
all differences.
|
||||
|
||||
https://github.com/restic/restic/issues/11
|
||||
https://github.com/restic/restic/issues/1460
|
||||
https://github.com/restic/restic/pull/1462
|
||||
4
changelog/0.8.2/issue-1506
Normal file
4
changelog/0.8.2/issue-1506
Normal file
@@ -0,0 +1,4 @@
|
||||
Bugfix: Limit bandwith at the http.RoundTripper for HTTP based backends
|
||||
|
||||
https://github.com/restic/restic/issues/1506
|
||||
https://github.com/restic/restic/pull/1511
|
||||
9
changelog/0.8.2/issue-1512
Normal file
9
changelog/0.8.2/issue-1512
Normal file
@@ -0,0 +1,9 @@
|
||||
Bugfix: Restore directory permissions as the last step
|
||||
|
||||
This change allows restoring into directories that were not writable during
|
||||
backup. Before, restic created the directory, set the read-only mode and then
|
||||
failed to create files in the directory. This change now restores the directory
|
||||
(with its permissions) as the very last step.
|
||||
|
||||
https://github.com/restic/restic/issues/1512
|
||||
https://github.com/restic/restic/pull/1536
|
||||
4
changelog/0.8.2/issue-1528
Normal file
4
changelog/0.8.2/issue-1528
Normal file
@@ -0,0 +1,4 @@
|
||||
Bugfix: Correctly create missing subdirs in data/
|
||||
|
||||
https://github.com/restic/restic/issues/1528
|
||||
https://github.com/restic/restic/pull/1529
|
||||
3
changelog/0.8.2/pull-1507
Normal file
3
changelog/0.8.2/pull-1507
Normal file
@@ -0,0 +1,3 @@
|
||||
Enhancement: Only reload snapshots once per minute for fuse mount
|
||||
|
||||
https://github.com/restic/restic/pull/1507
|
||||
7
changelog/0.8.2/pull-1538
Normal file
7
changelog/0.8.2/pull-1538
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: Reduce memory allocations for querying the index
|
||||
|
||||
This change reduces the internal memory allocations when the index data
|
||||
structures in memory are queried if a blob (part of a file) already exists in
|
||||
the repo. It should speed up backup a bit, and maybe even reduce RAM usage.
|
||||
|
||||
https://github.com/restic/restic/pull/1538
|
||||
7
changelog/0.8.2/pull-1554
Normal file
7
changelog/0.8.2/pull-1554
Normal file
@@ -0,0 +1,7 @@
|
||||
Enhancement: fuse/mount: Correctly handle EOF, add template option
|
||||
|
||||
We've added the `--snapshot-template` string, which can be used to specify a
|
||||
template for a snapshot directory. In addition, accessing data after the end of
|
||||
a file via the fuse mount is now handled correctly.
|
||||
|
||||
https://github.com/restic/restic/pull/1554
|
||||
32
changelog/CHANGELOG.tmpl
Normal file
32
changelog/CHANGELOG.tmpl
Normal file
@@ -0,0 +1,32 @@
|
||||
{{- range $changes := . }}{{ with $changes -}}
|
||||
Changelog for restic {{ .Version }} ({{ .Date }})
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic {{ .Version }} relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
{{ range $entry := .Entries }}{{ with $entry }}
|
||||
* {{ .TypeShort }} #{{ .PrimaryID }}: {{ .Title }}
|
||||
{{- end }}{{ end }}
|
||||
|
||||
Details
|
||||
-------
|
||||
{{ range $entry := .Entries }}{{ with $entry }}
|
||||
* {{ .Type }} #{{ .PrimaryID }}: {{ .Title }}
|
||||
{{ range $par := .Paragraphs }}
|
||||
{{ wrap $par 80 3 }}
|
||||
{{ end -}}
|
||||
{{ range $id := .Issues }}
|
||||
https://github.com/restic/restic/issues/{{ $id -}}
|
||||
{{ end -}}
|
||||
{{ range $id := .PRs }}
|
||||
https://github.com/restic/restic/pull/{{ $id -}}
|
||||
{{ end -}}
|
||||
{{ range $url := .OtherURLs }}
|
||||
{{ $url -}}
|
||||
{{ end }}
|
||||
{{ end }}{{ end }}
|
||||
|
||||
{{ end }}{{ end -}}
|
||||
12
changelog/changelog-entry.tmpl
Normal file
12
changelog/changelog-entry.tmpl
Normal file
@@ -0,0 +1,12 @@
|
||||
Bugfix: Fix behavior for foobar (in present tense)
|
||||
|
||||
We've fixed the behavior for foobar, a long-standing annoyance for restic
|
||||
users.
|
||||
|
||||
The text in the paragraphs is written in past tense. The last section is a list
|
||||
of issue URLs, PR URLs and other URLs. The first issue ID (or the first PR ID,
|
||||
in case there aren't any issue links) is used as the primary ID.
|
||||
|
||||
https://github.com/restic/restic/issues/1234
|
||||
https://github.com/restic/restic/pull/55555
|
||||
https://forum.restic/.net/foo/bar/baz
|
||||
32
changelog/changelog-github.tmpl
Normal file
32
changelog/changelog-github.tmpl
Normal file
@@ -0,0 +1,32 @@
|
||||
{{- range $changes := . }}{{ with $changes -}}
|
||||
Changelog for restic {{ .Version }} ({{ .Date }})
|
||||
=======================================
|
||||
|
||||
The following sections list the changes in restic {{ .Version }} relevant to
|
||||
restic users. The changes are ordered by importance.
|
||||
|
||||
Summary
|
||||
-------
|
||||
{{ range $entry := .Entries }}{{ with $entry }}
|
||||
* {{ .TypeShort }} [#{{ .PrimaryID }}]({{ .PrimaryURL }}): {{ .Title }}
|
||||
{{- end }}{{ end }}
|
||||
|
||||
Details
|
||||
-------
|
||||
{{ range $entry := .Entries }}{{ with $entry }}
|
||||
* {{ .Type }} #{{ .PrimaryID }}: {{ .Title }}
|
||||
{{ range $par := .Paragraphs }}
|
||||
{{ $par }}
|
||||
{{ end }}
|
||||
{{ range $id := .Issues -}}
|
||||
{{ ` ` }}[#{{ $id }}](https://github.com/restic/restic/issues/{{ $id -}})
|
||||
{{- end -}}
|
||||
{{ range $id := .PRs -}}
|
||||
{{ ` ` }}[#{{ $id }}](https://github.com/restic/restic/pull/{{ $id -}})
|
||||
{{- end -}}
|
||||
{{ ` ` }}{{ range $url := .OtherURLs -}}
|
||||
{{ $url -}}
|
||||
{{- end }}
|
||||
{{ end }}{{ end }}
|
||||
|
||||
{{ end }}{{ end -}}
|
||||
14
changelog/releases
Normal file
14
changelog/releases
Normal file
@@ -0,0 +1,14 @@
|
||||
# This file lists all versions for the changelog. Each line consists of the
|
||||
# version string, followed by an optional release date.
|
||||
#
|
||||
# The resulting changelog generated by `calens` will list all versions in
|
||||
# exactly this order.
|
||||
0.8.2
|
||||
0.8.1 2017-12-27
|
||||
0.8.0 2017-11-26
|
||||
0.7.3 2017-09-20
|
||||
0.7.2 2017-09-13
|
||||
0.7.1 2017-07-22
|
||||
0.7.0 2017-07-01
|
||||
0.6.1 2017-06-01
|
||||
0.6.0 2017-05-29
|
||||
9
cmd/restic/background.go
Normal file
9
cmd/restic/background.go
Normal file
@@ -0,0 +1,9 @@
|
||||
// +build !linux
|
||||
|
||||
package main
|
||||
|
||||
// IsProcessBackground should return true if it is running in the background or false if not
|
||||
func IsProcessBackground() bool {
|
||||
//TODO: Check if the process are running in the background in other OS than linux
|
||||
return false
|
||||
}
|
||||
21
cmd/restic/background_linux.go
Normal file
21
cmd/restic/background_linux.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/restic/restic/internal/debug"
|
||||
)
|
||||
|
||||
// IsProcessBackground returns true if it is running in the background or false if not
|
||||
func IsProcessBackground() bool {
|
||||
var pid int
|
||||
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdin), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&pid)))
|
||||
|
||||
if err != 0 {
|
||||
debug.Log("Can't check if we are in the background. Using default behaviour. Error: %s\n", err.Error())
|
||||
return false
|
||||
}
|
||||
|
||||
return pid != syscall.Getpgrp()
|
||||
}
|
||||
90
cmd/restic/cleanup.go
Normal file
90
cmd/restic/cleanup.go
Normal file
@@ -0,0 +1,90 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"github.com/restic/restic/internal/debug"
|
||||
)
|
||||
|
||||
var cleanupHandlers struct {
|
||||
sync.Mutex
|
||||
list []func() error
|
||||
done bool
|
||||
ch chan os.Signal
|
||||
}
|
||||
|
||||
var stderr = os.Stderr
|
||||
|
||||
func init() {
|
||||
cleanupHandlers.ch = make(chan os.Signal)
|
||||
go CleanupHandler(cleanupHandlers.ch)
|
||||
InstallSignalHandler()
|
||||
}
|
||||
|
||||
// InstallSignalHandler listens for SIGINT, and triggers the cleanup handlers.
|
||||
func InstallSignalHandler() {
|
||||
signal.Notify(cleanupHandlers.ch, syscall.SIGINT)
|
||||
}
|
||||
|
||||
// SuspendSignalHandler removes the signal handler for SIGINT.
|
||||
func SuspendSignalHandler() {
|
||||
signal.Reset(syscall.SIGINT)
|
||||
}
|
||||
|
||||
// AddCleanupHandler adds the function f to the list of cleanup handlers so
|
||||
// that it is executed when all the cleanup handlers are run, e.g. when SIGINT
|
||||
// is received.
|
||||
func AddCleanupHandler(f func() error) {
|
||||
cleanupHandlers.Lock()
|
||||
defer cleanupHandlers.Unlock()
|
||||
|
||||
// reset the done flag for integration tests
|
||||
cleanupHandlers.done = false
|
||||
|
||||
cleanupHandlers.list = append(cleanupHandlers.list, f)
|
||||
}
|
||||
|
||||
// RunCleanupHandlers runs all registered cleanup handlers
|
||||
func RunCleanupHandlers() {
|
||||
cleanupHandlers.Lock()
|
||||
defer cleanupHandlers.Unlock()
|
||||
|
||||
if cleanupHandlers.done {
|
||||
return
|
||||
}
|
||||
cleanupHandlers.done = true
|
||||
|
||||
for _, f := range cleanupHandlers.list {
|
||||
err := f()
|
||||
if err != nil {
|
||||
fmt.Fprintf(stderr, "error in cleanup handler: %v\n", err)
|
||||
}
|
||||
}
|
||||
cleanupHandlers.list = nil
|
||||
}
|
||||
|
||||
// CleanupHandler handles the SIGINT signals.
|
||||
func CleanupHandler(c <-chan os.Signal) {
|
||||
for s := range c {
|
||||
debug.Log("signal %v received, cleaning up", s)
|
||||
fmt.Fprintf(stderr, "%ssignal %v received, cleaning up\n", ClearLine(), s)
|
||||
|
||||
code := 0
|
||||
if s != syscall.SIGINT {
|
||||
code = 1
|
||||
}
|
||||
|
||||
Exit(code)
|
||||
}
|
||||
}
|
||||
|
||||
// Exit runs the cleanup handlers and then terminates the process with the
|
||||
// given exit code.
|
||||
func Exit(code int) {
|
||||
RunCleanupHandlers()
|
||||
os.Exit(code)
|
||||
}
|
||||
528
cmd/restic/cmd_backup.go
Normal file
528
cmd/restic/cmd_backup.go
Normal file
@@ -0,0 +1,528 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"github.com/restic/restic/internal/archiver"
|
||||
"github.com/restic/restic/internal/debug"
|
||||
"github.com/restic/restic/internal/errors"
|
||||
"github.com/restic/restic/internal/fs"
|
||||
"github.com/restic/restic/internal/restic"
|
||||
)
|
||||
|
||||
var cmdBackup = &cobra.Command{
|
||||
Use: "backup [flags] FILE/DIR [FILE/DIR] ...",
|
||||
Short: "Create a new backup of files and/or directories",
|
||||
Long: `
|
||||
The "backup" command creates a new snapshot and saves the files and directories
|
||||
given as the arguments.
|
||||
`,
|
||||
PreRun: func(cmd *cobra.Command, args []string) {
|
||||
if backupOptions.Hostname == "" {
|
||||
hostname, err := os.Hostname()
|
||||
if err != nil {
|
||||
debug.Log("os.Hostname() returned err: %v", err)
|
||||
return
|
||||
}
|
||||
backupOptions.Hostname = hostname
|
||||
}
|
||||
},
|
||||
DisableAutoGenTag: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if backupOptions.Stdin && backupOptions.FilesFrom == "-" {
|
||||
return errors.Fatal("cannot use both `--stdin` and `--files-from -`")
|
||||
}
|
||||
|
||||
if backupOptions.Stdin {
|
||||
return readBackupFromStdin(backupOptions, globalOptions, args)
|
||||
}
|
||||
|
||||
return runBackup(backupOptions, globalOptions, args)
|
||||
},
|
||||
}
|
||||
|
||||
// BackupOptions bundles all options for the backup command.
|
||||
type BackupOptions struct {
|
||||
Parent string
|
||||
Force bool
|
||||
Excludes []string
|
||||
ExcludeFiles []string
|
||||
ExcludeOtherFS bool
|
||||
ExcludeIfPresent []string
|
||||
ExcludeCaches bool
|
||||
Stdin bool
|
||||
StdinFilename string
|
||||
Tags []string
|
||||
Hostname string
|
||||
FilesFrom string
|
||||
TimeStamp string
|
||||
WithAtime bool
|
||||
}
|
||||
|
||||
var backupOptions BackupOptions
|
||||
|
||||
func init() {
|
||||
cmdRoot.AddCommand(cmdBackup)
|
||||
|
||||
f := cmdBackup.Flags()
|
||||
f.StringVar(&backupOptions.Parent, "parent", "", "use this parent snapshot (default: last snapshot in the repo that has the same target files/directories)")
|
||||
f.BoolVarP(&backupOptions.Force, "force", "f", false, `force re-reading the target files/directories (overrides the "parent" flag)`)
|
||||
f.StringArrayVarP(&backupOptions.Excludes, "exclude", "e", nil, "exclude a `pattern` (can be specified multiple times)")
|
||||
f.StringArrayVar(&backupOptions.ExcludeFiles, "exclude-file", nil, "read exclude patterns from a `file` (can be specified multiple times)")
|
||||
f.BoolVarP(&backupOptions.ExcludeOtherFS, "one-file-system", "x", false, "exclude other file systems")
|
||||
f.StringArrayVar(&backupOptions.ExcludeIfPresent, "exclude-if-present", nil, "takes filename[:header], exclude contents of directories containing filename (except filename itself) if header of that file is as provided (can be specified multiple times)")
|
||||
f.BoolVar(&backupOptions.ExcludeCaches, "exclude-caches", false, `excludes cache directories that are marked with a CACHEDIR.TAG file`)
|
||||
f.BoolVar(&backupOptions.Stdin, "stdin", false, "read backup from stdin")
|
||||
f.StringVar(&backupOptions.StdinFilename, "stdin-filename", "stdin", "file name to use when reading from stdin")
|
||||
f.StringArrayVar(&backupOptions.Tags, "tag", nil, "add a `tag` for the new snapshot (can be specified multiple times)")
|
||||
f.StringVar(&backupOptions.Hostname, "hostname", "", "set the `hostname` for the snapshot manually. To prevent an expensive rescan use the \"parent\" flag")
|
||||
f.StringVar(&backupOptions.FilesFrom, "files-from", "", "read the files to backup from file (can be combined with file args)")
|
||||
f.StringVar(&backupOptions.TimeStamp, "time", "", "time of the backup (ex. '2012-11-01 22:08:41') (default: now)")
|
||||
f.BoolVar(&backupOptions.WithAtime, "with-atime", false, "store the atime for all files and directories")
|
||||
}
|
||||
|
||||
func newScanProgress(gopts GlobalOptions) *restic.Progress {
|
||||
if gopts.Quiet {
|
||||
return nil
|
||||
}
|
||||
|
||||
p := restic.NewProgress()
|
||||
p.OnUpdate = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
if IsProcessBackground() {
|
||||
return
|
||||
}
|
||||
|
||||
PrintProgress("[%s] %d directories, %d files, %s", formatDuration(d), s.Dirs, s.Files, formatBytes(s.Bytes))
|
||||
}
|
||||
|
||||
p.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
PrintProgress("scanned %d directories, %d files in %s\n", s.Dirs, s.Files, formatDuration(d))
|
||||
}
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
func newArchiveProgress(gopts GlobalOptions, todo restic.Stat) *restic.Progress {
|
||||
if gopts.Quiet {
|
||||
return nil
|
||||
}
|
||||
|
||||
archiveProgress := restic.NewProgress()
|
||||
|
||||
var bps, eta uint64
|
||||
itemsTodo := todo.Files + todo.Dirs
|
||||
|
||||
archiveProgress.OnUpdate = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
if IsProcessBackground() {
|
||||
return
|
||||
}
|
||||
|
||||
sec := uint64(d / time.Second)
|
||||
if todo.Bytes > 0 && sec > 0 && ticker {
|
||||
bps = s.Bytes / sec
|
||||
if s.Bytes >= todo.Bytes {
|
||||
eta = 0
|
||||
} else if bps > 0 {
|
||||
eta = (todo.Bytes - s.Bytes) / bps
|
||||
}
|
||||
}
|
||||
|
||||
itemsDone := s.Files + s.Dirs
|
||||
|
||||
status1 := fmt.Sprintf("[%s] %s %s/s %s / %s %d / %d items %d errors ",
|
||||
formatDuration(d),
|
||||
formatPercent(s.Bytes, todo.Bytes),
|
||||
formatBytes(bps),
|
||||
formatBytes(s.Bytes), formatBytes(todo.Bytes),
|
||||
itemsDone, itemsTodo,
|
||||
s.Errors)
|
||||
status2 := fmt.Sprintf("ETA %s ", formatSeconds(eta))
|
||||
|
||||
if w := stdoutTerminalWidth(); w > 0 {
|
||||
maxlen := w - len(status2) - 1
|
||||
|
||||
if maxlen < 4 {
|
||||
status1 = ""
|
||||
} else if len(status1) > maxlen {
|
||||
status1 = status1[:maxlen-4]
|
||||
status1 += "... "
|
||||
}
|
||||
}
|
||||
|
||||
PrintProgress("%s%s", status1, status2)
|
||||
}
|
||||
|
||||
archiveProgress.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
fmt.Printf("\nduration: %s, %s\n", formatDuration(d), formatRate(todo.Bytes, d))
|
||||
}
|
||||
|
||||
return archiveProgress
|
||||
}
|
||||
|
||||
func newArchiveStdinProgress(gopts GlobalOptions) *restic.Progress {
|
||||
if gopts.Quiet {
|
||||
return nil
|
||||
}
|
||||
|
||||
archiveProgress := restic.NewProgress()
|
||||
|
||||
var bps uint64
|
||||
|
||||
archiveProgress.OnUpdate = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
if IsProcessBackground() {
|
||||
return
|
||||
}
|
||||
|
||||
sec := uint64(d / time.Second)
|
||||
if s.Bytes > 0 && sec > 0 && ticker {
|
||||
bps = s.Bytes / sec
|
||||
}
|
||||
|
||||
status1 := fmt.Sprintf("[%s] %s %s/s", formatDuration(d),
|
||||
formatBytes(s.Bytes),
|
||||
formatBytes(bps))
|
||||
|
||||
if w := stdoutTerminalWidth(); w > 0 {
|
||||
maxlen := w - len(status1)
|
||||
|
||||
if maxlen < 4 {
|
||||
status1 = ""
|
||||
} else if len(status1) > maxlen {
|
||||
status1 = status1[:maxlen-4]
|
||||
status1 += "... "
|
||||
}
|
||||
}
|
||||
|
||||
PrintProgress("%s", status1)
|
||||
}
|
||||
|
||||
archiveProgress.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
fmt.Printf("\nduration: %s, %s\n", formatDuration(d), formatRate(s.Bytes, d))
|
||||
}
|
||||
|
||||
return archiveProgress
|
||||
}
|
||||
|
||||
// filterExisting returns a slice of all existing items, or an error if no
|
||||
// items exist at all.
|
||||
func filterExisting(items []string) (result []string, err error) {
|
||||
for _, item := range items {
|
||||
_, err := fs.Lstat(item)
|
||||
if err != nil && os.IsNotExist(errors.Cause(err)) {
|
||||
Warnf("%v does not exist, skipping\n", item)
|
||||
continue
|
||||
}
|
||||
|
||||
result = append(result, item)
|
||||
}
|
||||
|
||||
if len(result) == 0 {
|
||||
return nil, errors.Fatal("all target directories/files do not exist")
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func readBackupFromStdin(opts BackupOptions, gopts GlobalOptions, args []string) error {
|
||||
if len(args) != 0 {
|
||||
return errors.Fatal("when reading from stdin, no additional files can be specified")
|
||||
}
|
||||
|
||||
fn := opts.StdinFilename
|
||||
|
||||
if fn == "" {
|
||||
return errors.Fatal("filename for backup from stdin must not be empty")
|
||||
}
|
||||
|
||||
if filepath.Base(fn) != fn || path.Base(fn) != fn {
|
||||
return errors.Fatal("filename is invalid (may not contain a directory, slash or backslash)")
|
||||
}
|
||||
|
||||
if gopts.password == "" {
|
||||
return errors.Fatal("unable to read password from stdin when data is to be read from stdin, use --password-file or $RESTIC_PASSWORD")
|
||||
}
|
||||
|
||||
repo, err := OpenRepository(gopts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
lock, err := lockRepo(repo)
|
||||
defer unlockRepo(lock)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = repo.LoadIndex(gopts.ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
r := &archiver.Reader{
|
||||
Repository: repo,
|
||||
Tags: opts.Tags,
|
||||
Hostname: opts.Hostname,
|
||||
}
|
||||
|
||||
_, id, err := r.Archive(gopts.ctx, fn, os.Stdin, newArchiveStdinProgress(gopts))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Verbosef("archived as %v\n", id.Str())
|
||||
return nil
|
||||
}
|
||||
|
||||
// readFromFile will read all lines from the given filename and write them to a
|
||||
// string array, if filename is empty readFromFile returns and empty string
|
||||
// array. If filename is a dash (-), readFromFile will read the lines from
|
||||
// the standard input.
|
||||
func readLinesFromFile(filename string) ([]string, error) {
|
||||
if filename == "" {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var r io.Reader = os.Stdin
|
||||
if filename != "-" {
|
||||
f, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
r = f
|
||||
}
|
||||
|
||||
var lines []string
|
||||
|
||||
scanner := bufio.NewScanner(r)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
// ignore empty lines
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
// strip comments
|
||||
if strings.HasPrefix(line, "#") {
|
||||
continue
|
||||
}
|
||||
lines = append(lines, line)
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return lines, nil
|
||||
}
|
||||
|
||||
func runBackup(opts BackupOptions, gopts GlobalOptions, args []string) error {
|
||||
if opts.FilesFrom == "-" && gopts.password == "" {
|
||||
return errors.Fatal("unable to read password from stdin when data is to be read from stdin, use --password-file or $RESTIC_PASSWORD")
|
||||
}
|
||||
|
||||
fromfile, err := readLinesFromFile(opts.FilesFrom)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// merge files from files-from into normal args so we can reuse the normal
|
||||
// args checks and have the ability to use both files-from and args at the
|
||||
// same time
|
||||
args = append(args, fromfile...)
|
||||
if len(args) == 0 {
|
||||
return errors.Fatal("nothing to backup, please specify target files/dirs")
|
||||
}
|
||||
|
||||
target := make([]string, 0, len(args))
|
||||
for _, d := range args {
|
||||
if a, err := filepath.Abs(d); err == nil {
|
||||
d = a
|
||||
}
|
||||
target = append(target, d)
|
||||
}
|
||||
|
||||
target, err = filterExisting(target)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// rejectFuncs collect functions that can reject items from the backup
|
||||
var rejectFuncs []RejectFunc
|
||||
|
||||
// allowed devices
|
||||
if opts.ExcludeOtherFS {
|
||||
f, err := rejectByDevice(target)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rejectFuncs = append(rejectFuncs, f)
|
||||
}
|
||||
|
||||
// add patterns from file
|
||||
if len(opts.ExcludeFiles) > 0 {
|
||||
opts.Excludes = append(opts.Excludes, readExcludePatternsFromFiles(opts.ExcludeFiles)...)
|
||||
}
|
||||
|
||||
if len(opts.Excludes) > 0 {
|
||||
rejectFuncs = append(rejectFuncs, rejectByPattern(opts.Excludes))
|
||||
}
|
||||
|
||||
if opts.ExcludeCaches {
|
||||
opts.ExcludeIfPresent = append(opts.ExcludeIfPresent, "CACHEDIR.TAG:Signature: 8a477f597d28d172789f06886806bc55")
|
||||
}
|
||||
|
||||
for _, spec := range opts.ExcludeIfPresent {
|
||||
f, err := rejectIfPresent(spec)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rejectFuncs = append(rejectFuncs, f)
|
||||
}
|
||||
|
||||
repo, err := OpenRepository(gopts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
lock, err := lockRepo(repo)
|
||||
defer unlockRepo(lock)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// exclude restic cache
|
||||
if repo.Cache != nil {
|
||||
f, err := rejectResticCache(repo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rejectFuncs = append(rejectFuncs, f)
|
||||
}
|
||||
|
||||
err = repo.LoadIndex(gopts.ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var parentSnapshotID *restic.ID
|
||||
|
||||
// Force using a parent
|
||||
if !opts.Force && opts.Parent != "" {
|
||||
id, err := restic.FindSnapshot(repo, opts.Parent)
|
||||
if err != nil {
|
||||
return errors.Fatalf("invalid id %q: %v", opts.Parent, err)
|
||||
}
|
||||
|
||||
parentSnapshotID = &id
|
||||
}
|
||||
|
||||
// Find last snapshot to set it as parent, if not already set
|
||||
if !opts.Force && parentSnapshotID == nil {
|
||||
id, err := restic.FindLatestSnapshot(gopts.ctx, repo, target, []restic.TagList{}, opts.Hostname)
|
||||
if err == nil {
|
||||
parentSnapshotID = &id
|
||||
} else if err != restic.ErrNoSnapshotFound {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if parentSnapshotID != nil {
|
||||
Verbosef("using parent snapshot %v\n", parentSnapshotID.Str())
|
||||
}
|
||||
|
||||
Verbosef("scan %v\n", target)
|
||||
|
||||
selectFilter := func(item string, fi os.FileInfo) bool {
|
||||
for _, reject := range rejectFuncs {
|
||||
if reject(item, fi) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
stat, err := archiver.Scan(target, selectFilter, newScanProgress(gopts))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
arch := archiver.New(repo)
|
||||
arch.Excludes = opts.Excludes
|
||||
arch.SelectFilter = selectFilter
|
||||
arch.WithAccessTime = opts.WithAtime
|
||||
|
||||
arch.Warn = func(dir string, fi os.FileInfo, err error) {
|
||||
// TODO: make ignoring errors configurable
|
||||
Warnf("%s\rwarning for %s: %v\n", ClearLine(), dir, err)
|
||||
}
|
||||
|
||||
timeStamp := time.Now()
|
||||
if opts.TimeStamp != "" {
|
||||
timeStamp, err = time.Parse(TimeFormat, opts.TimeStamp)
|
||||
if err != nil {
|
||||
return errors.Fatalf("error in time option: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
_, id, err := arch.Snapshot(gopts.ctx, newArchiveProgress(gopts, stat), target, opts.Tags, opts.Hostname, parentSnapshotID, timeStamp)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Verbosef("snapshot %s saved\n", id.Str())
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func readExcludePatternsFromFiles(excludeFiles []string) []string {
|
||||
var excludes []string
|
||||
for _, filename := range excludeFiles {
|
||||
err := func() (err error) {
|
||||
file, err := fs.Open(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
// return pre-close error if there was one
|
||||
if errClose := file.Close(); err == nil {
|
||||
err = errClose
|
||||
}
|
||||
}()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := strings.TrimSpace(scanner.Text())
|
||||
|
||||
// ignore empty lines
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
// strip comments
|
||||
if strings.HasPrefix(line, "#") {
|
||||
continue
|
||||
}
|
||||
|
||||
line = os.ExpandEnv(line)
|
||||
excludes = append(excludes, line)
|
||||
}
|
||||
return scanner.Err()
|
||||
}()
|
||||
if err != nil {
|
||||
Warnf("error reading exclude patterns: %v:", err)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return excludes
|
||||
}
|
||||
190
cmd/restic/cmd_cat.go
Normal file
190
cmd/restic/cmd_cat.go
Normal file
@@ -0,0 +1,190 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"github.com/restic/restic/internal/backend"
|
||||
"github.com/restic/restic/internal/errors"
|
||||
"github.com/restic/restic/internal/repository"
|
||||
"github.com/restic/restic/internal/restic"
|
||||
)
|
||||
|
||||
var cmdCat = &cobra.Command{
|
||||
Use: "cat [flags] [pack|blob|snapshot|index|key|masterkey|config|lock] ID",
|
||||
Short: "Print internal objects to stdout",
|
||||
Long: `
|
||||
The "cat" command is used to print internal objects to stdout.
|
||||
`,
|
||||
DisableAutoGenTag: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
return runCat(globalOptions, args)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
cmdRoot.AddCommand(cmdCat)
|
||||
}
|
||||
|
||||
func runCat(gopts GlobalOptions, args []string) error {
|
||||
if len(args) < 1 || (args[0] != "masterkey" && args[0] != "config" && len(args) != 2) {
|
||||
return errors.Fatal("type or ID not specified")
|
||||
}
|
||||
|
||||
repo, err := OpenRepository(gopts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
lock, err := lockRepo(repo)
|
||||
defer unlockRepo(lock)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tpe := args[0]
|
||||
|
||||
var id restic.ID
|
||||
if tpe != "masterkey" && tpe != "config" {
|
||||
id, err = restic.ParseID(args[1])
|
||||
if err != nil {
|
||||
if tpe != "snapshot" {
|
||||
return errors.Fatalf("unable to parse ID: %v\n", err)
|
||||
}
|
||||
|
||||
// find snapshot id with prefix
|
||||
id, err = restic.FindSnapshot(repo, args[1])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// handle all types that don't need an index
|
||||
switch tpe {
|
||||
case "config":
|
||||
buf, err := json.MarshalIndent(repo.Config(), "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(string(buf))
|
||||
return nil
|
||||
case "index":
|
||||
buf, err := repo.LoadAndDecrypt(gopts.ctx, restic.IndexFile, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = os.Stdout.Write(append(buf, '\n'))
|
||||
return err
|
||||
|
||||
case "snapshot":
|
||||
sn := &restic.Snapshot{}
|
||||
err = repo.LoadJSONUnpacked(gopts.ctx, restic.SnapshotFile, id, sn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
buf, err := json.MarshalIndent(&sn, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(string(buf))
|
||||
|
||||
return nil
|
||||
case "key":
|
||||
h := restic.Handle{Type: restic.KeyFile, Name: id.String()}
|
||||
buf, err := backend.LoadAll(gopts.ctx, repo.Backend(), h)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
key := &repository.Key{}
|
||||
err = json.Unmarshal(buf, key)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
buf, err = json.MarshalIndent(&key, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(string(buf))
|
||||
return nil
|
||||
case "masterkey":
|
||||
buf, err := json.MarshalIndent(repo.Key(), "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(string(buf))
|
||||
return nil
|
||||
case "lock":
|
||||
lock, err := restic.LoadLock(gopts.ctx, repo, id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
buf, err := json.MarshalIndent(&lock, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println(string(buf))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// load index, handle all the other types
|
||||
err = repo.LoadIndex(gopts.ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch tpe {
|
||||
case "pack":
|
||||
h := restic.Handle{Type: restic.DataFile, Name: id.String()}
|
||||
buf, err := backend.LoadAll(gopts.ctx, repo.Backend(), h)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hash := restic.Hash(buf)
|
||||
if !hash.Equal(id) {
|
||||
fmt.Fprintf(stderr, "Warning: hash of data does not match ID, want\n %v\ngot:\n %v\n", id.String(), hash.String())
|
||||
}
|
||||
|
||||
_, err = os.Stdout.Write(buf)
|
||||
return err
|
||||
|
||||
case "blob":
|
||||
for _, t := range []restic.BlobType{restic.DataBlob, restic.TreeBlob} {
|
||||
list, err := repo.Index().Lookup(id, t)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
blob := list[0]
|
||||
|
||||
buf := make([]byte, blob.Length)
|
||||
n, err := repo.LoadBlob(gopts.ctx, t, id, buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
buf = buf[:n]
|
||||
|
||||
_, err = os.Stdout.Write(buf)
|
||||
return err
|
||||
}
|
||||
|
||||
return errors.Fatal("blob not found")
|
||||
|
||||
default:
|
||||
return errors.Fatal("invalid type")
|
||||
}
|
||||
}
|
||||
182
cmd/restic/cmd_check.go
Normal file
182
cmd/restic/cmd_check.go
Normal file
@@ -0,0 +1,182 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"github.com/restic/restic/internal/checker"
|
||||
"github.com/restic/restic/internal/errors"
|
||||
"github.com/restic/restic/internal/restic"
|
||||
)
|
||||
|
||||
var cmdCheck = &cobra.Command{
|
||||
Use: "check [flags]",
|
||||
Short: "Check the repository for errors",
|
||||
Long: `
|
||||
The "check" command tests the repository for errors and reports any errors it
|
||||
finds. It can also be used to read all data and therefore simulate a restore.
|
||||
|
||||
By default, the "check" command will always load all data directly from the
|
||||
repository and not use a local cache.
|
||||
`,
|
||||
DisableAutoGenTag: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
return runCheck(checkOptions, globalOptions, args)
|
||||
},
|
||||
}
|
||||
|
||||
// CheckOptions bundles all options for the 'check' command.
|
||||
type CheckOptions struct {
|
||||
ReadData bool
|
||||
CheckUnused bool
|
||||
WithCache bool
|
||||
}
|
||||
|
||||
var checkOptions CheckOptions
|
||||
|
||||
func init() {
|
||||
cmdRoot.AddCommand(cmdCheck)
|
||||
|
||||
f := cmdCheck.Flags()
|
||||
f.BoolVar(&checkOptions.ReadData, "read-data", false, "read all data blobs")
|
||||
f.BoolVar(&checkOptions.CheckUnused, "check-unused", false, "find unused blobs")
|
||||
f.BoolVar(&checkOptions.WithCache, "with-cache", false, "use the cache")
|
||||
}
|
||||
|
||||
func newReadProgress(gopts GlobalOptions, todo restic.Stat) *restic.Progress {
|
||||
if gopts.Quiet {
|
||||
return nil
|
||||
}
|
||||
|
||||
readProgress := restic.NewProgress()
|
||||
|
||||
readProgress.OnUpdate = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
status := fmt.Sprintf("[%s] %s %d / %d items",
|
||||
formatDuration(d),
|
||||
formatPercent(s.Blobs, todo.Blobs),
|
||||
s.Blobs, todo.Blobs)
|
||||
|
||||
if w := stdoutTerminalWidth(); w > 0 {
|
||||
if len(status) > w {
|
||||
max := w - len(status) - 4
|
||||
status = status[:max] + "... "
|
||||
}
|
||||
}
|
||||
|
||||
PrintProgress("%s", status)
|
||||
}
|
||||
|
||||
readProgress.OnDone = func(s restic.Stat, d time.Duration, ticker bool) {
|
||||
fmt.Printf("\nduration: %s\n", formatDuration(d))
|
||||
}
|
||||
|
||||
return readProgress
|
||||
}
|
||||
|
||||
func runCheck(opts CheckOptions, gopts GlobalOptions, args []string) error {
|
||||
if len(args) != 0 {
|
||||
return errors.Fatal("check has no arguments")
|
||||
}
|
||||
|
||||
if !opts.WithCache {
|
||||
// do not use a cache for the checker
|
||||
gopts.NoCache = true
|
||||
}
|
||||
|
||||
repo, err := OpenRepository(gopts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !gopts.NoLock {
|
||||
Verbosef("create exclusive lock for repository\n")
|
||||
lock, err := lockRepoExclusive(repo)
|
||||
defer unlockRepo(lock)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
chkr := checker.New(repo)
|
||||
|
||||
Verbosef("load indexes\n")
|
||||
hints, errs := chkr.LoadIndex(gopts.ctx)
|
||||
|
||||
dupFound := false
|
||||
for _, hint := range hints {
|
||||
Printf("%v\n", hint)
|
||||
if _, ok := hint.(checker.ErrDuplicatePacks); ok {
|
||||
dupFound = true
|
||||
}
|
||||
}
|
||||
|
||||
if dupFound {
|
||||
Printf("\nrun `restic rebuild-index' to correct this\n")
|
||||
}
|
||||
|
||||
if len(errs) > 0 {
|
||||
for _, err := range errs {
|
||||
Warnf("error: %v\n", err)
|
||||
}
|
||||
return errors.Fatal("LoadIndex returned errors")
|
||||
}
|
||||
|
||||
errorsFound := false
|
||||
errChan := make(chan error)
|
||||
|
||||
Verbosef("check all packs\n")
|
||||
go chkr.Packs(gopts.ctx, errChan)
|
||||
|
||||
for err := range errChan {
|
||||
errorsFound = true
|
||||
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||
}
|
||||
|
||||
Verbosef("check snapshots, trees and blobs\n")
|
||||
errChan = make(chan error)
|
||||
go chkr.Structure(gopts.ctx, errChan)
|
||||
|
||||
for err := range errChan {
|
||||
errorsFound = true
|
||||
if e, ok := err.(checker.TreeError); ok {
|
||||
fmt.Fprintf(os.Stderr, "error for tree %v:\n", e.ID.Str())
|
||||
for _, treeErr := range e.Errors {
|
||||
fmt.Fprintf(os.Stderr, " %v\n", treeErr)
|
||||
}
|
||||
} else {
|
||||
fmt.Fprintf(os.Stderr, "error: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
if opts.CheckUnused {
|
||||
for _, id := range chkr.UnusedBlobs() {
|
||||
Verbosef("unused blob %v\n", id.Str())
|
||||
errorsFound = true
|
||||
}
|
||||
}
|
||||
|
||||
if opts.ReadData {
|
||||
Verbosef("read all data\n")
|
||||
|
||||
p := newReadProgress(gopts, restic.Stat{Blobs: chkr.CountPacks()})
|
||||
errChan := make(chan error)
|
||||
|
||||
go chkr.ReadData(gopts.ctx, p, errChan)
|
||||
|
||||
for err := range errChan {
|
||||
errorsFound = true
|
||||
fmt.Fprintf(os.Stderr, "%v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
if errorsFound {
|
||||
return errors.Fatal("repository contains errors")
|
||||
}
|
||||
|
||||
Verbosef("no errors were found\n")
|
||||
|
||||
return nil
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user