]> git.tuebingen.mpg.de Git - dss.git/commitdiff
Support multiple source directories.
authorAndre Noll <maan@tuebingen.mpg.de>
Wed, 6 Jun 2018 13:08:24 +0000 (15:08 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 8 Jun 2018 13:40:16 +0000 (15:40 +0200)
rsync is capable of copying multiple source directories to a single
destination, but this is currently not supported by dss. This commit
adds this functionality. The implementation is straight-forward,
except that we don't want to add a trailing slash to every source
directory. The new comment in dss.c explains this in more detail.

Suggested-By: Sanja Jasek <sanja.jasek@tuebingen.mpg.de>
Tested-By: Sanja Jasek <sanja.jasek@tuebingen.mpg.de>
dss.c
dss.suite

diff --git a/dss.c b/dss.c
index 8f632cbea50ce34ef91c041e944f17c77db6b8cd..f8bbb99a987b51943a4699af51b69480bc0b92aa 100644 (file)
--- 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();
        } 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);
        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
                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.
 
                [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
                [/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.
                        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
                [/help]
        [option mountpoint]
                summary = abort if destination directory is not a mountpoint