Changed a couple log_recv() calls back to log_send().
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 731ffee..c90a21d 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -67,6 +67,7 @@ extern int sanitize_paths;
 extern int max_delete;
 extern int orig_umask;
 extern int list_only;
+extern char *log_format;
 
 extern struct filter_list_struct filter_list;
 extern struct filter_list_struct server_filter_list;
@@ -75,7 +76,7 @@ int io_error;
 
 static char empty_sum[MD4_SUM_LENGTH];
 static unsigned int file_struct_len;
-static struct file_list *received_flist;
+static struct file_list *received_flist, *sorting_flist;
 static dev_t filesystem_dev; /* used to implement -x */
 static int deletion_count = 0; /* used to implement --max-delete */
 
@@ -330,7 +331,7 @@ void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
        char fname[MAXPATHLEN];
        int l1, l2;
 
-       if (f == -1)
+       if (f < 0)
                return;
 
        if (!file) {
@@ -975,7 +976,8 @@ void send_file_name(int f, struct file_list *flist, char *fname,
        struct file_struct *file;
        char fbuf[MAXPATHLEN];
 
-       if (!(file = make_file(fname, flist, ALL_FILTERS)))
+       file = make_file(fname, flist, f == -2 ? SERVER_FILTERS : ALL_FILTERS);
+       if (!file)
                return;
 
        maybe_emit_filelist_progress(flist);
@@ -1010,7 +1012,9 @@ void send_file_name(int f, struct file_list *flist, char *fname,
  * or a number >= 0 indicating how many levels of recursion we will allow.
  * This function is normally called by the sender, but the receiving side
  * also calls it from delete_in_dir() with f set to -1 so that we just
- * construct the file list in memory without sending it over the wire. */
+ * construct the file list in memory without sending it over the wire.  Also,
+ * get_dirlist() calls this with f set to -2, which indicates that local
+ * filter rules should be ignored. */
 static void send_directory(int f, struct file_list *flist,
                           char *fbuf, unsigned int len)
 {
@@ -1315,7 +1319,7 @@ struct file_list *recv_file_list(int f)
 
        clean_flist(flist, relative_paths, 1);
 
-       if (f != -1) {
+       if (f >= 0) {
                /* Now send the uid/gid list. This was introduced in
                 * protocol version 15 */
                recv_uid_list(f, flist);
@@ -1449,8 +1453,10 @@ static void clean_flist(struct file_list *flist, int strip_root, int no_dups)
        if (!flist || flist->count == 0)
                return;
 
+       sorting_flist = flist;
        qsort(flist->files, flist->count,
            sizeof flist->files[0], (int (*)())file_compare);
+       sorting_flist = NULL;
 
        for (i = no_dups? 0 : flist->count; i < flist->count; i++) {
                if (flist->files[i]->basename) {
@@ -1671,6 +1677,18 @@ int f_name_cmp(struct file_struct *f1, struct file_struct *f2)
                if (!*c2) {
                        switch (state2) {
                        case s_DIR:
+                               if (state1 == s_SLASH && sorting_flist) {
+                                       int j;
+                                       /* Optimize for future comparisons. */
+                                       for (j = 0;
+                                            j < sorting_flist->count;
+                                            j++) {
+                                               struct file_struct *fp
+                                                   = sorting_flist->files[j];
+                                               if (fp->dirname == f2->dirname)
+                                                       fp->dirname = f1->dirname;
+                                       }
+                               }
                                state2 = s_SLASH;
                                c2 = (uchar*)"/";
                                break;
@@ -1739,6 +1757,25 @@ static int is_backup_file(char *fn)
        return k > 0 && strcmp(fn+k, backup_suffix) == 0;
 }
 
+struct file_list *get_dirlist(const char *dirname, int ignore_filter_rules)
+{
+       struct file_list *dirlist;
+       char dirbuf[MAXPATHLEN];
+       int dlen;
+       int save_recurse = recurse;
+
+       dlen = strlcpy(dirbuf, dirname, MAXPATHLEN);
+       if (dlen >= MAXPATHLEN)
+               return NULL;
+
+       dirlist = flist_new(WITHOUT_HLINK, "get_dirlist");
+       recurse = 0;
+       send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirbuf, dlen);
+       recurse = save_recurse;
+
+       return dirlist;
+}
+
 
 /* This function is used to implement per-directory deletion, and
  * is used by all the --delete-WHEN options.  Note that the fbuf
@@ -1826,14 +1863,12 @@ void delete_missing(struct file_list *full_list, struct file_list *dir_list,
                        if (make_backups && (backup_dir || !is_backup_file(f))
                          && !S_ISDIR(mode)) {
                                make_backup(f);
-                               if (verbose) {
-                                       rprintf(FINFO, "deleting %s\n",
-                                               safe_fname(f));
-                               }
+                               if (verbose || log_format)
+                                       log_delete(f, mode);
                        } else if (S_ISDIR(mode))
-                               delete_file(f, DEL_DIR | DEL_FORCE_RECURSE);
+                               delete_file(f, mode, DEL_FORCE_RECURSE);
                        else
-                               delete_file(f, 0);
+                               delete_file(f, mode, 0);
                        deletion_count++;
                        if (max_delete && deletion_count >= max_delete)
                                break;