# HG changeset patch # User Bernhard Herzog # Date 1205956232 0 # Node ID 7f6fb8103db051826232f581ce0b4d9d06e71198 # Parent ba677506e95e8d517475397f9fa78864e8626364 Move the sed-like replacement code from enterprise/kdepim.py to treepkg/util.py This creates a new function treepkg.util.replace_in_file with some tests in test/test_util.py and new test support code in test/filesupport.py. Also, adapt enterprise/kdepim.py to use the new function. diff -r ba677506e95e -r 7f6fb8103db0 enterprise/kdepim.py --- a/enterprise/kdepim.py Wed Mar 19 15:00:54 2008 +0000 +++ b/enterprise/kdepim.py Wed Mar 19 19:50:32 2008 +0000 @@ -1,4 +1,4 @@ -# Copyright (C) 2007 by Intevation GmbH +# Copyright (C) 2007, 2008 by Intevation GmbH # Authors: # Bernhard Herzog # @@ -44,12 +44,9 @@ versionstring = "(enterprise %s)" % self.enterprise_version for versionfile in ["kmail/kmversion.h", "kontact/src/main.cpp", "korganizer/version.h"]: - filename = os.path.join(pkgbasedir, versionfile) - patched = re.sub("\(enterprise ([^)]*)\)", versionstring, - open(filename).read()) - f = open(filename, "w") - f.write(patched) - f.close() + treepkg.util.replace_in_file(os.path.join(pkgbasedir, versionfile), + "\(enterprise ([^)]*)\)", + versionstring) def do_package(self): pkgbaseversion, pkgbasedir = self.export_sources() diff -r ba677506e95e -r 7f6fb8103db0 test/filesupport.py --- a/test/filesupport.py Wed Mar 19 15:00:54 2008 +0000 +++ b/test/filesupport.py Wed Mar 19 19:50:32 2008 +0000 @@ -90,3 +90,7 @@ self.create_files(newdir, contents) else: writefile(os.path.join(directory, name), contents) + + def checkFileContents(self, filename, contents): + """check the contents of a file""" + self.assertEquals(open(filename).read(), contents) diff -r ba677506e95e -r 7f6fb8103db0 test/test_util.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/test_util.py Wed Mar 19 19:50:32 2008 +0000 @@ -0,0 +1,35 @@ +# Copyright (C) 2007, 2008 by Intevation GmbH +# Authors: +# Bernhard Herzog +# +# This program is free software under the GPL (>=v2) +# Read the file COPYING coming with the software for details. + +"""Tests for the treepkg.util module""" + +import unittest + +from filesupport import FileTestMixin + +from treepkg.util import replace_in_file + + +class TestReplaceInFile(unittest.TestCase, FileTestMixin): + + def runtest(self, orig_contents, expected_contents, pattern, replacement): + filename = self.create_temp_file(self.id(), orig_contents) + replace_in_file(filename, pattern, replacement) + self.checkFileContents(filename, expected_contents) + + def test_version_replacement(self): + template = ("project foo version 1.0-svn%(rev)d" + "Some filler" + "text that sometimes" + "looks similar to the pattern" + "1.0-" + "foo 1.2-svn2" + "echo foo version 1.0-svn%(rev)d" + "" + "and more filler") + self.runtest(template % dict(rev=0), template % dict(rev=321), + r"1\.0-svn0", "1.0-svn321") diff -r ba677506e95e -r 7f6fb8103db0 treepkg/util.py --- a/treepkg/util.py Wed Mar 19 15:00:54 2008 +0000 +++ b/treepkg/util.py Wed Mar 19 19:50:32 2008 +0000 @@ -8,6 +8,7 @@ """Collection of functions that didn't fit elsewhere""" import os +import re import tempfile import shutil @@ -114,3 +115,17 @@ finally: if os.path.exists(tempname): os.remove(tempname) + + +def replace_in_file(filename, pattern, replacement): + """Replace all occurrences of pattern in a file with replacement. + The file is modified in place. The search and replace is done with + the re.sub function. The pattern and replacement parameter are passed + through to re.sub unmodified, so their semantics are determined by + re.sub. + """ + contents = open(filename).read() + modified = re.sub(pattern, replacement, contents) + f = open(filename, "w") + f.write(modified) + f.close()