X-Git-Url: http://git.tuebingen.mpg.de/dss.git/log?a=blobdiff_plain;f=dss.c;h=f8bbb99a987b51943a4699af51b69480bc0b92aa;hb=4b93d353a2ac15b45b9e6064620bf93e41aa1b51;hp=8f632cbea50ce34ef91c041e944f17c77db6b8cd;hpb=bdeadb123f2930a6a927e2941f5314d3fda7268f;p=dss.git diff --git a/dss.c b/dss.c index 8f632cb..f8bbb99 100644 --- a/dss.c +++ b/dss.c @@ -1417,14 +1417,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);