Skip to content

Commit e6dad98

Browse files
committed
Added the ability to show install and upgrade messages to users
1 parent 2ffe7cd commit e6dad98

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

Package Control.py

+86-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,42 @@
2121
except (ImportError):
2222
pass
2323

24+
class PanelPrinter():
25+
instance = None
26+
27+
@classmethod
28+
def get(cls):
29+
if cls.instance == None:
30+
cls.instance = PanelPrinter()
31+
return cls.instance
32+
33+
def __init__(self):
34+
self.name = 'package_control'
35+
self.window = sublime.active_window()
36+
self.panel = self.window.get_output_panel(self.name)
37+
self.panel.settings().set("word_wrap", True)
38+
self.write('Package Control Messages\n========================')
39+
40+
def show(self):
41+
sublime.set_timeout(self.show_callback, 0)
42+
43+
def show_callback(self):
44+
self.window.run_command("show_panel", {"panel": "output." + self.name})
45+
46+
def write(self, string):
47+
callback = lambda: self.write_callback(string)
48+
sublime.set_timeout(callback, 0)
49+
50+
def write_callback(self, string):
51+
self.panel.set_read_only(False)
52+
edit = self.panel.begin_edit()
53+
54+
self.panel.insert(edit, self.panel.size(), string)
55+
self.panel.show(self.panel.size())
56+
self.panel.end_edit(edit)
57+
self.panel.set_read_only(True)
58+
59+
2460
class ThreadProgress():
2561
def __init__(self, thread, message, success_message):
2662
self.thread = thread
@@ -622,6 +658,7 @@ def incoming(self):
622658

623659
class PackageManager():
624660
def __init__(self):
661+
self.printer = PanelPrinter.get()
625662
# Here we manually copy the settings since sublime doesn't like
626663
# code accessing settings from threads
627664
self.settings = {}
@@ -884,6 +921,9 @@ def install_package(self, package_name):
884921

885922
package_dir = self.get_package_dir(package_name)
886923

924+
package_metadata_file = os.path.join(package_dir,
925+
'package-metadata.json')
926+
887927
if os.path.exists(os.path.join(package_dir, '.git')):
888928
return GitUpgrader(self.settings['git_binary'],
889929
self.settings['git_update_command'], package_dir,
@@ -893,6 +933,11 @@ def install_package(self, package_name):
893933
self.settings['hg_update_command'], package_dir,
894934
self.settings['cache_length']).run()
895935

936+
is_upgrade = os.path.exists(package_metadata_file)
937+
old_version = None
938+
if is_upgrade:
939+
old_version = self.get_metadata(package_name).get('version')
940+
896941
package_bytes = self.download_url(url, 'Error downloading package.')
897942
if package_bytes == False:
898943
return False
@@ -992,8 +1037,8 @@ def slow_delete(function, path, excinfo):
9921037
path)
9931038
package_zip.close()
9941039

995-
package_metadata_file = os.path.join(package_dir,
996-
'package-metadata.json')
1040+
self.print_messages(package_name, package_dir, is_upgrade, old_version)
1041+
9971042
with open(package_metadata_file, 'w') as f:
9981043
metadata = {
9991044
"version": packages[package_name]['downloads'][0]['version'],
@@ -1013,6 +1058,45 @@ def slow_delete(function, path, excinfo):
10131058
os.chdir(sublime.packages_path())
10141059
return True
10151060

1061+
def print_messages(self, package, package_dir, is_upgrade, old_version):
1062+
messages_file = os.path.join(package_dir, 'messages.json')
1063+
if os.path.exists(messages_file):
1064+
messages_fp = open(messages_file, 'r')
1065+
message_info = json.load(messages_fp)
1066+
messages_fp.close()
1067+
1068+
shown = False
1069+
if not is_upgrade and message_info.get('install'):
1070+
install_messages = os.path.join(package_dir,
1071+
message_info.get('install'))
1072+
message = '\n\n' + package + ':\n '
1073+
with open(install_messages, 'r') as f:
1074+
message += f.read().replace('\n', '\n ')
1075+
self.printer.write(message)
1076+
shown = True
1077+
1078+
elif is_upgrade and old_version:
1079+
upgrade_messages = list(set(message_info.keys()) -
1080+
set(['install']))
1081+
upgrade_messages = sorted(upgrade_messages,
1082+
cmp=self.compare_versions, reverse=True)
1083+
for version in upgrade_messages:
1084+
if self.compare_versions(old_version, version) >= 0:
1085+
break
1086+
if not shown:
1087+
message = '\n\n' + package + ':'
1088+
self.printer.write(message)
1089+
upgrade_messages = os.path.join(package_dir,
1090+
message_info.get(version))
1091+
message = '\n '
1092+
with open(upgrade_messages, 'r') as f:
1093+
message += f.read().replace('\n', '\n ')
1094+
self.printer.write(message)
1095+
shown = True
1096+
1097+
if shown:
1098+
self.printer.show()
1099+
10161100
def remove_package(self, package_name):
10171101
installed_packages = self.list_packages()
10181102

example-messages.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"install": "messages/install.txt",
3+
"1.1.1": "messages/1.1.1.txt",
4+
"1.2.0": "messages/1.2.0.txt"
5+
}

0 commit comments

Comments
 (0)