dav/sync.c

Fri, 02 Aug 2019 22:04:00 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 02 Aug 2019 22:04:00 +0200
changeset 611
a7c48e0dca88
parent 608
3e4c0285a868
child 613
f6072141f5ee
permissions
-rw-r--r--

implement links on Windows (shelllink)

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
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
302 static int res_matches_filter(SyncDirectory *dir, char *res_path) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
303 // trash filter
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
304 if (dir->trash) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
305 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
306 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
307 free(rpath.ptr);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
308 return 1;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
309 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
310 free(rpath.ptr);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
311 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
312
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
313 // versioning filter
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
314 if (dir->versioning) {
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
315 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
316 return 1;
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
317 }
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
318 }
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
319
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
320 // include/exclude filter
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
321 UCX_FOREACH(inc, dir->include) {
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
322 regex_t* pattern = (regex_t*) inc->data;
61
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
323 if (regexec(pattern, res_path, 0, NULL, 0) == 0) {
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
324 UCX_FOREACH(exc, dir->exclude) {
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
325 regex_t* pattern = (regex_t*) exc->data;
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
326 if (regexec(pattern, res_path, 0, NULL, 0) == 0) {
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
327 return 1;
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
328 }
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
329 }
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
330 return 0;
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
331 }
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
332 }
61
e9b102d5a6f6 fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents: 58
diff changeset
333 return 1;
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
334 }
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
335
389
fe855ce911f9 introduces SyncTagFilter type which for now implements the old tag list filter
Mike Becker <universe@uap-core.de>
parents: 386
diff changeset
336 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
337 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
338 return 1;
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
339 }
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
340 // NOTE: currently not implementable
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
341 //int scope = res->iscollection ?
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
342 // DAV_SYNC_TAGFILTER_SCOPE_COLLECTION
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
343 // : DAV_SYNC_TAGFILTER_SCOPE_RESOURCE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
344 //if((tagfilter->scope & scope) != scope) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
345 // return 1;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
346 //}
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
347 if(res->iscollection) {
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
348 return 1;
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
349 }
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
350
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
351 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
352 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
353
397
ddda42712f39 fixes tag filter evaluation not respecting mode for subfilter combination
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
354 int ret = matches_tagfilter(res_tags, tagfilter);
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 389
diff changeset
355
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 389
diff changeset
356 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
357 ucx_list_free(res_tags);
390
26998dc980f9 adds tag filter evaluation functions
Mike Becker <universe@uap-core.de>
parents: 389
diff changeset
358
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
359 return ret;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
360 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
361
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
362 static int localres_matches_tags(
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
363 SyncDirectory *dir,
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
364 LocalResource *res,
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
365 SyncTagFilter *tagfilter)
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
366 {
415
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
367 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
368 return 1;
6e1861e8262c check tagfilter scope after checking tagfilter existence
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 414
diff changeset
369 }
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
370 //int scope = res->isdirectory ?
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
371 // DAV_SYNC_TAGFILTER_SCOPE_COLLECTION
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
372 // : DAV_SYNC_TAGFILTER_SCOPE_RESOURCE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
373 //if((tagfilter->scope & scope) != scope) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
374 // return 1;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
375 //}
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
376 if(res->isdirectory) {
414
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
377 return 1;
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
378 }
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
379
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
380 DavBool changed = 0;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
381 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
382
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
383 int ret = matches_tagfilter(res_tags, tagfilter);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
384 UCX_FOREACH(elm, res_tags) {
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
385 DavTag *t = elm->data;
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
386 free_dav_tag(t);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
387 }
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
388 ucx_list_free(res_tags);
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
389 return ret;
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
390 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
391
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
392 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
393 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
394 char *url = repo->url;
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
395 DavBool find_collection = TRUE;
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
396 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
397 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
398 find_collection = FALSE;
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
399 }
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
400 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
401 // 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
402 // 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
403 // the base url
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
404 find_collection = FALSE;
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
405 }
73
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
406 DavSession *sn = dav_session_new_auth(
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
407 ctx,
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
408 url,
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
409 repo->user,
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
410 repo->password);
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
411 if(url != repo->url) {
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
412 free(url);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
413 }
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
414 sn->flags = flags;
73
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
415 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
416 curl_easy_setopt(sn->handle, CURLOPT_HTTPAUTH, repo->authmethods);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
417 curl_easy_setopt(sn->handle, CURLOPT_SSLVERSION, repo->ssl_version);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
418 if(repo->cert) {
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
419 curl_easy_setopt(sn->handle, CURLOPT_CAPATH, repo->cert);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
420 }
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
421 if(!repo->verification) {
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
422 curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYPEER, 0);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
423 curl_easy_setopt(sn->handle, CURLOPT_SSL_VERIFYHOST, 0);
f448fc8c9191 enabled cert verification
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 198
diff changeset
424 }
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
425
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
426 if(find_collection) {
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
427 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
428 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
429 // 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
430 // 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
431 // 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
432 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
433 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
434 free(newurl);
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
435 }
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
436
73
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
437 return sn;
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
438 }
41e88442ad4e ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 72
diff changeset
439
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
440 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
441 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
442 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
443 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
444 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
445 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
446 }
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_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
448 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
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_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
452 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
453 }
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 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
455 }
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
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
457 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
458 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
459 if(local) {
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
460 local->keep = TRUE;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
461 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
462
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
463 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
464
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
465 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
466 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
467 while(stack) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
468 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
469 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
470
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
471 while(res) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
472 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
473
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
474 if(res->children) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
475 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
476 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
477 res = res->next;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
478 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
479 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
480 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
481
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
482 int cmd_pull(CmdArgs *a) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
483 if(a->argc != 1) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
484 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
485 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
486 }
392
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
487 // 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
488 SyncTagFilter* tagfilter = parse_tagfilter_string(
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
489 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
490 if (!tagfilter) {
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
491 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
492 return -1;
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
493 }
395
b491d207ee16 fixes whitespace handling and error detection for basic tag filters
Mike Becker <universe@uap-core.de>
parents: 394
diff changeset
494 // 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
495 // 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
496
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
497 SyncDirectory *dir = scfg_get_dir(a->argv[0]);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
498 if(!dir) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
499 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]);
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 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
502 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
503 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
504 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
505
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
506 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
507 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
508 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
509 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
510 }
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
511
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
512 Repository *repo = get_repository(sstr(dir->repository));
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
513 if(!repo) {
495
52cbd310b881 fixes 'Unkown repository' error message in dav-sync
Mike Becker <universe@uap-core.de>
parents: 493
diff changeset
514 fprintf(stderr, "Unknown repository %s\n", dir->repository);
46
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 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
517
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
518 SyncDatabase *db = load_db(dir->database);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
519 if(!db) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
520 fprintf(stderr, "Cannot load database file: %s\n", dir->database);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
521 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
522 }
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
523 remove_deleted_conflicts(dir, db);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
524
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
525 UcxMap *hashes = NULL;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
526 if(dir->hashing) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
527 hashes = create_hash_index(db);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
528 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
529
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
530 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
531 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
532 if (cmd_getoption(a, "verbose")) {
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
533 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
534 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
535 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
536
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
537 // lock repository
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
538 char *locktokenfile = NULL;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
539 DavBool locked = FALSE;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
540 DavResource *root = dav_resource_new(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
541 root->iscollection = TRUE;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
542 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
543 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
544 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
545 dav_session_destroy(sn);
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
546 fprintf(stderr, "Abort\n");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
547 return -1;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
548 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
549 DavLock *lock = dav_get_lock(sn, "/");
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
550 if(lock) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
551 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
552 }
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
553 locked = TRUE;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
554 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
555 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
556
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
557 int ret = 0;
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
558 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
559 if(!ls) {
191
0e45b04236a7 more specific error messages in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 190
diff changeset
560 print_resource_error(sn, "/");
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
561 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
562 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
563 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
564 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
565 locked = FALSE;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
566 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
567 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
568
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
569 fprintf(stderr, "Abort\n");
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
570
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
571 dav_session_destroy(sn);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
572 // TODO: free
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
573 return -1;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
574 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
575 if(!ls->iscollection) {
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
576 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
577 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
578 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
579 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
580 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
581 locked = FALSE;
221
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 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
584 // TODO: free
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
585 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
586
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
587 if(!locked && locktokenfile) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
588 remove(locktokenfile);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
589 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
590
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
591 return -1;
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
592 }
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
593
402
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
594 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
595
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
596 int sync_success = 0;
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
597 int sync_delete = 0;
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
598 int sync_error = 0;
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
599 int sync_conflict = 0;
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
600
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
601 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
602 UcxList *res_new = NULL;
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
603 UcxList *res_moved = NULL; // type: MovedFile
599
508cbc4d30ea fix res_link initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 585
diff changeset
604 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
605 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
606 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
607 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
608 UcxList *res_broken = NULL;
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
609 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
610
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
611 //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
612 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
613
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
614 UcxList *stack = ucx_list_prepend(NULL, ls->children);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
615 while(stack) {
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
616 DavResource *res = stack->data;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
617 stack = ucx_list_remove(stack, stack);
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
618
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
619 while(res) {
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
620 DavBool res_filtered = FALSE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
621 if (res_matches_filter(dir, res->path)) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
622 res_filtered = TRUE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
623 } else {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
624 UCX_FOREACH(elm, dir->tagfilter) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
625 SyncTagFilter *tf = elm->data;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
626 if(!res_matches_tags(res, tf)) {
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
627 res_filtered = TRUE;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
628 break;
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
629 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
630 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
631 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
632 if(res_filtered) {
402
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
633 // 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
634 localres_keep(db, res->path);
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
635 res = res->next;
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
636 continue;
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
637 }
402
babdf40dd22c dav-sync pull applies config tag filter now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 400
diff changeset
638
392
4853fbad5014 adds error message for invalid tag filter syntax
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
639 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
640 if(!remove_file) {
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
641 localres_keep(db, res->path);
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
642 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
643 res = res->next;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
644 continue;
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
645 }
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
646
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
647 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
648 if(status && !strcmp(status, "broken")) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
649 res = res->next;
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
650 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
651 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
652 continue;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
653 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
654
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
655 // 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
656 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
657 switch(change) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
658 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
659 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
660 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
661 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
662 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
663 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
664 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
665 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
666 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
667 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
668 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
669 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
670 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
671 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
672 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
673 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
674 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
675 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
676 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
677 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
678 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
679 }
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
680 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
681 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
682 break;
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
683 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
684 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
685
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
686 // 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
687 // 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
688 // on the server
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
689 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
690
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
691 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
692 stack = ucx_list_prepend(stack, res->children);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
693 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
694 res = res->next;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
695 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
696 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
697
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
698 // find deleted resources
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
699 // 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
700 // 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
701 UcxMapIterator i = ucx_map_iterator(dbres);
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
702 LocalResource *local;
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
703 UCX_MAP_FOREACH(key, local, i) {
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
704 if (res_matches_filter(dir, local->path)) {
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
705 continue;
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
706 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
707 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
708 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
709 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
710 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
711 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
712 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
713 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
714
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
715 //
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
716 // 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
717 //
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
718
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
719 // 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
720 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
721 DavResource *res = elm->data;
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
722 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
723 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
724 free(res_path);
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
725 if(sys_mkdir(local_path) && errno != EEXIST) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
726 fprintf(stderr,
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
727 "Cannot create directory %s: %s",
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
728 local_path, strerror(errno));
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
729 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
730 free(local_path);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
731 // TODO: create localres for dir
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
732 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
733
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
734 // 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
735 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
736 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
737 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
738 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
739 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
740
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
741 if(dir->hashing) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
742 // check for moved/copied files
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
743 UcxList *elm = res_new;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
744 UcxList *prev = NULL;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
745 UcxList *next = NULL;
608
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
746 SYS_STAT s;
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
747 for(;elm;elm=next) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
748 DavResource *res = elm->data;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
749 prev = elm->prev;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
750 next = elm->next;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
751
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
752 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
753 continue;
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
754 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
755
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
756 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
757 if(!hash) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
758 continue;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
759 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
760
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
761 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
762 if(!local) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
763 continue;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
764 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
765
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
766 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
767 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
768 free(local_path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
769 if(staterr) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
770 // 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
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
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
774 MovedFile *mf = malloc(sizeof(MovedFile));
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
775 mf->content = local;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
776 mf->resource = res;
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
777 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
778 mf->copy = FALSE;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
779 } else {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
780 mf->copy = TRUE;
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
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
783 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
784
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
785 // remove item from res_new
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
786 if(prev) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
787 prev->next = next;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
788 } else {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
789 res_new = next;
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 if(next) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
792 next->prev = prev;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
793 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
794 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
795 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
796
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
797 // do copy/move operations
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
798 UCX_FOREACH(elm, res_moved) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
799 MovedFile *mf = elm->data;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
800 if(sync_shutdown) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
801 break;
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 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
805 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
806 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
807 sync_conflict++;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
808 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
809
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
810 // move file
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
811 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
812 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
813 sync_error++;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
814 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
815 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
816
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
817 // 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
818 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
819 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
820 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
821 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
822 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
823 if(sync_shutdown) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
824 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
825 }
302
395763c0ee69 adds SIGINT handler to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 299
diff changeset
826
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
827 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
828 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
829 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
830 sync_conflict++;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
831 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
832
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
833 // download the resource
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
834 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
835 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
836 sync_error++;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
837 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
838 }
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 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
841 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
842 if(sync_shutdown) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
843 break;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
844 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
845
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
846 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
847 if(local) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
848 printf("update: %s\n", res->path);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
849 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
850 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
851 free(res_path);
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
852 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
853 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
854 sync_error++;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
855 } else {
608
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
856 SYS_STAT s;
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
857 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
858 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
859 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
860 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
861 sync_success++;
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
862 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
863 free(local_path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
864 } else {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
865 // 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
866 fprintf(stderr,
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
867 "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
868 res->path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
869 }
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
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
872 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
873 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
874 LocalResource *removed_res;
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
875 UcxKey key;
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
876 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
877 if(sync_shutdown) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
878 break;
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
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
881 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
882 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
883 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
884 } 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
885 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
886 if(local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
887 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
888 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
889 sync_delete++;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
890 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
891 }
564
fb482734e429 replace list of removed resources with a map (cmd_pull)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 563
diff changeset
892 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
893
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
894 UCX_FOREACH(elm, rmdirs) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
895 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
896 if(!sync_remove_local_directory(dir, local_dir)) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
897 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
898 if(local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
899 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
900 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
901 sync_delete++;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
902 }
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
903 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
904
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
905 // unlock repository
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
906 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
907 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
908 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
909 ret = -1;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
910 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
911 locked = FALSE;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
912 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
913 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
914
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
915 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
916 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
917 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
918 ret = -2;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
919 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
920
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
921 // cleanup
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
922 dav_session_destroy(sn);
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
923
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
924 if(!locked && locktokenfile) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
925 remove(locktokenfile);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
926 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
927
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
928 // Report
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
929 if(ret != -2) {
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
930 char *str_success = sync_success == 1 ? "file" : "files";
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
931 char *str_delete = sync_delete == 1 ? "file" : "files";
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
932 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
933 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
934 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
935 sync_success, str_success,
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
936 sync_delete,str_delete,
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
937 sync_conflict, str_conflict,
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
938 sync_error, str_error);
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
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
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
941 return ret;
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
942 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
943
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
944
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
945 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
946 CmdArgs *a,
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
947 DavResource *res,
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
948 SyncDirectory *dir,
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
949 SyncDatabase *db)
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
950 {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
951 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
952 if(!etag) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
953 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
954 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
955 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
956
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
957 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
958 if(issplit) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
959 util_remove_trailing_pathseparator(res->path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
960 }
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
961
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
962 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
963 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
964
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
965 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
966 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
967
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
968 char *link = SYNC_SYMLINK(dir) ?
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
969 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
970
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
971 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
972 DavBool exists = 1;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
973 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
974 if(errno != ENOENT) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
975 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
976 free(local_path);
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
977 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
978 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
979 exists = 0;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
980 }
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
981
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
982 RemoteChangeType ret = REMOTE_NO_CHANGE;
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
983 if(res->iscollection && !issplit) {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
984 if(!exists) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
985 ret = REMOTE_CHANGE_MKDIR;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
986 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
987 } else if(local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
988 DavBool nochange = FALSE;
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
989 char *content_hash = sync_get_content_hash(res);
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
990
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
991 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
992 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
993 nochange = TRUE;
579
c80d5730c00b add check to detect changed link properties in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 578
diff changeset
994 } else if(content_hash && local->hash) {
560
a816e805e5db store origin of file conflicts
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 559
diff changeset
995 if(!strcmp(content_hash, local->hash)) {
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
996 nochange = TRUE;
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
997 }
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
998 } 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
999 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
1000 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
1001 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
1002 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1003 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
1004 // 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
1005 nochange = TRUE;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1006 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1007 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1008
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1009 if(!nochange) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1010 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
1011 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
1012 }
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1013 ret = type;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1014 }
580
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1015 } 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
1016 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
1017 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
1018 } else {
caf23cf7f96d separate link changes from normal changes and create links after downloads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 579
diff changeset
1019 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
1020 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1021 } else if(exists) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1022 ret = type;
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1023 } else {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1024 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
1025 }
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1026
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1027 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
1028 // 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
1029 if(dir->tagconfig) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
1030 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
1031 UcxList *remote_tags = NULL;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1032 if(tagsprop) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1033 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
1034 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1035 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
1036 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
1037 ret = REMOTE_CHANGE_METADATA;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1038 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1039 if(remote_hash) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1040 free(remote_hash);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1041 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1042 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
1043
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1044 if(ret == REMOTE_CHANGE_METADATA) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1045 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1046 }
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1047 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1048
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1049 // 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
1050 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
1051 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
1052 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
1053 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
1054 ret = REMOTE_CHANGE_METADATA;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1055 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1056 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1057 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1058
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1059 // check if finfo has changed
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
1060 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
1061 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
1062 FileInfo f;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1063 finfo_get_values(finfo, &f);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1064 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
1065 ret = REMOTE_CHANGE_METADATA;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1066 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1067 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1068 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1069
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1070 break;
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1071 }
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
1072
502
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1073 free(local_path);
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1074 return ret;
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1075 }
a23fedac340c fixes DavSession creation in dav-sync when using root collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 501
diff changeset
1076
608
3e4c0285a868 fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 607
diff changeset
1077 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
1078 local->last_modified = s->st_mtime;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1079 local->mode = s->st_mode & 07777;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1080 local->uid = s->st_uid;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1081 local->gid = s->st_gid;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1082 local->size = s->st_size;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1083 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1084
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1085 static UcxList* sync_download_changed_parts(
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1086 DavResource *res,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1087 LocalResource *local,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1088 FILE *out,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1089 size_t blocksize,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1090 uint64_t *blockcount,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1091 int64_t *truncate_file,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1092 int *err)
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1093 {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1094 UcxList *updates = NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1095
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1096 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
1097 fseeko(out, 0, SEEK_END);
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1098 off_t end = ftello(out);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1099
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1100 int error = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1101
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1102 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
1103
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1104 int64_t maxsize = -1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1105
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1106 DavResource *part = res->children;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1107 uint64_t i = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1108 while(part) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1109 char *res_name = part->name;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1110 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
1111 res_name++;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1112 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1113 uint64_t partnum = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1114 if(util_strtouint(res_name, &partnum)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1115 DavBool download_part = FALSE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1116 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
1117 if(partnum >= local_numparts) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1118 // new part
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1119 download_part = TRUE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1120 } else {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1121 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
1122 if(etag) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1123 if(nullstrcmp(etag, p.etag)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1124 download_part = TRUE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1125 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1126 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1127 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1128
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1129 uint64_t offset;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1130 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
1131 if(mul_err || offset >= INT64_MAX) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1132 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1133 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
1134 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1135 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1136
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1137 int64_t block_end = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1138 if(download_part) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1139 if(fseeko(out, offset, SEEK_SET)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1140 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1141 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
1142 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1143 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1144 buf->pos = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1145 buf->size = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1146 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
1147 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
1148 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1149 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1150 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1151 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
1152 perror("write");
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1153 error = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1154 break;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1155 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1156
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1157 FilePart *update = calloc(1, sizeof(FilePart));
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1158 update->block = partnum;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1159 update->etag = etag ? strdup(etag) : NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1160 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
1161 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
1162
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1163 block_end = offset+buf->size;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1164 } else {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1165 if(offset+blocksize > end) {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1166 // 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
1167 // 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
1168 block_end = end;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1169 } else {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1170 block_end = offset+blocksize;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1171 }
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
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1174 if(block_end > maxsize) {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1175 maxsize = block_end;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1176 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1177
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1178 i++;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1179 } // 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
1180 part = part->next;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1181 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1182
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1183 ucx_buffer_free(buf);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1184
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1185 if(error) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1186 *err = 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1187 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
1188 return NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1189 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1190
546
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1191 if(maxsize < end) {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1192 *truncate_file = maxsize;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1193 } else {
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1194 *truncate_file = -1;
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1195 }
33e312dd851d truncate splitted file to correct size on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 545
diff changeset
1196
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1197 *err = 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1198 *blockcount = i;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1199 return updates;
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
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1202 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
1203 FILE *in = sys_fopen(from, "rb");
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1204 if(!in) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1205 return 1;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1206 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1207 FILE *out = sys_fopen(to, "wb");
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1208 if(!out) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1209 fclose(in);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1210 return 1;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1211 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1212
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1213 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
1214 fclose(in);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1215 fclose(out);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1216
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1217 return 0;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1218 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1219
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1220 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
1221
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1222 int sync_move_resource(
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1223 CmdArgs *a,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1224 SyncDirectory *dir,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1225 DavResource *res,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1226 LocalResource *content,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1227 DavBool copy,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1228 SyncDatabase *db,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1229 int *counter)
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1230 {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1231 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
1232
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1233 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
1234 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
1235
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1236 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
1237 if(fn(old_path, new_path)) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1238 free(new_path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1239 free(old_path);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1240 return 1;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1241 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1242 (*counter)++;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1243
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1244 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
1245 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
1246
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1247 LocalResource *local = NULL;
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1248 if(copy) {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1249 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
1250 } else {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1251 // reuse previous LocalResource (content)
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1252 // 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
1253 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
1254 if(!local) {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1255 // 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
1256 local = content;
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1257 }
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1258 free(content->path);
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1259 local->path = strdup(res->path);
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1260 }
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1261 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
1262
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1263 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
1264 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
1265 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1266
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1267 if(local->etag) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1268 free(local->etag);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1269 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1270 if(local->hash) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1271 free(local->hash);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1272 }
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1273
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1274 SYS_STAT s;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1275 if(sys_stat(new_path, &s)) {
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1276 fprintf(stderr,
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1277 "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
1278 }
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 // set metadata from stat
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1281 local->etag = nullstrdup(etag);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1282 local->hash = nullstrdup(content_hash);
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1283
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1284 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
1285 local->skipped = FALSE;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1286
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1287 return 0;
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
1288 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1289
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1290 int sync_get_resource(
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1291 CmdArgs *a,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1292 SyncDirectory *dir,
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
1293 const char *path,
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1294 DavResource *res,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1295 SyncDatabase *db,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1296 int *counter)
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1297 {
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1298 char *link = SYNC_SYMLINK(dir) ?
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
1299 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
1300
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1301 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
1302
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1303 char *local_path;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1304 if(link) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1305 char *res_path = resource_local_path(res);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1306 local_path = create_local_path(dir, res_path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1307 free(res_path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1308 } else {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1309 local_path = create_local_path(dir, path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1310 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1311
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
1312 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
1313 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1314 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
1315
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1316 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
1317 uint64_t blocksize = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1318 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
1319 if(blocksize_str && !link) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1320 if(!util_strtouint(blocksize_str, &blocksize)) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1321 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
1322 return 1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1323 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1324 issplit = TRUE;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1325 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1326 UcxList *part_updates = NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1327 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
1328 char *content_hash = NULL;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1329
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1330 if(res->iscollection && !issplit) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1331 // why are we here?
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1332 return 0;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1333 }
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1334
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1335 int ret = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1336
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1337 char *tmp_path = NULL;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1338 FILE *out = NULL;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1339 if(!link) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1340 if(!issplit) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1341 tmp_path = create_tmp_download_path(local_path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1342 if(!tmp_path) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1343 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
1344 free(local_path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1345 return -1;
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1346 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1347 out = sys_fopen(tmp_path , "wb");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1348 } else {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1349 out = sys_fopen(local_path, "r+b");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1350 if(!out && errno == ENOENT) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1351 out = sys_fopen(local_path, "wb");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1352 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1353 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1354 if(!out) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1355 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
1356 free(local_path);
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1357 if(tmp_path) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1358 free(tmp_path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1359 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1360 return -1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1361 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1362 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1363
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1364 int64_t truncate_file = -1;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1365 if(!link) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1366 printf("get: %s\n", path);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1367 if(issplit) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1368 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
1369 } else {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1370 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
1371 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1372 fclose(out);
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1373 } else {
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1374 printf("link: %s -> %s\n", path, link);
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1375 if(sys_symlink(link, local_path)) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1376 perror("symlink");
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1377 ret = 1;
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1378 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1379 }
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1380
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1381 if((issplit || dir->hashing) && !link) {
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1382 if(truncate_file >= 0) {
560
a816e805e5db store origin of file conflicts
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 559
diff changeset
1383 // only true if issplit is true
548
ab46acda1066 fixes truncate path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 547
diff changeset
1384 if(truncate(local_path, truncate_file)) {
ab46acda1066 fixes truncate path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 547
diff changeset
1385 perror("truncate");
ab46acda1066 fixes truncate path
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 547
diff changeset
1386 }
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1387 }
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1388
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1389 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
1390 if(res_hash) {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1391 content_hash = res_hash;
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1392 } else {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1393 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
1394 }
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1395 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1396
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1397 if(ret == 0) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1398 (*counter)++;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1399
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1400 if(tmp_path) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1401 if(dir->trash && dir->backuppull) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1402 move_to_trash(dir, local_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1403 }
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1404 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
1405 fprintf(
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1406 stderr,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1407 "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
1408 tmp_path,
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1409 local_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1410 perror("");
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1411 free(tmp_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1412 free(local_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1413 return -1;
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1414 }
145
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1415 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1416
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1417 if(!local) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1418 // new local resource
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1419 local = calloc(1, sizeof(LocalResource));
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
1420 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
1421 ucx_map_cstr_put(db->resources, local->path, local);
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1422 }
543
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
1423
2f85df8cd35e fixes that pull downloads the history collection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 542
diff changeset
1424 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
1425 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
1426 }
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1427
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1428 if(local->etag) {
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1429 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
1430 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
1431 }
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1432 if(local->hash) {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1433 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
1434 local->hash = NULL;
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1435 }
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1436 if(local->link_target) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1437 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
1438 local->link_target = NULL;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1439 }
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1440
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1441 stat_func statfn;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1442 if(link) {
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1443 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
1444 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
1445 } else {
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1446 statfn = sys_stat;
578
bb1e60fada74 create symlinks on pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 577
diff changeset
1447 }
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1448
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1449 update_parts(local, part_updates, blockcount);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1450
581
3f9a9c80a2d2 fix that symlink config was not used in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 580
diff changeset
1451 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
1452 fprintf(stderr,
4a249c645ae4 fixes that metadata is updated after stat in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 546
diff changeset
1453 "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
1454 }
4a249c645ae4 fixes that metadata is updated after stat in sync_get_resource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 546
diff changeset
1455
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1456 // set metadata from stat
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1457 local->etag = strdup(etag);
545
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1458 if(content_hash) {
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1459 local->hash = content_hash;
268157722a0e store content hash for splitted resources in the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 544
diff changeset
1460 }
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
1461 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
1462 local->skipped = FALSE;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1463 } 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
1464 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
1465 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
1466 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1467 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1468
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1469 if(tmp_path) {
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1470 free(tmp_path);
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1471 }
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1472 free(local_path);
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1473 return ret;
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1474 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1475
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1476 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
1477 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
1478 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1479 if(sys_stat(local_path, &s)) {
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1480 free(local_path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1481 return -2;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1482 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1483
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1484 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
1485 free(local_path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1486 return -1;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1487 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1488
54
fc34bd28a22a windows fix
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 53
diff changeset
1489 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
1490 free(local_path);
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1491 return -2;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1492 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1493
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1494 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
1495 int ret = 0;
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1496 if(dir->trash) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1497 move_to_trash(dir, local_path);
412
dc74f736aea1 adds more fs abstraction
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 411
diff changeset
1498 } else if(sys_unlink(local_path)) {
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1499 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
1500 ret = -2;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1501 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1502 free(local_path);
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1503
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1504 return ret;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1505 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1506
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1507 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
1508 int ret = 0;
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1509 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
1510
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1511 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
1512 if(rmdir(local_path)) {
503
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1513 fprintf(stderr, "rmdir: %s : %s", local_path, strerror(errno));
f84e64afee61 dav-sync pull refactoring: create list of changes before sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 502
diff changeset
1514 ret = 1;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1515 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1516
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
1517 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
1518 return ret;
50
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1519 }
9c486ea25161 dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 49
diff changeset
1520
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1521 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
1522 char *local_path = create_local_path(dir, path);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1523 char *parent = util_parent_path(local_path);
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1524
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
1525 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
1526
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1527 int rev = 0;
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1528 SYS_STAT s;
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1529 int loop = 1;
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1530 do {
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1531 char *res_parent = util_parent_path(path);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1532 char *res_name = util_resource_name(path);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1533
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1534 sstr_t new_path = ucx_sprintf(
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1535 "%sorig.%d.%s",
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1536 parent,
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1537 rev,
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1538 res_name);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1539 sstr_t new_res_path = ucx_sprintf(
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1540 "%sorig.%d.%s",
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1541 res_parent,
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1542 rev,
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1543 res_name);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1544
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1545
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1546 if(sys_stat(new_path.ptr, &s)) {
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1547 if(errno == ENOENT) {
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1548 loop = 0;
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1549 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
1550 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
1551 //printf("errno: %d\n", errno);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1552 fprintf(
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1553 stderr,
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1554 "Cannot rename file %s to %s\n",
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1555 local_path,
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1556 new_path.ptr);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1557 } else {
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1558 LocalResource *conflict = calloc(1, sizeof(LocalResource));
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1559 conflict->path = strdup(new_res_path.ptr);
560
a816e805e5db store origin of file conflicts
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 559
diff changeset
1560 conflict->conflict_source = strdup(path);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1561 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
1562 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1563 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1564 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1565 rev++;
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1566 free(res_parent);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1567 free(new_path.ptr);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1568 free(new_res_path.ptr);
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1569
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1570 } while(loop);
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1571 free(parent);
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1572 free(local_path);
52
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1573 }
91517b874a86 added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 51
diff changeset
1574
145
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1575 char* create_tmp_download_path(char *path) {
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1576 char *new_path = NULL;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1577 char *parent = util_parent_path(path);
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1578 for (int i=0;;i++) {
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1579 sstr_t np = ucx_asprintf(
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1580 ucx_default_allocator(),
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1581 "%sdownload%d-%s",
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1582 parent,
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1583 i,
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1584 util_resource_name(path));
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1585
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1586 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1587 if(sys_stat(np.ptr, &s)) {
145
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1588 if(errno == ENOENT) {
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1589 new_path = np.ptr;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1590 }
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1591 break;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1592 }
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1593 free(np.ptr);
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1594 };
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1595
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1596 free(parent);
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1597 return new_path;
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1598 }
82475dc12dd4 improved dav-sync data-loss prevention
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 144
diff changeset
1599
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1600 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
1601 char *new_path = NULL;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1602 for (int i=0;;i++) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1603 sstr_t np = ucx_asprintf(
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1604 ucx_default_allocator(),
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1605 "%s%d-%s",
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1606 dir->trash,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1607 i,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1608 util_resource_name(path));
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1609
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1610 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1611 if(sys_stat(np.ptr, &s)) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1612 if(errno == ENOENT) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1613 new_path = np.ptr;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1614 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1615 break;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1616 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1617 free(np.ptr);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1618 };
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1619
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1620 if(!new_path) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1621 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
1622 return;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1623 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1624
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
1625 if(sys_rename(path, new_path)) {
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1626 //printf("errno: %d\n", errno);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1627 fprintf(
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1628 stderr,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1629 "Cannot rename file %s to %s\n",
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1630 path,
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1631 new_path);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1632 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1633
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1634 free(new_path);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1635 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
1636
216
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1637 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
1638 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
1639 }
16d6b97fbf33 dav-sync push ignores conflict files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
1640
299
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
1641 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
1642 if(a->argc != 1) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1643 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
1644 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1645 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1646
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1647 // 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
1648 SyncTagFilter* tagfilter = parse_tagfilter_string(
ea50585ec9d9 adds tagfilter scope
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 412
diff changeset
1649 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
1650 if (!tagfilter) {
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1651 fprintf(stderr, "Malformed tag filter\n");
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1652 return -1;
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1653 }
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1654
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1655 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
1656 if(!dir) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1657 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
1658 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1659 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1660 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1661 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1662 }
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
1663 if(cmd_getoption(a, "snapshot")) {
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1664 if(dir->versioning) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1665 dir->versioning->always = TRUE;
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1666 } else {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1667 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
1668 return -1;
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1669 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
1670 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1671
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
1672 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
1673 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
1674 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
1675 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
1676 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
1677 }
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
1678
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1679 Repository *repo = get_repository(sstr(dir->repository));
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1680 if(!repo) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1681 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
1682 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1683 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1684
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
1685 SyncDatabase *db = load_db(dir->database);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1686 if(!db) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1687 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
1688 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1689 }
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
1690 remove_deleted_conflicts(dir, db);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1691
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
1692 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
1693 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
1694 if (cmd_getoption(a, "verbose")) {
f6d3db6113d3 added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
1695 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
1696 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
1697 }
556
1a58014260e0 set content-hash property after uploads when syncdir hashing is enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 554
diff changeset
1698 if(dir->hashing) {
1a58014260e0 set content-hash property after uploads when syncdir hashing is enabled
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 554
diff changeset
1699 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
1700 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1701
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
1702 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
1703 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
1704 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
1705 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
1706
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1707 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
1708 if(!root) {
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1709 print_resource_error(sn, "/");
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1710 dav_session_destroy(sn);
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1711 fprintf(stderr, "Abort\n");
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1712 return -1;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1713 }
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1714
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1715 UcxMap *svrres = NULL;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1716 if(restore) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1717 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
1718 res2map(root, svrres);
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1719 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1720
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
1721 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
1722
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1723 // lock repository
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1724 DavBool locked = FALSE;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
1725 char *locktokenfile = NULL;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1726 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
1727 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
1728 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1729 dav_session_destroy(sn);
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1730 fprintf(stderr, "Abort\n");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1731 return -1;
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1732 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1733 DavLock *lock = dav_get_lock(sn, "/");
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1734 if(lock) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
1735 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
1736 }
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1737 locked = TRUE;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
1738 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
1739 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
1740
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1741 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
1742
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1743 UcxMap *db_hashes = NULL;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1744 if(dir->hashing) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1745 db_hashes = create_hash_index(db);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1746 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1747
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1748 int sync_success = 0;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1749 int sync_delete = 0;
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
1750 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
1751 int sync_error = 0;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
1752
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1753 UcxList *ls_new = NULL;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1754 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
1755 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
1756 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
1757 UcxList *ls_delete = NULL;
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1758 UcxList *ls_move = NULL;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1759 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
1760 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
1761
51
e94bf8530d56 dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 50
diff changeset
1762 // 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
1763 //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
1764 // 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
1765 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
1766 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
1767
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1768 UCX_FOREACH(elm, resources) {
57
3c1ce5f203d7 refactored push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
1769 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
1770 // 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
1771
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1772 // static include/exclude filter
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
1773 if(res_matches_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
1774 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1775 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1776 // static tag filter
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1777 UCX_FOREACH(elm, dir->tagfilter) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1778 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
1779 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
1780 continue;
417
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
1781 }
f340460a8b5d disables tagfilter for directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
1782 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1783
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1784 // 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
1785 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
1786
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1787 // 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
1788 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
1789 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
1790 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
1791 db->resources,
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1792 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
1793 if(dbres) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1794 // 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
1795 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
1796 }
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1797 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1798 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1799 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1800
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
1801 // 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
1802 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
1803 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
1804 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1805 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1806
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1807 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
1808 dir,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1809 db,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1810 local_res,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1811 svrres,
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
1812 restore_removed,
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
1813 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
1814 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
1815 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
1816 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
1817 } else if(local_res->isnew) {
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1818 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
1819 } else {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1820 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
1821 }
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
1822 } 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
1823 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
1824 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1825 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1826
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1827 if(dir->hashing) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1828 // 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
1829 // was moved or is a copy
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1830 UcxList *elm = ls_new;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1831 while(elm) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1832 LocalResource *local = elm->data;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1833 UcxList *prev = elm->prev;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1834 UcxList *next = elm->next;
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
1835 if(local->isdirectory || local->link_target) {
551
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1836 elm = elm->next;
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1837 continue;
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1838 }
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1839
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
1840 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
1841 char *hash = util_file_hash(local_path);
551
99ef8202cd82 add copy/move operation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 550
diff changeset
1842 local->hash = hash;
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1843 // 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
1844 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
1845 if(origin) {
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
1846 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
1847 // the file is a copied/moved file
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1848 // 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
1849 // it still exists
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1850 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
1851 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
1852 } else {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1853 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
1854 // 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
1855 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
1856 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1857 // remove list elemend from ls_new
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1858 if(prev) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1859 prev->next = next;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1860 } else {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1861 ls_new = next;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1862 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1863 if(next) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1864 next->prev = prev;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1865 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1866 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1867
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1868 free(local_path);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1869
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1870 elm = next;
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1871 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1872 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
1873
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1874 // 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
1875 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
1876 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
1877 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
1878 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
1879 // all filtered files should be removed from the database
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1880 if(res_matches_filter(dir, local->path+1)) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1881 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
1882 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1883 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1884 UCX_FOREACH(elm, dir->tagfilter) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1885 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
1886 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
1887 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
1888 continue;
58
1708cba82ca3 added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents: 57
diff changeset
1889 }
403
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1890 }
8e1948eebef5 adds tag filters for push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 402
diff changeset
1891
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1892 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
1893 // 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
1894 // 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
1895 // 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
1896 if(!archive) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1897 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
1898 } 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
1899 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
1900 }
57
3c1ce5f203d7 refactored push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
1901 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1902 }
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
1903 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
1904 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
1905 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
1906 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
1907
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1908 //
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1909 // BEGIN PUSH
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1910 //
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
1911
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1912 int ret = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1913 int error = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1914
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1915 // create collections
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1916 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
1917 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
1918
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1919 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
1920 if(!res) {
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1921 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
1922 ret = -1;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1923 sync_error++;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1924 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1925
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1926 //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
1927
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1928 dav_exists(res);
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1929 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
1930 // create collection
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1931 // TODO: show 405
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1932 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
1933 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
1934 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
1935 ret = -1;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1936 sync_error++;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1937 error = 1;
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1938 //abort = 1;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1939 } else {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1940 // success
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1941 if(local_res->metadata_updated) {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1942 sync_update_metadata(dir, sn, res, local_res);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1943 }
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1944
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1945 // remove old db entry (if it exists)
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1946 // and add add new entry
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1947 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
1948 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
1949 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1950 } 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
1951 // dav_exists() failed
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1952 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
1953 ret = -1;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1954 sync_error++;
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1955 error = 1;
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
1956 //abort = 1;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1957 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1958
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1959 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
1960 }
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
1961
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1962 // copy/move files
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1963 DavBool copy = TRUE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1964 if(!ls_copy) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1965 copy = FALSE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1966 ls_copy = ls_move;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1967 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1968 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
1969 LocalResource *local = elm->data;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1970
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1971 int err = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1972 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
1973 if(dav_exists(res)) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1974 printf("conflict: %s\n", local->path);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1975 local->last_modified = 0;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1976 nullfree(local->etag);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1977 local->etag = NULL;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1978 nullfree(local->hash);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1979 local->hash = NULL;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1980 local->skipped = TRUE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1981 sync_conflict++;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1982 } else {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1983 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
1984 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
1985 sn,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1986 dir,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1987 db,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1988 origin_res,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1989 local->origin);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1990 if(origin_changed) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1991 // upload with put
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1992 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
1993 } else {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1994 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
1995 err = sync_move_remote_resource(
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1996 dir,
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
1997 db,
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1998 origin_res,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
1999 local,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2000 copy,
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2001 &sync_success);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2002 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2003 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2004
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2005 if(err) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2006 sync_error++;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2007 print_resource_error(sn, res->path);
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2008 ret = -1;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2009 error = 1;
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2010 } else {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2011 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
2012 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
2013 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2014
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2015 if(copy && !elm->next) {
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2016 // finished copy, begin move
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2017 elm->next = ls_move;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2018 copy = FALSE;
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2019 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2020 }
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2021
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2022 // upload changed files
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2023 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
2024
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2025 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
2026 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
2027 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
2028
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2029 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
2030 if(!res) {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2031 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
2032 ret = -1;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2033 sync_error++;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2034 } else {
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2035 int changed = remote_resource_is_changed(sn, dir, db, res, local_res);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2036 if(cdt && changed) {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2037 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
2038 local_res->last_modified = 0;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2039 nullfree(local_res->etag);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2040 local_res->etag = NULL;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2041 nullfree(local_res->hash);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2042 local_res->hash = NULL;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2043 local_res->skipped = TRUE;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2044 sync_conflict++;
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2045 } else {
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2046 if(local_res->link_target) {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2047 printf(
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2048 "link: %s -> %s\n",
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2049 local_res->path,
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2050 local_res->link_target);
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2051 } else {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2052 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
2053 }
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2054 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
2055 sync_error++;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2056 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
2057 ret = -1;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2058 error = 1;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2059
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2060 err = 1;
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2061 }
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2062 }
603
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2063
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2064 if(!err) {
8e7e072c18c1 fix that db entries are updated on errors
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 599
diff changeset
2065 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
2066 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
2067 }
51
e94bf8530d56 dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 50
diff changeset
2068 }
585
41368a355222 create collections before doing other stuff on dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 584
diff changeset
2069
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2070 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
2071 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2072
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2073 // metadata updates
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2074 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
2075 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
2076
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2077 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
2078 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
2079 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
2080 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
2081 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
2082 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
2083 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2084 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2085 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2086
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2087 // delete all removed files
568
a81cad6bb377 fix push operation order (move before put)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 567
diff changeset
2088 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
2089
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2090 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
2091 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
2092 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
2093 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
2094 // 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
2095 // 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
2096 // 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
2097 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
2098 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
2099 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
2100 continue;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2101 }
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2102 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
2103 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
2104 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
2105 sync_error++;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2106 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
2107 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2108 } else {
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2109 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
2110 //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
2111 }
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
2112 }
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2113 deletelist = cols;
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2114 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
2115 }
51
e94bf8530d56 dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 50
diff changeset
2116
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2117 // unlock repository
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2118 if(locked) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2119 if(dav_unlock(root)) {
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2120 print_resource_error(sn, "/");
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2121 ret = -1;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2122 } else {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2123 locked = FALSE;
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2124 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2125 }
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2126
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2127 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
2128 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
2129 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
2130 ret = -2;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2131 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2132
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2133 // cleanup
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2134 if(!locked && locktokenfile) {
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2135 remove(locktokenfile);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2136 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
2137
501
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2138 //ucx_map_free_content(db->resources, (ucx_destructor)local_resource_free);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2139 //ucx_map_free(db->resources);
868da3f76267 dav-sync push refactoring: create list of changes before executing sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 497
diff changeset
2140
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2141 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
2142
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
2143 // Report
223
cbbdf207e67e fixed some bugs in dav_create() and dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 222
diff changeset
2144 if(ret != -2) {
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2145 char *str_success = sync_success == 1 ? "file" : "files";
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2146 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
2147 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
2148 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
2149
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2150 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
2151 if(!archive) {
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2152 printf("%d %s deleted, ", sync_delete, str_delete);
c517502d3e38 adds dav-sync archive command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 296
diff changeset
2153 }
561
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
2154 printf("%d %s, %d %s\n",
5e6df4f502d3 harmonizes output of push and pull
Mike Becker <universe@uap-core.de>
parents: 560
diff changeset
2155 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
2156 }
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
2157
221
e22c29b7ee2f using locks in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 220
diff changeset
2158 return ret;
46
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2159 }
0542668d0f26 added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2160
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2161 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
2162 return strcmp(a->path, b->path);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2163 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2164
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2165 int cmd_restore(CmdArgs *a) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2166 char *syncdir = cmd_getoption(a, "syncdir");
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2167
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2168 if(!syncdir && a->argc == 0) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2169 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
2170 return -1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2171 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2172
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2173 char *version = cmd_getoption(a, "version");
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2174 if(version) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2175 if(a->argc != 1) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2176 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
2177 return -1;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2178 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2179 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2180
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2181 SyncDirectory *dir = NULL;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2182 UcxMap *files = NULL;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2183 if(syncdir) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2184 dir = scfg_get_dir(syncdir);
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2185 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2186
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2187 LocalResource nres;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2188 if(a->argc > 0) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2189 files = ucx_map_new(a->argc+8);
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2190 // 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
2191 SyncDirectory *sd = NULL;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2192 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
2193 SyncFile f;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2194 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
2195 if(err) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2196 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
2197 return 1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2198 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2199 if(!sd) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2200 sd = f.dir;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2201 } else {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2202 if(f.dir != sd) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2203 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
2204 return 1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2205 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2206 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2207
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2208 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
2209 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2210 dir = sd;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2211 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2212
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2213 if(!dir) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2214 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
2215 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2216 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2217 if(scfg_check_dir(dir)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2218 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2219 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2220
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2221 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
2222 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
2223 print_allowed_cmds(dir);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2224 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2225 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2226
528
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2227 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
2228 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
2229 if(!restore_modified && !restore_removed) {
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2230 restore_modified = 1;
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2231 restore_removed = 1;
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2232 }
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2233
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2234 SyncDatabase *db = load_db(dir->database);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2235 if(!db) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2236 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
2237 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2238 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2239 remove_deleted_conflicts(dir, db);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2240
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2241 UcxList *modified = NULL;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2242 UcxList *deleted = NULL;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2243
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2244 // 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
2245 // modified or deleted
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2246 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
2247 LocalResource *resource;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2248 UCX_MAP_FOREACH(key, resource, i) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2249 if(resource == &nres) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2250 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
2251 if(!resource) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2252 continue;
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2253 }
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2254 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2255
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
2256 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
2257 SYS_STAT s;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2258 if(sys_stat(file_path, &s)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2259 if(errno == ENOENT) {
528
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2260 if(restore_removed) {
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2261 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
2262 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2263 } else {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2264 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
2265 perror("");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2266 }
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2267 } else {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2268 if(files) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2269 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
2270 } 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
2271 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
2272 if(restore_modified) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2273 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
2274 }
528
4c9c8c017d52 adds -R and -M option to restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 527
diff changeset
2275 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2276 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2277 }
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2278
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2279 free(file_path);
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2280 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2281
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2282 if(files) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
2283 ucx_map_free(files);
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2284 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2285
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2286 int ret = 0;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2287
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2288 // create DavSession
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2289 Repository *repo = get_repository(sstr(dir->repository));
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2290 if(!repo) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2291 fprintf(stderr, "Unkown repository %s\n", dir->name);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2292 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2293 }
497
411bd1098175 fixes DavSession creation in dav-sync with enabled encryption
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 495
diff changeset
2294 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
2295 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
2296 if (cmd_getoption(a, "verbose")) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2297 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2298 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2299 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2300
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2301 // lock repository
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2302 char *locktokenfile = NULL;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2303 DavBool locked = FALSE;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2304 DavResource *root = dav_resource_new(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2305 root->iscollection = TRUE;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2306 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
2307 if(dav_lock_t(root, dir->lock_timeout)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2308 print_resource_error(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2309 dav_session_destroy(sn);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2310 fprintf(stderr, "Abort\n");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2311 return -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2312 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2313 DavLock *lock = dav_get_lock(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2314 if(lock) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2315 printf("Lock-Token: %s\n", lock->token);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2316 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2317 locked = TRUE;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2318 locktokenfile = create_locktoken_file(dir->name, lock->token);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2319 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2320
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2321 int sync_success = 0;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2322 int sync_error = 0;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2323
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2324 UcxList *resources = ucx_list_concat(modified, deleted);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2325 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
2326
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2327 UCX_FOREACH(elm, resources) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2328 LocalResource *resource = elm->data;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2329
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2330 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
2331 if(!res) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2332 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
2333 continue;
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2334 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2335 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
2336 if(status && !strcmp(status, "broken")) {
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2337 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
2338 continue;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2339 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2340
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2341 DavResource *vres = NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2342 if(version) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2343 if(dir->versioning->type == VERSIONING_SIMPLE) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2344 vres = versioning_simple_find(res, version);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2345 } 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
2346 vres = versioning_deltav_find(res, version);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2347 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2348 if(!vres) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2349 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
2350 ret = 1;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2351 break;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2352 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2353 } else {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2354 vres = res;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2355 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2356
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2357 // download the resource
532
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2358 if(!sync_shutdown) {
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2359 if(resource->isdirectory) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
2360 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
2361 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
2362 fprintf(stderr,
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2363 "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
2364 local_path, strerror(errno));
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2365 }
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2366 free(local_path);
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2367 } else {
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2368 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
2369 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
2370 sync_error++;
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2371 }
aeda47714978 fixes dav_copy_node and improves dav-sync restore
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 531
diff changeset
2372 }
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2373 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2374 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2375
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2376 // unlock repository
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2377 if(locked) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2378 if(dav_unlock(root)) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2379 print_resource_error(sn, "/");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2380 ret = -1;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2381 } else {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2382 locked = FALSE;
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
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2386 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
2387 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
2388 fprintf(stderr, "Cannot store sync db\n");
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2389 ret = -2;
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2390 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2391
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2392 // cleanup
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2393 dav_session_destroy(sn);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2394
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2395 if(!locked && locktokenfile) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2396 remove(locktokenfile);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2397 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2398
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2399 // Report
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2400 if(ret != -2) {
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2401 char *str_success = sync_success == 1 ? "file" : "files";
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2402 char *str_error = sync_error == 1 ? "error" : "errors";
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2403 printf("Result: %d %s pulled, %d %s\n",
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2404 sync_success, str_success,
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2405 sync_error, str_error);
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2406 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2407
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2408 return ret;
490
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2409 }
d94c4fd35c21 adds dav-sync restore command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 479
diff changeset
2410
49
c5759ac76c1b dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
2411 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
2412 UcxList *resources = NULL;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2413
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2414 char *path = strdup("/");
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2415 UcxList *stack = ucx_list_prepend(NULL, path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2416 while(stack) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2417 // 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
2418 // 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
2419
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2420 char *p = stack->data;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2421 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
2422 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
2423 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
2424
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2425 if(!local_dir) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2426 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
2427 } else {
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2428 SysDirEnt *ent;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2429 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
2430 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
2431 continue;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2432 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2433
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2434 char *new_path = util_concat_path(p, ent->name);
573
b8f798d240ab change local_resource_new signature
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 570
diff changeset
2435 LocalResource *res = local_resource_new(dir, db, new_path);
b8f798d240ab change local_resource_new signature
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 570
diff changeset
2436 if(res->isdirectory) {
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
2437 resources = ucx_list_append(resources, res);
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2438 stack = ucx_list_prepend(stack, new_path);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2439 } else if(res) {
57
3c1ce5f203d7 refactored push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
2440 resources = ucx_list_append(resources, res);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2441 free(new_path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2442 } else {
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2443 free(new_path);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2444 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2445 }
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
2446 sys_closedir(local_dir);
55
4cb389452a44 replaced readdir_r with readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 54
diff changeset
2447
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2448 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2449 free(local_path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2450 free(p);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2451 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2452
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2453 return resources;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2454 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
2455
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2456 UcxList* read_changes(SyncDirectory *dir, SyncDatabase *db) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2457 UcxProperties *parser = ucx_properties_new();
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2458 parser->delimiter = ':';
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2459
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2460 UcxList *resources = NULL;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2461 sstr_t name;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2462 sstr_t value;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2463
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2464 char buf[STDIN_BUF_SIZE];
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2465 size_t r;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2466 while(!feof(stdin)) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2467 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
2468 ucx_properties_fill(parser, buf, r);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2469 while(ucx_properties_next(parser, &name, &value)) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2470 if(value.length == 0) {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2471 fprintf(stderr, "Wrong input\n");
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2472 continue;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2473 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2474 if(value.ptr[0] == '"'
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2475 && value.length > 2
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2476 && value.ptr[value.length - 1] == '"')
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2477 {
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2478 value.ptr[value.length - 1] = '\0';
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2479 value.ptr++;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2480 value.length -= 2;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2481 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2482 value = sstrdup(value);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2483
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2484 if(!sstrcmp(name, S("put"))) {
573
b8f798d240ab change local_resource_new signature
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 570
diff changeset
2485 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
2486 if(res) {
57
3c1ce5f203d7 refactored push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 56
diff changeset
2487 resources = ucx_list_append(resources, res);
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2488 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2489 } 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
2490 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
2491 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2492
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2493 free(value.ptr);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2494 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2495 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2496 ucx_properties_free(parser);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2497
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2498 return resources;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2499 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2500
573
b8f798d240ab change local_resource_new signature
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 570
diff changeset
2501 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
2502 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
2503 SYS_STAT s;
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2504 if(sys_lstat(file_path, &s)) {
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2505 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
2506 free(file_path);
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2507 return NULL;
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2508 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2509
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2510 LocalResource *res = calloc(1, sizeof(LocalResource));
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2511 res->mode = s.st_mode & 07777;
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2512 res->uid = s.st_uid;
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2513 res->gid = s.st_gid;
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2514 res->last_modified = s.st_mtime;
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2515 if(!S_ISDIR(s.st_mode)) {
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2516 res->path = strdup(path);
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2517 res->size = s.st_size;
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2518 } else {
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
2519 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
2520 res->isdirectory = 1;
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2521 }
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2522
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2523 if(SYS_ISLINK(file_path, s)) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2524 char *lnkbuf = sys_readlink(file_path, &s);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2525 #ifdef SYS_LINK_EXT
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2526 // on Windows, we interpret .lnk files as links
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2527 // we dont want resource names with this extension
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2528 // and possibly sync this to other operating systems
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2529 // 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
2530 // change res->path
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2531 // 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
2532 sstr_t fpath = sstr(file_path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2533 sstr_t rpath = sstr(path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2534 // remove last 4 chars (.lnk)
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2535 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
2536 // check if a file with this name exists
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2537 SYS_STAT nfp_s;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2538 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
2539 // 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
2540 // there is another file with this name
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2541 free(lnkbuf);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2542 lnkbuf = NULL;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2543 } else {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2544 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
2545 res->local_path = res->path;
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2546 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
2547 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2548 free(new_file_path.ptr);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2549 #endif
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2550
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2551 if(lnkbuf) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2552 // readlink successful
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2553 char *normalized = NULL;
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2554 if(!util_path_isabsolut(lnkbuf)) {
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2555 char *link_parent = util_parent_path(res->path);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2556 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
2557 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
2558 normalized = util_path_normalize(link);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2559 free(abs_link_parent);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2560 free(link_parent);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2561 free(link);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2562 } else {
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2563 normalized = util_path_normalize(lnkbuf);
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2564 }
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2565
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2566 char *dirpath = util_path_normalize(dir->path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2567 if(util_path_isrelated(dirpath, normalized)) {
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2568 // 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
2569 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
2570 res->link_target = rel;
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2571 }
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2572 free(dirpath);
576
62cc92445234 store relative link in LocalResource
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
2573 free(normalized);
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2574 free(lnkbuf);
574
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2575 }
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2576 }
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2577
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2578 free(file_path);
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2579
c36eddf167a8 read link on LocalResource creation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
2580 return res;
53
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2581 }
ddc4efc9b0f8 added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 52
diff changeset
2582
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2583 char* local_resource_path(LocalResource *res) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2584 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
2585 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2586
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2587 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
2588 SyncDirectory *dir,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2589 SyncDatabase *db,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2590 LocalResource *res,
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2591 UcxMap *svrres,
445
c525f049c8b7 renames dav-sync -D option to -R
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 444
diff changeset
2592 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
2593 DavBool restore_modified)
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2594 {
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2595 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
2596 res->tags_updated = 0;
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2597 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
2598 if(svrres) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2599 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
2600 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
2601 return 1;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2602 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2603 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
2604 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
2605 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
2606 res->restore = TRUE;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2607 return 1;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2608 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2609 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2610 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2611
366
5228b912c925 adds technical foundation to just push tag updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 363
diff changeset
2612 res->tags_updated = db_res->tags_updated;
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2613 if(db_res->etag) {
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2614 res->etag = strdup(db_res->etag);
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2615 }
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2616 if(db_res->tags_hash) {
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2617 res->tags_hash = strdup(db_res->tags_hash);
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2618 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2619 if(db_res->remote_tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2620 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
2621 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2622 if(db_res->xattr_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2623 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
2624 }
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2625
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
2626 if(dir->tagconfig && dir->tagconfig->detect_changes && !res->tags_updated) {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2627 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
2628 if(tags) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2629 if(db_res->tags_hash) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2630 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
2631 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
2632 res->tags_updated = 1;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2633 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2634 free(hash);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2635 } else {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2636 res->tags_updated = 1;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2637 }
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2638 } else if(db_res->tags_hash) {
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
2639 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
2640 }
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2641 res->metadata_updated = res->tags_updated;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2642 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2643
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2644 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
2645 if(db_res->mode != res->mode) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2646 res->finfo_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2647 res->metadata_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2648 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2649 }
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2650 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
2651 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
2652 res->finfo_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2653 res->metadata_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2654 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2655 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2656
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2657 if((dir->metadata & FINFO_XATTR) == FINFO_XATTR) {
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
2658 char *path = create_local_path(dir, db_res->path);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2659 XAttributes *xattr = file_get_attributes(path);
524
d53fd1006485 store hash of remote xattr and tags in sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 523
diff changeset
2660 // 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
2661 if((db_res->xattr_hash && !xattr) ||
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2662 (!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
2663 (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
2664 {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2665 res->metadata_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2666 res->xattr_updated = 1;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2667 res->xattr = xattr;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2668 } else if(xattr) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2669 xattributes_free(xattr);
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
2670 }
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2671 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
2672
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2673 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
2674 res->link_updated = 1;
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2675 } else if(db_res->last_modified == res->last_modified && db_res->size == res->size) {
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2676 return 0;
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2677 }
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2678
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2679 if(db_res->parts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2680 // if the resource is splitted, move the part infos to the new
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2681 // LocalResource obj, because we need it later
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2682 res->parts = db_res->parts;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2683 res->numparts = db_res->numparts;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2684 db_res->parts = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2685 db_res->numparts = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2686 }
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2687 } else {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2688 res->tags_updated = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2689 res->finfo_updated = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2690 res->xattr_updated = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2691 res->metadata_updated = 1;
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
2692 res->isnew = 1;
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2693 }
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2694 return 1;
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2695 }
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2696
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2697 int remote_resource_is_changed(
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2698 DavSession *sn,
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2699 SyncDirectory *dir,
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2700 SyncDatabase *db,
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2701 DavResource *remote,
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2702 LocalResource *res)
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2703 {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2704 DavPropName properties[] = {
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2705 {"DAV:", "getetag"},
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2706 {DAV_NS, "version-collection"},
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2707 {DAV_NS, "content-hash"},
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2708 {DAV_NS, "split" },
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2709 {DAV_PROPS_NS, "tags"},
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2710 {DAV_PROPS_NS, "link" }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2711 };
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
2712 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
2713
444
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2714 if(res->restore) {
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2715 return 0;
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2716 }
761dc4867208 adds dav-sync options for restoring deleted or modified files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 417
diff changeset
2717
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2718 int ret = 0;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2719 if(err == 0) {
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
2720 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
2721 char *hash = sync_get_content_hash(remote);
557
90ad7324bbbc fix dav-sync push conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 556
diff changeset
2722 if(hash && res->hash) {
567
b0ce8b27978b implement copy/move for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 566
diff changeset
2723 if(strcmp(hash, res->hash)) {
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2724 ret = 1;
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2725 }
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
2726 } 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
2727 // 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
2728 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
2729 } else if(etag) {
220
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2730 sstr_t e = sstr(etag);
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2731 if(sstrprefix(e, S("W/"))) {
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2732 e = sstrsubs(e, 2);
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2733 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2734 if(strcmp(e.ptr, res->etag)) {
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2735 ret = 1;
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2736 }
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
2737 } 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
2738 // 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
2739 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
2740 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2741 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2742 return ret;
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2743 }
f1b3873a6525 added conflict detection to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 219
diff changeset
2744
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2745 char* resource_local_path(DavResource *res) {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2746 #ifdef SYS_LINK_EXT
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2747 // on Windows, add .lnk extension to links
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2748 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
2749 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
2750 } else {
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2751 // not a link
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2752 return strdup(res->path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2753 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2754 #else
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2755 return strdup(res->path);
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2756 #endif
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2757 }
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
2758
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2759 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
2760 size_t local_blocksize = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2761 if(local->blocksize < 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2762 // file splitting disabled
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2763 return 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2764 } else if(local->blocksize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2765 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
2766 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2767 UCX_FOREACH(elm, dir->splitconfig) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2768 SplitConfig *sc = elm->data;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2769 if(sc->pattern) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2770 if(regexec(sc->pattern, local->path, 0, NULL, 0) != 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2771 continue;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2772 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2773 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2774
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2775 if(sc->minsize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2776 if(filesize < sc->minsize) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2777 continue;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2778 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2779 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2780
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2781 local_blocksize = sc->blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2782 break;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2783 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2784 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2785
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2786 size_t svr_blocksize = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2787 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
2788 if(svr_blocksize_str) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2789 uint64_t i = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2790 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
2791 svr_blocksize = (size_t)i;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2792 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2793 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2794
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2795 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
2796 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
2797 return svr_blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2798 } else if(local_blocksize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2799 return local_blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2800 } else if(svr_blocksize > 0) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2801 return svr_blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2802 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2803
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2804 return 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2805
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2806 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
2807
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
2808 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
2809 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
2810 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
2811 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
2812 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
2813 } 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
2814 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
2815 } 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
2816 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
2817 }
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
2818 }
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
2819
533
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2820 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
2821 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
2822 if(!vcol_href) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2823 return NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2824 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2825 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
2826 if(!vcol) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2827 return NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2828 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2829
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2830
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2831 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
2832 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
2833 dav_resource_free(vcol);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2834 return NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2835 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2836
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2837 DavResource *ret = NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2838 DavResource *child = vcol->children;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2839 while(child) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2840 DavResource *next = child->next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2841 if(!strcmp(child->name, version)) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2842 ret = child;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2843 } else {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2844 dav_resource_free(child);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2845 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2846 child = next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2847 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2848 dav_resource_free(vcol);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2849
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2850 return ret;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2851 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2852
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2853 // 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
2854 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
2855 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
2856 DavResource *ret = NULL;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2857 while(list) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2858 DavResource *next = list->next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2859 if(!ret) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2860 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
2861 if(vname && !strcmp(vname, version)) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2862 ret = list;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2863 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2864 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2865 if(list != ret) {
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2866 dav_resource_free(list);
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2867 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2868 list = next;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2869 }
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2870 return ret;
5b9f20aa88c2 adds option to restore previous file versions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 532
diff changeset
2871 }
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
2872
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2873 int sync_set_status(DavResource *res, char *status) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2874 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
2875 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
2876 int ret = dav_store(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2877 dav_resource_free(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2878 return ret;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2879 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2880
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2881 int sync_remove_status(DavResource *res) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2882 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
2883 dav_remove_property(resource, "idav:status");
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2884 int ret = dav_store(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2885 dav_resource_free(resource);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2886 return ret;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2887 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
2888
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2889 int sync_tags_equal(UcxList *tags1, UcxList *tags2) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2890 if(!tags1) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2891 return tags2 ? 0 : 1;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2892 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2893 if(!tags2) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2894 return tags1 ? 0 : 1;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2895 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2896
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2897 UcxMap *map1 = ucx_map_new(32);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2898 UCX_FOREACH(elm, tags1) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2899 DavTag *t = elm->data;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2900 ucx_map_cstr_put(map1, t->name, t);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2901 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2902
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2903 int equal = 1;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2904 int i = 0;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2905 UCX_FOREACH(elm, tags2) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2906 DavTag *t = elm->data;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2907 if(!ucx_map_cstr_get(map1, t->name)) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2908 equal = 0;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2909 break;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2910 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2911 i++;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2912 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2913
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2914 if(i != map1->count) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2915 equal = 0;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2916 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2917 ucx_map_free(map1);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2918 return equal;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2919 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2920
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2921 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
2922 int ret = 0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2923
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2924 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
2925 if(fileinfo) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2926 FileInfo f;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2927 finfo_get_values(fileinfo, &f);
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2928 if((dir->metadata & FINFO_DATE) == FINFO_DATE && f.date_set) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2929 // set mtime
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2930 struct utimbuf t;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2931 t.actime = f.last_modified;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2932 t.modtime = f.last_modified;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2933 if(utime(path, &t)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2934 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
2935 ret = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2936 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2937 }
539
8deb52292c99 fixes more if statements and some warnings
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
2938 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
2939 // set mode
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2940 if(chmod(path, f.mode)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2941 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
2942 ret = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2943 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2944 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2945 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2946
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2947 DavXmlNode *xattr_prop = 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
2948 if(xattr_prop) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2949 XAttributes *xattr = xml_get_attributes(xattr_prop);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2950 if(xattr) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2951 if(!sync_store_xattr(dir, path, xattr)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2952 if(local->xattr_hash) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2953 free(local->xattr_hash);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2954 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2955 local->xattr_hash = xattr->hash;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2956 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2957 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2958 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2959
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2960 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
2961 ret = 1;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2962 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2963
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2964 return ret;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2965 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2966
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2967 int sync_store_xattr(SyncDirectory *dir, const char *path, XAttributes *xattr) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2968 for(int i=0;i<xattr->nattr;i++) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2969 sstr_t value = xattr->values[i];
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2970 if(xattr_set(path, xattr->names[i], value.ptr, value.length)) {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2971 fprintf(
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2972 stderr,
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2973 "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
2974 xattr->names[i],
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2975 path);
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2976 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2977 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2978 return 0;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2979 }
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
2980
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2981 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
2982 if(!dir->tagconfig) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2983 return 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2984 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2985
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2986 UcxList *tags = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2987 if(dir->tagconfig) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
2988 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
2989 if(tagsprop) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2990 tags = parse_dav_xml_taglist(tagsprop);
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
2991
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2992 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2993 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
2994
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2995 DavBool store_tags = FALSE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2996 DavBool tags_changed = FALSE;
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
2997 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
2998 if(tags_changed) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
2999 switch(dir->tagconfig->conflict) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3000 case TAG_NO_CONFLICT: {
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3001 store_tags = TRUE;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3002 break;
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3003 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3004 case TAG_KEEP_LOCAL: {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3005 store_tags = FALSE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3006 break;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3007 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3008 case TAG_KEEP_REMOTE: {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3009 store_tags = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3010 local->tags_updated = FALSE;
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3011 break;
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3012 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3013 case TAG_MERGE: {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3014 UcxList *new_tags = merge_tags(local_tags, tags);
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3015 // TODO: free tags and local_tags
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3016 tags = new_tags;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3017 store_tags = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3018 // 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
3019 local->tags_updated = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3020 break;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3021 }
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3022 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3023 } else {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3024 if(!sync_tags_equal(tags, local_tags)) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3025 store_tags = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3026 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3027 // TODO: free local_tags
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3028 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3029
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3030 if(!store_tags) {
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3031 return 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3032 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3033
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3034 int ret = sync_store_tags_local(dir, local, path, tags);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3035
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3036 // TODO: free stuff
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3037
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3038 return ret;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3039 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3040
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3041 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
3042 int ret = 0;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3043 if(dir->tagconfig->store == TAG_STORE_XATTR) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3044 UcxBuffer *data = NULL;
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3045 if(tags) {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3046 switch(dir->tagconfig->local_format) {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3047 default: break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3048 case TAG_FORMAT_TEXT: {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3049 data = create_text_taglist(tags);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3050 break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3051 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3052 case TAG_FORMAT_CSV: {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3053 data = create_csv_taglist(tags);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3054 break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3055 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3056 case TAG_FORMAT_MACOS: {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3057 data = create_macos_taglist(tags);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3058 break;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3059 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3060 }
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3061
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3062 if(data) {
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3063 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
3064 int update = 1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3065 if(local) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3066 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
3067 //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
3068 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3069 update = 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3070 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3071 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3072 if(update) {
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3073 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
3074 if(local) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3075 if(local->tags_hash) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3076 free(local->tags_hash);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3077 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3078 local->tags_hash = data_hash;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3079 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3080 } else {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3081 free(data_hash);
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3082 }
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3083 ucx_buffer_free(data);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3084 } else {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3085 ret = -1;
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
3086 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3087 } else {
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3088 if(local) {
526
e3c0440bd599 adds metadata support to dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 525
diff changeset
3089 //printf("update: %s\n", local->path);
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3090 }
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3091 // ignore errors on remove
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3092 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
3093 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3094 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3095
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3096 if(!ret) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3097 local->tags_updated = 0;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3098 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
3099
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3100 return ret;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3101 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3102
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3103 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
3104 if(!dir->tagconfig) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3105 return NULL;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3106 }
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3107 if(res->cached_tags) {
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3108 return res->cached_tags;
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3109 }
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3110 UcxBuffer *buf = NULL;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3111 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
3112 ssize_t tag_length = 0;
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3113 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
3114 char* tag_data = xattr_get(
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3115 local_path,
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3116 dir->tagconfig->xattr_name,
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3117 &tag_length);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3118 free(local_path);
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3119
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3120 if(tag_length > 0) {
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3121 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
3122 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
3123 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3124 }
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3125 res->cached_tags = buf;
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3126 return buf;
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3127 }
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3128
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3129 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
3130 if(changed) *changed = FALSE;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3131
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3132 UcxList *tags = NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3133
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3134 if(!res) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3135 return NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3136 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
3137
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3138 if(!dir->tagconfig) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3139 return NULL;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3140 }
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3141 if(changed && res->tags_updated) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3142 *changed = TRUE;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
3143 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3144 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
3145 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
3146 res->cached_tags :
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3147 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
3148
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3149 if(tag_buf) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3150 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
3151 if(res->tags_hash) {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3152 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
3153 *changed = TRUE;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3154 }
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3155 free(res->tags_hash);
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3156 } else {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3157 if(changed) *changed = TRUE;
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3158 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3159 if(!newhash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3160 *newhash = new_hash;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3161 } else {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3162 free(newhash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3163 }
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3164
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3165 switch(dir->tagconfig->local_format) {
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3166 default: break;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3167 case TAG_FORMAT_TEXT: {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3168 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
3169 break;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3170 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3171 case TAG_FORMAT_CSV: {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3172 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
3173 break;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3174 }
363
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
3175 case TAG_FORMAT_MACOS: {
367
4a6a59f89f9f adds dav-sync config for autodetecting tag changes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 366
diff changeset
3176 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
3177 break;
e9ed8e130ccf adds support for macos file tags
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 361
diff changeset
3178 }
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3179 }
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3180 res->cached_tags = tag_buf;
368
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3181 } else if(res->tags_hash) {
11797f33bc24 adds more tag config options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 367
diff changeset
3182 if(changed) *changed = TRUE;
361
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3183 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3184 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3185
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3186 return tags;
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3187 }
b6f2462ee055 adds xattr lib and tag support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 347
diff changeset
3188
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3189 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
3190 int ret = fseek(f, offset, origin);
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3191 return ret == 0 ? CURL_SEEKFUNC_OK : CURL_SEEKFUNC_CANTSEEK;
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3192 }
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3193
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3194 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
3195 size_t ret = fread(ptr, size, nmemb, f);
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3196 return ret;
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3197 }
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3198
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3199 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
3200 unsigned char name_prefix[8];
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3201 memset(name_prefix, 0, 8);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3202 dav_rand_bytes(name_prefix, 8);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3203 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
3204 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
3205 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
3206 free(pre);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3207 return w >= len;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3208 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3209
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3210 #define VBEGIN_ERROR_MKCOL 1
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3211 #define VBEGIN_ERROR_MOVE 2
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3212 #define VBEGIN_ERROR_PROPPATCH 3
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3213 #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
3214 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
3215 int ret = 0;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3216
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3217 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
3218 DavResource *history_collection = dav_resource_new(
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3219 res->session,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3220 dir->versioning->collection);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3221
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3222 // 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
3223 // 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
3224 // 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
3225 // 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
3226
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3227 char *history_href = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3228 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
3229 if(!vcol_path) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3230 DavResource *history_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3231
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3232 // 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
3233 // 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
3234 while(!history_res) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3235 char history_res_name[128];
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3236 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
3237
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3238 history_res = dav_resource_new_child(
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3239 res->session,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3240 history_collection,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3241 history_res_name);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3242 if(dav_exists(history_res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3243 dav_resource_free(history_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3244 history_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3245 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3246 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3247
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3248 history_res->iscollection = TRUE;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3249 if(dav_create(history_res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3250 dav_resource_free(history_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3251 dav_resource_free(history_collection);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3252 return VBEGIN_ERROR_MKCOL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3253 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3254
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3255 history_href = strdup(history_res->href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3256
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3257 dav_resource_free(history_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3258 } else {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3259 history_href = vcol_path;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3260 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3261
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3262 // 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
3263 DavResource *version_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3264 while(!version_res) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3265 char version_name[128];
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3266 gen_random_name(version_name, 128);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3267
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3268 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
3269 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
3270 free(href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3271
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3272 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
3273 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
3274 free(dest);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3275
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3276 if(err) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3277 dav_resource_free(version_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3278 version_res = NULL;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3279 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
3280 ret = VBEGIN_ERROR_MOVE;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3281 break;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3282 }
584
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
3283 } else {
7fb81fd429b2 fix that knowledge about resource existence was fucked up by versioning_begin
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 583
diff changeset
3284 // 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
3285 // 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
3286 *exists = 0;
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3287 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3288 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3289
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3290 if(!ret) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3291 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
3292 if(dav_store(version_res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3293 ret = VBEGIN_ERROR_PROPPATCH;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3294 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3295 dav_resource_free(version_res);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3296
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3297 // 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
3298 // 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
3299 dav_set_string_property_ns(
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3300 res,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3301 DAV_NS,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3302 VERSION_PATH_PROPERTY,
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3303 history_href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3304 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3305
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3306 if(vcol_path != history_href) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3307 free(history_href);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3308 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3309
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3310 dav_resource_free(history_collection);
522
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 521
diff changeset
3311 } 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
3312 // DeltaV is so much easier :)
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3313 if(dav_checkout(res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3314 ret = VBEGIN_ERROR_CHECKOUT;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3315 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3316 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3317
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3318 return ret;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3319 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3320
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3321 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
3322 if(dir->versioning->type == VERSIONING_DELTAV) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3323 return dav_checkin(res);
504
bf3695fee719 fix missiong return in versioning_end()
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 503
diff changeset
3324 } else {
bf3695fee719 fix missiong return in versioning_end()
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 503
diff changeset
3325 return 0;
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3326 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3327 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3328
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3329 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
3330 if(dir->versioning->type == VERSIONING_SIMPLE) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3331 // TODO
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3332 }
522
46f96dcd6eab adds metadata config element for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 521
diff changeset
3333 return 0;
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3334 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3335
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3336 static void update_metadata_hashes(LocalResource *local, MetadataHashes hashes) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3337 if(hashes.tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3338 if(local->tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3339 free(local->tags_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3340 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3341 local->tags_hash = hashes.tags;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3342 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3343 if(hashes.tags_remote) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3344 if(local->remote_tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3345 free(local->remote_tags_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3346 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3347 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
3348 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3349 if(hashes.xattr) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3350 if(local->xattr_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3351 free(local->xattr_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3352 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3353 local->xattr_hash = hashes.xattr;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3354 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3355 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3356
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3357 // 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
3358 #define LOG10 log10
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3359
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3360 static UcxList* upload_parts(
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3361 LocalResource *local,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3362 DavResource *res,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3363 FILE *in,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3364 uint64_t filesize,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3365 size_t blocksize,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3366 uint64_t *blockcount,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3367 int *err)
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3368 {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3369 // 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
3370 // 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
3371 if(res->exists) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3372 if(!res->iscollection) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3373 if(dav_delete(res)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3374 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
3375 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3376 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3377 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3378 res->exists = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3379 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
3380 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3381 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3382 res->iscollection = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3383 if(dav_create(res)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3384 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
3385 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3386 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3387 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3388 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3389 res->exists = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3390
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3391 if(!res->href) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3392 // 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
3393 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
3394 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3395 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3396 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3397
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3398 char *buffer = malloc(blocksize);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3399 if(!buffer) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3400 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
3401 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3402 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3403 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3404
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3405 // 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
3406 // 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
3407 int nblocks = filesize / blocksize;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3408 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
3409 if(digits > 127) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3410 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
3411 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3412 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3413 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3414
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3415 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
3416
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3417 int blockindex = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3418 int uploaded_parts = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3419 size_t r;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3420
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3421 // 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
3422 // part names
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3423 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
3424 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
3425
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3426 DAV_SHA_CTX *sha = dav_hash_init();
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3427
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3428 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
3429 dav_hash_update(sha, buffer, r);
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3430
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3431 int upload_block = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3432 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
3433 if(blockindex >= local->numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3434 // 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
3435 upload_block = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3436 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3437 FilePart part = local->parts[blockindex];
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3438 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
3439 // no change
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3440 free(block_hash);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3441 block_hash = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3442 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3443 // block has changed
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3444 upload_block = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3445 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3446 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3447
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3448 if(upload_block) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3449 char name[128];
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3450 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
3451
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3452 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
3453 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
3454 free(part_href);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3455
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3456 // upload part
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3457 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
3458 if(dav_store(part)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3459 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3460 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
3461 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3462 // successfully uploaded part
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3463
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3464 // 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
3465 // 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
3466 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
3467 f->block = blockindex;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3468 f->hash = block_hash;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3469 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
3470 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3471 dav_resource_free(part);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3472 uploaded_parts++;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3473 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3474 if(*err) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3475 break;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3476 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3477 blockindex++;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3478 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3479 *blockcount = blockindex;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3480
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3481 // restore flags
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3482 res->session->flags = session_flags;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3483
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3484 free(buffer);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3485 if(*err) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3486 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
3487 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
3488 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3489 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3490
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3491 // set content-hash
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
3492 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
3493 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
3494 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
3495 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
3496
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3497 // get etags from uploaded resources
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3498 // 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
3499 UcxList *updated_parts = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3500 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
3501 if(!parts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3502 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
3503 *err = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3504 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
3505 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
3506 return NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3507 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3508 DavResource *part = parts->children;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3509 while(part) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3510 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
3511 // 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
3512 // 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
3513 if(fp) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3514 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
3515 if(etag) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3516 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
3517 etag = etag + 2;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3518 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3519
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3520 fp->etag = strdup(etag);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3521 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
3522 } // 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
3523 } else {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3524 uint64_t name_partnum = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3525 char *res_name = part->name;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3526 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
3527 res_name++;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3528 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3529 DavBool delete_part = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3530 if(strlen(part->name) != digits) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3531 delete_part = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3532 } 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
3533 if(name_partnum >= blockindex) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3534 delete_part = 1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3535 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3536 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3537
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3538 if(delete_part) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3539 if(dav_delete(part)) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3540 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
3541 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3542 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3543 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3544 part = part->next;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3545 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3546 dav_resource_free_all(parts);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3547
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3548 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
3549 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
3550
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3551 *err = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3552 return updated_parts;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3553 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3554
544
9e85e1ec1155 adds semi functional download of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 543
diff changeset
3555 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
3556 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
3557 if(old_num > numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3558 // free old parts
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3559 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
3560 FilePart p = local->parts[i];
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3561 if(p.etag) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3562 free(p.etag);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3563 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3564 if(p.hash) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3565 free(p.hash);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3566 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3567 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3568 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3569 if(numparts != local->numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3570 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
3571 local->numparts = numparts;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3572 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3573
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3574 UCX_FOREACH(elm, updates) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3575 FilePart *p = elm->data;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3576 if(p->block > numparts) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3577 // 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
3578 // is going on
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3579 continue;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3580 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3581
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3582 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
3583 if(p->block < old_num) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3584 // cleanup existing part
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3585 if(old->hash) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3586 free(old->hash);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3587 old->hash = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3588 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3589 if(old->etag) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3590 free(old->etag);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3591 old->etag = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3592 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3593 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3594 old->block = p->block;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3595 old->hash = p->hash;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3596 old->etag = p->etag;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3597 free(p);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3598 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3599 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3600
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3601 int sync_put_resource(
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3602 SyncDirectory *dir,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3603 DavResource *res,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3604 LocalResource *local,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3605 int *counter)
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3606 {
611
a7c48e0dca88 implement links on Windows (shelllink)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 608
diff changeset
3607 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
3608
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
3609 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
3610 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
3611 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
3612 perror("");
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3613 free(local_path);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3614 return -1;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3615 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3616
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3617 DavBool islink = local->link_target ? 1 : 0;
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3618 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
3619 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
3620 }
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3621
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3622 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
3623
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
3624 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
3625 if(!in) {
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3626 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
3627 free(local_path);
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3628 return -1;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3629 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3630
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3631 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
3632 int split_err = 0;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3633 UcxList *parts = NULL;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3634 uint64_t blockcount = 0;
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3635
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3636 if(islink) {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3637 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
3638 } else if(issplit) {
541
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3639 // set split property
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3640 char blocksize_str[32];
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3641 snprintf(blocksize_str, 32, "%zu", split_blocksize);
e59a989d890d adds content hash for splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 539
diff changeset
3642 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
3643
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3644 // splitted/partial upload
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3645 parts = upload_parts(
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3646 local,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3647 res,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3648 in,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3649 s.st_size,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3650 split_blocksize,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3651 &blockcount,
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3652 &split_err);
577
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3653 } else {
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3654 // regular file upload
f49964cf7228 store link property on push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 576
diff changeset
3655 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
3656 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
3657 }
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3658 if(split_err) {
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3659 free(local_path);
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3660 return -1;
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3661 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3662
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3663 MetadataHashes hashes;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3664 hashes = sync_set_metadata_properties(dir, res->session, res, local);
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3665
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3666 // 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
3667 // and sets res->exists
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3668 int exists = res->exists;
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3669 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
3670 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
3671 if(err) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3672 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
3673 free(local_path);
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3674 return -1;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3675 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3676 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3677
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3678 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
3679 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
3680 if(!exists && dav_create(res)) {
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3681 continue;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3682 }
491
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3683 exists = 1;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3684 if(dav_store(res)) {
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3685 continue;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3686 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3687 ret = 0;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3688 break;
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3689 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3690
536
877f7c4a203b adds file splitting feature to dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 533
diff changeset
3691 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
3692 if(versioning_end(dir, res)) {
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3693 fprintf(stderr, "Cannot checkin resource\n");
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3694 ret = 1;
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3695 }
fdc2fb090cc7 adds versioning support for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 490
diff changeset
3696 }
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3697
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3698 if(ret == 0) {
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3699 (*counter)++;
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3700
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3701 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
3702 update_parts(local, parts, blockcount);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3703
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3704 // 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
3705 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
3706
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3707 if(up_res) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3708 // 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
3709 if(up_res->contentlength < s.st_size && !issplit && !islink) {
478
baa63fef5c5c fixes redirects
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 460
diff changeset
3710 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
3711 ret = -1;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3712 // try to set the resource status to 'broken'
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3713 sync_set_status(res, "broken");
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3714 } else {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3715 // 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
3716 char *etag = dav_get_string_property(up_res, "D:getetag");
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3717 if(etag) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3718 if(strlen(etag) > 2 && etag[0] == 'W' && etag[1] == '/') {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3719 etag = etag + 2;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3720 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3721 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3722
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3723 if(local->etag) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3724 free(local->etag);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3725 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3726
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3727 if(etag) {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3728 local->etag = strdup(etag);
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3729 } else {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3730 local->etag = NULL;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3731 }
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3732
550
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3733 if(!issplit && dir->hashing) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3734 if(local->hash) {
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3735 free(local->hash);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3736 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3737 // TODO: calculate hash on upload
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3738 local->hash = util_file_hash(local_path);
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3739 }
8c700eae3eb8 add copy/move detection to push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 548
diff changeset
3740
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
3741 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
3742 sync_remove_status(up_res);
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
3743 }
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
3744
bf485439222a fixed locking in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 225
diff changeset
3745 dav_resource_free(up_res);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3746 }
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
3747 }
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3748 } else {
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3749 ret = -1;
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3750 sync_set_status(res, "broken");
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3751 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3752
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3753 fclose(in);
144
c2c02c9b3be4 dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 135
diff changeset
3754 free(local_path);
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3755
64
112dbf7ba8b0 changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 61
diff changeset
3756 return ret;
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3757 }
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3758
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3759 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
3760 res->iscollection = 1;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3761 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
3762 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
3763 if(dav_create(res)) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3764 continue;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3765 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3766 ret = 0;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3767 break;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3768 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3769 return ret;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3770 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3771
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3772 int sync_move_remote_resource(
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3773 SyncDirectory *dir,
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
3774 SyncDatabase *db,
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3775 DavResource *origin,
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3776 LocalResource *local,
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3777 DavBool copy,
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3778 int *counter)
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3779 {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3780 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
3781
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3782 SYS_STAT s;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3783 if(sys_stat(local_path, &s)) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3784 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
3785 perror("");
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3786 free(local_path);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3787 return -1;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3788 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3789 free(local_path);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3790
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3791 int result = 0;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3792 if(copy) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3793 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
3794 } else {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3795 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
3796 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3797
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3798 if(result != 0) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3799 return result;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3800 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3801
569
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
3802 LocalResource *local_origin = local->origin;
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
3803 if(!copy) {
cafdc13b6820 remove dead db entry when files are moved
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 568
diff changeset
3804 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
3805 }
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3806 // replace LocalResource with origin content
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3807 local->origin = NULL;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3808 char *path = strdup(local->path);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3809 // TODO: free stuff before replacing it
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3810 memcpy(local, local_origin, sizeof(LocalResource));
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3811 local->path = path;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3812
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3813 free(local_origin); // only free origin pointer
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3814
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3815 // get new etag
553
891823d8dd7b fix move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 552
diff changeset
3816 DavResource *up_res = dav_get(origin->session, local->path, "D:getetag");
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3817 if(up_res) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3818 (*counter)++;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3819
554
ebac6e1ac190 update metadata on copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 553
diff changeset
3820 // set metadata
ebac6e1ac190 update metadata on copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 553
diff changeset
3821 MetadataHashes hashes;
ebac6e1ac190 update metadata on copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 553
diff changeset
3822 hashes = sync_set_metadata_properties(dir, up_res->session, up_res, local);
ebac6e1ac190 update metadata on copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 553
diff changeset
3823 if(dav_store(up_res)) {
ebac6e1ac190 update metadata on copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 553
diff changeset
3824 fprintf(stderr, "Error: cannot store resource metadata\n");
ebac6e1ac190 update metadata on copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 553
diff changeset
3825 }
ebac6e1ac190 update metadata on copy/move
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 553
diff changeset
3826
552
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3827 // 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
3828 char *etag = dav_get_string_property(up_res, "D:getetag");
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3829 if(etag) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3830 if(strlen(etag) > 2 && etag[0] == 'W' && etag[1] == '/') {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3831 etag = etag + 2;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3832 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3833 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3834
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3835 if(local->etag) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3836 free(local->etag);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3837 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3838
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3839 if(etag) {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3840 local->etag = strdup(etag);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3841 } else {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3842 local->etag = NULL;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3843 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3844
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3845 local->last_modified = s.st_mtime;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3846
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3847 dav_resource_free(up_res);
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3848 } else {
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3849 result = 1;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3850 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3851
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3852 return result;
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3853 }
e1a12762bf0a improve copy/move stability and db update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 551
diff changeset
3854
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3855 int sync_delete_remote_resource(
492
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3856 SyncDirectory *dir,
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3857 DavSession *sn,
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3858 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
3859 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
3860 UcxList **cols)
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3861 {
570
00b7b8e86c48 fix deletion of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
3862 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
3863 if(!res) {
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3864 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
3865 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3866
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3867 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
3868 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
3869 if(res->iscollection) {
570
00b7b8e86c48 fix deletion of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
3870 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
3871 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
3872 *cols = ucx_list_append(*cols, local_res);
570
00b7b8e86c48 fix deletion of splitted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
3873 } 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
3874 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
3875 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
3876 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
3877 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
3878 } 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
3879 (*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
3880 }
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3881 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3882 } else {
331
9ca1e4706acc adds initial support for xml properties in libidav
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 318
diff changeset
3883 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
3884 if(etag) {
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3885 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
3886 etag = etag + 2;
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3887 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3888 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3889
565
26898e00ddff fix dav-sync push not deleting files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 564
diff changeset
3890 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
3891 // 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
3892 // resource can be deleted
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3893 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
3894
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3895 if(dir->versioning && dir->versioning->always) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3896 if(versioning_delete(dir, res)) {
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3897 fprintf(
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3898 stderr,
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3899 "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
3900 ret = 1;
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3901 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3902 }
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3903
7bde663719dc Adds dav-sync option for enabling versioning
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 491
diff changeset
3904 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
3905 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
3906 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
3907 ret = 1;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3908 }
192
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3909 } else {
d10194a51304 dav-sync prints a small report after successful sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 191
diff changeset
3910 (*counter)++;
190
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3911 }
a76e43d89f55 dav-sync can create and delete empty directories now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 185
diff changeset
3912 }
565
26898e00ddff fix dav-sync push not deleting files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 564
diff changeset
3913 // 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
3914 // the server and delete was skipped?
65
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3915 }
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3916
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3917 // cleanup
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3918 dav_resource_free(res);
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3919
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3920 return ret;
d4077e8175f3 added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 64
diff changeset
3921 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
3922
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3923 MetadataHashes sync_set_metadata_properties(
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3924 SyncDirectory *dir,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3925 DavSession *sn,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3926 DavResource *res,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3927 LocalResource *local)
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3928 {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3929 MetadataHashes hashes = {NULL, NULL, NULL};
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3930 if(dir->tagconfig) {
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3931 // get local tags
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3932 DavBool changed = 0;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3933 char *tags_hash = NULL;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3934 UcxList *tags = sync_get_file_tags(dir, local, &changed, &tags_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3935 if(changed || local->tags_updated) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3936 hashes.tags = tags_hash;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3937
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3938 DavBool store_tags = TRUE;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3939 // get remote tags
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3940 UcxList *remote_tags = NULL;
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3941 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
3942 if(tagsprop) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3943 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
3944 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3945 char *remote_hash = create_tags_hash(remote_tags);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3946 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
3947 // the tags have changed on the server
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3948 switch(dir->tagconfig->conflict) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3949 case TAG_NO_CONFLICT: break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3950 case TAG_KEEP_LOCAL: break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3951 case TAG_KEEP_REMOTE: {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3952 store_tags = FALSE;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3953 local->tags_updated = FALSE;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3954 break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3955 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3956 case TAG_MERGE: {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3957 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
3958 free_taglist(tags);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3959 tags = new_tags;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3960 break;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3961 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3962 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3963 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3964
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3965 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
3966 // 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
3967 // 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
3968 add_tag_colors(tags, remote_tags);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3969 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3970
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3971 if(store_tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3972 if(tags) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3973 DavXmlNode *tagprop = create_xml_taglist(tags);
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3974 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
3975 } else {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
3976 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
3977 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3978 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3979
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3980 free_taglist(remote_tags);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3981 } else {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3982 if(tags_hash) {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3983 free(tags_hash);
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3984 }
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3985 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
3986 free_taglist(tags);
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3987 }
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3988
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3989 if(local->finfo_updated) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3990 struct stat s;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3991 s.st_mode = local->mode;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3992 s.st_mtime = local->last_modified;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3993 s.st_uid = local->uid;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3994 s.st_gid = local->gid;
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3995 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
3996 }
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
3997
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3998 if(local->xattr_updated) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
3999 if(local->xattr) {
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4000 resource_set_xattr(res, local->xattr);
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4001 hashes.xattr = strdup(local->xattr->hash);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4002 } else {
607
5dc7fe41e8f8 move some properties to new namespace
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 603
diff changeset
4003 dav_remove_property(res, "idavprops:xattributes");
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4004 }
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4005 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4006 return hashes;
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4007 }
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4008
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4009 int sync_update_metadata(
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4010 SyncDirectory *dir,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4011 DavSession *sn,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4012 DavResource *res,
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4013 LocalResource *local)
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4014 {
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4015 MetadataHashes hashes = sync_set_metadata_properties(dir, sn, res, local);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4016
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4017 int err = 0;
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
4018 if(dav_store(res)) {
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
4019 print_resource_error(sn, local->path);
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4020 err = 1;
370
ab9c5afdc243 pushing tags should work now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 369
diff changeset
4021 } else {
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4022 update_metadata_hashes(local, hashes);
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4023 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4024
523
923a4528a2ae adds support for pushing metadata updates
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 522
diff changeset
4025 return err;
369
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4026 }
4322b8953bd5 adds tag conflict detection for dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 368
diff changeset
4027
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4028 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
4029 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
4030 int numdc = 0;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4031
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4032 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
4033 LocalResource *res;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4034 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
4035 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
4036 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4037 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
4038 if(errno == ENOENT) {
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4039 dc[numdc] = res->path;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4040 numdc++;
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4041 } else {
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4042 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
4043 perror("");
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4044 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4045 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4046 free(path);
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4047 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4048
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4049 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
4050 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
4051 }
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4052
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4053 free(dc);
218
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4054 }
5f1f7602cf77 automatically remove deleted conflict files from the db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 217
diff changeset
4055
257
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4056 static void resolve_skipped(SyncDatabase *db) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4057 UcxKey k;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4058 LocalResource *res;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4059 UcxMapIterator i = ucx_map_iterator(db->resources);
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4060 int skipped = 0;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4061 UCX_MAP_FOREACH(k, res, i) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4062 if(res->skipped) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4063 skipped++;
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4064 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
4065 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4066 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4067 if(skipped > 0) {
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4068 fprintf(stderr,
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4069 " 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
4070 " 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
4071 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4072 }
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4073
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4074 int cmd_resolve_conflicts(CmdArgs *a) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4075 if(a->argc != 1) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4076 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
4077 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4078 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4079
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4080 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
4081 if(!dir) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4082 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
4083 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4084 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4085 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4086 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4087 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4088
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4089 SyncDatabase *db = load_db(dir->database);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4090 if(!db) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4091 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
4092 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4093 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4094
257
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4095 resolve_skipped(db);
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4096
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4097 int ret = 0;
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4098
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4099 // remove conflicts
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4100 int num_conflict = db->conflict->count;
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4101 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
4102 ucx_map_clear(db->conflict);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4103
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4104 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
4105 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
4106 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
4107 fprintf(stderr, "Abort\n");
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4108 ret = -2;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4109 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4110
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4111 // cleanup
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4112 destroy_db(db);
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4113
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4114 // Report
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4115 if(ret != -2) {
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4116 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
4117 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
4118 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4119
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4120 return ret;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4121 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4122
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4123 int cmd_delete_conflicts(CmdArgs *a) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4124 if(a->argc != 1) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4125 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
4126 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4127 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4128
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4129 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
4130 if(!dir) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4131 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
4132 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4133 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4134 if(scfg_check_dir(dir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4135 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4136 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4137
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4138 SyncDatabase *db = load_db(dir->database);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4139 if(!db) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4140 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
4141 return -1;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4142 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4143
257
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4144 resolve_skipped(db);
49f3c58cc06c fixes conflict detection in push command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 256
diff changeset
4145
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4146 int num_del = 0;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4147 int num_err = 0;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4148
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4149 int ret = 0;
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4150
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4151 // delete all conflict files
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4152 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
4153 LocalResource *res;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4154 UCX_MAP_FOREACH(key, res, i) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4155 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
4156 char *path = create_local_path(dir, res->path);
412
dc74f736aea1 adds more fs abstraction
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 411
diff changeset
4157 if(sys_unlink(path)) {
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4158 if(errno != ENOENT) {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4159 perror("unlink");
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4160 num_err++;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4161 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4162 } else {
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4163 num_del++;
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4164 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4165 free(path);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4166 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4167 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
4168 ucx_map_clear(db->conflict);
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4169
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4170 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
4171 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
4172 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
4173 fprintf(stderr, "Abort\n");
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4174 ret = -1;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4175 }
224
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4176
4b55f05f4e00 added more cleanup code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 223
diff changeset
4177 // cleanup
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4178 destroy_db(db);
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4179
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4180 // Report
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4181 if(ret == 0) {
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4182 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
4183 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
4184 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
4185 num_del, str_delete,
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4186 num_err, str_error);
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4187 }
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4188
222
7b73058d782e fixed some memory leaks in dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 221
diff changeset
4189 return ret;
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4190 }
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4191
563
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4192 int cmd_list_conflicts(CmdArgs *a) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4193 if(a->argc != 1) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4194 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
4195 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4196 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4197
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4198 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
4199 if(!dir) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4200 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
4201 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4202 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4203 if(scfg_check_dir(dir)) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4204 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4205 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4206
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4207 SyncDatabase *db = load_db(dir->database);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4208 if(!db) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4209 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
4210 return -1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4211 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4212
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4213 remove_deleted_conflicts(dir, db);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4214
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4215 // get all conflict sources
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4216 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
4217 LocalResource *res;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4218 UcxList* conflict_sources = NULL;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4219 UCX_MAP_FOREACH(key, res, i) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4220 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
4221 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4222
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4223 // print unique conflict sources
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4224 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
4225 UCX_FOREACH(elem, conflict_sources) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4226 char* path = elem->data;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4227 if(cmd_getoption(a, "verbose")) {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4228 int confl_count = 1;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4229 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
4230 elem = elem->next;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4231 ++confl_count;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4232 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4233 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
4234 } else {
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4235 printf("%s\n", path);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4236 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
4237 elem = elem->next;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4238 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4239 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4240 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4241
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4242 // cleanup
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4243 destroy_db(db);
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4244
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4245 return 0;
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4246 }
3dffe58a573f adds list-conflicts command to dav-sync
Mike Becker <universe@uap-core.de>
parents: 561
diff changeset
4247
217
12bad63cf5a8 added resolve-conflicts and delete-conflicts commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
4248
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4249 // 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
4250 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
4251 char *str = malloc(16);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4252
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4253 if(size < 0x400) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4254 snprintf(str, 16, "%" PRIu64 " bytes", size);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4255 } else if(size < 0x100000) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4256 float s = (float)size/0x400;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4257 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
4258 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4259 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4260 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4261 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4262 if(size < 0x2800 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4263 // size < 10 KiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4264 snprintf(str, 16, "%.1f KiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4265 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4266 snprintf(str, 16, "%.0f KiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4267 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4268 } else if(size < 0x40000000) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4269 float s = (float)size/0x100000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4270 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
4271 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4272 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4273 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4274 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4275 if(size < 0xa00000 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4276 // size < 10 MiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4277 snprintf(str, 16, "%.1f MiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4278 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4279 size /= 0x100000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4280 snprintf(str, 16, "%.0f MiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4281 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4282 } else if(size < 0x1000000000ULL) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4283 float s = (float)size/0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4284 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
4285 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4286 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4287 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4288 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4289 if(size < 0x280000000 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4290 // size < 10 GiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4291 snprintf(str, 16, "%.1f GiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4292 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4293 size /= 0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4294 snprintf(str, 16, "%.0f GiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4295 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4296 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4297 size /= 1024;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4298 float s = (float)size/0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4299 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
4300 if(diff > 90) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4301 diff = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4302 s += 0.10f;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4303 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4304 if(size < 0x280000000 && diff != 0) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4305 // size < 10 TiB
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4306 snprintf(str, 16, "%.1f TiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4307 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4308 size /= 0x40000000;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4309 snprintf(str, 16, "%.0f TiB", s);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4310 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4311 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4312 return str;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4313 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4314
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4315 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
4316 time_t now = res->lastmodified;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4317 struct tm *date = gmtime(&now);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4318 char str[32];
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4319 putenv("LC_TIME=C");
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4320 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
4321
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4322 printf("name: %s\n", name);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4323 printf("lastmodified: %s\n", str);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4324 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
4325 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
4326 printf("url: %s\n", url);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4327 free(server);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4328 free(url);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4329 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4330
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4331 int cmd_list_versions(CmdArgs *a) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4332 if(a->argc != 1) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4333 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
4334 return -1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4335 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4336
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4337 SyncFile file;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4338 int ret = 0;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4339 char *path = a->argv[0];
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4340
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4341 int err = sync_get_file(a, path, &file, TRUE);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4342 if(err) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4343 sync_print_get_file_err(path, err);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4344 return 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4345 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4346 SyncDirectory *dir = file.dir;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4347
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4348 if(!dir->versioning) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4349 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
4350 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4351
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4352 Repository *repo = get_repository(sstr(dir->repository));
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4353 if(!repo) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4354 fprintf(stderr, "Unknown repository %s\n", dir->repository);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4355 return -1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4356 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4357
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4358 SyncDatabase *db = load_db(dir->database);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4359 if(!db) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4360 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
4361 return -1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4362 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4363 remove_deleted_conflicts(dir, db);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4364
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4365 DavSession *sn = create_session(ctx, repo, dir->collection);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4366 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
4367 if (cmd_getoption(a, "verbose")) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4368 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4369 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4370 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4371
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4372 DavResource *res = dav_resource_new(sn, file.path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4373 if(dir->versioning->type == VERSIONING_SIMPLE) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4374 do {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4375 DavPropName p;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4376 p.ns = DAV_NS;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4377 p.name = VERSION_PATH_PROPERTY;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4378 if(dav_load_prop(res, &p, 1)) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4379 print_resource_error(sn, file.path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4380 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4381 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4382 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4383 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
4384 if(!vcol_href) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4385 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4386 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4387 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4388
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4389 DavResource *vcol = dav_resource_new_href(sn, vcol_href);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4390 if(!vcol) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4391 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4392 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4393 }
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4394
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4395 if(dav_load_prop(vcol, NULL, 0)) {
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4396 print_resource_error(sn, vcol->path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4397 ret = 1;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4398 break;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4399 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4400
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4401 DavResource *child = vcol->children;
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4402 UcxList *children = NULL;
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4403 while(child) {
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4404 children = ucx_list_append(children, child);
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4405 child = child->next;
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4406 }
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4407 children = ucx_list_sort(children, ucx_cmp_str, NULL);
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4408
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4409 DavBool first = 1;
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4410 UCX_FOREACH(elm, children) {
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4411 DavResource *c = elm->data;
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4412 if(!first) {
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4413 putchar('\n');
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4414 }
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4415 print_resource_version(c, c->name);
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4416 first = 0;
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4417 }
530
29e660161b73 changes list-versions output
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 529
diff changeset
4418 ucx_list_free(children);
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4419 } while(0);
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4420 } else if(dir->versioning->type == VERSIONING_DELTAV) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4421 DavResource *versions = dav_versiontree(res, NULL);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4422 DavResource *v = versions;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4423 DavBool first = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4424 while(v) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4425 if(!first) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4426 putchar('\n');
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4427 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4428 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
4429 print_resource_version(v, vname);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4430 first = 0;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4431 v = v->next;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4432 }
529
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4433 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4434
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4435 free(file.path);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4436 dav_session_destroy(sn);
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4437
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4438 return ret;
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4439 }
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4440
dc3f82b04733 adds list-versions command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 528
diff changeset
4441
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4442 int cmd_trash_info(CmdArgs *a) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4443 if(a->argc != 1) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4444 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
4445 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4446 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4447
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4448 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
4449 if(!syncdir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4450 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
4451 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4452 }
233
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4453 if(scfg_check_dir(syncdir)) {
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4454 return -1;
d8042cede66c improved dav-sync error handling on startup
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 228
diff changeset
4455 }
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4456
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4457 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
4458 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
4459 return 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4460 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4461
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4462 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
4463 if(!dir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4464 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
4465 perror("opendir");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4466 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4467 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4468
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4469 uint64_t trashsize = 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4470 int count = 0;
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4471 SysDirEnt *ent;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4472 while((ent = sys_readdir(dir)) != NULL) {
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4473 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
4474 continue;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4475 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4476
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4477 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
4478
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4479 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4480 if(sys_stat(path, &s)) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4481 perror("stat");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4482 } else {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4483 trashsize += s.st_size;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4484 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4485 count++;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4486
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4487 free(path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4488 }
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4489 sys_closedir(dir);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4490
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4491 printf("path: %s\n", syncdir->trash);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4492 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
4493 char *sizestr = size_str(trashsize);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4494 printf("%s\n", sizestr);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4495 free(sizestr);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4496
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4497 return 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4498 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4499
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4500
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4501 int cmd_empty_trash(CmdArgs *a) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4502 if(a->argc != 1) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4503 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
4504 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4505 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4506
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4507 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
4508 if(!syncdir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4509 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
4510 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4511 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4512
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4513 if(!syncdir->trash) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4514 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
4515 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4516 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4517
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4518 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
4519 if(!dir) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4520 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
4521 perror("opendir");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4522 return -1;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4523 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4524
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4525 SysDirEnt *ent;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4526 while((ent = sys_readdir(dir)) != NULL) {
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4527 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
4528 continue;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4529 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4530
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4531 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
4532 printf("delete: %s\n", path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4533
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4534 SYS_STAT s;
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4535 if(sys_stat(path, &s)) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4536 perror("stat");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4537 free(path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4538 continue;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4539 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4540 if(S_ISDIR(s.st_mode)) {
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4541 if(rmdir(path)) {
274
5577d3eae04c dav-sync command documentation complete
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 272
diff changeset
4542 perror("rmdir");
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4543 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4544 } else {
412
dc74f736aea1 adds more fs abstraction
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 411
diff changeset
4545 if(sys_unlink(path)) {
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4546 perror("unlink");
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4547 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4548 }
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4549
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4550 free(path);
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4551 }
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4552 sys_closedir(dir);
204
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4553
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4554 return 0;
4f0207044837 added trash-info and empty-trash commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 200
diff changeset
4555 }
47
fbbbeed4ba8f added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 46
diff changeset
4556
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4557 #define CMD_TAG_ADD 0
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4558 #define CMD_TAG_REMOVE 1
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
4559 #define CMD_TAG_SET 2
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4560 #define CMD_TAG_LIST 3
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4561 int cmd_add_tag(CmdArgs *args) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4562 if(args->argc != 2) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4563 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
4564 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4565 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4566 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
4567 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4568
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4569 int cmd_remove_tag(CmdArgs *args) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4570 if(args->argc != 2) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4571 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
4572 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4573 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4574 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
4575 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4576
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
4577 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
4578 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
4579 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
4580 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4581 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4582 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
4583 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4584
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4585 int cmd_list_tags(CmdArgs *args) {
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4586 if(args->argc != 1) {
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4587 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
4588 return -1;
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4589 }
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4590 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
4591 }
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4592
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4593 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
4594 SyncFile file;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4595 int ret = 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4596 char *path = args->argv[0];
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4597
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4598 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
4599 if(err) {
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4600 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
4601 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4602 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4603
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4604 if(!file.dir->tagconfig) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4605 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
4606 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4607 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4608
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4609 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
4610 if(!db) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4611 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
4612 return -1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4613 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4614
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4615 LocalResource *localres = ucx_map_cstr_get(db->resources, file.path);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4616 UcxList *tags = NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4617 DavBool store_tags = FALSE;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4618
380
8a0c727aa409 adds tag filter for dav-sync pull
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 379
diff changeset
4619 if(cmd != CMD_TAG_SET) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4620 char *tag = args->argv[1];
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4621 char *tagcolor = NULL; // TODO: get color
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4622
525
26a1d5b9d9d2 improves metadata support in dav-sync push
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 524
diff changeset
4623 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
4624 UcxList *x = NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4625 UCX_FOREACH(elm, tags) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4626 DavTag *t = elm->data;
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4627 if(cmd == CMD_TAG_LIST) {
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4628 printf("%s\n", t->name);
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4629 } 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
4630 x = elm;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4631 break;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4632 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4633 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4634
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4635 if(cmd == CMD_TAG_ADD) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4636 if(!x) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4637 DavTag *newtag = malloc(sizeof(DavTag));
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4638 newtag->name = tag;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4639 newtag->color = tagcolor;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4640 tags = ucx_list_append(tags, newtag);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4641 store_tags = TRUE;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4642 }
377
d6d7c16dd066 adds list-tags command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
4643 } 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
4644 if(tags) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4645 tags = ucx_list_remove(tags, x);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4646 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4647 store_tags = TRUE;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4648 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4649 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4650 if(args->argc == 2) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4651 char *tags_str = args->argv[1];
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4652 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
4653 store_tags = TRUE;
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4654 // 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
4655 } else if (args->argc == 1) {
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
4656 store_tags = TRUE;
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
4657 } else {
17ccf828a2f2 fixes dav-sync set-tags without tag string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 380
diff changeset
4658 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
4659 ret = -1;
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4660 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4661 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4662
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4663 if(store_tags) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4664 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
4665 fprintf(stderr, "Cannot store tags\n");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4666 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4667 if(localres) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4668 localres->tags_updated = TRUE;
379
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
4669 if(!tags) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
4670 if(localres->tags_hash) {
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
4671 free(localres->tags_hash);
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
4672 }
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
4673 localres->tags_hash = NULL;
cdaf5a3d3a50 fixes tag syncing
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 378
diff changeset
4674 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4675 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4676 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4677
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4678 // store db
521
c5bbae4b3cca extends sync db
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
4679 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
4680 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
4681 ret = -2;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4682 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4683
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4684 free(file.path);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4685 return ret;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4686 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4687
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4688 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
4689 char *fullpath;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4690 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
4691 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
4692 char *wd = malloc(wdlen);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4693 while(!getcwd(wd, wdlen)) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4694 if(errno == ERANGE) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4695 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
4696 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
4697 if (newbuf) {
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
4698 wd = newbuf;
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
4699 } else {
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
4700 free(wd);
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
4701 return 0;
99193580aa9d fixes realloc problem and memory leak in isfileindir() in sync.c
Mike Becker <universe@uap-core.de>
parents: 381
diff changeset
4702 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4703 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4704 free(wd);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4705 return 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4706 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4707 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4708
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4709 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
4710 free(wd);
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4711 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4712 fullpath = strdup(path);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4713 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4714
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4715 // TODO: normalize path
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4716 DavBool not_in_dir = 0;
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4717
531
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4718 scstr_t fp = scstr(fullpath);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4719 scstr_t dp = scstr(dir->path);
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4720 if(fp.length == dp.length) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4721 if(sstrcmp(fp, dp)) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4722 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4723 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4724 } else if(fp.length < dp.length) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4725 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4726 } else {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4727 if(!sstrprefix(fp, dp)) {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4728 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4729 } else {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4730 if(dp.ptr[dp.length-1] == '/') {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4731 dp.length--;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4732 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4733 if(fp.ptr[dp.length] != '/') {
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4734 not_in_dir = 1;
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4735 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4736 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4737 }
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4738
fa54e3a1250a implements list-versions for deltav syncdirs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 530
diff changeset
4739 if(not_in_dir) {
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4740 free(fullpath);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4741 return 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4742 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4743
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4744 // TODO: check filter
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4745
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4746 f->dir = dir;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4747 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
4748
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4749 free(fullpath);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4750 return 1;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4751 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4752
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4753 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
4754 if(dostat) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4755 SYS_STAT s;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4756 if(sys_stat(path, &s)) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4757 switch(errno) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4758 case EACCES: return 2;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4759 case ENOENT: return 1;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4760 default: return 3;
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4761 }
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4762 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4763 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4764
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4765 char *sdir = cmd_getoption(args, "syncdir");
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4766
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4767 if(sdir) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4768 SyncDirectory *dir = scfg_get_dir(sdir);
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4769 if(!dir) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4770 return 6;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4771 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4772 if(!isfileindir(dir, path, f)) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4773 return 4;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4774 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4775 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4776 SyncDirectory *target = NULL;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4777
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4778 UcxMapIterator i = scfg_directory_iterator();
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4779 UcxKey k;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4780 SyncDirectory *dir;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4781 UCX_MAP_FOREACH(key, dir, i) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4782 if(isfileindir(dir, path, f)) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4783 if(target) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4784 return 5;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4785 } else {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4786 target = dir;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4787 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4788 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4789 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4790
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4791 if(!target) {
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4792 return 4;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4793 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4794 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4795
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4796 return 0;
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4797 }
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4798
527
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4799 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
4800 switch(err) {
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4801 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
4802 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
4803 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
4804 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
4805 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
4806 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
4807 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4808 }
d0e37224eba1 adds possibility to restore specific files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 526
diff changeset
4809
372
2e15ff88a0ab adds tag management commands to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 370
diff changeset
4810
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4811 int cmd_add_directory(CmdArgs *args) {
294
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
4812 if(!get_repositories()) {
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
4813 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
4814 fprintf(stderr, "Abort\n");
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
4815 return -1;
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
4816 }
dd5c0ebdf54f fixes dav startup without .dav dir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 288
diff changeset
4817
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4818 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
4819 char *name = assistant_getcfg("name");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4820 if(!name) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4821 fprintf(stderr, "Abort\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4822 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4823 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4824 if(scfg_get_dir(name)) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4825 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
4826 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4827 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4828
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4829 printf("Enter local directory path.\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4830 char *path = assistant_getcfg("path");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4831 if(!path) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4832 fprintf(stderr, "Abort\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4833 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4834 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4835
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4836 printf("Specify webdav repository.\n");
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4837 UcxList *repos = get_repositories();
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4838 int i = 0;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4839 UCX_FOREACH(elm, repos) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4840 Repository *r = elm->data;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4841 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
4842 i++;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4843 }
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4844 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
4845 char *reponame = NULL;
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4846 if(!repository) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4847 fprintf(stderr, "Abort\n");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4848 return -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4849 }
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4850 int64_t reponum = 0;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4851 if(util_strtoint(repository, &reponum)) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4852 if(reponum < 0) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4853 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
4854 return -1;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4855 }
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4856 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
4857 if(elm) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4858 Repository *r = elm->data;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4859 reponame = r->name;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4860 } else {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4861 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
4862 return -1;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4863 }
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4864 } else {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4865 if(get_repository(sstr(repository))) {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4866 reponame = repository;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4867 } else {
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4868 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
4869 return -1;
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4870 }
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4871 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4872
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4873 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
4874 char *collection = assistant_getdefcfg("collection", "/");
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4875
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4876 char *db = generate_db_name(name);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4877
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4878 SyncDirectory dir;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4879 memset(&dir, 0, sizeof(SyncDirectory));
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4880 dir.name = name;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4881 dir.path = path;
215
781aee172901 dav-sync add-directory shows list of repositories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
4882 dir.repository = reponame;
200
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4883 dir.collection = collection;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4884 dir.trash = ".trash";
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4885 dir.database = db;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4886
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4887 int ret = 0;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4888 if(add_directory(&dir)) {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4889 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
4890 ret = -1;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4891 } else {
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4892 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
4893 }
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4894
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4895 free(name);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4896 free(path);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4897 free(repository);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4898 free(collection);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4899 free(db);
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4900
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4901 return ret;
cc474cf2c2f5 added add-directory command to dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 199
diff changeset
4902 }
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
4903
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4904 int cmd_list_dirs() {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4905 UcxMapIterator iter = scfg_directory_iterator();
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4906 SyncDirectory *dir;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4907 UCX_MAP_FOREACH(key, dir, iter) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4908 printf("%s\n", dir->name);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4909 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4910 return 0;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4911 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4912
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
4913 int cmd_check_repositories() {
256
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4914 int ret = EXIT_SUCCESS;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4915
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4916 UcxList *reponames = NULL;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4917 {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4918 UcxMapIterator iter = scfg_directory_iterator();
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4919 SyncDirectory *dir;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4920 UCX_MAP_FOREACH(key, dir, iter) {
505
481802342fdf ucx update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 504
diff changeset
4921 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
4922 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4923 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4924
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4925 UCX_FOREACH(listelem, reponames) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4926 char *reponame = listelem->data;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4927 printf("Checking %s... ", reponame);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4928 Repository* repo = get_repository(sstr(reponame));
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4929 if (!repo) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4930 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
4931 ret = EXIT_FAILURE;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4932 } else {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4933 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
4934 if (sn) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4935 DavResource *res = dav_query(sn,
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4936 "select - from / with depth = 0");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4937 if (res) {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4938 printf("OK.\n");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4939 dav_resource_free(res);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4940 } else {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4941 printf("unavailable!\n");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4942 ret = EXIT_FAILURE;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4943 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4944 dav_session_destroy(sn);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4945 } else {
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4946 printf("cannot create session!\n");
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4947 ret = EXIT_FAILURE;
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4948 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4949 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4950 }
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4951
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4952 ucx_list_free(reponames);
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4953
54433cb371df implements check-repositories command for dav-sync
Mike Becker <universe@uap-core.de>
parents: 254
diff changeset
4954 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
4955 }
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
4956
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
4957 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
4958 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
4959 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
4960 free(fname.ptr);
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
4961
411
a182e503617b using new io abstraction in dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 405
diff changeset
4962 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
4963 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
4964 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
4965 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
4966 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
4967 } else {
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
4968 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
4969 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
4970 return NULL;
296
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
4971 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
4972 }
bb49953b1cf8 dav-sync writes the locktoken to a file now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 294
diff changeset
4973
542
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4974 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
4975 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
4976 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
4977 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
4978 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
4979 if(enc_hash && keyname) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4980 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
4981 if(!key) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4982 return NULL;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4983 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4984
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4985 size_t len = 0;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4986 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
4987 if(!dec_hash) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4988 return NULL;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4989 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4990
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4991 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
4992 free(dec_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4993 return hex_hash;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4994 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4995 } else {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4996 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
4997 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4998 return NULL;
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
4999 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5000
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
5001 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
5002 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
5003 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
5004 if(res->session->key) {
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
5005 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
5006 if(enc_hash) {
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5007 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
5008 free(enc_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5009 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5010 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5011 } else {
558
1a9e6a5c1e79 fixes several signedness issues
Mike Becker <universe@uap-core.de>
parents: 557
diff changeset
5012 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
5013 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
5014 free(hex_hash);
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5015 }
060a8cda7f62 adds wrapper functions for setting/getting the content hash
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
5016 }

mercurial