From 6c05056f84c0ca6fc79fdb2a375b425bc53944c2 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Sat, 25 May 2013 20:49:55 +0200 Subject: [PATCH] Allow multiple values for config settings Setting a list as a value for `global-config' will instruct gitto to place that setting in the config more than once. For example: ,---- | (set! global-config | '(("remote \"origin\"" | ("url" . "git@somehost.com:~a.git") | ("pushurl" "git@somehost.com:~a.git" | "git@someotherhost.com:user/~a.git")))) `---- Will produce output similar to: ,---- | [remote "origin"] | url = git@somehost.com:repo-name.git | pushurl = git@somehost.com:repo-name.git | pushurl = git@someotherhost.com:user/repo-name.git `---- The ordering may vary depending on what was already found in the `origin' remote's settings. gitto doesn't know or care which settings can and cannot appear more than once in a configuration, it is up to the user to provide valid values. --- gitto/config.scm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/gitto/config.scm b/gitto/config.scm index 6726e66..ae0bf7b 100644 --- a/gitto/config.scm +++ b/gitto/config.scm @@ -51,12 +51,22 @@ y) lst)) +(define (merge-setting repo-name lst var val) + (assoc-set! lst var (format #f val repo-name))) + (define (merge-settings repo-name x y) (let ((lst (if x (list-copy x) '()))) - (for-each (lambda (v) - (set! lst (assoc-set! - lst (car v) (format #f (cdr v) repo-name)))) - y) + (for-each + (lambda (v) + (if (list? v) + (begin + (set! lst (merge-setting repo-name lst (car v) (cadr v))) + (set! lst (append lst (map (lambda (s) + (cons (car v) + (format #f s repo-name))) + (cddr v))))) + (set! lst (merge-setting repo-name lst (car v) (cdr v))))) + y) lst)) (define (parse-setting line)