X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=roundup%2Finstall_util.py;h=e54dc933ee8c8883072cc19a1c061cf223a321b0;hb=c64e9460d9b73a28504402dc68d92f297f64cba6;hp=5a47e4f92fee57868cc2ad51e916731a8380b163;hpb=9fac5793205697cd17e2c5a3737b9d3c5abe4cf7;p=roundup.git diff --git a/roundup/install_util.py b/roundup/install_util.py index 5a47e4f..e54dc93 100644 --- a/roundup/install_util.py +++ b/roundup/install_util.py @@ -15,9 +15,20 @@ # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. # -# $Id: install_util.py,v 1.1 2001-11-12 22:26:32 jhermann Exp $ +# $Id: install_util.py,v 1.8 2002-09-10 00:18:20 richard Exp $ -import os, sha +__doc__ = """ +Support module to generate and check fingerprints of installed files. +""" + +import os, sha, shutil + +# ".filter", ".index", ".item", ".newitem" are roundup-specific +sgml_file_types = [".xml", ".ent", ".html", ".filter", ".index", ".item", ".newitem"] +hash_file_types = [".py", ".sh", ".conf", ".cgi", ''] +slast_file_types = [".css"] + +digested_file_types = sgml_file_types + hash_file_types + slast_file_types def checkDigest(filename): @@ -32,10 +43,15 @@ def checkDigest(filename): # handle .py/.sh comment fingerprint = lines[-1][6:].strip() elif lines[-1][:10] == "', '') fingerprint = fingerprint.strip() + elif lines[-1][:8] == "/* SHA: ": + # handle css files + fingerprint = lines[-1][8:] + fingerprint = fingerprint.replace('*/', '') + fingerprint = fingerprint.strip() else: return 0 del lines[-1] @@ -66,39 +82,69 @@ class DigestFile: def close(self): file, ext = os.path.splitext(self.filename) - if ext in [".xml", ".ent"]: + if ext in sgml_file_types: self.file.write("\n" % (self.digest.hexdigest(),)) - elif ext in [".py", ".sh", ".conf", '']: + elif ext in hash_file_types: self.file.write("#SHA: %s\n" % (self.digest.hexdigest(),)) + elif ext in slast_file_types: + self.file.write("/* SHA: %s */\n" % (self.digest.hexdigest(),)) self.file.close() +def copyDigestedFile(src, dst, copystat=1): + """ Copy data from `src` to `dst`, adding a fingerprint to `dst`. + If `copystat` is true, the file status is copied, too + (like shutil.copy2). + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + + dummy, ext = os.path.splitext(src) + if ext not in digested_file_types: + if copystat: + return shutil.copy2(src, dst) + else: + return shutil.copyfile(src, dst) + + fsrc = None + fdst = None + try: + fsrc = open(src, 'r') + fdst = DigestFile(dst) + shutil.copyfileobj(fsrc, fdst) + finally: + if fdst: fdst.close() + if fsrc: fsrc.close() + + if copystat: shutil.copystat(src, dst) + + def test(): import sys testdata = open(sys.argv[0], 'r').read() - testfile = "digest_test.py" - out = DigestFile(testfile) - out.write(testdata) - out.close() + for ext in digested_file_types: + testfile = "__digest_test" + ext - assert checkDigest(testfile), "digest ok w/o modification" + out = DigestFile(testfile) + out.write(testdata) + out.close() - mod = open(testfile, 'r+') - mod.seek(0) - mod.write('# changed!') - mod.close() + assert checkDigest(testfile), "digest ok w/o modification" - assert not checkDigest(testfile), "digest fails after modification" + mod = open(testfile, 'r+') + mod.seek(0) + mod.write('# changed!') + mod.close() - os.remove(testfile) + assert not checkDigest(testfile), "digest fails after modification" + + os.remove(testfile) if __name__ == '__main__': test() -# -# $Log: not supported by cvs2svn $ - +# vim: set filetype=python ts=4 sw=4 et si