Source code for filetracker.client.utils
"""Common routines for client."""
import errno
import os
import shutil
import six
[docs]def split_name(name):
"""Splits a (possibly versioned) name into unversioned name and version.
Returns a tuple ``(unversioned_name, version)``, where ``version`` may
be ``None``.
"""
s = name.rsplit('@', 1)
if len(s) == 1:
return s[0], None
else:
try:
return s[0], int(s[1])
except ValueError:
raise ValueError("Invalid Filetracker filename: version must "
"be int, not %r" % (s[1],))
def versioned_name(unversioned_name, version):
"""Joins an unversioned name with the specified version.
Returns a versioned path.
"""
return unversioned_name + '@' + str(version)
def _check_name(name, allow_version=True):
if not isinstance(name, six.string_types):
raise ValueError("Invalid Filetracker filename: not string: %r" %
(name,))
parts = name.split('/')
if not parts:
raise ValueError("Invalid Filetracker filename: empty name")
if parts[0]:
raise ValueError("Invalid Filetracker filename: does not start with /")
if '..' in parts:
raise ValueError("Invalid Filetracker filename: .. in path")
if '@' in ''.join(parts[:-1]):
raise ValueError("Invalid Filetracker filename: @ in path")
if len(parts[-1].split('@')) > 2:
raise ValueError("Invalid Filetracker filename: multiple versions")
if '@' in parts[-1] and not allow_version:
raise ValueError("Invalid Filetracker filename: version not allowed "
"in this API call")
def _mkdir(name):
try:
os.makedirs(name, 0o700)
except OSError as e:
if e.errno != errno.EEXIST:
raise