[yum-cvs] yummain.py

Florian Festi ffesti at linux.duke.edu
Fri Dec 14 10:10:15 UTC 2007


 yummain.py |  110 +++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 67 insertions(+), 43 deletions(-)

New commits:
commit 60b388ac8d47ae69bc7d60b23354272e8d70b4d1
Author: Florian Festi <ffesti at redhat.com>
Date:   Thu Dec 13 13:49:10 2007 +0100

    Support profiling for yum as a whole

diff --git a/yummain.py b/yummain.py
index 6b9663a..e3eb396 100755
--- a/yummain.py
+++ b/yummain.py
@@ -34,14 +34,14 @@ def main(args):
 
     def exUserCancel():
         logger.critical('\n\nExiting on user cancel')
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def exIOError(e):
         if e.errno == 32:
             logger.critical('\n\nExiting on Broken Pipe')
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def exPluginExit(e):
         '''Called when a plugin raises PluginYumExit.
@@ -51,20 +51,21 @@ def main(args):
         exitmsg = str(e)
         if exitmsg:
             logger.warn('\n\n%s', exitmsg)
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def exFatal(e):
         logger.critical('\n\n%s', str(e))
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
 
     def unlock():
         try:
             base.closeRpmDB()
             base.doUnlock()
         except Errors.LockError, e:
-            sys.exit(200)
+            return 200
+        return 0
 
     logger = logging.getLogger("yum.main")
     verbose_logger = logging.getLogger("yum.verbose.main")
@@ -84,9 +85,9 @@ def main(args):
     try:
         base.getOptionsConfig(args)
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
-        exFatal(e)
+        return exFatal(e)
 
     lockerr = ""
     while True:
@@ -104,40 +105,40 @@ def main(args):
     try:
         result, resultmsgs = base.doCommands()
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
         result = 1
         resultmsgs = [str(e)]
     except KeyboardInterrupt:
-        exUserCancel()
+        return exUserCancel()
     except IOError, e:
-        exIOError(e)
+        return exIOError(e)
 
     # Act on the command/shell result
     if result == 0:
         # Normal exit 
         for msg in resultmsgs:
             verbose_logger.log(logginglevels.INFO_2, '%s', msg)
-        unlock()
-        sys.exit(0)
+        if unlock(): return 200
+        return 0
     elif result == 1:
         # Fatal error
         for msg in resultmsgs:
             logger.critical('Error: %s', msg)
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
     elif result == 2:
         # Continue on
         pass
     elif result == 100:
-        unlock()
-        sys.exit(100)
+        if unlock(): return 200
+        return 100
     else:
         logger.critical('Unknown Error(s): Exit Code: %d:', result)
         for msg in resultmsgs:
             logger.critical(msg)
-        unlock()
-        sys.exit(3)
+        if unlock(): return 200
+        return 3
             
     # Depsolve stage
     verbose_logger.log(logginglevels.INFO_2, 'Resolving Dependencies')
@@ -145,26 +146,26 @@ def main(args):
     try:
         (result, resultmsgs) = base.buildTransaction() 
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
         result = 1
         resultmsgs = [str(e)]
     except KeyboardInterrupt:
-        exUserCancel()
+        return exUserCancel()
     except IOError, e:
-        exIOError(e)
+        return exIOError(e)
    
     # Act on the depsolve result
     if result == 0:
         # Normal exit
-        unlock()
-        sys.exit(0)
+        if unlock(): return 200
+        return 0
     elif result == 1:
         # Fatal error
         for msg in resultmsgs:
             logger.critical('Error: %s', msg)
-        unlock()
-        sys.exit(1)
+        if unlock(): return 200
+        return 1
     elif result == 2:
         # Continue on
         pass
@@ -172,8 +173,8 @@ def main(args):
         logger.critical('Unknown Error(s): Exit Code: %d:', result)
         for msg in resultmsgs:
             logger.critical(msg)
-        unlock()
-        sys.exit(3)
+        if unlock(): return 200
+        return 3
 
     verbose_logger.log(logginglevels.INFO_2, '\nDependencies Resolved')
     verbose_logger.debug(time.time())
@@ -182,26 +183,49 @@ def main(args):
     try:
         base.doTransaction()
     except plugins.PluginYumExit, e:
-        exPluginExit(e)
+        return exPluginExit(e)
     except Errors.YumBaseError, e:
-        exFatal(e)
+        return exFatal(e)
     except KeyboardInterrupt:
-        exUserCancel()
+        return exUserCancel()
     except IOError, e:
-        exIOError(e)
+        return exIOError(e)
 
     verbose_logger.log(logginglevels.INFO_2, 'Complete!')
-    unlock()
-    sys.exit(0)
-
+    if unlock(): return 200
+    return 0
+
+def hotshot(func, *args, **kwargs):
+    import hotshot.stats, os.path
+    fn = os.path.expanduser("~/yum.prof")
+    prof = hotshot.Profile(fn)
+    rc = prof.runcall(func, *args, **kwargs)
+    prof.close()
+    print_stats(hotshot.stats.load(fn))
+    return rc
+
+def cprof(func, *args, **kwargs):
+    import cProfile, pstats, os.path
+    fn = os.path.expanduser("~/yum.prof")
+    prof = cProfile.Profile()
+    rc = prof.runcall(func, *args, **kwargs)
+    prof.dump_stats(fn)
+    print_stats(pstats.Stats(fn))
+    return rc
+
+def print_stats(stats):
+    stats.strip_dirs()
+    stats.sort_stats('time', 'calls')
+    stats.print_stats(20)
+    stats.sort_stats('cumulative')
+    stats.print_stats(40)
 
 if __name__ == "__main__":
-    #import hotshot
-    #p = hotshot.Profile(os.path.expanduser("~/yum.prof"))
-    #p.run('main(sys.argv[1:])')
-    #p.close()    
     try:
-        main(sys.argv[1:])
+        errcode = main(sys.argv[1:])
+        #errcode = cprof(main, sys.argv[1:])
+        #errcode = hotshot(main, sys.argv[1:])
+        sys.exit(errcode)
     except KeyboardInterrupt, e:
         print >> sys.stderr, "\n\nExiting on user cancel."
         sys.exit(1)



More information about the Yum-cvs-commits mailing list