[PATCH] setup: Set mode 644 or 755 on installed files

Mads Kiilerich mads at kiilerich.com
Wed Oct 1 19:40:20 CDT 2014


On 10/01/2014 11:00 PM, Kyle Lippincott wrote:
> # HG changeset patch
> # User Kyle Lippincott <spectral at google.com>
> # Date 1412122434 25200
> #      Tue Sep 30 17:13:54 2014 -0700
> # Node ID b168f18ef708e5c834eb5ce9f6804c033e769082
> # Parent  939ce500c92a3dcc0e10815242361ff70a6fcae9
> setup: Set mode 644 or 755 on installed files

The Scripture says that the subject line should be all lower case.

A description that explains a bit about the context and the "why" would 
be nice. The docstring do however seem to explain most of it.

It is sad that such a minor change requires so much code. But distutils :-(

Couldn't we just set umask in this script or in Makefile ... or fail 
early if it is bad?

/Mads

> diff -r 939ce500c92a -r b168f18ef708 setup.py
> --- a/setup.py	Mon Sep 29 17:23:38 2014 -0500
> +++ b/setup.py	Tue Sep 30 17:13:54 2014 -0700

> @@ -375,6 +376,39 @@
>                                         libraries=[],
>                                         output_dir=self.build_temp)
>   
> +class hginstalllib(install_lib):
> +    '''
> +    This is a specialization of install_lib that replaces the copy_file used
> +    there so that it supports setting the mode of files after copying them,
> +    instead of just preserving the mode that the files originally had.  If your
> +    system has a umask of something like 027, preserving the permissions when
> +    copying will lead to a broken install.
> +
> +    Note that just passing keep_permissions=False to copy_file would be
> +    insufficient, as it might still be applying a umask.
> +    '''
> +
> +    def run(self):
> +        realcopyfile = file_util.copy_file
> +        def copyfileandsetmode(*args, **kwargs):
> +            src, dst = args[0], args[1]
> +            dst, copied = realcopyfile(*args, **kwargs)
> +            if copied:
> +                st = os.stat(src)
> +                # Persist executable bit (apply it to group and other if user
> +                # has it)
> +                if st[stat.ST_MODE] & stat.S_IXUSR:
> +                    setmode = 0755
> +                else:
> +                    setmode = 0644
> +                os.chmod(dst, (stat.S_IMODE(st[stat.ST_MODE]) & ~0777) |
> +                         setmode)
> +        file_util.copy_file = copyfileandsetmode
> +        try:
> +            install_lib.run(self)
> +        finally:
> +            file_util.copy_file = realcopyfile
> +
>



More information about the Mercurial-devel mailing list