diff options
author | Steven Knight <knight@baldmt.com> | 2003-09-02 03:11:08 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2003-09-02 03:11:08 (GMT) |
commit | f1d7f1dc87300ea5c905c648c39aeee031100c8c (patch) | |
tree | a2c5f530c8b783381fb7b1aec8a2ef1590936abe /src/script | |
parent | dc59d7046d9705c6b6f7bd6aa88a6a8b620c66f2 (diff) | |
download | SCons-f1d7f1dc87300ea5c905c648c39aeee031100c8c.zip SCons-f1d7f1dc87300ea5c905c648c39aeee031100c8c.tar.gz SCons-f1d7f1dc87300ea5c905c648c39aeee031100c8c.tar.bz2 |
Support using a single .sconsign file. (Stephen Kennedy)
Diffstat (limited to 'src/script')
-rw-r--r-- | src/script/sconsign.py | 200 |
1 files changed, 134 insertions, 66 deletions
diff --git a/src/script/sconsign.py b/src/script/sconsign.py index d70f02b..015f1db 100644 --- a/src/script/sconsign.py +++ b/src/script/sconsign.py @@ -134,6 +134,108 @@ sys.path = libs + sys.path # END STANDARD SCons SCRIPT HEADER ############################################################################## +PF_bsig = 0x1 +PF_csig = 0x2 +PF_timestamp = 0x4 +PF_implicit = 0x8 +PF_all = PF_bsig | PF_csig | PF_timestamp | PF_implicit + +Do_Func = None +Print_Directories = [] +Print_Entries = [] +Print_Flags = 0 +Verbose = 0 +Readable = 0 + +def field(name, pf, val): + if Print_Flags & pf: + if Verbose: + sep = "\n " + name + ": " + else: + sep = " " + return sep + str(val) + else: + return "" + +def printfield(name, entry): + if Readable and entry.timestamp: + ts = "'" + time.ctime(entry.timestamp) + "'" + else: + ts = entry.timestamp + timestamp = field("timestamp", PF_timestamp, ts) + bsig = field("bsig", PF_bsig, entry.bsig) + csig = field("csig", PF_csig, entry.csig) + print name + ":" + timestamp + bsig + csig + if Print_Flags & PF_implicit and entry.implicit: + if Verbose: + print " implicit:" + for i in entry.implicit: + print " %s" % i + +def printentries(entries): + if Print_Entries: + for name in Print_Entries: + try: + entry = entries[name] + except KeyError: + sys.stderr.write("sconsign: no entry `%s' in `%s'\n" % (name, args[0])) + else: + printfield(name, entry) + else: + for name, e in entries.items(): + printfield(name, e) + +import SCons.Sig + +def Do_SConsignDB(name): + import anydbm + import cPickle + try: + open(name, 'rb') + except (IOError, OSError), e: + sys.stderr.write("sconsign: %s\n" % (e)) + return + try: + db = anydbm.open(name, "r") + except anydbm.error, e: + sys.stderr.write("sconsign: ignoring invalid .sconsign.dbm file `%s': %s\n" % (name, e)) + return + if Print_Directories: + for dir in Print_Directories: + try: + val = db[dir] + except KeyError: + sys.stderr.write("sconsign: no dir `%s' in `%s'\n" % (dir, args[0])) + else: + entries = cPickle.loads(val) + print '=== ' + dir + ':' + printentries(entries) + else: + keys = db.keys() + keys.sort() + for dir in keys: + entries = cPickle.loads(db[dir]) + print '=== ' + dir + ':' + printentries(entries) + +def Do_SConsignDir(name): + try: + fp = open(name, 'rb') + except (IOError, OSError), e: + sys.stderr.write("sconsign: %s\n" % (e)) + return + try: + sconsign = SCons.Sig.SConsignDir(fp) + except: + sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s'\n" % name) + return + printentries(sconsign.entries) + +Function_Map = {'dbm' : Do_SConsignDB, + 'sconsign' : Do_SConsignDir} + +############################################################################## + import getopt helpstr = """\ @@ -141,7 +243,9 @@ Usage: sconsign [OPTIONS] FILE [...] Options: -b, --bsig Print build signature information. -c, --csig Print content signature information. - -e, --entry ENTRY Print only info about ENTRY. + -d DIR, --dir=DIR Print only info about DIR. + -e ENTRY, --entry=ENTRY Print only info about ENTRY. + -f FORMAT, --format=FORMAT FILE is in the specified FORMAT. -h, --help Print this message and exit. -i, --implicit Print implicit dependency information. -r, --readable Print timestamps in human-readable form. @@ -149,84 +253,48 @@ Options: -v, --verbose Verbose, describe each field. """ -opts, args = getopt.getopt(sys.argv[1:], "bce:hirtv", - ['bsig', 'csig', 'entry=', 'help', 'implicit', +opts, args = getopt.getopt(sys.argv[1:], "bcd:e:f:hirtv", + ['bsig', 'csig', 'dir=', 'entry=', + 'format=', 'help', 'implicit', 'readable', 'timestamp', 'verbose']) -pf_bsig = 0x1 -pf_csig = 0x2 -pf_timestamp = 0x4 -pf_implicit = 0x8 -pf_all = pf_bsig | pf_csig | pf_timestamp | pf_implicit - -entries = [] -printflags = 0 -verbose = 0 -readable = 0 - for o, a in opts: if o in ('-b', '--bsig'): - printflags = printflags | pf_bsig + Print_Flags = Print_Flags | PF_bsig elif o in ('-c', '--csig'): - printflags = printflags | pf_csig + Print_Flags = Print_Flags | PF_csig + elif o in ('-d', '--dir'): + Print_Directories.append(a) elif o in ('-e', '--entry'): - entries.append(a) + Print_Entries.append(a) + elif o in ('-f', '--format'): + try: + Do_Func = Function_Map[a] + except KeyError: + sys.stderr.write("sconsign: illegal file format `%s'\n" % a) + print helpstr + sys.exit(2) elif o in ('-h', '--help'): print helpstr sys.exit(0) elif o in ('-i', '--implicit'): - printflags = printflags | pf_implicit + Print_Flags = Print_Flags | PF_implicit elif o in ('-r', '--readable'): - readable = 1 + Readable = 1 elif o in ('-t', '--timestamp'): - printflags = printflags | pf_timestamp + Print_Flags = Print_Flags | PF_timestamp elif o in ('-v', '--verbose'): - verbose = 1 + Verbose = 1 -if printflags == 0: - printflags = pf_all - -def field(name, pf, val): - if printflags & pf: - if verbose: - sep = "\n " + name + ": " - else: - sep = " " - return sep + str(val) - else: - return "" - -def printfield(name, entry): - if readable and entry.timestamp: - ts = "'" + time.ctime(entry.timestamp) + "'" - else: - ts = entry.timestamp - timestamp = field("timestamp", pf_timestamp, ts) - bsig = field("bsig", pf_bsig, entry.bsig) - csig = field("csig", pf_csig, entry.csig) - print name + ":" + timestamp + bsig + csig - if printflags & pf_implicit and entry.implicit: - if verbose: - print " implicit:" - for i in entry.implicit: - print " %s" % i - -import SCons.Sig - -def do_sconsign(fp): - sconsign = SCons.Sig._SConsign(fp) - if entries: - for name in entries: - try: - entry = sconsign.entries[name] - except KeyError: - sys.stderr.write("sconsign: no entry `%s' in `%s'\n" % (name, args[0])) - else: - printfield(name, entry) - else: - for name, e in sconsign.entries.items(): - printfield(name, e) - +if Print_Flags == 0: + Print_Flags = PF_all for a in args: - do_sconsign(open(a, 'rb')) + if Do_Func: + Do_Func(a) + elif a[-4:] == '.dbm': + Do_SConsignDB(a) + else: + Do_SConsignDir(a) + +sys.exit(0) |