dav/main.c

changeset 119
451607eeff05
parent 107
a0903d2d8e3e
child 123
806c4dccf2ae
--- a/dav/main.c	Thu May 28 14:34:46 2015 +0200
+++ b/dav/main.c	Fri May 29 09:48:10 2015 +0200
@@ -109,6 +109,8 @@
         ret = cmd_get_property(args);
     } else if(!strcasecmp(cmd, "info")) {
         ret = cmd_info(args);
+    } else if(!strcasecmp(cmd, "add-repository")) {
+        ret = cmd_add_repository(args);
     } else {
         print_usage(argv[0]);
     }
@@ -1118,3 +1120,120 @@
     }
 }
 
+/* ---------- config commands ---------- */
+
+static int getkeyvalue(char *arg, char **key, char **value) {
+    // splits a key=value arg
+    
+    *key = NULL;
+    *value = NULL;
+    if(!arg && !key && !value) {
+        return -1;
+    }
+    
+    int haskey = 0;
+    size_t len = strlen(arg);
+    
+    if(len < 3) {
+        return -1;
+    }
+    
+    int i;
+    for(i=0;i<len;i++) {
+        if(arg[i] == '=') {
+            haskey = 1;
+            break;
+        }
+    }
+    
+    if(haskey) {
+        sstr_t k = sstrn(arg, i);
+        sstr_t v = sstrn(arg+i + 1, len - i - 1);
+        if(k.length > 0 && v.length > 0) {
+            *key = sstrdup(k).ptr;
+            *value = sstrdup(v).ptr;
+            return 0;
+        }
+    }
+    
+    return -1;
+}
+
+void repository_assistent(Repository *repo, int mode) {
+    char *name = NULL;
+    sstr_t line;
+    
+    // name
+    while(!name) {
+        if(repo->name) {
+            printf("repository name [%s]: ", repo->name);
+        } else {
+            printf("repository name: ");
+        }
+        fflush(stdout);
+        
+        line = util_readline(stdin);
+        if(line.length == 0 && repo->name) {
+            break;
+        } else {
+            name = line.ptr;
+        }
+    }
+    if(name) {
+        if(repo->name) {
+            free(repo->name);
+        }
+        repo->name = name;
+    }
+    
+    // TODO
+    
+    return;
+}
+
+int cmd_add_repository(CmdArgs *a) {
+    char *interactive = cmd_getoption(a, "interactive");
+    
+    if(!interactive && a->argc < 2) {
+        fprintf(stderr, "Too few arguments\n");
+        fprintf(stderr, "Alternatively, use the interactive mode");
+        return -1;
+    }
+    
+    Repository *repo = repository_new();
+    // create repo object and fill config with cmd args
+    for(int i=0;i<a->argc;i++) {
+        char *key;
+        char *value;
+        if(!getkeyvalue(a->argv[i], &key, &value)) {
+            if(!strcmp(key, "password")) {
+                // passwords from command line args are plain text
+                // but the repository needs a base64 encoded password
+                char *pw = util_base64encode(value, strlen(value));
+                free(value);
+                value = pw;
+            }
+            
+            if(repo_add_config(repo, key, value)) {
+                fprintf(
+                        stderr,
+                        "Unkown repository config element: %s\n",
+                        key);
+            }
+            
+            free(key);
+            free(value);
+        } else {
+            fprintf(stderr, "´%s´ not in key=value format\n", a->argv[i]);
+            // TODO: cleanup
+            return -1;
+        }
+    }
+    
+    if(interactive) {
+        // start interactive assistent to adjust config
+        repository_assistent(repo, 0);
+    }
+    
+    return 0;
+}

mercurial