pyinfra-dev / pyinfra

pyinfra turns Python code into shell commands and runs them on your servers. Execute ad-hoc commands and write declarative operations. Target SSH servers, local machine and Docker containers. Fast and scales from one server to thousands.
https://pyinfra.com
MIT License
3.91k stars 382 forks source link

files.sync does not remove existing symlinks #1061

Open Snektron opened 9 months ago

Snektron commented 9 months ago

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

sysadmin75 commented 9 months ago

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 commented 9 months ago

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.

Fizzadar commented 9 months ago

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