The patches for 3.3.0.
[rsync-patches.git] / source-filter_dest-filter.diff
index 0775fe72180ed42733afcdcba172540a6045e815..3f63d3080ac0fa189c7be215f26e223f6e63f7c3 100644 (file)
@@ -30,11 +30,11 @@ To use this patch, run these commands for a successful build:
     ./configure                                (optional if already run)
     make
 
-based-on: c528f8d5c8aa7b16b20cda72a9f4119699890c28
+based-on: 6c8ca91c731b7bf2b081694bda85b7dadc2b7aff
 diff --git a/generator.c b/generator.c
 --- a/generator.c
 +++ b/generator.c
-@@ -65,6 +65,7 @@ extern int append_mode;
+@@ -67,6 +67,7 @@ extern int append_mode;
  extern int make_backups;
  extern int csum_length;
  extern int ignore_times;
@@ -42,19 +42,19 @@ diff --git a/generator.c b/generator.c
  extern int size_only;
  extern OFF_T max_size;
  extern OFF_T min_size;
-@@ -582,7 +583,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
- /* Perform our quick-check heuristic for determining if a file is unchanged. */
- int unchanged_file(char *fn, struct file_struct *file, STRUCT_STAT *st)
+@@ -618,7 +619,7 @@ int quick_check_ok(enum filetype ftype, const char *fn, struct file_struct *file
  {
--      if (st->st_size != F_LENGTH(file))
-+      if (!times_only && st->st_size != F_LENGTH(file))
-               return 0;
+       switch (ftype) {
+         case FT_REG:
+-              if (st->st_size != F_LENGTH(file))
++              if (!times_only && st->st_size != F_LENGTH(file))
+                       return 0;
  
-       /* if always checksum is set then we use the checksum instead
+               /* If always_checksum is set then we use the checksum instead
 diff --git a/main.c b/main.c
 --- a/main.c
 +++ b/main.c
-@@ -181,7 +181,7 @@ int shell_exec(const char *cmd)
+@@ -191,7 +191,7 @@ int shell_exec(const char *cmd)
  }
  
  /* Wait for a process to exit, calling io_flush while waiting. */
@@ -66,7 +66,7 @@ diff --git a/main.c b/main.c
 diff --git a/options.c b/options.c
 --- a/options.c
 +++ b/options.c
-@@ -111,6 +111,7 @@ int safe_symlinks = 0;
+@@ -119,6 +119,7 @@ int safe_symlinks = 0;
  int copy_unsafe_links = 0;
  int munge_symlinks = 0;
  int size_only = 0;
@@ -74,16 +74,16 @@ diff --git a/options.c b/options.c
  int daemon_bwlimit = 0;
  int bwlimit = 0;
  int fuzzy_basis = 0;
-@@ -170,6 +171,8 @@ char *logfile_name = NULL;
+@@ -179,6 +180,8 @@ char *logfile_name = NULL;
  char *logfile_format = NULL;
  char *stdout_format = NULL;
  char *password_file = NULL;
 +char *source_filter = NULL;
 +char *dest_filter = NULL;
+ char *early_input_file = NULL;
  char *rsync_path = RSYNC_PATH;
  char *backup_dir = NULL;
- char backup_dir_buf[MAXPATHLEN];
-@@ -837,6 +840,7 @@ static struct poptOption long_options[] = {
+@@ -689,6 +692,7 @@ static struct poptOption long_options[] = {
    {"chmod",            0,  POPT_ARG_STRING, 0, OPT_CHMOD, 0, 0 },
    {"ignore-times",    'I', POPT_ARG_NONE,   &ignore_times, 0, 0, 0 },
    {"size-only",        0,  POPT_ARG_NONE,   &size_only, 0, 0, 0 },
@@ -91,8 +91,8 @@ diff --git a/options.c b/options.c
    {"one-file-system", 'x', POPT_ARG_NONE,   0, 'x', 0, 0 },
    {"no-one-file-system",0, POPT_ARG_VAL,    &one_file_system, 0, 0, 0 },
    {"no-x",             0,  POPT_ARG_VAL,    &one_file_system, 0, 0, 0 },
-@@ -963,6 +967,8 @@ static struct poptOption long_options[] = {
-   {"password-file",    0,  POPT_ARG_STRING, &password_file, 0, 0, 0 },
+@@ -829,6 +833,8 @@ static struct poptOption long_options[] = {
+   {"early-input",      0,  POPT_ARG_STRING, &early_input_file, 0, 0, 0 },
    {"blocking-io",      0,  POPT_ARG_VAL,    &blocking_io, 1, 0, 0 },
    {"no-blocking-io",   0,  POPT_ARG_VAL,    &blocking_io, 0, 0, 0 },
 +  {"source-filter",    0,  POPT_ARG_STRING, &source_filter, 0, 0, 0 },
@@ -100,7 +100,7 @@ diff --git a/options.c b/options.c
    {"outbuf",           0,  POPT_ARG_STRING, &outbuf_mode, 0, 0, 0 },
    {"remote-option",   'M', POPT_ARG_STRING, 0, 'M', 0, 0 },
    {"protocol",         0,  POPT_ARG_INT,    &protocol_version, 0, 0, 0 },
-@@ -2339,6 +2345,16 @@ int parse_arguments(int *argc_p, const char ***argv_p)
+@@ -2444,6 +2450,16 @@ int parse_arguments(int *argc_p, const char ***argv_p)
                }
        }
  
@@ -117,7 +117,7 @@ diff --git a/options.c b/options.c
        if (files_from) {
                char *h, *p;
                int q;
-@@ -2723,6 +2739,25 @@ void server_options(char **args, int *argc_p)
+@@ -2852,6 +2868,25 @@ void server_options(char **args, int *argc_p)
        else if (missing_args == 1 && !am_sender)
                args[ac++] = "--ignore-missing-args";
  
@@ -243,7 +243,7 @@ diff --git a/receiver.c b/receiver.c
  extern char *partial_dir;
  extern char *basis_dir[MAX_BASIS_DIRS+1];
  extern char sender_file_sum[MAX_DIGEST_LEN];
-@@ -522,6 +523,7 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -528,6 +529,7 @@ int recv_files(int f_in, int f_out, char *local_name)
        char *fnametmp, fnametmpbuf[MAXPATHLEN];
        char *fnamecmp, *partialptr;
        char fnamecmpbuf[MAXPATHLEN];
@@ -251,7 +251,7 @@ diff --git a/receiver.c b/receiver.c
        uchar fnamecmp_type;
        struct file_struct *file;
        int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i;
-@@ -532,6 +534,7 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -538,6 +540,7 @@ int recv_files(int f_in, int f_out, char *local_name)
        const char *parent_dirname = "";
  #endif
        int ndx, recv_ok, one_inplace;
@@ -259,9 +259,9 @@ diff --git a/receiver.c b/receiver.c
  
        if (DEBUG_GTE(RECV, 1))
                rprintf(FINFO, "recv_files(%d) starting\n", cur_flist->used);
-@@ -539,6 +542,23 @@ int recv_files(int f_in, int f_out, char *local_name)
-       if (delay_updates)
-               delayed_bits = bitbag_create(cur_flist->used + 1);
+@@ -548,6 +551,23 @@ int recv_files(int f_in, int f_out, char *local_name)
+       if (whole_file < 0)
+               whole_file = 0;
  
 +      if (dest_filter) {
 +              char *p;
@@ -283,7 +283,7 @@ diff --git a/receiver.c b/receiver.c
        progress_init();
  
        while (1) {
-@@ -853,6 +873,9 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -873,6 +893,9 @@ int recv_files(int f_in, int f_out, char *local_name)
                else if (!am_server && INFO_GTE(NAME, 1) && INFO_EQ(PROGRESS, 1))
                        rprintf(FINFO, "%s\n", fname);
  
@@ -293,7 +293,7 @@ diff --git a/receiver.c b/receiver.c
                /* recv file data */
                recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size, fname, fd2, file, inplace || one_inplace);
  
-@@ -868,6 +891,16 @@ int recv_files(int f_in, int f_out, char *local_name)
+@@ -888,6 +911,16 @@ int recv_files(int f_in, int f_out, char *local_name)
                        exit_cleanup(RERR_FILEIO);
                }
  
@@ -313,7 +313,7 @@ diff --git a/receiver.c b/receiver.c
 diff --git a/rsync.1.md b/rsync.1.md
 --- a/rsync.1.md
 +++ b/rsync.1.md
-@@ -415,6 +415,7 @@ detailed description below for a complete description.
+@@ -504,6 +504,7 @@ has its own detailed description later in this manpage.
  --contimeout=SECONDS     set daemon connection timeout in seconds
  --ignore-times, -I       don't skip files that match size and time
  --size-only              skip files that match in size
@@ -321,7 +321,7 @@ diff --git a/rsync.1.md b/rsync.1.md
  --modify-window=NUM, -@  set the accuracy for mod-time comparisons
  --temp-dir=DIR, -T       create temporary files in directory DIR
  --fuzzy, -y              find similar file for basis if no dest file
-@@ -457,6 +458,8 @@ detailed description below for a complete description.
+@@ -553,6 +554,8 @@ has its own detailed description later in this manpage.
  --write-batch=FILE       write a batched update to FILE
  --only-write-batch=FILE  like --write-batch but w/o updating dest
  --read-batch=FILE        read a batched update from FILE
@@ -330,9 +330,9 @@ diff --git a/rsync.1.md b/rsync.1.md
  --protocol=NUM           force an older protocol version to be used
  --iconv=CONVERT_SPEC     request charset conversion of filenames
  --checksum-seed=NUM      set block/file checksum seed (advanced)
-@@ -3024,6 +3027,36 @@ your home directory (remove the '=' for that).
-     `--write-batch`.  If _FILE_ is `-`, the batch data will be read from
-     standard input. See the "BATCH MODE" section for details.
+@@ -3713,6 +3716,36 @@ expand it.
+     [`--write-batch`](#opt).  If _FILE_ is `-`, the batch data will be read
+     from standard input. See the "BATCH MODE" section for details.
  
 +0.  `--source-filter=COMMAND`
 +
@@ -344,10 +344,10 @@ diff --git a/rsync.1.md b/rsync.1.md
 +    when writing the data to stdout.
 +
 +    Example: `--source-filter="gzip -9"` will cause remote files to be
-+    compressed.  Use of `--source-filter` automatically enables `--whole-file`.
-+    If your filter does not output the same number of bytes that it received on
-+    input, you should use `--times-only` to disable size and content checks on
-+    subsequent rsync runs.
++    compressed.  Use of `--source-filter` automatically enables
++    [`--whole-file`](#opt).  If your filter does not output the same number of
++    bytes that it received on input, you should use `--times-only` to
++    disable size and content checks on subsequent rsync runs.
 +
 +0.  `--dest-filter=COMMAND`
 +
@@ -364,13 +364,13 @@ diff --git a/rsync.1.md b/rsync.1.md
 +    should use --times-only to disable size and content checks on subsequent
 +    rsync runs.
 +
- 0. `--protocol=NUM`
+ 0.  `--protocol=NUM`
  
      Force an older protocol version to be used.  This is useful for creating a
 diff --git a/rsync.h b/rsync.h
 --- a/rsync.h
 +++ b/rsync.h
-@@ -158,6 +158,7 @@
+@@ -169,6 +169,7 @@
  #define IOERR_DEL_LIMIT (1<<2)
  
  #define MAX_ARGS 1000
@@ -381,15 +381,23 @@ diff --git a/rsync.h b/rsync.h
 diff --git a/sender.c b/sender.c
 --- a/sender.c
 +++ b/sender.c
-@@ -47,6 +47,7 @@ extern int batch_fd;
+@@ -21,6 +21,7 @@
+ #include "rsync.h"
+ #include "inums.h"
++#include "ifuncs.h"
+ extern int do_xfers;
+ extern int am_server;
+@@ -50,6 +51,7 @@ extern int batch_fd;
  extern int write_batch;
  extern int file_old_total;
  extern BOOL want_progress_now;
 +extern char *source_filter;
  extern struct stats stats;
  extern struct file_list *cur_flist, *first_flist, *dir_flist;
-@@ -204,6 +205,26 @@ void send_files(int f_in, int f_out)
+ extern char num_dev_ino_buf[4 + 8 + 8];
+@@ -211,6 +213,26 @@ void send_files(int f_in, int f_out)
        int f_xfer = write_batch < 0 ? batch_fd : f_out;
        int save_io_error = io_error;
        int ndx, j;
@@ -416,7 +424,7 @@ diff --git a/sender.c b/sender.c
  
        if (DEBUG_GTE(SEND, 1))
                rprintf(FINFO, "send_files starting\n");
-@@ -338,6 +359,7 @@ void send_files(int f_in, int f_out)
+@@ -348,6 +370,7 @@ void send_files(int f_in, int f_out)
                        exit_cleanup(RERR_PROTOCOL);
                }
  
@@ -424,7 +432,7 @@ diff --git a/sender.c b/sender.c
                fd = do_open(fname, O_RDONLY, 0);
                if (fd == -1) {
                        if (errno == ENOENT) {
-@@ -357,6 +379,33 @@ void send_files(int f_in, int f_out)
+@@ -367,6 +390,33 @@ void send_files(int f_in, int f_out)
                        continue;
                }
  
@@ -458,7 +466,7 @@ diff --git a/sender.c b/sender.c
                /* map the local file */
                if (do_fstat(fd, &st) != 0) {
                        io_error |= IOERR_GENERAL;
-@@ -408,6 +457,8 @@ void send_files(int f_in, int f_out)
+@@ -437,6 +487,8 @@ void send_files(int f_in, int f_out)
                        }
                }
                close(fd);