summaryrefslogtreecommitdiffstats
path: root/presto.py
diff options
context:
space:
mode:
Diffstat (limited to 'presto.py')
-rw-r--r--presto.py210
1 files changed, 128 insertions, 82 deletions
diff --git a/presto.py b/presto.py
index 77d4dc2..f084aa6 100644
--- a/presto.py
+++ b/presto.py
@@ -33,98 +33,144 @@ import prestoTransaction
requires_api_version = '2.1'
plugin_type = (TYPE_INTERACTIVE,)
-# Setup repository specific deltarpm url and mirrorlist
-def config_hook(conduit):
+rpm_size = 0
+drpm_size = 0
+
+# Configuration stuff
+def config_hook(conduit):
+ # Set up repository specific deltarpm url and mirrorlist
config.RepoConf.deltaurl = config.UrlListOption()
config.RepoConf.deltamirrorlist = config.UrlOption()
+
+ # Add --disable-presto option
+ parser = conduit.getOptParser()
+ parser.add_option('', '--disablepresto', dest='disablepresto',
+ action='store_true', default=False,
+ help="disable Presto plugin and don't download any deltarpms")
# Set up Presto repositories
def prereposetup_hook(conduit):
- conduit.info(2, 'Setting up Presto')
- for active_repo in conduit.getRepos().listEnabled():
- p_repo = PrestoRepository(active_repo, conduit)
- p_repo.setup(conduit.getConf().cache)
+ opts, commands = conduit.getCmdLine()
+ if not opts.disablepresto:
+ conduit.info(2, 'Setting up Presto')
+ for active_repo in conduit.getRepos().listEnabled():
+ p_repo = PrestoRepository(active_repo, conduit)
+ p_repo.setup(conduit.getConf().cache)
- conduit.info(2, 'Reading Presto metadata in from local files')
- for active_repo in conduit.getRepos().listEnabled():
- xml = active_repo.p_repo.getPrestoXML()
- if active_repo.p_repo.enabled:
- xmldata = active_repo.p_repo.repoXML.getData('deltas')
- (ctype, csum) = xmldata.checksum
- parser = PrestoMDParser(xml)
- active_repo.p_repo.deltalist = parser.getDeltaList()
-
- conduit.info(2, 'Setting up repositories')
+ conduit.info(2, 'Reading Presto metadata in from local files')
+ for active_repo in conduit.getRepos().listEnabled():
+ xml = active_repo.p_repo.getPrestoXML()
+ if active_repo.p_repo.enabled:
+ xmldata = active_repo.p_repo.repoXML.getData('deltas')
+ (ctype, csum) = xmldata.checksum
+ parser = PrestoMDParser(xml)
+ active_repo.p_repo.deltalist = parser.getDeltaList()
+
+ conduit.info(2, 'Setting up repositories')
+ else:
+ conduit.info(5, '--disablepresto specified - Presto disabled')
def postresolve_hook(conduit):
- # Cycle through packages to see if there's a deltarpm available
- for newpkg in conduit.getTsInfo():
- if newpkg.ts_state != "e":
- chosen_drpm = prestoTransaction.find_available_drpms(conduit, newpkg)
+ global rpm_size
+ global drpm_size
+
+ opts, commands = conduit.getCmdLine()
+ if not opts.disablepresto:
+ # Cycle through packages to see if there's a deltarpm available
+ for newpkg in conduit.getTsInfo():
+ if newpkg.ts_state != "e":
+ chosen_drpm = prestoTransaction.find_available_drpms(conduit, newpkg)
- # If a drpm was found, change certain package information so it reflects
- # the drpm, not the rpm.
- if chosen_drpm != None:
- newpkg.po.hasdrpm = True
- newpkg.po.simple['basepath'] = chosen_drpm['baseurl']
- newpkg.po.simple['realpackagesize'] = newpkg.po.simple['packagesize']
- newpkg.po.simple['packagesize'] = chosen_drpm['size']
- newpkg.po.simple['realrelativepath'] = newpkg.po.simple['relativepath']
- newpkg.po.simple['relativepath'] = chosen_drpm['drpm_filename']
- newpkg.po.reallocalpath = newpkg.po.localpath
- newpkg.po.localpath = newpkg.po.repo.deltasdir + "/" + os.path.basename(chosen_drpm['drpm_filename'])
- newpkg.po.to = newpkg
- newpkg.realpkgtup = newpkg.pkgtup
- newpkg.pkgtup = (newpkg.name + " *", newpkg.arch, newpkg.epoch, newpkg.version, newpkg.release)
- for (csum_type, csum, csumid) in newpkg.po._checksums:
- if csumid:
- newpkg.po._realchecksum = (csum_type, csum, csumid)
- newpkg.po._checksums.remove((csum_type, csum, csumid))
- csum_type = chosen_drpm['checksum_type']
- csum = chosen_drpm['checksum']
- newpkg.po._checksums.append((csum_type, csum, csumid))
+ # If a drpm was found, change certain package information so it reflects
+ # the drpm, not the rpm.
+ if chosen_drpm != None:
+ rpm_size += int(newpkg.po.simple['packagesize'])
+ drpm_size += int(chosen_drpm['size'])
+ newpkg.po.hasdrpm = True
+ newpkg.po.simple['basepath'] = chosen_drpm['baseurl']
+ newpkg.po.simple['realpackagesize'] = newpkg.po.simple['packagesize']
+ newpkg.po.simple['packagesize'] = chosen_drpm['size']
+ newpkg.po.simple['realrelativepath'] = newpkg.po.simple['relativepath']
+ newpkg.po.simple['relativepath'] = chosen_drpm['drpm_filename']
+ newpkg.po.reallocalpath = newpkg.po.localpath
+ newpkg.po.localpath = newpkg.po.repo.deltasdir + "/" + os.path.basename(chosen_drpm['drpm_filename'])
+ newpkg.po.to = newpkg
+ newpkg.realpkgtup = newpkg.pkgtup
+ newpkg.pkgtup = (newpkg.name + " *", newpkg.arch, newpkg.epoch, newpkg.version, newpkg.release)
+ for (csum_type, csum, csumid) in newpkg.po._checksums:
+ if csumid:
+ newpkg.po._realchecksum = (csum_type, csum, csumid)
+ newpkg.po._checksums.remove((csum_type, csum, csumid))
+ csum_type = chosen_drpm['checksum_type']
+ csum = chosen_drpm['checksum']
+ newpkg.po._checksums.append((csum_type, csum, csumid))
- conduit.info(2, "Found deltarpm update for %s.%s %s:%s.%s" % (newpkg.name, newpkg.arch, newpkg.epoch, newpkg.version, newpkg.release))
- else:
- newpkg.po.hasdrpm = False
- return
-
- # Free up memory used by deleting Presto repositories
- for active_repo in conduit.getRepos().listEnabled():
- if active_repo.p_repo.enabled:
- del active_repo.p_repo
+ conduit.info(2, "Found deltarpm update for %s.%s %s:%s.%s" % (newpkg.name, newpkg.arch, newpkg.epoch, newpkg.version, newpkg.release))
+ else:
+ newpkg.po.hasdrpm = False
+ if newpkg.po.repo.p_repo.enabled:
+ rpm_size += int(newpkg.po.simple['packagesize'])
+ drpm_size += int(newpkg.po.simple['packagesize'])
+
+ return
+
+ # Free up memory used by deleting Presto repositories
+ for active_repo in conduit.getRepos().listEnabled():
+ if active_repo.p_repo.enabled:
+ del active_repo.p_repo
def postdownload_hook(conduit):
- # Cycle through packages to see if we've downloaded a deltarpm
- conduit.info(2, "Rebuilding full packages from deltas")
- for pkg in conduit.getDownloadPackages():
- if pkg.hasdrpm and pkg.verifyLocalPkg():
- # Apply deltarpm and save where rpm would have been saved
- drpm = deltarpm.DeltaRpmWrapper(conduit)
- drpm.apply(pkg.reallocalpath, pkg.localpath)
- drpm_path = pkg.localpath
-
- # Change package information to reflect original rpm information
- pkg.to.pkgtup = pkg.to.realpkgtup
- pkg.localpath = pkg.reallocalpath
- pkg.simple['packagesize'] = pkg.simple['realpackagesize']
- del pkg.simple['basepath']
- for (csum_type, csum, csumid) in pkg._checksums:
- if csumid:
- pkg._checksums.remove((csum_type, csum, csumid))
- pkg._checksums.append(pkg._realchecksum)
-
- # Check to see whether or not we should keep the drpms
- # FIXME: Is there any way to see whether or not a Boolean option was not set?
- if conduit.confBool('main', 'neverkeepdeltas'):
- delete = True
- elif conduit.confBool('main', 'keepdeltas'):
- delete = False
- elif conduit.getConf().keepcache != 0:
- delete = False
- else:
- delete = True
-
- if delete:
- os.unlink(drpm_path)
+ opts, commands = conduit.getCmdLine()
+ if not opts.disablepresto:
+ failure = False
+ # Cycle through packages to see if we've downloaded a deltarpm
+ conduit.info(2, "Rebuilding full packages from deltas")
+ for pkg in conduit.getDownloadPackages():
+ if pkg.hasdrpm and pkg.verifyLocalPkg():
+ # Apply deltarpm and save where rpm would have been saved
+ drpm = deltarpm.DeltaRpmWrapper(conduit)
+ this_failure = False
+ try:
+ drpm.apply(pkg.reallocalpath, pkg.localpath)
+ except:
+ failure = True
+ this_failure = True
+ if not this_failure:
+ drpm_path = pkg.localpath
+
+ # Change package information to reflect original rpm information
+ pkg.to.pkgtup = pkg.to.realpkgtup
+ pkg.localpath = pkg.reallocalpath
+ pkg.simple['packagesize'] = pkg.simple['realpackagesize']
+ del pkg.simple['basepath']
+ for (csum_type, csum, csumid) in pkg._checksums:
+ if csumid:
+ pkg._checksums.remove((csum_type, csum, csumid))
+ pkg._checksums.append(pkg._realchecksum)
+
+ # Check to see whether or not we should keep the drpms
+ # FIXME: Is there any way to see whether or not a Boolean option was not set?
+ if conduit.confBool('main', 'neverkeepdeltas'):
+ delete = True
+ elif conduit.confBool('main', 'keepdeltas'):
+ delete = False
+ elif conduit.getConf().keepcache != 0:
+ delete = False
+ else:
+ delete = True
+
+ if delete:
+ os.unlink(drpm_path)
+
+ if failure:
+ raise PluginYumExit("Error rebuilding at least one deltarpm. Please run report this error to\nhttps://hosted.fedoraproject.org/projects/presto/newticket. To bypass this problem, run yum \nwith the --disablepresto option")
+
+def posttrans_hook(conduit):
+ global rpm_size
+ global drpm_size
+
+ if rpm_size > 0:
+ conduit.info(2, "Size of all files downloaded from Presto-enabled repositories: %i bytes" % drpm_size)
+ conduit.info(2, "Size that would have been downloaded if Presto wasn't enabled: %i bytes" % rpm_size)
+ conduit.info(2, "This is a savings of %i percent" % (100 - ((drpm_size * 100) / rpm_size)))