Compare commits
684 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b174d6182 | ||
|
|
bfed1f952c | ||
|
|
e5cae81f25 | ||
|
|
ae44dd5978 | ||
|
|
5ce8c9bf50 | ||
|
|
0df0d47c5e | ||
|
|
c21f02bead | ||
|
|
0776df65c3 | ||
|
|
375c7b585c | ||
|
|
0ea7e8d3a6 | ||
|
|
ceb13aa53c | ||
|
|
bb8ca05162 | ||
|
|
a2524763c8 | ||
|
|
fddd9dd884 | ||
|
|
ce5494b4ec | ||
|
|
a66bed5d0f | ||
|
|
566a5e5465 | ||
|
|
c78855b4c2 | ||
|
|
7a1eae45d3 | ||
|
|
e94802a338 | ||
|
|
c69cecceda | ||
|
|
7e43f29cd1 | ||
|
|
368d226357 | ||
|
|
9c98846c23 | ||
|
|
fe799e983b | ||
|
|
004e5e58a3 | ||
|
|
29d823571c | ||
|
|
308dd8e790 | ||
|
|
fbc89a3149 | ||
|
|
20a4ed6e7e | ||
|
|
b4d6c90c62 | ||
|
|
41a194952e | ||
|
|
624213956e | ||
|
|
d0364e697a | ||
|
|
1a3e42451c | ||
|
|
40021e6943 | ||
|
|
580148335f | ||
|
|
4e8a5d7aee | ||
|
|
45b2647cc9 | ||
|
|
aad028097b | ||
|
|
12610baeba | ||
|
|
f4bf4da44d | ||
|
|
99457e8c38 | ||
|
|
f21d064b4f | ||
|
|
94ec5396da | ||
|
|
610c2f9084 | ||
|
|
075f33a272 | ||
|
|
2a27882307 | ||
|
|
8b26251199 | ||
|
|
1e6d3d2c6b | ||
|
|
fd8186ff0e | ||
|
|
82aed71d09 | ||
|
|
c08a291742 | ||
|
|
a10f84b5c1 | ||
|
|
40d8434c8e | ||
|
|
5cec3c3ca1 | ||
|
|
907282cf89 | ||
|
|
3aaaaaf2d0 | ||
|
|
5ea53cdf80 | ||
|
|
5e651878ff | ||
|
|
961cea92ca | ||
|
|
040e740375 | ||
|
|
18be0e88dc | ||
|
|
c2af167933 | ||
|
|
39d1ca3a3c | ||
|
|
39e2292acd | ||
|
|
3d7fc166b4 | ||
|
|
4a8433d297 | ||
|
|
f2d075f3ca | ||
|
|
c872514571 | ||
|
|
66ba89a37d | ||
|
|
dbe8dc303f | ||
|
|
2967b3acca | ||
|
|
1d8478bc06 | ||
|
|
27cf2592de | ||
|
|
2e0ba8208b | ||
|
|
225753a8c0 | ||
|
|
190d278fd4 | ||
|
|
5b0e2d8ed0 | ||
|
|
6f5f3e769f | ||
|
|
b7be10f712 | ||
|
|
fbe35538b6 | ||
|
|
39faeffe09 | ||
|
|
e89dfe493e | ||
|
|
c88f57b42d | ||
|
|
9d7568aa4a | ||
|
|
ab66711513 | ||
|
|
e48879555b | ||
|
|
05f4a331bf | ||
|
|
a7c1f58f99 | ||
|
|
f23c7007a5 | ||
|
|
044cf7ee13 | ||
|
|
a1d42b4177 | ||
|
|
8ad04f5a5e | ||
|
|
e25140d72e | ||
|
|
9688ba24ca | ||
|
|
237e5a942f | ||
|
|
888cd27540 | ||
|
|
77d7a0b7ed | ||
|
|
263a10cb3a | ||
|
|
3cf67bb60e | ||
|
|
ef938a5d54 | ||
|
|
62b0a9b9f1 | ||
|
|
d790bafcad | ||
|
|
85020c1c95 | ||
|
|
5c7cce6dfe | ||
|
|
72f32fc4f4 | ||
|
|
a8f8b6d36c | ||
|
|
fdba105a0d | ||
|
|
9d4d11df61 | ||
|
|
493da5f964 | ||
|
|
9b5a16e57e | ||
|
|
f1e17c6672 | ||
|
|
3909f62fa9 | ||
|
|
df40bee75e | ||
|
|
55e6301fa6 | ||
|
|
d549a16ee8 | ||
|
|
2ba0df3d3c | ||
|
|
8c091a2daa | ||
|
|
fc366933e4 | ||
|
|
e62ce9e6e3 | ||
|
|
728f5fe2cd | ||
|
|
49a81a7a2c | ||
|
|
cedf079762 | ||
|
|
d61983643a | ||
|
|
a5275e37d1 | ||
|
|
3e82466d5e | ||
|
|
384c4bb3f8 | ||
|
|
4c447b06a2 | ||
|
|
b66ba8ba0a | ||
|
|
6381acf85b | ||
|
|
3758cdf818 | ||
|
|
3b4b2c7a50 | ||
|
|
2482ca7ea7 | ||
|
|
e092909b81 | ||
|
|
24f1d2ce89 | ||
|
|
f581f71058 | ||
|
|
958a9a3aed | ||
|
|
3f3b752e44 | ||
|
|
1244e96681 | ||
|
|
b021460290 | ||
|
|
9a201a8963 | ||
|
|
5b696e5cf3 | ||
|
|
3c62c9ddb8 | ||
|
|
284a5eff89 | ||
|
|
a0b7ba6d9b | ||
|
|
e1d5a2a4c1 | ||
|
|
8ead035016 | ||
|
|
7e19462312 | ||
|
|
881697d3d7 | ||
|
|
66d981aa64 | ||
|
|
f2219ee717 | ||
|
|
833e3bbcf6 | ||
|
|
8696670909 | ||
|
|
791073bd28 | ||
|
|
41c86d6459 | ||
|
|
b1977dfb18 | ||
|
|
76c8d7287e | ||
|
|
389424c54b | ||
|
|
c9f63b5744 | ||
|
|
9523c036d6 | ||
|
|
2223c6e498 | ||
|
|
6b5a4bbb13 | ||
|
|
77bf892809 | ||
|
|
7e41cf07d4 | ||
|
|
b053cf9e2a | ||
|
|
6ceb45bac4 | ||
|
|
450af67698 | ||
|
|
312f5960df | ||
|
|
064f137f26 | ||
|
|
ec431ffd95 | ||
|
|
ec28618413 | ||
|
|
25785841a3 | ||
|
|
14374bc1be | ||
|
|
aa9c4eec8a | ||
|
|
f1a7de70e2 | ||
|
|
25f868971b | ||
|
|
17a5cf572d | ||
|
|
7dfd8181fa | ||
|
|
da56bb8d9f | ||
|
|
7ef4deb76c | ||
|
|
c53159cb0c | ||
|
|
c12704d726 | ||
|
|
cbed4786be | ||
|
|
fd60e60541 | ||
|
|
fb833ed311 | ||
|
|
1440c53ed6 | ||
|
|
bd42c35e80 | ||
|
|
a5c82670c9 | ||
|
|
3c966a77df | ||
|
|
1a9aade28e | ||
|
|
34c4c28879 | ||
|
|
a272b34809 | ||
|
|
05b8d1e40d | ||
|
|
18ef471332 | ||
|
|
e14502606c | ||
|
|
59953d857b | ||
|
|
436eced9fb | ||
|
|
f56985938d | ||
|
|
56f4198b28 | ||
|
|
6b22081f61 | ||
|
|
a5fa53c460 | ||
|
|
426e0af8cd | ||
|
|
e2f1854b1e | ||
|
|
c194605c35 | ||
|
|
112be18635 | ||
|
|
802c7ac906 | ||
|
|
f575cc1860 | ||
|
|
b03bf1c1f0 | ||
|
|
9bebda057a | ||
|
|
83a8058b51 | ||
|
|
072e9d44bd | ||
|
|
a3013de6ea | ||
|
|
9eed62a854 | ||
|
|
79282a8df9 | ||
|
|
ec64246dc7 | ||
|
|
c89d2abf5a | ||
|
|
b3914f627d | ||
|
|
998236dcc5 | ||
|
|
d9626bf311 | ||
|
|
684d70985e | ||
|
|
e92842d837 | ||
|
|
12c6d6e3bd | ||
|
|
1d704d9352 | ||
|
|
38ac585e7c | ||
|
|
892d289f38 | ||
|
|
5294c5135c | ||
|
|
8e6896ba03 | ||
|
|
b2e86c2ea3 | ||
|
|
8cc58dd8b0 | ||
|
|
ca1620ef42 | ||
|
|
f1d834df8e | ||
|
|
502ffc62ef | ||
|
|
73db636361 | ||
|
|
b222785dc2 | ||
|
|
5454004ef9 | ||
|
|
ed9671c2a6 | ||
|
|
911e35bc50 | ||
|
|
898949d1bc | ||
|
|
ef8fe58245 | ||
|
|
9e792369b2 | ||
|
|
c76a77e431 | ||
|
|
2308c9da49 | ||
|
|
c59f88ca82 | ||
|
|
3edfcff1a0 | ||
|
|
d84673376d | ||
|
|
69def04ec2 | ||
|
|
3e1a46f2de | ||
|
|
113ba716e6 | ||
|
|
703037cbfb | ||
|
|
07a8e8c91d | ||
|
|
df745ef39c | ||
|
|
2665c8fc16 | ||
|
|
cb34fec596 | ||
|
|
d8560dcb19 | ||
|
|
0e5f1d9a30 | ||
|
|
ad814f175e | ||
|
|
94dec9d9bb | ||
|
|
56bb3e7938 | ||
|
|
263cdd3c8b | ||
|
|
6d5597e93e | ||
|
|
41b2d7744d | ||
|
|
7e45dd9d14 | ||
|
|
48a8085453 | ||
|
|
3e368ee4df | ||
|
|
db337c4457 | ||
|
|
4bd9972d46 | ||
|
|
5ab13b2adc | ||
|
|
845e258031 | ||
|
|
416d98716f | ||
|
|
30d4a62707 | ||
|
|
2f3c58daac | ||
|
|
0b8ab5c079 | ||
|
|
0d8375e798 | ||
|
|
7dd09b8d8a | ||
|
|
d661e91a58 | ||
|
|
d11935b6fc | ||
|
|
650578ee64 | ||
|
|
43ec429fe4 | ||
|
|
9658aea963 | ||
|
|
6ad63fb770 | ||
|
|
d88e086b94 | ||
|
|
6c3c45dadd | ||
|
|
f3af4ce098 | ||
|
|
511da0f3c7 | ||
|
|
c52718c104 | ||
|
|
e4eaf9d88d | ||
|
|
a62905f17a | ||
|
|
3a98abb6ba | ||
|
|
dd4d7e3162 | ||
|
|
ce062aeb3b | ||
|
|
78301c6f83 | ||
|
|
487cc7e9c0 | ||
|
|
7dacabf07c | ||
|
|
8226c30d84 | ||
|
|
9281350b4c | ||
|
|
d68b8604ac | ||
|
|
ab524d2392 | ||
|
|
72c91362f2 | ||
|
|
c13668c0e9 | ||
|
|
5decbd0b21 | ||
|
|
5788f35e82 | ||
|
|
5d08936e37 | ||
|
|
acd8553be9 | ||
|
|
db4e54025a | ||
|
|
907ebc1959 | ||
|
|
f760d610e9 | ||
|
|
2a108b86c7 | ||
|
|
87c583dcb6 | ||
|
|
c6344c05be | ||
|
|
24428d9980 | ||
|
|
b0ef5e0635 | ||
|
|
51a77bac28 | ||
|
|
c39b97adb3 | ||
|
|
beffd63512 | ||
|
|
856d269657 | ||
|
|
28248f3332 | ||
|
|
69d6f4acec | ||
|
|
a71bf73e4d | ||
|
|
1b8448402a | ||
|
|
c1dab7e4cb | ||
|
|
b8e2dc24f3 | ||
|
|
31e278ffb6 | ||
|
|
a444eb8d44 | ||
|
|
91884eef4a | ||
|
|
fb3c740129 | ||
|
|
359d85dd66 | ||
|
|
b5462e1059 | ||
|
|
37a64ab19b | ||
|
|
0ee6eb8bbb | ||
|
|
4e48837b91 | ||
|
|
33cb02e416 | ||
|
|
da03acc656 | ||
|
|
ed7abc4a93 | ||
|
|
3ab698a0c5 | ||
|
|
c2dd75df12 | ||
|
|
9f35fa6d3d | ||
|
|
d14be7c2c0 | ||
|
|
7a6bc830dd | ||
|
|
a10ffb1676 | ||
|
|
597e29ebe9 | ||
|
|
1156d82594 | ||
|
|
6b32d9a694 | ||
|
|
3d795b0547 | ||
|
|
daa205bcef | ||
|
|
4008bdd295 | ||
|
|
426fd2238d | ||
|
|
bd731a9cda | ||
|
|
fb74fdf114 | ||
|
|
3c749bd383 | ||
|
|
24f6bc5203 | ||
|
|
e5b3e9ed18 | ||
|
|
c6e629c30d | ||
|
|
62af1fa4e6 | ||
|
|
101c2ba10d | ||
|
|
d8d0886d44 | ||
|
|
3b1f1952ab | ||
|
|
f8a8e3f2f9 | ||
|
|
2a68abfc6d | ||
|
|
22b0a2e196 | ||
|
|
00dab13b39 | ||
|
|
bc53c3454c | ||
|
|
d51bfec61d | ||
|
|
f27ef02273 | ||
|
|
7206d626ee | ||
|
|
a663d235ef | ||
|
|
f2811ea027 | ||
|
|
df11424596 | ||
|
|
af3021913b | ||
|
|
51b6d5e28f | ||
|
|
81c5c81cb5 | ||
|
|
ddf2dd657c | ||
|
|
46bc0452c7 | ||
|
|
4296eb3571 | ||
|
|
0792dc36c2 | ||
|
|
1fb5eadbd2 | ||
|
|
0861be0937 | ||
|
|
4c11f6763e | ||
|
|
375dc92454 | ||
|
|
5667a6aad2 | ||
|
|
bfc7c862e6 | ||
|
|
34b12b7420 | ||
|
|
de2b25b563 | ||
|
|
d76778e3ee | ||
|
|
59b3971d37 | ||
|
|
57a74eabcc | ||
|
|
b6530a3992 | ||
|
|
14e294e574 | ||
|
|
2da6dab403 | ||
|
|
18b8693c43 | ||
|
|
98a3682ac3 | ||
|
|
0b2a055c79 | ||
|
|
91a9e82fc8 | ||
|
|
5fe63a4d9a | ||
|
|
820ca38270 | ||
|
|
833237b2e4 | ||
|
|
c751fd5672 | ||
|
|
f7a34b8bdc | ||
|
|
a2a08ebd21 | ||
|
|
0c9dce1154 | ||
|
|
883c78ea61 | ||
|
|
db3a38751f | ||
|
|
ae3d10d3a7 | ||
|
|
087b908445 | ||
|
|
40ffc3fd44 | ||
|
|
d86f349dad | ||
|
|
19f3f11b8d | ||
|
|
6cafcc1124 | ||
|
|
a7be4044bc | ||
|
|
b566f19538 | ||
|
|
b0b70d1e77 | ||
|
|
5f036641b9 | ||
|
|
5fa0828724 | ||
|
|
fe344462a3 | ||
|
|
51cfe76d65 | ||
|
|
155f686c4f | ||
|
|
739a5f5fdc | ||
|
|
b6108cb9fe | ||
|
|
6f03a9ffe1 | ||
|
|
d6e60cd8d4 | ||
|
|
26a361973c | ||
|
|
b10be3e52e | ||
|
|
2a6886dc70 | ||
|
|
8af4d905f1 | ||
|
|
1de38a13f3 | ||
|
|
df38e5c08b | ||
|
|
8f847906c6 | ||
|
|
c521ca0949 | ||
|
|
dc22307a42 | ||
|
|
e16402a102 | ||
|
|
ef3afd741a | ||
|
|
68e02bc62d | ||
|
|
49e1b12eb1 | ||
|
|
e1b9d7ecdb | ||
|
|
dcf7905bcd | ||
|
|
295a5a376e | ||
|
|
da076cf6bf | ||
|
|
3caef6e1a6 | ||
|
|
d3d8b1c631 | ||
|
|
8a411bd640 | ||
|
|
71a5e2d477 | ||
|
|
ac28cc1cf5 | ||
|
|
ae5b1e9d10 | ||
|
|
856f64a766 | ||
|
|
59199fc907 | ||
|
|
4992977167 | ||
|
|
db447c4676 | ||
|
|
ba8ec56e65 | ||
|
|
d0d4b08a09 | ||
|
|
19b77416da | ||
|
|
6342451937 | ||
|
|
76a80fc974 | ||
|
|
af49a7993a | ||
|
|
63a5f7e348 | ||
|
|
039b579d3e | ||
|
|
be0d7a6444 | ||
|
|
b816c0e507 | ||
|
|
88e7861239 | ||
|
|
0074d6c40a | ||
|
|
fb1b3481d1 | ||
|
|
1eb9c6f993 | ||
|
|
65f2fd2450 | ||
|
|
c1b404952a | ||
|
|
e4e74ff38f | ||
|
|
4581279d23 | ||
|
|
0d5084468e | ||
|
|
cdbea182b4 | ||
|
|
dc0954d653 | ||
|
|
cc05e474cd | ||
|
|
8370c9c1ca | ||
|
|
5dabb3a36f | ||
|
|
86da74908a | ||
|
|
9aee46b3a4 | ||
|
|
be8f60fa8e | ||
|
|
d3ea46ece9 | ||
|
|
cffceaae1f | ||
|
|
5f232c30be | ||
|
|
8351c398bc | ||
|
|
608fc5fb3a | ||
|
|
229aefba2a | ||
|
|
4aba80e58a | ||
|
|
53c2516bae | ||
|
|
a5c9b80add | ||
|
|
a441d733dc | ||
|
|
06f37234dc | ||
|
|
49f41b813c | ||
|
|
bccca235a2 | ||
|
|
ea6a56d9f6 | ||
|
|
8a8d488454 | ||
|
|
f34d663029 | ||
|
|
4018f8d554 | ||
|
|
d649865bce | ||
|
|
3fd4d5cd4b | ||
|
|
5622c33f40 | ||
|
|
93f590c6de | ||
|
|
c9863dc225 | ||
|
|
45f59e7eca | ||
|
|
b6e3c6d718 | ||
|
|
0af83dd1b6 | ||
|
|
2fe3a7947e | ||
|
|
c7c05173b5 | ||
|
|
127b8c0b2d | ||
|
|
95e3ecfd3c | ||
|
|
46f7d07889 | ||
|
|
6fd0adda52 | ||
|
|
68a433d9bc | ||
|
|
17044317ba | ||
|
|
031b2e0683 | ||
|
|
8385eeeab2 | ||
|
|
24ad43a208 | ||
|
|
a3fc812539 | ||
|
|
3f6defe594 | ||
|
|
41ecb2c160 | ||
|
|
e5517c343d | ||
|
|
e56e9acf79 | ||
|
|
0b14c340f2 | ||
|
|
1274959434 | ||
|
|
02bb5db544 | ||
|
|
f396c58b5f | ||
|
|
fa37f5c2bc | ||
|
|
8a2097e7b9 | ||
|
|
c07aec320a | ||
|
|
ba2d8e8201 | ||
|
|
9e6e4095a8 | ||
|
|
d8618d2447 | ||
|
|
19ee6560a9 | ||
|
|
bc3eb7845d | ||
|
|
72277726a3 | ||
|
|
18ddb9df4a | ||
|
|
d247e4791a | ||
|
|
49a3a7d7c7 | ||
|
|
9ce161679a | ||
|
|
727de34879 | ||
|
|
8b71a1f305 | ||
|
|
d17d831205 | ||
|
|
25669938fd | ||
|
|
0c3f5cde12 | ||
|
|
843b9d45f4 | ||
|
|
494e100b0f | ||
|
|
02e518381c | ||
|
|
1d4f6ab19d | ||
|
|
6ae83c25ed | ||
|
|
e83d441d42 | ||
|
|
44df9283fe | ||
|
|
23fca8019b | ||
|
|
4d72d375f2 | ||
|
|
210e736bf5 | ||
|
|
601c4fb3c0 | ||
|
|
fbe39db773 | ||
|
|
4927e48bf3 | ||
|
|
3feba08965 | ||
|
|
c263c8b8ca | ||
|
|
23bd4675fd | ||
|
|
99c022cb00 | ||
|
|
86cb56757e | ||
|
|
89cb1f437c | ||
|
|
df36c97bb5 | ||
|
|
ecb13d36f3 | ||
|
|
df1bc519b7 | ||
|
|
9c01989370 | ||
|
|
22a5fadc13 | ||
|
|
1bbb09a7ef | ||
|
|
f00c27b4f3 | ||
|
|
138323b79d | ||
|
|
0456cacd79 | ||
|
|
c273c8f71b | ||
|
|
4b0122093a | ||
|
|
010fccb4fa | ||
|
|
ebaa98fa7a | ||
|
|
10e02b0031 | ||
|
|
44fa4aad88 | ||
|
|
d16b2bd369 | ||
|
|
1ff3a0f8b6 | ||
|
|
6324ac9cac | ||
|
|
df567efd37 | ||
|
|
990ce6ed05 | ||
|
|
48f4c1e9e1 | ||
|
|
acd83a2998 | ||
|
|
1eee5c849e | ||
|
|
6c1073db92 | ||
|
|
5b457a1663 | ||
|
|
5a7fd3f316 | ||
|
|
d16befd1fd | ||
|
|
c4f4fb48a4 | ||
|
|
cb57d8e54c | ||
|
|
baa571018e | ||
|
|
8ca5035c42 | ||
|
|
789e0e45d5 | ||
|
|
56364f1c70 | ||
|
|
a72ff9ea7f | ||
|
|
90b733801e | ||
|
|
73549a0529 | ||
|
|
7715583b14 | ||
|
|
3a87067348 | ||
|
|
557b11aca7 | ||
|
|
324d5a04c6 | ||
|
|
de2d11125b | ||
|
|
5e6ab82094 | ||
|
|
ad06b8ca67 | ||
|
|
f522cd66a0 | ||
|
|
b5b235c75f | ||
|
|
fce4e8cedb | ||
|
|
ba73b6d914 | ||
|
|
289df252b5 | ||
|
|
c28cac8479 | ||
|
|
2c78925acb | ||
|
|
154d47565d | ||
|
|
b6d216b794 | ||
|
|
0b2b076712 | ||
|
|
ef6bd0e7a9 | ||
|
|
332a48e6a1 | ||
|
|
748521e4fe | ||
|
|
3d72e24bb8 | ||
|
|
43cccb0a73 | ||
|
|
3d5d78f7a7 | ||
|
|
079a4f65d6 | ||
|
|
547c1f57d9 | ||
|
|
b808a4e087 | ||
|
|
d241c21c28 | ||
|
|
65d22c08b7 | ||
|
|
473553b3eb | ||
|
|
440a32b697 | ||
|
|
ef78b9d9ea | ||
|
|
4d5f3d42e1 | ||
|
|
55d732cce8 | ||
|
|
30d1c707a9 | ||
|
|
d706125b15 | ||
|
|
35f91945b7 | ||
|
|
fe65715b97 | ||
|
|
ccd27870a7 | ||
|
|
acf6cc0527 | ||
|
|
d72f7e9109 | ||
|
|
b7f67c0adf | ||
|
|
9ffa7bcd4d | ||
|
|
3b99b11849 | ||
|
|
6e0a43b570 | ||
|
|
45f3a97997 | ||
|
|
989390bc41 | ||
|
|
3bc026a557 | ||
|
|
f977a54694 | ||
|
|
d60eb67c2e | ||
|
|
8468e70cba | ||
|
|
926a52b33d | ||
|
|
1284d78599 | ||
|
|
b01973f95f | ||
|
|
ec0466ed73 | ||
|
|
1b3502bd5a | ||
|
|
556baae087 | ||
|
|
f9daa27a5d | ||
|
|
b4d1d98868 | ||
|
|
5195264a20 | ||
|
|
f932638054 | ||
|
|
b80e2b7e00 | ||
|
|
188b06b7bb | ||
|
|
5f0ac9a1f3 | ||
|
|
1f8840cab0 | ||
|
|
f241e44da0 | ||
|
|
1d543ccf9a | ||
|
|
199c6b07a7 | ||
|
|
3bab989aad | ||
|
|
30a2f6ac71 | ||
|
|
4106c646f9 | ||
|
|
a92d28988a | ||
|
|
c930d8e30f | ||
|
|
376a730146 | ||
|
|
31e16f2620 | ||
|
|
dbd061c44b | ||
|
|
60c0e5e97a | ||
|
|
2855f89e53 | ||
|
|
37b012fcbd | ||
|
|
4c5f12200d | ||
|
|
2857c16c61 | ||
|
|
7cc71deec7 | ||
|
|
ca4b4cde61 | ||
|
|
2c95b9519c | ||
|
|
f02b8f4a15 | ||
|
|
fc75b94524 | ||
|
|
71b2b73881 | ||
|
|
7ebbb499e0 | ||
|
|
10b7907fa2 | ||
|
|
417fd44cb2 | ||
|
|
22b10e20e4 | ||
|
|
78d92f4425 | ||
|
|
efd9c6ef45 |
@@ -12,7 +12,7 @@
|
|||||||
BasedOnStyle: WebKit
|
BasedOnStyle: WebKit
|
||||||
|
|
||||||
Standard: Cpp11
|
Standard: Cpp11
|
||||||
ColumnLimit: 0
|
ColumnLimit: 120
|
||||||
|
|
||||||
# Disable reflow of qdoc comments: indentation rules are different.
|
# Disable reflow of qdoc comments: indentation rules are different.
|
||||||
# Translation comments are also excluded
|
# Translation comments are also excluded
|
||||||
@@ -61,3 +61,5 @@ ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCH
|
|||||||
MaxEmptyLinesToKeep: 2
|
MaxEmptyLinesToKeep: 2
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
|
||||||
|
SpaceBeforeCpp11BracedList: false
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Checks: '-*,
|
|||||||
modernize-use-nodiscard,
|
modernize-use-nodiscard,
|
||||||
modernize-use-equals-default,
|
modernize-use-equals-default,
|
||||||
modernize-use-noexcept,
|
modernize-use-noexcept,
|
||||||
modernize-user-override,
|
modernize-use-override,
|
||||||
modernize-use-nullptr,
|
modernize-use-nullptr,
|
||||||
modernize-use-transparent-functors,
|
modernize-use-transparent-functors,
|
||||||
modernize-use-uncaught-exceptions,
|
modernize-use-uncaught-exceptions,
|
||||||
|
|||||||
32
.drone.yml
@@ -1,17 +1,17 @@
|
|||||||
kind: pipeline
|
kind: pipeline
|
||||||
name: qt-5.12
|
name: qt-5.15
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: cmake
|
- name: cmake
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
path: /drone/build
|
path: /drone/build
|
||||||
commands:
|
commands:
|
||||||
- cd /drone/build
|
- cd /drone/build
|
||||||
- cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=Debug -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address ../src
|
- cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror ../src
|
||||||
- name: compile
|
- name: compile
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
path: /drone/build
|
path: /drone/build
|
||||||
@@ -19,7 +19,7 @@ steps:
|
|||||||
- cd /drone/build
|
- cd /drone/build
|
||||||
- make -j$(nproc)
|
- make -j$(nproc)
|
||||||
- name: test
|
- name: test
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
path: /drone/build
|
path: /drone/build
|
||||||
@@ -27,7 +27,7 @@ steps:
|
|||||||
- cd /drone/build
|
- cd /drone/build
|
||||||
- useradd -m -s /bin/bash test
|
- useradd -m -s /bin/bash test
|
||||||
- chown -R test:test .
|
- chown -R test:test .
|
||||||
- su -c 'ASAN_OPTIONS=detect_leaks=0 ctest --output-on-failure' test
|
- su -c 'ASAN_OPTIONS=detect_leaks=0 xvfb-run ctest --output-on-failure' test
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
@@ -43,27 +43,27 @@ trigger:
|
|||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
name: qt-5.12-clang
|
name: qt-5.15-clang
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: cmake
|
- name: cmake
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
path: /drone/build
|
path: /drone/build
|
||||||
commands:
|
commands:
|
||||||
- cd /drone/build
|
- cd /drone/build
|
||||||
- cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=clang-10 -DCMAKE_CXX_COMPILER=clazy -DCMAKE_BUILD_TYPE=Debug -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address ../src
|
- cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=clang-10 -DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror ../src
|
||||||
- name: compile
|
- name: compile
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
path: /drone/build
|
path: /drone/build
|
||||||
commands:
|
commands:
|
||||||
- cd /drone/build
|
- cd /drone/build
|
||||||
- ninja 2>1 | /drone/src/admin/linux/count_compiler_warnings.py /drone/src
|
- ninja
|
||||||
- name: test
|
- name: test
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
path: /drone/build
|
path: /drone/build
|
||||||
@@ -71,9 +71,9 @@ steps:
|
|||||||
- cd /drone/build
|
- cd /drone/build
|
||||||
- useradd -m -s /bin/bash test
|
- useradd -m -s /bin/bash test
|
||||||
- chown -R test:test .
|
- chown -R test:test .
|
||||||
- su -c 'ASAN_OPTIONS=detect_leaks=0 ctest --output-on-failure' test
|
- su -c 'ASAN_OPTIONS=detect_leaks=0 xvfb-run ctest --output-on-failure' test
|
||||||
- name: clang-tidy
|
- name: clang-tidy
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
volumes:
|
volumes:
|
||||||
- name: build
|
- name: build
|
||||||
path: /drone/build
|
path: /drone/build
|
||||||
@@ -98,14 +98,14 @@ name: AppImage
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: build
|
- name: build
|
||||||
image: ghcr.io/nextcloud/continuous-integration-client-appimage:client-appimage-1
|
image: ghcr.io/nextcloud/continuous-integration-client-appimage:client-appimage-3
|
||||||
environment:
|
environment:
|
||||||
CI_UPLOAD_GIT_TOKEN:
|
CI_UPLOAD_GIT_TOKEN:
|
||||||
from_secret: CI_UPLOAD_GIT_TOKEN
|
from_secret: CI_UPLOAD_GIT_TOKEN
|
||||||
CI_UPLOAD_GIT_USERNAME:
|
CI_UPLOAD_GIT_USERNAME:
|
||||||
from_secret: CI_UPLOAD_GIT_USERNAME
|
from_secret: CI_UPLOAD_GIT_USERNAME
|
||||||
commands:
|
commands:
|
||||||
- /bin/bash -c "./admin/linux/build-appimage.sh"
|
- BUILDNR=$DRONE_BUILD_NUMBER VERSION_SUFFIX=$DRONE_PULL_REQUEST BUILD_UPDATER=ON DESKTOP_CLIENT_ROOT=$DRONE_WORKSPACE /bin/bash -c "./admin/linux/build-appimage.sh"
|
||||||
- /bin/bash -c "./admin/linux/upload-appimage.sh" || echo "Upload failed, however this is an optional step."
|
- /bin/bash -c "./admin/linux/upload-appimage.sh" || echo "Upload failed, however this is an optional step."
|
||||||
trigger:
|
trigger:
|
||||||
branch:
|
branch:
|
||||||
|
|||||||
31
.github/workflows/command-rebase.yml
vendored
@@ -3,25 +3,44 @@
|
|||||||
# https://github.com/nextcloud/.github
|
# https://github.com/nextcloud/.github
|
||||||
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||||
|
|
||||||
|
name: Rebase command
|
||||||
|
|
||||||
on:
|
on:
|
||||||
issue_comment:
|
issue_comment:
|
||||||
types: [ created ]
|
types: created
|
||||||
name: Automatic Rebase
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
rebase:
|
rebase:
|
||||||
name: Rebase
|
|
||||||
# On pull requests and if the comment starts with `/rebase`
|
|
||||||
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# On pull requests and if the comment starts with `/rebase`
|
||||||
|
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: Add reaction on start
|
||||||
|
uses: peter-evans/create-or-update-comment@v1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
repository: ${{ github.event.repository.full_name }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
reaction-type: "+1"
|
||||||
|
|
||||||
- name: Checkout the latest code
|
- name: Checkout the latest code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
|
||||||
- name: Automatic Rebase
|
- name: Automatic Rebase
|
||||||
uses: cirrus-actions/rebase@1.5
|
uses: cirrus-actions/rebase@1.5
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
|
||||||
|
- name: Add reaction on failure
|
||||||
|
uses: peter-evans/create-or-update-comment@v1
|
||||||
|
if: failure()
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
repository: ${{ github.event.repository.full_name }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
reaction-type: "-1"
|
||||||
|
|||||||
50
.github/workflows/sonarcloud.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
name: SonarCloud analysis
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||||
|
env:
|
||||||
|
SONAR_SERVER_URL: "https://sonarcloud.io"
|
||||||
|
BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
||||||
|
|
||||||
|
- name: Restore cache
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: /cache
|
||||||
|
key: ${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Run build-wrapper
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DBUILD_COVERAGE=ON
|
||||||
|
build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} make -j 2
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
useradd -m -s /bin/bash test
|
||||||
|
chown -R test:test .
|
||||||
|
su -c 'xvfb-run ctest --output-on-failure --output-junit testResult.xml' test
|
||||||
|
- name: Generate coverage report
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
su -c 'ctest -T Coverage' test
|
||||||
|
- name: Run sonar-scanner
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
|
run: |
|
||||||
|
cp sonar-project.properties build
|
||||||
|
cd build
|
||||||
|
sonar-scanner --define sonar.host.url="${{ env.SONAR_SERVER_URL }}" --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
|
||||||
1
.gitignore
vendored
@@ -184,6 +184,7 @@ compile_commands.json
|
|||||||
convert.exe
|
convert.exe
|
||||||
.dir-locals.el
|
.dir-locals.el
|
||||||
*-icon.png
|
*-icon.png
|
||||||
|
*-icon-win-folder.png
|
||||||
*-sidebar.png
|
*-sidebar.png
|
||||||
*-w10startmenu.png
|
*-w10startmenu.png
|
||||||
theme.qrc
|
theme.qrc
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[bg_BG]=@APPLICATION_ICON_NAME@
|
Icon[bg_BG]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
|
||||||
Comment[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
|
Comment[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
|
||||||
GenericName[bg_BG]=Синхронизиране на папка
|
GenericName[bg_BG]=Синхронизиране на папка
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[cy_GB]=@APPLICATION_ICON_NAME@
|
Icon[cy_GB]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
|
||||||
Comment[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
|
Comment[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
|
||||||
GenericName[cy_GB]=Cydweddu Ffolder
|
GenericName[cy_GB]=Cydweddu Ffolder
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[en_GB]=@APPLICATION_ICON_NAME@
|
Icon[en_GB]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[en_GB]=@APPLICATION_NAME@ Desktop
|
||||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||||
GenericName[en_GB]=Folder Sync
|
GenericName[en_GB]=Folder Sync
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[hr]=@APPLICATION_ICON_NAME@
|
Icon[hr]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[hr]=@APPLICATION_NAME@ Desktop
|
||||||
Comment[hr]=@APPLICATION_NAME@ klijent za sinkronizaciju računala
|
Comment[hr]=@APPLICATION_NAME@ klijent za sinkronizaciju računala
|
||||||
GenericName[hr]=Sinkronizacija mapa
|
GenericName[hr]=Sinkronizacija mapa
|
||||||
|
|||||||
24
.tx/nextcloud.client-desktop/id_translation
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ Desktop
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
|
||||||
|
Actions=Quit;
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
[Desktop Action Quit]
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@ --quit
|
||||||
|
Name=Quit @APPLICATION_NAME@
|
||||||
|
Icon=@APPLICATION_EXECUTABLE@
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
GenericName[id]=Sinkronisasi Folder
|
||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[ko]=@APPLICATION_ICON_NAME@
|
Icon[ko]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[ko]=@APPLICATION_NAME@ 데스크탑
|
||||||
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||||
GenericName[ko]=폴더 동기화
|
GenericName[ko]=폴더 동기화
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[nb_NO]=@APPLICATION_ICON_NAME@
|
Icon[nb_NO]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[nb_NO]=@APPLICATION_NAME@ skrivebord
|
||||||
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||||
GenericName[nb_NO]=Mappe synkroinisering
|
GenericName[nb_NO]=Mappe synkroinisering
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[oc]=@APPLICATION_ICON_NAME@
|
Icon[oc]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[oc]=@APPLICATION_NAME@ Burèu
|
||||||
Comment[oc]=@APPLICATION_NAME@ client de sincronizacion
|
Comment[oc]=@APPLICATION_NAME@ client de sincronizacion
|
||||||
GenericName[oc]=Sincro. dossièr
|
GenericName[oc]=Sincro. dossièr
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[ro]=@APPLICATION_ICON_NAME@
|
Icon[ro]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[ro]=@Numele_aplicației@ Client de sincronizare pentru PC
|
||||||
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop
|
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop
|
||||||
GenericName[ro]=Sincronizare director
|
GenericName[ro]=Sincronizare director
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[ru]=@APPLICATION_ICON_NAME@
|
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[ru]=@APPLICATION_NAME@ Desktop
|
||||||
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
||||||
GenericName[ru]=Синхронизация папок
|
GenericName[ru]=Синхронизация папок
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[sc]=@NÙMENE_ICONA_APLICATZIONE@
|
Icon[sc]=@NÙMENE_ICONA_APLICATZIONE@
|
||||||
|
Name[sc]=@NÙMENE_APLICATZIONE@ Iscrivania
|
||||||
Comment[sc]=@NÙMENE_APLICATZIONE@ cliente de sincronizatzione iscrivania
|
Comment[sc]=@NÙMENE_APLICATZIONE@ cliente de sincronizatzione iscrivania
|
||||||
GenericName[sc]=Sincronizadore de cartellas
|
GenericName[sc]=Sincronizadore de cartellas
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Icon[sv]=@APPLICATION_ICON_NAME@
|
Icon[sv]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[sv]=@APPLICATION_NAME@ Skrivbord
|
||||||
Comment[sv]=@APPLICATION_NAME@ desktopssynkroniseringsklient
|
Comment[sv]=@APPLICATION_NAME@ desktopssynkroniseringsklient
|
||||||
GenericName[sv]=Mappsynkronisering
|
GenericName[sv]=Mappsynkronisering
|
||||||
|
|||||||
27
.tx/nextcloud.client-desktop/th_translation
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ Desktop
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
|
||||||
|
Actions=Quit;
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
[Desktop Action Quit]
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@ --quit
|
||||||
|
Name=Quit @APPLICATION_NAME@
|
||||||
|
Icon=@APPLICATION_EXECUTABLE@
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Icon[th_TH]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[th_TH]=@APPLICATION_NAME@ เดสก์ท็อป
|
||||||
|
Comment[th_TH]=ไคลเอ็นต์ซิงโครไนซ์ @APPLICATION_NAME@ บนเดสก์ท็อป
|
||||||
|
GenericName[th_TH]=ซิงค์โฟลเดอร์
|
||||||
27
.tx/nextcloud.client-desktop/vi_translation
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ Desktop
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
|
||||||
|
Actions=Quit;
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
[Desktop Action Quit]
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@ --quit
|
||||||
|
Name=Quit @APPLICATION_NAME@
|
||||||
|
Icon=@APPLICATION_EXECUTABLE@
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Icon[vi]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[vi]=@APPLICATION_NAME@ Máy tính
|
||||||
|
Comment[vi]=Ứng dụng đồng bộ @APPLICATION_NAME@ cho máy tính
|
||||||
|
GenericName[vi]=Đồng bộ thư mục
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.6)
|
cmake_minimum_required(VERSION 3.6)
|
||||||
set(CMAKE_CXX_STANDARD 14)
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
cmake_policy(SET CMP0071 NEW) # Enable use of QtQuick compiler/generated code
|
||||||
|
|
||||||
project(client)
|
project(client)
|
||||||
|
|
||||||
@@ -42,11 +43,14 @@ if(NOT CRASHREPORTER_EXECUTABLE)
|
|||||||
set(CRASHREPORTER_EXECUTABLE "${APPLICATION_EXECUTABLE}_crash_reporter")
|
set(CRASHREPORTER_EXECUTABLE "${APPLICATION_EXECUTABLE}_crash_reporter")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(synclib_NAME "${APPLICATION_EXECUTABLE}sync")
|
|
||||||
set(csync_NAME "${APPLICATION_EXECUTABLE}_csync")
|
|
||||||
|
|
||||||
include(Warnings)
|
include(Warnings)
|
||||||
|
|
||||||
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||||
|
add_compile_options(-fdiagnostics-color=always)
|
||||||
|
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
add_compile_options(-fcolor-diagnostics)
|
||||||
|
endif()
|
||||||
|
|
||||||
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
|
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
|
||||||
# For config.h
|
# For config.h
|
||||||
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
|
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
@@ -74,9 +78,9 @@ include(GetGitRevisionDescription)
|
|||||||
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
||||||
|
|
||||||
add_definitions(
|
add_definitions(
|
||||||
|
-DQT_DISABLE_DEPRECATED_BEFORE=0x000000
|
||||||
-DQT_USE_QSTRINGBUILDER
|
-DQT_USE_QSTRINGBUILDER
|
||||||
-DQT_MESSAGELOGCONTEXT #enable function name and line number in debug output
|
-DQT_MESSAGELOGCONTEXT #enable function name and line number in debug output
|
||||||
-DQT_DEPRECATED_WARNINGS
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# if we cannot get it from git, directly try .tag (packages)
|
# if we cannot get it from git, directly try .tag (packages)
|
||||||
@@ -93,30 +97,18 @@ endif()
|
|||||||
message(STATUS "GIT_SHA1 ${GIT_SHA1}")
|
message(STATUS "GIT_SHA1 ${GIT_SHA1}")
|
||||||
|
|
||||||
set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
|
set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
|
||||||
set(DATADIR ${DATA_INSTALL_DIR})
|
set(SHAREDIR ${CMAKE_INSTALL_FULL_DATADIR})
|
||||||
if(WIN32)
|
|
||||||
set(DATADIR "share")
|
|
||||||
endif(WIN32)
|
|
||||||
set(SHAREDIR ${DATADIR})
|
|
||||||
|
|
||||||
#####
|
# Build MacOS app bundle if wished
|
||||||
## handle BUILD_OWNCLOUD_OSX_BUNDLE
|
if(APPLE AND BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||||
# BUILD_OWNCLOUD_OSX_BUNDLE was not initialized OR set to true on OSX
|
message(STATUS "Build MacOS app bundle")
|
||||||
if(APPLE AND (NOT DEFINED BUILD_OWNCLOUD_OSX_BUNDLE OR BUILD_OWNCLOUD_OSX_BUNDLE))
|
|
||||||
set(BUILD_OWNCLOUD_OSX_BUNDLE ON)
|
|
||||||
set(OWNCLOUD_OSX_BUNDLE "${APPLICATION_NAME}.app")
|
set(OWNCLOUD_OSX_BUNDLE "${APPLICATION_NAME}.app")
|
||||||
set(LIB_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS")
|
set(LIB_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS")
|
||||||
set(BIN_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS")
|
set(BIN_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS")
|
||||||
|
|
||||||
# BUILD_OWNCLOUD_OSX_BUNDLE was disabled on OSX
|
|
||||||
elseif(APPLE AND NOT BUILD_OWNCLOUD_OSX_BUNDLE)
|
|
||||||
message(FATAL_ERROR "Building in non-bundle mode on OSX is currently not supported. Comment this error out if you want to work on/test it.")
|
|
||||||
|
|
||||||
# any other platform
|
|
||||||
else()
|
|
||||||
set(BUILD_OWNCLOUD_OSX_BUNDLE OFF)
|
|
||||||
endif()
|
endif()
|
||||||
#####
|
|
||||||
|
|
||||||
|
option(QUICK_COMPILER "Use QtQuick compiler to improve performance" OFF)
|
||||||
|
|
||||||
# this option removes Http authentication, keychain, shibboleth etc and is intended for
|
# this option removes Http authentication, keychain, shibboleth etc and is intended for
|
||||||
# external authentication mechanisms
|
# external authentication mechanisms
|
||||||
@@ -131,11 +123,8 @@ if(NO_MSG_HANDLER)
|
|||||||
add_definitions(-DNO_MSG_HANDLER=1)
|
add_definitions(-DNO_MSG_HANDLER=1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# this option builds the updater
|
|
||||||
option(BUILD_UPDATER "BUILD_UPDATER" OFF)
|
|
||||||
if(BUILD_UPDATER)
|
if(BUILD_UPDATER)
|
||||||
message("Compiling with updater")
|
message("Compiling with updater")
|
||||||
add_definitions(-DBUILD_UPDATER=1)
|
|
||||||
else()
|
else()
|
||||||
message("Compiling without updater")
|
message("Compiling without updater")
|
||||||
endif()
|
endif()
|
||||||
@@ -194,6 +183,7 @@ if(BUILD_CLIENT)
|
|||||||
pkg_check_modules(CLOUDPROVIDERS cloudproviders IMPORTED_TARGET)
|
pkg_check_modules(CLOUDPROVIDERS cloudproviders IMPORTED_TARGET)
|
||||||
|
|
||||||
if(CLOUDPROVIDERS_FOUND)
|
if(CLOUDPROVIDERS_FOUND)
|
||||||
|
pkg_check_modules(DBUS-1 REQUIRED dbus-1 IMPORTED_TARGET)
|
||||||
pkg_check_modules(GIO REQUIRED gio-2.0 IMPORTED_TARGET)
|
pkg_check_modules(GIO REQUIRED gio-2.0 IMPORTED_TARGET)
|
||||||
pkg_check_modules(GLIB2 REQUIRED glib-2.0 IMPORTED_TARGET)
|
pkg_check_modules(GLIB2 REQUIRED glib-2.0 IMPORTED_TARGET)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ set( APPLICATION_SERVER_URL "" CACHE STRING "URL for the server to use. If enter
|
|||||||
set( APPLICATION_SERVER_URL_ENFORCE ON ) # If set and APPLICATION_SERVER_URL is defined, the server can only connect to the pre-defined URL
|
set( APPLICATION_SERVER_URL_ENFORCE ON ) # If set and APPLICATION_SERVER_URL is defined, the server can only connect to the pre-defined URL
|
||||||
set( APPLICATION_REV_DOMAIN "com.nextcloud.desktopclient" )
|
set( APPLICATION_REV_DOMAIN "com.nextcloud.desktopclient" )
|
||||||
set( APPLICATION_VIRTUALFILE_SUFFIX "nextcloud" CACHE STRING "Virtual file suffix (not including the .)")
|
set( APPLICATION_VIRTUALFILE_SUFFIX "nextcloud" CACHE STRING "Virtual file suffix (not including the .)")
|
||||||
|
set( APPLICATION_OCSP_STAPLING_ENABLED OFF )
|
||||||
|
set( APPLICATION_FORBID_BAD_SSL OFF )
|
||||||
|
|
||||||
set( LINUX_PACKAGE_SHORTNAME "nextcloud" )
|
set( LINUX_PACKAGE_SHORTNAME "nextcloud" )
|
||||||
set( LINUX_APPLICATION_ID "${APPLICATION_REV_DOMAIN}.${LINUX_PACKAGE_SHORTNAME}")
|
set( LINUX_APPLICATION_ID "${APPLICATION_REV_DOMAIN}.${LINUX_PACKAGE_SHORTNAME}")
|
||||||
@@ -28,10 +30,13 @@ option( WITH_CRASHREPORTER "Build crashreporter" OFF )
|
|||||||
#set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
|
#set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
|
||||||
|
|
||||||
## Updater options
|
## Updater options
|
||||||
option( BUILD_UPDATER "Build updater" OFF )
|
option( BUILD_UPDATER "Build updater" ON )
|
||||||
|
|
||||||
option( WITH_PROVIDERS "Build with providers list" ON )
|
option( WITH_PROVIDERS "Build with providers list" ON )
|
||||||
|
|
||||||
|
option( ENFORCE_VIRTUAL_FILES_SYNC_FOLDER "Enforce use of virtual files sync folder when available" OFF )
|
||||||
|
|
||||||
|
option( DO_NOT_USE_PROXY "Do not use system wide proxy, instead always do a direct connection to server" OFF )
|
||||||
|
|
||||||
## Theming options
|
## Theming options
|
||||||
set(NEXTCLOUD_BACKGROUND_COLOR "#0082c9" CACHE STRING "Default Nextcloud background color")
|
set(NEXTCLOUD_BACKGROUND_COLOR "#0082c9" CACHE STRING "Default Nextcloud background color")
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
set( MIRALL_VERSION_MAJOR 3 )
|
set( MIRALL_VERSION_MAJOR 3 )
|
||||||
set( MIRALL_VERSION_MINOR 3 )
|
set( MIRALL_VERSION_MINOR 4 )
|
||||||
set( MIRALL_VERSION_PATCH 0 )
|
set( MIRALL_VERSION_PATCH 50 )
|
||||||
set( MIRALL_VERSION_YEAR 2021 )
|
set( MIRALL_VERSION_YEAR 2021 )
|
||||||
set( MIRALL_SOVERSION 0 )
|
set( MIRALL_SOVERSION 0 )
|
||||||
|
|
||||||
# Minimum supported server version according to https://docs.nextcloud.com/server/latest/admin_manual/release_schedule.html
|
# Minimum supported server version according to https://docs.nextcloud.com/server/latest/admin_manual/release_schedule.html
|
||||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MAJOR 19)
|
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MAJOR 16)
|
||||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MINOR 0)
|
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MINOR 0)
|
||||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_PATCH 0)
|
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_PATCH 0)
|
||||||
|
|
||||||
|
|||||||
@@ -2,78 +2,88 @@
|
|||||||
|
|
||||||
set -xe
|
set -xe
|
||||||
|
|
||||||
mkdir /app
|
export APPNAME=${APPNAME:-nextcloud}
|
||||||
mkdir /build
|
export BUILD_UPDATER=${BUILD_UPDATER:-OFF}
|
||||||
|
export BUILDNR=${BUILDNR:-0000}
|
||||||
|
export DESKTOP_CLIENT_ROOT=${DESKTOP_CLIENT_ROOT:-/home/user}
|
||||||
|
|
||||||
|
#Set Qt-5.15
|
||||||
|
export QT_BASE_DIR=/opt/qt5.15
|
||||||
|
|
||||||
#Set Qt-5.12
|
|
||||||
export QT_BASE_DIR=/opt/qt5.12.10
|
|
||||||
export QTDIR=$QT_BASE_DIR
|
export QTDIR=$QT_BASE_DIR
|
||||||
export PATH=$QT_BASE_DIR/bin:$PATH
|
export PATH=$QT_BASE_DIR/bin:$PATH
|
||||||
export LD_LIBRARY_PATH=$QT_BASE_DIR/lib/x86_64-linux-gnu:$QT_BASE_DIR/lib:$LD_LIBRARY_PATH
|
export LD_LIBRARY_PATH=$QT_BASE_DIR/lib/x86_64-linux-gnu:$QT_BASE_DIR/lib:$LD_LIBRARY_PATH
|
||||||
export PKG_CONFIG_PATH=$QT_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
|
export PKG_CONFIG_PATH=$QT_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
|
||||||
|
|
||||||
#Set APPID for .desktop file processing
|
# Set defaults
|
||||||
export LINUX_APPLICATION_ID=com.nextcloud.desktopclient.nextcloud
|
|
||||||
|
|
||||||
#set defaults
|
|
||||||
export SUFFIX=${DRONE_PULL_REQUEST:=master}
|
export SUFFIX=${DRONE_PULL_REQUEST:=master}
|
||||||
if [ $SUFFIX != "master" ]; then
|
if [ $SUFFIX != "master" ]; then
|
||||||
SUFFIX="PR-$SUFFIX"
|
SUFFIX="PR-$SUFFIX"
|
||||||
fi
|
fi
|
||||||
|
if [ "$BUILD_UPDATER" != "OFF" ]; then
|
||||||
|
BUILD_UPDATER=ON
|
||||||
|
fi
|
||||||
|
|
||||||
#QtKeyChain v0.10.0
|
mkdir /app
|
||||||
cd /build
|
|
||||||
|
# QtKeyChain
|
||||||
git clone https://github.com/frankosterfeld/qtkeychain.git
|
git clone https://github.com/frankosterfeld/qtkeychain.git
|
||||||
cd qtkeychain
|
cd qtkeychain
|
||||||
git checkout v0.10.0
|
git checkout v0.10.0
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake -D CMAKE_INSTALL_PREFIX=/usr ../
|
cmake -G Ninja -D CMAKE_INSTALL_PREFIX=/app/usr ..
|
||||||
make -j4
|
cmake --build . --target all
|
||||||
make install
|
cmake --build . --target install
|
||||||
|
|
||||||
#Build client
|
|
||||||
cd /build
|
# Build client
|
||||||
mkdir build-client
|
mkdir build-client
|
||||||
cd build-client
|
cd build-client
|
||||||
cmake -D CMAKE_INSTALL_PREFIX=/usr \
|
cmake \
|
||||||
|
-G Ninja \
|
||||||
|
-D CMAKE_INSTALL_PREFIX=/app/usr \
|
||||||
-D BUILD_TESTING=OFF \
|
-D BUILD_TESTING=OFF \
|
||||||
-D BUILD_UPDATER=ON \
|
-D BUILD_UPDATER=$BUILD_UPDATER \
|
||||||
-DMIRALL_VERSION_SUFFIX=PR-$DRONE_PULL_REQUEST \
|
-D MIRALL_VERSION_BUILD=$BUILDNR \
|
||||||
-DMIRALL_VERSION_BUILD=$DRONE_BUILD_NUMBER \
|
-D MIRALL_VERSION_SUFFIX="$VERSION_SUFFIX" \
|
||||||
$DRONE_WORKSPACE
|
${DESKTOP_CLIENT_ROOT}
|
||||||
make -j4
|
cmake --build . --target all
|
||||||
make DESTDIR=/app install
|
cmake --build . --target install
|
||||||
|
|
||||||
# Move stuff around
|
# Move stuff around
|
||||||
cd /app
|
cd /app
|
||||||
|
|
||||||
mv ./usr/lib/x86_64-linux-gnu/* ./usr/lib/
|
mv usr/lib/x86_64-linux-gnu/* usr/lib/
|
||||||
rm -rf ./usr/lib/cmake
|
|
||||||
rm -rf ./usr/include
|
|
||||||
rm -rf ./usr/mkspecs
|
|
||||||
rm -rf ./usr/lib/x86_64-linux-gnu/
|
|
||||||
|
|
||||||
# Don't bundle nextcloudcmd as we don't run it anyway
|
mkdir usr/plugins
|
||||||
rm -rf ./usr/bin/nextcloudcmd
|
mv usr/lib/${APPNAME}sync_vfs_suffix.so usr/plugins
|
||||||
|
mv usr/lib/${APPNAME}sync_vfs_xattr.so usr/plugins
|
||||||
|
|
||||||
|
|
||||||
|
rm -rf usr/lib/cmake
|
||||||
|
rm -rf usr/include
|
||||||
|
rm -rf usr/mkspecs
|
||||||
|
rm -rf usr/lib/x86_64-linux-gnu/
|
||||||
|
|
||||||
# Don't bundle the explorer extentions as we can't do anything with them in the AppImage
|
# Don't bundle the explorer extentions as we can't do anything with them in the AppImage
|
||||||
rm -rf ./usr/share/caja-python/
|
rm -rf usr/share/caja-python/
|
||||||
rm -rf ./usr/share/nautilus-python/
|
rm -rf usr/share/nautilus-python/
|
||||||
rm -rf ./usr/share/nemo-python/
|
rm -rf usr/share/nemo-python/
|
||||||
|
|
||||||
# Move sync exclude to right location
|
# Move sync exclude to right location
|
||||||
mv ./etc/Nextcloud/sync-exclude.lst ./usr/bin/
|
mv usr/etc/*/sync-exclude.lst usr/bin/
|
||||||
rm -rf ./etc
|
rm -rf etc
|
||||||
|
|
||||||
DESKTOP_FILE=/app/usr/share/applications/${LINUX_APPLICATION_ID}.desktop
|
# com.nextcloud.desktopclient.nextcloud.desktop
|
||||||
|
DESKTOP_FILE=$(ls /app/usr/share/applications/*.desktop)
|
||||||
sed -i -e 's|Icon=nextcloud|Icon=Nextcloud|g' ${DESKTOP_FILE} # Bug in desktop file?
|
sed -i -e 's|Icon=nextcloud|Icon=Nextcloud|g' ${DESKTOP_FILE} # Bug in desktop file?
|
||||||
cp ./usr/share/icons/hicolor/512x512/apps/Nextcloud.png . # Workaround for linuxeployqt bug, FIXME
|
cp ./usr/share/icons/hicolor/512x512/apps/Nextcloud.png . # Workaround for linuxeployqt bug, FIXME
|
||||||
|
|
||||||
|
|
||||||
# Because distros need to get their shit together
|
# Because distros need to get their shit together
|
||||||
cp -R /lib/x86_64-linux-gnu/libssl.so* ./usr/lib/
|
cp -R /usr/lib/x86_64-linux-gnu/libssl.so* ./usr/lib/
|
||||||
cp -R /lib/x86_64-linux-gnu/libcrypto.so* ./usr/lib/
|
cp -R /usr/lib/x86_64-linux-gnu/libcrypto.so* ./usr/lib/
|
||||||
cp -P /usr/local/lib/libssl.so* ./usr/lib/
|
cp -P /usr/local/lib/libssl.so* ./usr/lib/
|
||||||
cp -P /usr/local/lib/libcrypto.so* ./usr/lib/
|
cp -P /usr/local/lib/libcrypto.so* ./usr/lib/
|
||||||
|
|
||||||
@@ -81,19 +91,23 @@ cp -P /usr/local/lib/libcrypto.so* ./usr/lib/
|
|||||||
cp -P -r /usr/lib/x86_64-linux-gnu/nss ./usr/lib/
|
cp -P -r /usr/lib/x86_64-linux-gnu/nss ./usr/lib/
|
||||||
|
|
||||||
# Use linuxdeployqt to deploy
|
# Use linuxdeployqt to deploy
|
||||||
cd /build
|
wget --ca-directory=/etc/ssl/certs -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
|
||||||
wget --ca-directory=/etc/ssl/certs/ -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
|
|
||||||
chmod a+x linuxdeployqt*.AppImage
|
chmod a+x linuxdeployqt*.AppImage
|
||||||
./linuxdeployqt-continuous-x86_64.AppImage --appimage-extract
|
./linuxdeployqt-continuous-x86_64.AppImage --appimage-extract
|
||||||
rm ./linuxdeployqt-continuous-x86_64.AppImage
|
rm ./linuxdeployqt-continuous-x86_64.AppImage
|
||||||
unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
|
unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
|
||||||
export LD_LIBRARY_PATH=/app/usr/lib/
|
export LD_LIBRARY_PATH=/app/usr/lib/
|
||||||
./squashfs-root/AppRun ${DESKTOP_FILE} -bundle-non-qt-libs -qmldir=$DRONE_WORKSPACE/src/gui
|
./squashfs-root/AppRun ${DESKTOP_FILE} -bundle-non-qt-libs -qmldir=${DESKTOP_CLIENT_ROOT}/src/gui
|
||||||
|
|
||||||
# Set origin
|
# Set origin
|
||||||
./squashfs-root/usr/bin/patchelf --set-rpath '$ORIGIN/' /app/usr/lib/libnextcloudsync.so.0
|
./squashfs-root/usr/bin/patchelf --set-rpath '$ORIGIN/' /app/usr/lib/lib${APPNAME}sync.so.0
|
||||||
|
|
||||||
# Build AppImage
|
# Build AppImage
|
||||||
./squashfs-root/AppRun ${DESKTOP_FILE} -appimage
|
./squashfs-root/AppRun ${DESKTOP_FILE} -appimage -updateinformation="gh-releases-zsync|nextcloud-releases|desktop|latest|Nextcloud-*-x86_64.AppImage.zsync"
|
||||||
|
|
||||||
mv Nextcloud*.AppImage Nextcloud-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage
|
#move AppImage
|
||||||
|
if [ ! -z "$DRONE_COMMIT" ]
|
||||||
|
then
|
||||||
|
mv Nextcloud*.AppImage Nextcloud-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage
|
||||||
|
fi
|
||||||
|
mv *.AppImage ${DESKTOP_CLIENT_ROOT}/
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# Small script that counts the warnings which the compiler emits
|
|
||||||
# and takes care that not more warnings are added.
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import re
|
|
||||||
import requests
|
|
||||||
|
|
||||||
|
|
||||||
if len(sys.argv) != 2:
|
|
||||||
print(f"Usage: {sys.argv[0]} REPOSITORY_PATH")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
repository_path = sys.argv[1]
|
|
||||||
warning_regex = re.compile(r'warning:', re.M)
|
|
||||||
max_allowed_warnings_count_response = requests.get(
|
|
||||||
"https://nextclouddesktopwarningscount.felixweilbach.de")
|
|
||||||
|
|
||||||
if max_allowed_warnings_count_response.status_code != 200:
|
|
||||||
print('Can not get maximum number of allowed warnings')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
max_allowed_warnings_count = int(max_allowed_warnings_count_response.content)
|
|
||||||
|
|
||||||
print("Max number of allowed warnings:", max_allowed_warnings_count)
|
|
||||||
|
|
||||||
warnings_count = 0
|
|
||||||
|
|
||||||
for line in sys.stdin:
|
|
||||||
if warning_regex.findall(line):
|
|
||||||
warnings_count += 1
|
|
||||||
|
|
||||||
print(line, end="")
|
|
||||||
|
|
||||||
if warnings_count > max_allowed_warnings_count:
|
|
||||||
print("Error: Too many warnings! You probably introduced a new warning!")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
print("Total number of warnings:", warnings_count)
|
|
||||||
@@ -15,10 +15,10 @@ OBS_PROJECT_BETA=home:ivaradi:beta
|
|||||||
OBS_PACKAGE=nextcloud-desktop
|
OBS_PACKAGE=nextcloud-desktop
|
||||||
|
|
||||||
if test "${DRONE_TARGET_BRANCH}" = "stable-2.6"; then
|
if test "${DRONE_TARGET_BRANCH}" = "stable-2.6"; then
|
||||||
UBUNTU_DISTRIBUTIONS="bionic focal hirsute impish"
|
UBUNTU_DISTRIBUTIONS="bionic focal impish jammy"
|
||||||
DEBIAN_DISTRIBUTIONS="buster stretch testing"
|
DEBIAN_DISTRIBUTIONS="buster stretch testing"
|
||||||
else
|
else
|
||||||
UBUNTU_DISTRIBUTIONS="focal hirsute impish"
|
UBUNTU_DISTRIBUTIONS="focal impish jammy"
|
||||||
DEBIAN_DISTRIBUTIONS="testing"
|
DEBIAN_DISTRIBUTIONS="testing"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ cd /build
|
|||||||
|
|
||||||
# AppImage
|
# AppImage
|
||||||
export APPIMAGE=$(readlink -f ./Nextcloud*.AppImage)
|
export APPIMAGE=$(readlink -f ./Nextcloud*.AppImage)
|
||||||
|
export UPDATE=$(readlink -f ./Nextcloud*.AppImage.zsync)
|
||||||
export BASENAME=$(basename ${APPIMAGE})
|
export BASENAME=$(basename ${APPIMAGE})
|
||||||
|
|
||||||
if ! test -e $APPIMAGE ; then
|
if ! test -e $APPIMAGE ; then
|
||||||
@@ -70,6 +71,7 @@ upload_release_asset()
|
|||||||
{
|
{
|
||||||
uploadUrl=$1
|
uploadUrl=$1
|
||||||
echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $APPIMAGE)
|
echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $APPIMAGE)
|
||||||
|
echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $UPDATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_release_asset()
|
delete_release_asset()
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ else()
|
|||||||
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "0")
|
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "0")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Qt5 5.12 COMPONENTS Core REQUIRED)
|
find_package(Qt5 5.15 COMPONENTS Core REQUIRED)
|
||||||
configure_file(create_mac.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
|
configure_file(create_mac.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
|
||||||
configure_file(macosx.pkgproj.cmake ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
|
configure_file(macosx.pkgproj.cmake ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
|
||||||
configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh)
|
configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh)
|
||||||
|
|||||||
@@ -695,7 +695,12 @@
|
|||||||
<key>PROJECT_SETTINGS</key>
|
<key>PROJECT_SETTINGS</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>ADVANCED_OPTIONS</key>
|
<key>ADVANCED_OPTIONS</key>
|
||||||
<dict/>
|
<dict>
|
||||||
|
<key>installer-script.options:hostArchitectures</key>
|
||||||
|
<array>
|
||||||
|
<string>x86_64,arm64</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
<key>BUILD_FORMAT</key>
|
<key>BUILD_FORMAT</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<key>BUILD_PATH</key>
|
<key>BUILD_PATH</key>
|
||||||
|
|||||||
82
admin/osx/make_universal.py
Executable file
@@ -0,0 +1,82 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
# A general note: We first produce a x86_64 and a arm64 app package
|
||||||
|
# and then merge them together instead of compiling the desktop client
|
||||||
|
# with the CMake option CMAKE_OSX_ARCHITECTURES="x86_64;arm64" because
|
||||||
|
# macdeployqt can not handle universal binaries well. In the future
|
||||||
|
# with Qt6 this might change and this script will become obsolete.
|
||||||
|
|
||||||
|
|
||||||
|
def usage(program_name):
|
||||||
|
print("Creates a universal app package from a x86_64 and a arm64 app package.")
|
||||||
|
print("Usage: {} x86_64_app_file arm64_app_file output_directory".format(program_name))
|
||||||
|
print("Example: {} some_dir/Nextcloud.app some_other_dir/Nextcloud.app output_dir".format(program_name))
|
||||||
|
|
||||||
|
|
||||||
|
def execute(command):
|
||||||
|
return subprocess.check_output(command)
|
||||||
|
|
||||||
|
|
||||||
|
def path_relative_to_package(app_package_file_path, file_path):
|
||||||
|
if file_path.startswith(app_package_file_path):
|
||||||
|
relative_path = file_path[len(app_package_file_path):]
|
||||||
|
if relative_path.startswith("/"):
|
||||||
|
return relative_path[1:]
|
||||||
|
return relative_path
|
||||||
|
return file_path
|
||||||
|
|
||||||
|
|
||||||
|
def is_executable(file_path):
|
||||||
|
output = str(execute(["file", file_path]))
|
||||||
|
if (("Mach-O 64-bit dynamically linked shared library" in output)
|
||||||
|
or ("Mach-O 64-bit executable" in output)):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 4:
|
||||||
|
usage(sys.argv[0])
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
x86_64_app_file = sys.argv[1]
|
||||||
|
if not os.path.exists(x86_64_app_file):
|
||||||
|
print("Can't create universal: Path {} already exists".format(x86_64_app_file))
|
||||||
|
sys.exit(1)
|
||||||
|
arm64_app_file = sys.argv[2]
|
||||||
|
if not os.path.exists(arm64_app_file):
|
||||||
|
print("Can't create universal: Path {} already exists".format(arm64_app_file))
|
||||||
|
sys.exit(1)
|
||||||
|
output_dir = sys.argv[3]
|
||||||
|
|
||||||
|
# Copy the Arm64 variant to the output location if possible
|
||||||
|
if not os.path.exists(output_dir):
|
||||||
|
os.makedirs(output_dir)
|
||||||
|
app_file_name = os.path.basename(arm64_app_file)
|
||||||
|
universal_app_file = os.path.join(output_dir, app_file_name)
|
||||||
|
if os.path.exists(universal_app_file):
|
||||||
|
print("Can't create universal: Path {} already exists".format(universal_app_file))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
execute(["cp", "-a", arm64_app_file, output_dir])
|
||||||
|
|
||||||
|
# Now walk through the copied arm64 version and replace the binaries
|
||||||
|
for root, dirs, files in os.walk(universal_app_file):
|
||||||
|
for f in files:
|
||||||
|
absoulte_file_path = os.path.join(root, f)
|
||||||
|
root_relative = path_relative_to_package(universal_app_file, root)
|
||||||
|
x86_64_absolute_path = os.path.join(x86_64_app_file, root_relative, f)
|
||||||
|
arm64_absolute_path = os.path.join(arm64_app_file, root_relative, f)
|
||||||
|
if os.path.islink(absoulte_file_path) or not is_executable(absoulte_file_path):
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
execute(["lipo", "-create", "-output", absoulte_file_path, arm64_absolute_path, x86_64_absolute_path])
|
||||||
|
except:
|
||||||
|
print("Could not merge {} with {} into {}!".format(arm64_absolute_path, x86_64_absolute_path, absoulte_file_path))
|
||||||
|
|
||||||
|
print("Finished :)")
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
# Always enable the new 10.10 finder plugin if available
|
# Always enable the new 10.10 finder plugin if available
|
||||||
if [ -x "$(command -v pluginkit)" ]; then
|
if [ -x "$(command -v pluginkit)" ]; then
|
||||||
# add it to DB. This happens automatically too but we try to push it a bit harder for issue #3463
|
# add it to DB. This happens automatically too but we try to push it a bit harder for issue #3463
|
||||||
pluginkit -a "/Applications/@APPLICATION_EXECUTABLE@.app/Contents/PlugIns/FinderSyncExt.appex/"
|
pluginkit -a "/Applications/@APPLICATION_NAME@.app/Contents/PlugIns/FinderSyncExt.appex/"
|
||||||
# Since El Capitan we need to sleep #4650
|
# Since El Capitan we need to sleep #4650
|
||||||
sleep 10s
|
sleep 10s
|
||||||
# enable it
|
# enable it
|
||||||
|
|||||||
@@ -2,5 +2,6 @@
|
|||||||
|
|
||||||
# kill the old version. see issue #2044
|
# kill the old version. see issue #2044
|
||||||
killall @APPLICATION_EXECUTABLE@
|
killall @APPLICATION_EXECUTABLE@
|
||||||
|
killall @APPLICATION_NAME@
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ install(FILES
|
|||||||
${CMAKE_CURRENT_BINARY_DIR}/make-msi.bat
|
${CMAKE_CURRENT_BINARY_DIR}/make-msi.bat
|
||||||
Platform.wxi
|
Platform.wxi
|
||||||
Nextcloud.wxs
|
Nextcloud.wxs
|
||||||
|
RegistryCleanup.vbs
|
||||||
|
RegistryCleanupCustomAction.wxs
|
||||||
gui/banner.bmp
|
gui/banner.bmp
|
||||||
gui/dialog.bmp
|
gui/dialog.bmp
|
||||||
DESTINATION msi/)
|
DESTINATION msi/)
|
||||||
|
|||||||
@@ -77,11 +77,15 @@
|
|||||||
<!-- Uninstall: Remove sync folders from Explorer's Navigation Pane, only effective for the current user (home users) -->
|
<!-- Uninstall: Remove sync folders from Explorer's Navigation Pane, only effective for the current user (home users) -->
|
||||||
<Custom Action="RemoveNavigationPaneEntries" After="RemoveFiles">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
|
<Custom Action="RemoveNavigationPaneEntries" After="RemoveFiles">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
|
||||||
|
|
||||||
|
<!-- Uninstall: Cleanup the Registry -->
|
||||||
|
<Custom Action="RegistryCleanupCustomAction" After="RemoveFiles">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
|
||||||
|
|
||||||
<!-- Schedule Reboot for the Shell Extensions (in silent installation mode only, or if SCHEDULE_REBOOT argument is set-->
|
<!-- Schedule Reboot for the Shell Extensions (in silent installation mode only, or if SCHEDULE_REBOOT argument is set-->
|
||||||
<ScheduleReboot After="InstallFinalize">(SCHEDULE_REBOOT=1) OR NOT (UILevel=2)</ScheduleReboot>
|
<ScheduleReboot After="InstallFinalize">(SCHEDULE_REBOOT=1) OR NOT (UILevel=2)</ScheduleReboot>
|
||||||
</InstallExecuteSequence>
|
</InstallExecuteSequence>
|
||||||
|
|
||||||
<!-- "Add or Remove" Programs Entries -->
|
<!-- "Add or Remove" Programs Entries -->
|
||||||
|
<Property Id="APPNAME">$(var.AppName)</Property>
|
||||||
<Property Id="ARPPRODUCTICON">$(var.AppIcon)</Property>
|
<Property Id="ARPPRODUCTICON">$(var.AppIcon)</Property>
|
||||||
<Property Id="ARPHELPLINK">$(var.AppHelpLink)</Property>
|
<Property Id="ARPHELPLINK">$(var.AppHelpLink)</Property>
|
||||||
<Property Id="ARPURLINFOABOUT">$(var.AppInfoLink)</Property>
|
<Property Id="ARPURLINFOABOUT">$(var.AppInfoLink)</Property>
|
||||||
|
|||||||
54
admin/win/msi/RegistryCleanup.vbs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
On Error goto 0
|
||||||
|
|
||||||
|
Const HKEY_LOCAL_MACHINE = &H80000002
|
||||||
|
|
||||||
|
Const strObjRegistry = "winmgmts:\\.\root\default:StdRegProv"
|
||||||
|
|
||||||
|
Function RegistryDeleteKeyRecursive(regRoot, strKeyPath)
|
||||||
|
Set objRegistry = GetObject(strObjRegistry)
|
||||||
|
objRegistry.EnumKey regRoot, strKeyPath, arrSubkeys
|
||||||
|
If IsArray(arrSubkeys) Then
|
||||||
|
For Each strSubkey In arrSubkeys
|
||||||
|
RegistryDeleteKeyRecursive regRoot, strKeyPath & "\" & strSubkey
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
objRegistry.DeleteKey regRoot, strKeyPath
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Function RegistryListSubkeys(regRoot, strKeyPath)
|
||||||
|
Set objRegistry = GetObject(strObjRegistry)
|
||||||
|
objRegistry.EnumKey regRoot, strKeyPath, arrSubkeys
|
||||||
|
RegistryListSubkeys = arrSubkeys
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Function GetUserSID()
|
||||||
|
Dim objWshNetwork, objUserAccount
|
||||||
|
|
||||||
|
Set objWshNetwork = CreateObject("WScript.Network")
|
||||||
|
|
||||||
|
Set objUserAccount = GetObject("winmgmts://" & objWshNetwork.UserDomain & "/root/cimv2").Get("Win32_UserAccount.Domain='" & objWshNetwork.ComputerName & "',Name='" & objWshNetwork.UserName & "'")
|
||||||
|
GetUserSID = objUserAccount.SID
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Function RegistryCleanupSyncRootManager()
|
||||||
|
strSyncRootManagerKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager"
|
||||||
|
|
||||||
|
arrSubKeys = RegistryListSubkeys(HKEY_LOCAL_MACHINE, strSyncRootManagerKeyPath)
|
||||||
|
|
||||||
|
If IsArray(arrSubkeys) Then
|
||||||
|
arrSubkeys=Filter(arrSubkeys, Session.Property("APPNAME"))
|
||||||
|
End If
|
||||||
|
If IsArray(arrSubkeys) Then
|
||||||
|
arrSubkeys=Filter(arrSubkeys, GetUserSID())
|
||||||
|
End If
|
||||||
|
|
||||||
|
If IsArray(arrSubkeys) Then
|
||||||
|
For Each strSubkey In arrSubkeys
|
||||||
|
RegistryDeleteKeyRecursive HKEY_LOCAL_MACHINE, strSyncRootManagerKeyPath & "\" & strSubkey
|
||||||
|
Next
|
||||||
|
End If
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Function RegistryCleanup()
|
||||||
|
RegistryCleanupSyncRootManager()
|
||||||
|
End Function
|
||||||
7
admin/win/msi/RegistryCleanupCustomAction.wxs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||||
|
<Fragment>
|
||||||
|
<Binary Id="RegistryCleanup" SourceFile="RegistryCleanup.vbs"/>
|
||||||
|
<CustomAction Id='RegistryCleanupCustomAction' BinaryKey="RegistryCleanup" VBScriptCall="RegistryCleanup" Return="ignore" Execute="immediate"/>
|
||||||
|
</Fragment>
|
||||||
|
</Wix>
|
||||||
@@ -17,10 +17,10 @@ Rem Generate collect.wxs
|
|||||||
if %ERRORLEVEL% neq 0 exit %ERRORLEVEL%
|
if %ERRORLEVEL% neq 0 exit %ERRORLEVEL%
|
||||||
|
|
||||||
Rem Compile en-US (https://www.firegiant.com/wix/tutorial/transforms/morphing-installers/)
|
Rem Compile en-US (https://www.firegiant.com/wix/tutorial/transforms/morphing-installers/)
|
||||||
"%WIX%\bin\candle.exe" -dcodepage=1252 -dPlatform=%BuildArch% -arch %BuildArch% -dHarvestAppDir="%HarvestAppDir%" -ext WixUtilExtension NCMsiHelper.wxs WinShellExt.wxs collect.wxs Nextcloud.wxs
|
"%WIX%\bin\candle.exe" -dcodepage=1252 -dPlatform=%BuildArch% -arch %BuildArch% -dHarvestAppDir="%HarvestAppDir%" -ext WixUtilExtension NCMsiHelper.wxs WinShellExt.wxs collect.wxs Nextcloud.wxs RegistryCleanupCustomAction.wxs
|
||||||
if %ERRORLEVEL% neq 0 exit %ERRORLEVEL%
|
if %ERRORLEVEL% neq 0 exit %ERRORLEVEL%
|
||||||
|
|
||||||
Rem Link MSI package
|
Rem Link MSI package
|
||||||
"%WIX%\bin\light.exe" -sw1076 -ext WixUIExtension -ext WixUtilExtension -cultures:en-us NCMsiHelper.wixobj WinShellExt.wixobj collect.wixobj Nextcloud.wixobj -out "@MSI_INSTALLER_FILENAME@"
|
"%WIX%\bin\light.exe" -sw1076 -ext WixUIExtension -ext WixUtilExtension -cultures:en-us NCMsiHelper.wixobj WinShellExt.wixobj collect.wixobj Nextcloud.wixobj RegistryCleanupCustomAction.wixobj -out "@MSI_INSTALLER_FILENAME@"
|
||||||
|
|
||||||
exit %ERRORLEVEL%
|
exit %ERRORLEVEL%
|
||||||
|
|||||||
@@ -32,9 +32,6 @@ install:
|
|||||||
build_script:
|
build_script:
|
||||||
- ps: |
|
- ps: |
|
||||||
craft --src-dir $env:APPVEYOR_BUILD_FOLDER nextcloud-client
|
craft --src-dir $env:APPVEYOR_BUILD_FOLDER nextcloud-client
|
||||||
craft --package --src-dir $env:APPVEYOR_BUILD_FOLDER nextcloud-client
|
|
||||||
cp C:\CraftMaster\windows-msvc2019_64-cl\tmp\*.7z $env:APPVEYOR_BUILD_FOLDER
|
|
||||||
cp C:\CraftMaster\windows-msvc2019_64-cl\tmp\*.exe $env:APPVEYOR_BUILD_FOLDER
|
|
||||||
|
|
||||||
test_script:
|
test_script:
|
||||||
- ps: |
|
- ps: |
|
||||||
@@ -43,7 +40,3 @@ test_script:
|
|||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
- TARGET: windows-msvc2019_64-cl
|
- TARGET: windows-msvc2019_64-cl
|
||||||
|
|
||||||
artifacts:
|
|
||||||
- path: '*.7z'
|
|
||||||
- path: '*.exe'
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
# target does not have the ``WIN32_EXECUTABLE`` property set.
|
# target does not have the ``WIN32_EXECUTABLE`` property set.
|
||||||
# * One of the tools png2ico (See :find-module:`FindPng2Ico`) or
|
# * One of the tools png2ico (See :find-module:`FindPng2Ico`) or
|
||||||
# icotool (see :find-module:`FindIcoTool`) is required.
|
# icotool (see :find-module:`FindIcoTool`) is required.
|
||||||
# * Supported sizes: 16, 24, 32, 48, 64, 128, 256, 512 and 1024.
|
# * Supported sizes: 16, 20, 24, 32, 40, 48, 64, 128, 256, 512 and 1024.
|
||||||
#
|
#
|
||||||
# Mac OS X notes
|
# Mac OS X notes
|
||||||
# * The executable target must have the ``MACOSX_BUNDLE`` property set.
|
# * The executable target must have the ``MACOSX_BUNDLE`` property set.
|
||||||
@@ -102,9 +102,12 @@ include(CMakeParseArguments)
|
|||||||
|
|
||||||
function(ecm_add_app_icon appsources)
|
function(ecm_add_app_icon appsources)
|
||||||
set(options)
|
set(options)
|
||||||
set(oneValueArgs OUTFILE_BASENAME)
|
set(oneValueArgs OUTFILE_BASENAME ICON_INDEX)
|
||||||
set(multiValueArgs ICONS SIDEBAR_ICONS)
|
set(multiValueArgs ICONS SIDEBAR_ICONS RC_DEPENDENCIES)
|
||||||
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||||
|
if (NOT ARG_ICON_INDEX)
|
||||||
|
set(ARG_ICON_INDEX 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT ARG_ICONS)
|
if(NOT ARG_ICONS)
|
||||||
message(FATAL_ERROR "No ICONS argument given to ecm_add_app_icon")
|
message(FATAL_ERROR "No ICONS argument given to ecm_add_app_icon")
|
||||||
@@ -138,8 +141,11 @@ function(ecm_add_app_icon appsources)
|
|||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
_ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;24;32;48;64;128;256;512;1024")
|
_ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;20;24;32;40;48;64;128;256;512;1024")
|
||||||
|
else()
|
||||||
|
_ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;24;32;48;64;128;256;512;1024")
|
||||||
|
endif()
|
||||||
if(ARG_SIDEBAR_ICONS)
|
if(ARG_SIDEBAR_ICONS)
|
||||||
_ecm_add_app_icon_categorize_icons("${ARG_SIDEBAR_ICONS}" "sidebar_icons" "16;32;64;128;256")
|
_ecm_add_app_icon_categorize_icons("${ARG_SIDEBAR_ICONS}" "sidebar_icons" "16;32;64;128;256")
|
||||||
endif()
|
endif()
|
||||||
@@ -168,8 +174,10 @@ function(ecm_add_app_icon appsources)
|
|||||||
|
|
||||||
|
|
||||||
set(windows_icons ${icons_at_16px}
|
set(windows_icons ${icons_at_16px}
|
||||||
|
${icons_at_20px}
|
||||||
${icons_at_24px}
|
${icons_at_24px}
|
||||||
${icons_at_32px}
|
${icons_at_32px}
|
||||||
|
${icons_at_40px}
|
||||||
${icons_at_48px}
|
${icons_at_48px}
|
||||||
${icons_at_64px}
|
${icons_at_64px}
|
||||||
${icons_at_128px}
|
${icons_at_128px}
|
||||||
@@ -204,12 +212,12 @@ function(ecm_add_app_icon appsources)
|
|||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
)
|
)
|
||||||
# this bit's a little hacky to make the dependency stuff work
|
# this bit's a little hacky to make the dependency stuff work
|
||||||
file(WRITE "${_outfilename}.rc.in" "IDI_ICON1 ICON DISCARDABLE \"${_outfilename}.ico\"\n")
|
file(WRITE "${_outfilename}.rc.in" "IDI_ICON${ARG_ICON_INDEX} ICON DISCARDABLE \"${_outfilename}.ico\"\n")
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT "${_outfilename}.rc"
|
OUTPUT "${_outfilename}.rc"
|
||||||
COMMAND ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
ARGS -E copy "${_outfilename}.rc.in" "${_outfilename}.rc"
|
ARGS -E copy "${_outfilename}.rc.in" "${_outfilename}.rc"
|
||||||
DEPENDS "${_outfilename}.ico"
|
DEPENDS ${ARG_RC_DEPENDENCIES} "${_outfilename}.ico"
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -226,7 +234,7 @@ function(ecm_add_app_icon appsources)
|
|||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
foreach(size 16 24 32 48 64 128 ${maxSize})
|
foreach(size 16 20 24 32 40 48 64 128 ${maxSize})
|
||||||
if(NOT icons_at_${size}px)
|
if(NOT icons_at_${size}px)
|
||||||
continue()
|
continue()
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -1,253 +0,0 @@
|
|||||||
#.rst:
|
|
||||||
# GNUInstallDirs
|
|
||||||
# --------------
|
|
||||||
#
|
|
||||||
# Define GNU standard installation directories
|
|
||||||
#
|
|
||||||
# Provides install directory variables as defined for GNU software:
|
|
||||||
#
|
|
||||||
# ::
|
|
||||||
#
|
|
||||||
# http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
|
|
||||||
#
|
|
||||||
# Inclusion of this module defines the following variables:
|
|
||||||
#
|
|
||||||
# ::
|
|
||||||
#
|
|
||||||
# CMAKE_INSTALL_<dir> - destination for files of a given type
|
|
||||||
# CMAKE_INSTALL_FULL_<dir> - corresponding absolute path
|
|
||||||
#
|
|
||||||
# where <dir> is one of:
|
|
||||||
#
|
|
||||||
# ::
|
|
||||||
#
|
|
||||||
# BINDIR - user executables (bin)
|
|
||||||
# SBINDIR - system admin executables (sbin)
|
|
||||||
# LIBEXECDIR - program executables (libexec)
|
|
||||||
# SYSCONFDIR - read-only single-machine data (etc)
|
|
||||||
# SHAREDSTATEDIR - modifiable architecture-independent data (com)
|
|
||||||
# LOCALSTATEDIR - modifiable single-machine data (var)
|
|
||||||
# LIBDIR - object code libraries (lib or lib64 or lib/<multiarch-tuple> on Debian)
|
|
||||||
# INCLUDEDIR - C header files (include)
|
|
||||||
# OLDINCLUDEDIR - C header files for non-gcc (/usr/include)
|
|
||||||
# DATAROOTDIR - read-only architecture-independent data root (share)
|
|
||||||
# DATADIR - read-only architecture-independent data (DATAROOTDIR)
|
|
||||||
# INFODIR - info documentation (DATAROOTDIR/info)
|
|
||||||
# LOCALEDIR - locale-dependent data (DATAROOTDIR/locale)
|
|
||||||
# MANDIR - man documentation (DATAROOTDIR/man)
|
|
||||||
# DOCDIR - documentation root (DATAROOTDIR/doc/PROJECT_NAME)
|
|
||||||
#
|
|
||||||
# Each CMAKE_INSTALL_<dir> value may be passed to the DESTINATION
|
|
||||||
# options of install() commands for the corresponding file type. If the
|
|
||||||
# includer does not define a value the above-shown default will be used
|
|
||||||
# and the value will appear in the cache for editing by the user. Each
|
|
||||||
# CMAKE_INSTALL_FULL_<dir> value contains an absolute path constructed
|
|
||||||
# from the corresponding destination by prepending (if necessary) the
|
|
||||||
# value of CMAKE_INSTALL_PREFIX.
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Copyright 2011 Nikita Krupen'ko <krnekit@gmail.com>
|
|
||||||
# Copyright 2011 Kitware, Inc.
|
|
||||||
#
|
|
||||||
# Distributed under the OSI-approved BSD License (the "License");
|
|
||||||
# see accompanying file Copyright.txt for details.
|
|
||||||
#
|
|
||||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
||||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
# See the License for more information.
|
|
||||||
#=============================================================================
|
|
||||||
# (To distribute this file outside of CMake, substitute the full
|
|
||||||
# License text for the above reference.)
|
|
||||||
|
|
||||||
# Installation directories
|
|
||||||
#
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_BINDIR)
|
|
||||||
set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_SBINDIR)
|
|
||||||
set(CMAKE_INSTALL_SBINDIR "sbin" CACHE PATH "system admin executables (sbin)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_LIBEXECDIR)
|
|
||||||
set(CMAKE_INSTALL_LIBEXECDIR "libexec" CACHE PATH "program executables (libexec)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
|
|
||||||
set(CMAKE_INSTALL_SYSCONFDIR "etc" CACHE PATH "read-only single-machine data (etc)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_SHAREDSTATEDIR)
|
|
||||||
set(CMAKE_INSTALL_SHAREDSTATEDIR "com" CACHE PATH "modifiable architecture-independent data (com)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
|
|
||||||
set(CMAKE_INSTALL_LOCALSTATEDIR "var" CACHE PATH "modifiable single-machine data (var)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# We check if the variable was manually set and not cached, in order to
|
|
||||||
# allow projects to set the values as normal variables before including
|
|
||||||
# GNUInstallDirs to avoid having the entries cached or user-editable. It
|
|
||||||
# replaces the "if(NOT DEFINED CMAKE_INSTALL_XXX)" checks in all the
|
|
||||||
# other cases.
|
|
||||||
# If CMAKE_INSTALL_LIBDIR is defined, if _libdir_set is false, then the
|
|
||||||
# variable is a normal one, otherwise it is a cache one.
|
|
||||||
get_property(_libdir_set CACHE CMAKE_INSTALL_LIBDIR PROPERTY TYPE SET)
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_LIBDIR OR (_libdir_set
|
|
||||||
AND DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX
|
|
||||||
AND NOT "${_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX}" STREQUAL "${CMAKE_INSTALL_PREFIX}"))
|
|
||||||
# If CMAKE_INSTALL_LIBDIR is not defined, it is always executed.
|
|
||||||
# Otherwise:
|
|
||||||
# * if _libdir_set is false it is not executed (meaning that it is
|
|
||||||
# not a cache variable)
|
|
||||||
# * if _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX is not defined it is
|
|
||||||
# not executed
|
|
||||||
# * if _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX and
|
|
||||||
# CMAKE_INSTALL_PREFIX are the same string it is not executed.
|
|
||||||
# _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX is updated after the
|
|
||||||
# execution, of this part of code, therefore at the next inclusion
|
|
||||||
# of the file, CMAKE_INSTALL_LIBDIR is defined, and the 2 strings
|
|
||||||
# are equal, meaning that the if is not executed the code the
|
|
||||||
# second time.
|
|
||||||
|
|
||||||
set(_LIBDIR_DEFAULT "lib")
|
|
||||||
# Override this default 'lib' with 'lib64' iff:
|
|
||||||
# - we are on Linux system but NOT cross-compiling
|
|
||||||
# - we are NOT on debian
|
|
||||||
# - we are on a 64 bits system
|
|
||||||
# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
|
|
||||||
# For Debian with multiarch, use 'lib/${CMAKE_LIBRARY_ARCHITECTURE}' if
|
|
||||||
# CMAKE_LIBRARY_ARCHITECTURE is set (which contains e.g. "i386-linux-gnu"
|
|
||||||
# and CMAKE_INSTALL_PREFIX is "/usr"
|
|
||||||
# See http://wiki.debian.org/Multiarch
|
|
||||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX)
|
|
||||||
set(__LAST_LIBDIR_DEFAULT "lib")
|
|
||||||
# __LAST_LIBDIR_DEFAULT is the default value that we compute from
|
|
||||||
# _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX, not a cache entry for
|
|
||||||
# the value that was last used as the default.
|
|
||||||
# This value is used to figure out whether the user changed the
|
|
||||||
# CMAKE_INSTALL_LIBDIR value manually, or if the value was the
|
|
||||||
# default one. When CMAKE_INSTALL_PREFIX changes, the value is
|
|
||||||
# updated to the new default, unless the user explicitly changed it.
|
|
||||||
endif()
|
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$"
|
|
||||||
AND NOT CMAKE_CROSSCOMPILING)
|
|
||||||
if (EXISTS "/etc/debian_version") # is this a debian system ?
|
|
||||||
if(CMAKE_LIBRARY_ARCHITECTURE)
|
|
||||||
set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
|
|
||||||
endif()
|
|
||||||
else() # not debian, rely on CMAKE_SIZEOF_VOID_P:
|
|
||||||
if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
|
|
||||||
message(AUTHOR_WARNING
|
|
||||||
"Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. "
|
|
||||||
"Please enable at least one language before including GNUInstallDirs.")
|
|
||||||
else()
|
|
||||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
|
||||||
set(_LIBDIR_DEFAULT "lib64")
|
|
||||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX)
|
|
||||||
set(__LAST_LIBDIR_DEFAULT "lib64")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
|
||||||
set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
|
|
||||||
elseif(DEFINED __LAST_LIBDIR_DEFAULT
|
|
||||||
AND "${__LAST_LIBDIR_DEFAULT}" STREQUAL "${CMAKE_INSTALL_LIBDIR}")
|
|
||||||
set_property(CACHE CMAKE_INSTALL_LIBDIR PROPERTY VALUE "${_LIBDIR_DEFAULT}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
# Save for next run
|
|
||||||
set(_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "CMAKE_INSTALL_PREFIX during last run")
|
|
||||||
unset(_libdir_set)
|
|
||||||
unset(__LAST_LIBDIR_DEFAULT)
|
|
||||||
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)
|
|
||||||
set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "C header files (include)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_OLDINCLUDEDIR)
|
|
||||||
set(CMAKE_INSTALL_OLDINCLUDEDIR "/usr/include" CACHE PATH "C header files for non-gcc (/usr/include)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR)
|
|
||||||
set(CMAKE_INSTALL_DATAROOTDIR "share" CACHE PATH "read-only architecture-independent data root (share)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
# Values whose defaults are relative to DATAROOTDIR. Store empty values in
|
|
||||||
# the cache and store the defaults in local variables if the cache values are
|
|
||||||
# not set explicitly. This auto-updates the defaults as DATAROOTDIR changes.
|
|
||||||
|
|
||||||
if(NOT CMAKE_INSTALL_DATADIR)
|
|
||||||
set(CMAKE_INSTALL_DATADIR "" CACHE PATH "read-only architecture-independent data (DATAROOTDIR)")
|
|
||||||
set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_INSTALL_INFODIR)
|
|
||||||
set(CMAKE_INSTALL_INFODIR "" CACHE PATH "info documentation (DATAROOTDIR/info)")
|
|
||||||
set(CMAKE_INSTALL_INFODIR "${CMAKE_INSTALL_DATAROOTDIR}/info")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_INSTALL_LOCALEDIR)
|
|
||||||
set(CMAKE_INSTALL_LOCALEDIR "" CACHE PATH "locale-dependent data (DATAROOTDIR/locale)")
|
|
||||||
set(CMAKE_INSTALL_LOCALEDIR "${CMAKE_INSTALL_DATAROOTDIR}/locale")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_INSTALL_MANDIR)
|
|
||||||
set(CMAKE_INSTALL_MANDIR "" CACHE PATH "man documentation (DATAROOTDIR/man)")
|
|
||||||
set(CMAKE_INSTALL_MANDIR "${CMAKE_INSTALL_DATAROOTDIR}/man")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_INSTALL_DOCDIR)
|
|
||||||
set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (DATAROOTDIR/doc/PROJECT_NAME)")
|
|
||||||
set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
CMAKE_INSTALL_BINDIR
|
|
||||||
CMAKE_INSTALL_SBINDIR
|
|
||||||
CMAKE_INSTALL_LIBEXECDIR
|
|
||||||
CMAKE_INSTALL_SYSCONFDIR
|
|
||||||
CMAKE_INSTALL_SHAREDSTATEDIR
|
|
||||||
CMAKE_INSTALL_LOCALSTATEDIR
|
|
||||||
CMAKE_INSTALL_LIBDIR
|
|
||||||
CMAKE_INSTALL_INCLUDEDIR
|
|
||||||
CMAKE_INSTALL_OLDINCLUDEDIR
|
|
||||||
CMAKE_INSTALL_DATAROOTDIR
|
|
||||||
CMAKE_INSTALL_DATADIR
|
|
||||||
CMAKE_INSTALL_INFODIR
|
|
||||||
CMAKE_INSTALL_LOCALEDIR
|
|
||||||
CMAKE_INSTALL_MANDIR
|
|
||||||
CMAKE_INSTALL_DOCDIR
|
|
||||||
)
|
|
||||||
|
|
||||||
# Result directories
|
|
||||||
#
|
|
||||||
foreach(dir
|
|
||||||
BINDIR
|
|
||||||
SBINDIR
|
|
||||||
LIBEXECDIR
|
|
||||||
SYSCONFDIR
|
|
||||||
SHAREDSTATEDIR
|
|
||||||
LOCALSTATEDIR
|
|
||||||
LIBDIR
|
|
||||||
INCLUDEDIR
|
|
||||||
OLDINCLUDEDIR
|
|
||||||
DATAROOTDIR
|
|
||||||
DATADIR
|
|
||||||
INFODIR
|
|
||||||
LOCALEDIR
|
|
||||||
MANDIR
|
|
||||||
DOCDIR
|
|
||||||
)
|
|
||||||
if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}})
|
|
||||||
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
|
|
||||||
else()
|
|
||||||
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
@@ -27,7 +27,4 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
|||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(DEFINED MIRALL_FATAL_WARNINGS)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
|
||||||
endif(DEFINED MIRALL_FATAL_WARNINGS)
|
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -29,7 +29,11 @@
|
|||||||
#cmakedefine APPLICATION_WIZARD_HEADER_TITLE_COLOR "@APPLICATION_WIZARD_HEADER_TITLE_COLOR@"
|
#cmakedefine APPLICATION_WIZARD_HEADER_TITLE_COLOR "@APPLICATION_WIZARD_HEADER_TITLE_COLOR@"
|
||||||
#cmakedefine APPLICATION_WIZARD_USE_CUSTOM_LOGO "@APPLICATION_WIZARD_USE_CUSTOM_LOGO@"
|
#cmakedefine APPLICATION_WIZARD_USE_CUSTOM_LOGO "@APPLICATION_WIZARD_USE_CUSTOM_LOGO@"
|
||||||
#cmakedefine APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@"
|
#cmakedefine APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@"
|
||||||
|
#cmakedefine APPLICATION_OCSP_STAPLING_ENABLED "@APPLICATION_OCSP_STAPLING_ENABLED@"
|
||||||
|
#cmakedefine APPLICATION_FORBID_BAD_SSL "@APPLICATION_FORBID_BAD_SSL@"
|
||||||
#define APPLICATION_DOTVIRTUALFILE_SUFFIX "." APPLICATION_VIRTUALFILE_SUFFIX
|
#define APPLICATION_DOTVIRTUALFILE_SUFFIX "." APPLICATION_VIRTUALFILE_SUFFIX
|
||||||
|
#cmakedefine01 ENFORCE_VIRTUAL_FILES_SYNC_FOLDER
|
||||||
|
#cmakedefine DO_NOT_USE_PROXY "@DO_NOT_USE_PROXY@"
|
||||||
|
|
||||||
#cmakedefine ZLIB_FOUND @ZLIB_FOUND@
|
#cmakedefine ZLIB_FOUND @ZLIB_FOUND@
|
||||||
|
|
||||||
@@ -38,4 +42,6 @@
|
|||||||
|
|
||||||
#cmakedefine01 GUI_TESTING
|
#cmakedefine01 GUI_TESTING
|
||||||
|
|
||||||
|
#cmakedefine BUILD_UPDATER "@BUILD_UPDATER@"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ Virtual Files
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
* This feature is currently only available on ``Windows`` by default. ``Linux`` implementation is experimental and must be enabled by adding ``showExperimentalOptions=true`` to the ``nextcloud.cfg`` configuration file in the ``App Data`` folder. ``macOS``, at the moment, is using the same backend as ``Linux`` one. It can be enabled with the same ``showExperimentalOptions`` flag.
|
* This feature is currently only available on ``Windows`` by default. ``Linux`` and ``macOS`` implementations are experimental and must be enabled by adding ``showExperimentalOptions=true`` to the ``nextcloud.cfg`` configuration file in the ``App Data`` folder.
|
||||||
|
|
||||||
Oftentimes, users are working with a huge amount of files that are big in size. Synchronizing every such file to a device that's running a Nextcloud desktop client is not always possible due to the user's device storage space limitation.
|
Oftentimes, users are working with a huge amount of files that are big in size. Synchronizing every such file to a device that's running a Nextcloud desktop client is not always possible due to the user's device storage space limitation.
|
||||||
Let's assume that your desktop client is connected to a server that has 1TB of data. You want all those files at hand, so you can quickly access any file via the file explorer. Your device has 512GB local storage device.
|
Let's assume that your desktop client is connected to a server that has 1TB of data. You want all those files at hand, so you can quickly access any file via the file explorer. Your device has 512GB local storage device.
|
||||||
@@ -416,8 +416,15 @@ Needless to say, this is far from being convenient.
|
|||||||
That's why, starting from 3.2.0, we are introducing the VFS (Virtual Files) feature. You may have had experience working with a similar feature in other cloud sync clients. This feature is known by different names: Files On-Demand, SmartSync, etc.
|
That's why, starting from 3.2.0, we are introducing the VFS (Virtual Files) feature. You may have had experience working with a similar feature in other cloud sync clients. This feature is known by different names: Files On-Demand, SmartSync, etc.
|
||||||
The VFS does not occupy much space on the user's storage. It just creates placeholders for each file and folder. These files are quite small and only contain metadata needed to display them properly and to fetch the actual file when needed.
|
The VFS does not occupy much space on the user's storage. It just creates placeholders for each file and folder. These files are quite small and only contain metadata needed to display them properly and to fetch the actual file when needed.
|
||||||
|
|
||||||
One will see a hydration (in other words - file download) process when double-clicking on a file that must become available. There will be a progress-bar popup displayed if the file is large enough. So, the hydration process can be observed and it makes it easy to then find out, how long, it would take to fetch the actual file from the server.
|
When one tries to open a file, for example by double clicking on a
|
||||||
The "Hydration" can be thought of as "downloading" or "fetching" the file contents. As soon as hydration is complete, the file will then be opened normally as now it is a real file on the user's storage. It won't disappear, and, from now on, will always be available, unless it is manually dehydrated.
|
file in the Windows Explorer, one will see that the file gets
|
||||||
|
downloaded and becomes available locally. This can be observed by a
|
||||||
|
small progress-bar popup if the file is large enough.
|
||||||
|
|
||||||
|
As soon as the download is complete, the file will then be opened
|
||||||
|
normally as now it is a real file on the user's storage. It won't
|
||||||
|
disappear, and, from now on, will always be available, unless it is
|
||||||
|
manually dehydrated.
|
||||||
|
|
||||||
.. image:: images/vfs_hydration_progress_bar.png
|
.. image:: images/vfs_hydration_progress_bar.png
|
||||||
:alt: VFS hydration progress bar
|
:alt: VFS hydration progress bar
|
||||||
@@ -433,13 +440,3 @@ Files that must be removed from the local storage only, need to be dehydrated vi
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
* End-to-end Encryption works with Virtual Files (VFS) but only on a per-folder level. Folders with E2EE can be made available offline in their entirety, but the individual files in them can not be retrieved on demand. This is mainly due to two technical reasons. First, the Windows VFS API is not designed for handling encrypted files. Second, while the VFS is designed to deal mostly with large files, E2EE is mostly recommended for use with small files as encrypting and decrypting large files puts large demands on the computer infrastructure.
|
* End-to-end Encryption works with Virtual Files (VFS) but only on a per-folder level. Folders with E2EE can be made available offline in their entirety, but the individual files in them can not be retrieved on demand. This is mainly due to two technical reasons. First, the Windows VFS API is not designed for handling encrypted files. Second, while the VFS is designed to deal mostly with large files, E2EE is mostly recommended for use with small files as encrypting and decrypting large files puts large demands on the computer infrastructure.
|
||||||
|
|
||||||
|
|
||||||
User Status
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Starting from 3.2.0, user status is displayed in the Nextcloud desktop client's tray window. The icon and a text message are displayed as long as those are set in the user's account menu in the Web UI (server's website). At the moment, setting the status from the desktop client is not available.
|
|
||||||
The status is updated almost immediately after it is set in the Web UI. Default user status is always "Online" if no other status is available from the server-side.
|
|
||||||
|
|
||||||
.. image:: images/status_feature_example.png
|
|
||||||
:alt: User Status feature in the tray window
|
|
||||||
|
|||||||
@@ -32,10 +32,9 @@ itself. Should the silent update fail, the client offers a manual download.
|
|||||||
macOS
|
macOS
|
||||||
^^^^^
|
^^^^^
|
||||||
|
|
||||||
If a new update is available, the Nextcloud client initializes a pop-up dialog
|
There is no automatic updater on macOS. If a new update is available,
|
||||||
to alert you of the update and requesting that you update to the latest
|
the Nextcloud client initializes a pop-up dialog to alert you of the
|
||||||
version. Due to their use of the Sparkle frameworks, this is the default
|
update and requesting that you update to the latest version manually.
|
||||||
process for macOS applications.
|
|
||||||
|
|
||||||
Linux
|
Linux
|
||||||
^^^^^
|
^^^^^
|
||||||
@@ -96,14 +95,6 @@ To prevent automatic updates and disallow manual overrides:
|
|||||||
.. note:: branded clients have different key names
|
.. note:: branded clients have different key names
|
||||||
|
|
||||||
|
|
||||||
Preventing Automatic Updates in macOS Environments
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
You can disable the automatic update mechanism, in the macOS operating system,
|
|
||||||
by copying the file
|
|
||||||
``nextcloud.app/Contents/Resources/deny_autoupdate_com.nextcloud.desktopclient.plist``
|
|
||||||
to ``/Library/Preferences/com.nextcloud.desktopclient.plist``.
|
|
||||||
|
|
||||||
Preventing Automatic Updates in Linux Environments
|
Preventing Automatic Updates in Linux Environments
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|||||||
@@ -185,6 +185,8 @@ Then, in Terminal:
|
|||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
% echo 'export CMAKE_INSTALL_PREFIX=~/Builds' >> ~/.nextcloud_build_variables
|
% echo 'export CMAKE_INSTALL_PREFIX=~/Builds' >> ~/.nextcloud_build_variables
|
||||||
|
# If you want to build a macOS app bundle for distribution
|
||||||
|
% echo 'export BUILD_OWNCLOUD_OSX_BUNDLE=ON' >> ~/.nextcloud_build_variables
|
||||||
|
|
||||||
Replace ``~/Builds`` with a different directory if you'd like the build to end up elsewhere.
|
Replace ``~/Builds`` with a different directory if you'd like the build to end up elsewhere.
|
||||||
|
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ copyright = u'2013-2021, The Nextcloud developers'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '3.3'
|
version = '3.4'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = '3.3.0'
|
release = '3.4.50'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Some interesting values that can be set on the configuration file are:
|
|||||||
| ``chunkSize`` | ``10000000`` (10 MB) | Specifies the chunk size of uploaded files in bytes. |
|
| ``chunkSize`` | ``10000000`` (10 MB) | Specifies the chunk size of uploaded files in bytes. |
|
||||||
| | | The client will dynamically adjust this size within the maximum and minimum bounds (see below). |
|
| | | The client will dynamically adjust this size within the maximum and minimum bounds (see below). |
|
||||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||||
| ``maxChunkSize`` | ``100000000`` (100 MB) | Specifies the maximum chunk size of uploaded files in bytes. |
|
| ``maxChunkSize`` | ``1000000000`` (1000 MB) | Specifies the maximum chunk size of uploaded files in bytes. |
|
||||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||||
| ``minChunkSize`` | ``1000000`` (1 MB) | Specifies the minimum chunk size of uploaded files in bytes. |
|
| ``minChunkSize`` | ``1000000`` (1 MB) | Specifies the minimum chunk size of uploaded files in bytes. |
|
||||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 21 KiB |
BIN
doc/images/open-share-dialog.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
doc/images/set-user-status-menu.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
doc/images/set-user-status.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
doc/images/share-dialog-view-profile.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
doc/images/sync-state-paused.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
doc/images/sync-state-synced.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
doc/images/sync-state-syncing.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
doc/images/sync-state-warnings.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
doc/images/unified-search-events.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
doc/images/unified-search-files.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
doc/images/unified-search-talk.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
doc/images/user-account-options.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
doc/images/user_status-selector_dialog.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
doc/images/user_status_selector_main_dialog.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
@@ -8,7 +8,9 @@ There are clients for Linux, macOs, and Microsoft Windows.
|
|||||||
|
|
||||||
The currently supported server releases are the latest three stable versions
|
The currently supported server releases are the latest three stable versions
|
||||||
at time of publication. It means that the |version| release series is supporting
|
at time of publication. It means that the |version| release series is supporting
|
||||||
server major version 19, 20 and 21.
|
stable server major versions.
|
||||||
|
See https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule for
|
||||||
|
supported major versions.
|
||||||
|
|
||||||
Installation on Mac OS X and Windows is the same as for any software
|
Installation on Mac OS X and Windows is the same as for any software
|
||||||
application: download the program and then double-click it to launch the
|
application: download the program and then double-click it to launch the
|
||||||
@@ -31,7 +33,7 @@ download page.
|
|||||||
System Requirements
|
System Requirements
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
- Windows 10+
|
- Windows 8.1+
|
||||||
- macOS 10.12+ (64-bit only)
|
- macOS 10.12+ (64-bit only)
|
||||||
- Linux
|
- Linux
|
||||||
- FreeBSD
|
- FreeBSD
|
||||||
|
|||||||
@@ -157,6 +157,35 @@ icon.
|
|||||||
If a directory includes ignored files that are marked with warning icons
|
If a directory includes ignored files that are marked with warning icons
|
||||||
that does not change the status of the parent directories.
|
that does not change the status of the parent directories.
|
||||||
|
|
||||||
|
Set the user status
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
If you have the user status app installed on your Nextcloud server,
|
||||||
|
you can set your user status from the desktop client. To do so, open
|
||||||
|
the main dialog. Then click on your avatar and then click on the three
|
||||||
|
dots. In the menu that opens click on **Set status**.
|
||||||
|
|
||||||
|
.. figure:: images/user_status_selector_main_dialog.png
|
||||||
|
:alt: Open user status dialog from main dialog.
|
||||||
|
|
||||||
|
In the dialog that opens, you can set your online status if
|
||||||
|
you click on either **Online**, **Away**, **Do not disturb** or
|
||||||
|
**Invisible**. You can also set a custom status message with the text
|
||||||
|
field below or choose one of the predefined status messages below. It
|
||||||
|
is also possible to set a custom emoji if you click on the button with
|
||||||
|
the emoji beside the text input field. The last thing you might want
|
||||||
|
to set is when your user status should be cleared. You can choose the
|
||||||
|
period after which the user status will be cleared by clicking on the
|
||||||
|
button on the left hand side of the text **Clear status message after**.
|
||||||
|
|
||||||
|
.. figure:: images/user_status-selector_dialog.png
|
||||||
|
:alt: Dialog to set user status.
|
||||||
|
|
||||||
|
If you are happy with the status you have created you can enable this
|
||||||
|
status with the button **Set status message**. If you had already a
|
||||||
|
status set, you can clear the status by clicking the cutton **Clear
|
||||||
|
status message**.
|
||||||
|
|
||||||
Sharing From Your Desktop
|
Sharing From Your Desktop
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ the server URL.
|
|||||||
|
|
||||||
Other command line switches supported by ``nextcloudcmd`` include the following:
|
Other command line switches supported by ``nextcloudcmd`` include the following:
|
||||||
|
|
||||||
|
``--path``
|
||||||
|
Overrides default remote root folder to a specific subfolder on the server(e.g.: /Documents would sync the Documents subfolder on the server)
|
||||||
|
|
||||||
``--user``, ``-u`` ``[user]``
|
``--user``, ``-u`` ``[user]``
|
||||||
Use ``user`` as the login name.
|
Use ``user`` as the login name.
|
||||||
|
|
||||||
@@ -67,12 +70,6 @@ Other command line switches supported by ``nextcloudcmd`` include the following:
|
|||||||
``--httpproxy http://[user@pass:]<server>:<port>``
|
``--httpproxy http://[user@pass:]<server>:<port>``
|
||||||
Uses ``server`` as HTTP proxy.
|
Uses ``server`` as HTTP proxy.
|
||||||
|
|
||||||
``--nonshib``
|
|
||||||
Uses Non Shibboleth WebDAV Authentication
|
|
||||||
|
|
||||||
``--davpath [path]``
|
|
||||||
Overrides the WebDAV Path with ``path``
|
|
||||||
|
|
||||||
``--exclude [file]``
|
``--exclude [file]``
|
||||||
Exclude list file
|
Exclude list file
|
||||||
|
|
||||||
@@ -92,15 +89,15 @@ Credential Handling
|
|||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
$ nextcloudcmd /home/user/my_sync_folder https://carla:secret@server/nextcloud/remote.php/dav/
|
$ nextcloudcmd /home/user/my_sync_folder https://carla:secret@server/nextcloud
|
||||||
|
|
||||||
To synchronize the Nextcloud directory ``Music`` to the local directory
|
To synchronize the Nextcloud directory ``Music`` to the local directory
|
||||||
``media/music``, through a proxy listening on port ``8080``, and on a gateway
|
``media/music``, through a proxy listening on port ``8080``, and on a gateway
|
||||||
machine using IP address ``192.168.178.1``, the command line would be::
|
machine using IP address ``192.168.178.1``, the command line would be::
|
||||||
|
|
||||||
$ nextcloudcmd --httpproxy http://192.168.178.1:8080 \
|
$ nextcloudcmd --httpproxy http://192.168.178.1:8080 --path /Music \
|
||||||
$HOME/media/music \
|
$HOME/media/music \
|
||||||
https://server/nextcloud/remote.php/dav/Music
|
https://server/nextcloud
|
||||||
|
|
||||||
``nextcloudcmd`` will prompt for the user name and password, unless they have
|
``nextcloudcmd`` will prompt for the user name and password, unless they have
|
||||||
been specified on the command line or ``-n`` has been passed.
|
been specified on the command line or ``-n`` has been passed.
|
||||||
@@ -120,5 +117,5 @@ Example
|
|||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
$ nextcloudcmd /home/user/<my_sync_folder> \
|
$ nextcloudcmd --path /<Directory_that_has_been_created> /home/user/<my_sync_folder> \
|
||||||
https://<username>:<secret>@<server_address>/remote.php/dav/<Directory_that_has_been_created>
|
https://<username>:<secret>@<server_address>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
===========
|
||||||
Visual Tour
|
Visual Tour
|
||||||
===========
|
===========
|
||||||
|
|
||||||
@@ -11,23 +12,7 @@ as an icon in the system tray (Windows, KDE), status bar
|
|||||||
(macOS), or notification area (Ubuntu).
|
(macOS), or notification area (Ubuntu).
|
||||||
|
|
||||||
.. image:: images/icon.png
|
.. image:: images/icon.png
|
||||||
|
:alt: desktop client icon
|
||||||
Main dialog
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. index:: activity, recent changes, sync activity, main dialog, adding account, account, add account, remove account
|
|
||||||
|
|
||||||
The main dialog, which can be invoked from the tray icon in the
|
|
||||||
taskbar, will show files information about the activities of the sync
|
|
||||||
client and Nextcloud. If there are any synchronization issues, they
|
|
||||||
will show up here. The dialog also gives information about other
|
|
||||||
activities or notifications like Talk mentions or file changes. It
|
|
||||||
does also show the status of the user.
|
|
||||||
|
|
||||||
.. image:: images/main_dialog.png
|
|
||||||
|
|
||||||
When clicking on the avatar a menu opens where it is possible to add a
|
|
||||||
new account or removing an existing account.
|
|
||||||
|
|
||||||
Menu
|
Menu
|
||||||
----
|
----
|
||||||
@@ -45,8 +30,9 @@ A right click on the icon provides the following menu:
|
|||||||
.. NOTE::
|
.. NOTE::
|
||||||
This menu is not available on macOS.
|
This menu is not available on macOS.
|
||||||
|
|
||||||
|
|
||||||
Settings
|
Settings
|
||||||
--------
|
~~~~~~~~
|
||||||
|
|
||||||
Account Settings
|
Account Settings
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
@@ -218,3 +204,98 @@ while syncing for a three times. These are listed in the activity view.
|
|||||||
There also is a button to retry the sync for another three times.
|
There also is a button to retry the sync for another three times.
|
||||||
|
|
||||||
For more detailed information see :ref:`ignored-files-label`.
|
For more detailed information see :ref:`ignored-files-label`.
|
||||||
|
|
||||||
|
Main dialog
|
||||||
|
-----------
|
||||||
|
|
||||||
|
.. index:: activity, recent changes, sync activity, main dialog, adding account, account, add account, remove account, sync state, user status, unified search, share dialog
|
||||||
|
|
||||||
|
Sync State
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
The main dialog, which can be invoked from the tray icon in the
|
||||||
|
taskbar, will show files information about the activities of the sync
|
||||||
|
client and Nextcloud.
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: images/sync-state-paused.png
|
||||||
|
:alt: sync state paused
|
||||||
|
|
||||||
|
.. image:: images/sync-state-syncing.png
|
||||||
|
:alt: sync state syncing
|
||||||
|
|
||||||
|
.. image:: images/sync-state-synced.png
|
||||||
|
:alt: sync state synced
|
||||||
|
|
||||||
|
|
||||||
|
If there are any synchronization issues, they will show up here:
|
||||||
|
|
||||||
|
.. image:: images/sync-state-warnings.png
|
||||||
|
:alt: sync state warnings
|
||||||
|
|
||||||
|
For more information on how to solve these issues see :doc:`troubleshooting`.
|
||||||
|
|
||||||
|
When clicking on the avatar a menu opens where it is
|
||||||
|
possible to add a new account or removing an existing account.
|
||||||
|
|
||||||
|
.. image:: images/user-account-options.png
|
||||||
|
:alt: user account options
|
||||||
|
|
||||||
|
|
||||||
|
User Status
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
User status is displayed in the Nextcloud desktop client's tray window.
|
||||||
|
Default user status is always "Online" if no other status is available from the server-side.
|
||||||
|
|
||||||
|
.. image:: images/status_feature_example.png
|
||||||
|
:alt: User Status feature in the tray window
|
||||||
|
|
||||||
|
When clicking on ``Set status`` you can edit the emoji, message and the timer to clear your user status:
|
||||||
|
|
||||||
|
.. image:: images/set-user-status.png
|
||||||
|
:alt: set user status menu option
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
|
.. image:: images/set-user-status-menu.png
|
||||||
|
:alt: changing the user status
|
||||||
|
|
||||||
|
Activities list
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The dialog also gives information about other activities or
|
||||||
|
notifications like Talk mentions or file changes.
|
||||||
|
It does also show the status of the user.
|
||||||
|
|
||||||
|
.. image:: images/main_dialog.png
|
||||||
|
:alt: main dialog activities list
|
||||||
|
|
||||||
|
Unified search
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
With the unified search you can find everything you have in your server - files,
|
||||||
|
Talk messages, calendar appointments:
|
||||||
|
|
||||||
|
.. image:: images/unified-search-files.png
|
||||||
|
:alt: unified search files search result
|
||||||
|
|
||||||
|
.. image:: images/unified-search-talk.png
|
||||||
|
:alt: unified search Talk conversations search result
|
||||||
|
|
||||||
|
.. image:: images/unified-search-events.png
|
||||||
|
:alt: unified search calendar appointments search result
|
||||||
|
|
||||||
|
|
||||||
|
Share dialog: Talk options and View Profile
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
You can now share a file directly in a conversation in Talk and view the sharee user profile:
|
||||||
|
|
||||||
|
.. image:: images/open-share-dialog.png
|
||||||
|
:alt: open share dialog option
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
|
.. image:: images/share-dialog-view-profile.png
|
||||||
|
:alt: shared dialog sharing options
|
||||||
@@ -24,11 +24,14 @@ The first parameter is the local directory. The second parameter is
|
|||||||
the server URL.
|
the server URL.
|
||||||
|
|
||||||
.. note:: Prior to the 1.6 release of nextcloudcmd, the tool only accepted
|
.. note:: Prior to the 1.6 release of nextcloudcmd, the tool only accepted
|
||||||
``nextcloud://`` or ``nextclouds://`` in place of ``http://`` and ``https://`` as
|
``owncloud://`` or ``ownclouds://`` in place of ``http://`` and ``https://`` as
|
||||||
a scheme. See ``Examples`` for details.
|
a scheme. See ``Examples`` for details.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
=======
|
=======
|
||||||
|
``--path``
|
||||||
|
Overrides default remote root folder to a specific subfolder on the server(e.g.: /Documents would sync the Documents subfolder on the server)
|
||||||
|
|
||||||
``—user``, ``-u`` ``[user]``
|
``—user``, ``-u`` ``[user]``
|
||||||
Use ``user`` as the login name.
|
Use ``user`` as the login name.
|
||||||
|
|
||||||
@@ -50,12 +53,6 @@ OPTIONS
|
|||||||
``—httpproxy http://[user@pass:]<server>:<port>``
|
``—httpproxy http://[user@pass:]<server>:<port>``
|
||||||
Uses ``server`` as HTTP proxy.
|
Uses ``server`` as HTTP proxy.
|
||||||
|
|
||||||
``—nonshib``
|
|
||||||
Uses Non Shibboleth WebDAV Authentication
|
|
||||||
|
|
||||||
``—davpath [path]``
|
|
||||||
Overrides the WebDAV Path with ``path``
|
|
||||||
|
|
||||||
``—exclude [file]``
|
``—exclude [file]``
|
||||||
Exclude list file
|
Exclude list file
|
||||||
|
|
||||||
@@ -74,18 +71,18 @@ To synchronize the nextCloud directory ``Music`` to the local directory ``media/
|
|||||||
through a proxy listening on port ``8080`` on the gateway machine ``192.168.178.1``,
|
through a proxy listening on port ``8080`` on the gateway machine ``192.168.178.1``,
|
||||||
the command line would be::
|
the command line would be::
|
||||||
|
|
||||||
$ nextcloudcmd —httpproxy http://192.168.178.1:8080 \
|
$ nextcloudcmd —httpproxy http://192.168.178.1:8080 --path /Music \
|
||||||
$HOME/media/music \
|
$HOME/media/music \
|
||||||
https://server/nextcloud/remote.php/dav/Music
|
https://server/nextcloud
|
||||||
|
|
||||||
``nextcloudcmd`` will enquire user name and password, unless they have
|
``nextcloudcmd`` will enquire user name and password, unless they have
|
||||||
been specified on the command line or ``-n`` (see `netrc(5)`) has been passed.
|
been specified on the command line or ``-n`` (see `netrc(5)`) has been passed.
|
||||||
|
|
||||||
Using the legacy scheme, it would be::
|
Using the legacy scheme, it would be::
|
||||||
|
|
||||||
$ nextcloudcmd —httpproxy http://192.168.178.1:8080 \
|
$ nextcloudcmd —httpproxy http://192.168.178.1:8080 --path /Music \
|
||||||
$HOME/media/music \
|
$HOME/media/music \
|
||||||
nextclouds://server/nextcloud/remote.php/dav/Music
|
ownclouds://server/nextcloud
|
||||||
|
|
||||||
|
|
||||||
BUGS
|
BUGS
|
||||||
|
|||||||
@@ -1,11 +1,32 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/qml">
|
<qresource prefix="/qml">
|
||||||
|
<file>src/gui/UserStatusSelector.qml</file>
|
||||||
|
<file>src/gui/UserStatusSelectorDialog.qml</file>
|
||||||
|
<file>src/gui/EmojiPicker.qml</file>
|
||||||
|
<file>src/gui/ErrorBox.qml</file>
|
||||||
<file>src/gui/tray/Window.qml</file>
|
<file>src/gui/tray/Window.qml</file>
|
||||||
<file>src/gui/tray/UserLine.qml</file>
|
<file>src/gui/tray/UserLine.qml</file>
|
||||||
<file>src/gui/tray/HeaderButton.qml</file>
|
<file>src/gui/tray/HeaderButton.qml</file>
|
||||||
|
<file>src/gui/tray/SyncStatus.qml</file>
|
||||||
<file>theme/Style/Style.qml</file>
|
<file>theme/Style/Style.qml</file>
|
||||||
<file>theme/Style/qmldir</file>
|
<file>theme/Style/qmldir</file>
|
||||||
<file>src/gui/tray/ActivityActionButton.qml</file>
|
<file>src/gui/tray/ActivityActionButton.qml</file>
|
||||||
<file>src/gui/tray/ActivityItem.qml</file>
|
<file>src/gui/tray/ActivityItem.qml</file>
|
||||||
|
<file>src/gui/tray/AutoSizingMenu.qml</file>
|
||||||
|
<file>src/gui/tray/ActivityList.qml</file>
|
||||||
|
<file>src/gui/tray/FileActivityDialog.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchInputContainer.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchResultFetchMoreTrigger.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchResultItem.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchResultItemSkeleton.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchResultItemSkeletonContainer.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchResultListItem.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchResultNothingFound.qml</file>
|
||||||
|
<file>src/gui/tray/UnifiedSearchResultSectionItem.qml</file>
|
||||||
|
<file>src/gui/tray/CustomButton.qml</file>
|
||||||
|
<file>src/gui/tray/CustomTextButton.qml</file>
|
||||||
|
<file>src/gui/tray/ActivityItemContextMenu.qml</file>
|
||||||
|
<file>src/gui/tray/ActivityItemActions.qml</file>
|
||||||
|
<file>src/gui/tray/ActivityItemContent.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -1,23 +1,26 @@
|
|||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(OC_OEM_SHARE_ICNS "${CMAKE_BINARY_DIR}/src/gui/${APPLICATION_ICON_NAME}.icns")
|
set(OC_OEM_SHARE_ICNS "${CMAKE_BINARY_DIR}/src/gui/${APPLICATION_ICON_NAME}.icns")
|
||||||
|
|
||||||
# The bundle identifier and application group need to have compatible values with the client
|
# The bundle identifier and application group need to have compatible values with the client
|
||||||
# to be able to open a Mach port across the extension's sandbox boundary.
|
# to be able to open a Mach port across the extension's sandbox boundary.
|
||||||
# Pass the info through the xcodebuild command line and make sure that the project uses
|
# Pass the info through the xcodebuild command line and make sure that the project uses
|
||||||
# those user-defined settings to build the plist.
|
# those user-defined settings to build the plist.
|
||||||
add_custom_target( mac_overlayplugin ALL
|
add_custom_target( mac_overlayplugin ALL
|
||||||
xcodebuild -project ${CMAKE_SOURCE_DIR}/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj
|
xcodebuild ARCHS=${CMAKE_OSX_ARCHITECTURES} ONLY_ACTIVE_ARCH=NO
|
||||||
-target FinderSyncExt -configuration Release "SYMROOT=${CMAKE_CURRENT_BINARY_DIR}"
|
-project ${CMAKE_SOURCE_DIR}/shell_integration/MacOSX/OwnCloudFinderSync/OwnCloudFinderSync.xcodeproj
|
||||||
"OC_OEM_SHARE_ICNS=${OC_OEM_SHARE_ICNS}"
|
-target FinderSyncExt -configuration Release "SYMROOT=${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
"OC_APPLICATION_NAME=${APPLICATION_NAME}"
|
"OC_OEM_SHARE_ICNS=${OC_OEM_SHARE_ICNS}"
|
||||||
"OC_APPLICATION_REV_DOMAIN=${APPLICATION_REV_DOMAIN}"
|
"OC_APPLICATION_NAME=${APPLICATION_NAME}"
|
||||||
"OC_SOCKETAPI_TEAM_IDENTIFIER_PREFIX=${SOCKETAPI_TEAM_IDENTIFIER_PREFIX}"
|
"OC_APPLICATION_REV_DOMAIN=${APPLICATION_REV_DOMAIN}"
|
||||||
|
"OC_SOCKETAPI_TEAM_IDENTIFIER_PREFIX=${SOCKETAPI_TEAM_IDENTIFIER_PREFIX}"
|
||||||
COMMENT building Mac Overlay icons
|
COMMENT building Mac Overlay icons
|
||||||
VERBATIM)
|
VERBATIM)
|
||||||
add_dependencies(mac_overlayplugin ${APPLICATION_EXECUTABLE}) # for the ownCloud.icns to be generated
|
add_dependencies(mac_overlayplugin nextcloud) # for the ownCloud.icns to be generated
|
||||||
|
|
||||||
INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Release/FinderSyncExt.appex
|
if (BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||||
DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/PlugIns
|
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Release/FinderSyncExt.appex
|
||||||
USE_SOURCE_PERMISSIONS)
|
DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/PlugIns
|
||||||
endif(APPLE)
|
USE_SOURCE_PERMISSIONS)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ project(dolphin-owncloud)
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.12)
|
cmake_minimum_required(VERSION 2.8.12)
|
||||||
|
|
||||||
set(QT_MIN_VERSION "5.12.0")
|
set(QT_MIN_VERSION "5.15.0")
|
||||||
set(KF5_MIN_VERSION "5.16.0")
|
set(KF5_MIN_VERSION "5.16.0")
|
||||||
set(KDE_INSTALL_USE_QT_SYS_PATHS ON CACHE BOOL "Install the plugin in the right directory")
|
set(KDE_INSTALL_USE_QT_SYS_PATHS ON CACHE BOOL "Install the plugin in the right directory")
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public:
|
|||||||
explicit OwncloudDolphinPluginAction(QObject* parent, const QList<QVariant>&)
|
explicit OwncloudDolphinPluginAction(QObject* parent, const QList<QVariant>&)
|
||||||
: KAbstractFileItemActionPlugin(parent) { }
|
: KAbstractFileItemActionPlugin(parent) { }
|
||||||
|
|
||||||
QList<QAction*> actions(const KFileItemListProperties& fileItemInfos, QWidget* parentWidget) Q_DECL_OVERRIDE
|
QList<QAction*> actions(const KFileItemListProperties& fileItemInfos, QWidget* parentWidget) override
|
||||||
{
|
{
|
||||||
auto helper = OwncloudDolphinPluginHelper::instance();
|
auto helper = OwncloudDolphinPluginHelper::instance();
|
||||||
if (!helper->isConnected() || !fileItemInfos.isLocal())
|
if (!helper->isConnected() || !fileItemInfos.isLocal())
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
if( UNIX AND NOT APPLE )
|
if( UNIX AND NOT APPLE )
|
||||||
|
|
||||||
SET(ICON_DIR ${DATADIR}/icons/hicolor)
|
SET(ICON_DIR ${CMAKE_INSTALL_DATADIR}/icons/hicolor)
|
||||||
|
|
||||||
FOREACH(size 128x128 16x16 256x256 32x32 48x48 64x64 72x72)
|
FOREACH(size 128x128 16x16 256x256 32x32 48x48 64x64 72x72)
|
||||||
file(GLOB files "${size}/*.png")
|
file(GLOB files "${size}/*.png")
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ macro(libcloudproviders_add_config _sources)
|
|||||||
endmacro(libcloudproviders_add_config _sources)
|
endmacro(libcloudproviders_add_config _sources)
|
||||||
|
|
||||||
|
|
||||||
find_package(Qt5 5.12 COMPONENTS DBus)
|
find_package(Qt5 5.15 COMPONENTS DBus)
|
||||||
IF (Qt5DBus_FOUND)
|
IF (Qt5DBus_FOUND)
|
||||||
STRING(TOLOWER "${APPLICATION_VENDOR}" DBUS_VENDOR)
|
STRING(TOLOWER "${APPLICATION_VENDOR}" DBUS_VENDOR)
|
||||||
STRING(REGEX REPLACE "[^A-z0-9]" "" DBUS_VENDOR "${DBUS_VENDOR}")
|
STRING(REGEX REPLACE "[^A-z0-9]" "" DBUS_VENDOR "${DBUS_VENDOR}")
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ if( UNIX AND NOT APPLE )
|
|||||||
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
|
ERROR_VARIABLE errors OUTPUT_VARIABLE out)
|
||||||
|
|
||||||
|
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate.py DESTINATION ${DATADIR}/nautilus-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate.py DESTINATION ${CMAKE_INSTALL_DATADIR}/nautilus-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_nemo.py DESTINATION ${DATADIR}/nemo-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_nemo.py DESTINATION ${CMAKE_INSTALL_DATADIR}/nemo-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_caja.py DESTINATION ${DATADIR}/caja-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/syncstate_caja.py DESTINATION ${CMAKE_INSTALL_DATADIR}/caja-python/extensions RENAME syncstate-${APPLICATION_SHORTNAME}.py)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class __declspec(dllexport) RemotePathChecker {
|
class RemotePathChecker {
|
||||||
public:
|
public:
|
||||||
enum FileState {
|
enum FileState {
|
||||||
// Order synced with NCOverlay
|
// Order synced with NCOverlay
|
||||||
|
|||||||
@@ -63,6 +63,7 @@
|
|||||||
<File Id="NCContextMenu.dll" KeyPath="yes" Source="$(var.HarvestAppDir)\shellext\NCContextMenu.dll">
|
<File Id="NCContextMenu.dll" KeyPath="yes" Source="$(var.HarvestAppDir)\shellext\NCContextMenu.dll">
|
||||||
<Class Id="$(var.ContextMenuGuid)" Context="InprocServer32" Description="$(var.ContextMenuDescription)" ThreadingModel="apartment" />
|
<Class Id="$(var.ContextMenuGuid)" Context="InprocServer32" Description="$(var.ContextMenuDescription)" ThreadingModel="apartment" />
|
||||||
</File>
|
</File>
|
||||||
|
<RegistryValue Root="HKCR" Key="CLSID\$(var.ContextMenuGuid)" Name="ContextMenuOptIn" Value="" Type="string" Action="write" />
|
||||||
<RegistryValue Root="HKCR" Key="AllFileSystemObjects\shellex\ContextMenuHandlers\$(var.ContextMenuRegKeyName)" Value="$(var.ContextMenuGuid)" Type="string" Action="write" />
|
<RegistryValue Root="HKCR" Key="AllFileSystemObjects\shellex\ContextMenuHandlers\$(var.ContextMenuRegKeyName)" Value="$(var.ContextMenuGuid)" Type="string" Action="write" />
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
|
|||||||
12
sonar-project.properties
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
sonar.projectKey=nextcloud_desktop
|
||||||
|
sonar.organization=nextcloud
|
||||||
|
sonar.projectBaseDir=..
|
||||||
|
sonar.sources=src
|
||||||
|
sonar.exclusions=3rdparty/**
|
||||||
|
sonar.language=c++
|
||||||
|
sonar.cfamily.cache.enabled=false
|
||||||
|
sonar.sourceEncoding=UTF-8
|
||||||
|
sonar.cfamily.threads=2
|
||||||
|
sonar.cfamily.gcov.reportsPath=build/Testing/CoverageInfo
|
||||||
|
sonar.cfamily.cache.enabled=true,
|
||||||
|
sonar.cfamily.cache.path=/cache/sonarcloud
|
||||||
@@ -67,8 +67,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
const QColor & color() const { return m_color; }
|
const QColor & color() const { return m_color; }
|
||||||
|
|
||||||
virtual QSize sizeHint() const;
|
QSize sizeHint() const override;
|
||||||
int heightForWidth(int w) const;
|
int heightForWidth(int w) const override;
|
||||||
public slots:
|
public slots:
|
||||||
/*! Starts the spin animation.
|
/*! Starts the spin animation.
|
||||||
\sa stopAnimation isAnimated
|
\sa stopAnimation isAnimated
|
||||||
@@ -98,8 +98,8 @@ public slots:
|
|||||||
*/
|
*/
|
||||||
void setColor(const QColor & color);
|
void setColor(const QColor & color);
|
||||||
protected:
|
protected:
|
||||||
virtual void timerEvent(QTimerEvent * event);
|
void timerEvent(QTimerEvent * event) override;
|
||||||
virtual void paintEvent(QPaintEvent * event);
|
void paintEvent(QPaintEvent * event) override;
|
||||||
private:
|
private:
|
||||||
int m_angle = 0;
|
int m_angle = 0;
|
||||||
int m_timerId = -1;
|
int m_timerId = -1;
|
||||||
|
|||||||
280
src/3rdparty/kirigami/wheelhandler.cpp
vendored
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: LGPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wheelhandler.h"
|
||||||
|
#include <QWheelEvent>
|
||||||
|
#include <QQuickItem>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
class GlobalWheelFilterSingleton
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GlobalWheelFilter self;
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_GLOBAL_STATIC(GlobalWheelFilterSingleton, privateGlobalWheelFilterSelf)
|
||||||
|
|
||||||
|
GlobalWheelFilter::GlobalWheelFilter(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GlobalWheelFilter::~GlobalWheelFilter() = default;
|
||||||
|
|
||||||
|
GlobalWheelFilter *GlobalWheelFilter::self()
|
||||||
|
{
|
||||||
|
return &privateGlobalWheelFilterSelf()->self;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GlobalWheelFilter::setItemHandlerAssociation(QQuickItem *item, WheelHandler *handler)
|
||||||
|
{
|
||||||
|
if (!m_handlersForItem.contains(handler->target())) {
|
||||||
|
handler->target()->installEventFilter(this);
|
||||||
|
}
|
||||||
|
m_handlersForItem.insert(item, handler);
|
||||||
|
|
||||||
|
connect(item, &QObject::destroyed, this, [this](QObject *obj) {
|
||||||
|
auto item = static_cast<QQuickItem *>(obj);
|
||||||
|
m_handlersForItem.remove(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(handler, &QObject::destroyed, this, [this](QObject *obj) {
|
||||||
|
auto handler = static_cast<WheelHandler *>(obj);
|
||||||
|
removeItemHandlerAssociation(handler->target(), handler);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void GlobalWheelFilter::removeItemHandlerAssociation(QQuickItem *item, WheelHandler *handler)
|
||||||
|
{
|
||||||
|
if (!item || !handler) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_handlersForItem.remove(item, handler);
|
||||||
|
if (!m_handlersForItem.contains(item)) {
|
||||||
|
item->removeEventFilter(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GlobalWheelFilter::eventFilter(QObject *watched, QEvent *event)
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::Wheel) {
|
||||||
|
auto item = qobject_cast<QQuickItem *>(watched);
|
||||||
|
if (!item || !item->isEnabled()) {
|
||||||
|
return QObject::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
auto we = static_cast<QWheelEvent *>(event);
|
||||||
|
m_wheelEvent.initializeFromEvent(we);
|
||||||
|
|
||||||
|
bool shouldBlock = false;
|
||||||
|
bool shouldScrollFlickable = false;
|
||||||
|
|
||||||
|
for (auto *handler : m_handlersForItem.values(item)) {
|
||||||
|
if (handler->m_blockTargetWheel) {
|
||||||
|
shouldBlock = true;
|
||||||
|
}
|
||||||
|
if (handler->m_scrollFlickableTarget) {
|
||||||
|
shouldScrollFlickable = true;
|
||||||
|
}
|
||||||
|
emit handler->wheel(&m_wheelEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldScrollFlickable && !m_wheelEvent.isAccepted()) {
|
||||||
|
manageWheel(item, we);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldBlock) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QObject::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GlobalWheelFilter::manageWheel(QQuickItem *target, QWheelEvent *event)
|
||||||
|
{
|
||||||
|
// Duck typing: accept everyhint that has all the properties we need
|
||||||
|
if (target->metaObject()->indexOfProperty("contentX") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("contentY") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("contentWidth") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("contentHeight") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("topMargin") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("bottomMargin") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("leftMargin") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("rightMargin") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("originX") == -1
|
||||||
|
|| target->metaObject()->indexOfProperty("originY") == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal contentWidth = target->property("contentWidth").toReal();
|
||||||
|
qreal contentHeight = target->property("contentHeight").toReal();
|
||||||
|
qreal contentX = target->property("contentX").toReal();
|
||||||
|
qreal contentY = target->property("contentY").toReal();
|
||||||
|
qreal topMargin = target->property("topMargin").toReal();
|
||||||
|
qreal bottomMargin = target->property("bottomMargin").toReal();
|
||||||
|
qreal leftMargin = target->property("leftMaring").toReal();
|
||||||
|
qreal rightMargin = target->property("rightMargin").toReal();
|
||||||
|
qreal originX = target->property("originX").toReal();
|
||||||
|
qreal originY = target->property("originY").toReal();
|
||||||
|
|
||||||
|
// Scroll Y
|
||||||
|
if (contentHeight > target->height()) {
|
||||||
|
|
||||||
|
int y = event->pixelDelta().y() != 0 ? event->pixelDelta().y() : event->angleDelta().y() / 8;
|
||||||
|
|
||||||
|
//if we don't have a pixeldelta, apply the configured mouse wheel lines
|
||||||
|
if (!event->pixelDelta().y()) {
|
||||||
|
y *= 3; // Magic copied value from Kirigami::Settings
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroll one page regardless of delta:
|
||||||
|
if ((event->modifiers() & Qt::ControlModifier) || (event->modifiers() & Qt::ShiftModifier)) {
|
||||||
|
if (y > 0) {
|
||||||
|
y = target->height();
|
||||||
|
} else if (y < 0) {
|
||||||
|
y = -target->height();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal minYExtent = topMargin - originY;
|
||||||
|
qreal maxYExtent = target->height() - (contentHeight + bottomMargin + originY);
|
||||||
|
|
||||||
|
target->setProperty("contentY", qMin(-maxYExtent, qMax(-minYExtent, contentY - y)));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Scroll X
|
||||||
|
if (contentWidth > target->width()) {
|
||||||
|
|
||||||
|
int x = event->pixelDelta().x() != 0 ? event->pixelDelta().x() : event->angleDelta().x() / 8;
|
||||||
|
|
||||||
|
// Special case: when can't scroll vertically, scroll horizontally with vertical wheel as well
|
||||||
|
if (x == 0 && contentHeight <= target->height()) {
|
||||||
|
x = event->pixelDelta().y() != 0 ? event->pixelDelta().y() : event->angleDelta().y() / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if we don't have a pixeldelta, apply the configured mouse wheel lines
|
||||||
|
if (!event->pixelDelta().x()) {
|
||||||
|
x *= 3; // Magic copied value from Kirigami::Settings
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroll one page regardless of delta:
|
||||||
|
if ((event->modifiers() & Qt::ControlModifier) || (event->modifiers() & Qt::ShiftModifier)) {
|
||||||
|
if (x > 0) {
|
||||||
|
x = target->width();
|
||||||
|
} else if (x < 0) {
|
||||||
|
x = -target->width();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal minXExtent = leftMargin - originX;
|
||||||
|
qreal maxXExtent = target->width() - (contentWidth + rightMargin + originX);
|
||||||
|
|
||||||
|
target->setProperty("contentX", qMin(-maxXExtent, qMax(-minXExtent, contentX - x)));
|
||||||
|
}
|
||||||
|
|
||||||
|
//this is just for making the scrollbar
|
||||||
|
target->metaObject()->invokeMethod(target, "flick", Q_ARG(double, 0), Q_ARG(double, 1));
|
||||||
|
target->metaObject()->invokeMethod(target, "cancelFlick");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////
|
||||||
|
KirigamiWheelEvent::KirigamiWheelEvent(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
{}
|
||||||
|
|
||||||
|
KirigamiWheelEvent::~KirigamiWheelEvent() = default;
|
||||||
|
|
||||||
|
void KirigamiWheelEvent::initializeFromEvent(QWheelEvent *event)
|
||||||
|
{
|
||||||
|
m_x = event->position().x();
|
||||||
|
m_y = event->position().y();
|
||||||
|
m_angleDelta = event->angleDelta();
|
||||||
|
m_pixelDelta = event->pixelDelta();
|
||||||
|
m_buttons = event->buttons();
|
||||||
|
m_modifiers = event->modifiers();
|
||||||
|
m_accepted = false;
|
||||||
|
m_inverted = event->inverted();
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal KirigamiWheelEvent::x() const
|
||||||
|
{
|
||||||
|
return m_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal KirigamiWheelEvent::y() const
|
||||||
|
{
|
||||||
|
return m_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF KirigamiWheelEvent::angleDelta() const
|
||||||
|
{
|
||||||
|
return m_angleDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPointF KirigamiWheelEvent::pixelDelta() const
|
||||||
|
{
|
||||||
|
return m_pixelDelta;
|
||||||
|
}
|
||||||
|
|
||||||
|
int KirigamiWheelEvent::buttons() const
|
||||||
|
{
|
||||||
|
return m_buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
int KirigamiWheelEvent::modifiers() const
|
||||||
|
{
|
||||||
|
return m_modifiers;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KirigamiWheelEvent::inverted() const
|
||||||
|
{
|
||||||
|
return m_inverted;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool KirigamiWheelEvent::isAccepted()
|
||||||
|
{
|
||||||
|
return m_accepted;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KirigamiWheelEvent::setAccepted(bool accepted)
|
||||||
|
{
|
||||||
|
m_accepted = accepted;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
|
||||||
|
WheelHandler::WheelHandler(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WheelHandler::~WheelHandler() = default;
|
||||||
|
|
||||||
|
QQuickItem *WheelHandler::target() const
|
||||||
|
{
|
||||||
|
return m_target;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WheelHandler::setTarget(QQuickItem *target)
|
||||||
|
{
|
||||||
|
if (m_target == target) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_target) {
|
||||||
|
GlobalWheelFilter::self()->removeItemHandlerAssociation(m_target, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_target = target;
|
||||||
|
|
||||||
|
GlobalWheelFilter::self()->setItemHandlerAssociation(target, this);
|
||||||
|
|
||||||
|
emit targetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#include "moc_wheelhandler.cpp"
|
||||||
213
src/3rdparty/kirigami/wheelhandler.h
vendored
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: LGPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QtQml>
|
||||||
|
#include <QPoint>
|
||||||
|
#include <QQuickItem>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class QWheelEvent;
|
||||||
|
|
||||||
|
class WheelHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the mouse wheel event
|
||||||
|
*/
|
||||||
|
class KirigamiWheelEvent : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* x: real
|
||||||
|
*
|
||||||
|
* X coordinate of the mouse pointer
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(qreal x READ x CONSTANT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* y: real
|
||||||
|
*
|
||||||
|
* Y coordinate of the mouse pointer
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(qreal y READ y CONSTANT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* angleDelta: point
|
||||||
|
*
|
||||||
|
* The distance the wheel is rotated in degrees.
|
||||||
|
* The x and y coordinates indicate the horizontal and vertical wheels respectively.
|
||||||
|
* A positive value indicates it was rotated up/right, negative, bottom/left
|
||||||
|
* This value is more likely to be set in traditional mice.
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(QPointF angleDelta READ angleDelta CONSTANT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pixelDelta: point
|
||||||
|
*
|
||||||
|
* provides the delta in screen pixels available on high resolution trackpads
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(QPointF pixelDelta READ pixelDelta CONSTANT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* buttons: int
|
||||||
|
*
|
||||||
|
* it contains an OR combination of the buttons that were pressed during the wheel, they can be:
|
||||||
|
* Qt.LeftButton, Qt.MiddleButton, Qt.RightButton
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(int buttons READ buttons CONSTANT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* modifiers: int
|
||||||
|
*
|
||||||
|
* Keyboard mobifiers that were pressed during the wheel event, such as:
|
||||||
|
* Qt.NoModifier (default, no modifiers)
|
||||||
|
* Qt.ControlModifier
|
||||||
|
* Qt.ShiftModifier
|
||||||
|
* ...
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(int modifiers READ modifiers CONSTANT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inverted: bool
|
||||||
|
*
|
||||||
|
* Whether the delta values are inverted
|
||||||
|
* On some platformsthe returned delta are inverted, so positive values would mean bottom/left
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(bool inverted READ inverted CONSTANT)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* accepted: bool
|
||||||
|
*
|
||||||
|
* If set, the event shouldn't be managed anymore,
|
||||||
|
* for instance it can be used to block the handler to manage the scroll of a view on some scenarios
|
||||||
|
* @code
|
||||||
|
* // This handler handles automatically the scroll of
|
||||||
|
* // flickableItem, unless Ctrl is pressed, in this case the
|
||||||
|
* // app has custom code to handle Ctrl+wheel zooming
|
||||||
|
* Kirigami.WheelHandler {
|
||||||
|
* target: flickableItem
|
||||||
|
* blockTargetWheel: true
|
||||||
|
* scrollFlickableTarget: true
|
||||||
|
* onWheel: {
|
||||||
|
* if (wheel.modifiers & Qt.ControlModifier) {
|
||||||
|
* wheel.accepted = true;
|
||||||
|
* // Handle scaling of the view
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
|
||||||
|
|
||||||
|
public:
|
||||||
|
KirigamiWheelEvent(QObject *parent = nullptr);
|
||||||
|
~KirigamiWheelEvent() override;
|
||||||
|
|
||||||
|
void initializeFromEvent(QWheelEvent *event);
|
||||||
|
|
||||||
|
qreal x() const;
|
||||||
|
qreal y() const;
|
||||||
|
QPointF angleDelta() const;
|
||||||
|
QPointF pixelDelta() const;
|
||||||
|
int buttons() const;
|
||||||
|
int modifiers() const;
|
||||||
|
bool inverted() const;
|
||||||
|
bool isAccepted();
|
||||||
|
void setAccepted(bool accepted);
|
||||||
|
|
||||||
|
private:
|
||||||
|
qreal m_x = 0;
|
||||||
|
qreal m_y = 0;
|
||||||
|
QPointF m_angleDelta;
|
||||||
|
QPointF m_pixelDelta;
|
||||||
|
Qt::MouseButtons m_buttons = Qt::NoButton;
|
||||||
|
Qt::KeyboardModifiers m_modifiers = Qt::NoModifier;
|
||||||
|
bool m_inverted = false;
|
||||||
|
bool m_accepted = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GlobalWheelFilter : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
GlobalWheelFilter(QObject *parent = nullptr);
|
||||||
|
~GlobalWheelFilter() override;
|
||||||
|
|
||||||
|
static GlobalWheelFilter *self();
|
||||||
|
|
||||||
|
void setItemHandlerAssociation(QQuickItem *item, WheelHandler *handler);
|
||||||
|
void removeItemHandlerAssociation(QQuickItem *item, WheelHandler *handler);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *watched, QEvent *event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void manageWheel(QQuickItem *target, QWheelEvent *wheel);
|
||||||
|
|
||||||
|
QMultiHash<QQuickItem *, WheelHandler *> m_handlersForItem;
|
||||||
|
KirigamiWheelEvent m_wheelEvent;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class intercepts the mouse wheel events of its target, and gives them to the user code as a signal, which can be used for custom mouse wheel management code.
|
||||||
|
* The handler can block completely the wheel events from its target, and if it's a Flickable, it can automatically handle scrolling on it
|
||||||
|
*/
|
||||||
|
class WheelHandler : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target: Item
|
||||||
|
*
|
||||||
|
* The target we want to manage wheel events.
|
||||||
|
* We will receive wheel() signals every time the user moves
|
||||||
|
* the mouse wheel (or scrolls with the touchpad) on top
|
||||||
|
* of that item.
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* blockTargetWheel: bool
|
||||||
|
*
|
||||||
|
* If true, the target won't receive any wheel event at all (default true)
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(bool blockTargetWheel MEMBER m_blockTargetWheel NOTIFY blockTargetWheelChanged)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scrollFlickableTarget: bool
|
||||||
|
* If this property is true and the target is a Flickable, wheel events will cause the Flickable to scroll (default true)
|
||||||
|
*/
|
||||||
|
Q_PROPERTY(bool scrollFlickableTarget MEMBER m_scrollFlickableTarget NOTIFY scrollFlickableTargetChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit WheelHandler(QObject *parent = nullptr);
|
||||||
|
~WheelHandler() override;
|
||||||
|
|
||||||
|
QQuickItem *target() const;
|
||||||
|
void setTarget(QQuickItem *target);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void targetChanged();
|
||||||
|
void blockTargetWheelChanged();
|
||||||
|
void scrollFlickableTargetChanged();
|
||||||
|
void wheel(KirigamiWheelEvent *wheel);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPointer<QQuickItem> m_target;
|
||||||
|
bool m_blockTargetWheel = true;
|
||||||
|
bool m_scrollFlickableTarget = true;
|
||||||
|
KirigamiWheelEvent m_wheelEvent;
|
||||||
|
|
||||||
|
friend class GlobalWheelFilter;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
2
src/3rdparty/libcrashreporter-qt
vendored
2
src/3rdparty/qtlockedfile/qtlockedfile.h
vendored
@@ -57,7 +57,7 @@ public:
|
|||||||
|
|
||||||
QtLockedFile();
|
QtLockedFile();
|
||||||
QtLockedFile(const QString &name);
|
QtLockedFile(const QString &name);
|
||||||
~QtLockedFile();
|
~QtLockedFile() override;
|
||||||
|
|
||||||
bool lock(LockMode mode, bool block = true);
|
bool lock(LockMode mode, bool block = true);
|
||||||
bool unlock();
|
bool unlock();
|
||||||
|
|||||||
@@ -44,13 +44,13 @@ class QtSingleApplication : public QApplication
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
QtSingleApplication(const QString &id, int &argc, char **argv);
|
QtSingleApplication(const QString &id, int &argc, char **argv);
|
||||||
~QtSingleApplication();
|
~QtSingleApplication() override;
|
||||||
|
|
||||||
bool isRunning(qint64 pid = -1);
|
bool isRunning(qint64 pid = -1);
|
||||||
|
|
||||||
void setActivationWindow(QWidget* aw, bool activateOnMessage = true);
|
void setActivationWindow(QWidget* aw, bool activateOnMessage = true);
|
||||||
QWidget* activationWindow() const;
|
QWidget* activationWindow() const;
|
||||||
bool event(QEvent *event) Q_DECL_OVERRIDE;
|
bool event(QEvent *event) override;
|
||||||
|
|
||||||
QString applicationId() const;
|
QString applicationId() const;
|
||||||
void setBlock(bool value);
|
void setBlock(bool value);
|
||||||
|
|||||||
@@ -4,10 +4,8 @@ endif()
|
|||||||
|
|
||||||
include(ECMEnableSanitizers)
|
include(ECMEnableSanitizers)
|
||||||
|
|
||||||
set(synclib_NAME ${APPLICATION_EXECUTABLE}sync)
|
find_package(Qt5 5.15 COMPONENTS Core Network Xml Concurrent REQUIRED)
|
||||||
|
find_package(Qt5 5.15 COMPONENTS WebEngineWidgets WebEngine)
|
||||||
find_package(Qt5 5.12 COMPONENTS Core Network Xml Concurrent REQUIRED)
|
|
||||||
find_package(Qt5 5.12 COMPONENTS WebEngineWidgets WebEngine)
|
|
||||||
|
|
||||||
if(Qt5WebEngine_FOUND AND Qt5WebEngineWidgets_FOUND)
|
if(Qt5WebEngine_FOUND AND Qt5WebEngineWidgets_FOUND)
|
||||||
add_compile_definitions(WITH_WEBENGINE=1)
|
add_compile_definitions(WITH_WEBENGINE=1)
|
||||||
@@ -61,10 +59,6 @@ elseif(UNIX AND NOT APPLE)
|
|||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now")
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(
|
|
||||||
${CMAKE_SOURCE_DIR}/src/3rdparty
|
|
||||||
)
|
|
||||||
|
|
||||||
set(QML_IMPORT_PATH ${CMAKE_SOURCE_DIR}/theme CACHE STRING "" FORCE)
|
set(QML_IMPORT_PATH ${CMAKE_SOURCE_DIR}/theme CACHE STRING "" FORCE)
|
||||||
|
|
||||||
add_subdirectory(csync)
|
add_subdirectory(csync)
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
project(cmd)
|
project(cmd)
|
||||||
set(CMAKE_AUTOMOC TRUE)
|
set(CMAKE_AUTOMOC TRUE)
|
||||||
|
|
||||||
set(cmd_NAME ${APPLICATION_EXECUTABLE}cmd)
|
|
||||||
|
|
||||||
add_library(cmdCore STATIC simplesslerrorhandler.cpp netrcparser.cpp)
|
add_library(cmdCore STATIC simplesslerrorhandler.cpp netrcparser.cpp)
|
||||||
|
|
||||||
target_link_libraries(cmdCore
|
target_link_libraries(cmdCore
|
||||||
PUBLIC
|
PUBLIC
|
||||||
"${csync_NAME}"
|
Nextcloud::sync
|
||||||
"${synclib_NAME}"
|
|
||||||
Qt5::Core
|
Qt5::Core
|
||||||
Qt5::Network
|
Qt5::Network
|
||||||
)
|
)
|
||||||
@@ -27,20 +24,22 @@ if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_LIBRARIES_ONLY)
|
if(NOT BUILD_LIBRARIES_ONLY)
|
||||||
add_executable(${cmd_NAME} cmd.cpp)
|
add_executable(nextcloudcmd cmd.cpp)
|
||||||
|
set_target_properties(nextcloudcmd PROPERTIES
|
||||||
|
RUNTIME_OUTPUT_NAME "${APPLICATION_EXECUTABLE}cmd")
|
||||||
|
|
||||||
|
target_link_libraries(nextcloudcmd cmdCore)
|
||||||
|
|
||||||
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
if(BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||||
set_target_properties(${cmd_NAME} PROPERTIES
|
set_target_properties(nextcloudcmd PROPERTIES
|
||||||
RUNTIME_OUTPUT_DIRECTORY "${BIN_OUTPUT_DIRECTORY}/${OWNCLOUD_OSX_BUNDLE}/Contents/MacOS")
|
RUNTIME_OUTPUT_DIRECTORY "${BIN_OUTPUT_DIRECTORY}/${OWNCLOUD_OSX_BUNDLE}/Contents/MacOS")
|
||||||
else()
|
else()
|
||||||
set_target_properties(${cmd_NAME} PROPERTIES
|
set_target_properties(nextcloudcmd PROPERTIES
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY})
|
RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY})
|
||||||
|
|
||||||
install(TARGETS ${cmd_NAME}
|
install(TARGETS nextcloudcmd
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(${cmd_NAME} cmdCore)
|
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ struct CmdOptions
|
|||||||
{
|
{
|
||||||
QString source_dir;
|
QString source_dir;
|
||||||
QString target_url;
|
QString target_url;
|
||||||
|
QString remotePath = QStringLiteral("/");
|
||||||
QString config_directory;
|
QString config_directory;
|
||||||
QString user;
|
QString user;
|
||||||
QString password;
|
QString password;
|
||||||
@@ -77,7 +78,6 @@ struct CmdOptions
|
|||||||
bool ignoreHiddenFiles;
|
bool ignoreHiddenFiles;
|
||||||
QString exclude;
|
QString exclude;
|
||||||
QString unsyncedfolders;
|
QString unsyncedfolders;
|
||||||
QString davPath;
|
|
||||||
int restartTimes;
|
int restartTimes;
|
||||||
int downlimit;
|
int downlimit;
|
||||||
int uplimit;
|
int uplimit;
|
||||||
@@ -142,7 +142,7 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void askFromUser() Q_DECL_OVERRIDE
|
void askFromUser() override
|
||||||
{
|
{
|
||||||
_password = ::queryPassword(user());
|
_password = ::queryPassword(user());
|
||||||
_ready = true;
|
_ready = true;
|
||||||
@@ -155,7 +155,7 @@ public:
|
|||||||
_sslTrusted = isTrusted;
|
_sslTrusted = isTrusted;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sslIsTrusted() Q_DECL_OVERRIDE
|
bool sslIsTrusted() override
|
||||||
{
|
{
|
||||||
return _sslTrusted;
|
return _sslTrusted;
|
||||||
}
|
}
|
||||||
@@ -193,6 +193,7 @@ void help()
|
|||||||
std::cout << " -h Sync hidden files, do not ignore them" << std::endl;
|
std::cout << " -h Sync hidden files, do not ignore them" << std::endl;
|
||||||
std::cout << " --version, -v Display version and exit" << std::endl;
|
std::cout << " --version, -v Display version and exit" << std::endl;
|
||||||
std::cout << " --logdebug More verbose logging" << std::endl;
|
std::cout << " --logdebug More verbose logging" << std::endl;
|
||||||
|
std::cout << " --path Path to a folder on a remote server" << std::endl;
|
||||||
std::cout << "" << std::endl;
|
std::cout << "" << std::endl;
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
@@ -269,7 +270,10 @@ void parseOptions(const QStringList &app_args, CmdOptions *options)
|
|||||||
} else if (option == "--logdebug") {
|
} else if (option == "--logdebug") {
|
||||||
Logger::instance()->setLogFile("-");
|
Logger::instance()->setLogFile("-");
|
||||||
Logger::instance()->setLogDebug(true);
|
Logger::instance()->setLogDebug(true);
|
||||||
} else {
|
} else if (option == "--path" && !it.peekNext().startsWith("-")) {
|
||||||
|
options->remotePath = it.next();
|
||||||
|
}
|
||||||
|
else {
|
||||||
help();
|
help();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -291,9 +295,10 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList)
|
|||||||
|
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
|
|
||||||
auto oldBlackListSet = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok).toSet();
|
const auto selectiveSyncList = journal->getSelectiveSyncList(SyncJournalDb::SelectiveSyncBlackList, &ok);
|
||||||
|
const QSet<QString> oldBlackListSet(selectiveSyncList.begin(), selectiveSyncList.end());
|
||||||
if (ok) {
|
if (ok) {
|
||||||
auto blackListSet = newList.toSet();
|
const QSet<QString> blackListSet(newList.begin(), newList.end());
|
||||||
const auto changes = (oldBlackListSet - blackListSet) + (blackListSet - oldBlackListSet);
|
const auto changes = (oldBlackListSet - blackListSet) + (blackListSet - oldBlackListSet);
|
||||||
for (const auto &it : changes) {
|
for (const auto &it : changes) {
|
||||||
journal->schedulePathForRemoteDiscovery(it);
|
journal->schedulePathForRemoteDiscovery(it);
|
||||||
@@ -305,6 +310,9 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList)
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
SetDllDirectory(L"");
|
||||||
|
#endif
|
||||||
QCoreApplication app(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
@@ -313,8 +321,6 @@ int main(int argc, char **argv)
|
|||||||
qputenv("OPENSSL_CONF", opensslConf.toLocal8Bit());
|
qputenv("OPENSSL_CONF", opensslConf.toLocal8Bit());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qsrand(std::random_device()());
|
|
||||||
|
|
||||||
CmdOptions options;
|
CmdOptions options;
|
||||||
options.silent = false;
|
options.silent = false;
|
||||||
options.trustSSL = false;
|
options.trustSSL = false;
|
||||||
@@ -339,16 +345,15 @@ int main(int argc, char **argv)
|
|||||||
qFatal("Could not initialize account!");
|
qFatal("Could not initialize account!");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
// check if the webDAV path was added to the url and append if not.
|
|
||||||
if (!options.target_url.endsWith("/")) {
|
if (options.target_url.contains("/webdav", Qt::CaseInsensitive) || options.target_url.contains("/dav", Qt::CaseInsensitive)) {
|
||||||
options.target_url.append("/");
|
qWarning("Dav or webdav in server URL.");
|
||||||
|
std::cerr << "Error! Please specify only the base URL of your host with username and password. Example:" << std::endl
|
||||||
|
<< "http(s)://username:password@cloud.example.com" << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!options.target_url.contains(account->davPath())) {
|
QUrl hostUrl = QUrl::fromUserInput((options.target_url.endsWith(QLatin1Char('/')) || options.target_url.endsWith(QLatin1Char('\\'))) ? options.target_url.chopped(1) : options.target_url);
|
||||||
options.target_url.append(account->davPath());
|
|
||||||
}
|
|
||||||
|
|
||||||
QUrl url = QUrl::fromUserInput(options.target_url);
|
|
||||||
|
|
||||||
// Order of retrieval attempt (later attempts override earlier ones):
|
// Order of retrieval attempt (later attempts override earlier ones):
|
||||||
// 1. From URL
|
// 1. From URL
|
||||||
@@ -356,8 +361,8 @@ int main(int argc, char **argv)
|
|||||||
// 3. From netrc (if enabled)
|
// 3. From netrc (if enabled)
|
||||||
// 4. From prompt (if interactive)
|
// 4. From prompt (if interactive)
|
||||||
|
|
||||||
QString user = url.userName();
|
QString user = hostUrl.userName();
|
||||||
QString password = url.password();
|
QString password = hostUrl.password();
|
||||||
|
|
||||||
if (!options.user.isEmpty()) {
|
if (!options.user.isEmpty()) {
|
||||||
user = options.user;
|
user = options.user;
|
||||||
@@ -370,7 +375,7 @@ int main(int argc, char **argv)
|
|||||||
if (options.useNetrc) {
|
if (options.useNetrc) {
|
||||||
NetrcParser parser;
|
NetrcParser parser;
|
||||||
if (parser.parse()) {
|
if (parser.parse()) {
|
||||||
NetrcParser::LoginPair pair = parser.find(url.host());
|
NetrcParser::LoginPair pair = parser.find(hostUrl.host());
|
||||||
user = pair.first;
|
user = pair.first;
|
||||||
password = pair.second;
|
password = pair.second;
|
||||||
}
|
}
|
||||||
@@ -388,24 +393,15 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// take the unmodified url to pass to csync_create()
|
|
||||||
QByteArray remUrl = options.target_url.toUtf8();
|
|
||||||
|
|
||||||
// Find the folder and the original owncloud url
|
// Find the folder and the original owncloud url
|
||||||
QStringList splitted = url.path().split("/" + account->davPath());
|
|
||||||
url.setPath(splitted.value(0));
|
|
||||||
|
|
||||||
url.setScheme(url.scheme().replace("owncloud", "http"));
|
hostUrl.setScheme(hostUrl.scheme().replace("owncloud", "http"));
|
||||||
|
|
||||||
QUrl credentialFreeUrl = url;
|
QUrl credentialFreeUrl = hostUrl;
|
||||||
credentialFreeUrl.setUserName(QString());
|
credentialFreeUrl.setUserName(QString());
|
||||||
credentialFreeUrl.setPassword(QString());
|
credentialFreeUrl.setPassword(QString());
|
||||||
|
|
||||||
// Remote folders typically start with a / and don't end with one
|
const QString folder = options.remotePath;
|
||||||
QString folder = "/" + splitted.value(1);
|
|
||||||
if (folder.endsWith("/") && folder != "/") {
|
|
||||||
folder.chop(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!options.proxy.isNull()) {
|
if (!options.proxy.isNull()) {
|
||||||
QString host;
|
QString host;
|
||||||
@@ -442,7 +438,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
account->setUrl(url);
|
account->setUrl(hostUrl);
|
||||||
account->setSslErrorHandler(sslErrorHandler);
|
account->setSslErrorHandler(sslErrorHandler);
|
||||||
|
|
||||||
QEventLoop loop;
|
QEventLoop loop;
|
||||||
@@ -487,7 +483,7 @@ restart_sync:
|
|||||||
qCritical() << "Could not open file containing the list of unsynced folders: " << options.unsyncedfolders;
|
qCritical() << "Could not open file containing the list of unsynced folders: " << options.unsyncedfolders;
|
||||||
} else {
|
} else {
|
||||||
// filter out empty lines and comments
|
// filter out empty lines and comments
|
||||||
selectiveSyncList = QString::fromUtf8(f.readAll()).split('\n').filter(QRegExp("\\S+")).filter(QRegExp("^[^#]"));
|
selectiveSyncList = QString::fromUtf8(f.readAll()).split('\n').filter(QRegularExpression("\\S+")).filter(QRegularExpression("^[^#]"));
|
||||||
|
|
||||||
for (int i = 0; i < selectiveSyncList.count(); ++i) {
|
for (int i = 0; i < selectiveSyncList.count(); ++i) {
|
||||||
if (!selectiveSyncList.at(i).endsWith(QLatin1Char('/'))) {
|
if (!selectiveSyncList.at(i).endsWith(QLatin1Char('/'))) {
|
||||||
@@ -505,6 +501,9 @@ restart_sync:
|
|||||||
selectiveSyncFixup(&db, selectiveSyncList);
|
selectiveSyncFixup(&db, selectiveSyncList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyncOptions opt;
|
||||||
|
opt.fillFromEnvironmentVariables();
|
||||||
|
opt.verifyChunkSizes();
|
||||||
SyncEngine engine(account, options.source_dir, folder, &db);
|
SyncEngine engine(account, options.source_dir, folder, &db);
|
||||||
engine.setIgnoreHiddenFiles(options.ignoreHiddenFiles);
|
engine.setIgnoreHiddenFiles(options.ignoreHiddenFiles);
|
||||||
engine.setNetworkLimits(options.uplimit, options.downlimit);
|
engine.setNetworkLimits(options.uplimit, options.downlimit);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace OCC {
|
|||||||
class SimpleSslErrorHandler : public OCC::AbstractSslErrorHandler
|
class SimpleSslErrorHandler : public OCC::AbstractSslErrorHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool handleErrors(QList<QSslError> errors, const QSslConfiguration &conf, QList<QSslCertificate> *certs, OCC::AccountPtr) Q_DECL_OVERRIDE;
|
bool handleErrors(QList<QSslError> errors, const QSslConfiguration &conf, QList<QSslCertificate> *certs, OCC::AccountPtr) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -142,21 +142,30 @@ QByteArray makeChecksumHeader(const QByteArray &checksumType, const QByteArray &
|
|||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray findBestChecksum(const QByteArray &checksums)
|
QByteArray findBestChecksum(const QByteArray &_checksums)
|
||||||
{
|
{
|
||||||
|
if (_checksums.isEmpty()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
const auto checksums = QString::fromUtf8(_checksums);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
// The order of the searches here defines the preference ordering.
|
// The order of the searches here defines the preference ordering.
|
||||||
if (-1 != (i = checksums.indexOf("SHA3-256:"))
|
if (-1 != (i = checksums.indexOf(QLatin1String("SHA3-256:"), 0, Qt::CaseInsensitive))
|
||||||
|| -1 != (i = checksums.indexOf("SHA256:"))
|
|| -1 != (i = checksums.indexOf(QLatin1String("SHA256:"), 0, Qt::CaseInsensitive))
|
||||||
|| -1 != (i = checksums.indexOf("SHA1:"))
|
|| -1 != (i = checksums.indexOf(QLatin1String("SHA1:"), 0, Qt::CaseInsensitive))
|
||||||
|| -1 != (i = checksums.indexOf("MD5:"))
|
|| -1 != (i = checksums.indexOf(QLatin1String("MD5:"), 0, Qt::CaseInsensitive))
|
||||||
|| -1 != (i = checksums.indexOf("Adler32:"))) {
|
|| -1 != (i = checksums.indexOf(QLatin1String("ADLER32:"), 0, Qt::CaseInsensitive))) {
|
||||||
// Now i is the start of the best checksum
|
// Now i is the start of the best checksum
|
||||||
// Grab it until the next space or end of string.
|
// Grab it until the next space or end of xml or end of string.
|
||||||
auto checksum = checksums.mid(i);
|
int end = _checksums.indexOf(' ', i);
|
||||||
return checksum.mid(0, checksum.indexOf(" "));
|
// workaround for https://github.com/owncloud/core/pull/38304
|
||||||
|
if (end == -1) {
|
||||||
|
end = _checksums.indexOf('<', i);
|
||||||
|
}
|
||||||
|
return _checksums.mid(i, end - i);
|
||||||
}
|
}
|
||||||
return QByteArray();
|
qCWarning(lcChecksums) << "Failed to parse" << _checksums;
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parseChecksumHeader(const QByteArray &header, QByteArray *type, QByteArray *checksum)
|
bool parseChecksumHeader(const QByteArray &header, QByteArray *type, QByteArray *checksum)
|
||||||
@@ -328,7 +337,7 @@ ComputeChecksum *ValidateChecksumHeader::prepareStart(const QByteArray &checksum
|
|||||||
|
|
||||||
if (!parseChecksumHeader(checksumHeader, &_expectedChecksumType, &_expectedChecksum)) {
|
if (!parseChecksumHeader(checksumHeader, &_expectedChecksumType, &_expectedChecksum)) {
|
||||||
qCWarning(lcChecksums) << "Checksum header malformed:" << checksumHeader;
|
qCWarning(lcChecksums) << "Checksum header malformed:" << checksumHeader;
|
||||||
emit validationFailed(tr("The checksum header is malformed."));
|
emit validationFailed(tr("The checksum header is malformed."), _calculatedChecksumType, _calculatedChecksum, ChecksumHeaderMalformed);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,15 +360,30 @@ void ValidateChecksumHeader::start(std::unique_ptr<QIODevice> device, const QByt
|
|||||||
calculator->start(std::move(device));
|
calculator->start(std::move(device));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QByteArray ValidateChecksumHeader::calculatedChecksumType() const
|
||||||
|
{
|
||||||
|
return _calculatedChecksumType;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray ValidateChecksumHeader::calculatedChecksum() const
|
||||||
|
{
|
||||||
|
return _calculatedChecksum;
|
||||||
|
}
|
||||||
|
|
||||||
void ValidateChecksumHeader::slotChecksumCalculated(const QByteArray &checksumType,
|
void ValidateChecksumHeader::slotChecksumCalculated(const QByteArray &checksumType,
|
||||||
const QByteArray &checksum)
|
const QByteArray &checksum)
|
||||||
{
|
{
|
||||||
|
_calculatedChecksumType = checksumType;
|
||||||
|
_calculatedChecksum = checksum;
|
||||||
|
|
||||||
if (checksumType != _expectedChecksumType) {
|
if (checksumType != _expectedChecksumType) {
|
||||||
emit validationFailed(tr("The checksum header contained an unknown checksum type '%1'").arg(QString::fromLatin1(_expectedChecksumType)));
|
emit validationFailed(tr("The checksum header contained an unknown checksum type \"%1\"").arg(QString::fromLatin1(_expectedChecksumType)),
|
||||||
|
_calculatedChecksumType, _calculatedChecksum, ChecksumTypeUnknown);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (checksum != _expectedChecksum) {
|
if (checksum != _expectedChecksum) {
|
||||||
emit validationFailed(tr("The downloaded file does not match the checksum, it will be resumed. '%1' != '%2'").arg(QString::fromUtf8(_expectedChecksum), QString::fromUtf8(checksum)));
|
emit validationFailed(tr(R"(The downloaded file does not match the checksum, it will be resumed. "%1" != "%2")").arg(QString::fromUtf8(_expectedChecksum), QString::fromUtf8(checksum)),
|
||||||
|
_calculatedChecksumType, _calculatedChecksum, ChecksumMismatch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit validated(checksumType, checksum);
|
emit validated(checksumType, checksum);
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class OCSYNC_EXPORT ComputeChecksum : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit ComputeChecksum(QObject *parent = nullptr);
|
explicit ComputeChecksum(QObject *parent = nullptr);
|
||||||
~ComputeChecksum();
|
~ComputeChecksum() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the checksum type to be used. The default is empty.
|
* Sets the checksum type to be used. The default is empty.
|
||||||
@@ -140,6 +140,14 @@ class OCSYNC_EXPORT ValidateChecksumHeader : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
enum FailureReason {
|
||||||
|
Success,
|
||||||
|
ChecksumHeaderMalformed,
|
||||||
|
ChecksumTypeUnknown,
|
||||||
|
ChecksumMismatch,
|
||||||
|
};
|
||||||
|
Q_ENUM(FailureReason)
|
||||||
|
|
||||||
explicit ValidateChecksumHeader(QObject *parent = nullptr);
|
explicit ValidateChecksumHeader(QObject *parent = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -161,9 +169,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
void start(std::unique_ptr<QIODevice> device, const QByteArray &checksumHeader);
|
void start(std::unique_ptr<QIODevice> device, const QByteArray &checksumHeader);
|
||||||
|
|
||||||
|
QByteArray calculatedChecksumType() const;
|
||||||
|
QByteArray calculatedChecksum() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void validated(const QByteArray &checksumType, const QByteArray &checksum);
|
void validated(const QByteArray &checksumType, const QByteArray &checksum);
|
||||||
void validationFailed(const QString &errMsg);
|
void validationFailed(const QString &errMsg, const QByteArray &calculatedChecksumType,
|
||||||
|
const QByteArray &calculatedChecksum, const ValidateChecksumHeader::FailureReason reason);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotChecksumCalculated(const QByteArray &checksumType, const QByteArray &checksum);
|
void slotChecksumCalculated(const QByteArray &checksumType, const QByteArray &checksum);
|
||||||
@@ -173,6 +185,9 @@ private:
|
|||||||
|
|
||||||
QByteArray _expectedChecksumType;
|
QByteArray _expectedChecksumType;
|
||||||
QByteArray _expectedChecksum;
|
QByteArray _expectedChecksum;
|
||||||
|
|
||||||
|
QByteArray _calculatedChecksumType;
|
||||||
|
QByteArray _calculatedChecksum;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ set(common_SOURCES
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/checksums.cpp
|
${CMAKE_CURRENT_LIST_DIR}/checksums.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/filesystembase.cpp
|
${CMAKE_CURRENT_LIST_DIR}/filesystembase.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/ownsql.cpp
|
${CMAKE_CURRENT_LIST_DIR}/ownsql.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/preparedsqlquerymanager.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/syncjournaldb.cpp
|
${CMAKE_CURRENT_LIST_DIR}/syncjournaldb.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/syncjournalfilerecord.cpp
|
${CMAKE_CURRENT_LIST_DIR}/syncjournalfilerecord.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/utility.cpp
|
${CMAKE_CURRENT_LIST_DIR}/utility.cpp
|
||||||
|
|||||||
23
src/common/constants.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) by Oleksandr Zolotov <alex@nextcloud.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QtGlobal>
|
||||||
|
|
||||||
|
namespace OCC {
|
||||||
|
namespace Constants {
|
||||||
|
constexpr qint32 e2EeTagSize = 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -395,13 +395,13 @@ bool FileSystem::moveToTrash(const QString &fileName, QString *errorString)
|
|||||||
suffix_number++;
|
suffix_number++;
|
||||||
}
|
}
|
||||||
if (!file.rename(f.absoluteFilePath(), path + QString::number(suffix_number))) { // rename(file old path, file trash path)
|
if (!file.rename(f.absoluteFilePath(), path + QString::number(suffix_number))) { // rename(file old path, file trash path)
|
||||||
*errorString = QCoreApplication::translate("FileSystem", "Could not move '%1' to '%2'")
|
*errorString = QCoreApplication::translate("FileSystem", R"(Could not move "%1" to "%2")")
|
||||||
.arg(f.absoluteFilePath(), path + QString::number(suffix_number));
|
.arg(f.absoluteFilePath(), path + QString::number(suffix_number));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!file.rename(f.absoluteFilePath(), trashFilePath + f.fileName())) { // rename(file old path, file trash path)
|
if (!file.rename(f.absoluteFilePath(), trashFilePath + f.fileName())) { // rename(file old path, file trash path)
|
||||||
*errorString = QCoreApplication::translate("FileSystem", "Could not move '%1' to '%2'")
|
*errorString = QCoreApplication::translate("FileSystem", R"(Could not move "%1" to "%2")")
|
||||||
.arg(f.absoluteFilePath(), trashFilePath + f.fileName());
|
.arg(f.absoluteFilePath(), trashFilePath + f.fileName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -490,18 +490,4 @@ void SqlQuery::reset_and_clear_bindings()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SqlQuery::initOrReset(const QByteArray &sql, OCC::SqlDatabase &db)
|
|
||||||
{
|
|
||||||
ENFORCE(!_sqldb || &db == _sqldb);
|
|
||||||
_sqldb = &db;
|
|
||||||
_db = db.sqliteDb();
|
|
||||||
if (_stmt) {
|
|
||||||
reset_and_clear_bindings();
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return prepare(sql) == 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace OCC
|
} // namespace OCC
|
||||||
|
|||||||
@@ -103,12 +103,6 @@ public:
|
|||||||
explicit SqlQuery() = default;
|
explicit SqlQuery() = default;
|
||||||
explicit SqlQuery(SqlDatabase &db);
|
explicit SqlQuery(SqlDatabase &db);
|
||||||
explicit SqlQuery(const QByteArray &sql, SqlDatabase &db);
|
explicit SqlQuery(const QByteArray &sql, SqlDatabase &db);
|
||||||
/**
|
|
||||||
* Prepare the SqlQuery if it was not prepared yet.
|
|
||||||
* Otherwise, clear the results and the bindings.
|
|
||||||
* return false if there is an error
|
|
||||||
*/
|
|
||||||
bool initOrReset(const QByteArray &sql, SqlDatabase &db);
|
|
||||||
/**
|
/**
|
||||||
* Prepare the SqlQuery.
|
* Prepare the SqlQuery.
|
||||||
* If the query was already prepared, this will first call finish(), and re-prepare it.
|
* If the query was already prepared, this will first call finish(), and re-prepare it.
|
||||||
@@ -161,10 +155,10 @@ public:
|
|||||||
const QByteArray &lastQuery() const;
|
const QByteArray &lastQuery() const;
|
||||||
int numRowsAffected();
|
int numRowsAffected();
|
||||||
void reset_and_clear_bindings();
|
void reset_and_clear_bindings();
|
||||||
void finish();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void bindValueInternal(int pos, const QVariant &value);
|
void bindValueInternal(int pos, const QVariant &value);
|
||||||
|
void finish();
|
||||||
|
|
||||||
SqlDatabase *_sqldb = nullptr;
|
SqlDatabase *_sqldb = nullptr;
|
||||||
sqlite3 *_db = nullptr;
|
sqlite3 *_db = nullptr;
|
||||||
@@ -172,6 +166,9 @@ private:
|
|||||||
QString _error;
|
QString _error;
|
||||||
int _errId;
|
int _errId;
|
||||||
QByteArray _sql;
|
QByteArray _sql;
|
||||||
|
|
||||||
|
friend class SqlDatabase;
|
||||||
|
friend class PreparedSqlQueryManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace OCC
|
} // namespace OCC
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ enum class PinState {
|
|||||||
*/
|
*/
|
||||||
Unspecified = 3,
|
Unspecified = 3,
|
||||||
};
|
};
|
||||||
Q_ENUM_NS(PinState);
|
Q_ENUM_NS(PinState)
|
||||||
|
|
||||||
/** A user-facing version of PinState.
|
/** A user-facing version of PinState.
|
||||||
*
|
*
|
||||||
|
|||||||
56
src/common/preparedsqlquerymanager.cpp
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) by Hannah von Reth <hannah.vonreth@owncloud.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "preparedsqlquerymanager.h"
|
||||||
|
|
||||||
|
#include <sqlite3.h>
|
||||||
|
|
||||||
|
using namespace OCC;
|
||||||
|
|
||||||
|
PreparedSqlQuery::PreparedSqlQuery(SqlQuery *query, bool ok)
|
||||||
|
: _query(query)
|
||||||
|
, _ok(ok)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PreparedSqlQuery::~PreparedSqlQuery()
|
||||||
|
{
|
||||||
|
_query->reset_and_clear_bindings();
|
||||||
|
}
|
||||||
|
|
||||||
|
const PreparedSqlQuery PreparedSqlQueryManager::get(PreparedSqlQueryManager::Key key)
|
||||||
|
{
|
||||||
|
auto &query = _queries[key];
|
||||||
|
ENFORCE(query._stmt)
|
||||||
|
Q_ASSERT(!sqlite3_stmt_busy(query._stmt));
|
||||||
|
return { &query };
|
||||||
|
}
|
||||||
|
|
||||||
|
const PreparedSqlQuery PreparedSqlQueryManager::get(PreparedSqlQueryManager::Key key, const QByteArray &sql, SqlDatabase &db)
|
||||||
|
{
|
||||||
|
auto &query = _queries[key];
|
||||||
|
Q_ASSERT(!sqlite3_stmt_busy(query._stmt));
|
||||||
|
ENFORCE(!query._sqldb || &db == query._sqldb)
|
||||||
|
if (!query._stmt) {
|
||||||
|
query._sqldb = &db;
|
||||||
|
query._db = db.sqliteDb();
|
||||||
|
return { &query, query.prepare(sql) == 0 };
|
||||||
|
}
|
||||||
|
return { &query };
|
||||||
|
}
|
||||||
119
src/common/preparedsqlquerymanager.h
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) by Hannah von Reth <hannah.vonreth@owncloud.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ocsynclib.h"
|
||||||
|
#include "ownsql.h"
|
||||||
|
#include "common/asserts.h"
|
||||||
|
|
||||||
|
namespace OCC {
|
||||||
|
|
||||||
|
class OCSYNC_EXPORT PreparedSqlQuery
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
~PreparedSqlQuery();
|
||||||
|
|
||||||
|
explicit operator bool() const { return _ok; }
|
||||||
|
|
||||||
|
SqlQuery *operator->() const
|
||||||
|
{
|
||||||
|
Q_ASSERT(_ok);
|
||||||
|
return _query;
|
||||||
|
}
|
||||||
|
|
||||||
|
SqlQuery &operator*() const &
|
||||||
|
{
|
||||||
|
Q_ASSERT(_ok);
|
||||||
|
return *_query;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
PreparedSqlQuery(SqlQuery *query, bool ok = true);
|
||||||
|
|
||||||
|
SqlQuery *_query;
|
||||||
|
bool _ok;
|
||||||
|
|
||||||
|
friend class PreparedSqlQueryManager;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Manage PreparedSqlQuery
|
||||||
|
*/
|
||||||
|
class OCSYNC_EXPORT PreparedSqlQueryManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Key {
|
||||||
|
GetFileRecordQuery,
|
||||||
|
GetFileRecordQueryByMangledName,
|
||||||
|
GetFileRecordQueryByInode,
|
||||||
|
GetFileRecordQueryByFileId,
|
||||||
|
GetFilesBelowPathQuery,
|
||||||
|
GetAllFilesQuery,
|
||||||
|
ListFilesInPathQuery,
|
||||||
|
SetFileRecordQuery,
|
||||||
|
SetFileRecordChecksumQuery,
|
||||||
|
SetFileRecordLocalMetadataQuery,
|
||||||
|
GetDownloadInfoQuery,
|
||||||
|
SetDownloadInfoQuery,
|
||||||
|
DeleteDownloadInfoQuery,
|
||||||
|
GetUploadInfoQuery,
|
||||||
|
SetUploadInfoQuery,
|
||||||
|
DeleteUploadInfoQuery,
|
||||||
|
DeleteFileRecordPhash,
|
||||||
|
DeleteFileRecordRecursively,
|
||||||
|
GetErrorBlacklistQuery,
|
||||||
|
SetErrorBlacklistQuery,
|
||||||
|
GetSelectiveSyncListQuery,
|
||||||
|
GetChecksumTypeIdQuery,
|
||||||
|
GetChecksumTypeQuery,
|
||||||
|
InsertChecksumTypeQuery,
|
||||||
|
GetDataFingerprintQuery,
|
||||||
|
SetDataFingerprintQuery1,
|
||||||
|
SetDataFingerprintQuery2,
|
||||||
|
SetKeyValueStoreQuery,
|
||||||
|
GetKeyValueStoreQuery,
|
||||||
|
DeleteKeyValueStoreQuery,
|
||||||
|
GetConflictRecordQuery,
|
||||||
|
SetConflictRecordQuery,
|
||||||
|
DeleteConflictRecordQuery,
|
||||||
|
GetRawPinStateQuery,
|
||||||
|
GetEffectivePinStateQuery,
|
||||||
|
GetSubPinsQuery,
|
||||||
|
CountDehydratedFilesQuery,
|
||||||
|
SetPinStateQuery,
|
||||||
|
WipePinStateQuery,
|
||||||
|
|
||||||
|
PreparedQueryCount
|
||||||
|
};
|
||||||
|
PreparedSqlQueryManager() = default;
|
||||||
|
/**
|
||||||
|
* The queries are reset in the destructor to prevent wal locks
|
||||||
|
*/
|
||||||
|
const PreparedSqlQuery get(Key key);
|
||||||
|
/**
|
||||||
|
* Prepare the SqlQuery if it was not prepared yet.
|
||||||
|
*/
|
||||||
|
const PreparedSqlQuery get(Key key, const QByteArray &sql, SqlDatabase &db);
|
||||||
|
|
||||||
|
private:
|
||||||
|
SqlQuery _queries[PreparedQueryCount];
|
||||||
|
Q_DISABLE_COPY(PreparedSqlQueryManager)
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -104,6 +104,7 @@ public:
|
|||||||
ASSERT(!_isError);
|
ASSERT(!_isError);
|
||||||
return _result;
|
return _result;
|
||||||
}
|
}
|
||||||
|
|
||||||
T operator*() &&
|
T operator*() &&
|
||||||
{
|
{
|
||||||
ASSERT(!_isError);
|
ASSERT(!_isError);
|
||||||
@@ -116,6 +117,12 @@ public:
|
|||||||
return &_result;
|
return &_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const T &get() const
|
||||||
|
{
|
||||||
|
ASSERT(!_isError)
|
||||||
|
return _result;
|
||||||
|
}
|
||||||
|
|
||||||
const Error &error() const &
|
const Error &error() const &
|
||||||
{
|
{
|
||||||
ASSERT(_isError);
|
ASSERT(_isError);
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#include "common/utility.h"
|
#include "common/utility.h"
|
||||||
#include "common/ownsql.h"
|
#include "common/ownsql.h"
|
||||||
|
#include "common/preparedsqlquerymanager.h"
|
||||||
#include "common/syncjournalfilerecord.h"
|
#include "common/syncjournalfilerecord.h"
|
||||||
#include "common/result.h"
|
#include "common/result.h"
|
||||||
#include "common/pinstate.h"
|
#include "common/pinstate.h"
|
||||||
@@ -46,7 +47,7 @@ class OCSYNC_EXPORT SyncJournalDb : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit SyncJournalDb(const QString &dbFilePath, QObject *parent = nullptr);
|
explicit SyncJournalDb(const QString &dbFilePath, QObject *parent = nullptr);
|
||||||
virtual ~SyncJournalDb();
|
~SyncJournalDb() override;
|
||||||
|
|
||||||
/// Create a journal path for a specific configuration
|
/// Create a journal path for a specific configuration
|
||||||
static QString makeDbName(const QString &localPath,
|
static QString makeDbName(const QString &localPath,
|
||||||
@@ -69,7 +70,6 @@ public:
|
|||||||
|
|
||||||
void keyValueStoreSet(const QString &key, QVariant value);
|
void keyValueStoreSet(const QString &key, QVariant value);
|
||||||
qint64 keyValueStoreGetInt(const QString &key, qint64 defaultValue);
|
qint64 keyValueStoreGetInt(const QString &key, qint64 defaultValue);
|
||||||
QVariant keyValueStoreGet(const QString &key, QVariant defaultValue = {});
|
|
||||||
void keyValueStoreDelete(const QString &key);
|
void keyValueStoreDelete(const QString &key);
|
||||||
|
|
||||||
bool deleteFileRecord(const QString &filename, bool recursively = false);
|
bool deleteFileRecord(const QString &filename, bool recursively = false);
|
||||||
@@ -392,51 +392,11 @@ private:
|
|||||||
|
|
||||||
SqlDatabase _db;
|
SqlDatabase _db;
|
||||||
QString _dbFile;
|
QString _dbFile;
|
||||||
QMutex _mutex; // Public functions are protected with the mutex.
|
QRecursiveMutex _mutex; // Public functions are protected with the mutex.
|
||||||
QMap<QByteArray, int> _checksymTypeCache;
|
QMap<QByteArray, int> _checksymTypeCache;
|
||||||
int _transaction;
|
int _transaction;
|
||||||
bool _metadataTableIsEmpty;
|
bool _metadataTableIsEmpty;
|
||||||
|
|
||||||
SqlQuery _getFileRecordQuery;
|
|
||||||
SqlQuery _getFileRecordQueryByMangledName;
|
|
||||||
SqlQuery _getFileRecordQueryByInode;
|
|
||||||
SqlQuery _getFileRecordQueryByFileId;
|
|
||||||
SqlQuery _getFilesBelowPathQuery;
|
|
||||||
SqlQuery _getAllFilesQuery;
|
|
||||||
SqlQuery _listFilesInPathQuery;
|
|
||||||
SqlQuery _setFileRecordQuery;
|
|
||||||
SqlQuery _setFileRecordChecksumQuery;
|
|
||||||
SqlQuery _setFileRecordLocalMetadataQuery;
|
|
||||||
SqlQuery _getDownloadInfoQuery;
|
|
||||||
SqlQuery _setDownloadInfoQuery;
|
|
||||||
SqlQuery _deleteDownloadInfoQuery;
|
|
||||||
SqlQuery _getUploadInfoQuery;
|
|
||||||
SqlQuery _setUploadInfoQuery;
|
|
||||||
SqlQuery _deleteUploadInfoQuery;
|
|
||||||
SqlQuery _deleteFileRecordPhash;
|
|
||||||
SqlQuery _deleteFileRecordRecursively;
|
|
||||||
SqlQuery _getErrorBlacklistQuery;
|
|
||||||
SqlQuery _setErrorBlacklistQuery;
|
|
||||||
SqlQuery _getSelectiveSyncListQuery;
|
|
||||||
SqlQuery _getChecksumTypeIdQuery;
|
|
||||||
SqlQuery _getChecksumTypeQuery;
|
|
||||||
SqlQuery _insertChecksumTypeQuery;
|
|
||||||
SqlQuery _getDataFingerprintQuery;
|
|
||||||
SqlQuery _setDataFingerprintQuery1;
|
|
||||||
SqlQuery _setDataFingerprintQuery2;
|
|
||||||
SqlQuery _setKeyValueStoreQuery;
|
|
||||||
SqlQuery _getKeyValueStoreQuery;
|
|
||||||
SqlQuery _deleteKeyValueStoreQuery;
|
|
||||||
SqlQuery _getConflictRecordQuery;
|
|
||||||
SqlQuery _setConflictRecordQuery;
|
|
||||||
SqlQuery _deleteConflictRecordQuery;
|
|
||||||
SqlQuery _getRawPinStateQuery;
|
|
||||||
SqlQuery _getEffectivePinStateQuery;
|
|
||||||
SqlQuery _getSubPinsQuery;
|
|
||||||
SqlQuery _countDehydratedFilesQuery;
|
|
||||||
SqlQuery _setPinStateQuery;
|
|
||||||
SqlQuery _wipePinStateQuery;
|
|
||||||
|
|
||||||
/* Storing etags to these folders, or their parent folders, is filtered out.
|
/* Storing etags to these folders, or their parent folders, is filtered out.
|
||||||
*
|
*
|
||||||
* When schedulePathForRemoteDiscovery() is called some etags to _invalid_ in the
|
* When schedulePathForRemoteDiscovery() is called some etags to _invalid_ in the
|
||||||
@@ -458,6 +418,8 @@ private:
|
|||||||
* variable, for specific filesystems, or when WAL fails in a particular way.
|
* variable, for specific filesystems, or when WAL fails in a particular way.
|
||||||
*/
|
*/
|
||||||
QByteArray _journalMode;
|
QByteArray _journalMode;
|
||||||
|
|
||||||
|
PreparedSqlQueryManager _queryManager;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool OCSYNC_EXPORT
|
bool OCSYNC_EXPORT
|
||||||
|
|||||||