3031 } |
3031 } |
3032 } |
3032 } |
3033 return str; |
3033 return str; |
3034 } |
3034 } |
3035 |
3035 |
|
3036 void print_resource_version(DavResource *res, char *name) { |
|
3037 time_t now = res->lastmodified; |
|
3038 struct tm *date = gmtime(&now); |
|
3039 char str[32]; |
|
3040 putenv("LC_TIME=C"); |
|
3041 size_t len = strftime(str, 32, "%a, %d %b %Y %H:%M:%S GMT", date); |
|
3042 |
|
3043 printf("name: %s\n", name); |
|
3044 printf("lastmodified: %s\n", str); |
|
3045 char *server = util_url_base(res->session->base_url); |
|
3046 char *url = util_concat_path(server, res->href); |
|
3047 printf("url: %s\n", url); |
|
3048 free(server); |
|
3049 free(url); |
|
3050 } |
|
3051 |
3036 int cmd_list_versions(CmdArgs *a) { |
3052 int cmd_list_versions(CmdArgs *a) { |
3037 if(a->argc != 1) { |
3053 if(a->argc != 1) { |
3038 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
3054 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
3039 return -1; |
3055 return -1; |
3040 } |
3056 } |
3112 children = ucx_list_sort(children, ucx_cmp_str, NULL); |
3128 children = ucx_list_sort(children, ucx_cmp_str, NULL); |
3113 |
3129 |
3114 DavBool first = 1; |
3130 DavBool first = 1; |
3115 UCX_FOREACH(elm, children) { |
3131 UCX_FOREACH(elm, children) { |
3116 DavResource *c = elm->data; |
3132 DavResource *c = elm->data; |
3117 time_t now = c->lastmodified; |
|
3118 struct tm *date = gmtime(&now); |
|
3119 char str[32]; |
|
3120 putenv("LC_TIME=C"); |
|
3121 size_t len = strftime(str, 32, "%a, %d %b %Y %H:%M:%S GMT", date); |
|
3122 |
|
3123 if(!first) { |
3133 if(!first) { |
3124 putchar('\n'); |
3134 putchar('\n'); |
3125 } |
3135 } |
3126 printf("name: %s\n", c->name); |
3136 print_resource_version(c, c->name); |
3127 printf("lastmodified: %s\n", str); |
|
3128 char *server = util_url_base(sn->base_url); |
|
3129 char *url = util_concat_path(server, c->href); |
|
3130 printf("url: %s\n", url); |
|
3131 free(server); |
|
3132 free(url); |
|
3133 first = 0; |
3137 first = 0; |
3134 } |
3138 } |
3135 ucx_list_free(children); |
3139 ucx_list_free(children); |
3136 } while(0); |
3140 } while(0); |
|
3141 } else if(dir->versioning->type == VERSIONING_DELTAV) { |
|
3142 DavResource *versions = dav_versiontree(res, NULL); |
|
3143 DavResource *v = versions; |
|
3144 DavBool first = 1; |
|
3145 while(v) { |
|
3146 if(!first) { |
|
3147 putchar('\n'); |
|
3148 } |
|
3149 char *vname = dav_get_string_property(v, "D:version-name"); |
|
3150 print_resource_version(v, vname); |
|
3151 first = 0; |
|
3152 v = v->next; |
|
3153 } |
3137 } |
3154 } |
3138 |
3155 |
3139 free(file.path); |
3156 free(file.path); |
3140 dav_session_destroy(sn); |
3157 dav_session_destroy(sn); |
3141 |
3158 |
3415 } else { |
3432 } else { |
3416 fullpath = strdup(path); |
3433 fullpath = strdup(path); |
3417 } |
3434 } |
3418 |
3435 |
3419 // TODO: normalize path |
3436 // TODO: normalize path |
3420 |
3437 DavBool not_in_dir = 0; |
3421 if(!sstrprefix(sstr((char*)fullpath), sstr(dir->path))) { |
3438 |
|
3439 scstr_t fp = scstr(fullpath); |
|
3440 scstr_t dp = scstr(dir->path); |
|
3441 if(fp.length == dp.length) { |
|
3442 if(sstrcmp(fp, dp)) { |
|
3443 not_in_dir = 1; |
|
3444 } |
|
3445 } else if(fp.length < dp.length) { |
|
3446 not_in_dir = 1; |
|
3447 } else { |
|
3448 if(!sstrprefix(fp, dp)) { |
|
3449 not_in_dir = 1; |
|
3450 } else { |
|
3451 if(dp.ptr[dp.length-1] == '/') { |
|
3452 dp.length--; |
|
3453 } |
|
3454 if(fp.ptr[dp.length] != '/') { |
|
3455 not_in_dir = 1; |
|
3456 } |
|
3457 } |
|
3458 } |
|
3459 |
|
3460 if(not_in_dir) { |
3422 free(fullpath); |
3461 free(fullpath); |
3423 return 0; |
3462 return 0; |
3424 } |
3463 } |
3425 |
3464 |
3426 // TODO: check filter |
3465 // TODO: check filter |
3481 void sync_print_get_file_err(const char *path, int err) { |
3520 void sync_print_get_file_err(const char *path, int err) { |
3482 switch(err) { |
3521 switch(err) { |
3483 case 1: fprintf(stderr, "File %s: not found\n", path); break; |
3522 case 1: fprintf(stderr, "File %s: not found\n", path); break; |
3484 case 2: fprintf(stderr, "File %s: permission denied\n"); break; |
3523 case 2: fprintf(stderr, "File %s: permission denied\n"); break; |
3485 case 3: fprintf(stderr, "File %s: stat failed: %s\n", path, strerror(errno)); break; |
3524 case 3: fprintf(stderr, "File %s: stat failed: %s\n", path, strerror(errno)); break; |
3486 case 4: fprintf(stderr, "File %s is not in any syncdir\n"); break; |
3525 case 4: fprintf(stderr, "File %s is not in any syncdir\n", path); break; |
3487 case 5: fprintf(stderr, "File %s is in multiple syncdirs\n"); break; |
3526 case 5: fprintf(stderr, "File %s is in multiple syncdirs\n", path); break; |
3488 case 6: fprintf(stderr, "Syncdir not found\n"); break; |
3527 case 6: fprintf(stderr, "Syncdir not found\n"); break; |
3489 } |
3528 } |
3490 } |
3529 } |
3491 |
3530 |
3492 |
3531 |