Index: git_cache.py |
diff --git a/git_cache.py b/git_cache.py |
index 1b135d50b425ae9bdab8201a140ece0311390b2a..81ed30a873733ff1bda79d32b5679d713f1fbcbb 100755 |
--- a/git_cache.py |
+++ b/git_cache.py |
@@ -99,11 +99,15 @@ class Lockfile(object): |
def unlock(self): |
"""Release the lock.""" |
- if not self.is_locked(): |
- raise LockError("%s is not locked" % self.path) |
- if not self.i_am_locking(): |
- raise LockError("%s is locked, but not by me" % self.path) |
- self._remove_lockfile() |
+ try: |
+ if not self.is_locked(): |
+ raise LockError("%s is not locked" % self.path) |
+ if not self.i_am_locking(): |
+ raise LockError("%s is locked, but not by me" % self.path) |
+ self._remove_lockfile() |
+ except WinErr: |
+ # Windows is unreliable when it comes to file locking. YMMV. |
+ pass |
def break_lock(self): |
"""Remove the lock, even if it was created by someone else.""" |
@@ -128,17 +132,6 @@ class Lockfile(object): |
"""Test if the file is locked by this process.""" |
return self.is_locked() and self.pid == self._read_pid() |
- def __enter__(self): |
- self.lock() |
- return self |
- |
- def __exit__(self, *_exc): |
- # Windows is unreliable when it comes to file locking. YMMV. |
- try: |
- self.unlock() |
- except WinErr: |
- pass |
- |
class Mirror(object): |
@@ -317,7 +310,7 @@ class Mirror(object): |
return os.path.isfile(os.path.join(self.mirror_path, 'config')) |
def populate(self, depth=None, shallow=False, bootstrap=False, |
- verbose=False): |
+ verbose=False, ignore_lock=False): |
assert self.GetCachePath() |
if shallow and not depth: |
depth = 10000 |
@@ -332,7 +325,11 @@ class Mirror(object): |
d = ['--depth', str(depth)] |
- with Lockfile(self.mirror_path): |
+ lockfile = Lockfile(self.mirror_path) |
+ if not ignore_lock: |
+ lockfile.lock() |
+ |
+ try: |
# Setup from scratch if the repo is new or is in a bad state. |
tempdir = None |
config_file = os.path.join(self.mirror_path, 'config') |
@@ -380,6 +377,9 @@ class Mirror(object): |
logging.warn('Fetch of %s failed' % spec) |
if tempdir: |
os.rename(tempdir, self.mirror_path) |
+ finally: |
+ if not ignore_lock: |
+ lockfile.unlock() |
def update_bootstrap(self): |
# The files are named <git number>.zip |
@@ -497,6 +497,8 @@ def CMDpopulate(parser, args): |
help='Specify additional refs to be fetched') |
parser.add_option('--no_bootstrap', action='store_true', |
help='Don\'t bootstrap from Google Storage') |
+ parser.add_option('--ignore_locks', action='store_true', |
+ help='Don\'t try to lock repository') |
options, args = parser.parse_args(args) |
if not len(args) == 1: |
@@ -508,6 +510,7 @@ def CMDpopulate(parser, args): |
'verbose': options.verbose, |
'shallow': options.shallow, |
'bootstrap': not options.no_bootstrap, |
+ 'ignore_lock': options.ignore_locks, |
} |
if options.depth: |
kwargs['depth'] = options.depth |