summaryrefslogtreecommitdiffstats
path: root/lib/bb/ui/knotty.py
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2007-08-18 14:55:45 +0000
committerRichard Purdie <rpurdie@linux.intel.com>2007-08-18 14:55:45 +0000
commit8b11b43dcf17f0e3bc1c0a24c869cd421d301b2c (patch)
tree62ca83adb5c34a72b65246face72d773025e6321 /lib/bb/ui/knotty.py
parenta3cf76b9969853774a4b76f0780ba46f363e0321 (diff)
downloadbitbake-8b11b43dcf17f0e3bc1c0a24c869cd421d301b2c.tar.gz
Add the start of several UI modules
Diffstat (limited to 'lib/bb/ui/knotty.py')
-rw-r--r--lib/bb/ui/knotty.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/lib/bb/ui/knotty.py b/lib/bb/ui/knotty.py
new file mode 100644
index 000000000..a32917910
--- /dev/null
+++ b/lib/bb/ui/knotty.py
@@ -0,0 +1,140 @@
+#
+# BitBake (No)TTY UI Implementation
+#
+# Handling output to TTYs or files (no TTY)
+#
+# Copyright (C) 2006-2007 Richard Purdie
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import os
+import bb
+from bb import cooker
+
+import sys
+import time
+import itertools
+import xmlrpclib
+
+parsespin = itertools.cycle( r'|/-\\' )
+
+def init(frontend, eventHandler):
+
+ try:
+ cmdline = frontend.runCommand(["getCmdLineAction"])
+ #print cmdline
+ ret = frontend.runCommand(cmdline)
+ if ret != True:
+ print "Cook failed: %s" % ret
+
+ except xmlrpclib.Fault, x:
+ print x
+
+ shutdown = 0
+ while True:
+ try:
+ event = eventHandler.waitEvent(0.25)
+ if event is None:
+ continue
+ #print event
+ if event[0].startswith('bb.event.Pkg'):
+ print "NOTE: %s" % event[1]['_message']
+ continue
+ if event[0].startswith('bb.msg.MsgPlain'):
+ print event[1]['_message']
+ continue
+ if event[0].startswith('bb.msg.MsgDebug'):
+ print 'DEBUG: ' + event[1]['_message']
+ continue
+ if event[0].startswith('bb.msg.MsgNote'):
+ print 'NOTE: ' + event[1]['_message']
+ continue
+ if event[0].startswith('bb.msg.MsgWarn'):
+ print 'WARNING: ' + event[1]['_message']
+ continue
+ if event[0].startswith('bb.msg.MsgError'):
+ print 'ERROR: ' + event[1]['_message']
+ continue
+ if event[0].startswith('bb.build.TaskFailed'):
+ logfile = event[1]['logfile']
+ if logfile:
+# if bb.data.getVar("BBINCLUDELOGS", d):
+ print "ERROR: Logged data stored in %s" % logfile
+ print "Log data follows:\n"
+# number_of_lines = data.getVar("BBINCLUDELOGS_LINES", d)
+# if number_of_lines:
+# os.system('tail -n%s %s' % (number_of_lines, logfile))
+# else:
+ f = open(logfile, "r")
+ while True:
+ l = f.readline()
+ if l == '':
+ break
+ l = l.rstrip()
+ print '| %s' % l
+ f.close()
+# else:
+# bb.msg.error(bb.msg.domain.Build, "see log in %s" % logfile)
+ if event[0].startswith('bb.build.Task'):
+ print "NOTE: %s" % event[1]['_message']
+ continue
+ if event[0].startswith('bb.event.ParseProgress'):
+ x = event[1]['sofar']
+ y = event[1]['total']
+ if os.isatty(sys.stdout.fileno()):
+ sys.stdout.write("\rNOTE: Handling BitBake files: %s (%04d/%04d) [%2d %%]" % ( parsespin.next(), x, y, x*100/y ) )
+ sys.stdout.flush()
+ else:
+ if x == 1:
+ sys.stdout.write("Parsing .bb files, please wait...")
+ sys.stdout.flush()
+ if x == y:
+ sys.stdout.write("done.")
+ sys.stdout.flush()
+ if x == y:
+ print("\nParsing finished. %d cached, %d parsed, %d skipped, %d masked, %d errors."
+ % ( event[1]['cached'], event[1]['parsed'], event[1]['skipped'], event[1]['masked'], event[1]['errors']))
+ continue
+
+ if event[0] == 'bb.command.CookerCommandCompleted':
+ break
+ if event[0] == 'bb.command.CookerCommandFailed':
+ print "Command execution failed: %s" % event[1]['error']
+ break
+ if event[0] == 'bb.cooker.CookerExit':
+ break
+
+ # ignore
+ if event[0].startswith('bb.event.BuildStarted'):
+ continue
+ if event[0].startswith('bb.event.BuildCompleted'):
+ continue
+ if event[0].startswith('bb.event.MultipleProviders'):
+ continue
+ if event[0].startswith('bb.runqueue.runQueue'):
+ continue
+ print "Unknown Event: %s" % event
+
+ except KeyboardInterrupt:
+ if shutdown == 2:
+ print "\nThird Keyboard Interrupt, exit.\n"
+ break
+ if shutdown == 1:
+ print "\nSecond Keyboard Interrupt, stopping...\n"
+ frontend.runCommand(["stateStop"])
+ if shutdown == 0:
+ print "\nKeyboard Interrupt, closing down...\n"
+ frontend.runCommand(["stateShutdown"])
+ shutdown = shutdown + 1
+ pass