Bug 9212 - rsync loses track of files if differing directory prefixes are given
rsync loses track of files if differing directory prefixes are given
Product: rsync
Classification: Unclassified
Component: core
All All
: P5 normal
: ---
Assigned To: Wayne Davison
Rsync QA Contact
Depends on:
  Show dependency treegraph
Reported: 2012-09-25 13:24 UTC by Michal Luscon
Modified: 2012-10-07 17:51 UTC (History)
0 users

See Also:

patch (316 bytes, patch)
2012-10-02 09:01 UTC, Michal Luscon
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Michal Luscon 2012-09-25 13:24:32 UTC
Description of problem:
  If rsync is given a list of files containing differing relative directory
  prefixes, it will lose track of the source files.

Steps to Reproduce:
1. Setup:
  % mkdir /tmp/test
  % cd /tmp/test
  % mkdir -p c/d dest
  % touch a.c b.c c/d/e.c f.c

2. Rsync
  % rsync -av --update ./a.c ./b.c ./c/d/e.c ./f.c dest/
  sending incremental file list
  rsync: link_stat "/tmp/tvb-test/f.c" failed: No such file or directory (2)
  file has vanished: "/tmp/tvb-test/a.c"
  file has vanished: "/tmp/tvb-test/b.c"

  sent 125 bytes  received 69 bytes  388.00 bytes/sec
  total size is 0  speedup is 0.00
  rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.8]

  The files have NOT vanished.  It is just that rsync has lost track of
  where they were.
You can find proposed patch in attachment.

This bugreport originates from https://bugzilla.redhat.com/show_bug.cgi?id=823088 .
Comment 1 Michal Luscon 2012-10-02 09:01:51 UTC
Created attachment 7977 [details]
Comment 2 Wayne Davison 2012-10-07 17:51:22 UTC
Good catch -- the change_dir() routine was being too optimal after a change_dir() where CD_SKIP_CHDIR had been used.  Your fix works great, and is probably what packagers should snag for a 3.0.9 touch-up.

For the 3.1.0dev code, I decided to change the change_dir() routine itself so that it knows that a skip has been done and avoids a needed chdir when CD_NORMAL is requested.  It's a little more code, but will help ensure that any other (future?) uses of change_dir() with CD_SKIP_CHDIR don't run into the same issue.