[PATCH] rpmostreepayload: Avoid shutil.copytree in favor of cp -r to fix symlinks

David Cantrell dcantrell at redhat.com
Wed Dec 3 13:57:37 UTC 2014


On Tue, Dec 02, 2014 at 09:59:12PM -0500, Colin Walters wrote:
> shutil.copytree() follows symlinks by default which I didn't realize,
> and this actively breaks things as grubenv is a symlink.
> 
> Since we're shelling out to 'cp' in a case above, might as well do it
> here.
> 
> This also means that if we hit e.g. ENOSPC we'll enter the error
> handling codepath instead of an uncaught traceback.
> 
> (Yes, this code is crappy, should probably live in bootloader.py,
>  except I'm going through gyrations here to avoid requiring
>  any changes in how mainline bootloaders work)
> ---
>  pyanaconda/packaging/rpmostreepayload.py | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/pyanaconda/packaging/rpmostreepayload.py b/pyanaconda/packaging/rpmostreepayload.py
> index ade664c..f96a316 100644
> --- a/pyanaconda/packaging/rpmostreepayload.py
> +++ b/pyanaconda/packaging/rpmostreepayload.py
> @@ -119,7 +119,7 @@ class RPMOSTreePayload(ArchivePayload):
>                      self._safeExecWithRedirect('cp', ['-r', '-p', sub_srcpath, sub_destpath])
>              else:
>                  log.info("Copying bootloader data: " + fname)
> -                shutil.copytree(srcpath, destpath)
> +                self._safeExecWithRedirect('cp', ['-r', '-p', srcpath, destpath])
>  
>      def install(self):
>          mainctx = GLib.MainContext.new()
> -- 
> 1.8.3.1

Why not:

shutil.copytree(srcpath, destpath, symlinks=True)

?

(In Python 2.x and 3.x this is different, Python 3.x has
follow_symlinks=True as the default).

-- 
David Cantrell <dcantrell at redhat.com>
Manager, Installer Engineering Team
Red Hat, Inc. | Westford, MA | EST5EDT


More information about the anaconda-patches mailing list