dav/main.c

changeset 431
1e8592657a01
parent 425
ae4d89c3477c
child 432
a213ecaf3f4a
--- a/dav/main.c	Sun Jun 24 12:44:05 2018 +0200
+++ b/dav/main.c	Thu Jun 28 16:52:54 2018 +0200
@@ -75,7 +75,7 @@
         print_usage(argv[0]);
         return -1;
     }
-    
+       
     char *cmd = argv[1];
     CmdArgs *args = cmd_parse_args(argc - 2, argv + 2);
     if(!args) {
@@ -155,6 +155,8 @@
         } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version")
                 || !strcasecmp(cmd, "--version")) {
             fprintf(stderr, "dav %s\n", DAV_VERSION);
+        } else if(!strcasecmp(cmd, "complete")) {
+            ret = shell_completion(args);
         } else {
             print_usage(argv[0]);
         }
@@ -2007,3 +2009,160 @@
         return -1;
     }
 }
+
+
+int shell_completion(CmdArgs *args) {
+    if(args->argc < 2) {
+        return 1;
+    }
+    
+    char *index_str = args->argv[0];
+    int64_t index = 0;
+    if(!util_strtoint(index_str, &index)) {
+        return 1;
+    }
+    
+    if(index == 1) {
+        sstr_t prefix = { NULL, 0 };
+        if(args->argc > 2) {
+            prefix = sstr(args->argv[2]);
+        }
+        for(int i=0;;i++) {
+            char *str = cmdusageinfo[i];
+            if(!str) {
+                break;
+            }
+            int len = (int)strlen(str);
+            int maxlen = len;
+            for(int w=0;w<len;w++) {
+                if(str[w] == ' ') {
+                    maxlen = w;
+                    break;
+                }
+            }
+            if(prefix.ptr) {
+                if(!sstrprefix(sstrn(str, maxlen), prefix)) {
+                    continue;
+                }
+            }
+            printf("%.*s\n", (int)maxlen, str);
+        }
+        return 0;
+    }
+    
+    char *cmd = args->argv[2];
+    if(!strcmp(cmd, "date")) {
+        return 0;
+    }
+    char *url = args->argv[3];
+    
+    //printf("index: {%s}\n", args->argv[0]);
+    //printf("dav: {%s}\n", args->argv[1]);
+    //printf("cmd: {%s}\n", cmd);
+    //printf("url: {%s}\n", url);
+    //printf("file: {%s}\n", file);
+    
+    if(index == 2) {
+        // url completion
+        return url_completion(url);
+    } else if (index == 3) {
+        if(!strcmp(cmd, "put") || !strcmp(cmd, "import")) {
+            // file completion
+            return 12;            
+        } else if(!strcmp(cmd, "copy") || !strcmp(cmd, "cp") || !strcmp(cmd, "move") || !strcmp(cmd, "mv")) {
+            // url completion
+            return url_completion(url);
+        }
+    }
+    
+    return 0;
+}
+
+int url_completion(char *u) {
+    sstr_t url = sstr(u);
+    
+    // repo completion
+    int repocomp = 1;
+    for(int i=0;i<url.length;i++) {
+        if(url.ptr[i] == '/') {
+            repocomp = 0;
+            break;
+        }
+    }
+    if(repocomp) {
+        UcxList *repos = get_repositories();
+        UCX_FOREACH(elm, repos) {
+            Repository *repo = elm->data;
+            if(sstrprefix(sstr(repo->name), url)) {
+                printf("%s/\n", repo->name);
+            }
+            
+        }
+    } else {
+        // url completion
+        
+        CmdArgs a;
+        memset(&a, 0, sizeof(CmdArgs));
+        a.options = ucx_map_new(4);
+        ucx_map_cstr_put(a.options, "noinput", "");
+        
+        char *path = NULL;
+        Repository *repo = url2repo(u, &path);
+        DavSession *sn = connect_to_repo(repo, &a);
+        ucx_map_free(a.options);
+        if(!sn) {
+            return 0;
+        }
+        
+        size_t plen = strlen(path);
+        
+        sstr_t filter;
+        char *lspath = NULL;
+        if(path[plen-1] == '/') {
+            lspath = strdup(path);
+            filter = S("");
+        } else {
+            lspath = util_parent_path(path);
+            filter = sstr(util_resource_name(path));
+        }
+        
+        DavResource *ls = dav_query(sn, "select - from %s", lspath);
+        DavResource *elm = ls->children;
+        while(elm) {
+            sstr_t name = sstr(elm->name); 
+            if(sstrprefix(name, filter)) {
+                int space = 0;
+                for(int i=0;i<name.length;i++) {
+                    if(name.ptr[i] == ' ') {
+                        space = 1;
+                        break;
+                    }
+                }
+                
+                UcxBuffer *out = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
+                ucx_buffer_puts(out, repo->name);
+                if(space) {
+                    size_t l = strlen(elm->path);
+                    for(int i=0;i<l;i++) {
+                        if(elm->path[i] == ' ') {
+                            ucx_buffer_puts(out, "\\ ");
+                        } else {
+                            ucx_buffer_putc(out, elm->path[i]);
+                        }
+                    }
+                } else {
+                    ucx_buffer_puts(out, elm->path);
+                }
+                if(elm->iscollection) {
+                    ucx_buffer_putc(out, '/');
+                }
+                printf("%.*s\n", (int)out->pos, out->space);
+            }
+            elm = elm->next;
+        }
+        
+        
+    }
+    
+    return 10;
+}

mercurial