#!/usr/bin/env python import os import shutil import subprocess import tempfile import unittest import urllib def call(argv, *args, **kwargs): kwargs.setdefault("stdin", subprocess.PIPE) kwargs.setdefault("stdout", subprocess.PIPE) kwargs.setdefault("stderr", subprocess.STDOUT) child = subprocess.Popen(argv, *args, **kwargs) stdout, stderr = child.communicate() if child.returncode != 0: raise Exception("Child %r exited with code %r:\n%s" % (argv, child.returncode, stdout)) return stdout def write(path, data): fh = open(path, "wb") try: fh.write(data) finally: fh.close() def read(path): fh = open(path) try: return fh.read() finally: fh.close() class BzrSvnBackslashTest(unittest.TestCase): BZR = "bzr" SVNADMIN = "svnadmin" SVN = "svn" NORMAL_BASENAME = "file without backslash" BACKSLASH_BASENAME = "file with \\ backslash" def setUp(self): self.dir = os.path.abspath( tempfile.mkdtemp(prefix="bzr-svn-backslash-test+")) def check_bzr_alone(self, subdir, basename): os.makedirs(os.path.join(self.dir, subdir)) bzr_dir = os.path.join(self.dir, subdir, "bzr") call([self.BZR, "init", bzr_dir]) write(os.path.join(bzr_dir, basename), basename) call([self.BZR, "add", basename], cwd=bzr_dir) call([self.BZR, "commit", "-m", "test"], cwd=bzr_dir) def check_bzr_from_svn(self, subdir, basename): os.makedirs(os.path.join(self.dir, subdir)) svn_repo_dir = os.path.join(self.dir, subdir, "svn-repo") call([self.SVNADMIN, "create", svn_repo_dir]) svn_working_dir = os.path.join(self.dir, subdir, "svn-working-dir") call([self.SVN, "checkout", "file://%s" % svn_repo_dir, svn_working_dir]) write(os.path.join(svn_working_dir, basename), basename) call([self.SVN, "add", basename], cwd=svn_working_dir) call([self.SVN, "commit", "-m", "test"], cwd=svn_working_dir) bzr_dir = os.path.join(self.dir, subdir, "bzr") call([self.BZR, "branch", "file://%s" % svn_repo_dir, bzr_dir]) test_bzr_alone_normal = lambda self: \ self.check_bzr_alone("bzr-alone-normal", self.NORMAL_BASENAME) test_bzr_alone_backslash = lambda self: \ self.check_bzr_alone("bzr-alone-backslash", self.BACKSLASH_BASENAME) test_bzr_from_svn_normal = lambda self: \ self.check_bzr_from_svn("bzr-from-svn-normal", self.NORMAL_BASENAME) test_bzr_from_svn_backslash = lambda self: \ self.check_bzr_from_svn("bzr-from-svn-backslash", self.BACKSLASH_BASENAME) def tearDown(self): shutil.rmtree(self.dir) if __name__ == "__main__": unittest.main()