From b8b7d763f9fccf52fd76d410d88c773d65881268 Mon Sep 17 00:00:00 2001 From: Jesse Keating Date: Sun, 26 Aug 2007 19:44:38 -0400 Subject: [PATCH] - Add a cache dir for pungi (/var/cache/pungi) and a cli option to override - Fix some typos - Handle cache dir not being on same file system --- Changelog | 1 + pungi | 5 ++++- pungi.spec | 2 ++ pypungi/gather.py | 51 +++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/Changelog b/Changelog index ebb80862..47b90052 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,6 @@ * Sun Aug 26 2007 Jesse Keating - Add better support for %packages syntax using native pykickstart +- Add a cache dir for pungi (/var/cache/pungi) and a cli option to override * Sat Aug 25 2007 Jesse Keating - Use a kickstart file as input now (for cdsize and package manifest) diff --git a/pungi b/pungi index 82936d4a..c38aab43 100755 --- a/pungi +++ b/pungi @@ -54,13 +54,14 @@ def main(): config.set('default', 'relnotedirre', relnotedirre) config.set('default', 'relnotepkgs', relnotepkgs) config.set('default', 'product_path', 'Packages') - config.set('default', 'cachedir', '/srv/pungi/cache') # needs to be handled better + config.set('default', 'cachedir', '/var/cache/pungi') # set configs from cli options config.set('default', 'name', opts.name) config.set('default', 'version', opts.ver) config.set('default', 'flavor', opts.flavor) config.set('default', 'destdir', opts.destdir) + config.set('default', 'cachedir', opts.cachedir) config.set('default', 'bugurl', opts.bugurl) config.set('default', 'discs', opts.discs) @@ -156,6 +157,8 @@ if __name__ == '__main__': help='the flavor of your distribution spin (optional)') parser.add_option("--destdir", default=".", dest="destdir", help='destination directory (defaults to current directory)') + parser.add_option("--cachedir", default="/var/cache/pungi", dest="cachedir", + help='package cache directory (defaults to /var/cache/pungi)') parser.add_option("--bugurl", default="http://bugzilla.redhat.com", dest="bugurl", help='the url for your bug system (defaults to http://bugzilla.redhat.com)') parser.add_option("--discs", default='1', dest="discs", diff --git a/pungi.spec b/pungi.spec index 4fcb6737..356680d3 100644 --- a/pungi.spec +++ b/pungi.spec @@ -30,6 +30,7 @@ A tool to create anaconda based installation trees/isos of a set of rpms. %install rm -rf $RPM_BUILD_ROOT %{__python} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT +%{__install} -d $RPM_BUILD_ROOT/var/cache/pungi %clean @@ -44,6 +45,7 @@ rm -rf $RPM_BUILD_ROOT %{python_sitelib}/pypungi %{_bindir}/pungi %{_datadir}/pungi +/var/cache/pungi %changelog diff --git a/pypungi/gather.py b/pypungi/gather.py index dc9b0ca4..0a1fbecf 100755 --- a/pypungi/gather.py +++ b/pypungi/gather.py @@ -197,11 +197,11 @@ class Gather(pypungi.PungiBase): packages.extend(groupobj.mandatory_packages.keys()) # Add the default packages unless we don't want them - if group.include == 1 + if group.include == 1: packages.extend(groupobj.default_packages.keys()) # Add the optional packages if we want them - if group.include == 2 + if group.include == 2: packages.extend(groupobj.default_packages.keys()) packages.extend(groupobj.optional_packages.keys()) @@ -325,7 +325,15 @@ class Gather(pypungi.PungiBase): target = os.path.join(pkgdir, os.path.basename(remote)) if os.path.exists(target): os.remove(target) # avoid traceback after interrupted download - os.link(local, target) + try: + os.link(local, target) + except OSError, e: + if e.errno == 18: + # Can't hardlink cross file systems + shutil.copy2(local, target) + else: + self.logger.error('Got an error linking from cache: %s' % e) + raise OSError, e continue # Disable cache otherwise things won't download @@ -336,9 +344,18 @@ class Gather(pypungi.PungiBase): # do a little dance for file:// repos... path = repo.getPackage(pkg) if not os.path.exists(local) or not os.path.samefile(path, local): - shutil.copy2(path, local) + shutil.copy2(local, path) - os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + try: + os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + except OSError, e: + if e.errno == 18: + # Can't hardlink cross file systems + shutil.copy2(local, os.path.join(pkgdir, os.path.basename(remote))) + else: + self.logger.error('Got an error linking from cache: %s' % e) + raise OSError, e + self.logger.info('Finished downloading packages.') @@ -425,7 +442,16 @@ class Gather(pypungi.PungiBase): if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and self.verifyCachePkg(pkg, os.path.join(pkgdir, os.path.basename(remote))): self.logger.debug("%s already exists in tree and appears to be complete" % local) else: - os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + try: + os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + except OSError, e: + if e.errno == 18: + # Can't hardlink cross file systems + shutil.copy2(local, os.path.join(pkgdir, os.path.basename(remote))) + else: + self.logger.error('Got an error linking from cache: %s' % e) + raise OSError, e + continue # Disable cache otherwise things won't download @@ -436,6 +462,15 @@ class Gather(pypungi.PungiBase): # do a little dance for file:// repos... path = repo.getPackage(pkg) if not os.path.exists(local) or not os.path.samefile(path, local): - shutil.copy2(path, local) + shutil.copy2(local, path) + + try: + os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + except OSError, e: + if e.errno == 18: + # Can't hardlink cross file systems + shutil.copy2(local, target) + else: + self.logger.error('Got an error linking from cache: %s' % e) + raise OSError, e - os.link(local, os.path.join(pkgdir, os.path.basename(remote)))