Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
news
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Sartika Aritonang
news
Commits
8d511735
Commit
8d511735
authored
May 29, 2020
by
Sartika Aritonang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
2738a42e
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
146 additions
and
0 deletions
+146
-0
file_cache.py
...te-packages/pip/_vendor/cachecontrol/caches/file_cache.py
+146
-0
No files found.
stbi/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
0 → 100644
View file @
8d511735
import
hashlib
import
os
from
textwrap
import
dedent
from
..cache
import
BaseCache
from
..controller
import
CacheController
try
:
FileNotFoundError
except
NameError
:
# py2.X
FileNotFoundError
=
(
IOError
,
OSError
)
def
_secure_open_write
(
filename
,
fmode
):
# We only want to write to this file, so open it in write only mode
flags
=
os
.
O_WRONLY
# os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only
# will open *new* files.
# We specify this because we want to ensure that the mode we pass is the
# mode of the file.
flags
|=
os
.
O_CREAT
|
os
.
O_EXCL
# Do not follow symlinks to prevent someone from making a symlink that
# we follow and insecurely open a cache file.
if
hasattr
(
os
,
"O_NOFOLLOW"
):
flags
|=
os
.
O_NOFOLLOW
# On Windows we'll mark this file as binary
if
hasattr
(
os
,
"O_BINARY"
):
flags
|=
os
.
O_BINARY
# Before we open our file, we want to delete any existing file that is
# there
try
:
os
.
remove
(
filename
)
except
(
IOError
,
OSError
):
# The file must not exist already, so we can just skip ahead to opening
pass
# Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a
# race condition happens between the os.remove and this line, that an
# error will be raised. Because we utilize a lockfile this should only
# happen if someone is attempting to attack us.
fd
=
os
.
open
(
filename
,
flags
,
fmode
)
try
:
return
os
.
fdopen
(
fd
,
"wb"
)
except
:
# An error occurred wrapping our FD in a file object
os
.
close
(
fd
)
raise
class
FileCache
(
BaseCache
):
def
__init__
(
self
,
directory
,
forever
=
False
,
filemode
=
0
o0600
,
dirmode
=
0
o0700
,
use_dir_lock
=
None
,
lock_class
=
None
,
):
if
use_dir_lock
is
not
None
and
lock_class
is
not
None
:
raise
ValueError
(
"Cannot use use_dir_lock and lock_class together"
)
try
:
from
lockfile
import
LockFile
from
lockfile.mkdirlockfile
import
MkdirLockFile
except
ImportError
:
notice
=
dedent
(
"""
NOTE: In order to use the FileCache you must have
lockfile installed. You can install it via pip:
pip install lockfile
"""
)
raise
ImportError
(
notice
)
else
:
if
use_dir_lock
:
lock_class
=
MkdirLockFile
elif
lock_class
is
None
:
lock_class
=
LockFile
self
.
directory
=
directory
self
.
forever
=
forever
self
.
filemode
=
filemode
self
.
dirmode
=
dirmode
self
.
lock_class
=
lock_class
@staticmethod
def
encode
(
x
):
return
hashlib
.
sha224
(
x
.
encode
())
.
hexdigest
()
def
_fn
(
self
,
name
):
# NOTE: This method should not change as some may depend on it.
# See: https://github.com/ionrock/cachecontrol/issues/63
hashed
=
self
.
encode
(
name
)
parts
=
list
(
hashed
[:
5
])
+
[
hashed
]
return
os
.
path
.
join
(
self
.
directory
,
*
parts
)
def
get
(
self
,
key
):
name
=
self
.
_fn
(
key
)
try
:
with
open
(
name
,
"rb"
)
as
fh
:
return
fh
.
read
()
except
FileNotFoundError
:
return
None
def
set
(
self
,
key
,
value
):
name
=
self
.
_fn
(
key
)
# Make sure the directory exists
try
:
os
.
makedirs
(
os
.
path
.
dirname
(
name
),
self
.
dirmode
)
except
(
IOError
,
OSError
):
pass
with
self
.
lock_class
(
name
)
as
lock
:
# Write our actual file
with
_secure_open_write
(
lock
.
path
,
self
.
filemode
)
as
fh
:
fh
.
write
(
value
)
def
delete
(
self
,
key
):
name
=
self
.
_fn
(
key
)
if
not
self
.
forever
:
try
:
os
.
remove
(
name
)
except
FileNotFoundError
:
pass
def
url_to_file_path
(
url
,
filecache
):
"""Return the file cache path based on the URL.
This does not ensure the file exists!
"""
key
=
CacheController
.
cache_url
(
url
)
return
filecache
.
_fn
(
key
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment