1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#!/usr/bin/env python
"""\
An implementation of the Transport object for local
filesystem access.
"""
from bzrlib.transport import Transport, protocol_handlers
import os
class LocalTransport(Transport):
"""This is the transport agent for local filesystem access."""
def __init__(self, base):
"""Set the base path where files will be stored."""
from os.path import realpath
super(LocalTransport, self).__init__(realpath(base))
def is_remote(self):
return False
def clone(self, offset=None):
"""Return a new LocalTransport with root at self.base + offset
Because the local filesystem does not require a connection,
we can just return a new object.
"""
if offset is None:
return LocalTransport(self.base)
else:
return LocalTransport(self.abspath(offset))
def abspath(self, relpath):
"""Return the full url to the given relative path.
This can be supplied with a string or a list
"""
if isinstance(relpath, basestring):
relpath = [relpath]
return os.path.join(self.base, *relpath)
def relpath(self, abspath):
"""Return the local path portion from a given absolute path.
"""
from branch import _relpath
return _relpath(self.base, abspath)
def has(self, relpath):
return os.access(self.abspath(relpath), os.F_OK)
def get(self, relpath, decode=False):
"""Get the file at the given relative path.
:param relpath: The relative path to the file
:param decode: If True, assume the file is utf-8 encoded and
decode it into Unicode
"""
if decode:
import codecs
return codecs.open(self.abspath(relpath), 'rb',
encoding='utf-8', buffering=60000)
else:
return open(self.abspath(relpath), 'rb')
def put(self, relpath, f, encode=False):
"""Copy the file-like or string object into the location.
:param relpath: Location to put the contents, relative to base.
:param f: File-like or string object.
:param encode: If True, translate the contents into utf-8 encoded text.
"""
from bzrlib.atomicfile import AtomicFile
if encode:
fp = AtomicFile(self.abspath(relpath), 'wb', encoding='utf-8')
else:
fp = AtomicFile(self.abspath(relpath), 'wb')
try:
self._pump(f, fp)
fp.commit()
finally:
fp.close()
def mkdir(self, relpath):
"""Create a directory at the given path."""
os.mkdir(self.abspath(relpath))
def append(self, relpath, f):
"""Append the text in the file-like object into the final
location.
"""
fp = open(self.abspath(relpath), 'a+b')
self._pump(f, fp)
def copy(self, rel_from, rel_to):
"""Copy the item at rel_from to the location at rel_to"""
import shutil
path_from = self.abspath(rel_from)
path_to = self.abspath(rel_to)
shutil.copy(path_from, path_to)
def move(self, rel_from, rel_to):
"""Move the item at rel_from to the location at rel_to"""
path_from = self.abspath(rel_from)
path_to = self.abspath(rel_to)
os.rename(path_from, path_to)
def delete(self, relpath):
"""Delete the item at relpath"""
os.remove(self.abspath(relpath))
def async_get(self, relpath):
"""Make a request for an file at the given location, but
don't worry about actually getting it yet.
:rtype: AsyncFile
"""
raise NotImplementedError
def list_dir(self, relpath):
"""Return a list of all files at the given location.
WARNING: many transports do not support this, so trying avoid using
it if at all possible.
"""
return os.listdir(self.abspath(relpath))
def stat(self, relpath):
"""Return the stat information for a file.
"""
return os.stat(self.abspath(relpath))
def lock_read(self, relpath):
"""Lock the given file for shared (read) access.
:return: A lock object, which should be passed to Transport.unlock()
"""
from bzrlib.lock import ReadLock
return ReadLock(self.abspath(relpath))
def lock_write(self, relpath):
"""Lock the given file for exclusive (write) access.
WARNING: many transports do not support this, so trying avoid using it
:return: A lock object, which should be passed to Transport.unlock()
"""
from bzrlib.lock import WriteLock
return WriteLock(self.abspath(relpath))
# If nothing else matches, try the LocalTransport
protocol_handlers[None] = LocalTransport
|