equal
deleted
inserted
replaced
1258 """ |
1258 """ |
1259 def __init__(self, base, audit=True): |
1259 def __init__(self, base, audit=True): |
1260 self.base = base |
1260 self.base = base |
1261 self.audit = audit |
1261 self.audit = audit |
1262 |
1262 |
|
1263 def __getattr__(self, name): |
|
1264 if name == '_can_symlink': |
|
1265 self._can_symlink = checklink(self.base) |
|
1266 return self._can_symlink |
|
1267 raise AttributeError(name) |
|
1268 |
1263 def __call__(self, path, mode="r", text=False, atomictemp=False): |
1269 def __call__(self, path, mode="r", text=False, atomictemp=False): |
1264 if self.audit: |
1270 if self.audit: |
1265 audit_path(path) |
1271 audit_path(path) |
1266 f = os.path.join(self.base, path) |
1272 f = os.path.join(self.base, path) |
1267 |
1273 |
1279 if atomictemp: |
1285 if atomictemp: |
1280 return atomictempfile(f, mode) |
1286 return atomictempfile(f, mode) |
1281 if nlink > 1: |
1287 if nlink > 1: |
1282 rename(mktempcopy(f), f) |
1288 rename(mktempcopy(f), f) |
1283 return posixfile(f, mode) |
1289 return posixfile(f, mode) |
|
1290 |
|
1291 def symlink(self, src, dst): |
|
1292 if self.audit: |
|
1293 audit_path(dst) |
|
1294 linkname = os.path.join(self.base, dst) |
|
1295 try: |
|
1296 os.unlink(linkname) |
|
1297 except OSError: |
|
1298 pass |
|
1299 |
|
1300 dirname = os.path.dirname(linkname) |
|
1301 if not os.path.exists(dirname): |
|
1302 os.makedirs(dirname) |
|
1303 |
|
1304 if self._can_symlink: |
|
1305 os.symlink(src, linkname) |
|
1306 else: |
|
1307 f = self(self, dst, "w") |
|
1308 f.write(src) |
|
1309 f.close() |
1284 |
1310 |
1285 class chunkbuffer(object): |
1311 class chunkbuffer(object): |
1286 """Allow arbitrary sized chunks of data to be efficiently read from an |
1312 """Allow arbitrary sized chunks of data to be efficiently read from an |
1287 iterator over chunks of arbitrary size.""" |
1313 iterator over chunks of arbitrary size.""" |
1288 |
1314 |