-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathuse
More file actions
executable file
·115 lines (97 loc) · 3.89 KB
/
use
File metadata and controls
executable file
·115 lines (97 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/python
import optparse
import os
import plistlib
import shutil
import sys
def get_launcher_name():
return "mac-java-launcher"
def get_java_options_key(plist_root):
for key in ["Java", "JVMOptions"]:
if key in plist_root:
return key
raise OSError("Not a java application")
def set_java_version(app_dir, version):
contents_dir = os.path.join(app_dir, "Contents")
macos_dir = os.path.join(contents_dir, "MacOS")
plist_file = os.path.join(contents_dir, "Info.plist.original")
if not os.path.isfile(plist_file):
plist_file = os.path.join(contents_dir, "Info.plist")
plist_root = plistlib.readPlist(plist_file)
plist_java_key = get_java_options_key(plist_root)
plist_java = plist_root[plist_java_key]
plist_java["JVMVersion"] = version
plistlib.writePlist(plist_root, plist_file)
def launcher_apply(app_dir):
launcher_name = get_launcher_name()
contents_dir = os.path.join(app_dir, "Contents")
macos_dir = os.path.join(contents_dir, "MacOS")
plist_file = os.path.join(contents_dir, "Info.plist")
plist_original_file = os.path.join(contents_dir, "Info.plist.original")
launcher_file = os.path.join(macos_dir, launcher_name)
launcher_stub_file = os.path.join(os.path.dirname(__file__), "launcher")
plist_root = plistlib.readPlist(plist_file)
plist_java_key = get_java_options_key(plist_root)
plist_file_mode = os.stat(plist_file).st_mode
launcher_file_mode = os.stat(os.path.join(macos_dir, plist_root["CFBundleExecutable"])).st_mode
shutil.copyfile(plist_file, plist_original_file)
shutil.copyfile(launcher_stub_file, launcher_file)
os.chmod(launcher_file, launcher_file_mode)
plist_root.pop(plist_java_key, None)
plist_root["CFBundleExecutable"] = launcher_name
plistlib.writePlist(plist_root, plist_file)
os.chmod(plist_file, plist_file_mode)
# Mac OS caches some bundle info, need to touch to force update
os.utime(contents_dir, None)
os.utime(macos_dir, None)
os.utime(app_dir, None)
return 0
def launcher_undo(app_dir):
launcher_name = get_launcher_name()
contents_dir = os.path.join(app_dir, "Contents")
macos_dir = os.path.join(contents_dir, "MacOS")
plist_file = os.path.join(contents_dir, "Info.plist")
plist_original_file = os.path.join(contents_dir, "Info.plist.original")
launcher_file = os.path.join(macos_dir, launcher_name)
plist_file_mode = os.stat(plist_file).st_mode
shutil.copyfile(plist_original_file, plist_file)
os.chmod(plist_file, plist_file_mode)
os.remove(plist_original_file)
os.remove(launcher_file)
# Mac OS caches some bundle info, need to touch to force update
os.utime(contents_dir, None)
os.utime(macos_dir, None)
os.utime(app_dir, None)
return 0
def main(argv):
usage = "usage: %prog [options] app_bundle"
parser = optparse.OptionParser(usage=usage)
parser.add_option("-a", "--apply", dest="apply", action="store_true",
help="set launcher for specified java bundled application")
parser.add_option("-u", "--undo", dest="undo", action="store_true",
help="undo changes, revert app to original state")
parser.add_option("-j", "--java-version", dest="java_version", metavar="VERSION",
type="string", default=None,
help="set java version to be used by that application")
(options, args) = parser.parse_args(argv[1:])
if 0 == len(args) :
parser.error("path to java application bundle was not specified")
if options.apply and options.undo:
parser.error("choose apply or undo - you can not have both")
try:
for app_dir in args:
if options.java_version is not None:
print "setting java version \"%s\" for \"%s\"" % (options.java_version, app_dir)
set_java_version(app_dir, options.java_version)
if options.apply:
print "applying launcher to \"%s\"" % (app_dir)
launcher_apply(app_dir)
if options.undo:
print "undoing launcher to \"%s\"" % (app_dir)
launcher_undo(app_dir)
except Exception, e:
print "Error: %s" % (str(e))
return 1
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))