- for (i=1;i<flist->count;i++) {
- if (flist->files[i]->basename &&
- flist->files[i-1]->basename &&
- strcmp(f_name(flist->files[i]),
- f_name(flist->files[i-1])) == 0) {
- if (verbose > 1 && !am_server)
- rprintf(FINFO,"removing duplicate name %s from file list %d\n",
- f_name(flist->files[i-1]),i-1);
- free_file(flist->files[i]);
- }
+ qsort(flist->files, flist->count,
+ sizeof flist->files[0], (int (*)())file_compare);
+
+ for (i = no_dups? 0 : flist->count; i < flist->count; i++) {
+ if (flist->files[i]->basename) {
+ prev_i = i;
+ break;
+ }
+ }
+ while (++i < flist->count) {
+ if (!flist->files[i]->basename)
+ continue;
+ if (f_name_cmp(flist->files[i], flist->files[prev_i]) == 0) {
+ if (verbose > 1 && !am_server) {
+ rprintf(FINFO,
+ "removing duplicate name %s from file list %d\n",
+ f_name(flist->files[i]), i);
+ }
+ /* Make sure that if we unduplicate '.', that we don't
+ * lose track of a user-specified starting point (or
+ * else deletions will mysteriously fail with -R). */
+ if (flist->files[i]->flags & FLAG_TOP_DIR)
+ flist->files[prev_i]->flags |= FLAG_TOP_DIR;
+
+ clear_file(i, flist);
+ } else
+ prev_i = i;
+ }
+
+ if (strip_root) {
+ /* we need to strip off the root directory in the case
+ of relative paths, but this must be done _after_
+ the sorting phase */
+ for (i = 0; i < flist->count; i++) {
+ if (flist->files[i]->dirname &&
+ flist->files[i]->dirname[0] == '/') {
+ memmove(&flist->files[i]->dirname[0],
+ &flist->files[i]->dirname[1],
+ strlen(flist->files[i]->dirname));
+ }
+
+ if (flist->files[i]->dirname &&
+ !flist->files[i]->dirname[0]) {
+ flist->files[i]->dirname = NULL;
+ }
+ }
+ }
+}
+
+static void output_flist(struct file_list *flist)
+{
+ char uidbuf[16], gidbuf[16];
+ struct file_struct *file;
+ int i;
+
+ for (i = 0; i < flist->count; i++) {
+ file = flist->files[i];
+ if (am_root && preserve_uid)
+ sprintf(uidbuf, " uid=%ld", (long)file->uid);
+ else
+ *uidbuf = '\0';
+ if (preserve_gid && file->gid != GID_NONE)
+ sprintf(gidbuf, " gid=%ld", (long)file->gid);
+ else
+ *gidbuf = '\0';
+ rprintf(FINFO, "[%s] i=%d %s %s %s mode=0%o len=%.0f%s%s\n",
+ who_am_i(), i, NS(file->basedir), NS(file->dirname),
+ NS(file->basename), (int)file->mode,
+ (double)file->length, uidbuf, gidbuf);