X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=roundup%2Finstall_util.py;h=e54dc933ee8c8883072cc19a1c061cf223a321b0;hb=0ae2ea5bdf5ec4dc7abc72628924faf0141a265b;hp=bbf1edf52cf3b326906cb866b7d6d21a4a2da42d;hpb=17e0309abd855f17f82b7dcf38684a29ea482040;p=roundup.git diff --git a/roundup/install_util.py b/roundup/install_util.py index bbf1edf..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.2 2001-11-12 22:37:13 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): @@ -37,6 +48,7 @@ def checkDigest(filename): fingerprint = fingerprint.replace('-->', '') fingerprint = fingerprint.strip() elif lines[-1][:8] == "/* SHA: ": + # handle css files fingerprint = lines[-1][8:] fingerprint = fingerprint.replace('*/', '') fingerprint = fingerprint.strip() @@ -70,45 +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"]: - 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 + + out = DigestFile(testfile) + out.write(testdata) + out.close() - assert checkDigest(testfile), "digest ok w/o modification" + assert checkDigest(testfile), "digest ok w/o modification" - mod = open(testfile, 'r+') - mod.seek(0) - mod.write('# changed!') - mod.close() + mod = open(testfile, 'r+') + mod.seek(0) + mod.write('# changed!') + mod.close() - assert not checkDigest(testfile), "digest fails after modification" + assert not checkDigest(testfile), "digest fails after modification" - os.remove(testfile) + os.remove(testfile) if __name__ == '__main__': test() -# -# $Log: not supported by cvs2svn $ -# 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