X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=roundup%2Finstall_util.py;h=e54dc933ee8c8883072cc19a1c061cf223a321b0;hb=c64e9460d9b73a28504402dc68d92f297f64cba6;hp=da82bca717695e52fa567952a4e60a97bf104ee3;hpb=e6b41079cc7bba232a57023492c4ddfcea592b82;p=roundup.git diff --git a/roundup/install_util.py b/roundup/install_util.py index da82bca..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.3 2001-11-12 22:38:48 richard 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): @@ -71,48 +82,69 @@ class DigestFile: def close(self): file, ext = os.path.splitext(self.filename) - # ".filter", ".index", ".item" are roundup-specific - if ext in [".xml", ".ent", ".html", ".filter", ".index", ".item"]: + if ext in sgml_file_types: self.file.write("\n" % (self.digest.hexdigest(),)) - elif ext in [".py", ".sh", ".conf", ".cgi", '']: + elif ext in hash_file_types: self.file.write("#SHA: %s\n" % (self.digest.hexdigest(),)) - elif ext in [".css"]: + 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 $ -# Revision 1.2 2001/11/12 22:37:13 richard -# Handle all the various file formats in roundup -# -# Revision 1.1 2001/11/12 22:26:32 jhermann -# Added install utils (digest calculation) -# - +# vim: set filetype=python ts=4 sw=4 et si