source-checker: usability tweaks
authorMichael Smith <msmith@cbnco.com>
Sat, 27 Jun 2009 21:12:01 +0000 (17:12 -0400)
committerMichael Smith <msmith@cbnco.com>
Wed, 19 Aug 2009 13:12:51 +0000 (09:12 -0400)
checksum sorter, source checker:
* exit(1) on failure;
* send errors to stderr;
* make executable

checksum sorter:
* read from stdin if no arg;
* accept --inplace option to read and write from the same file;
* check that input file exists as ConfigParser.read() doesn't treat
  missing files as an error.

Signed-off-by: Michael Smith <msmith@cbnco.com>
contrib/source-checker/oe-checksums-sorter.py [changed mode: 0644->0755]
contrib/source-checker/oe-source-checker.py [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 2bab58c..cde6ddc
 #
 
 
+import ConfigParser
+import getopt
+import os
 import sys
+import tempfile
 
-if len(sys.argv) < 2:
-    print """
-    OpenEmbedded source checksums script require argument:
+def usage(rc):
+    print """usage: %s [--inplace|-i] conf/checksums.ini
 
-    1. location of conf/checksums.ini
-    """
-    sys.exit(0)
+    --inplace, -i: update file in place (default is to write to stdout)
 
-import ConfigParser, os
+    If no input file is given, will read from standard input.
+    """ % sys.argv[0]
+    sys.exit(rc)
+
+try:
+    optlist, args = getopt.getopt(sys.argv[1:], "ih", ["inplace", "help"])
+except getopt.GetoptError, e:
+    print >> sys.stderr, "%s: %s" % (sys.argv[0], e)
+    usage(1)
+
+inplace = False
+infp = sys.stdin
+filename = None
+for opt, val in optlist:
+    if opt == '-i' or opt == '--inplace':
+        inplace = True
+    elif opt == 'h' or opt == '--help':
+        usage(0)
+    else:
+        print >> sys.stderr, "%s: %s: invalid argument" % (sys.argv[0], opt)
+        usage(1)
+
+if len(args) == 0:
+    if inplace:
+        print >> sys.stderr, "%s: --inplace requires a filename" % sys.argv[0]
+        usage(1)
+elif len(args) == 1:
+    filename = args[0]
+    try:
+        infp = open(filename, "r")
+    except Exception, e:
+        print >> sys.stderr, "%s: %s" % (sys.argv[0], e)
+        sys.exit(1)
+else:
+    print >> sys.stderr, "%s: extra arguments" % sys.argv[0]
+    usage(1)
+
+out = sys.stdout
+tmpfn = None
+if inplace:
+    outfd, tmpfn = tempfile.mkstemp(prefix='cksums',
+                                    dir=os.path.dirname(filename) or '.')
+    os.chmod(tmpfn, os.stat(filename).st_mode)
+    out = os.fdopen(outfd, 'w')
 
 checksums_parser = ConfigParser.ConfigParser()
-checksums_parser.read(sys.argv[1])
+checksums_parser.readfp(infp)
 
 item = 1;
 files_total   = len(checksums_parser.sections())
@@ -60,4 +104,8 @@ for source in checksums_parser.sections():
 new_list.sort()
 
 for entry in new_list:
-    print "[%s]\nmd5=%s\nsha256=%s\n" % (entry[1], entry[2], entry[3])
+    print >> out, "[%s]\nmd5=%s\nsha256=%s\n" % (entry[1], entry[2], entry[3])
+
+if inplace:
+    out.close()
+    os.rename(tmpfn, filename)
old mode 100644 (file)
new mode 100755 (executable)
index 0ae3563..bb14c87
 import sys
 
 if len(sys.argv) < 3:
+    print >> sys.stderr, "%s: missing argument" % sys.argv[0]
     print """
     OpenEmbedded source checker script require two arguments:
 
     1. location of conf/checksums.ini
     2. path to DL_DIR (without "/" at the end)
     """
-    sys.exit(0)
+    sys.exit(1)
 
 import ConfigParser, os, itertools