]> arthur.barton.de Git - bup.git/blob - lib/bup/repo.py
97547d539e481b776e915b05a2efe1d5e9929802
[bup.git] / lib / bup / repo.py
1
2 from __future__ import absolute_import
3 from functools import partial
4
5 from bup import client, git
6
7
8 class LocalRepo:
9     def __init__(self, repo_dir=None):
10         self.repo_dir = repo_dir or git.repo()
11         self._cp = git.cp(self.repo_dir)
12         self.rev_list = partial(git.rev_list, repo_dir=self.repo_dir)
13
14     def close(self):
15         pass
16
17     def __del__(self):
18         self.close()
19
20     def __enter__(self):
21         return self
22
23     def __exit__(self, type, value, traceback):
24         self.close()
25
26     def cat(self, ref):
27         """If ref does not exist, yield (None, None, None).  Otherwise yield
28         (oidx, type, size), and then all of the data associated with
29         ref.
30
31         """
32         it = self._cp.get(ref)
33         oidx, typ, size = info = next(it)
34         yield info
35         if oidx:
36             for data in it:
37                 yield data
38         assert not next(it, None)
39
40     def join(self, ref):
41         return self._cp.join(ref)
42
43     def refs(self, patterns=None, limit_to_heads=False, limit_to_tags=False):
44         for ref in git.list_refs(patterns=patterns,
45                                  limit_to_heads=limit_to_heads,
46                                  limit_to_tags=limit_to_tags,
47                                  repo_dir=self.repo_dir):
48             yield ref
49
50 class RemoteRepo:
51     def __init__(self, address):
52         self.address = address
53         self.client = client.Client(address)
54         self.rev_list = self.client.rev_list
55
56     def close(self):
57         if self.client:
58             self.client.close()
59             self.client = None
60
61     def __del__(self):
62         self.close()
63
64     def __enter__(self):
65         return self
66
67     def __exit__(self, type, value, traceback):
68         self.close()
69
70     def cat(self, ref):
71         """If ref does not exist, yield (None, None, None).  Otherwise yield
72         (oidx, type, size), and then all of the data associated with
73         ref.
74
75         """
76         # Yield all the data here so that we don't finish the
77         # cat_batch iterator (triggering its cleanup) until all of the
78         # data has been read.  Otherwise we'd be out of sync with the
79         # server.
80         items = self.client.cat_batch((ref,))
81         oidx, typ, size, it = info = next(items)
82         yield info[:-1]
83         if oidx:
84             for data in it:
85                 yield data
86         assert not next(items, None)
87
88     def join(self, ref):
89         return self.client.join(ref)
90
91     def refs(self, patterns=None, limit_to_heads=False, limit_to_tags=False):
92         for ref in self.client.refs(patterns=patterns,
93                                     limit_to_heads=limit_to_heads,
94                                     limit_to_tags=limit_to_tags):
95             yield ref