aboutsummaryrefslogblamecommitdiffstats
path: root/libbe/bugdir.py
blob: 7fc1edab56f2ecb7a82270359b23904acbae9be5 (plain) (tree)
1
2
3
4
5


              
            
            






















                                                                    







                                                 











                                                       






                                                 
                                    
                     



                                      
                            

                                 


















                                             

                                      
                                                              

                                                                               
 





                                    




                                                                      

                                      

                                          

                                                             
import os
import os.path
import cmdutil
import errno
import names

class NoBugDir(cmdutil.UserError):
    def __init__(self, path):
        msg = "The directory \"%s\" has no bug directory." % path
        Exception.__init__(self, msg)
        self.path = path
    

def tree_root(dir):
    rootdir = os.path.realpath(dir)
    while (True):
        versionfile=os.path.join(rootdir, ".be/version")
        if os.path.exists(versionfile):
            test_version(versionfile)
            break;
        elif rootdir == "/":
            raise NoBugDir(dir)
        rootdir=os.path.dirname(rootdir)
    return BugDir(os.path.join(rootdir, ".be"))

def test_version(path):
    assert (file(path, "rb").read() == "Bugs Everywhere Tree 0 0\n")

def create_bug_dir(path):
    root = os.path.join(path, ".be")
    os.mkdir(root)
    os.mkdir(os.path.join(root, "bugs"))
    f = file(os.path.join(root, "version"), "wb")
    f.write("Bugs Everywhere Tree 0 0\n")
    return BugDir(path)

class BugDir:
    def __init__(self, dir):
        self.dir = dir
        self.bugs_path = os.path.join(self.dir, "bugs")


    def list(self):
        for uuid in os.listdir(self.bugs_path):
            if (uuid.startswith('.')):
                continue
            yield Bug(self.bugs_path, uuid)

    def new_bug(self):
        uuid = names.uuid()
        path = os.path.join(self.bugs_path, uuid)
        os.mkdir(path)
        return Bug(self.bugs_path, uuid)


def file_property(name, valid=None):
    def getter(self):
        value = self._get_value(name) 
        if valid is not None:
            assert value in valid
        return value
    def setter(self, value):
        if valid is not None:
            assert value in valid
        return self._set_value(name, value)
    return property(getter, setter)

class Bug(object):
    def __init__(self, path, uuid):
        self.path = os.path.join(path, uuid)
        self.uuid = uuid

    def get_path(self, file):
        return os.path.join(self.path, file)

    def _get_name(self):
        return self._get_value("name")
    
    def _set_name(self, value):
        return self._set_value("name", value)
    
    name = file_property("name")
    summary = file_property("summary")
    creator = file_property("creator")
    target = file_property("target")
    status = file_property("status", valid=("open", "closed"))
    severity = file_property("severity", valid=("wishlist", "minor", "serious",
                                                "critical", "fatal"))

    def _get_active(self):
        return self.status == "open"

    active = property(_get_active)

    def _get_value(self, name):
        try:
            return file(self.get_path(name), "rb").read().rstrip("\n")
        except IOError, e:
            if e.errno == errno.EEXIST:
                return None

    def _set_value(self, name, value):
        if value is None:
            os.unlink(self.get_path(name))
        file(self.get_path(name), "wb").write("%s\n" % value)