From 072de5077de9a96b3beab518089d98e50f2bbd00 Mon Sep 17 00:00:00 2001 From: Aaron Bentley Date: Wed, 18 May 2005 17:07:00 +0000 Subject: [PATCH] Ensured .be is source for Arch (closes 381) Modified bug reports: 381: Ensure .be is source in Arch status: open -> closed --- .../values | 2 +- becommands/set_root.py | 2 +- libbe/arch.py | 87 ++++++++++++++++++- libbe/tests.py | 2 +- 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/.be/bugs/381555eb-f2e3-4ef0-8303-d759c00b390a/values b/.be/bugs/381555eb-f2e3-4ef0-8303-d759c00b390a/values index 12f7fbf..d17ea97 100644 --- a/.be/bugs/381555eb-f2e3-4ef0-8303-d759c00b390a/values +++ b/.be/bugs/381555eb-f2e3-4ef0-8303-d759c00b390a/values @@ -15,7 +15,7 @@ severity=minor -status=open +status=closed diff --git a/becommands/set_root.py b/becommands/set_root.py index ceed0dd..ad20b8e 100644 --- a/becommands/set_root.py +++ b/becommands/set_root.py @@ -32,7 +32,7 @@ def execute(args): >>> bd = bugdir.tree_root(dir.name) >>> bd.root = dir.name >>> dir = tests.arch_dir() - >>> execute([dir.name+"/{arch}"]) + >>> execute([dir.name]) Using Arch for revision control. Directory initialized. >>> bd = bugdir.tree_root(dir.name+"/{arch}") diff --git a/libbe/arch.py b/libbe/arch.py index e9f7951..55daed0 100644 --- a/libbe/arch.py +++ b/libbe/arch.py @@ -39,13 +39,98 @@ def invoke_client(*args, **kwargs): raise Exception("Command failed: %s" % error) return output -def add_id(filename): +def write_tree_settings(contents, path): + file(os.path.join(path, "{arch}", "=tagging-method"), "wb").write(contents) + +def init_tree(path): + invoke_client("init-tree", "-d", path) + +def temp_arch_tree(type="easy"): + import tempfile + path = tempfile.mkdtemp() + init_tree(path) + if type=="easy": + write_tree_settings("source ^.*$\n", path) + elif type=="tricky": + write_tree_settings("source ^$\n", path) + else: + assert (type=="impossible") + add_dir_rule("precious ^\.boo$", path, path) + return path + +def list_added(root): + assert os.path.exists(root) + assert os.access(root, os.X_OK) + root = os.path.realpath(root) + inv_str = invoke_client("inventory", "--source", '--both', '--all', root) + return [os.path.join(root, p) for p in inv_str.split('\n')] + +def tree_root(filename): + assert os.path.exists(filename) + if not os.path.isdir(filename): + dirname = os.path.dirname(filename) + else: + dirname = filename + return invoke_client("tree-root", dirname).rstrip('\n') + +def rel_filename(filename, root): + assert(filename.startswith(root)) + return filename[len(root)+1:] + +class CantAddFile(Exception): + def __init__(self, file): + self.file = file + Exception.__init__(self, "Can't automatically add file %s" % file) + + +def add_dir_rule(rule, dirname, root): + inv_filename = os.path.join(dirname, '.arch-inventory') + file(inv_filename, "ab").write(rule) + if os.path.realpath(inv_filename) not in list_added(root): + add_id(inv_filename, no_force=True) + +def force_source(filename, root): + rule = "source %s\n" % rel_filename(filename, root) + add_dir_rule(rule, os.path.dirname(filename), root) + if os.path.realpath(filename) not in list_added(root): + raise CantAddFile(filename) + +def add_id(filename, no_force=False): invoke_client("add-id", filename) + root = tree_root(filename) + if os.path.realpath(filename) not in list_added(root) and not no_force: + force_source(filename, root) + def delete_id(filename): invoke_client("delete-id", filename) +def test_helper(type): + t = temp_arch_tree(type) + dirname = os.path.join(t, ".boo") + return dirname, t + def mkdir(path): + """ + >>> import shutil + >>> dirname,t = test_helper("easy") + >>> mkdir(dirname) + >>> assert os.path.realpath(dirname) in list_added(t) + >>> assert not os.path.exists(os.path.join(t, ".arch-inventory")) + >>> shutil.rmtree(t) + >>> dirname,t = test_helper("tricky") + >>> mkdir(dirname) + >>> assert os.path.realpath(dirname) in list_added(t) + >>> assert os.path.exists(os.path.join(t, ".arch-inventory")) + >>> shutil.rmtree(t) + >>> dirname,t = test_helper("impossible") + >>> try: + ... mkdir(dirname) + ... except CantAddFile, e: + ... print "Can't add file" + Can't add file + >>> shutil.rmtree(t) + """ os.mkdir(path) add_id(path) diff --git a/libbe/tests.py b/libbe/tests.py index 9a3fea3..2662df1 100644 --- a/libbe/tests.py +++ b/libbe/tests.py @@ -37,7 +37,7 @@ class Dir: def arch_dir(): dir = Dir() - os.mkdir(os.path.join(dir.name, "{arch}")) + arch.init_tree(dir.name) return dir def bug_arch_dir(): -- 2.26.2