]> git.rkrishnan.org Git - tahoe-lafs/zfec.git/blob - zfec/setuptools-0.6c15dev.egg/setuptools/command/install_egg_info.py
setup: bundle the latest zetuptoolz as unpacked source egg and change setup.py to...
[tahoe-lafs/zfec.git] / zfec / setuptools-0.6c15dev.egg / setuptools / command / install_egg_info.py
1 from setuptools import Command
2 from setuptools.archive_util import unpack_archive
3 from distutils import log, dir_util
4 import os, shutil, pkg_resources
5
6 class install_egg_info(Command):
7     """Install an .egg-info directory for the package"""
8
9     description = "Install an .egg-info directory for the package"
10
11     user_options = [
12         ('install-dir=', 'd', "directory to install to"),
13     ]
14
15     def initialize_options(self):
16         self.install_dir = None
17
18     def finalize_options(self):
19         self.set_undefined_options('install_lib',('install_dir','install_dir'))
20         ei_cmd = self.get_finalized_command("egg_info")
21         basename = pkg_resources.Distribution(
22             None, None, ei_cmd.egg_name, ei_cmd.egg_version
23         ).egg_name()+'.egg-info'
24         self.source = ei_cmd.egg_info
25         self.target = os.path.join(self.install_dir, basename)
26         self.outputs = [self.target]
27
28     def run(self):
29         self.run_command('egg_info')
30         target = self.target
31         if os.path.isdir(self.target) and not os.path.islink(self.target):
32             dir_util.remove_tree(self.target, dry_run=self.dry_run)
33         elif os.path.exists(self.target):
34             self.execute(os.unlink,(self.target,),"Removing "+self.target)
35         if not self.dry_run:
36             pkg_resources.ensure_directory(self.target)
37         self.execute(self.copytree, (),
38             "Copying %s to %s" % (self.source, self.target)
39         )
40         self.install_namespaces()
41
42     def get_outputs(self):
43         return self.outputs
44
45     def copytree(self):
46         # Copy the .egg-info tree to site-packages
47         def skimmer(src,dst):
48             # filter out source-control directories; note that 'src' is always
49             # a '/'-separated path, regardless of platform.  'dst' is a
50             # platform-specific path.
51             for skip in '.svn/','CVS/':
52                 if src.startswith(skip) or '/'+skip in src:
53                     return None
54             self.outputs.append(dst)
55             log.debug("Copying %s to %s", src, dst)
56             return dst
57         unpack_archive(self.source, self.target, skimmer)
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83     def install_namespaces(self):
84         nsp = self._get_all_ns_packages()
85         if not nsp: return
86         filename,ext = os.path.splitext(self.target)
87         filename += '-nspkg.pth'; self.outputs.append(filename)
88         log.info("Installing %s",filename)
89         if not self.dry_run:
90             f = open(filename,'wb')
91             for pkg in nsp:
92                 pth = tuple(pkg.split('.'))
93                 trailer = '\n'
94                 if '.' in pkg:
95                     trailer = (
96                         "; m and setattr(sys.modules[%r], %r, m)\n"
97                         % ('.'.join(pth[:-1]), pth[-1])
98                     )
99                 f.write(
100                     "import sys,new,os; "
101                     "p = os.path.join(sys._getframe(1).f_locals['sitedir'], "
102                         "*%(pth)r); "
103                     "ie = os.path.exists(os.path.join(p,'__init__.py')); "
104                     "m = not ie and "
105                         "sys.modules.setdefault(%(pkg)r,new.module(%(pkg)r)); "
106                     "mp = (m or []) and m.__dict__.setdefault('__path__',[]); "
107                     "(p not in mp) and mp.append(p)%(trailer)s"
108                     % locals()
109                 )
110             f.close()
111
112     def _get_all_ns_packages(self):
113         nsp = {}
114         for pkg in self.distribution.namespace_packages or []:
115             pkg = pkg.split('.')
116             while pkg:
117                 nsp['.'.join(pkg)] = 1
118                 pkg.pop()
119         nsp=list(nsp)
120         nsp.sort()  # set up shorter names first
121         return nsp
122
123