~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/store.py

  • Committer: Aaron Bentley
  • Date: 2005-09-29 21:07:17 UTC
  • mfrom: (1393.1.6)
  • mto: (1185.25.1)
  • mto: This revision was merged to the branch mainline in revision 1419.
  • Revision ID: abentley@panoramicfeedback.com-20050929210717-cd73981590f17017
Merged the weave changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
# TODO: Could remember a bias towards whether a particular store is typically
 
18
# compressed or not.
 
19
 
17
20
"""
18
21
Stores are the main data-storage mechanism for Bazaar-NG.
19
22
 
21
24
unique ID.
22
25
"""
23
26
 
24
 
import os, tempfile, types, osutils, gzip, errno
 
27
import errno
 
28
import gzip
 
29
import os
 
30
import tempfile
 
31
import types
25
32
from stat import ST_SIZE
26
33
from StringIO import StringIO
27
 
from bzrlib.errors import BzrError
 
34
 
 
35
from bzrlib.errors import BzrError, UnlistableStore
28
36
from bzrlib.trace import mutter
29
37
import bzrlib.ui
 
38
import bzrlib.osutils as osutils
 
39
 
30
40
 
31
41
######################################################################
32
42
# stores
126
136
        pb.update('preparing to copy')
127
137
        to_copy = [id for id in ids if id not in self]
128
138
        if isinstance(other, ImmutableStore):
129
 
            return self.copy_multi_immutable(other, to_copy, pb)
 
139
            return self.copy_multi_immutable(other, to_copy, pb, 
 
140
                                             permit_failure=permit_failure)
130
141
        count = 0
131
142
        failed = set()
132
143
        for id in to_copy:
137
148
            else:
138
149
                try:
139
150
                    entry = other[id]
140
 
                except IndexError:
 
151
                except KeyError:
141
152
                    failed.add(id)
142
153
                    continue
143
154
                self.add(entry, id)
148
159
        return count, failed
149
160
 
150
161
    def copy_multi_immutable(self, other, to_copy, pb, permit_failure=False):
151
 
        from shutil import copyfile
152
162
        count = 0
153
163
        failed = set()
154
164
        for id in to_copy:
155
165
            p = self._path(id)
156
166
            other_p = other._path(id)
157
167
            try:
158
 
                copyfile(other_p, p)
159
 
            except IOError, e:
 
168
                osutils.link_or_copy(other_p, p)
 
169
            except (IOError, OSError), e:
160
170
                if e.errno == errno.ENOENT:
161
171
                    if not permit_failure:
162
 
                        copyfile(other_p+".gz", p+".gz")
 
172
                        osutils.link_or_copy(other_p+".gz", p+".gz")
163
173
                    else:
164
174
                        try:
165
 
                            copyfile(other_p+".gz", p+".gz")
 
175
                            osutils.link_or_copy(other_p+".gz", p+".gz")
166
176
                        except IOError, e:
167
177
                            if e.errno == errno.ENOENT:
168
178
                                failed.add(id)
184
194
        return (os.access(p, os.R_OK)
185
195
                or os.access(p + '.gz', os.R_OK))
186
196
 
187
 
    # TODO: Guard against the same thing being stored twice, compressed and uncompresse
 
197
    # TODO: Guard against the same thing being stored twice,
 
198
    # compressed and uncompressed
188
199
 
189
200
    def __iter__(self):
190
201
        for f in os.listdir(self._basedir):
213
224
            if e.errno != errno.ENOENT:
214
225
                raise
215
226
 
216
 
        raise IndexError(fileid)
 
227
        raise KeyError(fileid)
217
228
 
218
229
 
219
230
    def total_size(self):
253
264
            os.remove(fpath)
254
265
        os.rmdir(self._basedir)
255
266
        mutter("%r destroyed" % self)
 
267
 
 
268
def copy_all(store_from, store_to):
 
269
    """Copy all ids from one store to another."""
 
270
    if not hasattr(store_from, "__iter__"):
 
271
        raise UnlistableStore(store_from)
 
272
    ids = [f for f in store_from]
 
273
    store_to.copy_multi(store_from, ids)