dav/main.c

changeset 181
a8f8cdbf85df
parent 180
5b58389ab9dd
child 182
ca07f14f7bfe
--- a/dav/main.c	Fri Oct 23 22:15:12 2015 +0200
+++ b/dav/main.c	Tue Jan 12 19:17:46 2016 +0100
@@ -106,6 +106,10 @@
         ret = cmd_remove(args);
     } else if(!strcasecmp(cmd, "mkdir") || !strcasecmp(cmd, "mkcol")) {
         ret = cmd_mkdir(args);
+    } else if(!strcasecmp(cmd, "copy") || !strcasecmp(cmd, "cp")) {
+        ret = cmd_move(args, true);
+    } else if(!strcasecmp(cmd, "move") || !strcasecmp(cmd, "mv")) {
+        ret = cmd_move(args, false);
     } else if(!strcasecmp(cmd, "date")) {
         ret = cmd_date(args);
     } else if(!strcasecmp(cmd, "set-property")) {
@@ -139,6 +143,8 @@
     fprintf(stderr, "        put [-pcR] [-k <key>] <url> <file>\n");
     fprintf(stderr, "        mkdir [-pc] [-k <key>] <url>\n");
     fprintf(stderr, "        remove [-pc] <url>\n");
+    fprintf(stderr, "        copy [-pc] <url> <url>\n");
+    fprintf(stderr, "        move [-pc] <url> <url>\n");
     fprintf(
             stderr,
             "        get-property [-pc] [-n <uri>] <url> <property>\n");
@@ -921,6 +927,42 @@
     return 0;
 }
 
+int cmd_move(CmdArgs *a, int cp) {
+    if(a->argc != 2) {
+        // TODO: change, when creation of multiple dirs is supported
+        fprintf(stderr, "Too %s arguments\n", a->argc < 2 ? "few":"many");
+        return -1;
+    }
+    
+    char *url1 = a->argv[0];
+    char *path1 = NULL;
+    Repository *repo1 = url2repo(url1, &path1);
+    
+    char *url2 = a->argv[1];
+    char *path2 = NULL;
+    Repository *repo2 = url2repo(url2, &path2);
+    
+    DavSession *sn = connect_to_repo(repo1);
+    if(set_session_config(sn, a)) {
+        return -1;
+    }
+    
+    if(repo1 == repo2) {
+        DavResource *res = dav_resource_new(sn, path1);
+        int err = cp ? dav_copy(res, path2) : dav_move(res, path2);
+        if(err) {
+            print_resource_error(sn, res->path);
+            fprintf(stderr, "Cannot %s resource.\n", cp ? "copy" : "move");
+            return -1;
+        }
+    } else {
+        fprintf(stderr, "Copy or Move not supported for differend hosts.\n");
+        return -1;
+    }
+    
+    return 0;
+}
+
 
 static size_t get_date_header_cb(void *header, int s, int n, void *data) {
     char **date_str = (char**)data;

mercurial