com.googler.python 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -2
- package/python3.4.2/lib/python3.4/site-packages/pip/__init__.py +1 -277
- package/python3.4.2/lib/python3.4/site-packages/pip/__main__.py +19 -7
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/__init__.py +246 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/basecommand.py +373 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/{baseparser.py → _internal/baseparser.py} +240 -224
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/build_env.py +92 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/cache.py +202 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/cmdoptions.py +609 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/__init__.py +79 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/check.py +42 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/completion.py +94 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/configuration.py +227 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/download.py +233 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/freeze.py +96 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/hash.py +57 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/{commands → _internal/commands}/help.py +36 -33
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/install.py +477 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/list.py +343 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/search.py +135 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/show.py +164 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/uninstall.py +71 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/commands/wheel.py +179 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/compat.py +235 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/configuration.py +378 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/download.py +922 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/exceptions.py +249 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/index.py +1117 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/locations.py +194 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/models/__init__.py +4 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/models/index.py +15 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/{_vendor/requests/packages/urllib3/contrib → _internal/operations}/__init__.py +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/operations/check.py +106 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/operations/freeze.py +252 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/operations/prepare.py +378 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/pep425tags.py +317 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/__init__.py +69 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_file.py +338 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_install.py +1115 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_set.py +164 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/req/req_uninstall.py +455 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/resolve.py +354 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/{status_codes.py → _internal/status_codes.py} +8 -6
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/__init__.py +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/appdirs.py +258 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/deprecation.py +77 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/encoding.py +33 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/filesystem.py +28 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/glibc.py +84 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/hashes.py +94 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/logging.py +132 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/misc.py +851 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/outdated.py +163 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/packaging.py +70 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/setuptools_build.py +8 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/temp_dir.py +82 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/typing.py +29 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/utils/ui.py +421 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/__init__.py +471 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/bazaar.py +113 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/git.py +311 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/mercurial.py +105 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/vcs/subversion.py +271 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_internal/wheel.py +817 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/__init__.py +109 -8
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/appdirs.py +604 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/__init__.py +11 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/_cmd.py +60 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/adapter.py +134 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/cache.py +39 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +2 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +133 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +43 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/compat.py +29 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/controller.py +373 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/filewrapper.py +78 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/heuristics.py +138 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/serialize.py +194 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/cachecontrol/wrapper.py +27 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/certifi/__init__.py +3 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/certifi/__main__.py +2 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests → certifi}/cacert.pem +1765 -2358
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/certifi/core.py +37 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/__init__.py +39 -32
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/big5prober.py +47 -42
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/chardistribution.py +233 -231
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/charsetprober.py +145 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/cli/__init__.py +1 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/cli/chardetect.py +85 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/codingstatemachine.py +88 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/compat.py +34 -34
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/cp949prober.py +49 -44
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/enums.py +76 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/escprober.py +101 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/escsm.py +246 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/eucjpprober.py +92 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/euckrfreq.py +195 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/euckrprober.py +47 -42
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/euctwfreq.py +387 -428
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/euctwprober.py +46 -41
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/gb2312freq.py +283 -472
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/gb2312prober.py +46 -41
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/hebrewprober.py +292 -283
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/jisfreq.py +325 -569
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/jpcntx.py +233 -219
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langbulgarianmodel.py +228 -229
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langcyrillicmodel.py +333 -329
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langgreekmodel.py +225 -225
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langhebrewmodel.py +200 -201
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langhungarianmodel.py +225 -225
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/langthaimodel.py +199 -200
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/langturkishmodel.py +193 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/latin1prober.py +145 -139
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/mbcharsetprober.py +91 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/mbcsgroupprober.py +54 -54
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/mbcssm.py +572 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/sbcharsetprober.py +132 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/sbcsgroupprober.py +73 -69
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/sjisprober.py +92 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/universaldetector.py +286 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/chardet → chardet}/utf8prober.py +82 -76
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/chardet/version.py +9 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/__init__.py +7 -7
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/ansi.py +102 -50
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/ansitowin32.py +236 -190
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/initialise.py +82 -56
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/win32.py +156 -137
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/colorama/winterm.py +162 -120
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/__init__.py +23 -23
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/__init__.py +6 -6
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/misc.py +41 -41
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/shutil.py +761 -761
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +84 -84
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +788 -788
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/_backport/tarfile.py +2607 -2607
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/compat.py +1117 -1064
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/database.py +1318 -1301
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/index.py +516 -488
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/locators.py +1292 -1194
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/manifest.py +393 -364
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/markers.py +131 -190
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/metadata.py +1068 -1026
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/resources.py +355 -317
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/scripts.py +415 -323
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/t32.exe +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/t64.exe +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/util.py +1755 -1575
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/version.py +736 -721
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/w32.exe +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/w64.exe +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distlib/wheel.py +984 -958
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/distro.py +1104 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/__init__.py +35 -23
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{ihatexml.py → _ihatexml.py} +288 -285
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{inputstream.py → _inputstream.py} +923 -881
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{tokenizer.py → _tokenizer.py} +1721 -1731
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/__init__.py +14 -12
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/_base.py +37 -37
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/datrie.py +44 -44
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{trie → _trie}/py.py +67 -67
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/{utils.py → _utils.py} +124 -82
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/constants.py +2947 -3104
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +29 -20
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/{_base.py → base.py} +12 -12
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +73 -65
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/lint.py +93 -93
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +207 -205
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +896 -12
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/filters/whitespace.py +38 -38
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/html5parser.py +2791 -2713
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/serializer.py +409 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +30 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +54 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +50 -44
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +88 -76
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/{_base.py → base.py} +417 -377
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +236 -227
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +340 -337
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +366 -369
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +154 -57
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/{_base.py → base.py} +252 -200
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +43 -46
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +130 -138
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/{lxmletree.py → etree_lxml.py} +213 -208
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/{genshistream.py → genshi.py} +69 -69
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/__init__.py +2 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/codec.py +118 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/compat.py +12 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/core.py +387 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/idnadata.py +1585 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/intranges.py +53 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/package_data.py +2 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/idna/uts46data.py +7634 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/ipaddress.py +2419 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/__init__.py +347 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/linklockfile.py +73 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/mkdirlockfile.py +84 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/pidlockfile.py +190 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/sqlitelockfile.py +156 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/lockfile/symlinklockfile.py +70 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/__init__.py +66 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/_version.py +1 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/exceptions.py +41 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/msgpack/fallback.py +971 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/__about__.py +21 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/__init__.py +14 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/_compat.py +30 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/_structures.py +70 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/markers.py +301 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/requirements.py +130 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/specifiers.py +774 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/utils.py +63 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/packaging/version.py +441 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{pkg_resources.py → pkg_resources/__init__.py} +3125 -2762
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pkg_resources/py31compat.py +22 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/__init__.py +127 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/bar.py +88 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/counter.py +48 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/helpers.py +91 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/progress/spinner.py +44 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pyparsing.py +5720 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/__init__.py +3 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/core.py +13 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/parser.py +374 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/pytoml/writer.py +127 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/__init__.py +123 -77
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/__version__.py +14 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/_internal_utils.py +42 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/adapters.py +525 -388
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/api.py +152 -120
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/auth.py +293 -193
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/certs.py +18 -24
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/compat.py +73 -115
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/cookies.py +542 -454
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/exceptions.py +122 -75
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/help.py +120 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/hooks.py +34 -45
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/models.py +948 -803
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages.py +16 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/sessions.py +737 -637
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/status_codes.py +91 -88
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/structures.py +105 -127
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/utils.py +904 -673
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/retrying.py +267 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/six.py +891 -646
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/__init__.py +97 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/_collections.py +319 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/connection.py +373 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/connectionpool.py +905 -710
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +593 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +343 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/appengine.py +296 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/contrib/ntlmpool.py +112 -120
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +455 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +810 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/contrib/socks.py +188 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/exceptions.py +246 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/fields.py +178 -177
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/filepost.py +94 -100
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/__init__.py +5 -4
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +53 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/ordered_dict.py +259 -260
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/packages/six.py +868 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/ssl_match_hostname/__init__.py +19 -13
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/packages/ssl_match_hostname/_implementation.py +157 -105
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/poolmanager.py +440 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/request.py +148 -141
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/response.py +626 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/__init__.py +54 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/connection.py +130 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/request.py +118 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/response.py +81 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/retry.py +401 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/selectors.py +581 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/ssl_.py +341 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/util/timeout.py +242 -234
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/{requests/packages/urllib3 → urllib3}/util/url.py +230 -162
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/urllib3/util/wait.py +40 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/labels.py +231 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/tests.py +153 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/_markerlib/__init__.py +0 -16
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/_markerlib/markers.py +0 -119
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/sanitizer.py +0 -271
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/serializer/__init__.py +0 -16
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/serializer/htmlserializer.py +0 -320
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/html5lib/treewalkers/pulldom.py +0 -63
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/re-vendor.py +0 -34
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/__init__.py +0 -3
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/big5freq.py +0 -925
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/chardetect.py +0 -46
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/charsetgroupprober.py +0 -106
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/charsetprober.py +0 -62
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/codingstatemachine.py +0 -61
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/constants.py +0 -39
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/escprober.py +0 -86
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/escsm.py +0 -242
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/eucjpprober.py +0 -90
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/euckrfreq.py +0 -596
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/mbcharsetprober.py +0 -86
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/mbcssm.py +0 -575
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/sbcharsetprober.py +0 -120
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/sjisprober.py +0 -91
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/chardet/universaldetector.py +0 -170
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/__init__.py +0 -58
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/_collections.py +0 -205
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/connection.py +0 -204
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/contrib/pyopenssl.py +0 -422
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/exceptions.py +0 -126
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/packages/six.py +0 -385
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/poolmanager.py +0 -258
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/response.py +0 -308
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/__init__.py +0 -27
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/connection.py +0 -45
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/request.py +0 -68
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/response.py +0 -13
- package/python3.4.2/lib/python3.4/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py +0 -133
- package/python3.4.2/lib/python3.4/site-packages/pip/backwardcompat/__init__.py +0 -138
- package/python3.4.2/lib/python3.4/site-packages/pip/basecommand.py +0 -201
- package/python3.4.2/lib/python3.4/site-packages/pip/cmdoptions.py +0 -371
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/__init__.py +0 -88
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/bundle.py +0 -42
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/completion.py +0 -59
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/freeze.py +0 -114
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/install.py +0 -314
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/list.py +0 -162
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/search.py +0 -132
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/show.py +0 -80
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/uninstall.py +0 -59
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/unzip.py +0 -7
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/wheel.py +0 -195
- package/python3.4.2/lib/python3.4/site-packages/pip/commands/zip.py +0 -351
- package/python3.4.2/lib/python3.4/site-packages/pip/download.py +0 -644
- package/python3.4.2/lib/python3.4/site-packages/pip/exceptions.py +0 -46
- package/python3.4.2/lib/python3.4/site-packages/pip/index.py +0 -990
- package/python3.4.2/lib/python3.4/site-packages/pip/locations.py +0 -171
- package/python3.4.2/lib/python3.4/site-packages/pip/log.py +0 -276
- package/python3.4.2/lib/python3.4/site-packages/pip/pep425tags.py +0 -102
- package/python3.4.2/lib/python3.4/site-packages/pip/req.py +0 -1931
- package/python3.4.2/lib/python3.4/site-packages/pip/runner.py +0 -18
- package/python3.4.2/lib/python3.4/site-packages/pip/util.py +0 -720
- package/python3.4.2/lib/python3.4/site-packages/pip/vcs/__init__.py +0 -251
- package/python3.4.2/lib/python3.4/site-packages/pip/vcs/bazaar.py +0 -131
- package/python3.4.2/lib/python3.4/site-packages/pip/vcs/git.py +0 -194
- package/python3.4.2/lib/python3.4/site-packages/pip/vcs/mercurial.py +0 -151
- package/python3.4.2/lib/python3.4/site-packages/pip/vcs/subversion.py +0 -273
- package/python3.4.2/lib/python3.4/site-packages/pip/wheel.py +0 -560
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
lockfile.py - Platform-independent advisory file locks.
|
|
5
|
+
|
|
6
|
+
Requires Python 2.5 unless you apply 2.4.diff
|
|
7
|
+
Locking is done on a per-thread basis instead of a per-process basis.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
|
|
11
|
+
>>> lock = LockFile('somefile')
|
|
12
|
+
>>> try:
|
|
13
|
+
... lock.acquire()
|
|
14
|
+
... except AlreadyLocked:
|
|
15
|
+
... print 'somefile', 'is locked already.'
|
|
16
|
+
... except LockFailed:
|
|
17
|
+
... print 'somefile', 'can\\'t be locked.'
|
|
18
|
+
... else:
|
|
19
|
+
... print 'got lock'
|
|
20
|
+
got lock
|
|
21
|
+
>>> print lock.is_locked()
|
|
22
|
+
True
|
|
23
|
+
>>> lock.release()
|
|
24
|
+
|
|
25
|
+
>>> lock = LockFile('somefile')
|
|
26
|
+
>>> print lock.is_locked()
|
|
27
|
+
False
|
|
28
|
+
>>> with lock:
|
|
29
|
+
... print lock.is_locked()
|
|
30
|
+
True
|
|
31
|
+
>>> print lock.is_locked()
|
|
32
|
+
False
|
|
33
|
+
|
|
34
|
+
>>> lock = LockFile('somefile')
|
|
35
|
+
>>> # It is okay to lock twice from the same thread...
|
|
36
|
+
>>> with lock:
|
|
37
|
+
... lock.acquire()
|
|
38
|
+
...
|
|
39
|
+
>>> # Though no counter is kept, so you can't unlock multiple times...
|
|
40
|
+
>>> print lock.is_locked()
|
|
41
|
+
False
|
|
42
|
+
|
|
43
|
+
Exceptions:
|
|
44
|
+
|
|
45
|
+
Error - base class for other exceptions
|
|
46
|
+
LockError - base class for all locking exceptions
|
|
47
|
+
AlreadyLocked - Another thread or process already holds the lock
|
|
48
|
+
LockFailed - Lock failed for some other reason
|
|
49
|
+
UnlockError - base class for all unlocking exceptions
|
|
50
|
+
AlreadyUnlocked - File was not locked.
|
|
51
|
+
NotMyLock - File was locked but not by the current thread/process
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
from __future__ import absolute_import
|
|
55
|
+
|
|
56
|
+
import functools
|
|
57
|
+
import os
|
|
58
|
+
import socket
|
|
59
|
+
import threading
|
|
60
|
+
import warnings
|
|
61
|
+
|
|
62
|
+
# Work with PEP8 and non-PEP8 versions of threading module.
|
|
63
|
+
if not hasattr(threading, "current_thread"):
|
|
64
|
+
threading.current_thread = threading.currentThread
|
|
65
|
+
if not hasattr(threading.Thread, "get_name"):
|
|
66
|
+
threading.Thread.get_name = threading.Thread.getName
|
|
67
|
+
|
|
68
|
+
__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked',
|
|
69
|
+
'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock',
|
|
70
|
+
'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock',
|
|
71
|
+
'LockBase', 'locked']
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class Error(Exception):
|
|
75
|
+
"""
|
|
76
|
+
Base class for other exceptions.
|
|
77
|
+
|
|
78
|
+
>>> try:
|
|
79
|
+
... raise Error
|
|
80
|
+
... except Exception:
|
|
81
|
+
... pass
|
|
82
|
+
"""
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class LockError(Error):
|
|
87
|
+
"""
|
|
88
|
+
Base class for error arising from attempts to acquire the lock.
|
|
89
|
+
|
|
90
|
+
>>> try:
|
|
91
|
+
... raise LockError
|
|
92
|
+
... except Error:
|
|
93
|
+
... pass
|
|
94
|
+
"""
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class LockTimeout(LockError):
|
|
99
|
+
"""Raised when lock creation fails within a user-defined period of time.
|
|
100
|
+
|
|
101
|
+
>>> try:
|
|
102
|
+
... raise LockTimeout
|
|
103
|
+
... except LockError:
|
|
104
|
+
... pass
|
|
105
|
+
"""
|
|
106
|
+
pass
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class AlreadyLocked(LockError):
|
|
110
|
+
"""Some other thread/process is locking the file.
|
|
111
|
+
|
|
112
|
+
>>> try:
|
|
113
|
+
... raise AlreadyLocked
|
|
114
|
+
... except LockError:
|
|
115
|
+
... pass
|
|
116
|
+
"""
|
|
117
|
+
pass
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class LockFailed(LockError):
|
|
121
|
+
"""Lock file creation failed for some other reason.
|
|
122
|
+
|
|
123
|
+
>>> try:
|
|
124
|
+
... raise LockFailed
|
|
125
|
+
... except LockError:
|
|
126
|
+
... pass
|
|
127
|
+
"""
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class UnlockError(Error):
|
|
132
|
+
"""
|
|
133
|
+
Base class for errors arising from attempts to release the lock.
|
|
134
|
+
|
|
135
|
+
>>> try:
|
|
136
|
+
... raise UnlockError
|
|
137
|
+
... except Error:
|
|
138
|
+
... pass
|
|
139
|
+
"""
|
|
140
|
+
pass
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class NotLocked(UnlockError):
|
|
144
|
+
"""Raised when an attempt is made to unlock an unlocked file.
|
|
145
|
+
|
|
146
|
+
>>> try:
|
|
147
|
+
... raise NotLocked
|
|
148
|
+
... except UnlockError:
|
|
149
|
+
... pass
|
|
150
|
+
"""
|
|
151
|
+
pass
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class NotMyLock(UnlockError):
|
|
155
|
+
"""Raised when an attempt is made to unlock a file someone else locked.
|
|
156
|
+
|
|
157
|
+
>>> try:
|
|
158
|
+
... raise NotMyLock
|
|
159
|
+
... except UnlockError:
|
|
160
|
+
... pass
|
|
161
|
+
"""
|
|
162
|
+
pass
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class _SharedBase(object):
|
|
166
|
+
def __init__(self, path):
|
|
167
|
+
self.path = path
|
|
168
|
+
|
|
169
|
+
def acquire(self, timeout=None):
|
|
170
|
+
"""
|
|
171
|
+
Acquire the lock.
|
|
172
|
+
|
|
173
|
+
* If timeout is omitted (or None), wait forever trying to lock the
|
|
174
|
+
file.
|
|
175
|
+
|
|
176
|
+
* If timeout > 0, try to acquire the lock for that many seconds. If
|
|
177
|
+
the lock period expires and the file is still locked, raise
|
|
178
|
+
LockTimeout.
|
|
179
|
+
|
|
180
|
+
* If timeout <= 0, raise AlreadyLocked immediately if the file is
|
|
181
|
+
already locked.
|
|
182
|
+
"""
|
|
183
|
+
raise NotImplemented("implement in subclass")
|
|
184
|
+
|
|
185
|
+
def release(self):
|
|
186
|
+
"""
|
|
187
|
+
Release the lock.
|
|
188
|
+
|
|
189
|
+
If the file is not locked, raise NotLocked.
|
|
190
|
+
"""
|
|
191
|
+
raise NotImplemented("implement in subclass")
|
|
192
|
+
|
|
193
|
+
def __enter__(self):
|
|
194
|
+
"""
|
|
195
|
+
Context manager support.
|
|
196
|
+
"""
|
|
197
|
+
self.acquire()
|
|
198
|
+
return self
|
|
199
|
+
|
|
200
|
+
def __exit__(self, *_exc):
|
|
201
|
+
"""
|
|
202
|
+
Context manager support.
|
|
203
|
+
"""
|
|
204
|
+
self.release()
|
|
205
|
+
|
|
206
|
+
def __repr__(self):
|
|
207
|
+
return "<%s: %r>" % (self.__class__.__name__, self.path)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
class LockBase(_SharedBase):
|
|
211
|
+
"""Base class for platform-specific lock classes."""
|
|
212
|
+
def __init__(self, path, threaded=True, timeout=None):
|
|
213
|
+
"""
|
|
214
|
+
>>> lock = LockBase('somefile')
|
|
215
|
+
>>> lock = LockBase('somefile', threaded=False)
|
|
216
|
+
"""
|
|
217
|
+
super(LockBase, self).__init__(path)
|
|
218
|
+
self.lock_file = os.path.abspath(path) + ".lock"
|
|
219
|
+
self.hostname = socket.gethostname()
|
|
220
|
+
self.pid = os.getpid()
|
|
221
|
+
if threaded:
|
|
222
|
+
t = threading.current_thread()
|
|
223
|
+
# Thread objects in Python 2.4 and earlier do not have ident
|
|
224
|
+
# attrs. Worm around that.
|
|
225
|
+
ident = getattr(t, "ident", hash(t))
|
|
226
|
+
self.tname = "-%x" % (ident & 0xffffffff)
|
|
227
|
+
else:
|
|
228
|
+
self.tname = ""
|
|
229
|
+
dirname = os.path.dirname(self.lock_file)
|
|
230
|
+
|
|
231
|
+
# unique name is mostly about the current process, but must
|
|
232
|
+
# also contain the path -- otherwise, two adjacent locked
|
|
233
|
+
# files conflict (one file gets locked, creating lock-file and
|
|
234
|
+
# unique file, the other one gets locked, creating lock-file
|
|
235
|
+
# and overwriting the already existing lock-file, then one
|
|
236
|
+
# gets unlocked, deleting both lock-file and unique file,
|
|
237
|
+
# finally the last lock errors out upon releasing.
|
|
238
|
+
self.unique_name = os.path.join(dirname,
|
|
239
|
+
"%s%s.%s%s" % (self.hostname,
|
|
240
|
+
self.tname,
|
|
241
|
+
self.pid,
|
|
242
|
+
hash(self.path)))
|
|
243
|
+
self.timeout = timeout
|
|
244
|
+
|
|
245
|
+
def is_locked(self):
|
|
246
|
+
"""
|
|
247
|
+
Tell whether or not the file is locked.
|
|
248
|
+
"""
|
|
249
|
+
raise NotImplemented("implement in subclass")
|
|
250
|
+
|
|
251
|
+
def i_am_locking(self):
|
|
252
|
+
"""
|
|
253
|
+
Return True if this object is locking the file.
|
|
254
|
+
"""
|
|
255
|
+
raise NotImplemented("implement in subclass")
|
|
256
|
+
|
|
257
|
+
def break_lock(self):
|
|
258
|
+
"""
|
|
259
|
+
Remove a lock. Useful if a locking thread failed to unlock.
|
|
260
|
+
"""
|
|
261
|
+
raise NotImplemented("implement in subclass")
|
|
262
|
+
|
|
263
|
+
def __repr__(self):
|
|
264
|
+
return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name,
|
|
265
|
+
self.path)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def _fl_helper(cls, mod, *args, **kwds):
|
|
269
|
+
warnings.warn("Import from %s module instead of lockfile package" % mod,
|
|
270
|
+
DeprecationWarning, stacklevel=2)
|
|
271
|
+
# This is a bit funky, but it's only for awhile. The way the unit tests
|
|
272
|
+
# are constructed this function winds up as an unbound method, so it
|
|
273
|
+
# actually takes three args, not two. We want to toss out self.
|
|
274
|
+
if not isinstance(args[0], str):
|
|
275
|
+
# We are testing, avoid the first arg
|
|
276
|
+
args = args[1:]
|
|
277
|
+
if len(args) == 1 and not kwds:
|
|
278
|
+
kwds["threaded"] = True
|
|
279
|
+
return cls(*args, **kwds)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def LinkFileLock(*args, **kwds):
|
|
283
|
+
"""Factory function provided for backwards compatibility.
|
|
284
|
+
|
|
285
|
+
Do not use in new code. Instead, import LinkLockFile from the
|
|
286
|
+
lockfile.linklockfile module.
|
|
287
|
+
"""
|
|
288
|
+
from . import linklockfile
|
|
289
|
+
return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile",
|
|
290
|
+
*args, **kwds)
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def MkdirFileLock(*args, **kwds):
|
|
294
|
+
"""Factory function provided for backwards compatibility.
|
|
295
|
+
|
|
296
|
+
Do not use in new code. Instead, import MkdirLockFile from the
|
|
297
|
+
lockfile.mkdirlockfile module.
|
|
298
|
+
"""
|
|
299
|
+
from . import mkdirlockfile
|
|
300
|
+
return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile",
|
|
301
|
+
*args, **kwds)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def SQLiteFileLock(*args, **kwds):
|
|
305
|
+
"""Factory function provided for backwards compatibility.
|
|
306
|
+
|
|
307
|
+
Do not use in new code. Instead, import SQLiteLockFile from the
|
|
308
|
+
lockfile.mkdirlockfile module.
|
|
309
|
+
"""
|
|
310
|
+
from . import sqlitelockfile
|
|
311
|
+
return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile",
|
|
312
|
+
*args, **kwds)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def locked(path, timeout=None):
|
|
316
|
+
"""Decorator which enables locks for decorated function.
|
|
317
|
+
|
|
318
|
+
Arguments:
|
|
319
|
+
- path: path for lockfile.
|
|
320
|
+
- timeout (optional): Timeout for acquiring lock.
|
|
321
|
+
|
|
322
|
+
Usage:
|
|
323
|
+
@locked('/var/run/myname', timeout=0)
|
|
324
|
+
def myname(...):
|
|
325
|
+
...
|
|
326
|
+
"""
|
|
327
|
+
def decor(func):
|
|
328
|
+
@functools.wraps(func)
|
|
329
|
+
def wrapper(*args, **kwargs):
|
|
330
|
+
lock = FileLock(path, timeout=timeout)
|
|
331
|
+
lock.acquire()
|
|
332
|
+
try:
|
|
333
|
+
return func(*args, **kwargs)
|
|
334
|
+
finally:
|
|
335
|
+
lock.release()
|
|
336
|
+
return wrapper
|
|
337
|
+
return decor
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
if hasattr(os, "link"):
|
|
341
|
+
from . import linklockfile as _llf
|
|
342
|
+
LockFile = _llf.LinkLockFile
|
|
343
|
+
else:
|
|
344
|
+
from . import mkdirlockfile as _mlf
|
|
345
|
+
LockFile = _mlf.MkdirLockFile
|
|
346
|
+
|
|
347
|
+
FileLock = LockFile
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import absolute_import
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout,
|
|
7
|
+
AlreadyLocked)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LinkLockFile(LockBase):
|
|
11
|
+
"""Lock access to a file using atomic property of link(2).
|
|
12
|
+
|
|
13
|
+
>>> lock = LinkLockFile('somefile')
|
|
14
|
+
>>> lock = LinkLockFile('somefile', threaded=False)
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def acquire(self, timeout=None):
|
|
18
|
+
try:
|
|
19
|
+
open(self.unique_name, "wb").close()
|
|
20
|
+
except IOError:
|
|
21
|
+
raise LockFailed("failed to create %s" % self.unique_name)
|
|
22
|
+
|
|
23
|
+
timeout = timeout if timeout is not None else self.timeout
|
|
24
|
+
end_time = time.time()
|
|
25
|
+
if timeout is not None and timeout > 0:
|
|
26
|
+
end_time += timeout
|
|
27
|
+
|
|
28
|
+
while True:
|
|
29
|
+
# Try and create a hard link to it.
|
|
30
|
+
try:
|
|
31
|
+
os.link(self.unique_name, self.lock_file)
|
|
32
|
+
except OSError:
|
|
33
|
+
# Link creation failed. Maybe we've double-locked?
|
|
34
|
+
nlinks = os.stat(self.unique_name).st_nlink
|
|
35
|
+
if nlinks == 2:
|
|
36
|
+
# The original link plus the one I created == 2. We're
|
|
37
|
+
# good to go.
|
|
38
|
+
return
|
|
39
|
+
else:
|
|
40
|
+
# Otherwise the lock creation failed.
|
|
41
|
+
if timeout is not None and time.time() > end_time:
|
|
42
|
+
os.unlink(self.unique_name)
|
|
43
|
+
if timeout > 0:
|
|
44
|
+
raise LockTimeout("Timeout waiting to acquire"
|
|
45
|
+
" lock for %s" %
|
|
46
|
+
self.path)
|
|
47
|
+
else:
|
|
48
|
+
raise AlreadyLocked("%s is already locked" %
|
|
49
|
+
self.path)
|
|
50
|
+
time.sleep(timeout is not None and timeout / 10 or 0.1)
|
|
51
|
+
else:
|
|
52
|
+
# Link creation succeeded. We're good to go.
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
def release(self):
|
|
56
|
+
if not self.is_locked():
|
|
57
|
+
raise NotLocked("%s is not locked" % self.path)
|
|
58
|
+
elif not os.path.exists(self.unique_name):
|
|
59
|
+
raise NotMyLock("%s is locked, but not by me" % self.path)
|
|
60
|
+
os.unlink(self.unique_name)
|
|
61
|
+
os.unlink(self.lock_file)
|
|
62
|
+
|
|
63
|
+
def is_locked(self):
|
|
64
|
+
return os.path.exists(self.lock_file)
|
|
65
|
+
|
|
66
|
+
def i_am_locking(self):
|
|
67
|
+
return (self.is_locked() and
|
|
68
|
+
os.path.exists(self.unique_name) and
|
|
69
|
+
os.stat(self.unique_name).st_nlink == 2)
|
|
70
|
+
|
|
71
|
+
def break_lock(self):
|
|
72
|
+
if os.path.exists(self.lock_file):
|
|
73
|
+
os.unlink(self.lock_file)
|
|
@@ -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)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
# pidlockfile.py
|
|
4
|
+
#
|
|
5
|
+
# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au>
|
|
6
|
+
#
|
|
7
|
+
# This is free software: you may copy, modify, and/or distribute this work
|
|
8
|
+
# under the terms of the Python Software Foundation License, version 2 or
|
|
9
|
+
# later as published by the Python Software Foundation.
|
|
10
|
+
# No warranty expressed or implied. See the file LICENSE.PSF-2 for details.
|
|
11
|
+
|
|
12
|
+
""" Lockfile behaviour implemented via Unix PID files.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import absolute_import
|
|
16
|
+
|
|
17
|
+
import errno
|
|
18
|
+
import os
|
|
19
|
+
import time
|
|
20
|
+
|
|
21
|
+
from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock,
|
|
22
|
+
LockTimeout)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class PIDLockFile(LockBase):
|
|
26
|
+
""" Lockfile implemented as a Unix PID file.
|
|
27
|
+
|
|
28
|
+
The lock file is a normal file named by the attribute `path`.
|
|
29
|
+
A lock's PID file contains a single line of text, containing
|
|
30
|
+
the process ID (PID) of the process that acquired the lock.
|
|
31
|
+
|
|
32
|
+
>>> lock = PIDLockFile('somefile')
|
|
33
|
+
>>> lock = PIDLockFile('somefile')
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, path, threaded=False, timeout=None):
|
|
37
|
+
# pid lockfiles don't support threaded operation, so always force
|
|
38
|
+
# False as the threaded arg.
|
|
39
|
+
LockBase.__init__(self, path, False, timeout)
|
|
40
|
+
self.unique_name = self.path
|
|
41
|
+
|
|
42
|
+
def read_pid(self):
|
|
43
|
+
""" Get the PID from the lock file.
|
|
44
|
+
"""
|
|
45
|
+
return read_pid_from_pidfile(self.path)
|
|
46
|
+
|
|
47
|
+
def is_locked(self):
|
|
48
|
+
""" Test if the lock is currently held.
|
|
49
|
+
|
|
50
|
+
The lock is held if the PID file for this lock exists.
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
return os.path.exists(self.path)
|
|
54
|
+
|
|
55
|
+
def i_am_locking(self):
|
|
56
|
+
""" Test if the lock is held by the current process.
|
|
57
|
+
|
|
58
|
+
Returns ``True`` if the current process ID matches the
|
|
59
|
+
number stored in the PID file.
|
|
60
|
+
"""
|
|
61
|
+
return self.is_locked() and os.getpid() == self.read_pid()
|
|
62
|
+
|
|
63
|
+
def acquire(self, timeout=None):
|
|
64
|
+
""" Acquire the lock.
|
|
65
|
+
|
|
66
|
+
Creates the PID file for this lock, or raises an error if
|
|
67
|
+
the lock could not be acquired.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
timeout = timeout if timeout is not None else self.timeout
|
|
71
|
+
end_time = time.time()
|
|
72
|
+
if timeout is not None and timeout > 0:
|
|
73
|
+
end_time += timeout
|
|
74
|
+
|
|
75
|
+
while True:
|
|
76
|
+
try:
|
|
77
|
+
write_pid_to_pidfile(self.path)
|
|
78
|
+
except OSError as exc:
|
|
79
|
+
if exc.errno == errno.EEXIST:
|
|
80
|
+
# The lock creation failed. Maybe sleep a bit.
|
|
81
|
+
if time.time() > end_time:
|
|
82
|
+
if timeout is not None and timeout > 0:
|
|
83
|
+
raise LockTimeout("Timeout waiting to acquire"
|
|
84
|
+
" lock for %s" %
|
|
85
|
+
self.path)
|
|
86
|
+
else:
|
|
87
|
+
raise AlreadyLocked("%s is already locked" %
|
|
88
|
+
self.path)
|
|
89
|
+
time.sleep(timeout is not None and timeout / 10 or 0.1)
|
|
90
|
+
else:
|
|
91
|
+
raise LockFailed("failed to create %s" % self.path)
|
|
92
|
+
else:
|
|
93
|
+
return
|
|
94
|
+
|
|
95
|
+
def release(self):
|
|
96
|
+
""" Release the lock.
|
|
97
|
+
|
|
98
|
+
Removes the PID file to release the lock, or raises an
|
|
99
|
+
error if the current process does not hold the lock.
|
|
100
|
+
|
|
101
|
+
"""
|
|
102
|
+
if not self.is_locked():
|
|
103
|
+
raise NotLocked("%s is not locked" % self.path)
|
|
104
|
+
if not self.i_am_locking():
|
|
105
|
+
raise NotMyLock("%s is locked, but not by me" % self.path)
|
|
106
|
+
remove_existing_pidfile(self.path)
|
|
107
|
+
|
|
108
|
+
def break_lock(self):
|
|
109
|
+
""" Break an existing lock.
|
|
110
|
+
|
|
111
|
+
Removes the PID file if it already exists, otherwise does
|
|
112
|
+
nothing.
|
|
113
|
+
|
|
114
|
+
"""
|
|
115
|
+
remove_existing_pidfile(self.path)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def read_pid_from_pidfile(pidfile_path):
|
|
119
|
+
""" Read the PID recorded in the named PID file.
|
|
120
|
+
|
|
121
|
+
Read and return the numeric PID recorded as text in the named
|
|
122
|
+
PID file. If the PID file cannot be read, or if the content is
|
|
123
|
+
not a valid PID, return ``None``.
|
|
124
|
+
|
|
125
|
+
"""
|
|
126
|
+
pid = None
|
|
127
|
+
try:
|
|
128
|
+
pidfile = open(pidfile_path, 'r')
|
|
129
|
+
except IOError:
|
|
130
|
+
pass
|
|
131
|
+
else:
|
|
132
|
+
# According to the FHS 2.3 section on PID files in /var/run:
|
|
133
|
+
#
|
|
134
|
+
# The file must consist of the process identifier in
|
|
135
|
+
# ASCII-encoded decimal, followed by a newline character.
|
|
136
|
+
#
|
|
137
|
+
# Programs that read PID files should be somewhat flexible
|
|
138
|
+
# in what they accept; i.e., they should ignore extra
|
|
139
|
+
# whitespace, leading zeroes, absence of the trailing
|
|
140
|
+
# newline, or additional lines in the PID file.
|
|
141
|
+
|
|
142
|
+
line = pidfile.readline().strip()
|
|
143
|
+
try:
|
|
144
|
+
pid = int(line)
|
|
145
|
+
except ValueError:
|
|
146
|
+
pass
|
|
147
|
+
pidfile.close()
|
|
148
|
+
|
|
149
|
+
return pid
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def write_pid_to_pidfile(pidfile_path):
|
|
153
|
+
""" Write the PID in the named PID file.
|
|
154
|
+
|
|
155
|
+
Get the numeric process ID (“PID”) of the current process
|
|
156
|
+
and write it to the named file as a line of text.
|
|
157
|
+
|
|
158
|
+
"""
|
|
159
|
+
open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
|
|
160
|
+
open_mode = 0o644
|
|
161
|
+
pidfile_fd = os.open(pidfile_path, open_flags, open_mode)
|
|
162
|
+
pidfile = os.fdopen(pidfile_fd, 'w')
|
|
163
|
+
|
|
164
|
+
# According to the FHS 2.3 section on PID files in /var/run:
|
|
165
|
+
#
|
|
166
|
+
# The file must consist of the process identifier in
|
|
167
|
+
# ASCII-encoded decimal, followed by a newline character. For
|
|
168
|
+
# example, if crond was process number 25, /var/run/crond.pid
|
|
169
|
+
# would contain three characters: two, five, and newline.
|
|
170
|
+
|
|
171
|
+
pid = os.getpid()
|
|
172
|
+
pidfile.write("%s\n" % pid)
|
|
173
|
+
pidfile.close()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def remove_existing_pidfile(pidfile_path):
|
|
177
|
+
""" Remove the named PID file if it exists.
|
|
178
|
+
|
|
179
|
+
Removing a PID file that doesn't already exist puts us in the
|
|
180
|
+
desired state, so we ignore the condition if the file does not
|
|
181
|
+
exist.
|
|
182
|
+
|
|
183
|
+
"""
|
|
184
|
+
try:
|
|
185
|
+
os.remove(pidfile_path)
|
|
186
|
+
except OSError as exc:
|
|
187
|
+
if exc.errno == errno.ENOENT:
|
|
188
|
+
pass
|
|
189
|
+
else:
|
|
190
|
+
raise
|