Fixed some build problems that crept into the code.
[rsync/rsync-patches.git] / omit-dir-changes.diff
1 This patch from Antti Tapaninen added the --omit-dir-changes option, which
2 tells rsync to not affect any attributes on the directories in the transfer.
3
4 To use this patch, run these commands for a successful build:
5
6     patch -p1 <patches/omit-dir-changes.diff
7     ./configure                              (optional if already run)
8     make
9
10 --- old/generator.c
11 +++ new/generator.c
12 @@ -44,6 +44,7 @@ extern int preserve_uid;
13  extern int preserve_gid;
14  extern int preserve_times;
15  extern int omit_dir_times;
16 +extern int omit_dir_changes;
17  extern int delete_mode;
18  extern int delete_before;
19  extern int delete_during;
20 @@ -543,10 +544,11 @@ void itemize(struct file_struct *file, i
21                         iflags |= ITEM_REPORT_TIME;
22                 if (!BITS_EQUAL(st->st_mode, file->mode, CHMOD_BITS))
23                         iflags |= ITEM_REPORT_PERMS;
24 -               if (preserve_uid && am_root && F_UID(file) != st->st_uid)
25 +               if (preserve_uid && am_root && F_UID(file) != st->st_uid
26 +                && !(omit_dir_changes && S_ISDIR(st->st_mode)))
27                         iflags |= ITEM_REPORT_OWNER;
28 -               if (preserve_gid && F_GID(file) != GID_NONE
29 -                   && st->st_gid != F_GID(file))
30 +               if (preserve_gid && F_GID(file) != GID_NONE && st->st_gid != F_GID(file)
31 +                && !(omit_dir_changes && S_ISDIR(st->st_mode)))
32                         iflags |= ITEM_REPORT_GROUP;
33         } else
34                 iflags |= ITEM_IS_NEW;
35 @@ -1165,7 +1167,7 @@ static void recv_generator(char *fname, 
36                                 statret = -1;
37                         new_root_dir = 0;
38                 }
39 -               if (!preserve_perms) { /* See comment in non-dir code below. */
40 +               if (!preserve_perms || omit_dir_changes) { /* See comment in non-dir code below. */
41                         file->mode = dest_mode(file->mode, st.st_mode,
42                                                statret == 0);
43                 }
44 --- old/options.c
45 +++ new/options.c
46 @@ -54,6 +54,7 @@ int preserve_uid = 0;
47  int preserve_gid = 0;
48  int preserve_times = 0;
49  int omit_dir_times = 0;
50 +int omit_dir_changes = 0;
51  int update_only = 0;
52  int cvs_exclude = 0;
53  int dry_run = 0;
54 @@ -308,6 +309,7 @@ void usage(enum logcode F)
55    rprintf(F," -D                          same as --devices --specials\n");
56    rprintf(F," -t, --times                 preserve times\n");
57    rprintf(F," -O, --omit-dir-times        omit directories when preserving times\n");
58 +  rprintf(F,"     --omit-dir-changes      omit directories when preserving any attributes\n");
59    rprintf(F,"     --super                 receiver attempts super-user activities\n");
60    rprintf(F," -S, --sparse                handle sparse files efficiently\n");
61    rprintf(F," -n, --dry-run               show what would have been transferred\n");
62 @@ -425,6 +427,7 @@ static struct poptOption long_options[] 
63    {"no-times",         0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
64    {"no-t",             0,  POPT_ARG_VAL,    &preserve_times, 0, 0, 0 },
65    {"omit-dir-times",  'O', POPT_ARG_VAL,    &omit_dir_times, 2, 0, 0 },
66 +  {"omit-dir-changes", 0,  POPT_ARG_NONE,   &omit_dir_changes, 0, 0, 0 },
67    {"modify-window",    0,  POPT_ARG_INT,    &modify_window, OPT_MODIFY_WINDOW, 0, 0 },
68    {"super",            0,  POPT_ARG_VAL,    &am_root, 2, 0, 0 },
69    {"no-super",         0,  POPT_ARG_VAL,    &am_root, 0, 0, 0 },
70 @@ -1292,6 +1295,9 @@ int parse_arguments(int *argc, const cha
71                         "P *%s", backup_suffix);
72                 parse_rule(&filter_list, backup_dir_buf, 0, 0);
73         }
74 +
75 +       if (omit_dir_changes)
76 +               omit_dir_times = 2;
77         if (make_backups && !backup_dir)
78                 omit_dir_times = 1;
79  
80 @@ -1525,6 +1531,8 @@ void server_options(char **args,int *arg
81                         argstr[x++] = 'm';
82                 if (omit_dir_times == 2)
83                         argstr[x++] = 'O';
84 +               if (omit_dir_changes == 1)
85 +                       args[ac++] = "--omit-dir-changes";
86         } else {
87                 if (copy_links)
88                         argstr[x++] = 'L';
89 --- old/rsync.c
90 +++ new/rsync.c
91 @@ -35,6 +35,7 @@ extern int preserve_perms;
92  extern int preserve_executability;
93  extern int preserve_times;
94  extern int omit_dir_times;
95 +extern int omit_dir_changes;
96  extern int am_root;
97  extern int am_server;
98  extern int am_sender;
99 @@ -265,9 +266,11 @@ int set_file_attrs(char *fname, struct f
100                         updated = 1;
101         }
102  
103 -       change_uid = am_root && preserve_uid && st->st_uid != F_UID(file);
104 +       change_uid = am_root && preserve_uid && st->st_uid != F_UID(file)
105 +               && !(omit_dir_changes && S_ISDIR(st->st_mode));
106         change_gid = preserve_gid && F_GID(file) != GID_NONE
107 -               && st->st_gid != F_GID(file);
108 +               && st->st_gid != F_GID(file)
109 +               && !(omit_dir_changes && S_ISDIR(st->st_mode));
110  #if !defined HAVE_LCHOWN && !defined CHOWN_MODIFIES_SYMLINK
111         if (S_ISLNK(st->st_mode))
112                 ;