Mercurial > ambnews-firefox
comparison manage.py @ 0:66b00b4c37a6
Origination.
| author | Atul Varma <varmaa@toolness.com> |
|---|---|
| date | Thu, 21 Aug 2008 15:15:44 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:66b00b4c37a6 |
|---|---|
| 1 import os | |
| 2 import sys | |
| 3 import xml.dom.minidom | |
| 4 import subprocess | |
| 5 import shutil | |
| 6 import zipfile | |
| 7 from ConfigParser import ConfigParser | |
| 8 | |
| 9 # Path to the root of the extension, relative to where this script is | |
| 10 # located. | |
| 11 EXT_SUBDIR = "ambnews" | |
| 12 | |
| 13 def find_profile_dir(name): | |
| 14 """ | |
| 15 Given the name of a Firefox profile, attempts to find the absolute | |
| 16 path to its directory. If it can't be found, None is returned. | |
| 17 """ | |
| 18 | |
| 19 base_path = None | |
| 20 if sys.platform == "darwin": | |
| 21 base_path = os.path.expanduser( | |
| 22 "~/Library/Application Support/Firefox/" | |
| 23 ) | |
| 24 elif sys.platform.startswith("win"): | |
| 25 # TODO: This only works on 2000/XP/Vista, not 98/Me. | |
| 26 appdata = os.environ["APPDATA"] | |
| 27 base_path = os.path.join(appdata, "Mozilla\\Firefox") | |
| 28 else: | |
| 29 base_path = os.path.expanduser("~/.mozilla/firefox/") | |
| 30 inifile = os.path.join(base_path, "profiles.ini") | |
| 31 config = ConfigParser() | |
| 32 config.read(inifile) | |
| 33 profiles = [section for section in config.sections() | |
| 34 if section.startswith("Profile")] | |
| 35 for profile in profiles: | |
| 36 if config.get(profile, "Name") == name: | |
| 37 # TODO: Look at IsRelative? | |
| 38 path = config.get(profile, "Path") | |
| 39 if not os.path.isabs(path): | |
| 40 path = os.path.join(base_path, path) | |
| 41 print "Found profile '%s' at %s." % (name, path) | |
| 42 return path | |
| 43 print "Couldn't find a profile called '%s'." % name | |
| 44 return None | |
| 45 | |
| 46 def get_install_rdf_dom(path_to_extension_root): | |
| 47 rdf_path = os.path.join(path_to_extension_root, "install.rdf") | |
| 48 rdf = xml.dom.minidom.parse(rdf_path) | |
| 49 return rdf | |
| 50 | |
| 51 def get_install_rdf_property(path_to_extension_root, property): | |
| 52 rdf = get_install_rdf_dom(path_to_extension_root) | |
| 53 element = rdf.documentElement.getElementsByTagName(property)[0] | |
| 54 return element.firstChild.nodeValue | |
| 55 | |
| 56 if __name__ == "__main__": | |
| 57 args = sys.argv[1:] | |
| 58 if not args: | |
| 59 print "usage: %s <command>" % sys.argv[0] | |
| 60 print | |
| 61 print "'command' can be one of the following:" | |
| 62 print | |
| 63 print " test - run unit tests" | |
| 64 print " install - install to the given profile" | |
| 65 print " uninstall - uninstall from the given profile" | |
| 66 print " build-xpi - build an xpi of the addon" | |
| 67 print | |
| 68 sys.exit(1) | |
| 69 | |
| 70 main = __import__("__main__") | |
| 71 mydir = os.path.abspath(os.path.split(main.__file__)[0]) | |
| 72 | |
| 73 path_to_extension_root = os.path.join(mydir, EXT_SUBDIR) | |
| 74 | |
| 75 cmd = args[0] | |
| 76 | |
| 77 if cmd == "test": | |
| 78 print "No unit tests." | |
| 79 sys.exit(1) | |
| 80 elif cmd in ["install", "uninstall"]: | |
| 81 if len(args) != 2: | |
| 82 print "Attempting to find location of default profile..." | |
| 83 | |
| 84 profile_dir = find_profile_dir("default") | |
| 85 else: | |
| 86 profile_dir = args[1] | |
| 87 if not os.path.exists(profile_dir): | |
| 88 print "Attempting to find a profile with the name '%s'." % ( | |
| 89 profile_dir | |
| 90 ) | |
| 91 profile_dir = find_profile_dir(profile_dir) | |
| 92 | |
| 93 if not (profile_dir and os.path.exists(profile_dir) and | |
| 94 os.path.isdir(profile_dir)): | |
| 95 print "Can't resolve profile directory; aborting." | |
| 96 sys.exit(1) | |
| 97 | |
| 98 extension_id = get_install_rdf_property(path_to_extension_root, | |
| 99 "em:id") | |
| 100 | |
| 101 extension_file = os.path.join(profile_dir, | |
| 102 "extensions", | |
| 103 extension_id) | |
| 104 files_to_remove = ["compreg.dat", | |
| 105 "xpti.dat"] | |
| 106 for filename in files_to_remove: | |
| 107 abspath = os.path.join(profile_dir, filename) | |
| 108 if os.path.exists(abspath): | |
| 109 os.remove(abspath) | |
| 110 if os.path.exists(extension_file): | |
| 111 if os.path.isdir(extension_file): | |
| 112 shutil.rmtree(extension_file) | |
| 113 else: | |
| 114 os.remove(extension_file) | |
| 115 if cmd == "install": | |
| 116 fileobj = open(extension_file, "w") | |
| 117 fileobj.write(path_to_extension_root) | |
| 118 fileobj.close() | |
| 119 print "Extension '%s' installed." % extension_id | |
| 120 else: | |
| 121 print "Extension '%s' uninstalled." % extension_id | |
| 122 elif cmd == "build-xpi": | |
| 123 version = get_install_rdf_property(path_to_extension_root, | |
| 124 "em:version") | |
| 125 extname = get_install_rdf_property(path_to_extension_root, | |
| 126 "em:name").lower() | |
| 127 extname = extname.replace(" ", "") | |
| 128 zfname = "%s-%s.xpi" % (extname, version) | |
| 129 zf = zipfile.ZipFile(zfname, | |
| 130 "w", | |
| 131 zipfile.ZIP_DEFLATED) | |
| 132 for dirpath, dirnames, filenames in os.walk(path_to_extension_root): | |
| 133 for filename in filenames: | |
| 134 abspath = os.path.join(dirpath, filename) | |
| 135 arcpath = abspath[len(path_to_extension_root)+1:] | |
| 136 zf.write(abspath, arcpath) | |
| 137 print "Created %s." % zfname | |
| 138 else: | |
| 139 print "Unknown command '%s'" % cmd | |
| 140 sys.exit(1) |
