/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to transportgit.py

  • Committer: Jelmer Vernooij
  • Date: 2018-05-05 18:26:04 UTC
  • mfrom: (0.200.1933 work)
  • mto: (0.200.1934 work)
  • mto: This revision was merged to the branch mainline in revision 6960.
  • Revision ID: jelmer@jelmer.uk-20180505182604-rf3zyekbhwhlwddi
Merge trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
    NotGitRepository,
29
29
    NoIndexPresent,
30
30
    )
 
31
from dulwich.file import (
 
32
    GitFile,
 
33
    FileLocked,
 
34
    )
31
35
from dulwich.objects import (
32
36
    ShaFile,
33
37
    )
68
72
from ...errors import (
69
73
    AlreadyControlDirError,
70
74
    FileExists,
 
75
    LockBroken,
71
76
    LockError,
 
77
    LockContention,
 
78
    NotLocalUrl,
72
79
    NoSuchFile,
73
80
    ReadError,
74
81
    TransportNotPossible,
75
82
    )
76
83
 
 
84
from ...lock import LogicalLockResult
 
85
 
77
86
 
78
87
class TransportRefsContainer(RefsContainer):
79
88
    """Refs container that reads refs from a transport."""
329
338
        except KeyError:
330
339
            return default
331
340
 
 
341
    def unlock_ref(self, name):
 
342
        if name == b"HEAD":
 
343
            transport = self.worktree_transport
 
344
        else:
 
345
            transport = self.transport
 
346
        lockname = name + ".lock"
 
347
        try:
 
348
            self.transport.delete(lockname)
 
349
        except NoSuchFile:
 
350
            pass
 
351
 
332
352
    def lock_ref(self, name):
333
353
        if name == b"HEAD":
334
354
            transport = self.worktree_transport
337
357
        self._ensure_dir_exists(name)
338
358
        lockname = name + ".lock"
339
359
        try:
340
 
            return transport.lock_write(lockname)
341
 
        except TransportNotPossible:
342
 
            # better than not locking at all, I guess?
343
 
            if transport.has(lockname):
344
 
                raise LockError(lockname + " exists")
345
 
            transport.put_bytes(lockname, "Locked by brz-git")
346
 
            from ...lock import LogicalLockResult
347
 
            return LogicalLockResult(lambda: transport.delete(lockname))
 
360
            local_path = self.transport.local_abspath(name)
 
361
        except NotLocalUrl:
 
362
            # This is racy, but what can we do?
 
363
            if self.transport.has(lockname):
 
364
                raise LockContention(name)
 
365
            lock_result = self.transport.put_bytes(lockname, b'Locked by brz-git')
 
366
            return LogicalLockResult(lambda: self.transport.delete(lockname))
 
367
        else:
 
368
            try:
 
369
                gf = GitFile(local_path, 'wb')
 
370
            except FileLocked as e:
 
371
                raise LockContention(name, e)
 
372
            else:
 
373
                def unlock():
 
374
                    try:
 
375
                        self.transport.delete(lockname)
 
376
                    except NoSuchFile:
 
377
                        raise LockBroken(lockname)
 
378
                    # GitFile.abort doesn't care if the lock has already disappeared
 
379
                    gf.abort()
 
380
                return LogicalLockResult(unlock)
348
381
 
349
382
 
350
383
class TransportRepo(BaseRepo):
392
425
    def controldir(self):
393
426
        return self._controltransport.local_abspath('.')
394
427
 
 
428
    def commondir(self):
 
429
        return self._commontransport.local_abspath('.')
 
430
 
395
431
    @property
396
432
    def path(self):
397
433
        return self.transport.local_abspath('.')
678
714
            write_pack_index_v2(idxfile, entries, data_sum)
679
715
        finally:
680
716
            idxfile.close()
 
717
        # TODO(jelmer): Just add new pack to the cache
 
718
        self._flush_pack_cache()
681
719
 
682
720
    def add_pack(self):
683
721
        """Add a new pack to this object store.