X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=dss.c;h=3a5f68516cc3b32215cb26eb13a6bc7eaf777132;hb=0ba2970172d7851a31178d84238fd1e8c36a2b35;hp=217f22e36f8d1b36f65874a9336635946376cdb5;hpb=c14a503ccdb73f7a15e4c55103029f1c25709f10;p=dss.git diff --git a/dss.c b/dss.c index 217f22e..3a5f685 100644 --- a/dss.c +++ b/dss.c @@ -1414,14 +1414,35 @@ static void create_rsync_argv(char ***argv, int64_t *num) } else DSS_INFO_LOG(("no suitable reference snapshot found\n")); logname = dss_logname(); - if (use_rsync_locally(logname)) - (*argv)[i++] = dss_strdup(OPT_STRING_VAL(DSS, SOURCE_DIR)); - else - (*argv)[i++] = make_message("%s@%s:%s/", - OPT_GIVEN(DSS, REMOTE_USER)? - OPT_STRING_VAL(DSS, REMOTE_USER) : logname, - OPT_STRING_VAL(DSS, REMOTE_HOST), - OPT_STRING_VAL(DSS, SOURCE_DIR)); + N = OPT_GIVEN(DSS, SOURCE_DIR); + if (use_rsync_locally(logname)) { + for (j = 0; j < N; j++) + (*argv)[i++] = dss_strdup(lls_string_val(j, + OPT_RESULT(DSS, SOURCE_DIR))); + } else { + /* + * dss-1.0 and earlier did not support multiple source + * directories. These versions appended a slash to the end of + * the source directory to make sure that only the contents of + * the single source directory, but not the directory itself, + * are copied to the destination. For multiple source + * directories, however, this is not a good idea because the + * source directories may well contain identical file names, + * which would then be copied to the same location on the + * destination, overwriting each other. Moreover, we want the + * directory on the destination match the source. To preserve + * the old behaviour, we thus have to special-case N=1. + */ + for (j = 0; j < N; j++) { + (*argv)[i++] = make_message("%s@%s:%s%s", + OPT_GIVEN(DSS, REMOTE_USER)? + OPT_STRING_VAL(DSS, REMOTE_USER) : logname, + OPT_STRING_VAL(DSS, REMOTE_HOST), + lls_string_val(j, OPT_RESULT(DSS, SOURCE_DIR)), + N == 1? "/" : "" + ); + } + } free(logname); *num = get_current_time(); (*argv)[i++] = incomplete_name(*num);