146 stop_sighandler(&mutex, tid); |
146 stop_sighandler(&mutex, tid); |
147 } else if(!strcmp(cmd, "resolve-conflicts")) { |
147 } else if(!strcmp(cmd, "resolve-conflicts")) { |
148 ret = cmd_resolve_conflicts(args); |
148 ret = cmd_resolve_conflicts(args); |
149 } else if(!strcmp(cmd, "delete-conflicts")) { |
149 } else if(!strcmp(cmd, "delete-conflicts")) { |
150 ret = cmd_delete_conflicts(args); |
150 ret = cmd_delete_conflicts(args); |
|
151 } else if(!strcmp(cmd, "list-versions")) { |
|
152 ret = cmd_list_versions(args); |
151 } else if(!strcmp(cmd, "trash-info")) { |
153 } else if(!strcmp(cmd, "trash-info")) { |
152 ret = cmd_trash_info(args); |
154 ret = cmd_trash_info(args); |
153 } else if(!strcmp(cmd, "empty-trash")) { |
155 } else if(!strcmp(cmd, "empty-trash")) { |
154 ret = cmd_empty_trash(args); |
156 ret = cmd_empty_trash(args); |
155 } else if(!strcmp(cmd, "add-tag")) { |
157 } else if(!strcmp(cmd, "add-tag")) { |
192 |
194 |
193 fprintf(stderr, "Commands:\n"); |
195 fprintf(stderr, "Commands:\n"); |
194 fprintf(stderr, " pull [-cldr] [-t <tags>] <directory>\n"); |
196 fprintf(stderr, " pull [-cldr] [-t <tags>] <directory>\n"); |
195 fprintf(stderr, " push [-cldrVRM] [-t <tags>] <directory>\n"); |
197 fprintf(stderr, " push [-cldrVRM] [-t <tags>] <directory>\n"); |
196 fprintf(stderr, " archive [-cldVRM] [-t <tags>] <directory>\n"); |
198 fprintf(stderr, " archive [-cldVRM] [-t <tags>] <directory>\n"); |
197 fprintf(stderr, " restore [-ld] [-s <directory>] [file...]\n"); |
199 fprintf(stderr, " restore [-ldRM] [-s <directory>] [file...]\n"); |
198 fprintf(stderr, " resolve-conflicts <directory>\n"); |
200 fprintf(stderr, " resolve-conflicts <directory>\n"); |
199 fprintf(stderr, " delete-conflicts <directory>\n"); |
201 fprintf(stderr, " delete-conflicts <directory>\n"); |
200 fprintf(stderr, " trash-info <directory>\n"); |
202 fprintf(stderr, " trash-info <directory>\n"); |
201 fprintf(stderr, " empty-trash <directory>\n"); |
203 fprintf(stderr, " empty-trash <directory>\n"); |
202 fprintf(stderr, " add-tag [-s <syncdir>] <file> <tag>\n"); |
204 fprintf(stderr, " add-tag [-s <syncdir>] <file> <tag>\n"); |
3029 } |
3031 } |
3030 } |
3032 } |
3031 return str; |
3033 return str; |
3032 } |
3034 } |
3033 |
3035 |
|
3036 int cmd_list_versions(CmdArgs *a) { |
|
3037 if(a->argc != 1) { |
|
3038 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
|
3039 return -1; |
|
3040 } |
|
3041 |
|
3042 SyncFile file; |
|
3043 int ret = 0; |
|
3044 char *path = a->argv[0]; |
|
3045 |
|
3046 int err = sync_get_file(a, path, &file, TRUE); |
|
3047 if(err) { |
|
3048 sync_print_get_file_err(path, err); |
|
3049 return 1; |
|
3050 } |
|
3051 SyncDirectory *dir = file.dir; |
|
3052 |
|
3053 if(!dir->versioning) { |
|
3054 fprintf(stderr, "No versioning configured for syncdir %s\n", dir->name); |
|
3055 } |
|
3056 |
|
3057 Repository *repo = get_repository(sstr(dir->repository)); |
|
3058 if(!repo) { |
|
3059 fprintf(stderr, "Unknown repository %s\n", dir->repository); |
|
3060 return -1; |
|
3061 } |
|
3062 |
|
3063 SyncDatabase *db = load_db(dir->database); |
|
3064 if(!db) { |
|
3065 fprintf(stderr, "Cannot load database file: %s\n", dir->database); |
|
3066 return -1; |
|
3067 } |
|
3068 remove_deleted_conflicts(dir, db); |
|
3069 |
|
3070 DavSession *sn = create_session(ctx, repo, dir->collection); |
|
3071 ucx_mempool_reg_destr(sn->mp, db, (ucx_destructor)destroy_db); |
|
3072 if (cmd_getoption(a, "verbose")) { |
|
3073 curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L); |
|
3074 curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); |
|
3075 } |
|
3076 |
|
3077 DavResource *res = dav_resource_new(sn, file.path); |
|
3078 if(dir->versioning->type == VERSIONING_SIMPLE) { |
|
3079 do { |
|
3080 DavPropName p; |
|
3081 p.ns = DAV_NS; |
|
3082 p.name = VERSION_PATH_PROPERTY; |
|
3083 if(dav_load_prop(res, &p, 1)) { |
|
3084 print_resource_error(sn, file.path); |
|
3085 ret = 1; |
|
3086 break; |
|
3087 } |
|
3088 char *vcol_href = dav_get_string_property_ns(res, DAV_NS, VERSION_PATH_PROPERTY); |
|
3089 if(!vcol_href) { |
|
3090 ret = 1; |
|
3091 break; |
|
3092 } |
|
3093 |
|
3094 DavResource *vcol = dav_resource_new_href(sn, vcol_href); |
|
3095 if(!vcol) { |
|
3096 ret = 1; |
|
3097 break; |
|
3098 } |
|
3099 |
|
3100 if(dav_load_prop(vcol, NULL, 0)) { |
|
3101 print_resource_error(sn, vcol->path); |
|
3102 ret = 1; |
|
3103 break; |
|
3104 } |
|
3105 |
|
3106 DavResource *child = vcol->children; |
|
3107 while(child) { |
|
3108 time_t now = child->lastmodified; |
|
3109 struct tm *date = gmtime(&now); |
|
3110 char str[32]; |
|
3111 putenv("LC_TIME=C"); |
|
3112 size_t len = strftime(str, 32, "%a, %d %b %Y %H:%M:%S GMT", date); |
|
3113 |
|
3114 printf("%s%32s\n", str, child->name); |
|
3115 |
|
3116 child = child->next; |
|
3117 } |
|
3118 } while(0); |
|
3119 } |
|
3120 |
|
3121 free(file.path); |
|
3122 dav_session_destroy(sn); |
|
3123 |
|
3124 return ret; |
|
3125 } |
|
3126 |
|
3127 |
3034 int cmd_trash_info(CmdArgs *a) { |
3128 int cmd_trash_info(CmdArgs *a) { |
3035 if(a->argc != 1) { |
3129 if(a->argc != 1) { |
3036 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
3130 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
3037 return -1; |
3131 return -1; |
3038 } |
3132 } |