Files
Iristyle a000ce8acc feat(ST2.UtilPackages): bump up all packages
- Refresh PackageCache with latest versions of everything
2013-09-16 22:35:46 -04:00

127 lines
3.9 KiB
Python

import os
import zipfile
import sublime
from .console_write import console_write
from .open_compat import open_compat, read_compat
from .unicode import unicode_from_os
from .file_not_found_error import FileNotFoundError
def read_package_file(package, relative_path, binary=False, debug=False):
package_dir = _get_package_dir(package)
file_path = os.path.join(package_dir, relative_path)
if os.path.exists(package_dir):
result = _read_regular_file(package, relative_path, binary, debug)
if result != False:
return result
if int(sublime.version()) >= 3000:
result = _read_zip_file(package, relative_path, binary, debug)
if result != False:
return result
if debug:
console_write(u"Unable to find file %s in the package %s" % (relative_path, package), True)
return False
def package_file_exists(package, relative_path):
package_dir = _get_package_dir(package)
file_path = os.path.join(package_dir, relative_path)
if os.path.exists(package_dir):
result = _regular_file_exists(package, relative_path)
if result:
return result
if int(sublime.version()) >= 3000:
return _zip_file_exists(package, relative_path)
return False
def _get_package_dir(package):
""":return: The full filesystem path to the package directory"""
return os.path.join(sublime.packages_path(), package)
def _read_regular_file(package, relative_path, binary=False, debug=False):
package_dir = _get_package_dir(package)
file_path = os.path.join(package_dir, relative_path)
try:
with open_compat(file_path, ('rb' if binary else 'r')) as f:
return read_compat(f)
except (FileNotFoundError) as e:
if debug:
console_write(u"Unable to find file %s in the package folder for %s" % (relative_path, package), True)
return False
def _read_zip_file(package, relative_path, binary=False, debug=False):
zip_path = os.path.join(sublime.installed_packages_path(),
package + '.sublime-package')
if not os.path.exists(zip_path):
if debug:
console_write(u"Unable to find a sublime-package file for %s" % package, True)
return False
try:
package_zip = zipfile.ZipFile(zip_path, 'r')
except (zipfile.BadZipfile):
console_write(u'An error occurred while trying to unzip the sublime-package file for %s.' % package, True)
return False
try:
contents = package_zip.read(relative_path)
if not binary:
contents = contents.decode('utf-8')
return contents
except (KeyError) as e:
if debug:
console_write(u"Unable to find file %s in the sublime-package file for %s" % (relative_path, package), True)
except (IOError) as e:
message = unicode_from_os(e)
console_write(u'Unable to read file from sublime-package file for %s due to an invalid filename' % package, True)
except (UnicodeDecodeError):
console_write(u'Unable to read file from sublime-package file for %s due to an invalid filename or character encoding issue' % package, True)
return False
def _regular_file_exists(package, relative_path):
package_dir = _get_package_dir(package)
file_path = os.path.join(package_dir, relative_path)
return os.path.exists(file_path)
def _zip_file_exists(package, relative_path):
zip_path = os.path.join(sublime.installed_packages_path(),
package + '.sublime-package')
if not os.path.exists(zip_path):
return False
try:
package_zip = zipfile.ZipFile(zip_path, 'r')
except (zipfile.BadZipfile):
console_write(u'An error occurred while trying to unzip the sublime-package file for %s.' % package_name, True)
return False
try:
package_zip.getinfo(relative_path)
return True
except (KeyError) as e:
return False