dav/sync.c

Sat, 26 Oct 2019 11:32:27 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 26 Oct 2019 11:32:27 +0200
changeset 672
4bfe452a2665
parent 669
152101df336d
child 675
a8117c4feaad
permissions
-rw-r--r--

fix dav-sync copy with enabled metadata sync

46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4 * Copyright 2019 Olaf Wintermann. All rights reserved.
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <stdio.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <stdlib.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <string.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <errno.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <unistd.h>
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
34 #include <signal.h>
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include <time.h>
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
36 #include <utime.h>
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 #include <libxml/xmlerror.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 #include <sys/types.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 #include <ucx/string.h>
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
40 #include <ucx/utils.h>
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
41 #include <ucx/properties.h>
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 #include <dirent.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
44 #include <math.h>
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
45
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 #include <libidav/webdav.h>
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 #include <libidav/utils.h>
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
48 #include <libidav/crypto.h>
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49
399
a985a587787f fixes header include order (dav-sync)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 397
diff changeset
50 #include <libidav/session.h>
a985a587787f fixes header include order (dav-sync)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 397
diff changeset
51
a985a587787f fixes header include order (dav-sync)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 397
diff changeset
52 #include "sync.h"
a985a587787f fixes header include order (dav-sync)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 397
diff changeset
53
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 #include "config.h"
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 #include "sopt.h"
191
0e45b04236a7 more specific error messages in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 190
diff changeset
56 #include "error.h"
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
57 #include "assistant.h"
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
58 #include "libxattr.h"
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
59 #include "tags.h"
399
a985a587787f fixes header include order (dav-sync)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 397
diff changeset
60
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
61 #include "system.h"
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
63 #include <pthread.h>
394
4826f5fdd865 implements parser for basic tag filters without subfilters
Mike Becker <universe@uap-core.de>
parents: 392
diff changeset
64 #include <ctype.h>
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
65
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 static DavContext *ctx;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
68 static int sync_shutdown = 0;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
69
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 static void xmlerrorfnc(void * c, const char * msg, ... ) {
254
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
71 va_list ap;
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
72 va_start(ap, msg);
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
73 vfprintf(stderr, msg, ap);
d7c4ba50b7d8 implements xmlErrorFunc for dav sync + adds line numbers to error reporting in both config checkers
Mike Becker <universe@uap-core.de>
parents: 252
diff changeset
74 va_end(ap);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
77 static DavPropName defprops[] = {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
78 { "DAV:", "getetag" },
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
79 { DAV_NS, "status" },
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
80 { DAV_NS, "content-hash" },
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
81 { DAV_NS, "split" },
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
82 { DAV_PROPS_NS, "finfo" },
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
83 { DAV_PROPS_NS, "tags" },
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
84 { DAV_PROPS_NS, "xattributes" },
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
85 { DAV_PROPS_NS, "link" }
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
86 };
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
87 static size_t numdefprops = 8 ;
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
88
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
89 /*
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
90 * strcmp version that works with NULL pointers
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
91 */
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
92 static int nullstrcmp(const char *s1, const char *s2) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
93 if(!s1 && s2) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
94 return -1;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
95 }
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
96 if(s1 && !s2) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
97 return 1;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
98 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
99 if(!s1 && !s2) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
100 return 0;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
101 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
102 return strcmp(s1, s2);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
103 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
104
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
105 static char* nullstrdup(const char *s) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
106 return s ? strdup(s) : NULL;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
107 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
108
557
90ad7324bbbc fix dav-sync push conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 556
diff changeset
109 static void nullfree(void *p) {
90ad7324bbbc fix dav-sync push conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 556
diff changeset
110 if(p) {
90ad7324bbbc fix dav-sync push conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 556
diff changeset
111 free(p);
90ad7324bbbc fix dav-sync push conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 556
diff changeset
112 }
90ad7324bbbc fix dav-sync push conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 556
diff changeset
113 }
90ad7324bbbc fix dav-sync push conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 556
diff changeset
114
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 int main(int argc, char **argv) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 if(argc < 2) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 fprintf(stderr, "Missing command\n");
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 print_usage(argv[0]);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 char *cmd = argv[1];
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 CmdArgs *args = cmd_parse_args(argc - 2, argv + 2);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 if(!args) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 print_usage(argv[0]);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
128 int ret = EXIT_FAILURE;
54
fc34bd28a22a windows fix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 53
diff changeset
129
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
130 if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version")
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
131 || !strcasecmp(cmd, "--version")) {
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
132 fprintf(stderr, "dav-sync %s\n", DAV_VERSION);
235
0468df02e18f fixed dav get with -u option
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 233
diff changeset
133 cmd_args_free(args);
0468df02e18f fixed dav get with -u option
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 233
diff changeset
134 return -1;
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
137 xmlGenericErrorFunc fnc = xmlerrorfnc;
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
138 initGenericErrorDefaultFunc(&fnc);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
139 sys_init();
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
140 ctx = dav_context_new();
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
141 int cfgret = load_config(ctx) || load_sync_config();
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
142
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
143 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
144 pthread_mutex_lock(&mutex);
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
145 pthread_t tid;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
146
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
147 if(!strcmp(cmd, "check") || !strcmp(cmd, "check-config")) {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
148 if(!cfgret) {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
149 fprintf(stdout, "Configuration OK.\n");
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
150 ret = EXIT_SUCCESS;
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
151 } else {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
152 /* no output, the warnings are written by load_config */
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
153 ret = EXIT_FAILURE;
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
154 }
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
155 } else if(!cfgret) {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
156 if(!strcmp(cmd, "pull")) {
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
157 tid = start_sighandler(&mutex);
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
158 ret = cmd_pull(args);
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
159 stop_sighandler(&mutex, tid);
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
160 } else if(!strcmp(cmd, "push")) {
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
161 tid = start_sighandler(&mutex);
299
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
162 ret = cmd_push(args, FALSE);
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
163 stop_sighandler(&mutex, tid);
299
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
164 } else if(!strcmp(cmd, "archive")) {
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
165 tid = start_sighandler(&mutex);
299
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
166 ret = cmd_push(args, TRUE);
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
167 stop_sighandler(&mutex, tid);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
168 } else if(!strcmp(cmd, "restore")) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
169 tid = start_sighandler(&mutex);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
170 ret = cmd_restore(args);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
171 stop_sighandler(&mutex, tid);
563
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
172 } else if(!strcmp(cmd, "list-conflicts")) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
173 ret = cmd_list_conflicts(args);
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
174 } else if(!strcmp(cmd, "resolve-conflicts")) {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
175 ret = cmd_resolve_conflicts(args);
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
176 } else if(!strcmp(cmd, "delete-conflicts")) {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
177 ret = cmd_delete_conflicts(args);
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
178 } else if(!strcmp(cmd, "list-versions")) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
179 ret = cmd_list_versions(args);
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
180 } else if(!strcmp(cmd, "trash-info")) {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
181 ret = cmd_trash_info(args);
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
182 } else if(!strcmp(cmd, "empty-trash")) {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
183 ret = cmd_empty_trash(args);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
184 } else if(!strcmp(cmd, "add-tag")) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
185 ret = cmd_add_tag(args);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
186 } else if(!strcmp(cmd, "remove-tag")) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
187 ret = cmd_remove_tag(args);
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
188 } else if(!strcmp(cmd, "set-tags")) {
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
189 ret = cmd_set_tags(args);
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
190 } else if(!strcmp(cmd, "list-tags")) {
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
191 ret = cmd_list_tags(args);
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
192 } else if(!strcmp(cmd, "add-dir")
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
193 || !strcmp(cmd, "add-directory")) {
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
194 ret = cmd_add_directory(args);
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
195 } else if(!strcmp(cmd, "list-dirs")
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
196 || !strcmp(cmd, "list-directories")) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
197 ret = cmd_list_dirs();
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
198 } else if(!strcmp(cmd, "check-repos")
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
199 || !strcmp(cmd, "check-repositories")) {
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
200 ret = cmd_check_repositories();
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
201 } else {
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
202 print_usage(argv[0]);
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
203 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
206 // cleanup
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
207 cmd_args_free(args);
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
208 dav_context_destroy(ctx);
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
209
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
210 free_config();
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
211 free_sync_config();
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
212
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
213 curl_global_cleanup();
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
214 xmlCleanupParser();
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
215
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
216 sys_uninit();
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
217
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
218 return ret;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
221 void print_usage(char *cmd) {
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
222 fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
224 fprintf(stderr, "Commands:\n");
405
6b85d745e402 fixes some char type mismatch warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 403
diff changeset
225 fprintf(stderr, " pull [-cldr] [-t <tags>] <directory>\n");
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
226 fprintf(stderr, " push [-cldrSRM] [-t <tags>] <directory>\n");
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
227 fprintf(stderr, " archive [-cldSRM] [-t <tags>] <directory>\n");
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
228 fprintf(stderr,
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
229 " restore [-ldRM] [-V <version>] [-s <directory>] [file...]\n");
563
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
230 fprintf(stderr, " list-conflicts <directory>\n");
219
9792cfe63b80 added resolve-conflicts and delete-conflicts to help text and fixed crash with unknown cmd options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
231 fprintf(stderr, " resolve-conflicts <directory>\n");
9792cfe63b80 added resolve-conflicts and delete-conflicts to help text and fixed crash with unknown cmd options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
232 fprintf(stderr, " delete-conflicts <directory>\n");
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
233 fprintf(stderr, " trash-info <directory>\n");
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
234 fprintf(stderr, " empty-trash <directory>\n");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
235 fprintf(stderr, " add-tag [-s <syncdir>] <file> <tag>\n");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
236 fprintf(stderr, " remove-tag [-s <syncdir>] <file> <tag>\n");
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
237 fprintf(stderr, " set-tags [-s <syncdir>] <file> [tags]\n");
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
238 fprintf(stderr, " list-tags [-s <syncdir>] <file>\n\n");
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
239
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
240 fprintf(stderr, "Options:\n");
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
241 fprintf(stderr, " -c Disable conflict detection\n");
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
242 fprintf(stderr, " -l Lock the repository before access\n");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
243 fprintf(stderr, " -d Don't lock the repository\n");
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
244 fprintf(stderr, " -t <tags> "
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
245 "Only sync files which have the specified tags\n");
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
246 fprintf(stderr, " -r "
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
247 "Remove resources not matching the tag filter\n");
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
248 fprintf(stderr, " -V <vers> Restore specific version\n");
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
249 fprintf(stderr, " -S Save previous file version\n");
449
cdcaf532c030 small help text adjustment
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 447
diff changeset
250 fprintf(stderr, " -R Restore removed files\n");
cdcaf532c030 small help text adjustment
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 447
diff changeset
251 fprintf(stderr, " -M Restore modified files\n");
cdcaf532c030 small help text adjustment
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 447
diff changeset
252 fprintf(stderr, " -v Verbose output (all commands)\n\n");
198
44054c452de1 added list-repositories and list-directories commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 192
diff changeset
253
44054c452de1 added list-repositories and list-directories commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 192
diff changeset
254 fprintf(stderr, "Config commands:\n");
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
255 fprintf(stderr, " add-directory\n");
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
256 fprintf(stderr, " list-directories\n");
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
257 fprintf(stderr, " check-config\n");
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
258 fprintf(stderr, " check-repositories\n\n");
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
259 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
260
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
261 static void handlesig(int sig) {
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
262 if(sync_shutdown) {
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
263 exit(-1);
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
264 }
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
265 fprintf(stderr, "abort\n");
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
266 sync_shutdown = 1;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
267 }
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
268
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
269 static void* sighandler(void *data) {
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
270 signal(SIGTERM, handlesig);
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
271 signal(SIGINT, handlesig);
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
272
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
273 pthread_mutex_t *mutex = data;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
274 pthread_mutex_lock(mutex); // block thread
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
275 return NULL;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
276 }
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
277
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
278 pthread_t start_sighandler(pthread_mutex_t *mutex) {
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
279 pthread_t tid;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
280 if(pthread_create(&tid, NULL, sighandler, mutex)) {
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
281 perror("pthread_create");
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
282 exit(-1);
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
283 }
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
284 return tid;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
285 }
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
286
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
287 void stop_sighandler(pthread_mutex_t *mutex, pthread_t tid) {
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
288 pthread_mutex_unlock(mutex);
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
289 void *data;
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
290 pthread_join(tid, &data);
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
291 }
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
292
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
293 static char* create_local_path(SyncDirectory *dir, const char *path) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
294 char *local_path = util_concat_path(dir->path, path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
295 size_t local_path_len = strlen(local_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
296 if(local_path[local_path_len-1] == '/') {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
297 local_path[local_path_len-1] = '\0';
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
298 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
299 return local_path;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
300 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
301
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
302 static int res_matches_filter(Filter *filter, char *res_path) {
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
303 // include/exclude filter
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
304 UCX_FOREACH(inc, filter->include) {
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
305 regex_t* pattern = (regex_t*) inc->data;
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
306 if (regexec(pattern, res_path, 0, NULL, 0) == 0) {
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
307 UCX_FOREACH(exc, filter->exclude) {
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
308 regex_t* pattern = (regex_t*) exc->data;
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
309 if (regexec(pattern, res_path, 0, NULL, 0) == 0) {
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
310 return 1;
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
311 }
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
312 }
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
313 return 0;
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
314 }
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
315 }
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
316 return 1;
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
317 }
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
318
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
319 static int res_matches_dir_filter(SyncDirectory *dir, char *res_path) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
320 // trash filter
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
321 if (dir->trash) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
322 sstr_t rpath = sstr(util_concat_path(dir->path, res_path));
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
323 if (util_path_isrelated(dir->trash, rpath.ptr)) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
324 free(rpath.ptr);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
325 return 1;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
326 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
327 free(rpath.ptr);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
328 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
329
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
330 // versioning filter
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
331 if (dir->versioning) {
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
332 if(util_path_isrelated(dir->versioning->collection, res_path)) {
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
333 return 1;
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
334 }
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
335 }
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
336
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
337 return res_matches_filter(&dir->filter, res_path);
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
338 }
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
339
389
fe855ce911f9 introduces SyncTagFilter type which for now implements the old tag list filter
Mike Becker <universe@uap-core.de>
parents: 386
diff changeset
340 static int res_matches_tags(DavResource *res, SyncTagFilter *tagfilter) {
415
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
341 if(!tagfilter || tagfilter->mode == DAV_SYNC_TAGFILTER_OFF) {
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
342 return 1;
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
343 }
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
344 // NOTE: currently not implementable
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
345 //int scope = res->iscollection ?
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
346 // DAV_SYNC_TAGFILTER_SCOPE_COLLECTION
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
347 // : DAV_SYNC_TAGFILTER_SCOPE_RESOURCE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
348 //if((tagfilter->scope & scope) != scope) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
349 // return 1;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
350 //}
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
351 if(res->iscollection) {
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
352 return 1;
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
353 }
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
354
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
355 DavXmlNode *tagsprop = dav_get_property_ns(res, DAV_PROPS_NS, "tags");
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
356 UcxList *res_tags = parse_dav_xml_taglist(tagsprop);
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
357
397
ddda42712f39 fixes tag filter evaluation not respecting mode for subfilter combination
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
358 int ret = matches_tagfilter(res_tags, tagfilter);
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 389
diff changeset
359
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 389
diff changeset
360 ucx_list_free_content(res_tags, (ucx_destructor) free_dav_tag);
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
361 ucx_list_free(res_tags);
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 389
diff changeset
362
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
363 return ret;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
364 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
365
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
366 static int localres_matches_tags(
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
367 SyncDirectory *dir,
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
368 LocalResource *res,
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
369 SyncTagFilter *tagfilter)
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
370 {
415
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
371 if(!tagfilter || tagfilter->mode == DAV_SYNC_TAGFILTER_OFF) {
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
372 return 1;
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
373 }
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
374 //int scope = res->isdirectory ?
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
375 // DAV_SYNC_TAGFILTER_SCOPE_COLLECTION
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
376 // : DAV_SYNC_TAGFILTER_SCOPE_RESOURCE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
377 //if((tagfilter->scope & scope) != scope) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
378 // return 1;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
379 //}
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
380 if(res->isdirectory) {
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
381 return 1;
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
382 }
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
383
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
384 DavBool changed = 0;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
385 UcxList *res_tags = sync_get_file_tags(dir, res, &changed, NULL);
389
fe855ce911f9 introduces SyncTagFilter type which for now implements the old tag list filter
Mike Becker <universe@uap-core.de>
parents: 386
diff changeset
386
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
387 int ret = matches_tagfilter(res_tags, tagfilter);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
388 UCX_FOREACH(elm, res_tags) {
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
389 DavTag *t = elm->data;
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
390 free_dav_tag(t);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
391 }
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
392 ucx_list_free(res_tags);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
393 return ret;
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
394 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
395
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
396 static DavSession* create_session(DavContext *ctx, Repository *repo, char *collection) {
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
397 int flags = get_repository_flags(repo);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
398 char *url = repo->url;
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
399 DavBool find_collection = TRUE;
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
400 if((flags & DAV_SESSION_DECRYPT_NAME) != DAV_SESSION_DECRYPT_NAME) {
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
401 url = util_concat_path(repo->url, collection);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
402 find_collection = FALSE;
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
403 }
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
404 if(!collection || (collection[0] == '/' && strlen(collection) == 1)) {
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
405 // collection is NULL or "/"
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
406 // we don't need to find any collection because the repo url is
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
407 // the base url
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
408 find_collection = FALSE;
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
409 }
73
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
410 DavSession *sn = dav_session_new_auth(
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
411 ctx,
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
412 url,
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
413 repo->user,
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
414 repo->password);
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
415 if(url != repo->url) {
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
416 free(url);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
417 }
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
418 sn->flags = flags;
73
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
419 sn->key = dav_context_get_key(ctx, repo->default_key);
199
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
420 curl_easy_setopt(sn->handle, CURLOPT_HTTPAUTH, repo->authmethods);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
421 curl_easy_setopt(sn->handle, CURLOPT_SSLVERSION, repo->ssl_version);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
422 if(repo->cert) {
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
423 curl_easy_setopt(sn->handle, CURLOPT_CAPATH, repo->cert);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
424 }
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
425 if(!repo->verification) {
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
426 curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYPEER, 0);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
427 curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYHOST, 0);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
428 }
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
429
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
430 if(find_collection) {
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
431 DavResource *col = dav_resource_new(sn, collection);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
432 dav_exists(col); // exec this to get the href
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
433 // we actually don't care what the result is
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
434 // if it doesn't exists, an error will occur later
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
435 // and we can't handle it here
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
436 char *newurl = util_concat_path(repo->url, util_resource_name(col->href));
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
437 dav_session_set_baseurl(sn, newurl);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
438 free(newurl);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
439 }
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
440
73
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
441 return sn;
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
442 }
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
443
347
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
444 static void print_allowed_cmds(SyncDirectory *dir) {
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
445 fprintf(stderr, "Allowed commands: ");
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
446 char *sep = "";
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
447 if((dir->allow_cmd & SYNC_CMD_PULL) == SYNC_CMD_PULL) {
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
448 fprintf(stderr, "pull");
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
449 sep = ", ";
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
450 }
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
451 if((dir->allow_cmd & SYNC_CMD_PUSH) == SYNC_CMD_PUSH) {
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
452 fprintf(stderr, "%spush", sep);
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
453 sep = ", ";
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
454 }
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
455 if((dir->allow_cmd & SYNC_CMD_ARCHIVE) == SYNC_CMD_ARCHIVE) {
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
456 fprintf(stderr, "%sarchive", sep);
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
457 }
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
458 fprintf(stderr, "\n");
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
459 }
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
460
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
461 static void localres_keep(SyncDatabase *db, const char *path) {
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
462 LocalResource *local = ucx_map_cstr_remove(db->resources, path);
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
463 if(local) {
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
464 local->keep = TRUE;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
465 }
618
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
466 }
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
467
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
468 static int xattr_filter(const char *name, SyncDirectory *dir) {
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
469 // exclude tag xattr
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
470 if(
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
471 dir->tagconfig &&
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
472 dir->tagconfig->store == TAG_STORE_XATTR &&
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
473 !strcmp(dir->tagconfig->xattr_name, name))
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
474 {
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
475 return 0;
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
476 }
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
477 return 1;
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
478 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
479
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
480 void res2map(DavResource *root, UcxMap *map) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
481 UcxList *stack = ucx_list_prepend(NULL, root->children);
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
482 while(stack) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
483 DavResource *res = stack->data;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
484 stack = ucx_list_remove(stack, stack);
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
485
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
486 while(res) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
487 ucx_map_cstr_put(map, res->path, res);
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
488
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
489 if(res->children) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
490 stack = ucx_list_prepend(stack, res->children);
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
491 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
492 res = res->next;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
493 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
494 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
495 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
496
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
497 int cmd_pull(CmdArgs *a) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
498 if(a->argc != 1) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
499 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
500 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
501 }
392
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
502 // if there are syntax errors in the command line, fail asap.
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
503 SyncTagFilter* tagfilter = parse_tagfilter_string(
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
504 cmd_getoption(a, "tags"), DAV_SYNC_TAGFILTER_SCOPE_RESOURCE);
392
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
505 if (!tagfilter) {
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
506 fprintf(stderr, "Malformed tag filter\n");
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
507 return -1;
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
508 }
395
b491d207ee16 fixes whitespace handling and error detection for basic tag filters
Mike Becker <universe@uap-core.de>
parents: 394
diff changeset
509 // TODO: tons of memory leaks...
b491d207ee16 fixes whitespace handling and error detection for basic tag filters
Mike Becker <universe@uap-core.de>
parents: 394
diff changeset
510 // call free_tagfilter() before each return
392
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
511
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
512 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
513 if(!dir) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
514 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
515 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
516 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
517 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
518 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
519 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
520
347
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
521 if((dir->allow_cmd & SYNC_CMD_PULL) != SYNC_CMD_PULL) {
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
522 fprintf(stderr, "Command 'pull' is not allowed for this sync dir\n");
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
523 print_allowed_cmds(dir);
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
524 return -1;
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
525 }
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
526
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
527 Repository *repo = get_repository(sstr(dir->repository));
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
528 if(!repo) {
495
52cbd310b881 fixes 'Unkown repository' error message in dav-sync
Mike Becker <universe@uap-core.de>
parents: 493
diff changeset
529 fprintf(stderr, "Unknown repository %s\n", dir->repository);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
530 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
531 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
532
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
533 SyncDatabase *db = load_db(dir->database);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
534 if(!db) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
535 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
536 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
537 }
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
538 remove_deleted_conflicts(dir, db);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
539
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
540 UcxMap *hashes = NULL;
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
541 if(SYNC_HASHING(dir)) {
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
542 hashes = create_hash_index(db);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
543 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
544
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
545 DavSession *sn = create_session(ctx, repo, dir->collection);
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
546 ucx_mempool_reg_destr(sn->mp, db, (ucx_destructor)destroy_db);
68
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
547 if (cmd_getoption(a, "verbose")) {
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
548 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
549 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
550 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
551
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
552 // lock repository
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
553 char *locktokenfile = NULL;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
554 DavBool locked = FALSE;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
555 DavResource *root = dav_resource_new(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
556 root->iscollection = TRUE;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
557 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) {
316
9d0505d80044 adds dav-sync lock timeout config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 313
diff changeset
558 if(dav_lock_t(root, dir->lock_timeout)) {
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
559 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
560 dav_session_destroy(sn);
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
561 fprintf(stderr, "Abort\n");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
562 return -1;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
563 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
564 DavLock *lock = dav_get_lock(sn, "/");
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
565 if(lock) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
566 printf("Lock-Token: %s\n", lock->token);
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
567 }
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
568 locked = TRUE;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
569 locktokenfile = create_locktoken_file(dir->name, lock->token);
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
570 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
571
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
572 int ret = 0;
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
573 DavResource *ls = dav_query(sn, "select D:getetag,idav:status,idav:split,`idav:content-hash`,idavprops:tags,idavprops:finfo,idavprops:xattributes,idavprops:link from / with depth = infinity");
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
574 if(!ls) {
191
0e45b04236a7 more specific error messages in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 190
diff changeset
575 print_resource_error(sn, "/");
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
576 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
577 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
578 print_resource_error(sn, "/");
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
579 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
580 locked = FALSE;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
581 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
582 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
583
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
584 fprintf(stderr, "Abort\n");
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
585
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
586 dav_session_destroy(sn);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
587 // TODO: free
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
588 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
589 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
590 if(!ls->iscollection) {
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
591 fprintf(stderr, "%s is not a collection.\nAbort.\n", ls->path);
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
592 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
593 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
594 print_resource_error(sn, "/");
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
595 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
596 locked = FALSE;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
597 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
598 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
599 // TODO: free
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
600 dav_session_destroy(sn);
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
601
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
602 if(!locked && locktokenfile) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
603 remove(locktokenfile);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
604 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
605
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
606 return -1;
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
607 }
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
608
402
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
609 DavBool remove_file = cmd_getoption(a, "remove") ? 1 : 0;
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
610
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
611 int sync_success = 0;
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
612 int sync_delete = 0;
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
613 int sync_error = 0;
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
614 int sync_conflict = 0;
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
615
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
616 UcxList *res_modified = NULL;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
617 UcxList *res_new = NULL;
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
618 UcxList *res_moved = NULL; // type: MovedFile
599
508cbc4d30ea fix res_link initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 585
diff changeset
619 UcxList *res_link = NULL;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
620 UcxList *res_conflict = NULL;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
621 UcxList *res_mkdir = NULL;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
622 UcxList *res_metadata = NULL;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
623 UcxList *res_broken = NULL;
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
624 UcxMap *lres_removed = ucx_map_new(16); // type: LocalResource*
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
625
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
626 //UcxMap *svrres = ucx_map_new(db->resources->count);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
627 UcxMap *dbres = ucx_map_clone(db->resources, NULL, NULL);
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
628
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
629 UcxList *stack = ucx_list_prepend(NULL, ls->children);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
630 while(stack) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
631 DavResource *res = stack->data;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
632 stack = ucx_list_remove(stack, stack);
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
633
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
634 while(res) {
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
635 DavBool res_filtered = FALSE;
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
636 if (res_matches_dir_filter(dir, res->path)) {
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
637 res_filtered = TRUE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
638 } else {
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
639 UCX_FOREACH(elm, dir->filter.tags) {
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
640 SyncTagFilter *tf = elm->data;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
641 if(!res_matches_tags(res, tf)) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
642 res_filtered = TRUE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
643 break;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
644 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
645 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
646 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
647 if(res_filtered) {
402
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
648 // don't delete files filtered by config
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
649 localres_keep(db, res->path);
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
650 res = res->next;
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
651 continue;
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
652 }
402
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
653
392
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
654 if (!res_matches_tags(res, tagfilter)) {
402
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
655 if(!remove_file) {
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
656 localres_keep(db, res->path);
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
657 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
658 res = res->next;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
659 continue;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
660 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
661
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
662 char *status = dav_get_string_property(res, "idav:status");
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
663 if(status && !strcmp(status, "broken")) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
664 res = res->next;
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
665 localres_keep(db, res->path);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
666 res_broken = ucx_list_append(res_broken, res);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
667 continue;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
668 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
669
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
670 // check if a resource has changed on the server
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
671 int change = resource_get_remote_change(a, res, dir, db);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
672 switch(change) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
673 case REMOTE_NO_CHANGE: break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
674 case REMOTE_CHANGE_MODIFIED: {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
675 res_modified = ucx_list_append(res_modified, res);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
676 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
677 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
678 case REMOTE_CHANGE_NEW: {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
679 res_new = ucx_list_append(res_new, res);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
680 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
681 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
682 case REMOTE_CHANGE_DELETED: break; // never happens
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
683 case REMOTE_CHANGE_CONFLICT_LOCAL_MODIFIED: {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
684 res_conflict = ucx_list_append(res_conflict, res);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
685 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
686 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
687 case REMOTE_CHANGE_METADATA: {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
688 res_metadata = ucx_list_append(res_metadata, res);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
689 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
690 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
691 case REMOTE_CHANGE_MKDIR: {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
692 res_mkdir = ucx_list_append(res_mkdir, res);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
693 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
694 }
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
695 case REMOTE_CHANGE_LINK: {
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
696 res_link = ucx_list_append(res_link, res);
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
697 break;
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
698 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
699 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
700
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
701 // remove every server resource from dbres
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
702 // all remaining elements are the resources that are removed
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
703 // on the server
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
704 ucx_map_cstr_remove(dbres, res->path);
272
b321a3be0a38 fixes unnecessary mkcol in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 257
diff changeset
705
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
706 if(!dav_get_property_ns(res, DAV_NS, "split") && res->children) {
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
707 stack = ucx_list_prepend(stack, res->children);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
708 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
709 res = res->next;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
710 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
711 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
712
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
713 // find deleted resources
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
714 // svrres currently contains all resources from the server
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
715 // and will replace the current db->resources map later
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
716 UcxMapIterator i = ucx_map_iterator(dbres);
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
717 LocalResource *local;
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
718 UCX_MAP_FOREACH(key, local, i) {
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
719 if (res_matches_dir_filter(dir, local->path)) {
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
720 continue;
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
721 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
722 if(!local->keep) {
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
723 ucx_map_cstr_put(lres_removed, local->path, local);
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
724 if(lres_removed->count > lres_removed->size * 2) {
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
725 ucx_map_rehash(lres_removed);
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
726 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
727 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
728 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
729
566
9a88920b15d8 increase snyc_conflict counter only after conflict renaming, to make sure the counter is correct when pull is aborted
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 565
diff changeset
730 //
9a88920b15d8 increase snyc_conflict counter only after conflict renaming, to make sure the counter is correct when pull is aborted
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 565
diff changeset
731 // BEGIN PULL
9a88920b15d8 increase snyc_conflict counter only after conflict renaming, to make sure the counter is correct when pull is aborted
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 565
diff changeset
732 //
9a88920b15d8 increase snyc_conflict counter only after conflict renaming, to make sure the counter is correct when pull is aborted
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 565
diff changeset
733
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
734 // the first thing we need are all directories to put the files in
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
735 UCX_FOREACH(elm, res_mkdir) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
736 DavResource *res = elm->data;
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
737 if(sync_get_collection(a, dir, res, db)) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
738 sync_error++;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
739 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
740 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
741
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
742 // we need a map for all conflicts for fast lookups
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
743 UcxMap *conflicts = ucx_map_new(ucx_list_size(res_conflict)+16);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
744 UCX_FOREACH(elm, res_conflict) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
745 DavResource *res = elm->data;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
746 ucx_map_cstr_put(conflicts, res->path, res);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
747 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
748
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
749 if(SYNC_HASHING(dir)) {
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
750 // check for moved/copied files
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
751 UcxList *elm = res_new;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
752 UcxList *prev = NULL;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
753 UcxList *next = NULL;
608
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
754 SYS_STAT s;
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
755 for(;elm;elm=next) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
756 DavResource *res = elm->data;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
757 prev = elm->prev;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
758 next = elm->next;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
759
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
760 if(dav_get_property_ns(res, DAV_PROPS_NS, "link")) {
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
761 continue;
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
762 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
763
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
764 char *hash = sync_get_content_hash(res);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
765 if(!hash) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
766 continue;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
767 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
768
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
769 LocalResource *local = ucx_map_cstr_get(hashes, hash);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
770 if(!local) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
771 continue;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
772 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
773
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
774 char *local_path = util_concat_path(dir->path, local_resource_path(local));
608
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
775 int staterr = sys_stat(local_path, &s);
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
776 free(local_path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
777 if(staterr) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
778 // origin doesn't exist or is inaccessible
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
779 continue;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
780 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
781
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
782 MovedFile *mf = malloc(sizeof(MovedFile));
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
783 mf->content = local;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
784 mf->resource = res;
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
785 if(ucx_map_cstr_remove(lres_removed, local->path)) {
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
786 mf->copy = FALSE;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
787 } else {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
788 mf->copy = TRUE;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
789 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
790
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
791 res_moved = ucx_list_append(res_moved, mf);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
792
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
793 // remove item from res_new
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
794 if(prev) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
795 prev->next = next;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
796 } else {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
797 res_new = next;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
798 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
799 if(next) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
800 next->prev = prev;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
801 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
802 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
803 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
804
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
805 // do copy/move operations
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
806 UCX_FOREACH(elm, res_moved) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
807 MovedFile *mf = elm->data;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
808 if(sync_shutdown) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
809 break;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
810 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
811
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
812 DavBool issplit = dav_get_property_ns(mf->resource, DAV_NS, "split") ? 1 : 0;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
813 if(ucx_map_cstr_get(conflicts, mf->resource->path)) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
814 rename_conflict_file(dir, db, mf->resource->path, issplit);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
815 sync_conflict++;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
816 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
817
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
818 // move file
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
819 if(sync_move_resource(a, dir, mf->resource, mf->content, mf->copy, db, &sync_success)) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
820 fprintf(stderr, "%s failed: %s\n", mf->copy?"copy":"move", mf->resource->path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
821 sync_error++;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
822 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
823 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
824
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
825 // download all new, modified and conflict files
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
826 UcxList *download = ucx_list_concat(res_modified, res_conflict);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
827 download = ucx_list_concat(res_new, download);
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
828 download = ucx_list_concat(download, res_link);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
829 UCX_FOREACH(elm, download) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
830 DavResource *res = elm->data;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
831 if(sync_shutdown) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
832 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
833 }
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
834
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
835 DavBool issplit = dav_get_property_ns(res, DAV_NS, "split") ? 1 : 0;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
836 if(ucx_map_cstr_get(conflicts, res->path)) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
837 rename_conflict_file(dir, db, res->path, issplit);
566
9a88920b15d8 increase snyc_conflict counter only after conflict renaming, to make sure the counter is correct when pull is aborted
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 565
diff changeset
838 sync_conflict++;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
839 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
840
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
841 // download the resource
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
842 if(sync_get_resource(a, dir, res->path, res, db, &sync_success)) {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
843 fprintf(stderr, "resource download failed: %s\n", res->path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
844 sync_error++;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
845 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
846 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
847
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
848 UCX_FOREACH(elm, res_metadata) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
849 DavResource *res = elm->data;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
850 if(sync_shutdown) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
851 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
852 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
853
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
854 LocalResource *local = ucx_map_cstr_get(db->resources, res->path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
855 if(local) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
856 printf("update: %s\n", res->path);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
857 char *res_path = resource_local_path(res);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
858 char *local_path = create_local_path(dir, res->path);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
859 free(res_path);
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
860 if(sync_store_metadata(dir, local_path, local, res)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
861 fprintf(stderr, "Metadata update failed: %s\n", res->path);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
862 sync_error++;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
863 } else {
608
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
864 SYS_STAT s;
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
865 if(sys_stat(local_path, &s)) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
866 fprintf(stderr, "Cannot stat file after update: %s\n", strerror(errno));
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
867 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
868 sync_set_metadata_from_stat(local, &s);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
869 sync_success++;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
870 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
871 free(local_path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
872 } else {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
873 // this should never happen but who knows
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
874 fprintf(stderr,
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
875 "Cannot update metadata of file %s: not in database\n",
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
876 res->path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
877 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
878 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
879
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
880 UcxList *rmdirs = NULL;
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
881 UcxMapIterator mi = ucx_map_iterator(lres_removed);
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
882 LocalResource *removed_res;
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
883 UcxKey key;
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
884 UCX_MAP_FOREACH(key, removed_res, mi) {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
885 if(sync_shutdown) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
886 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
887 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
888
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
889 int ret = sync_remove_local_resource(dir, removed_res);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
890 if(ret == -1) {
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
891 rmdirs = ucx_list_append(rmdirs, removed_res);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
892 } else if(ret == 0) {
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
893 LocalResource *local = ucx_map_cstr_remove(db->resources, removed_res->path);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
894 if(local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
895 local_resource_free(local);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
896 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
897 sync_delete++;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
898 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
899 }
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
900 ucx_map_free(lres_removed);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
901
626
2f735b0e87fa fix order of dir deletions in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 621
diff changeset
902 // sort dir list, we need to delete dirs with higher depth first
2f735b0e87fa fix order of dir deletions in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 621
diff changeset
903 rmdirs = ucx_list_sort(rmdirs, (cmp_func)resource_pathlen_cmp, NULL);
2f735b0e87fa fix order of dir deletions in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 621
diff changeset
904 // delete dirs
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
905 UCX_FOREACH(elm, rmdirs) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
906 LocalResource *local_dir = elm->data;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
907 if(!sync_remove_local_directory(dir, local_dir)) {
626
2f735b0e87fa fix order of dir deletions in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 621
diff changeset
908 // dir successfully removed, now remove the related db entry
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
909 LocalResource *local = ucx_map_cstr_remove(db->resources, local_dir->path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
910 if(local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
911 local_resource_free(local);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
912 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
913 sync_delete++;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
914 }
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
915 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
916
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
917 // unlock repository
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
918 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
919 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
920 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
921 ret = -1;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
922 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
923 locked = FALSE;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
924 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
925 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
926
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
927 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
928 if(store_db(db, dir->database, dir->db_settings)) {
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
929 fprintf(stderr, "Cannot store sync db\n");
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
930 ret = -2;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
931 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
932
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
933 // cleanup
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
934 dav_session_destroy(sn);
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
935
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
936 if(!locked && locktokenfile) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
937 remove(locktokenfile);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
938 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
939
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
940 // Report
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
941 if(ret != -2) {
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
942 char *str_success = sync_success == 1 ? "file" : "files";
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
943 char *str_delete = sync_delete == 1 ? "file" : "files";
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
944 char *str_error = sync_error == 1 ? "error" : "errors";
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
945 char *str_conflict = sync_conflict == 1 ? "conflict" : "conflicts";
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
946 printf("Result: %d %s pulled, %d %s deleted, %d %s, %d %s\n",
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
947 sync_success, str_success,
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
948 sync_delete,str_delete,
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
949 sync_conflict, str_conflict,
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
950 sync_error, str_error);
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
951 }
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
952
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
953 return ret;
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
954 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
955
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
956
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
957 RemoteChangeType resource_get_remote_change(
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
958 CmdArgs *a,
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
959 DavResource *res,
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
960 SyncDirectory *dir,
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
961 SyncDatabase *db)
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
962 {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
963 char *etag = dav_get_string_property(res, "D:getetag");
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
964 if(!etag) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
965 fprintf(stderr, "Error: resource %s has no etag\n", res->path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
966 return REMOTE_NO_CHANGE;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
967 }
649
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
968 char *hash = sync_get_content_hash(res);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
969
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
970 DavBool issplit = dav_get_property(res, "idav:split") ? TRUE : FALSE;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
971 if(issplit) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
972 util_remove_trailing_pathseparator(res->path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
973 }
616
0b61755f2852 add missing isdirectory tag in db on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 615
diff changeset
974 DavBool iscollection = res->iscollection && !issplit;
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
975
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
976 RemoteChangeType type = cmd_getoption(a, "conflict") ?
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
977 REMOTE_CHANGE_MODIFIED : REMOTE_CHANGE_CONFLICT_LOCAL_MODIFIED;
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
978
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
979 LocalResource *local = ucx_map_cstr_get(db->resources, res->path);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
980 char *local_path = create_local_path(dir, res->path);
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
981
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
982 char *link = SYNC_SYMLINK(dir) ?
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
983 dav_get_string_property_ns(res, DAV_PROPS_NS, "link") : NULL;
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
984
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
985 SYS_STAT s;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
986 DavBool exists = 1;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
987 if(sys_stat(local_path, &s)) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
988 if(errno != ENOENT) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
989 fprintf(stderr, "Cannot stat file: %s\n", local_path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
990 free(local_path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
991 return REMOTE_NO_CHANGE;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
992 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
993 exists = 0;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
994 }
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
995
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
996 RemoteChangeType ret = REMOTE_NO_CHANGE;
616
0b61755f2852 add missing isdirectory tag in db on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 615
diff changeset
997 if(iscollection) {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
998 if(!exists) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
999 ret = REMOTE_CHANGE_MKDIR;
616
0b61755f2852 add missing isdirectory tag in db on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 615
diff changeset
1000 } else if(local && S_ISDIR(s.st_mode)) {
0b61755f2852 add missing isdirectory tag in db on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 615
diff changeset
1001 local->isdirectory = 1; // make sure isdirectory is set
0b61755f2852 add missing isdirectory tag in db on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 615
diff changeset
1002 } else {
617
1c995e93bf40 change error handling in case of file/folder conflict
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 616
diff changeset
1003 // set change to REMOTE_CHANGE_MKDIR, which will fail later
1c995e93bf40 change error handling in case of file/folder conflict
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 616
diff changeset
1004 ret = REMOTE_CHANGE_MKDIR;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1005 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1006 } else if(local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1007 DavBool nochange = FALSE;
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1008 if(SYNC_SYMLINK(dir) && nullstrcmp(link, local->link_target)) {
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1009 ret = REMOTE_CHANGE_LINK;
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1010 nochange = TRUE;
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
1011 } else if(local->etag) {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1012 sstr_t e = sstr(etag);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1013 if(sstrprefix(e, S("W/"))) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1014 e = sstrsubs(e, 2);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1015 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1016 if(!strcmp(e.ptr, local->etag)) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1017 // resource is already up-to-date on the client
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1018 nochange = TRUE;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1019 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1020 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1021
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1022 if(!nochange) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1023 if(!(exists && s.st_mtime != local->last_modified)) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1024 type = REMOTE_CHANGE_MODIFIED;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1025 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1026 ret = type;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1027 }
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1028 } else if(link) {
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1029 if(type == REMOTE_CHANGE_CONFLICT_LOCAL_MODIFIED) {
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1030 ret = REMOTE_CHANGE_CONFLICT_LOCAL_MODIFIED;
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1031 } else {
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1032 ret = REMOTE_CHANGE_LINK;
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1033 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1034 } else if(exists) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1035 ret = type;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1036 } else {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1037 ret = REMOTE_CHANGE_NEW;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1038 }
649
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1039
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1040 // if hashing is enabled we can compare the hash of the remote file
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1041 // with the local file to test if a file is really modified
650
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1042 DavBool update_db = FALSE;
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1043 char *update_hash = NULL;
649
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1044 if (!iscollection &&
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1045 !link &&
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1046 (ret == REMOTE_CHANGE_MODIFIED || ret == REMOTE_CHANGE_CONFLICT_LOCAL_MODIFIED) &&
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1047 exists &&
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1048 hash &&
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1049 !dir->pull_skip_hashing)
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1050 {
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1051 // because rehashing a file is slow, there is a config element for
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1052 // disabling this (pull-skip-hashing)
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1053 char *local_hash = util_file_hash(local_path);
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1054 if(local_hash) {
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1055 if(!strcmp(hash, local_hash)) {
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1056 ret = REMOTE_NO_CHANGE;
650
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1057 update_db = TRUE;
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1058 update_hash = local_hash;
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1059
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1060 // if local already exists, update the hash here
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1061 // because it is possible that there are metadata updates
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1062 // and in this case the db will updated later and needs
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1063 // the current hash
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1064 if(local) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1065 if(local->hash) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1066 free(local->hash);
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1067 }
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1068 local->hash = local_hash;
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1069 }
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1070 } else {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1071 free(local_hash);
649
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1072 }
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1073 }
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1074 }
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1075
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
1076 // if a file is not modified, check if the metadata has changed
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1077 while(ret == REMOTE_NO_CHANGE && local) {
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1078 // check if tags have changed
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1079 if(dir->tagconfig) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
1080 DavXmlNode *tagsprop = dav_get_property_ns(res, DAV_PROPS_NS, "tags");
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1081 UcxList *remote_tags = NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1082 if(tagsprop) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1083 remote_tags = parse_dav_xml_taglist(tagsprop);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1084 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1085 char *remote_hash = create_tags_hash(remote_tags);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1086 if(nullstrcmp(remote_hash, local->remote_tags_hash)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1087 ret = REMOTE_CHANGE_METADATA;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1088 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1089 if(remote_hash) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1090 free(remote_hash);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1091 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1092 free_taglist(remote_tags);
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1093
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1094 if(ret == REMOTE_CHANGE_METADATA) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1095 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1096 }
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1097 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1098
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1099 // check if extended attributes have changed
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
1100 if((dir->metadata & FINFO_XATTR) == FINFO_XATTR) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
1101 DavXmlNode *xattr = dav_get_property_ns(res, DAV_PROPS_NS, "xattributes");
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1102 char *xattr_hash = get_xattr_hash(xattr);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1103 if(nullstrcmp(xattr_hash, local->xattr_hash)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1104 ret = REMOTE_CHANGE_METADATA;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1105 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1106 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1107 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1108
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1109 // check if finfo has changed
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
1110 DavXmlNode *finfo = dav_get_property_ns(res, DAV_PROPS_NS, "finfo");
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
1111 if((dir->metadata & FINFO_MODE) == FINFO_MODE) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1112 FileInfo f;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1113 finfo_get_values(finfo, &f);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1114 if(f.mode_set && f.mode != local->mode) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1115 ret = REMOTE_CHANGE_METADATA;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1116 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1117 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1118 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1119
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1120 break;
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1121 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1122
650
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1123 // if update_db is set, a file was modified on the server, but we already
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1124 // have the file content, but we need to update the db
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1125 if(ret == REMOTE_NO_CHANGE && update_db) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1126 if(!local) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1127 local = calloc(1, sizeof(LocalResource));
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1128 local->path = strdup(res->path);
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1129
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1130 ucx_map_cstr_put(db->resources, local->path, local);
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1131 }
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1132
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1133 // update local res
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1134 SYS_STAT s;
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1135 if(!sys_stat(local_path, &s)) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1136 sync_set_metadata_from_stat(local, &s);
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1137 } else {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1138 fprintf(stderr, "stat failed for file: %s : %s", local_path, strerror(errno));
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1139 }
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1140 local_resource_set_etag(local, etag);
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1141 if(!local->hash) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1142 local->hash = update_hash;
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1143 } // else: hash already updated
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1144 }
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
1145
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1146 free(local_path);
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1147 return ret;
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1148 }
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1149
608
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
1150 void sync_set_metadata_from_stat(LocalResource *local, SYS_STAT *s) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1151 local->last_modified = s->st_mtime;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1152 local->mode = s->st_mode & 07777;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1153 local->uid = s->st_uid;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1154 local->gid = s->st_gid;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1155 local->size = s->st_size;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1156 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1157
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1158 static UcxList* sync_download_changed_parts(
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1159 DavResource *res,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1160 LocalResource *local,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1161 FILE *out,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1162 size_t blocksize,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1163 uint64_t *blockcount,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1164 int64_t *truncate_file,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1165 int *err)
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1166 {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1167 UcxList *updates = NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1168
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1169 size_t local_numparts = local ? local->numparts : 0;
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1170 fseeko(out, 0, SEEK_END);
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1171 off_t end = ftello(out);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1172
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1173 int error = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1174
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1175 UcxBuffer *buf = ucx_buffer_new(NULL, blocksize, 0);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1176
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1177 int64_t maxsize = -1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1178
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1179 DavResource *part = res->children;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1180 uint64_t i = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1181 while(part) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1182 char *res_name = part->name;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1183 while(res_name[0] == '0' && res_name[1] != '\0') {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1184 res_name++;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1185 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1186 uint64_t partnum = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1187 if(util_strtouint(res_name, &partnum)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1188 DavBool download_part = FALSE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1189 char *etag = dav_get_string_property_ns(part, "DAV:", "getetag");
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1190 if(partnum >= local_numparts) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1191 // new part
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1192 download_part = TRUE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1193 } else {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1194 FilePart p = local->parts[partnum]; // local is always non-null here
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1195 if(etag) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1196 if(nullstrcmp(etag, p.etag)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1197 download_part = TRUE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1198 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1199 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1200 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1201
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1202 uint64_t offset;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1203 int mul_err = util_uint_mul(partnum, blocksize, &offset);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1204 if(mul_err || offset >= INT64_MAX) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1205 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1206 fprintf(stderr, "Error: part number too high\n");
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1207 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1208 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1209
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1210 int64_t block_end = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1211 if(download_part) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1212 if(fseeko(out, offset, SEEK_SET)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1213 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1214 fprintf(stderr, "Error: fseek failed: %s\n", strerror(errno));
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1215 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1216 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1217 buf->pos = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1218 buf->size = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1219 if(dav_get_content(part, buf,(dav_write_func)ucx_buffer_write)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1220 fprintf(stderr, "Error: cannot download part: %s\n", part->name);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1221 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1222 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1223 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1224 if(fwrite(buf->space, 1, buf->size, out) == 0) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1225 perror("write");
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1226 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1227 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1228 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1229
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1230 FilePart *update = calloc(1, sizeof(FilePart));
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1231 update->block = partnum;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1232 update->etag = etag ? strdup(etag) : NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1233 update->hash = dav_create_hash(buf->space, buf->size);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1234 updates = ucx_list_append(updates, update);
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1235
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1236 block_end = offset+buf->size;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1237 } else {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1238 if(offset+blocksize > end) {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1239 // if we don't download the block, we don't know the size
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1240 // but it can't be bigger than the file
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1241 block_end = end;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1242 } else {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1243 block_end = offset+blocksize;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1244 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1245 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1246
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1247 if(block_end > maxsize) {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1248 maxsize = block_end;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1249 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1250
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1251 i++;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1252 } // else: res is not a regular file part
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1253 part = part->next;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1254 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1255
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1256 ucx_buffer_free(buf);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1257
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1258 if(error) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1259 *err = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1260 ucx_list_free_content(updates, (ucx_destructor)filepart_free);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1261 return NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1262 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1263
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1264 if(maxsize < end) {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1265 *truncate_file = maxsize;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1266 } else {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1267 *truncate_file = -1;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1268 }
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1269
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1270 *err = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1271 *blockcount = i;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1272 return updates;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1273 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1274
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1275 int copy_file(const char *from, const char *to) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1276 FILE *in = sys_fopen(from, "rb");
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1277 if(!in) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1278 return 1;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1279 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1280 FILE *out = sys_fopen(to, "wb");
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1281 if(!out) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1282 fclose(in);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1283 return 1;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1284 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1285
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1286 ucx_stream_copy(in, out, (read_func)fread, (write_func)fwrite);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1287 fclose(in);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1288 fclose(out);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1289
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1290 return 0;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1291 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1292
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1293 typedef int (*renamefunc)(const char*,const char*);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1294
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1295 int sync_move_resource(
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1296 CmdArgs *a,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1297 SyncDirectory *dir,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1298 DavResource *res,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1299 LocalResource *content,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1300 DavBool copy,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1301 SyncDatabase *db,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1302 int *counter)
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1303 {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1304 renamefunc fn = copy ? copy_file : sys_rename;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1305
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1306 char *new_path = util_concat_path(dir->path, res->path);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1307 char *old_path = util_concat_path(dir->path, local_resource_path(content));
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1308
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1309 printf("%s: %s -> %s\n", copy?"copy":"move", content->path, res->path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1310 if(fn(old_path, new_path)) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1311 free(new_path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1312 free(old_path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1313 return 1;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1314 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1315 (*counter)++;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1316
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1317 char *etag = dav_get_string_property(res, "D:getetag");
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1318 char *content_hash = sync_get_content_hash(res);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1319
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1320 LocalResource *local = NULL;
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1321 if(copy) {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1322 local = local_resource_copy(content, res->path);
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1323 } else {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1324 // reuse previous LocalResource (content)
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1325 // remove it from db->resources, change path and put it back
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1326 local = ucx_map_cstr_remove(db->resources, content->path);
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1327 if(!local) {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1328 // can't happen, but handle it nevertheless
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1329 local = content;
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1330 }
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1331 free(content->path);
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1332 local->path = strdup(res->path);
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1333 }
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1334 ucx_map_cstr_put(db->resources, local->path, local);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1335
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1336 if(sync_store_metadata(dir, new_path, local, res)) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1337 fprintf(stderr, "Cannot store metadata: %s\n", res->path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1338 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1339
621
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
1340 // dont free local->etag, because local_resource_set_etag will do that
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
1341
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1342 if(local->hash) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1343 free(local->hash);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1344 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1345
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1346 SYS_STAT s;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1347 if(sys_stat(new_path, &s)) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1348 fprintf(stderr,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1349 "Cannot stat file %s: %s\n", new_path, strerror(errno));
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1350 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1351
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1352 // set metadata from stat
621
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
1353 local_resource_set_etag(local, etag);
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1354 local->hash = nullstrdup(content_hash);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1355
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1356 sync_set_metadata_from_stat(local, &s);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1357 local->skipped = FALSE;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1358
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1359 return 0;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1360 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1361
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1362 int sync_get_resource(
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1363 CmdArgs *a,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1364 SyncDirectory *dir,
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
1365 const char *path,
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1366 DavResource *res,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1367 SyncDatabase *db,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1368 int *counter)
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1369 {
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1370 char *link = SYNC_SYMLINK(dir) ?
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
1371 dav_get_string_property_ns(res, DAV_PROPS_NS, "link") : NULL;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1372
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1373 LocalResource *local = ucx_map_cstr_get(db->resources, path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1374
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1375 char *local_path;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1376 if(link) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1377 char *res_path = resource_local_path(res);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1378 local_path = create_local_path(dir, res_path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1379 free(res_path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1380 } else {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1381 local_path = create_local_path(dir, path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1382 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1383
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
1384 char *etag = dav_get_string_property(res, "D:getetag");
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1385 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1386 memset(&s, 0, sizeof(SYS_STAT));
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1387
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1388 char *blocksize_str = dav_get_string_property_ns(res, DAV_NS, "split");
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
1389 uint64_t blocksize = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1390 DavBool issplit = FALSE;
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1391 if(blocksize_str && !link) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1392 if(!util_strtouint(blocksize_str, &blocksize)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1393 fprintf(stderr, "Error: split property does not contain an integer.\n");
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1394 return 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1395 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1396 issplit = TRUE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1397 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1398 UcxList *part_updates = NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1399 uint64_t blockcount = 0;
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1400 char *content_hash = NULL;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1401
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1402 if(res->iscollection && !issplit) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1403 // why are we here?
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1404 return 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1405 }
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1406
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1407 int ret = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1408
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1409 char *tmp_path = NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1410 FILE *out = NULL;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1411 if(!link) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1412 if(!issplit) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1413 tmp_path = create_tmp_download_path(local_path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1414 if(!tmp_path) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1415 fprintf(stderr, "Cannot create tmp path for %s\n", local_path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1416 free(local_path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1417 return -1;
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1418 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1419 out = sys_fopen(tmp_path , "wb");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1420 } else {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1421 out = sys_fopen(local_path, "r+b");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1422 if(!out && errno == ENOENT) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1423 out = sys_fopen(local_path, "wb");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1424 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1425 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1426 if(!out) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1427 fprintf(stderr, "Cannot open output file: %s\n", local_path);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1428 free(local_path);
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1429 if(tmp_path) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1430 free(tmp_path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1431 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1432 return -1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1433 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1434 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1435
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1436 int64_t truncate_file = -1;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1437 if(!link) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1438 printf("get: %s\n", path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1439 if(issplit) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1440 part_updates = sync_download_changed_parts(res, local, out, blocksize, &blockcount, &truncate_file, &ret);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1441 } else {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1442 ret = dav_get_content(res, out, (dav_write_func)fwrite);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1443 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1444 fclose(out);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1445 } else {
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1446 printf("link: %s -> %s\n", path, link);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1447 if(sys_symlink(link, local_path)) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1448 perror("symlink");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1449 ret = 1;
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1450 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1451 }
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1452
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
1453 if(issplit || (SYNC_HASHING(dir) && !link)) {
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1454 if(truncate_file >= 0) {
560
a816e805e5db store origin of file conflicts
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 559
diff changeset
1455 // only true if issplit is true
548
ab46acda1066 fixes truncate path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 547
diff changeset
1456 if(truncate(local_path, truncate_file)) {
ab46acda1066 fixes truncate path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 547
diff changeset
1457 perror("truncate");
ab46acda1066 fixes truncate path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 547
diff changeset
1458 }
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1459 }
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1460
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1461 char *res_hash = sync_get_content_hash(res);
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1462 if(res_hash) {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1463 content_hash = res_hash;
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1464 } else {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1465 content_hash = util_file_hash(local_path);
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1466 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1467 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1468
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1469 if(ret == 0) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1470 (*counter)++;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1471
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1472 if(tmp_path) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1473 if(dir->trash && dir->backuppull) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1474 move_to_trash(dir, local_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1475 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1476 if(sys_rename(tmp_path, local_path)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1477 fprintf(
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1478 stderr,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1479 "Cannot rename file %s to %s\n",
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1480 tmp_path,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1481 local_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1482 perror("");
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1483 free(tmp_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1484 free(local_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1485 return -1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1486 }
145
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1487 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1488
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1489 if(!local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1490 // new local resource
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1491 local = calloc(1, sizeof(LocalResource));
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
1492 local->path = strdup(path);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1493 ucx_map_cstr_put(db->resources, local->path, local);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1494 }
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
1495
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
1496 if(sync_store_metadata(dir, local_path, local, res)) {
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
1497 fprintf(stderr, "Cannot store metadata: %s\n", path);
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
1498 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1499
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1500 if(local->etag) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1501 free(local->etag);
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1502 local->etag = NULL;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1503 }
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1504 if(local->hash) {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1505 free(local->hash);
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1506 local->hash = NULL;
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1507 }
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1508 if(local->link_target) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1509 free(local->link_target);
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1510 local->link_target = NULL;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1511 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1512
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1513 stat_func statfn;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1514 if(link) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1515 local->link_target = strdup(link);
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1516 statfn = sys_lstat;
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1517 } else {
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1518 statfn = sys_stat;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1519 }
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1520
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1521 update_parts(local, part_updates, blockcount);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1522
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1523 if(statfn(local_path, &s)) {
547
4a249c645ae4 fixes that metadata is updated after stat in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 546
diff changeset
1524 fprintf(stderr,
4a249c645ae4 fixes that metadata is updated after stat in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 546
diff changeset
1525 "Cannot stat file %s: %s\n", local_path, strerror(errno));
4a249c645ae4 fixes that metadata is updated after stat in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 546
diff changeset
1526 }
4a249c645ae4 fixes that metadata is updated after stat in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 546
diff changeset
1527
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1528 // set metadata from stat
621
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
1529 local_resource_set_etag(local, etag);
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1530 if(content_hash) {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1531 local->hash = content_hash;
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1532 }
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1533 sync_set_metadata_from_stat(local, &s);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1534 local->skipped = FALSE;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1535 } else if(tmp_path) {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1536 if(sys_unlink(tmp_path)) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1537 fprintf(stderr, "Cannot remove tmp file: %s\n", tmp_path);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1538 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1539 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1540
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1541 if(tmp_path) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1542 free(tmp_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1543 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1544 free(local_path);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1545 return ret;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1546 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1547
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1548 int sync_get_collection(
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1549 CmdArgs *a,
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1550 SyncDirectory *dir,
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1551 DavResource *res,
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1552 SyncDatabase *db)
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1553 {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1554 char *res_path = resource_local_path(res);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1555 char *local_path = create_local_path(dir, res->path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1556 free(res_path);
617
1c995e93bf40 change error handling in case of file/folder conflict
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 616
diff changeset
1557
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1558 printf("get: %s\n", res->path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1559 // create directory
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1560 // ignore error if it already exists
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1561 if(sys_mkdir(local_path) && errno != EEXIST) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1562 fprintf(stderr,
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1563 "Cannot create directory %s: %s",
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1564 local_path, strerror(errno));
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1565 free(local_path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1566 return 1;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1567 }
617
1c995e93bf40 change error handling in case of file/folder conflict
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 616
diff changeset
1568
1c995e93bf40 change error handling in case of file/folder conflict
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 616
diff changeset
1569 // stat for getting metadata
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1570 SYS_STAT s;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1571 if(sys_stat(local_path, &s)) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1572 fprintf(stderr, "Cannot stat directory %s: %s", local_path, strerror(errno));
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1573 free(local_path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1574 return 1;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1575 }
617
1c995e93bf40 change error handling in case of file/folder conflict
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 616
diff changeset
1576
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1577 // if it doesn't exist in the db, create an entry for the dir
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1578 LocalResource *local = ucx_map_cstr_get(db->resources, res->path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1579 if(!local) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1580 local = calloc(1, sizeof(LocalResource));
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1581 local->path = strdup(res->path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1582 ucx_map_cstr_put(db->resources, local->path, local);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1583 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1584 local->isdirectory = 1;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1585
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1586 // cleanup LocalResource
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1587 if(local->etag) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1588 free(local->etag);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1589 local->etag = NULL;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1590 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1591 if(local->hash) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1592 free(local->hash);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1593 local->hash = NULL;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1594 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1595 if(local->link_target) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1596 free(local->link_target);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1597 local->link_target = NULL;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1598 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1599 local->skipped = 0;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1600 local->size = 0;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1601
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1602 // set metadata
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1603 if(sync_store_metadata(dir, local_path, local, res)) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1604 fprintf(stderr, "Cannot store metadata: %s\n", res->path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1605 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1606 sync_set_metadata_from_stat(local, &s);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1607
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1608 // cleanup
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1609 free(local_path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1610 return 0;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1611 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
1612
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1613 int sync_remove_local_resource(SyncDirectory *dir, LocalResource *res) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1614 char *local_path = create_local_path(dir, res->path);
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1615 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1616 if(sys_stat(local_path, &s)) {
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1617 free(local_path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1618 return -2;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1619 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1620
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1621 if(S_ISDIR(s.st_mode)) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1622 free(local_path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1623 return -1;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1624 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1625
54
fc34bd28a22a windows fix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 53
diff changeset
1626 if(s.st_mtime != res->last_modified) {
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1627 free(local_path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1628 return -2;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1629 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1630
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1631 printf("delete: %s\n", res->path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1632 int ret = 0;
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1633 if(dir->trash) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1634 move_to_trash(dir, local_path);
412
dc74f736aea1 adds more fs abstraction
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 411
diff changeset
1635 } else if(sys_unlink(local_path)) {
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1636 fprintf(stderr, "Cannot remove file %s\n", local_path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1637 ret = -2;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1638 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1639 free(local_path);
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1640
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1641 return ret;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1642 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1643
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1644 int sync_remove_local_directory(SyncDirectory *dir, LocalResource *res) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1645 int ret = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1646 char *local_path = create_local_path(dir, res->path);
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1647
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1648 printf("delete: %s\n", res->path);
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1649 if(rmdir(local_path)) {
633
b7de5ecc30fa don't print error in case rmdir fails because of ENOTEMPTY
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 630
diff changeset
1650 // don't print error when dirs are not empty
b7de5ecc30fa don't print error in case rmdir fails because of ENOTEMPTY
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 630
diff changeset
1651 // because that can regulary happen, because the pull conflict
b7de5ecc30fa don't print error in case rmdir fails because of ENOTEMPTY
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 630
diff changeset
1652 // detection can prevent files from being deleted and in this case
b7de5ecc30fa don't print error in case rmdir fails because of ENOTEMPTY
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 630
diff changeset
1653 // the parent dir is not empty
b7de5ecc30fa don't print error in case rmdir fails because of ENOTEMPTY
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 630
diff changeset
1654 if(errno != ENOTEMPTY) {
b7de5ecc30fa don't print error in case rmdir fails because of ENOTEMPTY
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 630
diff changeset
1655 fprintf(stderr, "rmdir: %s : %s\n", local_path, strerror(errno));
b7de5ecc30fa don't print error in case rmdir fails because of ENOTEMPTY
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 630
diff changeset
1656 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1657 ret = 1;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1658 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1659
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1660 free(local_path);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1661 return ret;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1662 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1663
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1664 void rename_conflict_file(SyncDirectory *dir, SyncDatabase *db, char *path, DavBool copy) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1665 char *local_path = create_local_path(dir, path);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1666 char *parent = util_parent_path(local_path);
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1667
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1668 renamefunc fn = copy ? copy_file : sys_rename;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1669
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1670 int rev = 0;
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1671 SYS_STAT s;
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1672 int loop = 1;
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1673 do {
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1674 char *res_parent = util_parent_path(path);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1675 char *res_name = util_resource_name(path);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1676
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1677 sstr_t new_path = ucx_sprintf(
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1678 "%sorig.%d.%s",
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1679 parent,
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1680 rev,
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1681 res_name);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1682 sstr_t new_res_path = ucx_sprintf(
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1683 "%sorig.%d.%s",
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1684 res_parent,
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1685 rev,
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1686 res_name);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1687
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1688
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1689 if(sys_stat(new_path.ptr, &s)) {
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1690 if(errno == ENOENT) {
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1691 loop = 0;
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1692 printf("conflict: %s\n", local_path);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1693 if(fn(local_path, new_path.ptr)) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1694 //printf("errno: %d\n", errno);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1695 fprintf(
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1696 stderr,
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1697 "Cannot rename file %s to %s\n",
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1698 local_path,
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1699 new_path.ptr);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1700 } else {
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1701 LocalResource *conflict = calloc(1, sizeof(LocalResource));
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1702 conflict->path = strdup(new_res_path.ptr);
560
a816e805e5db store origin of file conflicts
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 559
diff changeset
1703 conflict->conflict_source = strdup(path);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1704 ucx_map_cstr_put(db->conflict, new_res_path.ptr, conflict);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1705 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1706 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1707 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1708 rev++;
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1709 free(res_parent);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1710 free(new_path.ptr);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1711 free(new_res_path.ptr);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1712
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1713 } while(loop);
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1714 free(parent);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1715 free(local_path);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1716 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1717
145
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1718 char* create_tmp_download_path(char *path) {
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1719 char *new_path = NULL;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1720 char *parent = util_parent_path(path);
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1721 for (int i=0;;i++) {
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1722 sstr_t np = ucx_asprintf(
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1723 ucx_default_allocator(),
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1724 "%sdownload%d-%s",
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1725 parent,
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1726 i,
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1727 util_resource_name(path));
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1728
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1729 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1730 if(sys_stat(np.ptr, &s)) {
145
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1731 if(errno == ENOENT) {
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1732 new_path = np.ptr;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1733 }
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1734 break;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1735 }
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1736 free(np.ptr);
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1737 };
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1738
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1739 free(parent);
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1740 return new_path;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1741 }
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1742
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1743 void move_to_trash(SyncDirectory *dir, char *path) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1744 char *new_path = NULL;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1745 for (int i=0;;i++) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1746 sstr_t np = ucx_asprintf(
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1747 ucx_default_allocator(),
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1748 "%s%d-%s",
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1749 dir->trash,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1750 i,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1751 util_resource_name(path));
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1752
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1753 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1754 if(sys_stat(np.ptr, &s)) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1755 if(errno == ENOENT) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1756 new_path = np.ptr;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1757 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1758 break;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1759 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1760 free(np.ptr);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1761 };
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1762
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1763 if(!new_path) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1764 fprintf(stderr, "Cannot move file %s to trash.\n", path);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1765 return;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1766 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1767
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1768 if(sys_rename(path, new_path)) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1769 //printf("errno: %d\n", errno);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1770 fprintf(
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1771 stderr,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1772 "Cannot rename file %s to %s\n",
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1773 path,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1774 new_path);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1775 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1776
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1777 free(new_path);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1778 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1779
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1780 static int res_isconflict(SyncDatabase *db, LocalResource *res) {
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1781 return ucx_map_cstr_get(db->conflict, res->path) ? 1 : 0;
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1782 }
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1783
299
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
1784 int cmd_push(CmdArgs *a, DavBool archive) {
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1785 if(a->argc != 1) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1786 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1787 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1788 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1789
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1790 // if there are syntax errors in the command line, fail asap.
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
1791 SyncTagFilter* tagfilter = parse_tagfilter_string(
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
1792 cmd_getoption(a, "tags"), DAV_SYNC_TAGFILTER_SCOPE_RESOURCE);
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1793 if (!tagfilter) {
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1794 fprintf(stderr, "Malformed tag filter\n");
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1795 return -1;
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1796 }
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1797
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1798 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1799 if(!dir) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1800 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1801 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1802 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1803 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1804 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1805 }
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
1806 if(cmd_getoption(a, "snapshot")) {
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1807 if(dir->versioning) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1808 dir->versioning->always = TRUE;
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1809 } else {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1810 fprintf(stderr, "Error: versioning not configured for the sync directory\nAbort.\n");
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1811 return -1;
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1812 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1813 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1814
347
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1815 int cmd = archive ? SYNC_CMD_ARCHIVE : SYNC_CMD_PUSH;
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1816 if((dir->allow_cmd & cmd) != cmd) {
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1817 fprintf(stderr, "Command '%s' is not allowed for this sync dir\n", archive ? "archive" : "push");
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1818 print_allowed_cmds(dir);
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1819 return -1;
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1820 }
b6ff6be7aa91 adds config option to disable certain commands for specific syncdirs and fixes authmethod config parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 331
diff changeset
1821
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1822 Repository *repo = get_repository(sstr(dir->repository));
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1823 if(!repo) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1824 fprintf(stderr, "Unkown repository %s\n", dir->name);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1825 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1826 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1827
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
1828 SyncDatabase *db = load_db(dir->database);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1829 if(!db) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1830 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1831 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1832 }
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
1833 remove_deleted_conflicts(dir, db);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1834
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
1835 DavSession *sn = create_session(ctx, repo, dir->collection);
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
1836 ucx_mempool_reg_destr(sn->mp, db, (ucx_destructor)destroy_db);
68
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
1837 if (cmd_getoption(a, "verbose")) {
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
1838 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
1839 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
1840 }
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
1841 if(SYNC_STORE_HASH(dir)) {
556
1a58014260e0 set content-hash property after uploads when syncdir hashing is enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 554
diff changeset
1842 sn->flags |= DAV_SESSION_STORE_HASH;
1a58014260e0 set content-hash property after uploads when syncdir hashing is enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 554
diff changeset
1843 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1844
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
1845 DavBool restore_removed = cmd_getoption(a, "restore-removed") ? 1 : 0;
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1846 DavBool restore_modified = cmd_getoption(a, "restore-modified") ? 1 : 0;
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
1847 DavBool restore = restore_removed || restore_modified;
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1848 int depth = restore ? -1 : 0;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1849
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1850 DavResource *root = dav_query(sn, "select D:getetag,idav:status from / with depth = %d", depth);
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1851 if(!root) {
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1852 print_resource_error(sn, "/");
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1853 dav_session_destroy(sn);
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1854 fprintf(stderr, "Abort\n");
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1855 return -1;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1856 }
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1857
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1858 UcxMap *svrres = NULL;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1859 if(restore) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1860 svrres = ucx_map_new(1024);
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1861 res2map(root, svrres);
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1862 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1863
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
1864 int cdt = cmd_getoption(a, "conflict") ? 0 : 1; // conflict detection
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
1865
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1866 // lock repository
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1867 DavBool locked = FALSE;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
1868 char *locktokenfile = NULL;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1869 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) {
316
9d0505d80044 adds dav-sync lock timeout config element
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 313
diff changeset
1870 if(dav_lock_t(root, dir->lock_timeout)) {
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1871 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1872 dav_session_destroy(sn);
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1873 fprintf(stderr, "Abort\n");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1874 return -1;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1875 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1876 DavLock *lock = dav_get_lock(sn, "/");
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1877 if(lock) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1878 printf("Lock-Token: %s\n", lock->token);
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1879 }
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1880 locked = TRUE;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
1881 locktokenfile = create_locktoken_file(dir->name, lock->token);
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1882 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1883
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1884 DavBool remove_file = cmd_getoption(a, "remove") ? 1 : 0;
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1885
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1886 UcxMap *db_hashes = NULL;
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
1887 if(SYNC_HASHING(dir)) {
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1888 db_hashes = create_hash_index(db);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1889 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1890
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1891 int sync_success = 0;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1892 int sync_delete = 0;
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
1893 int sync_conflict = 0;
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1894 int sync_error = 0;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1895
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1896 UcxList *ls_new = NULL;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1897 UcxList *ls_modified = NULL;
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1898 UcxList *ls_conflict = NULL;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1899 UcxList *ls_update = NULL;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1900 UcxList *ls_delete = NULL;
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1901 UcxList *ls_move = NULL;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1902 UcxList *ls_copy = NULL;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1903 UcxList *ls_mkcol = NULL;
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1904
51
e94bf8530d56 dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 50
diff changeset
1905 // upload all changed files
219
9792cfe63b80 added resolve-conflicts and delete-conflicts to help text and fixed crash with unknown cmd options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
1906 //UcxList *resources = cmd_getoption(a, "read") ?
9792cfe63b80 added resolve-conflicts and delete-conflicts to help text and fixed crash with unknown cmd options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
1907 // read_changes(dir, db) : local_scan(dir, db);
9792cfe63b80 added resolve-conflicts and delete-conflicts to help text and fixed crash with unknown cmd options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
1908 UcxList *resources = local_scan(dir, db);
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1909 UcxMap *resources_map = ucx_map_new(ucx_list_size(resources)+16);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1910
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1911 UCX_FOREACH(elm, resources) {
57
3c1ce5f203d7 refactored push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
1912 LocalResource *local_res = elm->data;
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1913 // ignore all files, that are excluded by a static filter (sync.xml)
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1914
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1915 // static include/exclude filter
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
1916 if(res_matches_dir_filter(dir, local_res->path+1)) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1917 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1918 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1919 // static tag filter
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
1920 UCX_FOREACH(elm, dir->filter.tags) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1921 SyncTagFilter *tf = elm->data;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1922 if(!localres_matches_tags(dir, local_res, tf)) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1923 continue;
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
1924 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
1925 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1926
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1927 // we need a fast file lookup map later to detect deleted files
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1928 ucx_map_cstr_put(resources_map, local_res->path, local_res);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1929
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1930 // dynamic tag filter
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1931 if(!localres_matches_tags(dir, local_res, tagfilter)) {
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1932 if(!remove_file) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1933 LocalResource *dbres = ucx_map_cstr_get(
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1934 db->resources,
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1935 local_res->path);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1936 if(dbres) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1937 // this makes sure the file will not be deleted later
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1938 dbres->keep = TRUE;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1939 }
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1940 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1941 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1942 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1943
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
1944 // skip conflict backups silently
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1945 if(res_isconflict(db, local_res)) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1946 ls_conflict = ucx_list_append(ls_conflict, local_res);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1947 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1948 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1949
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1950 int is_changed = local_resource_is_changed(
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1951 dir,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1952 db,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1953 local_res,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1954 svrres,
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
1955 restore_removed,
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1956 restore_modified);
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1957 if(is_changed) {
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1958 if(local_res->isdirectory) {
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1959 ls_mkcol = ucx_list_append(ls_mkcol, local_res);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1960 } else if(local_res->isnew) {
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1961 ls_new = ucx_list_append(ls_new, local_res);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1962 } else {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1963 ls_modified = ucx_list_append(ls_modified, local_res);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1964 }
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
1965 } else if(local_res->metadata_updated) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1966 ls_update = ucx_list_append(ls_update, local_res);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1967 }
614
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1968
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1969 if(local_res->isnew) {
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1970 if(local_resource_load_metadata(dir, local_res)) {
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1971 fprintf(
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1972 stderr,
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1973 "Failed to load metadata: %s\n",
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1974 local_resource_path(local_res));
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1975 }
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
1976 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1977 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1978
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
1979 if(SYNC_STORE_HASH(dir)) {
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1980 // calculate hashes of all new files and check if a file
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1981 // was moved or is a copy
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1982 UcxList *elm = ls_new;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1983 while(elm) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1984 LocalResource *local = elm->data;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1985 UcxList *prev = elm->prev;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1986 UcxList *next = elm->next;
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
1987 if(local->isdirectory || local->link_target) {
551
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1988 elm = elm->next;
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1989 continue;
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1990 }
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1991
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1992 char *local_path = util_concat_path(dir->path, local_resource_path(local));
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1993 char *hash = util_file_hash(local_path);
551
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1994 local->hash = hash;
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1995 // check if a file with this hash already exists
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1996 LocalResource *origin = ucx_map_cstr_get(db_hashes, hash);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1997 if(origin) {
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
1998 local->origin = local_resource_copy(origin, origin->path);
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1999 // the file is a copied/moved file
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2000 // check if the file is in the resources_map, because then
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2001 // it still exists
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2002 if(ucx_map_cstr_get(resources_map, origin->path)) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2003 ls_copy = ucx_list_append(ls_copy, local);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2004 } else {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2005 ls_move = ucx_list_append(ls_move, local);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2006 // put file in resources_map to prevent deletion
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2007 ucx_map_cstr_put(resources_map, origin->path, local);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2008 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2009 // remove list elemend from ls_new
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2010 if(prev) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2011 prev->next = next;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2012 } else {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2013 ls_new = next;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2014 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2015 if(next) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2016 next->prev = prev;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2017 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2018 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2019
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2020 free(local_path);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2021
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2022 elm = next;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2023 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2024 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2025
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2026 // find all deleted files and cleanup the database
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2027 UcxMapIterator i = ucx_map_iterator(db->resources);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2028 LocalResource *local;
506
ceed7714846a fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
2029 UcxList *removed_res = NULL;
ceed7714846a fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
2030 UCX_MAP_FOREACH(key, local, i) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2031 // all filtered files should be removed from the database
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
2032 if(res_matches_dir_filter(dir, local->path+1)) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2033 ucx_map_cstr_remove(db->resources, local->path);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2034 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2035 }
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
2036 UCX_FOREACH(elm, dir->filter.tags) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2037 SyncTagFilter *tf = elm->data;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2038 if(!localres_matches_tags(dir, local, tf)) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2039 ucx_map_cstr_remove(db->resources, local->path);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2040 continue;
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
2041 }
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
2042 }
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
2043
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2044 if(!ucx_map_get(resources_map, key)) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2045 // The current LocalResource is in the database but doesn't exist
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2046 // in the filesystem anymore. This means the file was deleted
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2047 // and should be deleted on the server
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2048 if(!archive) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2049 ls_delete = ucx_list_append(ls_delete, local);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2050 } else {
506
ceed7714846a fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
2051 removed_res = ucx_list_prepend(removed_res, local);
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2052 }
57
3c1ce5f203d7 refactored push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
2053 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2054 }
506
ceed7714846a fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
2055 UCX_FOREACH(elm, removed_res) {
ceed7714846a fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
2056 LocalResource *local = elm->data;
ceed7714846a fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
2057 ucx_map_cstr_remove(db->resources, local->path);
ceed7714846a fixes crash in dav-sync archive command when trying to remove resources from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 505
diff changeset
2058 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2059
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2060 //
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2061 // BEGIN PUSH
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2062 //
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2063
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2064 int ret = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2065 int error = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2066
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2067 // create collections
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2068 for(UcxList *elm=ls_mkcol;elm && !sync_shutdown;elm=elm->next) {
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2069 LocalResource *local_res = elm->data;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2070
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2071 DavResource *res = dav_resource_new(sn, local_res->path);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2072 if(!res) {
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2073 print_resource_error(sn, local_res->path);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2074 ret = -1;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2075 sync_error++;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2076 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2077
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2078 int abort = 0;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2079
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2080 dav_exists(res);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2081 if(sn->error == DAV_NOT_FOUND) {
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2082 // create collection
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2083 // TODO: show 405
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2084 printf("mkcol: %s\n", local_res->path);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2085 if(sync_mkdir(dir, res, local_res) && sn->error != DAV_METHOD_NOT_ALLOWED) {
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2086 print_resource_error(sn, res->path);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2087 ret = -1;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2088 sync_error++;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2089 error = 1;
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2090 abort = 1;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2091 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2092 } else if(sn->error != DAV_OK) {
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2093 // dav_exists() failed
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2094 print_resource_error(sn, local_res->path);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2095 ret = -1;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2096 sync_error++;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2097 error = 1;
613
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2098 abort = 1;
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2099 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2100
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2101 if(!abort) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2102 // success
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2103 if(local_res->metadata_updated) {
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2104 sync_update_metadata(dir, sn, res, local_res);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2105 }
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2106
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2107 // remove old db entry (if it exists)
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2108 // and add add new entry
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2109 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
f6072141f5ee fix directories not stored in db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 611
diff changeset
2110 ucx_map_cstr_put(db->resources, local_res->path, local_res);
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2111 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2112
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2113 dav_resource_free(res);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2114 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2115
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2116 // copy/move files
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2117 DavBool copy = TRUE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2118 if(!ls_copy) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2119 copy = FALSE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2120 ls_copy = ls_move;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2121 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2122 for(UcxList *elm=ls_copy;elm && !sync_shutdown;elm=elm->next) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2123 LocalResource *local = elm->data;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2124
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2125 int err = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2126 DavResource *res = dav_resource_new(sn, local->path);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2127 if(dav_exists(res)) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2128 printf("conflict: %s\n", local->path);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2129 local->last_modified = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2130 nullfree(local->etag);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2131 local->etag = NULL;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2132 nullfree(local->hash);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2133 local->hash = NULL;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2134 local->skipped = TRUE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2135 sync_conflict++;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2136 } else {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2137 DavResource *origin_res = dav_resource_new(sn, local->origin->path);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2138 int origin_changed = remote_resource_is_changed(
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2139 sn,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2140 dir,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2141 db,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2142 origin_res,
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2143 local->origin,
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2144 NULL);
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2145 if(origin_changed) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2146 // upload with put
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2147 ls_modified = ucx_list_prepend(ls_modified, local);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2148 } else {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2149 printf("%s: %s -> %s\n", copy ? "copy":"move", local->origin->path, local->path);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2150 err = sync_move_remote_resource(
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2151 dir,
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
2152 db,
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2153 origin_res,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2154 local,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2155 copy,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2156 &sync_success);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2157 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2158 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2159
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2160 if(err) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2161 sync_error++;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2162 print_resource_error(sn, res->path);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2163 ret = -1;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2164 error = 1;
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2165 } else {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2166 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local->path);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2167 ucx_map_cstr_put(db->resources, local->path, local);
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2168 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2169
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2170 if(copy && !elm->next) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2171 // finished copy, begin move
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2172 elm->next = ls_move;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2173 copy = FALSE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2174 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2175 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2176
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2177 // upload changed files
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2178 ls_modified = ucx_list_concat(ls_new, ls_modified);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2179
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2180 for(UcxList *elm=ls_modified;elm && !sync_shutdown;elm=elm->next) {
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2181 LocalResource *local_res = elm->data;
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2182 int err = 0;
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2183
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2184 DavResource *res = dav_resource_new(sn, local_res->path);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2185 if(!res) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2186 print_resource_error(sn, local_res->path);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2187 ret = -1;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2188 sync_error++;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2189 } else {
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2190 DavBool equal = FALSE;
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2191 int changed = remote_resource_is_changed(sn, dir, db, res, local_res, &equal);
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2192 if(equal) {
650
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2193 char *etag = dav_get_string_property(res, "D:getetag");
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2194 if(local_res->metadata_updated) {
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2195 ls_update = ucx_list_prepend(ls_update, local_res);
650
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2196 } else if(etag) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2197 // update etag in db
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2198 if(local_res->etag) {
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2199 free(local_res->etag);
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2200 }
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2201 local_res->etag = strdup(etag);
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2202 }
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2203 } else if(cdt && changed) {
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2204 printf("conflict: %s\n", local_res->path);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2205 local_res->last_modified = 0;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2206 nullfree(local_res->etag);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2207 local_res->etag = NULL;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2208 nullfree(local_res->hash);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2209 local_res->hash = NULL;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2210 local_res->skipped = TRUE;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2211 sync_conflict++;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2212 } else {
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2213 if(local_res->link_target) {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2214 printf(
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2215 "link: %s -> %s\n",
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2216 local_res->path,
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2217 local_res->link_target);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2218 } else {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2219 printf("put: %s\n", local_res->path);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2220 }
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2221 if(sync_put_resource(dir, res, local_res, &sync_success)) {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2222 sync_error++;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2223 print_resource_error(sn, res->path);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2224 ret = -1;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2225 error = 1;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2226
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2227 err = 1;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2228 }
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2229 }
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2230
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2231 if(!err) {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2232 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2233 ucx_map_cstr_put(db->resources, local_res->path, local_res);
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2234 }
51
e94bf8530d56 dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 50
diff changeset
2235 }
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2236
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2237 dav_resource_free(res);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2238 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2239
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2240 // metadata updates
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2241 for(UcxList *elm=ls_update;elm && !sync_shutdown;elm=elm->next) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2242 LocalResource *local_res = elm->data;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2243
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2244 DavResource *res = dav_resource_new(sn, local_res->path);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2245 if(local_res->metadata_updated) {
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2246 printf("update: %s\n", local_res->path);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2247 if(!sync_update_metadata(dir, sn, res, local_res)) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2248 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2249 ucx_map_cstr_put(db->resources, local_res->path, local_res);
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2250 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2251 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2252 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2253
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2254 // delete all removed files
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2255 ls_delete = ucx_list_sort(ls_delete, (cmp_func)resource_pathlen_cmp, NULL);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2256
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2257 UcxList *cols = NULL;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2258 UcxList **col_list = &cols;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2259 UcxList *deletelist = ls_delete;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2260 for(int i=0;i<2;i++) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2261 // the first iteration deletes everything from ls_delete except
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2262 // all collections, which are stored in cols
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2263 // in the second run all collections will be deleted
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2264 for(UcxList *elm=deletelist;elm && !sync_shutdown;elm=elm->next) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2265 LocalResource *local = elm->data;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2266 if(local->keep) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2267 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2268 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2269 if(sync_delete_remote_resource(dir, sn, local, &sync_delete, col_list)) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2270 if(sn->error != DAV_NOT_FOUND) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2271 print_resource_error(sn, local->path);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2272 sync_error++;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2273 break;
460
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
2274 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2275 } else {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2276 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local->path);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2277 //local_resource_free(dbres);
460
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
2278 }
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
2279 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2280 deletelist = cols;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2281 col_list = NULL;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2282 }
51
e94bf8530d56 dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 50
diff changeset
2283
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2284 // unlock repository
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2285 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2286 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2287 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2288 ret = -1;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2289 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2290 locked = FALSE;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2291 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2292 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2293
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2294 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
2295 if(store_db(db, dir->database, dir->db_settings)) {
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2296 fprintf(stderr, "Cannot store sync db\n");
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
2297 ret = -2;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2298 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2299
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2300 // cleanup
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2301 if(!locked && locktokenfile) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2302 remove(locktokenfile);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2303 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2304
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2305 dav_session_destroy(sn);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
2306
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
2307 // Report
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
2308 if(ret != -2) {
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2309 char *str_success = sync_success == 1 ? "file" : "files";
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2310 char *str_delete = sync_delete == 1 ? "file" : "files";
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
2311 char *str_conflict = sync_conflict == 1 ? "conflict" : "conflicts";
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2312 char *str_error = sync_error == 1 ? "error" : "errors";
299
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2313
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2314 printf("Result: %d %s pushed, ", sync_success, str_success);
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2315 if(!archive) {
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2316 printf("%d %s deleted, ", sync_delete, str_delete);
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2317 }
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
2318 printf("%d %s, %d %s\n",
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
2319 sync_conflict, str_conflict, sync_error, str_error);
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2320 }
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
2321
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2322 return ret;
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2323 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2324
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2325 static int localres_cmp_path(LocalResource *a, LocalResource *b, void *n) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2326 return strcmp(a->path, b->path);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2327 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2328
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2329 int cmd_restore(CmdArgs *a) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2330 char *syncdir = cmd_getoption(a, "syncdir");
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2331
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2332 if(!syncdir && a->argc == 0) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2333 fprintf(stderr, "No syncdir or files specified\n");
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2334 return -1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2335 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2336
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2337 char *version = cmd_getoption(a, "version");
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2338 if(version) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2339 if(a->argc != 1) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2340 fprintf(stderr, "If the -V option is enabled, only one file can be specified\n");
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2341 return -1;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2342 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2343 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2344
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2345 SyncDirectory *dir = NULL;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2346 UcxMap *files = NULL;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2347 if(syncdir) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2348 dir = scfg_get_dir(syncdir);
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2349 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2350
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2351 LocalResource nres;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2352 if(a->argc > 0) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2353 files = ucx_map_new(a->argc+8);
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2354 // get all specified files and check the syncdir
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2355 SyncDirectory *sd = NULL;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2356 for(int i=0;i<a->argc;i++) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2357 SyncFile f;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2358 int err = sync_get_file(a, a->argv[i], &f, FALSE);
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2359 if(err) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2360 sync_print_get_file_err(a->argv[i], err);
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2361 return 1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2362 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2363 if(!sd) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2364 sd = f.dir;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2365 } else {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2366 if(f.dir != sd) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2367 fprintf(stderr, "Not all files are in the same syncdir\n");
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2368 return 1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2369 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2370 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2371
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2372 ucx_map_cstr_put(files, f.path, &nres);
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2373 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2374 dir = sd;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2375 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2376
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2377 if(!dir) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2378 fprintf(stderr, "Unknown sync dir: %s\n", syncdir);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2379 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2380 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2381 if(scfg_check_dir(dir)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2382 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2383 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2384
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2385 if((dir->allow_cmd & SYNC_CMD_RESTORE) != SYNC_CMD_RESTORE) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2386 fprintf(stderr, "Command ''restore'' is not allowed for this sync dir\n");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2387 print_allowed_cmds(dir);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2388 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2389 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2390
528
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2391 DavBool restore_modified = cmd_getoption(a, "restore-modified") ? 1 : 0;
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2392 DavBool restore_removed = cmd_getoption(a, "restore-removed") ? 1 : 0;
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2393 if(!restore_modified && !restore_removed) {
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2394 restore_modified = 1;
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2395 restore_removed = 1;
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2396 }
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2397
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2398 SyncDatabase *db = load_db(dir->database);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2399 if(!db) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2400 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2401 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2402 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2403 remove_deleted_conflicts(dir, db);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2404
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2405 UcxList *modified = NULL;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2406 UcxList *deleted = NULL;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2407
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2408 // iterate over all db resources and check if any resource is
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2409 // modified or deleted
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2410 UcxMapIterator i = ucx_map_iterator(files ? files : db->resources);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2411 LocalResource *resource;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2412 UCX_MAP_FOREACH(key, resource, i) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2413 if(resource == &nres) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2414 resource = ucx_map_get(db->resources, key);
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2415 if(!resource) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2416 continue;
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2417 }
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2418 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2419
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
2420 char *file_path = create_local_path(dir, resource->path);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2421 SYS_STAT s;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2422 if(sys_stat(file_path, &s)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2423 if(errno == ENOENT) {
528
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2424 if(restore_removed) {
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2425 deleted = ucx_list_prepend(deleted, resource);
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2426 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2427 } else {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2428 fprintf(stderr, "Cannot stat file: %s\n", file_path);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2429 perror("");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2430 }
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2431 } else {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2432 if(files) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2433 modified = ucx_list_prepend(modified, resource);
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2434 } else if(!resource->isdirectory && !S_ISDIR(s.st_mode)) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2435 if(resource->last_modified != s.st_mtime || resource->size != s.st_size) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2436 if(restore_modified) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2437 modified = ucx_list_prepend(modified, resource);
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2438 }
528
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2439 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2440 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2441 }
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2442
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2443 free(file_path);
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2444 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2445
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2446 if(files) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2447 ucx_map_free(files);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2448 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2449
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2450 int ret = 0;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2451
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2452 // create DavSession
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2453 Repository *repo = get_repository(sstr(dir->repository));
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2454 if(!repo) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2455 fprintf(stderr, "Unkown repository %s\n", dir->name);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2456 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2457 }
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
2458 DavSession *sn = create_session(ctx, repo, dir->collection);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2459 ucx_mempool_reg_destr(sn->mp, db, (ucx_destructor)destroy_db);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2460 if (cmd_getoption(a, "verbose")) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2461 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2462 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2463 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2464
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2465 // lock repository
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2466 char *locktokenfile = NULL;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2467 DavBool locked = FALSE;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2468 DavResource *root = dav_resource_new(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2469 root->iscollection = TRUE;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2470 if((dir->lockpush || cmd_getoption(a, "lock")) && !cmd_getoption(a, "nolock")) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2471 if(dav_lock_t(root, dir->lock_timeout)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2472 print_resource_error(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2473 dav_session_destroy(sn);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2474 fprintf(stderr, "Abort\n");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2475 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2476 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2477 DavLock *lock = dav_get_lock(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2478 if(lock) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2479 printf("Lock-Token: %s\n", lock->token);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2480 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2481 locked = TRUE;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2482 locktokenfile = create_locktoken_file(dir->name, lock->token);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2483 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2484
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2485 int sync_success = 0;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2486 int sync_error = 0;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2487
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2488 UcxList *resources = ucx_list_concat(modified, deleted);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2489 resources = ucx_list_sort(resources, (cmp_func)localres_cmp_path, NULL);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2491 UCX_FOREACH(elm, resources) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2492 LocalResource *resource = elm->data;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2493
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2494 DavResource *res = dav_get(sn, resource->path, "D:getetag,idav:status,idav:version-collection,idav:split,`idav:content-hash`,idavprops:tags,idavprops:finfo,idavprops:xattributes,idavprops:link");
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2495 if(!res) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2496 printf("skip: %s\n", resource->path);
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2497 continue;
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2498 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2499 char *status = dav_get_string_property(res, "idav:status");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2500 if(status && !strcmp(status, "broken")) {
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2501 fprintf(stderr, "Resource %s broken\n", res->path);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2502 continue;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2503 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2504
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2505 DavResource *vres = NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2506 if(version) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2507 if(dir->versioning->type == VERSIONING_SIMPLE) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2508 vres = versioning_simple_find(res, version);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2509 } else if(dir->versioning->type == VERSIONING_DELTAV) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2510 vres = versioning_deltav_find(res, version);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2511 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2512 if(!vres) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2513 fprintf(stderr, "Cannot find specified version for resource %s\n", res->path);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2514 ret = 1;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2515 break;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2516 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2517 } else {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2518 vres = res;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2519 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2520
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2521 // download the resource
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2522 if(!sync_shutdown) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2523 if(resource->isdirectory) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
2524 char *local_path = create_local_path(dir, res->path);
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2525 if(sys_mkdir(local_path) && errno != EEXIST) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2526 fprintf(stderr,
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2527 "Cannot create directory %s: %s",
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2528 local_path, strerror(errno));
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2529 }
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2530 free(local_path);
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2531 } else {
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2532 if(sync_get_resource(a, dir, res->path, vres, db, &sync_success)) {
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2533 fprintf(stderr, "sync_get_resource failed for resource: %s\n", res->path);
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2534 sync_error++;
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2535 }
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2536 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2537 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2538 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2539
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2540 // unlock repository
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2541 if(locked) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2542 if(dav_unlock(root)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2543 print_resource_error(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2544 ret = -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2545 } else {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2546 locked = FALSE;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2547 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2548 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2549
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2550 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
2551 if(store_db(db, dir->database, dir->db_settings)) {
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2552 fprintf(stderr, "Cannot store sync db\n");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2553 ret = -2;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2554 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2555
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2556 // cleanup
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2557 dav_session_destroy(sn);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2558
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2559 if(!locked && locktokenfile) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2560 remove(locktokenfile);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2561 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2562
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2563 // Report
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2564 if(ret != -2) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2565 char *str_success = sync_success == 1 ? "file" : "files";
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2566 char *str_error = sync_error == 1 ? "error" : "errors";
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2567 printf("Result: %d %s pulled, %d %s\n",
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2568 sync_success, str_success,
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2569 sync_error, str_error);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2570 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2571
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2572 return ret;
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2573 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2574
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
2575 UcxList* local_scan(SyncDirectory *dir, SyncDatabase *db) {
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2576 UcxList *resources = NULL;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2577
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2578 char *path = strdup("/");
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2579 UcxList *stack = ucx_list_prepend(NULL, path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2580 while(stack) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2581 // get a directory path from the stack and read all entries
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2582 // if an entry is a directory, put it on the stack
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2583
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2584 char *p = stack->data;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2585 stack = ucx_list_remove(stack, stack);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
2586 char *local_path = create_local_path(dir, p);
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2587 SYS_DIR local_dir = sys_opendir(local_path);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2588
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2589 if(!local_dir) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2590 fprintf(stderr, "Cannot open directory %s\n", local_path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2591 } else {
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2592 SysDirEnt *ent;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2593 while((ent = sys_readdir(local_dir)) != NULL) {
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2594 if(!strcmp(ent->name, ".") || !strcmp(ent->name, "..")) {
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2595 continue;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2596 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2597
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2598 char *new_path = util_concat_path(p, ent->name);
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2599 DavBool free_new_path = TRUE;
573
b8f798d240ab change local_resource_new signature
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 570
diff changeset
2600 LocalResource *res = local_resource_new(dir, db, new_path);
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2601 if(res) {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2602 if(res->isdirectory) {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2603 resources = ucx_list_append(resources, res);
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2604 stack = ucx_list_prepend(stack, new_path);
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2605 free_new_path = FALSE;
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2606 } else {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2607 resources = ucx_list_append(resources, res);
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2608 }
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2609 }
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2610 if(free_new_path) {
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2611 free(new_path);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2612 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2613 }
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2614 sys_closedir(local_dir);
55
4cb389452a44 replaced readdir_r with readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
2615
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2616 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2617 free(local_path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2618 free(p);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2619 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2620
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2621 return resources;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2622 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2623
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2624 UcxList* read_changes(SyncDirectory *dir, SyncDatabase *db) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2625 UcxProperties *parser = ucx_properties_new();
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2626 parser->delimiter = ':';
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2627
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2628 UcxList *resources = NULL;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2629 sstr_t name;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2630 sstr_t value;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2631
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2632 char buf[STDIN_BUF_SIZE];
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2633 size_t r;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2634 while(!feof(stdin)) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2635 r = fread(buf, 1, STDIN_BUF_SIZE, stdin);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2636 ucx_properties_fill(parser, buf, r);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2637 while(ucx_properties_next(parser, &name, &value)) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2638 if(value.length == 0) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2639 fprintf(stderr, "Wrong input\n");
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2640 continue;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2641 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2642 if(value.ptr[0] == '"'
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2643 && value.length > 2
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2644 && value.ptr[value.length - 1] == '"')
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2645 {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2646 value.ptr[value.length - 1] = '\0';
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2647 value.ptr++;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2648 value.length -= 2;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2649 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2650 value = sstrdup(value);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2651
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2652 if(!sstrcmp(name, S("put"))) {
573
b8f798d240ab change local_resource_new signature
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 570
diff changeset
2653 LocalResource *res = local_resource_new(dir, db, value.ptr);
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2654 if(res) {
57
3c1ce5f203d7 refactored push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
2655 resources = ucx_list_append(resources, res);
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2656 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2657 } else if(!sstrcmp(name, S("remove"))) {
288
cd3846cc8b25 fixes memory leaks detected by cppcheck (or annotates them at least)
Mike Becker <universe@uap-core.de>
parents: 274
diff changeset
2658 ucx_map_sstr_remove(db->resources, value);
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2659 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2660
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2661 free(value.ptr);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2662 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2663 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2664 ucx_properties_free(parser);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2665
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2666 return resources;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2667 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2668
573
b8f798d240ab change local_resource_new signature
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 570
diff changeset
2669 LocalResource* local_resource_new(SyncDirectory *dir, SyncDatabase *db, char *path) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
2670 char *file_path = create_local_path(dir, path);
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2671 SYS_STAT s;
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2672 if(sys_lstat(file_path, &s)) {
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2673 fprintf(stderr, "Cannot stat file %s\n", file_path);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2674 free(file_path);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2675 return NULL;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2676 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2677
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2678 LocalResource *res = calloc(1, sizeof(LocalResource));
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2679 res->mode = s.st_mode & 07777;
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2680 res->uid = s.st_uid;
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2681 res->gid = s.st_gid;
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2682 res->last_modified = s.st_mtime;
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2683 if(!S_ISDIR(s.st_mode)) {
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2684 res->path = strdup(path);
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2685 res->size = s.st_size;
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2686 } else {
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
2687 res->path = util_concat_path(path, "/");
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
2688 res->isdirectory = 1;
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2689 }
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2690
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2691 int skip_file = 0;
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2692 if(SYS_ISLINK(file_path, s)) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2693 char *lnkbuf = sys_readlink(file_path, &s);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2694 #ifdef SYS_LINK_EXT
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2695 // on Windows, we interpret .lnk files as links
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2696 // we dont want resource names with this extension
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2697 // and possibly sync this to other operating systems
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2698 // therefore we remove the .lnk extension from the file name
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2699 // change res->path
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2700 // we only do this, if there isn't any other file with this name
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2701 sstr_t fpath = sstr(file_path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2702 sstr_t rpath = sstr(path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2703 // remove last 4 chars (.lnk)
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2704 sstr_t new_file_path = sstrdup(sstrsubsl(fpath, 0 , fpath.length-4));
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2705 // check if a file with this name exists
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2706 SYS_STAT nfp_s;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2707 if(!sys_stat(new_file_path.ptr, &nfp_s)) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2708 // we can't upload the link without the file extension, because
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2709 // there is another file with this name
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2710 free(lnkbuf);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2711 lnkbuf = NULL;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2712 } else {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2713 sstr_t new_path = sstrdup(sstrsubsl(rpath, 0, rpath.length-4));
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2714 res->local_path = res->path;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2715 res->path = new_path.ptr; // remove .lnk ext from resource path
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2716 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2717 free(new_file_path.ptr);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2718 #endif
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2719
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2720 if(lnkbuf) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2721 // readlink successful
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2722 char *normalized = NULL;
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2723 if(!util_path_isabsolut(lnkbuf)) {
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2724 char *link_parent = util_parent_path(res->path);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2725 char *abs_link_parent = util_concat_path(dir->path, link_parent);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2726 char *link = util_concat_path(abs_link_parent, lnkbuf);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2727 normalized = util_path_normalize(link);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2728 free(abs_link_parent);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2729 free(link_parent);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2730 free(link);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2731 } else {
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2732 normalized = util_path_normalize(lnkbuf);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2733 }
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2734
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2735 char *dirpath = util_path_normalize(dir->path);
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2736 int isintern = util_path_isrelated(dirpath, normalized);
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2737
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2738
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2739 if(SYNC_SYMLINK(dir) && isintern) {
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2740 // the link points to a file inside the syncdir
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2741 char *rel = util_create_relative_path(normalized, file_path);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2742 res->link_target = rel;
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2743 } else {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2744 #ifndef SYS_LINK_EXT // if not windows
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2745 SYS_STAT targetstat;
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2746 if(!sys_stat(file_path, &targetstat)) {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2747 res->isdirectory = S_ISDIR(targetstat.st_mode);
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2748
644
a38b15061848 refactore symlink config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 643
diff changeset
2749 int nofollowextern = (dir->symlink & SYNC_SYMLINK_IGNORE_EXTERN) == SYNC_SYMLINK_IGNORE_EXTERN;
a38b15061848 refactore symlink config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 643
diff changeset
2750 int nofollowintern = (dir->symlink & SYNC_SYMLINK_IGNORE_INTERN) == SYNC_SYMLINK_IGNORE_INTERN;
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2751 if(isintern && nofollowintern) {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2752 skip_file = TRUE;
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2753 } else if(!isintern && nofollowextern) {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2754 skip_file = TRUE;
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2755 }
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2756 } else {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2757 // can't access target, therefore we skip this link
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2758 skip_file = TRUE;
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2759 }
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2760 #endif
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2761 }
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2762 free(dirpath);
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2763 free(normalized);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2764 free(lnkbuf);
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2765 }
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2766 }
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2767
643
5b8643cf0a2f implement hash push strategy and add some tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 639
diff changeset
2768 if(!res->isdirectory && dir->push_strategy == PUSH_STRATEGY_HASH) {
5b8643cf0a2f implement hash push strategy and add some tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 639
diff changeset
2769 res->hash = util_file_hash(file_path);
5b8643cf0a2f implement hash push strategy and add some tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 639
diff changeset
2770 }
5b8643cf0a2f implement hash push strategy and add some tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 639
diff changeset
2771
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2772 free(file_path);
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2773
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2774 if(skip_file) {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2775 local_resource_free(res);
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2776 res = NULL;
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2777 }
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2778
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2779 return res;
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2780 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2781
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2782 char* local_resource_path(LocalResource *res) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2783 return res->local_path ? res->local_path : res->path;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2784 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2785
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2786 int local_resource_is_changed(
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2787 SyncDirectory *dir,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2788 SyncDatabase *db,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2789 LocalResource *res,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2790 UcxMap *svrres,
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
2791 DavBool restore_removed,
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2792 DavBool restore_modified)
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2793 {
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2794 LocalResource *db_res = ucx_map_cstr_get(db->resources, res->path);
366
5228b912c925 adds technical foundation to just push tag updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 363
diff changeset
2795 res->tags_updated = 0;
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2796 if(db_res) {
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2797 if(svrres) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2798 DavResource *remote = ucx_map_cstr_get(svrres, res->path);
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
2799 if(restore_removed && !remote) {
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2800 return 1;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2801 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2802 if(!res->isdirectory && restore_modified && remote) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2803 char *etag = dav_get_string_property(remote, "D:getetag");
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2804 if(!etag || (db_res->etag && strcmp(etag, db_res->etag))) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2805 res->restore = TRUE;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2806 return 1;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2807 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2808 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2809 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2810
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2811 // copy some metadata from db_res, that localscan does not deliver
366
5228b912c925 adds technical foundation to just push tag updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 363
diff changeset
2812 res->tags_updated = db_res->tags_updated;
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2813 if(db_res->etag) {
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2814 res->etag = strdup(db_res->etag);
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2815 }
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2816 if(db_res->tags_hash) {
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2817 res->tags_hash = strdup(db_res->tags_hash);
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2818 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2819 if(db_res->remote_tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2820 res->remote_tags_hash = strdup(db_res->remote_tags_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2821 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2822 if(db_res->xattr_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2823 res->xattr_hash = strdup(db_res->xattr_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2824 }
638
b3077bdb3d77 fix hash based conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 633
diff changeset
2825 if(db_res->hash) {
b3077bdb3d77 fix hash based conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 633
diff changeset
2826 res->prev_hash = strdup(db_res->hash);
b3077bdb3d77 fix hash based conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 633
diff changeset
2827 }
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2828
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2829 // if the resource is splitted, move the part infos to the new
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2830 // LocalResource obj, because we need it later
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2831 if(db_res->parts) {
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2832 res->parts = db_res->parts;
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2833 res->numparts = db_res->numparts;
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2834 db_res->parts = NULL;
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2835 db_res->numparts = 0;
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2836 }
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2837
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2838 // check if metadata has changed
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2839 // metadata are tags, mode, owner, xattr
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2840 // set res->metadata_updated to 1 in case any metadata has changed
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2841
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2842 // check if tags have changed
668
6df5ebb00841 fix detection of changed tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
2843 if(db_res->tags_updated) {
6df5ebb00841 fix detection of changed tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
2844 res->tags_updated = 1;
6df5ebb00841 fix detection of changed tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
2845 res->metadata_updated = 1;
6df5ebb00841 fix detection of changed tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 667
diff changeset
2846 } else if(dir->tagconfig && dir->tagconfig->detect_changes ) {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2847 UcxBuffer *tags = sync_get_file_tag_data(dir, res);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2848 if(tags) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2849 if(db_res->tags_hash) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2850 char *hash = dav_create_hash(tags->space, tags->size);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2851 if(strcmp(hash, db_res->tags_hash)) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2852 res->tags_updated = 1;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2853 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2854 free(hash);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2855 } else {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2856 res->tags_updated = 1;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2857 }
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2858 } else if(db_res->tags_hash) {
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2859 res->tags_updated = 1; // tags removed
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2860 }
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2861 res->metadata_updated = res->tags_updated;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2862 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2863
662
ab34fc9ecf1d fix mtime sync bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 661
diff changeset
2864 // check if mtime has changed
ab34fc9ecf1d fix mtime sync bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 661
diff changeset
2865 if((dir->metadata & FINFO_MTIME) == FINFO_MTIME) {
ab34fc9ecf1d fix mtime sync bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 661
diff changeset
2866 if(db_res->last_modified != res->last_modified) {
ab34fc9ecf1d fix mtime sync bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 661
diff changeset
2867 res->finfo_updated = 1;
ab34fc9ecf1d fix mtime sync bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 661
diff changeset
2868 res->metadata_updated = 1;
ab34fc9ecf1d fix mtime sync bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 661
diff changeset
2869 }
ab34fc9ecf1d fix mtime sync bug
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 661
diff changeset
2870 }
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2871 // check if mode has changed
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2872 if((dir->metadata & FINFO_MODE) == FINFO_MODE) {
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2873 if(db_res->mode != res->mode) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2874 res->finfo_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2875 res->metadata_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2876 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2877 }
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2878 // check if owner has changed
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2879 if((dir->metadata & FINFO_OWNER) == FINFO_OWNER) {
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2880 if(db_res->uid != res->uid || db_res->gid != res->gid) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2881 res->finfo_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2882 res->metadata_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2883 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2884 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2885
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2886 // check if xattr have changed
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2887 if((dir->metadata & FINFO_XATTR) == FINFO_XATTR) {
614
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
2888 char *path = create_local_path(dir, local_resource_path(db_res));
618
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
2889 XAttributes *xattr = file_get_attributes(path, (xattr_filter_func)xattr_filter, dir);
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
2890 // test if xattr are added, removed or changed
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2891 if((db_res->xattr_hash && !xattr) ||
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2892 (!db_res->xattr_hash && xattr) ||
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
2893 (xattr && db_res->xattr_hash && strcmp(xattr->hash, db_res->xattr_hash)))
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2894 {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2895 res->metadata_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2896 res->xattr_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2897 res->xattr = xattr;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2898 } else if(xattr) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2899 xattributes_free(xattr);
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2900 }
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2901 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2902
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2903 // check if the content of the file was modified
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2904 // in case of links, just check if the link target has changed
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2905 // for normal files, check last modified and size
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2906 // or compare content hashes
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2907 if(nullstrcmp(db_res->link_target, res->link_target)) {
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2908 res->link_updated = 1;
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2909 } else {
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2910 if(db_res->hash && res->hash) {
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2911 // we already have hashes
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2912 if(!strcmp(db_res->hash, res->hash)) {
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2913 return 0; // hashes equal -> file content unchanged
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2914 }
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2915 } else if(
615
ab669d21f82a add missing isdirectory tag in db on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 614
diff changeset
2916 db_res->last_modified == res->last_modified &&
ab669d21f82a add missing isdirectory tag in db on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 614
diff changeset
2917 db_res->size == res->size &&
ab669d21f82a add missing isdirectory tag in db on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 614
diff changeset
2918 db_res->isdirectory == res->isdirectory)
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2919 {
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2920 // mtime and size unchanged, content also likely unchanged
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2921 return 0;
650
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2922 } else if(SYNC_HASHING(dir)) {
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2923 // res->hash missing (see above)
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2924 char *local_path = util_concat_path(dir->path, local_resource_path(res));
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2925 res->hash = util_file_hash(local_path);
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2926 free(local_path);
650
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2927
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2928 // check if the content has really changed
14e7101d7604 fix some hash based conflict resolution bugs and add tests for it
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 649
diff changeset
2929 if(res->hash && db_res->hash && !strcmp(res->hash, db_res->hash)) {
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2930 return 0;
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2931 }
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
2932 }
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2933 }
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2934 } else {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2935 res->tags_updated = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2936 res->finfo_updated = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2937 res->xattr_updated = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2938 res->metadata_updated = 1;
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2939 res->isnew = 1;
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2940 }
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2941 return 1;
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2942 }
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2943
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2944 int remote_resource_is_changed(
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2945 DavSession *sn,
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2946 SyncDirectory *dir,
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2947 SyncDatabase *db,
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2948 DavResource *remote,
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2949 LocalResource *res,
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2950 DavBool *equal)
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2951 {
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2952 if(equal) {
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2953 *equal = FALSE;
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2954 }
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2955
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2956 DavPropName properties[] = {
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2957 {"DAV:", "getetag"},
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2958 {DAV_NS, "version-collection"},
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2959 {DAV_NS, "content-hash"},
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2960 {DAV_NS, "split" },
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2961 {DAV_PROPS_NS, "tags"},
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2962 {DAV_PROPS_NS, "link" }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2963 };
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2964 int err = dav_load_prop(remote, properties, 6);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2965
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2966 if(res->restore) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2967 return 0;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2968 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2969
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2970 if(remote->iscollection) {
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2971 return 1;
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2972 }
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
2973
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2974 int ret = 0;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2975 if(err == 0) {
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
2976 char *etag = dav_get_string_property(remote, "D:getetag");
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
2977 char *hash = sync_get_content_hash(remote);
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2978
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2979 if(hash && res->hash && equal) {
649
0f4c59ac8c74 implement hash based conflict resolution in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 648
diff changeset
2980 // if requested, check if the local and remote res are equal
639
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2981 if(!strcmp(hash, res->hash)) {
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2982 *equal = TRUE;
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2983 return 0;
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2984 }
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2985 }
928a77ebe0b9 fix that file uploads are tried, when the content on the server is equal to the local file content (with enabled hashing)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 638
diff changeset
2986
638
b3077bdb3d77 fix hash based conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 633
diff changeset
2987 if(hash && res->prev_hash) {
b3077bdb3d77 fix hash based conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 633
diff changeset
2988 if(strcmp(hash, res->prev_hash)) {
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2989 ret = 1;
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2990 }
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2991 } else if(!res->etag) {
318
7e0694423838 dav-sync bugfix: files that are not in the db but on the server should not be pushed
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 316
diff changeset
2992 // the resource is on the server and the client has no etag
7e0694423838 dav-sync bugfix: files that are not in the db but on the server should not be pushed
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 316
diff changeset
2993 ret = 1;
7e0694423838 dav-sync bugfix: files that are not in the db but on the server should not be pushed
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 316
diff changeset
2994 } else if(etag) {
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2995 sstr_t e = sstr(etag);
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2996 if(sstrprefix(e, S("W/"))) {
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2997 e = sstrsubs(e, 2);
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2998 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2999 if(strcmp(e.ptr, res->etag)) {
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
3000 ret = 1;
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
3001 }
318
7e0694423838 dav-sync bugfix: files that are not in the db but on the server should not be pushed
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 316
diff changeset
3002 } else {
7e0694423838 dav-sync bugfix: files that are not in the db but on the server should not be pushed
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 316
diff changeset
3003 // something weird is happening, the server must support etags
7e0694423838 dav-sync bugfix: files that are not in the db but on the server should not be pushed
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 316
diff changeset
3004 fprintf(stderr, "Warning: resource %s has no etag\n", remote->href);
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
3005 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
3006 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
3007 return ret;
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
3008 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
3009
614
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3010 int local_resource_load_metadata(SyncDirectory *dir, LocalResource *res) {
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3011 // currently only xattr needed
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3012 if((dir->metadata & FINFO_XATTR) == FINFO_XATTR) {
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3013 char *path = create_local_path(dir, local_resource_path(res));
618
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
3014 XAttributes *xattr = file_get_attributes(path, (xattr_filter_func)xattr_filter, dir);
614
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3015 res->xattr = xattr;
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3016 free(path);
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3017 }
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3018
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3019 return 0;
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3020 }
e72d2b99b0f6 fix xattr not synced for new files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 613
diff changeset
3021
621
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3022 void local_resource_set_etag(LocalResource *local, const char *etag) {
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3023 // free old etag
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3024 if(local->etag) {
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3025 free(local->etag);
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3026 }
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3027
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3028 if(!etag) {
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3029 local->etag = NULL;
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3030 return;
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3031 }
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3032
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3033 scstr_t e = scstr(etag);
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3034 if(sstrprefix(e, S("W/"))) {
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3035 e = scstrsubs(e, 2);
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3036 }
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3037 local->etag = sstrdup(e).ptr;
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3038 }
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
3039
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3040 char* resource_local_path(DavResource *res) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3041 #ifdef SYS_LINK_EXT
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3042 // on Windows, add .lnk extension to links
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3043 if(dav_get_property_ns(res, DAV_PROPS_NS, "link")) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3044 return ucx_sprintf("%s%s", res->path, SYS_LINK_EXT).ptr;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3045 } else {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3046 // not a link
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3047 return strdup(res->path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3048 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3049 #else
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3050 return strdup(res->path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3051 #endif
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3052 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3053
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3054 size_t resource_get_blocksize(SyncDirectory *dir, LocalResource *local, DavResource *res, off_t filesize) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3055 size_t local_blocksize = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3056 if(local->blocksize < 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3057 // file splitting disabled
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3058 return 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3059 } else if(local->blocksize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3060 local_blocksize = (size_t)local->blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3061 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3062 UCX_FOREACH(elm, dir->splitconfig) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3063 SplitConfig *sc = elm->data;
648
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
3064 if(sc->filter) {
fefe4b6f1048 change split config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 646
diff changeset
3065 if(res_matches_filter(sc->filter, local->path)) {
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3066 continue;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3067 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3068 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3069
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3070 if(sc->minsize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3071 if(filesize < sc->minsize) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3072 continue;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3073 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3074 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3075
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3076 local_blocksize = sc->blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3077 break;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3078 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3079 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3080
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3081 size_t svr_blocksize = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3082 char *svr_blocksize_str = dav_get_string_property_ns(res, DAV_NS, "split");
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3083 if(svr_blocksize_str) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3084 uint64_t i = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3085 if(util_strtouint(svr_blocksize_str, &i)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3086 svr_blocksize = (size_t)i;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3087 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3088 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3089
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3090 if(local_blocksize > 0 && svr_blocksize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3091 fprintf(stderr, "Warning: Blocksize mismatch: %s: local: %zu server: %zu\n", local->path, local_blocksize, svr_blocksize);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3092 return svr_blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3093 } else if(local_blocksize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3094 return local_blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3095 } else if(svr_blocksize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3096 return svr_blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3097 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3098
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3099 return 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3100
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3101 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3102
460
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3103 int resource_pathlen_cmp(LocalResource *res1, LocalResource *res2, void *n) {
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3104 size_t s1 = strlen(res1->path);
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3105 size_t s2 = strlen(res2->path);
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3106 if(s1 < s2) {
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3107 return 1;
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3108 } else if(s1 > s2) {
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3109 return -1;
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3110 } else {
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3111 return 0;
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3112 }
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3113 }
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
3114
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3115 DavResource *versioning_simple_find(DavResource *res, const char *version) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3116 char *vcol_href = dav_get_string_property_ns(res, DAV_NS, VERSION_PATH_PROPERTY);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3117 if(!vcol_href) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3118 return NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3119 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3120 DavResource *vcol = dav_resource_new_href(res->session, vcol_href);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3121 if(!vcol) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3122 return NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3123 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3124
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3125
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3126 if(dav_load_prop(vcol, defprops, numdefprops)) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3127 print_resource_error(res->session, vcol->path);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3128 dav_resource_free(vcol);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3129 return NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3130 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3131
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3132 DavResource *ret = NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3133 DavResource *child = vcol->children;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3134 while(child) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3135 DavResource *next = child->next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3136 if(!strcmp(child->name, version)) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3137 ret = child;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3138 } else {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3139 dav_resource_free(child);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3140 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3141 child = next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3142 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3143 dav_resource_free(vcol);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3144
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3145 return ret;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3146 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3147
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3148 // TODO: remove code dup (main.c: find_version)
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3149 DavResource* versioning_deltav_find(DavResource *res, const char *version) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3150 DavResource *list = dav_versiontree(res, "D:getetag,idav:status,idav:split,idavprops:link,idavprops:finfo,idavprops:xattributes,idavprops:tags");
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3151 DavResource *ret = NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3152 while(list) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3153 DavResource *next = list->next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3154 if(!ret) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3155 char *vname = dav_get_string_property(list, "D:version-name");
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3156 if(vname && !strcmp(vname, version)) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3157 ret = list;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3158 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3159 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3160 if(list != ret) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3161 dav_resource_free(list);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3162 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3163 list = next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3164 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3165 return ret;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
3166 }
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
3167
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3168 int sync_set_status(DavResource *res, char *status) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3169 DavResource *resource = dav_resource_new(res->session, res->path);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3170 dav_set_string_property(resource, "idav:status", status);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3171 int ret = dav_store(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3172 dav_resource_free(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3173 return ret;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3174 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3175
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3176 int sync_remove_status(DavResource *res) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3177 DavResource *resource = dav_resource_new(res->session, res->path);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3178 dav_remove_property(resource, "idav:status");
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3179 int ret = dav_store(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3180 dav_resource_free(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3181 return ret;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3182 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3183
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3184 int sync_tags_equal(UcxList *tags1, UcxList *tags2) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3185 if(!tags1) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3186 return tags2 ? 0 : 1;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3187 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3188 if(!tags2) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3189 return tags1 ? 0 : 1;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3190 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3191
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3192 UcxMap *map1 = ucx_map_new(32);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3193 UCX_FOREACH(elm, tags1) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3194 DavTag *t = elm->data;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3195 ucx_map_cstr_put(map1, t->name, t);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3196 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3197
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3198 int equal = 1;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3199 int i = 0;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3200 UCX_FOREACH(elm, tags2) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3201 DavTag *t = elm->data;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3202 if(!ucx_map_cstr_get(map1, t->name)) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3203 equal = 0;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3204 break;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3205 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3206 i++;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3207 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3208
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3209 if(i != map1->count) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3210 equal = 0;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3211 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3212 ucx_map_free(map1);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3213 return equal;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3214 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3215
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3216 int sync_store_metadata(SyncDirectory *dir, const char *path, LocalResource *local, DavResource *res) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3217 int ret = 0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3218
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3219 DavXmlNode *fileinfo = dav_get_property_ns(res, DAV_PROPS_NS, "finfo");
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3220 if(fileinfo) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3221 FileInfo f;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3222 finfo_get_values(fileinfo, &f);
646
37a8bfae995e change metadata config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 644
diff changeset
3223 if((dir->metadata & FINFO_MTIME) == FINFO_MTIME && f.date_set) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3224 // set mtime
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3225 struct utimbuf t;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3226 t.actime = f.last_modified;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3227 t.modtime = f.last_modified;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3228 if(utime(path, &t)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3229 fprintf(stderr, "utime failed for file: %s : %s\n", path, strerror(errno));
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3230 ret = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3231 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3232 }
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
3233 if((dir->metadata & FINFO_MODE) == FINFO_MODE && f.mode_set) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3234 // set mode
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3235 if(chmod(path, f.mode)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3236 fprintf(stderr, "chmod failed for file: %s : %s\n", path, strerror(errno));
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3237 ret = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3238 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3239 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3240 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3241
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3242 if((dir->metadata & FINFO_XATTR) == FINFO_XATTR) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3243 DavXmlNode *xattr_prop = dav_get_property_ns(res, DAV_PROPS_NS, "xattributes");
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3244 XAttributes *xattr = NULL;
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3245 if(xattr_prop) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3246 xattr = xml_get_attributes(xattr_prop);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3247 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3248 if(!sync_store_xattr(dir, path, xattr)) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3249 if(local->xattr_hash) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3250 free(local->xattr_hash);
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3251 }
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3252 local->xattr_hash = xattr ? xattr->hash : NULL;
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3253 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3254 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3255
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3256 if(sync_store_tags(dir, path, local, res)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3257 ret = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3258 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3259
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3260 return ret;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3261 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3262
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3263 int sync_store_xattr(SyncDirectory *dir, const char *path, XAttributes *xattr) {
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3264 // create a map of all currently available local attributes
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3265 ssize_t nelm = 0;
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3266 char **list = xattr_list(path, &nelm);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3267 UcxMap *current_xattr = NULL;
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3268 if(nelm > 0) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3269 current_xattr = ucx_map_new(nelm + 8);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3270 for(int i=0;i<nelm;i++) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3271 // use the xattr name as key and store any value
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3272 ucx_map_cstr_put(current_xattr, list[i], list[i]);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3273 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3274 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3275 if(list) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3276 free(list);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3277 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3278
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3279 // store extended attributes
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3280 size_t nattr = xattr ? xattr->nattr : 0;
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3281 for(int i=0;i<nattr;i++) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3282 sstr_t value = xattr->values[i];
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3283 if(xattr_set(path, xattr->names[i], value.ptr, value.length)) {
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3284 fprintf(stderr,
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3285 "Cannot store xattr '%s' for file: %s\n",
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3286 xattr->names[i],
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3287 path);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3288 }
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3289
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3290 if(current_xattr) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3291 // to detect which xattributes are removed, we remove all new
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3292 // attributes from the map and all remaining attributes must
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3293 // be removed with xattr_remove
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3294 char *value = ucx_map_cstr_remove(current_xattr, xattr->names[i]);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3295 if(value) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3296 free(value);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3297 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3298 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3299 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3300
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3301 if(current_xattr) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3302 UcxMapIterator i = ucx_map_iterator(current_xattr);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3303 char *value = NULL;
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3304 UCX_MAP_FOREACH(key, value, i) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3305 (void)xattr_remove(path, value); // don't print error
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3306 free(value);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3307 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3308 ucx_map_free(current_xattr);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3309 }
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3310
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3311 return 0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3312 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3313
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3314 int sync_store_tags(SyncDirectory *dir, const char *path, LocalResource *local, DavResource *res) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3315 if(!dir->tagconfig) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3316 return 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3317 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3318
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3319 char *remote_hash = NULL;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3320 UcxList *tags = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3321 if(dir->tagconfig) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3322 DavXmlNode *tagsprop = dav_get_property_ns(res, DAV_PROPS_NS, "tags");
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3323 if(tagsprop) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3324 tags = parse_dav_xml_taglist(tagsprop);
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3325 remote_hash = create_tags_hash(tags);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3326 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3327 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3328
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3329 DavBool store_tags = FALSE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3330 DavBool tags_changed = FALSE;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3331 UcxList *local_tags = sync_get_file_tags(dir, local, &tags_changed, NULL);
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3332 if(tags_changed) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3333 switch(dir->tagconfig->conflict) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3334 case TAG_NO_CONFLICT: {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3335 store_tags = TRUE;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3336 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3337 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3338 case TAG_KEEP_LOCAL: {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3339 store_tags = FALSE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3340 break;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3341 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3342 case TAG_KEEP_REMOTE: {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3343 store_tags = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3344 local->tags_updated = FALSE;
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3345 break;
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3346 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3347 case TAG_MERGE: {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3348 UcxList *new_tags = merge_tags(local_tags, tags);
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3349 // TODO: free tags and local_tags
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3350 tags = new_tags;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3351 store_tags = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3352 // make sure the merged tags will be pushed the next time
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3353 local->tags_updated = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3354 break;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3355 }
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3356 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3357 } else {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3358 if(!sync_tags_equal(tags, local_tags)) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3359 store_tags = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3360 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3361 // TODO: free local_tags
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3362 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3363
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3364 if(!store_tags) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3365 return 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3366 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3367
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3368 int ret = sync_store_tags_local(dir, local, path, tags);
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3369 if(!ret) {
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3370 if(local->remote_tags_hash) {
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3371 free(local->remote_tags_hash);
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3372 }
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3373 local->remote_tags_hash = remote_hash;
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
3374 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3375
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3376 // TODO: free stuff
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3377
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3378 return ret;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3379 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3380
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3381 int sync_store_tags_local(SyncDirectory *dir, LocalResource *local, const char *path, UcxList *tags) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3382 int ret = 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3383 if(dir->tagconfig->store == TAG_STORE_XATTR) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3384 UcxBuffer *data = NULL;
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3385 if(tags) {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3386 switch(dir->tagconfig->local_format) {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3387 default: break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3388 case TAG_FORMAT_TEXT: {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3389 data = create_text_taglist(tags);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3390 break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3391 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3392 case TAG_FORMAT_CSV: {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3393 data = create_csv_taglist(tags);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3394 break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3395 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3396 case TAG_FORMAT_MACOS: {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3397 data = create_macos_taglist(tags);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3398 break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3399 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3400 }
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3401
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3402 if(data) {
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3403 char *data_hash = dav_create_hash(data->space, data->size);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3404 int update = 1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3405 if(local) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3406 if(!local->tags_hash || strcmp(data_hash, local->tags_hash)) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3407 //printf("update: %s\n", local->path);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3408 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3409 update = 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3410 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3411 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3412 if(update) {
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3413 ret = xattr_set(path, dir->tagconfig->xattr_name, data->space, data->pos);
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3414 if(local) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3415 if(local->tags_hash) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3416 free(local->tags_hash);
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
3417 local->tags_hash = NULL;
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3418 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3419 local->tags_hash = data_hash;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3420 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3421 } else {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3422 free(data_hash);
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3423 }
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3424 ucx_buffer_free(data);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3425 } else {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3426 ret = -1;
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
3427 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3428 } else {
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3429 if(local) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3430 //printf("update: %s\n", local->path);
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3431 }
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3432 // ignore errors on remove
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3433 xattr_remove(path, dir->tagconfig->xattr_name);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3434 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3435 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3436
618
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
3437 if(!ret && local) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3438 local->tags_updated = 0;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3439 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3440
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3441 return ret;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3442 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3443
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3444 UcxBuffer* sync_get_file_tag_data(SyncDirectory *dir, LocalResource *res) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3445 if(!dir->tagconfig) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3446 return NULL;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3447 }
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3448 if(res->cached_tags) {
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3449 return res->cached_tags;
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3450 }
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3451 UcxBuffer *buf = NULL;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3452 if(dir->tagconfig->store == TAG_STORE_XATTR) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3453 ssize_t tag_length = 0;
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3454 char *local_path = create_local_path(dir, local_resource_path(res));
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3455 char* tag_data = xattr_get(
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3456 local_path,
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3457 dir->tagconfig->xattr_name,
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3458 &tag_length);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3459 free(local_path);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3460
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3461 if(tag_length > 0) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3462 buf = ucx_buffer_new(tag_data, (size_t)tag_length, UCX_BUFFER_AUTOFREE);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3463 buf->size = (size_t)tag_length;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3464 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3465 }
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3466 res->cached_tags = buf;
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3467 return buf;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3468 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3469
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3470 UcxList* sync_get_file_tags(SyncDirectory *dir, LocalResource *res, DavBool *changed, char **newhash) {
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3471 if(changed) *changed = FALSE;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3472
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3473 UcxList *tags = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3474
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3475 if(!res) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3476 return NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3477 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3478
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3479 if(!dir->tagconfig) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3480 return NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3481 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3482 if(changed && res->tags_updated) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3483 *changed = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3484 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3485 if(dir->tagconfig->store == TAG_STORE_XATTR) {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3486 UcxBuffer *tag_buf = res->cached_tags ?
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3487 res->cached_tags :
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3488 sync_get_file_tag_data(dir, res);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3489
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3490 if(tag_buf) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3491 char *new_hash = dav_create_hash(tag_buf->space, tag_buf->size);
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3492 if(res->tags_hash) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3493 if(changed && strcmp(res->tags_hash, new_hash)) {
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3494 *changed = TRUE;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3495 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3496 free(res->tags_hash);
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
3497 res->tags_hash = NULL;
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3498 } else {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3499 if(changed) *changed = TRUE;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3500 }
618
4b34d12cf211 exclude tag xattr from xattribute sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 617
diff changeset
3501 if(newhash) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3502 *newhash = new_hash;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3503 } else {
619
1d20a6cab2e5 fix free in sync_get_file_tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 618
diff changeset
3504 free(new_hash);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3505 }
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3506
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3507 switch(dir->tagconfig->local_format) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3508 default: break;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3509 case TAG_FORMAT_TEXT: {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3510 tags = parse_text_taglist(tag_buf->space, tag_buf->size);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3511 break;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3512 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3513 case TAG_FORMAT_CSV: {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3514 tags = parse_csv_taglist(tag_buf->space, tag_buf->size);
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3515 break;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3516 }
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
3517 case TAG_FORMAT_MACOS: {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3518 tags = parse_macos_taglist(tag_buf->space, tag_buf->size);
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
3519 break;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
3520 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3521 }
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3522 res->cached_tags = tag_buf;
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3523 } else if(res->tags_hash) {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3524 if(changed) *changed = TRUE;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3525 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3526 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3527
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3528 return tags;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3529 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3530
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3531 static int file_seek(FILE *f, curl_off_t offset, int origin) {
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3532 int ret = fseek(f, offset, origin);
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3533 return ret == 0 ? CURL_SEEKFUNC_OK : CURL_SEEKFUNC_CANTSEEK;
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3534 }
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3535
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3536 size_t myread(void *ptr, size_t size, size_t nmemb, FILE *f) {
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3537 size_t ret = fread(ptr, size, nmemb, f);
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3538 return ret;
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3539 }
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3540
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3541 int gen_random_name(char *buf, size_t len) {
513
893a659768b3 fixes signedness issue in get_random_name()
Mike Becker <universe@uap-core.de>
parents: 510
diff changeset
3542 unsigned char name_prefix[8];
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3543 memset(name_prefix, 0, 8);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3544 dav_rand_bytes(name_prefix, 8);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3545 char *pre = util_hexstr(name_prefix, 8);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3546 int64_t ts = (int64_t)time(NULL);
516
39f5f17c3bc3 change format of version history resource names
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 514
diff changeset
3547 int w = snprintf(buf, len, "%"PRId64"-%s", ts, pre);
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3548 free(pre);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3549 return w >= len;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3550 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3551
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3552 #define VBEGIN_ERROR_MKCOL 1
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3553 #define VBEGIN_ERROR_MOVE 2
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3554 #define VBEGIN_ERROR_PROPPATCH 3
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3555 #define VBEGIN_ERROR_CHECKOUT 4
584
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
3556 int versioning_begin(SyncDirectory *dir, DavResource *res, int *exists) {
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3557 int ret = 0;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3558
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3559 if(dir->versioning->type == VERSIONING_SIMPLE && res->exists) {
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3560 DavResource *history_collection = dav_resource_new(
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3561 res->session,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3562 dir->versioning->collection);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3563
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3564 // get the path to the version history collection for this resource
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3565 // if propfind fails we just assume that it doesn't exist
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3566 // better error handling is done later (sync_put_resource)
510
d6e801f97e7a more sstr to scstr conversion
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 506
diff changeset
3567 // if there is no history collection for this resource, we create one
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3568
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3569 char *history_href = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3570 char *vcol_path = dav_get_string_property_ns(res, DAV_NS, VERSION_PATH_PROPERTY);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3571 if(!vcol_path) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3572 DavResource *history_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3573
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3574 // create a new collection for version history
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3575 // the name is a combination of a random prefix and a timestamp
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3576 while(!history_res) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3577 char history_res_name[128];
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3578 gen_random_name(history_res_name, 128);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3579
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3580 history_res = dav_resource_new_child(
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3581 res->session,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3582 history_collection,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3583 history_res_name);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3584 if(dav_exists(history_res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3585 dav_resource_free(history_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3586 history_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3587 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3588 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3589
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3590 history_res->iscollection = TRUE;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3591 if(dav_create(history_res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3592 dav_resource_free(history_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3593 dav_resource_free(history_collection);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3594 return VBEGIN_ERROR_MKCOL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3595 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3596
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3597 history_href = strdup(history_res->href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3598
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3599 dav_resource_free(history_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3600 } else {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3601 history_href = vcol_path;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3602 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3603
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3604 // find a free url and move 'res' to this location
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3605 DavResource *version_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3606 while(!version_res) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3607 char version_name[128];
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3608 gen_random_name(version_name, 128);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3609
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3610 char *href = util_concat_path(history_href, version_name);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3611 version_res = dav_resource_new_href(res->session, href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3612 free(href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3613
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3614 char *dest = util_get_url(res->session, version_res->href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3615 int err = dav_moveto(res, dest, FALSE);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3616 free(dest);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3617
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3618 if(err) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3619 dav_resource_free(version_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3620 version_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3621 if(res->session->error != DAV_PRECONDITION_FAILED) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3622 ret = VBEGIN_ERROR_MOVE;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3623 break;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3624 }
584
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
3625 } else {
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
3626 // tell the caller the resource does not exist anymore at
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
3627 // the original location
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
3628 *exists = 0;
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3629 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3630 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3631
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3632 if(!ret) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3633 dav_set_string_property_ns(version_res, DAV_NS, "origin", res->href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3634 if(dav_store(version_res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3635 ret = VBEGIN_ERROR_PROPPATCH;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3636 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3637 dav_resource_free(version_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3638
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3639 // we can just set the property here and don't need dav_store
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3640 // because sync_put_resource will call dav_store(res) later
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3641 dav_set_string_property_ns(
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3642 res,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3643 DAV_NS,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3644 VERSION_PATH_PROPERTY,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3645 history_href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3646 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3647
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3648 if(vcol_path != history_href) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3649 free(history_href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3650 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3651
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3652 dav_resource_free(history_collection);
522
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 521
diff changeset
3653 } else if(dir->versioning->type == VERSIONING_DELTAV){
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3654 // DeltaV is so much easier :)
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3655 if(dav_checkout(res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3656 ret = VBEGIN_ERROR_CHECKOUT;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3657 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3658 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3659
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3660 return ret;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3661 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3662
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3663 int versioning_end(SyncDirectory *dir, DavResource *res) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3664 if(dir->versioning->type == VERSIONING_DELTAV) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3665 return dav_checkin(res);
504
bf3695fee719 fix missiong return in versioning_end()
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 503
diff changeset
3666 } else {
bf3695fee719 fix missiong return in versioning_end()
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 503
diff changeset
3667 return 0;
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3668 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3669 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3670
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3671 int versioning_delete(SyncDirectory *dir, DavResource *res) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3672 if(dir->versioning->type == VERSIONING_SIMPLE) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3673 // TODO
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3674 }
522
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 521
diff changeset
3675 return 0;
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3676 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3677
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3678 static void update_metadata_hashes(LocalResource *local, MetadataHashes hashes) {
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3679 if(hashes.update_tags) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3680 if(local->tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3681 free(local->tags_hash);
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
3682 local->tags_hash = NULL;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3683 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3684 local->tags_hash = hashes.tags;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3685 }
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3686 if(hashes.update_tags_remote) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3687 if(local->remote_tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3688 free(local->remote_tags_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3689 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3690 local->remote_tags_hash = hashes.tags_remote;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3691 }
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
3692 if(hashes.update_xattr) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3693 if(local->xattr_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3694 free(local->xattr_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3695 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3696 local->xattr_hash = hashes.xattr;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3697 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3698 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3699
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3700 // this macro is only a workaround for a netbeans bug
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3701 #define LOG10 log10
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3702
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3703 static UcxList* upload_parts(
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3704 LocalResource *local,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3705 DavResource *res,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3706 FILE *in,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3707 uint64_t filesize,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3708 size_t blocksize,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3709 uint64_t *blockcount,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3710 int *err)
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3711 {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3712 // Make sure the resource is a collection. If it was a normal
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3713 // resource until now, delete it and recreate it as collection
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3714 if(res->exists) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3715 if(!res->iscollection) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3716 if(dav_delete(res)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3717 print_resource_error(res->session, res->path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3718 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3719 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3720 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3721 res->exists = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3722 return upload_parts(local, res, in, filesize, blocksize, blockcount, err);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3723 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3724 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3725 res->iscollection = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3726 if(dav_create(res)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3727 print_resource_error(res->session, res->path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3728 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3729 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3730 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3731 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3732 res->exists = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3733
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3734 if(!res->href) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3735 // this should never happen, but just make sure it doesn't crash
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3736 fprintf(stderr, "href is NULL\n");
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3737 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3738 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3739 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3740
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3741 char *buffer = malloc(blocksize);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3742 if(!buffer) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3743 fprintf(stderr, "Out of memory\n");
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3744 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3745 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3746 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3747
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3748 // calculate the maximal length of resource names
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3749 // names should have all the same length and contain the block number
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3750 int nblocks = filesize / blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3751 int digits = LOG10((double)nblocks) + 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3752 if(digits > 127) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3753 fprintf(stderr, "Too many parts\n");
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3754 *err = 1;
659
51206020cfbe fix: leaking buffer in upload_parts(), when we error out due to too many parts
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
3755 free(buffer);
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3756 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3757 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3758
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3759 UcxMap *updated_parts_map = ucx_map_new((nblocks/2)+64);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3760
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3761 int blockindex = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3762 int uploaded_parts = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3763 size_t r;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3764
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3765 // temporarly disable name encryption, because we don't need it for
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3766 // part names
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3767 uint32_t session_flags = res->session->flags;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3768 res->session->flags ^= DAV_SESSION_ENCRYPT_NAME;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3769
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3770 DAV_SHA_CTX *sha = dav_hash_init();
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3771
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3772 while((r = fread(buffer, 1, blocksize, in)) > 0) {
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3773 dav_hash_update(sha, buffer, r);
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3774
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3775 int upload_block = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3776 char *block_hash = dav_create_hash(buffer, r);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3777 if(blockindex >= local->numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3778 // we don't have a hash for this block, therefore it must be new
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3779 upload_block = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3780 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3781 FilePart part = local->parts[blockindex];
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3782 if(!strcmp(part.hash, block_hash)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3783 // no change
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3784 free(block_hash);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3785 block_hash = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3786 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3787 // block has changed
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3788 upload_block = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3789 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3790 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3791
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3792 if(upload_block) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3793 char name[128];
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3794 snprintf(name, 128, "%0*d", digits, blockindex);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3795
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3796 char *part_href = util_concat_path(res->href, name);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3797 DavResource *part = dav_resource_new_href(res->session, part_href);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3798 free(part_href);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3799
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3800 // upload part
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3801 dav_set_content_data(part, buffer, r);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3802 if(dav_store(part)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3803 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3804 print_resource_error(res->session, part->path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3805 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3806 // successfully uploaded part
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3807
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3808 // store the FilePart in a map
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3809 // later we do a propfind and add the etag
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3810 FilePart *f = calloc(1, sizeof(FilePart));
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3811 f->block = blockindex;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3812 f->hash = block_hash;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3813 ucx_map_cstr_put(updated_parts_map, name, f);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3814 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3815 dav_resource_free(part);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3816 uploaded_parts++;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3817 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3818 if(*err) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3819 break;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3820 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3821 blockindex++;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3822 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3823 *blockcount = blockindex;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3824
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3825 // restore flags
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3826 res->session->flags = session_flags;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3827
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3828 free(buffer);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3829 if(*err) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3830 ucx_map_free_content(updated_parts_map, (ucx_destructor)filepart_free);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3831 ucx_map_free(updated_parts_map);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3832 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3833 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3834
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3835 // set content-hash
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
3836 unsigned char content_hash[DAV_SHA256_DIGEST_LENGTH];
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3837 dav_hash_final(sha, content_hash);
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
3838 sync_set_content_hash(res, content_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
3839 local->hash = util_hexstr(content_hash, DAV_SHA256_DIGEST_LENGTH);
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3840
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3841 // get etags from uploaded resources
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3842 // also delete everything, that is not part of the file
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3843 UcxList *updated_parts = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3844 DavResource *parts = dav_query(res->session, "select D:getetag from %s order by name", res->path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3845 if(!parts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3846 print_resource_error(res->session, parts->path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3847 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3848 ucx_map_free_content(updated_parts_map, (ucx_destructor)filepart_free);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3849 ucx_map_free(updated_parts_map);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3850 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3851 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3852 DavResource *part = parts->children;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3853 while(part) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3854 FilePart *fp = ucx_map_cstr_remove(updated_parts_map, part->name);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3855 // every part we uploaded is in the map
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3856 // if we get parts that are not in the map, someone else uploaded it
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3857 if(fp) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3858 char *etag = dav_get_string_property(part, "D:getetag");
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3859 if(etag) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3860 if(strlen(etag) > 2 && etag[0] == 'W' && etag[1] == '/') {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3861 etag = etag + 2;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3862 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3863
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3864 fp->etag = strdup(etag);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3865 updated_parts = ucx_list_append(updated_parts, fp);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3866 } // else { wtf is wrong with this resource }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3867 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3868 uint64_t name_partnum = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3869 char *res_name = part->name;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3870 while(res_name[0] == '0' && res_name[1] != '\0') {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3871 res_name++;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3872 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3873 DavBool delete_part = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3874 if(strlen(part->name) != digits) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3875 delete_part = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3876 } else if(util_strtouint(res_name, &name_partnum)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3877 if(name_partnum >= blockindex) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3878 delete_part = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3879 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3880 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3881
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3882 if(delete_part) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3883 if(dav_delete(part)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3884 print_resource_error(part->session, part->path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3885 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3886 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3887 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3888 part = part->next;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3889 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3890 dav_resource_free_all(parts);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3891
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3892 ucx_map_free_content(updated_parts_map, (ucx_destructor)filepart_free);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3893 ucx_map_free(updated_parts_map);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3894
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3895 *err = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3896 return updated_parts;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3897 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3898
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
3899 void update_parts(LocalResource *local, UcxList *updates, uint64_t numparts) {
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3900 size_t old_num = local->numparts;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3901 if(old_num > numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3902 // free old parts
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3903 for(size_t i=numparts;i<old_num;i++) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3904 FilePart p = local->parts[i];
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3905 if(p.etag) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3906 free(p.etag);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3907 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3908 if(p.hash) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3909 free(p.hash);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3910 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3911 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3912 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3913 if(numparts != local->numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3914 local->parts = realloc(local->parts, numparts * sizeof(FilePart));
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3915 local->numparts = numparts;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3916 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3917
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3918 UCX_FOREACH(elm, updates) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3919 FilePart *p = elm->data;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3920 if(p->block > numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3921 // just make sure things don't explode in case some weird stuff
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3922 // is going on
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3923 continue;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3924 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3925
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3926 FilePart *old = &local->parts[p->block];
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3927 if(p->block < old_num) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3928 // cleanup existing part
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3929 if(old->hash) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3930 free(old->hash);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3931 old->hash = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3932 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3933 if(old->etag) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3934 free(old->etag);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3935 old->etag = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3936 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3937 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3938 old->block = p->block;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3939 old->hash = p->hash;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3940 old->etag = p->etag;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3941 free(p);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3942 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3943 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3944
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3945 int sync_put_resource(
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3946 SyncDirectory *dir,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3947 DavResource *res,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3948 LocalResource *local,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3949 int *counter)
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3950 {
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3951 char *local_path = create_local_path(dir, local_resource_path(local));
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3952
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
3953 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
3954 if(sys_stat(local_path, &s)) {
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3955 fprintf(stderr, "Cannot stat file: %s\n", local_path);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3956 perror("");
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3957 free(local_path);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3958 return -1;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3959 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3960
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3961 DavBool islink = local->link_target ? 1 : 0;
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3962 if(!local->link_target && local->link_updated) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3963 dav_remove_property_ns(res, DAV_PROPS_NS, "link");
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3964 }
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3965
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3966 size_t split_blocksize = resource_get_blocksize(dir, local, res, s.st_size);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3967
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
3968 FILE *in = sys_fopen(local_path, "rb");
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3969 if(!in) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3970 fprintf(stderr, "Cannot open file %s\n", local_path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3971 free(local_path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3972 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3973 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3974
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3975 DavBool issplit = split_blocksize == 0 ? FALSE : TRUE;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3976 int split_err = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3977 UcxList *parts = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3978 uint64_t blockcount = 0;
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3979
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3980 if(islink) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3981 dav_set_string_property_ns(res, DAV_PROPS_NS, "link", local->link_target);
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3982 } else if(issplit) {
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3983 // set split property
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3984 char blocksize_str[32];
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3985 snprintf(blocksize_str, 32, "%zu", split_blocksize);
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3986 dav_set_string_property_ns(res, DAV_NS, "split", blocksize_str);
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3987
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3988 // splitted/partial upload
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3989 parts = upload_parts(
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3990 local,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3991 res,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3992 in,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3993 s.st_size,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3994 split_blocksize,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3995 &blockcount,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3996 &split_err);
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3997 } else {
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3998 // regular file upload
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3999 dav_set_content(res, in, (dav_read_func)myread, (dav_seek_func)file_seek);
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
4000 dav_set_content_length(res, s.st_size);
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4001 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4002 if(split_err) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4003 free(local_path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4004 return -1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4005 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4006
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4007 MetadataHashes hashes;
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4008 hashes = sync_set_metadata_properties(dir, res->session, res, local, FALSE);
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4009
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4010 // before sync_put_resource, remote_resource_is_changed does a propfind
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4011 // and sets res->exists
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4012 int exists = res->exists;
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4013 if(dir->versioning && dir->versioning->always && !issplit) {
584
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
4014 int err = versioning_begin(dir, res, &exists);
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4015 if(err) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4016 fprintf(stderr, "Cannot store version for resource: %s\n", res->href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4017 free(local_path);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4018 return -1;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4019 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4020 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4021
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4022 int ret = -1;
244
47791bdf1725 changed max-retry meaning and filter configuration in sync.xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 243
diff changeset
4023 for(int i=0;i<=dir->max_retry;i++) {
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4024 if(!exists && dav_create(res)) {
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4025 continue;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4026 }
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4027 exists = 1;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4028 if(dav_store(res)) {
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4029 continue;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4030 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4031 ret = 0;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4032 break;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4033 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4034
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4035 if(dir->versioning && dir->versioning->always && !issplit) {
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4036 if(versioning_end(dir, res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4037 fprintf(stderr, "Cannot checkin resource\n");
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4038 ret = 1;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4039 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
4040 }
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4041
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4042 if(ret == 0) {
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4043 (*counter)++;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4044
661
1baec7ff8931 add first metadata sync test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 659
diff changeset
4045 local->tags_updated = 0;
1baec7ff8931 add first metadata sync test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 659
diff changeset
4046
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4047 update_metadata_hashes(local, hashes);
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4048 update_parts(local, parts, blockcount);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4049
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4050 // check contentlength and get new etag
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
4051 DavResource *up_res = dav_get(res->session, res->path, "D:getetag,idav:status");
48
08d5544c92fb fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 47
diff changeset
4052
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4053 if(up_res) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4054 // the new content length must be equal or greater than the file size
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
4055 if(up_res->contentlength < s.st_size && !issplit && !islink) {
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
4056 fprintf(stderr, "Incomplete Upload: %s\n", local_path);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4057 ret = -1;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4058 // try to set the resource status to 'broken'
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4059 sync_set_status(res, "broken");
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4060 } else {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4061 // everything seems fine, we can update the local resource
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
4062 char *etag = dav_get_string_property(up_res, "D:getetag");
621
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
4063 local_resource_set_etag(local, etag);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4064
630
046b869a1c49 use hash to check if a file content was really modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 629
diff changeset
4065 if(!issplit && SYNC_STORE_HASH(dir)) {
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
4066 if(local->hash) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
4067 free(local->hash);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
4068 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
4069 // TODO: calculate hash on upload
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
4070 local->hash = util_file_hash(local_path);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
4071 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
4072
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
4073 if(dav_get_string_property(up_res, "idav:status")) {
227
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
4074 sync_remove_status(up_res);
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
4075 }
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
4076
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
4077 dav_resource_free(up_res);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4078 }
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
4079 }
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4080 } else {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4081 ret = -1;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4082 sync_set_status(res, "broken");
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4083 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4084
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4085 fclose(in);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
4086 free(local_path);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4087
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
4088 return ret;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4089 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4090
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4091 int sync_mkdir(SyncDirectory *dir, DavResource *res, LocalResource *local) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4092 res->iscollection = 1;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4093 int ret = -1;
244
47791bdf1725 changed max-retry meaning and filter configuration in sync.xml
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 243
diff changeset
4094 for(int i=0;i<=dir->max_retry;i++) {
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4095 if(dav_create(res)) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4096 continue;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4097 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4098 ret = 0;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4099 break;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4100 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4101 return ret;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4102 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4103
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4104 int sync_move_remote_resource(
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4105 SyncDirectory *dir,
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
4106 SyncDatabase *db,
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4107 DavResource *origin,
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4108 LocalResource *local,
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4109 DavBool copy,
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4110 int *counter)
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4111 {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4112 char *local_path = create_local_path(dir, local->path);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4113
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4114 SYS_STAT s;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4115 if(sys_stat(local_path, &s)) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4116 fprintf(stderr, "Cannot stat file: %s\n", local_path);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4117 perror("");
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4118 free(local_path);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4119 return -1;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4120 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4121 free(local_path);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4122
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4123 int result = 0;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4124 if(copy) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4125 result = dav_copy_o(origin, local->path, FALSE);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4126 } else {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4127 result = dav_move_o(origin, local->path, FALSE);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4128 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4129
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4130 if(result != 0) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4131 return result;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4132 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4133
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
4134 LocalResource *local_origin = local->origin;
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
4135 if(!copy) {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
4136 ucx_map_cstr_remove(db->resources, local_origin->path);
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
4137 }
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4138
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4139 // set resource metadata
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4140 DavResource *up_res = dav_resource_new(origin->session, local->path);
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4141 if(!up_res) {
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4142 return 1;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4143 }
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4144
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4145 sync_set_metadata_from_stat(local, &s);
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4146 MetadataHashes hashes;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4147 hashes = sync_set_metadata_properties(dir, up_res->session, up_res, local, TRUE);
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4148 if(dav_store(up_res)) {
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4149 fprintf(stderr, "Error: cannot store resource metadata\n");
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4150 }
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4151
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4152 // get new etag
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4153 DavPropName p;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4154 p.ns = "DAV:";
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4155 p.name = "getetag";
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4156 if(!dav_load_prop(up_res, &p, 1)) {
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4157 (*counter)++;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4158
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4159 // everything seems fine, we can update the local resource
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4160 char *etag = dav_get_string_property(up_res, "D:getetag");
621
06f9fddc82a1 don't store weak etag in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 619
diff changeset
4161 local_resource_set_etag(local, etag);
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4162
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4163 local->last_modified = s.st_mtime;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4164 } else {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4165 result = 1;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4166 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4167
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4168 dav_resource_free(up_res);
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4169 return result;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4170 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
4171
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4172 int sync_delete_remote_resource(
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4173 SyncDirectory *dir,
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4174 DavSession *sn,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4175 LocalResource *local_res,
460
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4176 int *counter,
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4177 UcxList **cols)
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4178 {
570
00b7b8e86c48 fix deletion of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
4179 DavResource *res = dav_get(sn, local_res->path, "D:getetag,idav:split");
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4180 if(!res) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4181 return sn->error == DAV_NOT_FOUND ? 0 : 1;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4182 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4183
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4184 int ret = 0;
460
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4185 sn->error = DAV_OK;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4186 if(res->iscollection) {
570
00b7b8e86c48 fix deletion of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
4187 DavXmlNode *split = dav_get_property_ns(res, DAV_NS, "split");
460
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4188 if(cols) {
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4189 *cols = ucx_list_append(*cols, local_res);
570
00b7b8e86c48 fix deletion of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
4190 } else if(split || !res->children) {
460
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4191 printf("delete: %s\n", res->path);
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4192 if(dav_delete(res)) {
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4193 ret = 1;
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4194 fprintf(stderr, "Cannot delete collection %s\n", res->path);
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4195 } else {
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4196 (*counter)++;
22522ff52a62 adds check to make sure dav-sync doesn't delete collections when children are modified
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 449
diff changeset
4197 }
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4198 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4199 } else {
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
4200 char *etag = dav_get_string_property(res, "D:getetag");
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4201 if(etag) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4202 if(strlen(etag) > 2 && etag[0] == 'W' && etag[1] == '/') {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4203 etag = etag + 2;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4204 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4205 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4206
565
26898e00ddff fix dav-sync push not deleting files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 564
diff changeset
4207 if(!nullstrcmp(etag, local_res->etag)) {
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4208 // local resource metadata == remote resource metadata
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4209 // resource can be deleted
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4210 printf("delete: %s\n", res->path);
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4211
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4212 if(dir->versioning && dir->versioning->always) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4213 if(versioning_delete(dir, res)) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4214 fprintf(
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4215 stderr,
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4216 "Cannot save resource version before deletion\n");
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4217 ret = 1;
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4218 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4219 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4220
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
4221 if(!ret && dav_delete(res)) {
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4222 if(sn->error != DAV_NOT_FOUND) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4223 fprintf(stderr, "Cannot delete resource %s\n", res->path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4224 ret = 1;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4225 }
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4226 } else {
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
4227 (*counter)++;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4228 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
4229 }
565
26898e00ddff fix dav-sync push not deleting files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 564
diff changeset
4230 // else TODO: should we inform the user that the file was modified on
26898e00ddff fix dav-sync push not deleting files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 564
diff changeset
4231 // the server and delete was skipped?
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4232 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4233
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4234 // cleanup
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4235 dav_resource_free(res);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4236
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4237 return ret;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
4238 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4239
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4240 MetadataHashes sync_set_metadata_properties(
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4241 SyncDirectory *dir,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4242 DavSession *sn,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4243 DavResource *res,
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4244 LocalResource *local,
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4245 DavBool force)
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4246 {
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4247 if(force) {
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4248 local->tags_updated = 1;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4249 local->finfo_updated = 1;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4250 local->xattr_updated = 1;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4251 }
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4252
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
4253 MetadataHashes hashes = {NULL, NULL, NULL, 0, 0, 0};
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4254 if(dir->tagconfig) {
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4255 // get local tags
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4256 DavBool changed = 0;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4257 char *tags_hash = NULL;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4258 UcxList *tags = sync_get_file_tags(dir, local, &changed, &tags_hash);
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4259 char *new_remote_hash = nullstrdup(tags_hash);
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4260 if(changed || local->tags_updated) {
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4261 DavBool store_tags = TRUE;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4262
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4263 // get remote tags
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4264 DavPropName p;
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4265 p.ns = DAV_PROPS_NS;
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4266 p.name = "tags";
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4267 if(dav_load_prop(res, &p, 1) && sn->error != DAV_NOT_FOUND) {
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4268 print_resource_error(sn, res->path);
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4269 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4270 UcxList *remote_tags = NULL;
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
4271 DavXmlNode *tagsprop = dav_get_property_ns(res, DAV_PROPS_NS, "tags");
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4272 if(tagsprop) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4273 remote_tags = parse_dav_xml_taglist(tagsprop);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4274 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4275 char *remote_hash = create_tags_hash(remote_tags);
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4276
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4277 if(nullstrcmp(remote_hash, local->remote_tags_hash)) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4278 // the tags have changed on the server
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4279 int conflict_resolution = force ? TAG_NO_CONFLICT : dir->tagconfig->conflict;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4280 switch(conflict_resolution) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4281 case TAG_NO_CONFLICT: break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4282 case TAG_KEEP_LOCAL: break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4283 case TAG_KEEP_REMOTE: {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4284 store_tags = FALSE;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4285 local->tags_updated = FALSE;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4286 break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4287 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4288 case TAG_MERGE: {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4289 UcxList *new_tags = merge_tags(tags, remote_tags);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4290 free_taglist(tags);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4291 tags = new_tags;
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4292
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4293 nullfree(tags_hash);
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4294 nullfree(new_remote_hash);
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4295 tags_hash = create_tags_hash(tags);
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4296 new_remote_hash = nullstrdup(tags_hash);
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4297
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4298 break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4299 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4300 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4301 }
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4302 nullfree(remote_hash);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4303
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4304 if(dir->tagconfig->local_format == TAG_FORMAT_CSV) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4305 // csv tag lists don't have colors, so we have to add
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4306 // the colors from the remote tag list
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4307 add_tag_colors(tags, remote_tags);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4308 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4309
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4310 if(store_tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4311 if(tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4312 DavXmlNode *tagprop = create_xml_taglist(tags);
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
4313 dav_set_property_ns(res, DAV_PROPS_NS, "tags", tagprop);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4314 } else {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
4315 dav_remove_property_ns(res, DAV_PROPS_NS, "tags");
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4316 }
667
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4317
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4318 hashes.tags = tags_hash;
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4319 hashes.update_tags = 1;
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4320 hashes.tags_remote = new_remote_hash;
6cdcd3e4e368 finish basic metadata sync tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 663
diff changeset
4321 hashes.update_tags_remote = 1;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4322 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4323
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4324 free_taglist(remote_tags);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4325 } else {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4326 if(tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4327 free(tags_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4328 }
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4329 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4330 free_taglist(tags);
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4331 }
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4332
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4333 if(local->finfo_updated) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4334 struct stat s;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4335 s.st_mode = local->mode;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4336 s.st_mtime = local->last_modified;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4337 s.st_uid = local->uid;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4338 s.st_gid = local->gid;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4339 resource_set_finfo_s(&s, res, dir->metadata);
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4340 }
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4341
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4342 if(local->xattr_updated) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4343 if(local->xattr) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4344 resource_set_xattr(res, local->xattr);
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
4345 hashes.xattr = local->xattr ? strdup(local->xattr->hash) : NULL;
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
4346 hashes.update_xattr = 1;
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4347 } else {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
4348 dav_remove_property(res, "idavprops:xattributes");
663
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
4349 if(local->xattr_hash) {
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
4350 free(local->xattr_hash);
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
4351 local->xattr_hash = NULL;
888aa263c0f1 fix some xattr sync bugs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 662
diff changeset
4352 }
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4353 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4354 }
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4355
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4356 local->tags_updated = 0;
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4357
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4358 return hashes;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4359 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4360
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4361 int sync_update_metadata(
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4362 SyncDirectory *dir,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4363 DavSession *sn,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4364 DavResource *res,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4365 LocalResource *local)
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4366 {
672
4bfe452a2665 fix dav-sync copy with enabled metadata sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 669
diff changeset
4367 MetadataHashes hashes = sync_set_metadata_properties(dir, sn, res, local, FALSE);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4368
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4369 int err = 0;
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
4370 if(dav_store(res)) {
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
4371 print_resource_error(sn, local->path);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4372 err = 1;
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
4373 } else {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4374 update_metadata_hashes(local, hashes);
661
1baec7ff8931 add first metadata sync test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 659
diff changeset
4375 local->tags_updated = 0;
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4376 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4377
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4378 return err;
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4379 }
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4380
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4381 void remove_deleted_conflicts(SyncDirectory *dir, SyncDatabase *db) {
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4382 char **dc = calloc(sizeof(void*), db->conflict->count);
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4383 int numdc = 0;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4384
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4385 UcxMapIterator i = ucx_map_iterator(db->conflict);
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4386 LocalResource *res;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4387 UCX_MAP_FOREACH(key, res, i) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
4388 char *path = create_local_path(dir, res->path);
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4389 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4390 if(sys_stat(path, &s)) {
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4391 if(errno == ENOENT) {
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4392 dc[numdc] = res->path;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4393 numdc++;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4394 } else {
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4395 fprintf(stderr, "Cannot stat file: %s\n", path);
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4396 perror("");
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4397 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4398 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4399 free(path);
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4400 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4401
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4402 for(int i=0;i<numdc;i++) {
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4403 ucx_map_cstr_remove(db->conflict, dc[i]);
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4404 }
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4405
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4406 free(dc);
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4407 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4408
257
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4409 static void resolve_skipped(SyncDatabase *db) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4410 UcxKey k;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4411 LocalResource *res;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4412 UcxMapIterator i = ucx_map_iterator(db->resources);
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4413 int skipped = 0;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4414 UCX_MAP_FOREACH(k, res, i) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4415 if(res->skipped) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4416 skipped++;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4417 fprintf(stderr, "skipped from push: %s\n", res->path);
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4418 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4419 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4420 if(skipped > 0) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4421 fprintf(stderr,
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4422 " To resolve conflict resources skipped by push run dav-sync pull first\n"
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4423 " before resolve-conflicts or delete-conflicts.\n\n");
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4424 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4425 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4426
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4427 int cmd_resolve_conflicts(CmdArgs *a) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4428 if(a->argc != 1) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4429 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4430 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4431 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4432
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4433 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4434 if(!dir) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4435 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4436 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4437 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4438 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4439 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4440 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4441
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4442 SyncDatabase *db = load_db(dir->database);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4443 if(!db) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4444 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4445 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4446 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4447
257
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4448 resolve_skipped(db);
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4449
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4450 int ret = 0;
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4451
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4452 // remove conflicts
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4453 int num_conflict = db->conflict->count;
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4454 ucx_map_free_content(db->conflict, (ucx_destructor)local_resource_free);
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4455 ucx_map_clear(db->conflict);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4456
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4457 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
4458 if(store_db(db, dir->database, dir->db_settings)) {
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4459 fprintf(stderr, "Cannot store sync db\n");
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4460 fprintf(stderr, "Abort\n");
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4461 ret = -2;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4462 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4463
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4464 // cleanup
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4465 destroy_db(db);
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4466
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4467 // Report
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4468 if(ret != -2) {
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4469 char *str_conflict = num_conflict == 1 ? "conflict" : "conflicts";
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4470 printf("Result: %d %s resolved\n", num_conflict, str_conflict);
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4471 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4472
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4473 return ret;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4474 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4475
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4476 int cmd_delete_conflicts(CmdArgs *a) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4477 if(a->argc != 1) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4478 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4479 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4480 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4481
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4482 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4483 if(!dir) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4484 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4485 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4486 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4487 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4488 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4489 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4490
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4491 SyncDatabase *db = load_db(dir->database);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4492 if(!db) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4493 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4494 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4495 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4496
257
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4497 resolve_skipped(db);
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4498
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4499 int num_del = 0;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4500 int num_err = 0;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4501
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4502 int ret = 0;
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4503
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4504 // delete all conflict files
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4505 UcxMapIterator i = ucx_map_iterator(db->conflict);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4506 LocalResource *res;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4507 UCX_MAP_FOREACH(key, res, i) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4508 printf("delete: %s\n", res->path);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
4509 char *path = create_local_path(dir, res->path);
412
dc74f736aea1 adds more fs abstraction
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 411
diff changeset
4510 if(sys_unlink(path)) {
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4511 if(errno != ENOENT) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4512 perror("unlink");
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4513 num_err++;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4514 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4515 } else {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4516 num_del++;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4517 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4518 free(path);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4519 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4520 ucx_map_free_content(db->conflict, (ucx_destructor)local_resource_free);
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4521 ucx_map_clear(db->conflict);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4522
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4523 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
4524 if(store_db(db, dir->database, dir->db_settings)) {
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4525 fprintf(stderr, "Cannot store sync db\n");
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4526 fprintf(stderr, "Abort\n");
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4527 ret = -1;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4528 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4529
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4530 // cleanup
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4531 destroy_db(db);
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4532
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4533 // Report
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4534 if(ret == 0) {
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4535 char *str_delete = num_del == 1 ? "file" : "files";
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4536 char *str_error = num_err == 1 ? "error" : "errors";
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4537 printf("Result: %d conflict %s deleted, %d %s\n",
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4538 num_del, str_delete,
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4539 num_err, str_error);
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4540 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4541
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4542 return ret;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4543 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4544
563
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4545 int cmd_list_conflicts(CmdArgs *a) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4546 if(a->argc != 1) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4547 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4548 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4549 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4550
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4551 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4552 if(!dir) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4553 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4554 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4555 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4556 if(scfg_check_dir(dir)) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4557 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4558 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4559
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4560 SyncDatabase *db = load_db(dir->database);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4561 if(!db) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4562 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4563 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4564 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4565
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4566 remove_deleted_conflicts(dir, db);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4567
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4568 // get all conflict sources
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4569 UcxMapIterator i = ucx_map_iterator(db->conflict);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4570 LocalResource *res;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4571 UcxList* conflict_sources = NULL;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4572 UCX_MAP_FOREACH(key, res, i) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4573 conflict_sources = ucx_list_append(conflict_sources, res->conflict_source);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4574 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4575
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4576 // print unique conflict sources
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4577 conflict_sources = ucx_list_sort(conflict_sources, ucx_cmp_str, NULL);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4578 UCX_FOREACH(elem, conflict_sources) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4579 char* path = elem->data;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4580 if(cmd_getoption(a, "verbose")) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4581 int confl_count = 1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4582 while(elem->next && !strcmp(elem->next->data, path)) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4583 elem = elem->next;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4584 ++confl_count;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4585 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4586 printf("%s (%d)\n", path, confl_count);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4587 } else {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4588 printf("%s\n", path);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4589 while(elem->next && !strcmp(elem->next->data, path)) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4590 elem = elem->next;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4591 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4592 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4593 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4594
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4595 // cleanup
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4596 destroy_db(db);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4597
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4598 return 0;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4599 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4600
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4601
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4602 // TODO: remove code dup (main.c ls_size_str)
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4603 static char* size_str(uint64_t size) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4604 char *str = malloc(16);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4605
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4606 if(size < 0x400) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4607 snprintf(str, 16, "%" PRIu64 " bytes", size);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4608 } else if(size < 0x100000) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4609 float s = (float)size/0x400;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4610 int diff = (s*100 - (int)s*100);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4611 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4612 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4613 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4614 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4615 if(size < 0x2800 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4616 // size < 10 KiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4617 snprintf(str, 16, "%.1f KiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4618 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4619 snprintf(str, 16, "%.0f KiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4620 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4621 } else if(size < 0x40000000) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4622 float s = (float)size/0x100000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4623 int diff = (s*100 - (int)s*100);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4624 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4625 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4626 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4627 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4628 if(size < 0xa00000 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4629 // size < 10 MiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4630 snprintf(str, 16, "%.1f MiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4631 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4632 size /= 0x100000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4633 snprintf(str, 16, "%.0f MiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4634 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4635 } else if(size < 0x1000000000ULL) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4636 float s = (float)size/0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4637 int diff = (s*100 - (int)s*100);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4638 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4639 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4640 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4641 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4642 if(size < 0x280000000 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4643 // size < 10 GiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4644 snprintf(str, 16, "%.1f GiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4645 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4646 size /= 0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4647 snprintf(str, 16, "%.0f GiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4648 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4649 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4650 size /= 1024;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4651 float s = (float)size/0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4652 int diff = (s*100 - (int)s*100);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4653 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4654 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4655 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4656 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4657 if(size < 0x280000000 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4658 // size < 10 TiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4659 snprintf(str, 16, "%.1f TiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4660 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4661 size /= 0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4662 snprintf(str, 16, "%.0f TiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4663 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4664 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4665 return str;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4666 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4667
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4668 void print_resource_version(DavResource *res, char *name) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4669 time_t now = res->lastmodified;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4670 struct tm *date = gmtime(&now);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4671 char str[32];
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4672 putenv("LC_TIME=C");
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4673 size_t len = strftime(str, 32, "%a, %d %b %Y %H:%M:%S GMT", date);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4674
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4675 printf("name: %s\n", name);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4676 printf("lastmodified: %s\n", str);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4677 char *server = util_url_base(res->session->base_url);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4678 char *url = util_concat_path(server, res->href);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4679 printf("url: %s\n", url);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4680 free(server);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4681 free(url);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4682 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4683
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4684 int cmd_list_versions(CmdArgs *a) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4685 if(a->argc != 1) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4686 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4687 return -1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4688 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4689
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4690 SyncFile file;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4691 int ret = 0;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4692 char *path = a->argv[0];
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4693
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4694 int err = sync_get_file(a, path, &file, TRUE);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4695 if(err) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4696 sync_print_get_file_err(path, err);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4697 return 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4698 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4699 SyncDirectory *dir = file.dir;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4700
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4701 if(!dir->versioning) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4702 fprintf(stderr, "No versioning configured for syncdir %s\n", dir->name);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4703 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4704
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4705 Repository *repo = get_repository(sstr(dir->repository));
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4706 if(!repo) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4707 fprintf(stderr, "Unknown repository %s\n", dir->repository);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4708 return -1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4709 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4710
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4711 SyncDatabase *db = load_db(dir->database);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4712 if(!db) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4713 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4714 return -1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4715 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4716 remove_deleted_conflicts(dir, db);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4717
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4718 DavSession *sn = create_session(ctx, repo, dir->collection);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4719 ucx_mempool_reg_destr(sn->mp, db, (ucx_destructor)destroy_db);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4720 if (cmd_getoption(a, "verbose")) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4721 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4722 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4723 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4724
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4725 DavResource *res = dav_resource_new(sn, file.path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4726 if(dir->versioning->type == VERSIONING_SIMPLE) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4727 do {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4728 DavPropName p;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4729 p.ns = DAV_NS;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4730 p.name = VERSION_PATH_PROPERTY;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4731 if(dav_load_prop(res, &p, 1)) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4732 print_resource_error(sn, file.path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4733 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4734 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4735 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4736 char *vcol_href = dav_get_string_property_ns(res, DAV_NS, VERSION_PATH_PROPERTY);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4737 if(!vcol_href) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4738 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4739 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4740 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4741
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4742 DavResource *vcol = dav_resource_new_href(sn, vcol_href);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4743 if(!vcol) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4744 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4745 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4746 }
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4747
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4748 if(dav_load_prop(vcol, NULL, 0)) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4749 print_resource_error(sn, vcol->path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4750 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4751 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4752 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4753
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4754 DavResource *child = vcol->children;
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4755 UcxList *children = NULL;
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4756 while(child) {
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4757 children = ucx_list_append(children, child);
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4758 child = child->next;
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4759 }
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4760 children = ucx_list_sort(children, ucx_cmp_str, NULL);
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4761
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4762 DavBool first = 1;
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4763 UCX_FOREACH(elm, children) {
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4764 DavResource *c = elm->data;
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4765 if(!first) {
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4766 putchar('\n');
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4767 }
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4768 print_resource_version(c, c->name);
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4769 first = 0;
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4770 }
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4771 ucx_list_free(children);
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4772 } while(0);
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4773 } else if(dir->versioning->type == VERSIONING_DELTAV) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4774 DavResource *versions = dav_versiontree(res, NULL);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4775 DavResource *v = versions;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4776 DavBool first = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4777 while(v) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4778 if(!first) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4779 putchar('\n');
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4780 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4781 char *vname = dav_get_string_property(v, "D:version-name");
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4782 print_resource_version(v, vname);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4783 first = 0;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4784 v = v->next;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4785 }
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4786 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4787
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4788 free(file.path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4789 dav_session_destroy(sn);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4790
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4791 return ret;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4792 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4793
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4794
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4795 int cmd_trash_info(CmdArgs *a) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4796 if(a->argc != 1) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4797 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4798 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4799 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4800
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4801 SyncDirectory *syncdir = scfg_get_dir(a->argv[0]);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4802 if(!syncdir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4803 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4804 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4805 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4806 if(scfg_check_dir(syncdir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4807 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4808 }
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4809
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4810 if(!syncdir->trash) {
205
bf756f6c3581 fixed some warnings and wrong usage of curl_easy_getinfo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 204
diff changeset
4811 printf("trash not configured for %s\n", syncdir->name);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4812 return 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4813 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4814
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4815 SYS_DIR dir = sys_opendir(syncdir->trash);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4816 if(!dir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4817 fprintf(stderr, "cannot open trash directory: %s\n", syncdir->trash);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4818 perror("opendir");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4819 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4820 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4821
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4822 uint64_t trashsize = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4823 int count = 0;
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4824 SysDirEnt *ent;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4825 while((ent = sys_readdir(dir)) != NULL) {
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4826 if(!strcmp(ent->name, ".") || !strcmp(ent->name, "..")) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4827 continue;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4828 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4829
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4830 char *path = util_concat_path(syncdir->trash, ent->name);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4831
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4832 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4833 if(sys_stat(path, &s)) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4834 perror("stat");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4835 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4836 trashsize += s.st_size;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4837 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4838 count++;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4839
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4840 free(path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4841 }
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4842 sys_closedir(dir);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4843
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4844 printf("path: %s\n", syncdir->trash);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4845 printf("%d %s\n", count, count == 1 ? "file" : "files");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4846 char *sizestr = size_str(trashsize);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4847 printf("%s\n", sizestr);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4848 free(sizestr);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4849
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4850 return 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4851 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4852
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4853
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4854 int cmd_empty_trash(CmdArgs *a) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4855 if(a->argc != 1) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4856 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4857 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4858 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4859
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4860 SyncDirectory *syncdir = scfg_get_dir(a->argv[0]);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4861 if(!syncdir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4862 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4863 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4864 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4865
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4866 if(!syncdir->trash) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4867 fprintf(stderr, "trash not configured for %s\n", syncdir->name);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4868 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4869 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4870
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4871 SYS_DIR dir = sys_opendir(syncdir->trash);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4872 if(!dir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4873 fprintf(stderr, "cannot open trash directory: %s\n", syncdir->trash);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4874 perror("opendir");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4875 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4876 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4877
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4878 SysDirEnt *ent;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4879 while((ent = sys_readdir(dir)) != NULL) {
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4880 if(!strcmp(ent->name, ".") || !strcmp(ent->name, "..")) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4881 continue;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4882 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4883
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4884 char *path = util_concat_path(syncdir->trash, ent->name);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4885 printf("delete: %s\n", path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4886
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4887 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4888 if(sys_stat(path, &s)) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4889 perror("stat");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4890 free(path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4891 continue;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4892 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4893 if(S_ISDIR(s.st_mode)) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4894 if(rmdir(path)) {
274
5577d3eae04c dav-sync command documentation complete
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 272
diff changeset
4895 perror("rmdir");
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4896 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4897 } else {
412
dc74f736aea1 adds more fs abstraction
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 411
diff changeset
4898 if(sys_unlink(path)) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4899 perror("unlink");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4900 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4901 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4902
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4903 free(path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4904 }
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4905 sys_closedir(dir);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4906
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4907 return 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4908 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4909
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4910 #define CMD_TAG_ADD 0
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4911 #define CMD_TAG_REMOVE 1
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
4912 #define CMD_TAG_SET 2
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4913 #define CMD_TAG_LIST 3
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4914 int cmd_add_tag(CmdArgs *args) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4915 if(args->argc != 2) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4916 fprintf(stderr, "Too %s arguments\n", args->argc <= 1 ? "few" : "many");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4917 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4918 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4919 return cmd_tagop(args, CMD_TAG_ADD);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4920 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4921
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4922 int cmd_remove_tag(CmdArgs *args) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4923 if(args->argc != 2) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4924 fprintf(stderr, "Too %s arguments\n", args->argc <= 1 ? "few" : "many");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4925 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4926 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4927 return cmd_tagop(args, CMD_TAG_REMOVE);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4928 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4929
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
4930 int cmd_set_tags(CmdArgs *args) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4931 if(args->argc < 1 || args->argc > 2) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4932 fprintf(stderr, "Too %s arguments\n", args->argc < 1 ? "few" : "many");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4933 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4934 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4935 return cmd_tagop(args, CMD_TAG_SET);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4936 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4937
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4938 int cmd_list_tags(CmdArgs *args) {
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4939 if(args->argc != 1) {
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4940 fprintf(stderr, "Too %s arguments\n", args->argc <= 1 ? "few" : "many");
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4941 return -1;
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4942 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4943 return cmd_tagop(args, CMD_TAG_LIST);
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4944 }
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4945
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4946 int cmd_tagop(CmdArgs *args, int cmd) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4947 SyncFile file;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4948 int ret = 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4949 char *path = args->argv[0];
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4950
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4951 int err = sync_get_file(args, path, &file, TRUE);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4952 if(err) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4953 sync_print_get_file_err(path, err);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4954 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4955 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4956
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4957 if(!file.dir->tagconfig) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4958 fprintf(stderr, "Tags are not supported for this sync directory\n");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4959 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4960 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4961
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4962 SyncDatabase *db = load_db(file.dir->database);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4963 if(!db) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4964 fprintf(stderr, "Cannot load sync directory database\n");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4965 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4966 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4967
669
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
4968 LocalResource *newres = NULL;
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4969 LocalResource *localres = ucx_map_cstr_get(db->resources, file.path);
669
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
4970 if(!localres) {
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
4971 newres = calloc(1, sizeof(LocalResource));
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
4972 newres->path = strdup(file.path);
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
4973 localres = newres;
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
4974 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4975 UcxList *tags = NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4976 DavBool store_tags = FALSE;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4977
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
4978 if(cmd != CMD_TAG_SET) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4979 char *tag = args->argv[1];
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4980 char *tagcolor = NULL; // TODO: get color
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4981
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4982 tags = sync_get_file_tags(file.dir, localres, NULL, NULL);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4983 UcxList *x = NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4984 UCX_FOREACH(elm, tags) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4985 DavTag *t = elm->data;
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4986 if(cmd == CMD_TAG_LIST) {
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4987 printf("%s\n", t->name);
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4988 } else if(!strcmp(t->name, tag)) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4989 x = elm;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4990 break;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4991 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4992 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4993
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4994 if(cmd == CMD_TAG_ADD) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4995 if(!x) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4996 DavTag *newtag = malloc(sizeof(DavTag));
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4997 newtag->name = tag;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4998 newtag->color = tagcolor;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4999 tags = ucx_list_append(tags, newtag);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5000 store_tags = TRUE;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5001 }
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
5002 } else if(cmd == CMD_TAG_REMOVE) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5003 if(tags) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5004 tags = ucx_list_remove(tags, x);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5005 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5006 store_tags = TRUE;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5007 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5008 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5009 if(args->argc == 2) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5010 char *tags_str = args->argv[1];
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5011 tags = parse_csv_taglist(tags_str, strlen(tags_str));
378
d64ecd8d6969 fixes dav-sync update-tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 377
diff changeset
5012 store_tags = TRUE;
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5013 // TODO: read from stdin if tags_str is "-"
381
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
5014 } else if (args->argc == 1) {
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
5015 store_tags = TRUE;
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
5016 } else {
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
5017 fprintf(stderr, "Too many arguments\n");
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
5018 ret = -1;
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5019 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5020 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5021
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5022 if(store_tags) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5023 if(sync_store_tags_local(file.dir, NULL, path, tags)) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5024 fprintf(stderr, "Cannot store tags\n");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5025 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5026 if(localres) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5027 localres->tags_updated = TRUE;
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
5028 if(!tags) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
5029 if(localres->tags_hash) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
5030 free(localres->tags_hash);
629
bc2cdbf5e68f handle symlinks according to config
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 626
diff changeset
5031 localres->tags_hash = NULL;
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
5032 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
5033 localres->tags_hash = NULL;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
5034 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5035 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5036 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5037
669
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
5038 if(newres) {
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
5039 local_resource_free(newres);
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
5040 }
152101df336d fix dav-sync add-tag in case a file is not in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 668
diff changeset
5041
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5042 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
5043 if(store_db(db, file.dir->database, file.dir->db_settings)) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5044 fprintf(stderr, "Cannot store sync db\n");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5045 ret = -2;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5046 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5047
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5048 free(file.path);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5049 return ret;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5050 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5051
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5052 int isfileindir(SyncDirectory *dir, const char *path, SyncFile *f) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5053 char *fullpath;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5054 if(path[0] != '/') {
386
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5055 size_t wdlen = 256;
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5056 char *wd = malloc(wdlen);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5057 while(!getcwd(wd, wdlen)) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5058 if(errno == ERANGE) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5059 wdlen *= 2;
386
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5060 char *newbuf = realloc(wd, wdlen);
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5061 if (newbuf) {
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5062 wd = newbuf;
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5063 } else {
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5064 free(wd);
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5065 return 0;
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5066 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5067 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5068 free(wd);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5069 return 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5070 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5071 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5072
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5073 fullpath = util_concat_path(wd, path);
386
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
5074 free(wd);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5075 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5076 fullpath = strdup(path);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5077 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5078
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5079 // TODO: normalize path
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5080 DavBool not_in_dir = 0;
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5081
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5082 scstr_t fp = scstr(fullpath);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5083 scstr_t dp = scstr(dir->path);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5084 if(fp.length == dp.length) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5085 if(sstrcmp(fp, dp)) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5086 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5087 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5088 } else if(fp.length < dp.length) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5089 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5090 } else {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5091 if(!sstrprefix(fp, dp)) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5092 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5093 } else {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5094 if(dp.ptr[dp.length-1] == '/') {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5095 dp.length--;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5096 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5097 if(fp.ptr[dp.length] != '/') {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5098 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5099 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5100 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5101 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5102
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5103 if(not_in_dir) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5104 free(fullpath);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5105 return 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5106 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5107
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5108 // TODO: check filter
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5109
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5110 f->dir = dir;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5111 f->path = util_concat_path("/", fullpath + strlen(dir->path));
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5112
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5113 free(fullpath);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5114 return 1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5115 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5116
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5117 int sync_get_file(CmdArgs *args, const char *path, SyncFile *f, DavBool dostat) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5118 if(dostat) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5119 SYS_STAT s;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5120 if(sys_stat(path, &s)) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5121 switch(errno) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5122 case EACCES: return 2;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5123 case ENOENT: return 1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5124 default: return 3;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5125 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5126 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5127 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5128
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5129 char *sdir = cmd_getoption(args, "syncdir");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5130
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5131 if(sdir) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5132 SyncDirectory *dir = scfg_get_dir(sdir);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5133 if(!dir) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5134 return 6;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5135 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5136 if(!isfileindir(dir, path, f)) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5137 return 4;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5138 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5139 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5140 SyncDirectory *target = NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5141
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5142 UcxMapIterator i = scfg_directory_iterator();
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5143 UcxKey k;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5144 SyncDirectory *dir;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5145 UCX_MAP_FOREACH(key, dir, i) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5146 if(isfileindir(dir, path, f)) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5147 if(target) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5148 return 5;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5149 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5150 target = dir;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5151 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5152 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5153 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5154
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5155 if(!target) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5156 return 4;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5157 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5158 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5159
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5160 return 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5161 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5162
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5163 void sync_print_get_file_err(const char *path, int err) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5164 switch(err) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5165 case 1: fprintf(stderr, "File %s: not found\n", path); break;
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
5166 case 2: fprintf(stderr, "File %s: permission denied\n", path); break;
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5167 case 3: fprintf(stderr, "File %s: stat failed: %s\n", path, strerror(errno)); break;
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5168 case 4: fprintf(stderr, "File %s is not in any syncdir\n", path); break;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
5169 case 5: fprintf(stderr, "File %s is in multiple syncdirs\n", path); break;
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5170 case 6: fprintf(stderr, "Syncdir not found\n"); break;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5171 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5172 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
5173
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
5174
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5175 int cmd_add_directory(CmdArgs *args) {
294
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
5176 if(!get_repositories()) {
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
5177 fprintf(stderr, "No repositories available. Run 'dav add-repository' first.\n");
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
5178 fprintf(stderr, "Abort\n");
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
5179 return -1;
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
5180 }
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
5181
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5182 printf("Each sync directory must have an unique name.\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5183 char *name = assistant_getcfg("name");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5184 if(!name) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5185 fprintf(stderr, "Abort\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5186 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5187 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5188 if(scfg_get_dir(name)) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5189 fprintf(stderr, "Directory %s already exists.\nAbort\n", name);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5190 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5191 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5192
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5193 printf("Enter local directory path.\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5194 char *path = assistant_getcfg("path");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5195 if(!path) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5196 fprintf(stderr, "Abort\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5197 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5198 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5199
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5200 printf("Specify webdav repository.\n");
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5201 UcxList *repos = get_repositories();
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5202 int i = 0;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5203 UCX_FOREACH(elm, repos) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5204 Repository *r = elm->data;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5205 printf("%d) %s\n", i, r->name);
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5206 i++;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5207 }
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5208 char *repository = assistant_getcfg("repository");
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5209 char *reponame = NULL;
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5210 if(!repository) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5211 fprintf(stderr, "Abort\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5212 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5213 }
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5214 int64_t reponum = 0;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5215 if(util_strtoint(repository, &reponum)) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5216 if(reponum < 0) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5217 fprintf(stderr, "Wrong input.\nAbort\n");
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5218 return -1;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5219 }
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5220 UcxList *elm = ucx_list_get(repos, reponum);
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5221 if(elm) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5222 Repository *r = elm->data;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5223 reponame = r->name;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5224 } else {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5225 fprintf(stderr, "Wrong input.\nAbort\n");
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5226 return -1;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5227 }
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5228 } else {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5229 if(get_repository(sstr(repository))) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5230 reponame = repository;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5231 } else {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5232 fprintf(stderr, "Repository %s doesn't exist.\nAbort\n", repository);
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5233 return -1;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5234 }
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5235 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5236
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5237 printf("Enter collection relative to the repository base url.\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5238 char *collection = assistant_getdefcfg("collection", "/");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5239
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5240 char *db = generate_db_name(name);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5241
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5242 SyncDirectory dir;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5243 memset(&dir, 0, sizeof(SyncDirectory));
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5244 dir.name = name;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5245 dir.path = path;
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
5246 dir.repository = reponame;
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5247 dir.collection = collection;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5248 dir.trash = ".trash";
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5249 dir.database = db;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5250
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5251 int ret = 0;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5252 if(add_directory(&dir)) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5253 fprintf(stderr, "Cannot write sync.xml\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5254 ret = -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5255 } else {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5256 printf("\nAdded directory: %s (%s)\n", name, path);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5257 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5258
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5259 free(name);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5260 free(path);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5261 free(repository);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5262 free(collection);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5263 free(db);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5264
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5265 return ret;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
5266 }
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
5267
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5268 int cmd_list_dirs() {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5269 UcxMapIterator iter = scfg_directory_iterator();
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5270 SyncDirectory *dir;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5271 UCX_MAP_FOREACH(key, dir, iter) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5272 printf("%s\n", dir->name);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5273 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5274 return 0;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5275 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5276
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
5277 int cmd_check_repositories() {
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5278 int ret = EXIT_SUCCESS;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5279
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5280 UcxList *reponames = NULL;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5281 {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5282 UcxMapIterator iter = scfg_directory_iterator();
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5283 SyncDirectory *dir;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5284 UCX_MAP_FOREACH(key, dir, iter) {
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 504
diff changeset
5285 reponames = ucx_list_append(reponames, dir->repository);
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5286 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5287 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5288
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5289 UCX_FOREACH(listelem, reponames) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5290 char *reponame = listelem->data;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5291 printf("Checking %s... ", reponame);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5292 Repository* repo = get_repository(sstr(reponame));
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5293 if (!repo) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5294 printf(" not found in config.xml!\n");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5295 ret = EXIT_FAILURE;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5296 } else {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5297 DavSession *sn = create_session(ctx, repo, repo->url);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5298 if (sn) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5299 DavResource *res = dav_query(sn,
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5300 "select - from / with depth = 0");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5301 if (res) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5302 printf("OK.\n");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5303 dav_resource_free(res);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5304 } else {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5305 printf("unavailable!\n");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5306 ret = EXIT_FAILURE;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5307 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5308 dav_session_destroy(sn);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5309 } else {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5310 printf("cannot create session!\n");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5311 ret = EXIT_FAILURE;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5312 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5313 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5314 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5315
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5316 ucx_list_free(reponames);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5317
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
5318 return ret;
252
6b8e287269fc improves config error reporting and adds check (check-config) command + dav-sync no longer aborts on missing sync.xml
Mike Becker <universe@uap-core.de>
parents: 244
diff changeset
5319 }
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5320
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5321 char* create_locktoken_file(const char *syncdirname, const char *locktoken) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5322 sstr_t fname = ucx_sprintf("locktoken-%s.txt", syncdirname);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5323 char *path = config_file_path(fname.ptr);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5324 free(fname.ptr);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5325
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
5326 FILE *file = sys_fopen(path, "w");
313
d721250984d0 fixes possible UAF for locktocken paths, if file could not be opened
Mike Becker <universe@uap-core.de>
parents: 302
diff changeset
5327 if(file) {
d721250984d0 fixes possible UAF for locktocken paths, if file could not be opened
Mike Becker <universe@uap-core.de>
parents: 302
diff changeset
5328 fprintf(file, "%s\n", locktoken);
d721250984d0 fixes possible UAF for locktocken paths, if file could not be opened
Mike Becker <universe@uap-core.de>
parents: 302
diff changeset
5329 fclose(file);
d721250984d0 fixes possible UAF for locktocken paths, if file could not be opened
Mike Becker <universe@uap-core.de>
parents: 302
diff changeset
5330 return path;
d721250984d0 fixes possible UAF for locktocken paths, if file could not be opened
Mike Becker <universe@uap-core.de>
parents: 302
diff changeset
5331 } else {
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5332 perror("Cannot create locktoken file");
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5333 free(path);
313
d721250984d0 fixes possible UAF for locktocken paths, if file could not be opened
Mike Becker <universe@uap-core.de>
parents: 302
diff changeset
5334 return NULL;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5335 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5336 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
5337
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5338 char* sync_get_content_hash(DavResource *res) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5339 uint32_t flags = res->session->flags;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5340 if((flags & DAV_SESSION_ENCRYPT_CONTENT) == DAV_SESSION_ENCRYPT_CONTENT) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5341 char *enc_hash = dav_get_string_property_ns(res, DAV_NS, "crypto-hash");
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5342 char *keyname = dav_get_string_property_ns(res, DAV_NS, "crypto-key");
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5343 if(enc_hash && keyname) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5344 DavKey *key = dav_context_get_key(res->session->context, keyname);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5345 if(!key) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5346 return NULL;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5347 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5348
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5349 size_t len = 0;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5350 char *dec_hash = aes_decrypt(enc_hash, &len, key);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5351 if(!dec_hash) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5352 return NULL;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5353 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5354
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5355 char *hex_hash = util_hexstr((unsigned char*)dec_hash, len);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5356 free(dec_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5357 return hex_hash;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5358 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5359 } else {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5360 return dav_get_string_property_ns(res, DAV_NS, "content-hash");
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5361 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5362 return NULL;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5363 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5364
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
5365 void sync_set_content_hash(DavResource *res, const unsigned char *hashdata) {
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5366 uint32_t flags = res->session->flags;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5367 if((flags & DAV_SESSION_ENCRYPT_CONTENT) == DAV_SESSION_ENCRYPT_CONTENT) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5368 if(res->session->key) {
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
5369 char *enc_hash = aes_encrypt((const char*)hashdata, DAV_SHA256_DIGEST_LENGTH, res->session->key);
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5370 if(enc_hash) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5371 dav_set_string_property_ns(res, DAV_NS, "crypto-hash", enc_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5372 free(enc_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5373 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5374 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5375 } else {
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
5376 char *hex_hash = util_hexstr(hashdata, DAV_SHA256_DIGEST_LENGTH);
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5377 dav_set_string_property_ns(res, DAV_NS, "content-hash", hex_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5378 free(hex_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5379 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5380 }

mercurial