pyinfra icon indicating copy to clipboard operation
pyinfra copied to clipboard

files.sync does not remove existing symlinks

Open Snektron opened this issue 1 year ago • 3 comments

Describe the bug

As the title describes, using the files.sync operation on a remote directory which contains symlinks that are not present in the local version, they are not deleted.

To Reproduce

  1. Create a file files/update-motd.d/something (put anything in it, its irrelevant)
  2. For example, run the following against a ubuntu 22.04 host:
files.sync(
    name="Update MOTD",
    src="files/update-motd.d/",
    dest="/etc/update-motd.d",
    delete=True,
)

This will leave the /etc/update-motd.d directory as follows:

/etc/update-motd.d/
  something
  50-landscape-sysinfo

the latter is a symlink. This should be reproducible for any directory which contains such a symlink that is not present locally, though.

Expected behavior

I'm not sure the expected behavior would be to have the symlink be removed, but IMO there should at least be an option for it.

Meta

Running pyinfra v2.9, installed from pip

Snektron avatar Jan 22 '24 12:01 Snektron

I see why this is happening. However, I'm not sure how @Fizzadar wants this operation to handle symlinks. It's an easy fix if Fizzadar wants this operation to handle symlinks.

sysadmin75 avatar Feb 03 '24 18:02 sysadmin75

Maybe this isn't as straight forward as I first thought. In any case, we still need to know if the sync operation should be expanded to handle symlinks.

sysadmin75 avatar Feb 03 '24 18:02 sysadmin75

Yes I think it should. Ideally the sync op should be like rsync’s archive mode I think.

Fizzadar avatar Feb 04 '24 06:02 Fizzadar