/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5247.1.4 by Vincent Ladeuil
Merge cleanup into first-try
1
# Copyright (C) 2005, 2006, 2008, 2009, 2010 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
16
1608.2.1 by Martin Pool
[merge] Storage filename escaping
17
"""A store that keeps the full text of every version.
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
18
19
This store keeps uncompressed versions of the full text. It does not
20
do any sort of delta compression.
21
"""
22
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
23
import gzip
7479.2.1 by Jelmer Vernooij
Drop python2 support.
24
from io import BytesIO
1185.16.159 by John Arbash Meinel
Updated the stores, all tests pass, and a store doesn't have to be 100% compressed
25
import os
3350.6.1 by Robert Collins
* New ``versionedfile.KeyMapper`` interface to abstract out the access to
26
6686.2.1 by Jelmer Vernooij
Move breezy.store to breezy.plugins.weave_fmt, its only user.
27
from .... import osutils
28
from ....errors import BzrError, NoSuchFile, FileExists
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
29
from . import TransportStore
6686.2.1 by Jelmer Vernooij
Move breezy.store to breezy.plugins.weave_fmt, its only user.
30
from ....trace import mutter
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
31
32
33
class TextStore(TransportStore):
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
34
    """Store that holds files indexed by unique names.
35
36
    Files can be added, but not modified once they are in.  Typically
37
    the hash is used as the name, or something else known to be unique,
38
    such as a UUID.
39
1393.2.4 by John Arbash Meinel
All tests pass.
40
    Files are stored uncompressed, with no delta compression.
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
41
    """
42
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
43
    def _add_compressed(self, fn, f):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
44
        if isinstance(f, bytes):
45
            f = BytesIO(f)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
46
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
47
        sio = BytesIO()
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
48
        gf = gzip.GzipFile(mode='wb', fileobj=sio)
49
        # if pumpfile handles files that don't fit in ram,
50
        # so will this function
6686.2.1 by Jelmer Vernooij
Move breezy.store to breezy.plugins.weave_fmt, its only user.
51
        osutils.pumpfile(f, gf)
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
52
        gf.close()
53
        sio.seek(0)
1185.16.159 by John Arbash Meinel
Updated the stores, all tests pass, and a store doesn't have to be 100% compressed
54
        self._try_put(fn, sio)
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
55
1442.1.28 by Robert Collins
pull up core TransportStore.add from TextStore.add and CompressedTextStore.add
56
    def _add(self, fn, f):
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
57
        if self._compressed:
58
            self._add_compressed(fn, f)
59
        else:
1185.16.159 by John Arbash Meinel
Updated the stores, all tests pass, and a store doesn't have to be 100% compressed
60
            self._try_put(fn, f)
61
62
    def _try_put(self, fn, f):
63
        try:
1955.3.9 by John Arbash Meinel
Find more occurrances of put() and replace with put_file or put_bytes
64
            self._transport.put_file(fn, f, mode=self._file_mode)
1185.16.159 by John Arbash Meinel
Updated the stores, all tests pass, and a store doesn't have to be 100% compressed
65
        except NoSuchFile:
66
            if not self._prefixed:
67
                raise
68
            try:
1185.58.4 by John Arbash Meinel
Added permission checking to Branch, and propogated that change into the stores.
69
                self._transport.mkdir(os.path.dirname(fn), mode=self._dir_mode)
1185.16.159 by John Arbash Meinel
Updated the stores, all tests pass, and a store doesn't have to be 100% compressed
70
            except FileExists:
71
                pass
1955.3.9 by John Arbash Meinel
Find more occurrances of put() and replace with put_file or put_bytes
72
            self._transport.put_file(fn, f, mode=self._file_mode)
1393.2.2 by John Arbash Meinel
Updated stores to use Transport
73
1442.1.39 by Robert Collins
unify has() implementations for TransportStore classes
74
    def _get(self, fn):
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
75
        if fn.endswith('.gz'):
76
            return self._get_compressed(fn)
77
        else:
78
            return self._transport.get(fn)
79
80
    def _get_compressed(self, filename):
81
        """Returns a file reading from a particular entry."""
82
        f = self._transport.get(filename)
83
        # gzip.GzipFile.read() requires a tell() function
84
        # but some transports return objects that cannot seek
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
85
        # so buffer them in a BytesIO instead
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
86
        if getattr(f, 'tell', None) is not None:
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
87
            return gzip.GzipFile(mode='rb', fileobj=f)
4708.2.2 by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib
88
        try:
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
89
            sio = BytesIO(f.read())
1185.16.157 by John Arbash Meinel
Added ability for TextStore to handle both compressed and uncompressed, it just looks for one type first
90
            return gzip.GzipFile(mode='rb', fileobj=sio)
4708.2.2 by Martin
Workingtree changes sitting around since November, more explict closing of files in bzrlib
91
        finally:
92
            f.close()