]> git.tuebingen.mpg.de Git - dss.git/commitdiff
Merge branch 'master' into next
authorAndre Noll <maan@tuebingen.mpg.de>
Mon, 11 Feb 2019 19:58:09 +0000 (20:58 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Mon, 11 Feb 2019 19:58:09 +0000 (20:58 +0100)
* master:
  Remove stale comment.
  Improve comment of snapshot_currently_being_removed.

dss.c
dss.suite

diff --git a/dss.c b/dss.c
index 217f22e36f8d1b36f65874a9336635946376cdb5..3a5f68516cc3b32215cb26eb13a6bc7eaf777132 100644 (file)
--- 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);
index 03e147414d475cc10f1176f434acd98d1dea3e57..16c7e58542eff8750c8437dcea137f347a435950 100644 (file)
--- a/dss.suite
+++ b/dss.suite
@@ -62,13 +62,15 @@ caption = Subcommands
                typestr = dirname
                arg_info = required_arg
                arg_type = string
+               flag multiple
                [help]
                        The directory on the remote host from which snapshots are taken.
                        Of course, the user specified as --remote-user must have read access
                        to this directory.
 
-                       This option is mandatory for the create and run subcommands: It must
-                       be given at the command line or in the config file.
+                       This option is mandatory for the create and run subcommands: It may
+                       be given multiple times to specify more than one source directory.
+                       However, all source directories must reside on the same server.
                [/help]
        [option dest-dir]
                summary = where snapshots are stored
@@ -80,6 +82,7 @@ caption = Subcommands
                        written. This must be writable by the user who runs dss.
 
                        This option is mandatory for all subcommands except kill.
+                       Unlike --source-dir, this option may only be given once.
                [/help]
        [option mountpoint]
                summary = abort if destination directory is not a mountpoint