diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index c0e6c93d..c6170108 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -182,12 +182,14 @@ class UpdateDB(Command): super(UpdateDB, self).__init__() def run(self): - if len(self.args) != 1: - self.help() - return - from pisi.operations import updatedb - indexfile = self.args[0] + try: + indexfile = self.args[0] + except IndexError: + # doesn't have an index file, we'll use the repo url in + # configuration file + indexfile = None + updatedb(indexfile) diff --git a/pisi/config.py b/pisi/config.py index d55bf6d7..360d8357 100644 --- a/pisi/config.py +++ b/pisi/config.py @@ -35,7 +35,10 @@ class Config(object): def packages_dir(self): return self.destdir + self.values.dirs.packages_dir - + + def index_dir(self): + return self.destdir + self.values.dirs.index_dir + def tmp_dir(self): return self.destdir + self.values.dirs.tmp_dir diff --git a/pisi/constants.py b/pisi/constants.py index 38221579..2c5efcf3 100644 --- a/pisi/constants.py +++ b/pisi/constants.py @@ -49,6 +49,7 @@ class Constants: self.__c.comar_dir = "comar" self.__c.files_xml = "files.xml" self.__c.metadata_xml = "metadata.xml" + self.__c.pisi_index = "pisi-index.xml" # functions in actions_file self.__c.setup_func = "setup" diff --git a/pisi/index.py b/pisi/index.py index 6b22d1a7..cc924e71 100644 --- a/pisi/index.py +++ b/pisi/index.py @@ -21,16 +21,17 @@ class Index(XmlFile): def read(self, filename): """Read PSPEC file""" - self.filename = filename + self.filepath = filename url = PUrl(filename) if url.isRemoteFile(): - from os import getcwd + from os.path import join from fetcher import fetchUrl - # TODO: index dosyasını indirmek için bir yer bulmak lazım. - fetchUrl(url, getcwd(), ui.Progress) - self.filename = url.filename() + # TODO: farklı depoların index dosyalarını handle edebilmek gerekiyor. + dest = config.index_dir() + fetchUrl(url, dest, ui.Progress) + self.filepath = join(dest, url.filename()) - self.readxml(self.filename) + self.readxml(self.filepath) # find all binary packages packageElts = self.getAllNodes("Package") diff --git a/pisi/operations.py b/pisi/operations.py index 781bd27b..44e4c248 100644 --- a/pisi/operations.py +++ b/pisi/operations.py @@ -21,7 +21,42 @@ def remove(package_name): installdb.remove(package_name) removeScripts(package_name) -def install(pkg_location): +def install(pkg): + url = PUrl(pkg) + # check if we are dealing with a remote file or a real path of + # package filename. If we are working with a remote file + # install_package() will handle it. + if url.isRemoteFile() or os.path.exists(url.uri): + install_package(pkg) + else: + from os.path import join + from index import Index + # no pisi package is specified. We are goin to install a + # package from the repository. + repo_url = config.values.repos.default + index = Index() + indexpath = join(config.index_dir(), const.pisi_index) + index.read(indexpath) + # search package in index file, if it's present in the + # repository + for package in index.packages: + if package.name == pkg: + # As we have no Version tag we need to get + # the last version and release information + # from the first child of History/Update. And it works :) + version = package.history[0].version + release = package.history[0].release + + pkg_name = package.name + '-' + version +\ + '-' + release + const.package_prefix + package_uri = join(repo_url, pkg[0], pkg_name) + ui.info("Installing %s from repository %s\n" % + (pkg_name, repo_url)) + install_package(package_uri) + return + ui.error("Package %s not found in the index file." %pkg) + +def install_package(pkg_location): from install import Installer i = Installer(pkg_location) @@ -42,12 +77,17 @@ def index(repo_dir = '.'): ui.info('* Building index of PISI files under %s\n' % repo_dir) index = Index() index.index(repo_dir) - index.write('pisi-index.xml') + print const.pisi_index + index.write(const.pisi_index) ui.info('* Index file written\n') -def updatedb(indexfile): +def updatedb(indexfile = None): from index import Index + if not indexfile: + repos_path = config.values.repos.default + indexfile = os.path.join(repos_path, const.pisi_index) + ui.info('* Updating DB from index file: %s\n' % indexfile) index = Index() index.read(indexfile)