summaryrefslogtreecommitdiff
path: root/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py
diff options
context:
space:
mode:
authorShubham Saini <shubham6405@gmail.com>2018-12-11 10:01:23 +0000
committerShubham Saini <shubham6405@gmail.com>2018-12-11 10:01:23 +0000
commit68df54d6629ec019142eb149dd037774f2d11e7c (patch)
tree345bc22d46b4e01a4ba8303b94278952a4ed2b9e /venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py
First commit
Diffstat (limited to 'venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py')
-rw-r--r--venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py70
1 files changed, 70 insertions, 0 deletions
diff --git a/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py
new file mode 100644
index 0000000..93ff2b5
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/symlinklockfile.py
@@ -0,0 +1,70 @@
1from __future__ import absolute_import
2
3import os
4import time
5
6from . import (LockBase, NotLocked, NotMyLock, LockTimeout,
7 AlreadyLocked)
8
9
10class SymlinkLockFile(LockBase):
11 """Lock access to a file using symlink(2)."""
12
13 def __init__(self, path, threaded=True, timeout=None):
14 # super(SymlinkLockFile).__init(...)
15 LockBase.__init__(self, path, threaded, timeout)
16 # split it back!
17 self.unique_name = os.path.split(self.unique_name)[1]
18
19 def acquire(self, timeout=None):
20 # Hopefully unnecessary for symlink.
21 # try:
22 # open(self.unique_name, "wb").close()
23 # except IOError:
24 # raise LockFailed("failed to create %s" % self.unique_name)
25 timeout = timeout if timeout is not None else self.timeout
26 end_time = time.time()
27 if timeout is not None and timeout > 0:
28 end_time += timeout
29
30 while True:
31 # Try and create a symbolic link to it.
32 try:
33 os.symlink(self.unique_name, self.lock_file)
34 except OSError:
35 # Link creation failed. Maybe we've double-locked?
36 if self.i_am_locking():
37 # Linked to out unique name. Proceed.
38 return
39 else:
40 # Otherwise the lock creation failed.
41 if timeout is not None and time.time() > end_time:
42 if timeout > 0:
43 raise LockTimeout("Timeout waiting to acquire"
44 " lock for %s" %
45 self.path)
46 else:
47 raise AlreadyLocked("%s is already locked" %
48 self.path)
49 time.sleep(timeout / 10 if timeout is not None else 0.1)
50 else:
51 # Link creation succeeded. We're good to go.
52 return
53
54 def release(self):
55 if not self.is_locked():
56 raise NotLocked("%s is not locked" % self.path)
57 elif not self.i_am_locking():
58 raise NotMyLock("%s is locked, but not by me" % self.path)
59 os.unlink(self.lock_file)
60
61 def is_locked(self):
62 return os.path.islink(self.lock_file)
63
64 def i_am_locking(self):
65 return (os.path.islink(self.lock_file)
66 and os.readlink(self.lock_file) == self.unique_name)
67
68 def break_lock(self):
69 if os.path.islink(self.lock_file): # exists && link
70 os.unlink(self.lock_file)