diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/dh_xul-ext | 18 | ||||
-rwxr-xr-x | src/install-xpi | 398 | ||||
-rwxr-xr-x | src/moz-version | 209 | ||||
-rw-r--r-- | src/moz_version.py | 242 | ||||
-rwxr-xr-x | src/xpi-repack | 167 |
5 files changed, 542 insertions, 492 deletions
diff --git a/src/dh_xul-ext b/src/dh_xul-ext index 832ba9b..8413b3f 100755 --- a/src/dh_xul-ext +++ b/src/dh_xul-ext @@ -15,10 +15,8 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. import csv -import glob import optparse import os -import subprocess import sys from moz_version import compare_versions, convert_moz_to_debian_version @@ -27,7 +25,7 @@ import RDF # error codes COMMAND_LINE_SYNTAX_ERROR = 1 -MULTIPLE_INSTALL_RDFs = 2 +MULTIPLE_INSTALL_RDFS = 2 class XulApp(object): def __init__(self, xul_id, package, sol, eol): @@ -85,7 +83,7 @@ def get_supported_apps(script_name, xul_apps, install_rdf, package, id_max_min = [] model = RDF.Model() parser = RDF.Parser(name="rdfxml") - stream = parser.parse_into_model(model, "file:" + install_rdf) + parser.parse_into_model(model, "file:" + install_rdf) query = RDF.Query( """ PREFIX em: <http://www.mozilla.org/2004/em-rdf#> @@ -170,7 +168,8 @@ def get_provided_package_names(package, supported_apps): lines = open("debian/rules").readlines() lines = filter(lambda x: x.find("MOZ_XPI_EXT_NAME") != -1, lines) if len(lines) > 0: - ext_name = lines[-1][line.find("=")+1:].strip() + line = lines[-1] + ext_name = line[line.find("=")+1:].strip() provides = set() provides.add("xul-ext-" + ext_name) @@ -216,7 +215,7 @@ def generate_substvars(script_name, xul_apps, package, verbose=False): basepath_len = len(os.path.realpath("debian/" + package)) rdfs = map(lambda x: x[basepath_len:], install_rdfs) print >> sys.stderr, "\n".join(rdfs) - sys.exit(MULTIPLE_INSTALL_RDFs) + sys.exit(MULTIPLE_INSTALL_RDFS) install_rdf = install_rdfs.pop() filename = "debian/" + package + ".substvars" @@ -274,7 +273,7 @@ class UnknownOptionIgnoringOptionParser(optparse.OptionParser): optparse.OptionParser._process_short_opts(self, rargs, values) -if __name__ == "__main__": +def main(): script_name = os.path.basename(sys.argv[0]) epilog = "See %s(1) for more info." % (script_name) parser = UnknownOptionIgnoringOptionParser(epilog=epilog) @@ -284,7 +283,7 @@ if __name__ == "__main__": parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="print more information") - (options, args) = parser.parse_args() + options = parser.parse_args()[0] if len(options.packages) == 0: options.packages = get_all_packages() @@ -303,3 +302,6 @@ if __name__ == "__main__": for package in options.packages: generate_substvars(script_name, xul_apps, package, options.verbose) + +if __name__ == "__main__": + main() diff --git a/src/install-xpi b/src/install-xpi index 0e547eb..0c7b6f7 100755 --- a/src/install-xpi +++ b/src/install-xpi @@ -30,207 +30,235 @@ import zipfile import RDF +LICENSE_PATTERN_LIST = ( + "copying", + "gpl.txt", + "licence", + "license", + "licence.txt", + "license.txt" +) + # error codes COMMAND_LINE_SYNTAX_ERROR = 1 XPI_FILE_DOES_NOT_EXISTS = 2 def get_query_field_id_as_list(rdf_path, query_string): - ret = [] - model = RDF.Model() - parser = RDF.Parser(name="rdfxml") - stream = parser.parse_into_model(model, "file:" + rdf_path) - query = RDF.Query("PREFIX em: <http://www.mozilla.org/2004/em-rdf#> " + query_string, query_language="sparql") - results = query.execute(model) - for result in results: - ret.append(result["id"].literal_value["string"]) - return ret - - -def get_target_applications(script_name, install_rdf, verbose=False): - target_applications = get_query_field_id_as_list(install_rdf, - "SELECT ?id WHERE { ?x1 em:targetApplication ?x2 . ?x2 em:id ?id }") - return target_applications + ret = [] + model = RDF.Model() + parser = RDF.Parser(name="rdfxml") + parser.parse_into_model(model, "file:" + rdf_path) + query = RDF.Query("PREFIX em: <http://www.mozilla.org/2004/em-rdf#> " + \ + query_string, query_language="sparql") + results = query.execute(model) + for result in results: + ret.append(result["id"].literal_value["string"]) + return ret + +def get_target_applications(install_rdf): + target_applications = get_query_field_id_as_list(install_rdf, + "SELECT ?id WHERE { ?x1 em:targetApplication ?x2 . ?x2 em:id ?id }") + return target_applications def get_extension_id(install_rdf): - extension_ids = set(get_query_field_id_as_list(install_rdf, - "SELECT ?id WHERE {?x1 em:targetApplication ?x2 . ?x1 em:id ?id }")) - return extension_ids.pop() + extension_ids = set(get_query_field_id_as_list(install_rdf, + "SELECT ?id WHERE {?x1 em:targetApplication ?x2 . ?x1 em:id ?id }")) + return extension_ids.pop() def get_arch(package): - lines = open("debian/control").readlines() - package_lines = filter(lambda x: x.find("Package:") >= 0, lines) - packages = map(lambda x: x[x.find(":")+1:].strip(), package_lines) - architecture_lines = filter(lambda x: x.find("Architecture:") >= 0, lines) - architectures = map(lambda x: x[x.find(":")+1:].strip(), architecture_lines) - (p, arch) = filter(lambda (x, y): x == package, zip(packages, architectures))[0] - return arch + lines = open("debian/control").readlines() + package_lines = filter(lambda x: x.find("Package:") >= 0, lines) + packages = map(lambda x: x[x.find(":")+1:].strip(), package_lines) + architecture_lines = filter(lambda x: x.find("Architecture:") >= 0, lines) + architectures = map(lambda x: x[x.find(":")+1:].strip(), architecture_lines) + (_, arch) = filter(lambda (x, y): x == package, + zip(packages, architectures))[0] + return arch def get_mode(filename): - st = os.stat(filename) - mode = st[stat.ST_MODE] - return mode & 0777 + statinfo = os.stat(filename) + mode = statinfo[stat.ST_MODE] + return mode & 0777 def get_xul_apps(): - csvfile = open("/usr/share/mozilla-devscripts/xul-app-data.csv") - csv_reader = csv.DictReader(csvfile) - rows = [] - for row in csv_reader: - rows.append(row) - return rows + csvfile = open("/usr/share/mozilla-devscripts/xul-app-data.csv") + csv_reader = csv.DictReader(csvfile) + rows = [] + for row in csv_reader: + rows.append(row) + return rows def install_xpi(script_name, package, xpi_file, exclude, install_dir, links, - correct_permissions, remove_licenses, system_prefs, verbose=False): - # get xpi file content list - if not os.path.isfile(xpi_file): - print >> sys.stderr, "%s: Error: xpi file %s does not exist." % (script_name, xpi_file) - sys.exit(XPI_FILE_DOES_NOT_EXISTS) - zfobj = zipfile.ZipFile(xpi_file) - xpi_content = zfobj.namelist() - - # determine installation directory - if get_arch(package) == "all": - lib_share_dir = "share" - else: - lib_share_dir = "lib" - if install_dir is None: - install_dir = os.path.join("usr", lib_share_dir, "xul-ext", - package.replace("xul-ext-", "")) - copy_dir = os.path.join("debian", package, install_dir.strip("/")) - if verbose: - print "%s: install directory: %s" % (script_name, install_dir) - - # remove documented license files - if remove_licenses: - pattern_list = ("copying", "gpl.txt", "licence", "license", "licence.txt", "license.txt") - for name in filter(lambda x: not x.endswith('/'), xpi_content): - basename = os.path.basename(name).lower() - if basename in pattern_list: - exclude.append(name) - print "%s: exclude license file %s" % (script_name, name) - - # create directory and extract xpi file - if not os.path.isdir(copy_dir): - os.makedirs(copy_dir) - command = ["unzip", "-o", "-d", copy_dir, xpi_file] - if len(exclude) > 0: - command.append("-x") - command.extend(exclude) - print " ".join(command) - subprocess.call(command) - - # correct permissons of files to 644 and directories to 755 - if correct_permissions: - for name in xpi_content: - filename = os.path.join(copy_dir, name) - if os.path.exists(filename): - mode = get_mode(filename) - if os.path.isdir(filename) and mode != 0755: - print "%s: correct permission from %s to %s of %s" % (script_name, oct(mode), oct(0755), name) - os.chmod(filename, 0755) - elif os.path.isfile(filename): - header = open(filename, "r").read(2) - if header != "#!" and mode != 0644: - # file without shebang - print "%s: correct permission from %s to %s of %s" % (script_name, oct(mode), oct(0644), name) - os.chmod(filename, 0644) - elif header == "#!" and mode != 0755: - # file with shebang - print "%s: correct permission from %s to %s of %s" % (script_name, oct(mode), oct(0755), name) - os.chmod(filename, 0755) - - # create a system preference file in /etc - if system_prefs: - # search for preference files - preferences = filter(lambda f: os.path.dirname(f) == os.path.join("defaults", "preferences") and f.endswith(".js"), xpi_content) - if len(preferences) > 0: - prefdir = os.path.join("etc", "xul-ext") - full_prefdir = os.path.join("debian", package, prefdir) - if not os.path.exists(full_prefdir): - os.makedirs(full_prefdir) - prefname = package.replace("xul-ext-", "") + ".js" - # create system preference file - f = open(os.path.join(full_prefdir, prefname), "w") - if os.path.isfile(os.path.join("debian", package + ".js")): - # use debian/package.js as configuration file if it exists - content = open(os.path.join("debian", package + ".js")).read() - # replace @INSTALLDIR@ by the actual installation directory - content = content.replace("@INSTALLDIR@", os.path.join("/", install_dir)) - f.write(content) - else: - f.write("// Place your preferences for " + package + " in this file.\n") - f.write("// You can override here the preferences specified in\n") - map(lambda x: f.write("// " + os.path.join("/", install_dir, x) + "\n"), preferences) - f.close() - link_source = os.path.join(prefdir, prefname) - link_target = os.path.join(install_dir, "defaults", "preferences", "000system.js") - command = ["dh_link", "-p" + package, link_source, link_target] - if verbose: - print " ".join(command) - subprocess.call(command) - - # get symlinks list - extension_id = get_extension_id(os.path.join(copy_dir, "install.rdf")) - target_applications = get_target_applications(script_name, os.path.join(copy_dir, "install.rdf")) - for target_application in target_applications: - destination = os.path.join("/usr", lib_share_dir, "mozilla/extensions", - target_application, extension_id) - links.add(destination) - - # create symlinks - for link in links: - command = ["dh_link", "-p" + package, install_dir, link] - print " ".join(command) - subprocess.call(command) + correct_permissions, remove_licenses, system_prefs, verbose=False): + # get xpi file content list + if not os.path.isfile(xpi_file): + print >> sys.stderr, "%s: Error: xpi file %s does not exist." % \ + (script_name, xpi_file) + sys.exit(XPI_FILE_DOES_NOT_EXISTS) + zfobj = zipfile.ZipFile(xpi_file) + xpi_content = zfobj.namelist() + + # determine installation directory + if get_arch(package) == "all": + lib_share_dir = "share" + else: + lib_share_dir = "lib" + if install_dir is None: + install_dir = os.path.join("usr", lib_share_dir, "xul-ext", + package.replace("xul-ext-", "")) + copy_dir = os.path.join("debian", package, install_dir.strip("/")) + if verbose: + print "%s: install directory: %s" % (script_name, install_dir) + + # remove documented license files + if remove_licenses: + for name in filter(lambda x: not x.endswith('/'), xpi_content): + basename = os.path.basename(name).lower() + if basename in LICENSE_PATTERN_LIST: + exclude.append(name) + print "%s: exclude license file %s" % (script_name, name) + + # create directory and extract xpi file + if not os.path.isdir(copy_dir): + os.makedirs(copy_dir) + command = ["unzip", "-o", "-d", copy_dir, xpi_file] + if len(exclude) > 0: + command.append("-x") + command.extend(exclude) + print " ".join(command) + subprocess.call(command) + + # correct permissons of files to 644 and directories to 755 + if correct_permissions: + for name in xpi_content: + filename = os.path.join(copy_dir, name) + if os.path.exists(filename): + mode = get_mode(filename) + if os.path.isdir(filename) and mode != 0755: + print "%s: correct permission from %s to %s of %s" % \ + (script_name, oct(mode), oct(0755), name) + os.chmod(filename, 0755) + elif os.path.isfile(filename): + header = open(filename, "r").read(2) + if header != "#!" and mode != 0644: + # file without shebang + print "%s: correct permission from %s to %s of %s" % \ + (script_name, oct(mode), oct(0644), name) + os.chmod(filename, 0644) + elif header == "#!" and mode != 0755: + # file with shebang + print "%s: correct permission from %s to %s of %s" % \ + (script_name, oct(mode), oct(0755), name) + os.chmod(filename, 0755) + + # create a system preference file in /etc + if system_prefs: + # search for preference files + pref_dir = os.path.join("defaults", "preferences") + preferences = filter(lambda f: os.path.dirname(f) == pref_dir and \ + f.endswith(".js"), xpi_content) + if len(preferences) > 0: + prefdir = os.path.join("etc", "xul-ext") + full_prefdir = os.path.join("debian", package, prefdir) + if not os.path.exists(full_prefdir): + os.makedirs(full_prefdir) + prefname = package.replace("xul-ext-", "") + ".js" + # create system preference file + f = open(os.path.join(full_prefdir, prefname), "w") + if os.path.isfile(os.path.join("debian", package + ".js")): + # use debian/package.js as configuration file if it exists + content = open(os.path.join("debian", package + ".js")).read() + # replace @INSTALLDIR@ by the actual installation directory + content = content.replace("@INSTALLDIR@", + os.path.join("/", install_dir)) + f.write(content) + else: + f.write("// Place your preferences for " + package + + " in this file.\n") + f.write("// You can override here the preferences specified " + "in\n") + map(lambda x: f.write("// " + + os.path.join("/", install_dir, x) + + "\n"), preferences) + f.close() + link_source = os.path.join(prefdir, prefname) + link_target = os.path.join(install_dir, "defaults", "preferences", + "000system.js") + command = ["dh_link", "-p" + package, link_source, link_target] + if verbose: + print " ".join(command) + subprocess.call(command) + + # get symlinks list + extension_id = get_extension_id(os.path.join(copy_dir, "install.rdf")) + filename = os.path.join(copy_dir, "install.rdf") + target_applications = get_target_applications(filename) + for target_application in target_applications: + destination = os.path.join("/usr", lib_share_dir, "mozilla/extensions", + target_application, extension_id) + links.add(destination) + + # create symlinks + for link in links: + command = ["dh_link", "-p" + package, install_dir, link] + print " ".join(command) + subprocess.call(command) def get_first_package(): - lines = open("debian/control").readlines() - package_lines = filter(lambda x: x.find("Package:") >= 0, lines) - packages = map(lambda x: x[x.find(":")+1:].strip(), package_lines) - return packages[0] + lines = open("debian/control").readlines() + package_lines = filter(lambda x: x.find("Package:") >= 0, lines) + packages = map(lambda x: x[x.find(":")+1:].strip(), package_lines) + return packages[0] + +def main(): + usage = "%s [options] <xpi-file>" % (os.path.basename(sys.argv[0])) + epilog = "See %s(1) for more info." % (os.path.basename(sys.argv[0])) + parser = optparse.OptionParser(usage=usage, epilog=epilog) + + parser.add_option("--disable-system-prefs", + help="do not create a system preference file in /etc", + dest="system_prefs", action="store_false", default=True) + parser.add_option("-x", "--exclude", metavar="FILE", + help="do not install specified FILE", + dest="exclude", action="append", default=list()) + parser.add_option("-i", "--install-dir", metavar="DIRECTORY", + help="install extension into the specified DIRECTORY", + dest="install_dir") + parser.add_option("-l", "--link", metavar="DIRECTORY", + help="link from DIRECTORY to extension directory", + dest="links", action="append", default=list()) + parser.add_option("-p", "--package", metavar="PACKAGE", + help="install the extension into specified PACKAGE", + dest="package", default=get_first_package()) + parser.add_option("--preserve-permissions", + help="do not adjust the file permissions", + dest="correct_permissions", action="store_false", default=True) + parser.add_option("-r", "--remove-license-files", + help="do not install license files", + dest="remove_licenses", action="store_true", default=False) + parser.add_option("-v", "--verbose", help="print more information", + dest="verbose", action="store_true", default=False) + + (options, args) = parser.parse_args() + + script_name = os.path.basename(sys.argv[0]) + + if len(args) == 0: + print >> sys.stderr, "%s: Error: No xpi file specified." % (script_name) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + elif len(args) > 1: + print >> sys.stderr, "%s: Error: Multiple xpi files specified: %s" % \ + (script_name, ", ".join(args)) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + + if options.verbose: + print script_name + ": Install %s into package %s." % \ + (args[0], options.package) + + install_xpi(script_name, options.package, args[0], options.exclude, + options.install_dir, set(options.links), + options.correct_permissions, options.remove_licenses, + options.system_prefs, options.verbose) if __name__ == "__main__": - usage = "%s [options] <xpi-file>" % (os.path.basename(sys.argv[0])) - epilog = "See %s(1) for more info." % (os.path.basename(sys.argv[0])) - parser = optparse.OptionParser(usage=usage, epilog=epilog) - - parser.add_option("--disable-system-prefs", - help="do not create a system preference file in /etc", - dest="system_prefs", action="store_false", default=True) - parser.add_option("-x", "--exclude", metavar="FILE", - help="do not install specified FILE", - dest="exclude", action="append", default=list()) - parser.add_option("-i", "--install-dir", metavar="DIRECTORY", - help="install extension into the specified DIRECTORY", - dest="install_dir") - parser.add_option("-l", "--link", metavar="DIRECTORY", - help="link from DIRECTORY to extension directory", - dest="links", action="append", default=list()) - parser.add_option("-p", "--package", metavar="PACKAGE", - help="install the extension into specified PACKAGE", - dest="package", default=get_first_package()) - parser.add_option("--preserve-permissions", - help="do not adjust the file permissions", - dest="correct_permissions", action="store_false", default=True) - parser.add_option("-r", "--remove-license-files", - help="do not install license files", - dest="remove_licenses", action="store_true", default=False) - parser.add_option("-v", "--verbose", help="print more information", - dest="verbose", action="store_true", default=False) - - (options, args) = parser.parse_args() - - script_name = os.path.basename(sys.argv[0]) - - if len(args) == 0: - print >> sys.stderr, "%s: Error: No xpi file specified." % (script_name) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - elif len(args) > 1: - print >> sys.stderr, script_name + ": Error: Multiple xpi files specified: " + ", ".join(args) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - - if options.verbose: - print script_name + ": Install %s into package %s." % (args[0], options.package) - - install_xpi(script_name, options.package, args[0], options.exclude, - options.install_dir, set(options.links), options.correct_permissions, - options.remove_licenses, options.system_prefs, options.verbose) + main() diff --git a/src/moz-version b/src/moz-version index cea49b7..85ec81a 100755 --- a/src/moz-version +++ b/src/moz-version @@ -24,49 +24,55 @@ import getopt import os import sys -from moz_version import compare_versions, convert_debian_to_moz_version, convert_moz_to_debian_version +from moz_version import (compare_versions, convert_debian_to_moz_version, + convert_moz_to_debian_version) # error codes COMMAND_LINE_SYNTAX_ERROR = 2 INVALID_COMPARATOR = 3 EMPTY_VERSION_STRING = 4 -comparators = ("lt", "le", "eq", "ne", "ge", "gt") - -def moz_version_compare(version1, comparator, version2, silent=False, verbose=False): - """Return true if the expression version1 comparator version2 is valid, otherwise false""" - if comparator not in comparators: - if not silent: - print >> sys.stderr, "E: The comparator " + comparator + \ - " is not valid. It should one of " + ", ".join(comparators) + "." - sys.exit(INVALID_COMPARATOR) - - if version1.strip() == "" or version2.strip() == "": - if not silent: - print >> sys.stderr, "E: At least one version string is empty." - sys.exit(EMPTY_VERSION_STRING) - - if verbose: - symbol = {"lt": "<", "le": "<=", "eq": "=", "ne": "!=", "ge": ">=", "gt": ">"} - print "I: Comparing %s %s %s." % (version1, symbol[comparator], version2) - - if comparator == "lt": - return compare_versions(version1, version2, verbose) < 0 - elif comparator == "le": - return compare_versions(version1, version2, verbose) <= 0 - elif comparator == "eq": - return compare_versions(version1, version2, verbose) == 0 - elif comparator == "ne": - return compare_versions(version1, version2, verbose) != 0 - elif comparator == "ge": - return compare_versions(version1, version2, verbose) >= 0 - elif comparator == "gt": - return compare_versions(version1, version2, verbose) > 0 +COMPARATORS = ("lt", "le", "eq", "ne", "ge", "gt") + +def moz_version_compare(version1, comparator, version2, silent=False, + verbose=False): + """Return true if the expression version1 comparator version2 is valid, + otherwise false""" + if comparator not in COMPARATORS: + if not silent: + print >> sys.stderr, "E: The comparator " + comparator + \ + " is not valid. It should one of " + \ + ", ".join(COMPARATORS) + "." + sys.exit(INVALID_COMPARATOR) + + if version1.strip() == "" or version2.strip() == "": + if not silent: + print >> sys.stderr, "E: At least one version string is empty." + sys.exit(EMPTY_VERSION_STRING) + + if verbose: + symbol = {"lt": "<", "le": "<=", "eq": "=", "ne": "!=", + "ge": ">=", "gt": ">"} + print "I: Comparing %s %s %s." % \ + (version1, symbol[comparator], version2) + + if comparator == "lt": + return compare_versions(version1, version2, verbose) < 0 + elif comparator == "le": + return compare_versions(version1, version2, verbose) <= 0 + elif comparator == "eq": + return compare_versions(version1, version2, verbose) == 0 + elif comparator == "ne": + return compare_versions(version1, version2, verbose) != 0 + elif comparator == "ge": + return compare_versions(version1, version2, verbose) >= 0 + elif comparator == "gt": + return compare_versions(version1, version2, verbose) > 0 def usage(output): - name = os.path.basename(sys.argv[0]) - print >> output, """Usage: %s [options] action + name = os.path.basename(sys.argv[0]) + print >> output, """Usage: %s [options] action Actions: -c, --compare version1 comparator version2 @@ -80,70 +86,75 @@ Options: -s, --silent do not print anything and die silent on errors -v, --verbose print more information -See %s(1) for more info.""" % (name, ", ".join(comparators), name) - +See %s(1) for more info.""" % (name, ", ".join(COMPARATORS), name) + + +def main(): + try: + long_opts = ["compare", "help", "silent", "to-deb", "to-moz", "verbose"] + opts, args = getopt.gnu_getopt(sys.argv[1:], "cdhmsv", long_opts) + except getopt.GetoptError, e: + # print help information and exit: + print >> sys.stderr, str(e) + usage(sys.stderr) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + + actions = set() + silent = False + verbose = False + + for o, _ in opts: + if o in ("-c", "--compare"): + actions.add("compare") + elif o in ("-d", "--to-deb"): + actions.add("to-deb") + elif o in ("-h", "--help"): + usage(sys.stdout) + sys.exit() + elif o in ("-m", "--to-moz"): + actions.add("to-moz") + elif o in ("-s", "--silent"): + silent = True + elif o in ("-v", "--verbose"): + verbose = True + else: + assert False, "unhandled option" + + if len(actions) != 1: + if not silent: + print >> sys.stderr, "E: You must specify an action." + usage(sys.stderr) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + + action = actions.pop() + + if action == "compare": + if len(args) != 3: + if not silent: + usage(sys.stderr) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + if moz_version_compare(args[0], args[1], args[2], silent, verbose): + if verbose: + print "I: Compare expression true." + sys.exit(0) + else: + if verbose: + print "I: Compare expression false." + sys.exit(1) + elif action == "to-deb": + if len(args) != 1: + if not silent: + print >> sys.stderr, "E: The action --to-deb takes exactly " + \ + "one argument." + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + print convert_moz_to_debian_version(args[0], 0, verbose) + elif action == "to-moz": + if len(args) != 1: + if not silent: + print >> sys.stderr, "E: The action --to-moz takes exactly " + \ + "one argument." + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + print convert_debian_to_moz_version(args[0], verbose) if __name__ == "__main__": - try: - long_opts = ["compare", "help", "silent", "to-deb", "to-moz", "verbose"] - opts, args = getopt.gnu_getopt(sys.argv[1:], "cdhmsv", long_opts) - except getopt.GetoptError, e: - # print help information and exit: - print >> sys.stderr, str(e) # will print something like "option -a not recognized" - usage(sys.stderr) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - - actions = set() - silent = False - verbose = False - - for o, a in opts: - if o in ("-c", "--compare"): - actions.add("compare") - elif o in ("-d", "--to-deb"): - actions.add("to-deb") - elif o in ("-h", "--help"): - usage(sys.stdout) - sys.exit() - elif o in ("-m", "--to-moz"): - actions.add("to-moz") - elif o in ("-s", "--silent"): - silent = True - elif o in ("-v", "--verbose"): - verbose = True - else: - assert False, "unhandled option" - - if len(actions) != 1: - if not silent: - print >> sys.stderr, "E: You must specify an action." - usage(sys.stderr) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - - action = actions.pop() - - if action == "compare": - if len(args) != 3: - if not silent: - usage(sys.stderr) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - if moz_version_compare(args[0], args[1], args[2], silent, verbose): - if verbose: - print "I: Compare expression true." - sys.exit(0) - else: - if verbose: - print "I: Compare expression false." - sys.exit(1) - elif action == "to-deb": - if len(args) != 1: - if not silent: - print >> sys.stderr, "E: The action --to-deb takes exactly one argument." - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - print convert_moz_to_debian_version(args[0], 0, verbose) - elif action == "to-moz": - if len(args) != 1: - if not silent: - print >> sys.stderr, "E: The action --to-moz takes exactly one argument." - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - print convert_debian_to_moz_version(args[0], verbose) + main() diff --git a/src/moz_version.py b/src/moz_version.py index 24c4680..b65f678 100644 --- a/src/moz_version.py +++ b/src/moz_version.py @@ -23,143 +23,145 @@ import sys def decode_part(part): - """Decodes a version part (like 5pre4) to <number-a><string-b><number-c><string-d>""" - subpart = [0,"",0,""] - - # Split <number-a> - length = 0 - for i in xrange(len(part)): - if part[i].isdigit() or part[i] in ("-"): - length += 1 - else: - break - if length > 0: - subpart[0] = int(part[0:length]) - part = part[length:] - - # Split <string-b> - length = 0 - for i in xrange(len(part)): - if not (part[i].isdigit() or part[i] in ("-")): - length += 1 - else: - break - subpart[1] = part[0:length] - part = part[length:] - - # Split <number-c> - length = 0 - for i in xrange(len(part)): - if part[i].isdigit() or part[i] in ("-"): - length += 1 - else: - break - if length > 0: - subpart[2] = int(part[0:length]) - subpart[3] = part[length:] - - # if string-b is a plus sign, number-a is incremented to be compatible with - # the Firefox 1.0.x version format: 1.0+ is the same as 1.1pre - if subpart[1] == "+": - subpart[0] += 1 - subpart[1] = "pre" - - # if the version part is a single asterisk, it is interpreted as an - # infinitely-large number: 1.5.0.* is the same as 1.5.0.(infinity) - if subpart[1] == "*": - subpart[0] = sys.maxint - subpart[1] = "" - - return subpart + """Decodes a version part (like 5pre4) to + <number-a><string-b><number-c><string-d>""" + subpart = [0, "", 0, ""] + + # Split <number-a> + length = 0 + for i in xrange(len(part)): + if part[i].isdigit() or part[i] in ("-"): + length += 1 + else: + break + if length > 0: + subpart[0] = int(part[0:length]) + part = part[length:] + + # Split <string-b> + length = 0 + for i in xrange(len(part)): + if not (part[i].isdigit() or part[i] in ("-")): + length += 1 + else: + break + subpart[1] = part[0:length] + part = part[length:] + + # Split <number-c> + length = 0 + for i in xrange(len(part)): + if part[i].isdigit() or part[i] in ("-"): + length += 1 + else: + break + if length > 0: + subpart[2] = int(part[0:length]) + subpart[3] = part[length:] + + # if string-b is a plus sign, number-a is incremented to be compatible with + # the Firefox 1.0.x version format: 1.0+ is the same as 1.1pre + if subpart[1] == "+": + subpart[0] += 1 + subpart[1] = "pre" + + # if the version part is a single asterisk, it is interpreted as an + # infinitely-large number: 1.5.0.* is the same as 1.5.0.(infinity) + if subpart[1] == "*": + subpart[0] = sys.maxint + subpart[1] = "" + + return subpart def decode_version(version, verbose=False): - """Decodes a version string like 1.1pre1a""" - parts = version.split(".") - decoded_parts = map(decode_part, parts) - if verbose: - print "I: Split %s up into %s." % (version, decoded_parts) - return decoded_parts + """Decodes a version string like 1.1pre1a""" + parts = version.split(".") + decoded_parts = map(decode_part, parts) + if verbose: + print "I: Split %s up into %s." % (version, decoded_parts) + return decoded_parts def compare_subpart((a, b)): - # A string-part that exists is always less-then a nonexisting string-part - if a == "": - if b == "": - return 0 - else: - return 1 - elif b == "": - if a == "": - return 0 - else: - return -1 - else: - return cmp(a, b) + # A string-part that exists is always less-then a nonexisting string-part + if a == "": + if b == "": + return 0 + else: + return 1 + elif b == "": + if a == "": + return 0 + else: + return -1 + else: + return cmp(a, b) def compare_part((x, y)): - compared_subparts = filter(lambda x: x != 0, map(compare_subpart, zip(x, y))) - if compared_subparts: - return compared_subparts[0] - else: - return 0 + compared_subparts = filter(lambda x: x != 0, + map(compare_subpart, zip(x, y))) + if compared_subparts: + return compared_subparts[0] + else: + return 0 def compare_versions(version1, version2, verbose=False): - a = decode_version(version1, verbose) - b = decode_version(version2, verbose) + a = decode_version(version1, verbose) + b = decode_version(version2, verbose) - if len(a) < len(b): - a.extend((len(b) - len(a)) * [[0,"",0,""]]) - if len(b) < len(a): - b.extend((len(a) - len(b)) * [[0,"",0,""]]) + if len(a) < len(b): + a.extend((len(b) - len(a)) * [[0, "", 0, ""]]) + if len(b) < len(a): + b.extend((len(a) - len(b)) * [[0, "", 0, ""]]) - result = filter(lambda x: x != 0, map(compare_part, zip(a, b))) - if result: - return result[0] - else: - return 0 + result = filter(lambda x: x != 0, map(compare_part, zip(a, b))) + if result: + return result[0] + else: + return 0 def extract_upstream_version(debian_version): - # remove last part separated by a dash (1.0-2 -> 1.0) - parts = debian_version.split('-') - if len(parts) > 1: - del parts[-1] - upstream_version = '-'.join(parts) + # remove last part separated by a dash (1.0-2 -> 1.0) + parts = debian_version.split('-') + if len(parts) > 1: + del parts[-1] + upstream_version = '-'.join(parts) - # remove epoch - parts = upstream_version.split(':') - if len(parts) > 1: - del parts[0] - upstream_version = ':'.join(parts) + # remove epoch + parts = upstream_version.split(':') + if len(parts) > 1: + del parts[0] + upstream_version = ':'.join(parts) - return upstream_version + return upstream_version def convert_debian_to_moz_version(debian_version, verbose=False): - upstream_version = extract_upstream_version(debian_version) + upstream_version = extract_upstream_version(debian_version) - # compatibility: strip +nobinonly and +build - parts = upstream_version.split('+') - if len(parts) > 1 and parts[-1] == "nobinonly": - del parts[-1] - if len(parts) > 1 and parts[-1].startswith("build"): - del parts[-1] - upstream_version = '+'.join(parts) + # compatibility: strip +nobinonly and +build + parts = upstream_version.split('+') + if len(parts) > 1 and parts[-1] == "nobinonly": + del parts[-1] + if len(parts) > 1 and parts[-1].startswith("build"): + del parts[-1] + upstream_version = '+'.join(parts) - moz_version = upstream_version.replace("~", "") - return moz_version + moz_version = upstream_version.replace("~", "") + return moz_version def convert_moz_to_debian_version(moz_version, epoch=0, verbose=False): - parts = decode_version(moz_version, verbose) - # tranform parts - for i in xrange(len(parts)): - (number_a, string_b, number_c, string_d) = parts[i] - part = "" - if string_d != "": - part = "~" + string_d - if number_c != 0 or string_d != "": - part = str(number_c) + part - if string_b != "": - part = "~" + string_b + part - parts[i] = str(number_a) + part - debian_version = ".".join(parts) - if epoch != 0: - debian_version = str(epoch) + ":" + debian_version - return debian_version + parts = decode_version(moz_version, verbose) + # tranform parts + for i in xrange(len(parts)): + (number_a, string_b, number_c, string_d) = parts[i] + part = "" + if string_d != "": + part = "~" + string_d + if number_c != 0 or string_d != "": + part = str(number_c) + part + if string_b != "": + part = "~" + string_b + part + parts[i] = str(number_a) + part + debian_version = ".".join(parts) + if epoch != 0: + debian_version = str(epoch) + ":" + debian_version + return debian_version diff --git a/src/xpi-repack b/src/xpi-repack index fa8429b..0852dfc 100755 --- a/src/xpi-repack +++ b/src/xpi-repack @@ -29,50 +29,52 @@ import sys COMMAND_LINE_SYNTAX_ERROR = 1 def remove_recursive(path): - """equivalent to rm -rf path""" - if os.path.exists(path): - for i in os.listdir(path): - full_path = os.path.join(path, i) - if os.path.isdir(full_path): - remove_recursive(full_path) - else: - os.remove(full_path) - os.rmdir(path) - -def repack_xpi(script_name, package, upstream_version, xpi_file, verbose): - # extract xpi file - tmp_dir = "/tmp" - extract_dir = package + "-" + upstream_version - full_extract_dir = os.path.join(tmp_dir, extract_dir) - remove_recursive(full_extract_dir) - subprocess.check_call(["xpi-unpack", xpi_file, full_extract_dir]) - - # check, if source 3.0 (quilt) format is used - extension = ".gz" - if os.path.isfile("debian/source/format"): - source_format = open("debian/source/format").readline().strip() - if source_format == "3.0 (quilt)": - extension = ".bz2" - - # pack source - tar_file = package + "_" + upstream_version + ".orig.tar" - full_tar_file = os.path.realpath(os.path.join(os.path.dirname(xpi_file), tar_file)) - cmd = ["tar", "-ca", "-C", tmp_dir, "-f", full_tar_file + extension, extract_dir] - if verbose: - print " ".join(cmd) - subprocess.check_call(cmd) - - # remove temporary directory - remove_recursive(full_extract_dir) + """equivalent to rm -rf path""" + if os.path.exists(path): + for i in os.listdir(path): + full_path = os.path.join(path, i) + if os.path.isdir(full_path): + remove_recursive(full_path) + else: + os.remove(full_path) + os.rmdir(path) + +def repack_xpi(package, upstream_version, xpi_file, verbose): + # extract xpi file + tmp_dir = "/tmp" + extract_dir = package + "-" + upstream_version + full_extract_dir = os.path.join(tmp_dir, extract_dir) + remove_recursive(full_extract_dir) + subprocess.check_call(["xpi-unpack", xpi_file, full_extract_dir]) + + # check, if source 3.0 (quilt) format is used + extension = ".gz" + if os.path.isfile("debian/source/format"): + source_format = open("debian/source/format").readline().strip() + if source_format == "3.0 (quilt)": + extension = ".bz2" + + # pack source + tar_file = package + "_" + upstream_version + ".orig.tar" + full_tar_file = os.path.realpath(os.path.join(os.path.dirname(xpi_file), + tar_file)) + cmd = ["tar", "-ca", "-C", tmp_dir, "-f", full_tar_file + extension, + extract_dir] + if verbose: + print " ".join(cmd) + subprocess.check_call(cmd) + + # remove temporary directory + remove_recursive(full_extract_dir) def get_source_package_name(): - lines = open("debian/control").readlines() - package_lines = filter(lambda x: x.find("Source:") >= 0, lines) - packages = map(lambda x: x[x.find(":")+1:].strip(), package_lines) - return packages[0] + lines = open("debian/control").readlines() + package_lines = filter(lambda x: x.find("Source:") >= 0, lines) + packages = map(lambda x: x[x.find(":")+1:].strip(), package_lines) + return packages[0] def usage(output): - print >> output, """Usage: %s [options] <xpi-file> + print >> output, """Usage: %s [options] <xpi-file> Options: -p, --package=<value> specify source package name @@ -82,45 +84,50 @@ General options: -h, --help display this help and exit -v, --verbose print more information -See %s(1) for more info.""" % (os.path.basename(sys.argv[0]), os.path.basename(sys.argv[0])) +See %s(1) for more info.""" % (os.path.basename(sys.argv[0]), + os.path.basename(sys.argv[0])) + +def main(): + try: + long_opts = ["help", "package=", "upstream-version=", "verbose"] + opts, args = getopt.gnu_getopt(sys.argv[1:], "hp:u:v", long_opts) + except getopt.GetoptError, e: + # will print something like "option -a not recognized" + print >> sys.stderr, str(e) + usage(sys.stderr) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + + package = None + upstream_version = None + verbose = False + + for o, a in opts: + if o in ("-h", "--help"): + usage(sys.stdout) + sys.exit() + elif o in ("-u", "--upstream-version"): + upstream_version = a + elif o in ("-p", "--package"): + package = a + elif o in ("-v", "--verbose"): + verbose = True + else: + assert False, "unhandled option" + + if package is None: + package = get_source_package_name() + + script_name = os.path.basename(sys.argv[0]) + + if len(args) == 0: + print >> sys.stderr, "%s: Error: No xpi file specified." % (script_name) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + elif len(args) > 1: + print >> sys.stderr, script_name + ": Error: Multiple xpi files " + \ + "specified: " + ", ".join(args) + sys.exit(COMMAND_LINE_SYNTAX_ERROR) + + repack_xpi(package, upstream_version, args[0], verbose) if __name__ == "__main__": - try: - long_opts = ["help", "package=", "upstream-version=", "verbose"] - opts, args = getopt.gnu_getopt(sys.argv[1:], "hp:u:v", long_opts) - except getopt.GetoptError, e: - # will print something like "option -a not recognized" - print >> sys.stderr, str(e) - usage(sys.stderr) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - - package = None - upstream_version = None - verbose = False - - for o, a in opts: - if o in ("-h", "--help"): - usage(sys.stdout) - sys.exit() - elif o in ("-u", "--upstream-version"): - upstream_version = a - elif o in ("-p", "--package"): - package = a - elif o in ("-v", "--verbose"): - verbose = True - else: - assert False, "unhandled option" - - if package is None: - package = get_source_package_name() - - script_name = os.path.basename(sys.argv[0]) - - if len(args) == 0: - print >> sys.stderr, "%s: Error: No xpi file specified." % (script_name) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - elif len(args) > 1: - print >> sys.stderr, script_name + ": Error: Multiple xpi files specified: " + ", ".join(args) - sys.exit(COMMAND_LINE_SYNTAX_ERROR) - - repack_xpi(script_name, package, upstream_version, args[0], verbose) + main() |