diff options
Diffstat (limited to 'venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py')
-rw-r--r-- | venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000..bd5a51e --- /dev/null +++ b/venv/lib/python3.7/site-packages/pip-10.0.1-py3.7.egg/pip/_vendor/lockfile/mkdirlockfile.py | |||
@@ -0,0 +1,84 @@ | |||
1 | from __future__ import absolute_import, division | ||
2 | |||
3 | import time | ||
4 | import os | ||
5 | import sys | ||
6 | import errno | ||
7 | |||
8 | from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, | ||
9 | AlreadyLocked) | ||
10 | |||
11 | |||
12 | class MkdirLockFile(LockBase): | ||
13 | """Lock file by creating a directory.""" | ||
14 | def __init__(self, path, threaded=True, timeout=None): | ||
15 | """ | ||
16 | >>> lock = MkdirLockFile('somefile') | ||
17 | >>> lock = MkdirLockFile('somefile', threaded=False) | ||
18 | """ | ||
19 | LockBase.__init__(self, path, threaded, timeout) | ||
20 | # Lock file itself is a directory. Place the unique file name into | ||
21 | # it. | ||
22 | self.unique_name = os.path.join(self.lock_file, | ||
23 | "%s.%s%s" % (self.hostname, | ||
24 | self.tname, | ||
25 | self.pid)) | ||
26 | |||
27 | def acquire(self, timeout=None): | ||
28 | timeout = timeout if timeout is not None else self.timeout | ||
29 | end_time = time.time() | ||
30 | if timeout is not None and timeout > 0: | ||
31 | end_time += timeout | ||
32 | |||
33 | if timeout is None: | ||
34 | wait = 0.1 | ||
35 | else: | ||
36 | wait = max(0, timeout / 10) | ||
37 | |||
38 | while True: | ||
39 | try: | ||
40 | os.mkdir(self.lock_file) | ||
41 | except OSError: | ||
42 | err = sys.exc_info()[1] | ||
43 | if err.errno == errno.EEXIST: | ||
44 | # Already locked. | ||
45 | if os.path.exists(self.unique_name): | ||
46 | # Already locked by me. | ||
47 | return | ||
48 | if timeout is not None and time.time() > end_time: | ||
49 | if timeout > 0: | ||
50 | raise LockTimeout("Timeout waiting to acquire" | ||
51 | " lock for %s" % | ||
52 | self.path) | ||
53 | else: | ||
54 | # Someone else has the lock. | ||
55 | raise AlreadyLocked("%s is already locked" % | ||
56 | self.path) | ||
57 | time.sleep(wait) | ||
58 | else: | ||
59 | # Couldn't create the lock for some other reason | ||
60 | raise LockFailed("failed to create %s" % self.lock_file) | ||
61 | else: | ||
62 | open(self.unique_name, "wb").close() | ||
63 | return | ||
64 | |||
65 | def release(self): | ||
66 | if not self.is_locked(): | ||
67 | raise NotLocked("%s is not locked" % self.path) | ||
68 | elif not os.path.exists(self.unique_name): | ||
69 | raise NotMyLock("%s is locked, but not by me" % self.path) | ||
70 | os.unlink(self.unique_name) | ||
71 | os.rmdir(self.lock_file) | ||
72 | |||
73 | def is_locked(self): | ||
74 | return os.path.exists(self.lock_file) | ||
75 | |||
76 | def i_am_locking(self): | ||
77 | return (self.is_locked() and | ||
78 | os.path.exists(self.unique_name)) | ||
79 | |||
80 | def break_lock(self): | ||
81 | if os.path.exists(self.lock_file): | ||
82 | for name in os.listdir(self.lock_file): | ||
83 | os.unlink(os.path.join(self.lock_file, name)) | ||
84 | os.rmdir(self.lock_file) | ||