[PATCH 1 of 5] setup: don't override install_data for package data

Dan Villiom Podlaski Christiansen danchr at gmail.com
Tue Nov 24 11:43:33 CST 2009


# HG changeset patch
# User Dan Villiom Podlaski Christiansen <danchr at gmail.com>
# Date 1259081618 -3600
# Node ID 19afd9d34457557fc49a96b7a577c363b340e00b
# Parent  3fd712025fda6e3f78736f3d42d9da2a8e83d7cb
setup: don't override install_data for package data.

Currently, the 'install_data' option is overridden and set from the
'install_lib' option. This prevents installing anything other than
package data. As a replacement, a separate 'package_data_files' field
on the distribution --- specific to Mercurial --- is used instead.

diff --git a/setup.py b/setup.py
old mode 100644
new mode 100755
--- a/setup.py
+++ b/setup.py
@@ -167,10 +167,28 @@ except ImportError:
 
 class install_package_data(install_data):
     def finalize_options(self):
+        def isregularfilename(p):
+            return p and p[0] != '.' and p[-1] != '~'
+
+        # obtain the install_lib option for adding package data
+        self.install_lib = None
         self.set_undefined_options('install',
-                                   ('install_lib', 'install_dir'))
+                                   ('install_lib', 'install_lib'))
         install_data.finalize_options(self)
 
+        # this is not a standard distutils attribute
+        datafiles = getattr(self.distribution, 'package_data_files', [])
+
+        for root in ('templates', 'i18n', 'help'):
+            for dir, dirs, files in os.walk(root):
+                dirs[:] = filter(isregularfilename, dirs)
+                files = filter(isregularfilename, files)
+                datafiles.append((os.path.join('mercurial', dir),
+                                  [os.path.join(dir, f) for f in files]))
+
+        for dir, files in datafiles:
+            self.data_files.append((os.path.join(self.install_lib, dir), files))
+
 class build_mo(build):
 
     description = "build translations (.mo files)"
@@ -186,6 +204,11 @@ class build_mo(build):
             self.warn("could not find %s/ directory" % podir)
             return
 
+        # this is not a standard distutils attribute
+        if not hasattr(self.distribution, 'package_data_files'):
+            self.distribution.package_data_files = []
+        datafiles = self.distribution.package_data_files
+
         join = os.path.join
         for po in os.listdir(podir):
             if not po.endswith('.po'):
@@ -199,8 +222,7 @@ class build_mo(build):
                 cmd.append('-c')
             self.mkpath(modir)
             self.make_file([pofile], mofile, spawn, (cmd,))
-            self.distribution.data_files.append((join('mercurial', modir),
-                                                 [mofile]))
+            datafiles.append((join('mercurial', modir), [mofile]))
 
 build.sub_commands.append(('build_mo', None))
 
@@ -256,12 +278,6 @@ if sys.platform == 'linux2' and os.uname
         packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
 
 datafiles = []
-for root in ('templates', 'i18n', 'help'):
-    for dir, dirs, files in os.walk(root):
-        dirs[:] = [x for x in dirs if not x.startswith('.')]
-        files = [x for x in files if not x.startswith('.')]
-        datafiles.append((os.path.join('mercurial', dir),
-                          [os.path.join(dir, file_) for file_ in files]))
 
 setup(name='mercurial',
       version=version,


More information about the Mercurial-devel mailing list