Mercurial > hgstorage
changeset 6:161239cbd12b
add iteration, automatic session updating and some tests
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sat, 14 May 2011 00:02:10 +0200 |
| parents | 0be8ec7b9717 |
| children | d041efb32a6c |
| files | hgstorage.py test_repo.py |
| diffstat | 2 files changed, 50 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/hgstorage.py Fri May 13 23:28:54 2011 +0200 +++ b/hgstorage.py Sat May 14 00:02:10 2011 +0200 @@ -5,6 +5,7 @@ import thread import urllib import datetime +import weakref os.environ['HGENCODING'] = 'utf8' os.environ['HGMERGE'] = "internal:merge" @@ -23,6 +24,7 @@ self.prefix = prefix or '' self.ui = self.ui() self._repos = {} + self.sessions = weakref.WeakKeyDictionary() def create(self): repo = mercurial.hg.repository(self.ui, self.path, create=True) @@ -68,7 +70,13 @@ return key def session(self): - return Session(self) + session = Session(self) + self.sessions[session] = None + return session + + def update_sessions(self): + for session in self.sessions: + session._update() class Session(object): @@ -81,7 +89,11 @@ return filename in self.tip def __getitem__(self, key): - return Item(self, key) + return self.meta(key) + + def __iter__(self): + for filename in self.tip: + yield self.storage._file_to_key(filename) def _update(self): """Reset the tip of the repository.""" @@ -124,6 +136,19 @@ end_marker='>>>>>>>', base_marker='|||||||')) + def _filectx(self, key, rev=None): + filename = self.storage._key_to_file(key) + try: + filetip = self.tip[filename] + except mercurial.revlog.LookupError: + raise KeyError("item %r doesn't exist" % key ) + if rev is None: + return filetip + try: + return filetip.filectx(rev) + except mercurial.revlog.LookupError: + raise KeyError() + def save(self, key, data, user=None, message=None, parent_rev=None, encoding=None, force=False): """Save a new revision of the item.""" @@ -145,32 +170,21 @@ text=message or "saved", files=[filename], filectxfn=filectxfn, user=user or "user") self.storage.repo.commitctx(ctx) - self._update() - - def filectx(self, key, rev=None): - filename = self.storage._key_to_file(key) - try: - filetip = self.tip[filename] - except mercurial.revlog.LookupError: - raise KeyError("item %r doesn't exist" % key ) - if rev is None: - filectx = filetip - else: - try: - filectx = filetip.filectx(rev) - except mercurial.revlog.LookupError: - raise KeyError() - return filectx + self.storage.update_sessions() def load(self, key, rev=None, encoding=None): - filectx = self.filectx(key, rev) + """Load the content of an item.""" + + filectx = self._filectx(key, rev) data = filectx.data() if encoding: data = unicode(data, encoding) return data def meta(self, key, rev=None): - filectx = self.filectx(key, rev) + """Provide meta information about an item.""" + + filectx = self._filectx(key, rev) if rev is None: rev = filectx.filerev() date = datetime.datetime.fromtimestamp(filectx.date()[0])
--- a/test_repo.py Fri May 13 23:28:54 2011 +0200 +++ b/test_repo.py Sat May 14 00:02:10 2011 +0200 @@ -96,3 +96,19 @@ data = s.load('title') assert 'a\ntext\n<<<<<<<\nbb|||||||\nb=======\na>>>>>>>\n' == data + def test_silly_parents(self, storage): + s = storage.session() + with py.test.raises(IndexError): + s.save('title', 'text', 'user', 'message', 0) + s.save('title', 'text', 'user', 'message', -1) + with py.test.raises(IndexError): + s.save('title', 'text', 'user', 'message', 1) + + def test_iteration(self, storage): + s = storage.session() + s.save('title', 'text', 'user', 'message', -1) + s.save('title1', 'text', 'user', 'message', -1) + s.save('title2', 'text', 'user', 'message', -1) + items = sorted(s) + assert ['title', 'title1', 'title2'] == items +
