def install(self): self.success = False logger.info('Looking for {0} releases on PyPI', self.name) p = ReqManager(self) try: files = p.files() except (urllib2.URLError, urllib2.HTTPError) as e: raise InstallationError(repr(e.reason) if hasattr(e, 'reason') else e.msg) bad_eggs = [] for pext in ('.tar.gz', '.tar.bz2', '.zip', '.egg'): for v, name, hash, url in files[pext]: if pext == '.egg' and not right_egg(name): if args_manager['install']['force_egg_install']: bad_eggs.append( (url, name, p.name, hash) ) continue if ext(name) not in ('.tar.gz', '.tar.bz2', '.zip', '.egg') + WINDOWS_EXT: continue logger.info('Best match: {0}=={1}', self.name, v) try: self._download_and_install(url, name, p.name, hash) except InstallationError: logger.info('Trying another file (if there is one)...') continue if not self.version: self.version = v break if self.success: return if bad_eggs: self._check_bad_eggs(bad_eggs) if not self.success: raise InstallationError('Error: Cannot find files available for dowloading and installing')
def find(self): def _get_all(url): match = self._pkg_re.search(url) if match is None: return None, None, None return map(match.group, ('package_name', 'version', 'ext')) def _remove_query(url): return urlparse.urlunsplit(urlparse.urlsplit(url)[:3] + ('',) * 2) def _get_version(filename): ## A bit hacky but there is no solution because some packages ## are in the form {package_name}-{version}-{something_else}-{?pyx.y}.{ext} ## and we cannot predict where is the version in that mess. _version_re = re.compile(r'\d[\.\d\w]*') parts = name(filename).split('-') for part in parts: match = _version_re.search(part) if match is not None: return match.group() found = list(self.package_manager.find()) if not found: logger.warn('Warning: did not find any files on PyPI') for link in get_links(self.name, args_manager['install']['packages_url']): package_name = _remove_query(link).split('/')[-1] version = _get_version(package_name) e = ext(package_name) if package_name is None or version is None: package_name, version, e = _get_all(link) found.append((version, package_name, None, link, e)) return found
def _download_and_install(self, url, filename, packname, hash=None): fobj = download(url, 'Downloading {0}'.format(self.name)) if hash is not None: logger.info('Checking md5 sum') if md5(fobj.getvalue()).hexdigest() != hash: logger.fatal('Error: {0} appears to be corrupted', self.name) return e = ext(filename) if e in ('.tar.gz', '.tar.bz2', '.zip'): installer = Archive(fobj, e, packname, self.reqset) elif e == '.egg': installer = Egg(fobj, filename, self.reqset, packname) elif is_windows() and e in WINDOWS_EXT: installer = Binary(fobj, e, packname) else: logger.error('Error: unknown filetype: {0}', e, exc=InstallationError) ## There is no need to catch exceptions now, this will be done by `pyg.inst.Installer.install` installer.install() self.success = True
def from_file(filepath, packname=None): packname = packname or os.path.basename(filepath).split('-')[0] reqset = ReqSet(packname) e = ext(filepath) path = os.path.abspath(filepath) if e in ('.tar.gz', '.tar.bz2', '.zip'): installer = Archive(open(path), e, packname, reqset) elif e in ('.pybundle', '.pyb'): installer = Bundle(filepath) elif e == '.egg': installer = Egg(open(path), path, reqset) elif e in ('.exe', '.msi') and is_windows(): installer = Binary(open(path), e, packname) else: if tarfile.is_tarfile(path): installer = Archive(open(path), None, packname, reqset) elif zipfile.is_zipfile(path): installer = Archive(open(path), '.zip', packname, reqset) else: logger.fatal('Error: Cannot install {0}: unknown filetype', packname, exc=InstallationError) installer.install() Installer._install_deps(reqset, packname) logger.success('{0} installed successfully', packname)
def files(self): files = FileMapper(list) files.pref = self.pref for release in self.find(): files[ext(release[1])].append(release) return files