[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