~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/statcache.py

  • Committer: Martin Pool
  • Date: 2005-05-24 21:14:28 UTC
  • Revision ID: mbp@sourcefrog.net-20050524211428-387e8b9c4910d3e1
- Write statcache using \u style encoding to avoid
  problems with quopri encoding causing line-wrapping etc.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
import stat, os, sha, time
18
 
from binascii import b2a_qp, a2b_qp
19
18
 
20
19
from trace import mutter
21
20
from errors import BzrError, BzrCheckError
66
65
 
67
66
The SHA-1 is stored in memory as a hexdigest.
68
67
 
69
 
File names and file-ids are written out as the quoted-printable
70
 
encoding of their UTF-8 representation.  (file-ids shouldn't contain
71
 
wierd characters, but it might happen.)
 
68
File names and file-ids are written out with non-ascii or whitespace
 
69
characters given as python-style unicode escapes.  (file-ids shouldn't
 
70
contain wierd characters, but it might happen.)
72
71
"""
73
72
 
74
73
# order of fields returned by fingerprint()
90
89
 
91
90
 
92
91
 
93
 
CACHE_HEADER = "### bzr statcache v2"
 
92
CACHE_HEADER = "### bzr statcache v3"
94
93
 
95
94
 
96
95
def fingerprint(abspath):
107
106
            fs.st_ctime, fs.st_ino, fs.st_dev)
108
107
 
109
108
 
 
109
 
 
110
def safe_quote(s):
 
111
    return s.encode('unicode_escape') \
 
112
           .replace('\n', '\\u000a')  \
 
113
           .replace(' ', '\\u0020')   \
 
114
           .replace('\r', '\\u000d')
 
115
 
 
116
 
110
117
def _write_cache(basedir, entry_iter, dangerfiles):
111
118
    from atomicfile import AtomicFile
112
119
 
120
127
            
121
128
            if entry[SC_FILE_ID] in dangerfiles:
122
129
                continue                # changed too recently
123
 
            outf.write(b2a_qp(entry[0].encode('utf-8'))) # file id
124
 
            outf.write(' ')
125
 
            outf.write(entry[1])        # hex sha1
126
 
            outf.write(' ')
127
 
            outf.write(b2a_qp(entry[2].encode('utf-8'), True)) # name
 
130
            outf.write(safe_quote(entry[0])) # file id
 
131
            outf.write(' ')
 
132
            outf.write(entry[1])             # hex sha1
 
133
            outf.write(' ')
 
134
            outf.write(safe_quote(entry[2])) # name
128
135
            for nf in entry[3:]:
129
136
                outf.write(' %d' % nf)
130
137
            outf.write('\n')
156
163
    for l in cachefile:
157
164
        f = l.split(' ')
158
165
 
159
 
        file_id = a2b_qp(f[0]).decode('utf-8')
 
166
        file_id = f[0].decode('unicode_escape')
160
167
        if file_id in cache:
161
168
            raise BzrCheckError("duplicated file_id in cache: {%s}" % file_id)
162
169
 
164
171
        if len(text_sha) != 40 or not sha_re.match(text_sha):
165
172
            raise BzrCheckError("invalid file SHA-1 in cache: %r" % text_sha)
166
173
        
167
 
        path = a2b_qp(f[2]).decode('utf-8')
 
174
        path = f[2].decode('unicode_escape')
168
175
        if path in seen_paths:
169
176
            raise BzrCheckError("duplicated path in cache: %r" % path)
170
177
        seen_paths[path] = True