Ensured .be is source for Arch (closes 381)
authorAaron Bentley <abentley@panoramicfeedback.com>
Wed, 18 May 2005 17:07:00 +0000 (17:07 +0000)
committerAaron Bentley <abentley@panoramicfeedback.com>
Wed, 18 May 2005 17:07:00 +0000 (17:07 +0000)
Modified bug reports:
 381: Ensure .be is source in Arch
status: open -> closed

.be/bugs/381555eb-f2e3-4ef0-8303-d759c00b390a/values
becommands/set_root.py
libbe/arch.py
libbe/tests.py

index 12f7fbfdc79c71de28e0e84d701a90252bc59e21..d17ea97fbd2fbd5d2c907b8a9f0b6711cb711075 100644 (file)
@@ -15,7 +15,7 @@ severity=minor
 
 
 
-status=open
+status=closed
 
 
 
index ceed0dd1493609c50387d2829fdcd0b767641dad..ad20b8ee0ecd7b8c2633c3bcd2ed542e81709f39 100644 (file)
@@ -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}")
index e9f7951d430da66f15569e3f30a81e83ee6fc8cd..55daed0a9eb6e7a8a00251b0c38f895b4ed59ac4 100644 (file)
@@ -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)
 
index 9a3fea3d930f8f92aa2d4cc8b21abc14d9eef644..2662df19ad4f9c9f27a939e262c90b2bff607b16 100644 (file)
@@ -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():