aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libbe/comment.py126
-rw-r--r--libbe/storage/util/__init__.py0
-rw-r--r--libbe/storage/util/config.py (renamed from libbe/storage/vcs/util/config.py)0
3 files changed, 53 insertions, 73 deletions
diff --git a/libbe/comment.py b/libbe/comment.py
index 32536d4..0e23d3c 100644
--- a/libbe/comment.py
+++ b/libbe/comment.py
@@ -1,4 +1,3 @@
-# Bugs Everywhere, a distributed bugtracker
# Copyright (C) 2008-2009 Gianluca Montecchi <gian@grys.it>
# Thomas Habets <thomas@habets.pp.se>
# W. Trevor King <wking@drexel.edu>
@@ -34,14 +33,15 @@ except ImportError: # look for non-core module
import xml.sax.saxutils
import libbe
-from beuuid import uuid_gen
-from properties import Property, doc_property, local_property, \
+import libbe.util.id
+from libbe.storage.properties import Property, doc_property, local_property, \
defaulting_property, checked_property, cached_property, \
primed_property, change_hook_property, settings_property
-import settings_object
-import mapfile
-from tree import Tree
-import utility
+import libbe.storage.settings_object as settings_object
+import libbe.storage.util.mapfile as mapfile
+from libbe.util.tree import Tree
+import libbe.util.utility as utility
+
if libbe.TESTING == True:
import doctest
@@ -72,17 +72,14 @@ def loadComments(bug, load_full=False):
Set load_full=True when you want to load the comment completely
from disk *now*, rather than waiting and lazy loading as required.
"""
- if bug.sync_with_disk == False:
- raise DiskAccessRequired("load comments")
- path = bug.get_path("comments")
- if not os.path.exists(path):
- return Comment(bug, uuid=INVALID_UUID)
+ uuids = []
+ for id in bug.storage.children():
+ parsed = libbe.util.id.parse_id(id)
+ if parsed['type'] == 'comment':
+ uuids.append(parsed['comment'])
comments = []
- for uuid in os.listdir(path):
- if uuid.startswith('.'):
- continue
- comm = Comment(bug, uuid, from_disk=True)
- comm.set_sync_with_disk(bug.sync_with_disk)
+ for uuid in uuids:
+ comm = Comment(bug, uuid, from_storage=True)
if load_full == True:
comm.load_settings()
dummy = comm.body # force the body to load
@@ -92,8 +89,6 @@ def loadComments(bug, load_full=False):
return bug.comment_root
def saveComments(bug):
- if bug.sync_with_disk == False:
- raise DiskAccessRequired("save comments")
for comment in bug.comment_root.traverse():
comment.save()
@@ -154,15 +149,14 @@ class Comment(Tree, settings_object.SavedSettingsObject):
doc="An integer version of .date")
def _get_comment_body(self):
- if self.vcs != None and self.sync_with_disk == True:
- import vcs
- binary = not self.content_type.startswith("text/")
- return self.vcs.get_file_contents(self.get_path("body"), binary=binary)
+ if self.storage != None and self.storage.readable:
+ return self.storage.get(self.id("body"),
+ decode=self.content_type.startswith("text/"))
def _set_comment_body(self, old=None, new=None, force=False):
- if (self.vcs != None and self.sync_with_disk == True) or force==True:
+ if (self.storage != None and self.storage.writeable == True) \
+ or force==True:
assert new != None, "Can't save empty comment"
- binary = not self.content_type.startswith("text/")
- self.vcs.set_file_contents(self.get_path("body"), new, binary=binary)
+ self.storage.set(self.id("body"), new)
@Property
@change_hook_property(hook=_set_comment_body)
@@ -171,15 +165,15 @@ class Comment(Tree, settings_object.SavedSettingsObject):
@doc_property(doc="The meat of the comment")
def body(): return {}
- def _get_vcs(self):
- if hasattr(self.bug, "vcs"):
- return self.bug.vcs
+ def _get_storage(self):
+ if hasattr(self.bug, "storage"):
+ return self.bug.storage
@Property
- @cached_property(generator=_get_vcs)
- @local_property("vcs")
+ @cached_property(generator=_get_storage)
+ @local_property("storage")
@doc_property(doc="A revision control system instance.")
- def vcs(): return {}
+ def storage(): return {}
def _extra_strings_check_fn(value):
return utility.iterable_full_of_strings(value, \
@@ -213,15 +207,14 @@ class Comment(Tree, settings_object.SavedSettingsObject):
settings_object.SavedSettingsObject.__init__(self)
self.bug = bug
self.uuid = uuid
- if from_disk == True:
- self.sync_with_disk = True
- else:
- self.sync_with_disk = False
+ if from_disk == False:
if uuid == None:
- self.uuid = uuid_gen()
+ self.uuid = libbe.util.id.uuid_gen()
+ self.settings = {}
+ self._setup_saved_settings()
self.time = int(time.time()) # only save to second precision
- if self.vcs != None:
- self.author = self.vcs.get_user_id()
+ if self.bug != None:
+ self.author = self.bug.get_user_id()
self.in_reply_to = in_reply_to
self.body = body
@@ -587,53 +580,42 @@ class Comment(Tree, settings_object.SavedSettingsObject):
# methods for saving/loading/acessing settings and properties.
- def get_path(self, *args):
- dir = os.path.join(self.bug.get_path("comments"), self.uuid)
- if len(args) == 0:
- return dir
+ def id(self, *args):
+ assert len(args) <= 1, str(args)
assert args[0] in ["values", "body"], str(args)
- return os.path.join(dir, *args)
-
- def set_sync_with_disk(self, value):
- self.sync_with_disk = value
+ return libbe.util.id.comment_id(self, args)
def load_settings(self):
- if self.sync_with_disk == False:
- raise DiskAccessRequired("load settings")
- self.settings = mapfile.map_load(self.vcs, self.get_path("values"))
+ mf = self.storage.get(self.id("values"), default="\n")
+ self.settings = mapfile.parse(mf)
self._setup_saved_settings()
def save_settings(self):
- if self.sync_with_disk == False:
- raise DiskAccessRequired("save settings")
- self.vcs.mkdir(self.get_path())
- path = self.get_path("values")
- mapfile.map_save(self.vcs, path, self._get_saved_settings())
+ mf = mapfile.generate(self._get_saved_settings())
+ self.storage.set(self.id("values"), mf)
def save(self):
"""
- Save any loaded contents to disk.
+ Save any loaded contents to storage.
- However, if self.sync_with_disk = True, then any changes are
- automatically written to disk as soon as they happen, so
- calling this method will just waste time (unless something
- else has been messing with your on-disk files).
+ However, if self.storage.writeable = True, then any changes
+ are automatically written to storage as soon as they happen,
+ so calling this method will just waste time (unless something
+ else has been messing with your stored files).
"""
- sync_with_disk = self.sync_with_disk
- if sync_with_disk == False:
- self.set_sync_with_disk(True)
+ assert self.storage != None, "Can't save without storage"
assert self.body != None, "Can't save blank comment"
+ self.storage.add(self.id())
+ self.storage.add(self.id('values'))
+ self.storage.add(self.id('body'))
self.save_settings()
self._set_comment_body(new=self.body, force=True)
- if sync_with_disk == False:
- self.set_sync_with_disk(False)
def remove(self):
- if self.sync_with_disk == False and self.uuid != INVALID_UUID:
- raise DiskAccessRequired("remove")
- for comment in self.traverse():
- path = comment.get_path()
- self.vcs.recursive_remove(path)
+ for comment in self:
+ comment.remove()
+ if self.uuid != INVALID_UUID:
+ self.storage.recursive_remove(self.id())
def add_reply(self, reply, allow_time_inversion=False):
if self.uuid != INVALID_UUID:
@@ -651,9 +633,7 @@ class Comment(Tree, settings_object.SavedSettingsObject):
reply = Comment(self.bug, body=body)
if content_type != None: # set before saving body to decide binary format
reply.content_type = content_type
- if self.bug != None:
- reply.set_sync_with_disk(self.bug.sync_with_disk)
- if reply.sync_with_disk == True:
+ if reply.storage != None and reply.storage.is_writeable():
reply.save()
self.add_reply(reply)
return reply
diff --git a/libbe/storage/util/__init__.py b/libbe/storage/util/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/libbe/storage/util/__init__.py
diff --git a/libbe/storage/vcs/util/config.py b/libbe/storage/util/config.py
index ccd236b..ccd236b 100644
--- a/libbe/storage/vcs/util/config.py
+++ b/libbe/storage/util/config.py