+ if (prune_empty_dirs && no_dups) {
+ int j, prev_depth = 0;
+
+ prev_i = 0; /* It's OK that this isn't really true. */
+
+ for (i = flist->low; i <= flist->high; i++) {
+ struct file_struct *fp, *file = flist->files[i];
+
+ /* This temporarily abuses the F_DEPTH() value for a
+ * directory that is in a chain that might get pruned.
+ * We restore the old value if it gets a reprieve. */
+ if (S_ISDIR(file->mode) && F_DEPTH(file)) {
+ /* Dump empty dirs when coming back down. */
+ for (j = prev_depth; j >= F_DEPTH(file); j--) {
+ fp = flist->files[prev_i];
+ if (F_DEPTH(fp) >= 0)
+ break;
+ prev_i = -F_DEPTH(fp)-1;
+ clear_file(fp);
+ }
+ prev_depth = F_DEPTH(file);
+ if (is_excluded(f_name(file, fbuf), 1,
+ ALL_FILTERS)) {
+ /* Keep dirs through this dir. */
+ for (j = prev_depth-1; ; j--) {
+ fp = flist->files[prev_i];
+ if (F_DEPTH(fp) >= 0)
+ break;
+ prev_i = -F_DEPTH(fp)-1;
+ F_DEPTH(fp) = j;
+ }
+ } else
+ F_DEPTH(file) = -prev_i-1;
+ prev_i = i;
+ } else {
+ /* Keep dirs through this non-dir. */
+ for (j = prev_depth; ; j--) {
+ fp = flist->files[prev_i];
+ if (F_DEPTH(fp) >= 0)
+ break;
+ prev_i = -F_DEPTH(fp)-1;
+ F_DEPTH(fp) = j;
+ }