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:
% mkdir /tmp/test
% cd /tmp/test
% mkdir -p c/d dest
% touch a.c b.c c/d/e.c f.c
% 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 .
Created attachment 7977 [details]
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.