f1f41ee294a41eebee2e95483dc7c8dc63a00be5
[be.git] / becommands / upgrade.py
1 """Upgrade the bugs to the latest format"""
2 import os.path
3 import errno
4 from libbe import bugdir, rcs
5
6 def execute(args):
7     root = bugdir.tree_root(".", old_version=True)
8     for uuid in root.list_uuids():
9         old_bug = OldBug(root.bugs_path, uuid)
10         
11         new_bug = bugdir.Bug(root.bugs_path, None)
12         new_bug.uuid = old_bug.uuid
13         new_bug.summary = old_bug.summary
14         new_bug.creator = old_bug.creator
15         new_bug.target = old_bug.target
16         new_bug.status = old_bug.status
17         new_bug.severity = old_bug.severity
18
19         new_bug.save()
20     for uuid in root.list_uuids():
21         old_bug = OldBug(root.bugs_path, uuid)
22         old_bug.delete()
23
24     bugdir.set_version(root.dir)
25
26 def file_property(name, valid=None):
27     def getter(self):
28         value = self._get_value(name) 
29         if valid is not None:
30             if value not in valid:
31                 raise InvalidValue(name, value)
32         return value
33     def setter(self, value):
34         if valid is not None:
35             if value not in valid and value is not None:
36                 raise InvalidValue(name, value)
37         return self._set_value(name, value)
38     return property(getter, setter)
39
40
41 class OldBug(object):
42     def __init__(self, path, uuid):
43         self.path = os.path.join(path, uuid)
44         self.uuid = uuid
45
46     def get_path(self, file):
47         return os.path.join(self.path, file)
48
49     summary = file_property("summary")
50     creator = file_property("creator")
51     target = file_property("target")
52     status = file_property("status", valid=("open", "closed"))
53     severity = file_property("severity", valid=("wishlist", "minor", "serious",
54                                                 "critical", "fatal"))
55     def delete(self):
56         self.summary = None
57         self.creator = None
58         self.target = None
59         self.status = None
60         self.severity = None
61         self._set_value("name", None)
62
63     def _get_active(self):
64         return self.status == "open"
65
66     active = property(_get_active)
67
68     def _get_value(self, name):
69         try:
70             return file(self.get_path(name), "rb").read().rstrip("\n")
71         except IOError, e:
72             if e.errno == errno.EEXIST:
73                 return None
74
75     def _set_value(self, name, value):
76         if value is None:
77             try:
78                 rcs.unlink(self.get_path(name))
79             except OSError, e:
80                 if e.errno != 2:
81                     raise
82         else:
83             rcs.set_file_contents(self.get_path(name), "%s\n" % value)
84
85
86