Skip to content

Commit bbda445

Browse files
committed
Improve package_io and usage to better handle exceptional cases,
such as a JSON file not being parsable
1 parent 1be3731 commit bbda445

File tree

3 files changed

+48
-31
lines changed

3 files changed

+48
-31
lines changed

package_control/package_disabler.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ def get_version(self, package):
3232
The string version
3333
"""
3434

35-
metadata_json = read_package_file(package, 'package-metadata.json')
36-
if metadata_json:
37-
metadata = json.loads(metadata_json)
38-
return metadata.get('version', 'unknown version')
35+
if package_file_exists(package, 'package-metadata.json'):
36+
metadata_json = read_package_file(package, 'package-metadata.json')
37+
if metadata_json:
38+
try:
39+
return json.loads(metadata_json).get('version', 'unknown version')
40+
except (ValueError):
41+
pass
3942

4043
return 'unknown version'
4144

package_control/package_io.py

+7-9
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ def read_package_file(package, relative_path, binary=False):
2525
A unicode or byte string (depending on value if binary param) or False on error
2626
"""
2727

28+
if relative_path is None:
29+
return False
30+
2831
package_dir = _get_package_dir(package)
2932

30-
if os.path.exists(package_dir):
31-
result = _read_regular_file(package, relative_path, binary)
32-
if result is not False:
33-
return result
33+
if os.path.exists(package_dir) and _regular_file_exists(package, relative_path):
34+
return _read_regular_file(package, relative_path, binary)
3435

3536
if int(sublime.version()) >= 3000:
3637
result = _read_zip_file(package, relative_path, binary)
@@ -80,12 +81,9 @@ def _get_package_dir(package):
8081
def _read_regular_file(package, relative_path, binary=False):
8182
package_dir = _get_package_dir(package)
8283
file_path = os.path.join(package_dir, relative_path)
83-
try:
84-
with open_compat(file_path, ('rb' if binary else 'r')) as f:
85-
return read_compat(f)
8684

87-
except (FileNotFoundError):
88-
return False
85+
with open_compat(file_path, ('rb' if binary else 'r')) as f:
86+
return read_compat(f)
8987

9088

9189
def _read_zip_file(package, relative_path, binary=False):

package_control/package_manager.py

+34-18
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,19 @@ def get_metadata(self, package, is_dependency=False):
160160
if is_dependency:
161161
metadata_filename = 'dependency-metadata.json'
162162

163-
try:
163+
if package_file_exists(package, metadata_filename):
164164
metadata_json = read_package_file(package, metadata_filename)
165165
if metadata_json:
166-
return json.loads(metadata_json)
167-
168-
except (IOError, ValueError):
169-
pass
166+
try:
167+
return json.loads(metadata_json)
168+
except (ValueError):
169+
console_write(
170+
u'''
171+
An error occurred while trying to parse the package
172+
metadata for %s.
173+
''',
174+
package
175+
)
170176

171177
return {}
172178

@@ -182,19 +188,19 @@ def get_dependencies(self, package):
182188
A list of dependency names
183189
"""
184190

185-
try:
186-
if not package_file_exists(package, 'dependencies.json'):
187-
raise ValueError()
188-
191+
if package_file_exists(package, 'dependencies.json'):
189192
dep_info_json = read_package_file(package, 'dependencies.json')
190-
if not dep_info_json:
191-
raise ValueError()
192-
193-
dep_info = json.loads(dep_info_json)
194-
return self.select_dependencies(dep_info)
195-
196-
except (IOError, ValueError):
197-
pass
193+
if dep_info_json:
194+
try:
195+
return self.select_dependencies(json.loads(dep_info_json))
196+
except (ValueError):
197+
console_write(
198+
u'''
199+
An error occurred while trying to parse the
200+
dependencies.json for %s.
201+
''',
202+
package
203+
)
198204

199205
metadata = self.get_metadata(package)
200206
if metadata:
@@ -1022,7 +1028,17 @@ def install_package(self, package_name, is_dependency=False):
10221028
if not is_dependency and not have_installed_dependencies:
10231029
try:
10241030
dep_info_json = package_zip.read(dependencies_path)
1025-
dep_info = json.loads(dep_info_json.decode('utf-8'))
1031+
try:
1032+
dep_info = json.loads(dep_info_json.decode('utf-8'))
1033+
except (ValueError):
1034+
console_write(
1035+
u'''
1036+
An error occurred while trying to parse the
1037+
dependencies.json for %s.
1038+
''',
1039+
package_name
1040+
)
1041+
return False
10261042

10271043
dependencies = self.select_dependencies(dep_info)
10281044
if not self.install_dependencies(dependencies):

0 commit comments

Comments
 (0)