summaryrefslogtreecommitdiff
path: root/src/dh_xul-ext
diff options
context:
space:
mode:
Diffstat (limited to 'src/dh_xul-ext')
-rwxr-xr-xsrc/dh_xul-ext381
1 files changed, 0 insertions, 381 deletions
diff --git a/src/dh_xul-ext b/src/dh_xul-ext
deleted file mode 100755
index c7328de..0000000
--- a/src/dh_xul-ext
+++ /dev/null
@@ -1,381 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2009-2011, Benjamin Drung <bdrung@debian.org>
-#
-# Permission to use, copy, modify, and/or distribute this software for any
-# purpose with or without fee is hereby granted, provided that the above
-# copyright notice and this permission notice appear in all copies.
-#
-# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-# 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,
- moz_to_next_debian_version)
-
-import RDF
-
-_VENDOR_ENV = "DH_XUL_EXT_VENDOR"
-# error codes
-COMMAND_LINE_SYNTAX_ERROR = 1
-MULTIPLE_INSTALL_RDFS = 2
-
-class XulApp(object):
- def __init__(self, xul_id, package, sol, eol):
- self.xul_id = xul_id
- self.package = package
- self.sol = sol
- self.eol = eol
- self.min_version = None
- self.max_version = None
-
- def __str__(self):
- return self.xul_id + ": " + self.package + " (" + self.sol + " to " + \
- self.eol + ")"
-
- def get_breaks(self):
- """Return a string for ${xpi:Breaks} for the XUL application."""
- breaks = []
- if self.min_version:
- deb_min_version = convert_moz_to_debian_version(self.min_version)
- breaks.append(self.package + " (<< " + deb_min_version + ")")
- if self.max_version:
- deb_max_version = moz_to_next_debian_version(self.max_version)
- breaks.append(self.package + " (>= " + deb_max_version + ")")
- return ", ".join(breaks)
-
- def get_eol(self):
- return self.eol
-
- def get_id(self):
- return self.xul_id
-
- def get_package(self):
- return self.package
-
- def get_sol(self):
- return self.sol
-
- def get_versioned_package(self):
- versioned_package = self.package
- if self.min_version:
- deb_min_version = convert_moz_to_debian_version(self.min_version)
- versioned_package += " (>= " + deb_min_version + ")"
- return versioned_package
-
- def is_same_package(self, xul_app):
- return self.xul_id == xul_app.xul_id and self.package == xul_app.package
-
- def set_max_version(self, max_version):
- if compare_versions(self.eol, max_version) > 0:
- self.max_version = max_version
-
- def set_min_version(self, min_version):
- if compare_versions(self.sol, min_version) < 0:
- self.min_version = min_version
-
- def update_version(self, sol, eol):
- if compare_versions(self.sol, sol) > 0:
- self.sol = sol
- if compare_versions(self.eol, eol) < 0:
- self.eol = eol
-
-
-def _get_data_dir():
- """Get the data directory based on the module location."""
- if __file__.startswith("/usr/bin"):
- data_dir = "/usr/share/mozilla-devscripts"
- else:
- data_dir = os.path.dirname(__file__)
- return data_dir
-
-def get_vendor():
- """This function returns the vendor (e.g. Debian, Ubuntu) that should be
- used for calculating the dependencies. DH_XUL_EXT_VENDOR will be used
- if set. Otherwise dpkg-vendor will be used for determining the vendor."""
- if _VENDOR_ENV in os.environ:
- vendor = os.environ[_VENDOR_ENV]
- else:
- cmd = ["dpkg-vendor", "--query", "Vendor"]
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- vendor = process.communicate()[0].strip()
- return vendor
-
-def get_xul_apps(script_name, all_distros):
- vendor = get_vendor()
- data_dir = _get_data_dir()
- if all_distros or vendor == "all":
- csv_filenames = sorted(glob.glob(os.path.join(data_dir,
- "xul-app-data.csv.*")))
- else:
- csv_filename = os.path.join(data_dir, "xul-app-data.csv." + vendor)
- if not os.path.isfile(csv_filename):
- print >> sys.stderr, ('%s: Unknown vendor "%s" specified.' %
- (script_name, vendor))
- sys.exit(1)
- csv_filenames = [csv_filename]
-
- xul_apps = []
- for csv_filename in csv_filenames:
- csvfile = open(csv_filename)
- csv_reader = csv.DictReader(csvfile)
- for row in csv_reader:
- xul_app = XulApp(row["id"], row["package"], row["sol"], row["eol"])
- existing = [x for x in xul_apps if x.is_same_package(xul_app)]
- if existing:
- xul_app = existing[0]
- xul_app.update_version(row["sol"], row["eol"])
- else:
- xul_apps.append(xul_app)
-
- return xul_apps
-
-def _get_id_max_min_triple(install_rdf):
- """create array of id_max_min triples"""
- id_max_min = []
- model = RDF.Model()
- parser = RDF.Parser(name="rdfxml")
- parser.parse_into_model(model, "file:" + install_rdf)
- query = RDF.Query(
- """
- PREFIX em: <http://www.mozilla.org/2004/em-rdf#>
- SELECT ?id ?max ?min
- WHERE {
- ?x1 em:targetApplication ?x2 .
- ?x2 em:id ?id .
- OPTIONAL {
- ?x2 em:maxVersion ?max .
- ?x2 em:minVersion ?min .
- } .
- }
- """, query_language="sparql")
- results = query.execute(model)
- # append to id_max_min tripe to array
- for target in results:
- id_max_min.append ((target["id"].literal_value["string"],
- target["max"].literal_value["string"],
- target["min"].literal_value["string"]))
- return id_max_min
-
-def get_supported_apps(script_name, xul_apps, install_rdf, package,
- verbose=False):
- id_max_min = _get_id_max_min_triple(install_rdf)
- if verbose:
- print "%s: %s supports %i XUL application(s):" % (script_name, package,
- len(id_max_min))
- for (appid, max_version, min_version) in id_max_min:
- print "%s %s to %s" % (appid, min_version, max_version)
-
- # find supported apps/packages
- supported_apps = list()
- for xul_app in xul_apps:
- supported_app = [x for x in id_max_min if x[0] == xul_app.get_id()]
- if len(supported_app) == 1:
- # package is supported by extension
- (appid, max_version, min_version) = supported_app.pop()
- if compare_versions(xul_app.get_sol(), max_version) <= 0:
- if compare_versions(xul_app.get_eol(), min_version) >= 0:
- xul_app.set_min_version(min_version)
- xul_app.set_max_version(max_version)
- supported_apps.append(xul_app)
- if verbose:
- print "%s: %s supports %s." % (script_name, package,
- xul_app.get_package())
- elif verbose:
- print "%s: %s does not support %s (any more)." % \
- (script_name, package, xul_app.get_package())
- elif verbose:
- print "%s: %s does not support %s (yet)." % \
- (script_name, package, xul_app.get_package())
- elif len(supported_app) > 1:
- print ("%s: Found error in %s. There are multiple entries for "
- "application ID %s.") % (script_name, install_rdf,
- xul_app.get_id())
-
- return supported_apps
-
-def get_all_packages():
- lines = open("debian/control").readlines()
- package_lines = [x for x in lines if x.find("Package:") >= 0]
- packages = [p[p.find(":")+1:].strip() for p in package_lines]
- return packages
-
-def get_source_package_name():
- source = None
- control_file = open("debian/control")
- for line in control_file:
- if line.startswith("Source:"):
- source = line[line.find(":")+1:].strip()
- break
- return source
-
-def has_no_xpi_depends():
- lines = open("debian/control").readlines()
- xpi_depends_lines = [l for l in lines if l.find("${xpi:Depends}") >= 0]
- return len(xpi_depends_lines) == 0
-
-def get_provided_package_names(package, supported_apps):
- ext_name = package
- for prefix in ("firefox-", "iceweasel-", "mozilla-", "xul-ext-"):
- if ext_name.startswith(prefix):
- ext_name = ext_name[len(prefix):]
-
- # check if MOZ_XPI_EXT_NAME is defined in debian/rules
- lines = open("debian/rules").readlines()
- lines = [l for l in lines if l.find("MOZ_XPI_EXT_NAME") != -1]
- if len(lines) > 0:
- line = lines[-1]
- ext_name = line[line.find("=")+1:].strip()
-
- provides = set()
- provides.add("xul-ext-" + ext_name)
- if ext_name == get_source_package_name():
- provides.add(ext_name)
-
- for xul_app in supported_apps:
- app = xul_app.get_package()
- for i in xrange(len(app) - 1, -1, -1):
- if app[i] == '-':
- app = app[:i]
- elif not app[i].isdigit() and not app[i] == '.':
- break
- provides.add(app + "-" + ext_name)
-
- # remove package name from provide list
- provides.discard(package)
-
- return list(provides)
-
-def find_install_rdfs(path):
- install_rdfs = set()
-
- if os.path.isfile(path) and os.path.basename(path) == "install.rdf":
- install_rdfs.add(os.path.realpath(path))
-
- if os.path.isdir(path):
- # recursive walk
- content = [os.path.join(path, d) for d in os.listdir(path)]
- install_rdfs = reduce(lambda x, d: x.union(find_install_rdfs(d)),
- content, install_rdfs)
-
- return install_rdfs
-
-def generate_substvars(script_name, xul_apps, package, verbose=False):
- install_rdfs = find_install_rdfs("debian/" + package)
- if len(install_rdfs) == 0:
- if verbose:
- print script_name + ": " + package + \
- " does not contain a XUL extension (no install.rdf found)."
- return
- elif len(install_rdfs) > 1:
- print >> sys.stderr, ("%s: %s contains multiple install.rdf files. "
- "That's not supported.") % (script_name, package)
- basepath_len = len(os.path.realpath("debian/" + package))
- rdfs = [x[basepath_len:] for x in install_rdfs]
- print >> sys.stderr, "\n".join(rdfs)
- sys.exit(MULTIPLE_INSTALL_RDFS)
- install_rdf = install_rdfs.pop()
-
- filename = "debian/" + package + ".substvars"
- if os.path.exists(filename):
- substvars_file = open(filename)
- lines = substvars_file.readlines()
- substvars_file.close()
- else:
- lines = list()
-
- # remove existing varibles
- lines = [s for s in lines if not s.startswith("xpi:")]
-
- supported_apps = get_supported_apps(script_name, xul_apps, install_rdf,
- package, verbose)
- packages = [a.get_versioned_package() for a in supported_apps]
- if has_no_xpi_depends():
- # Use xpi:Recommends instead of xpi:Depends for backwards compatibility
- print ("%s: Warning: Please add ${xpi:Depends} to Depends. Using only "
- "${xpi:Recommends} is deprecated.") % (script_name)
- lines.append("xpi:Recommends=" + " | ".join(packages) + "\n")
- else:
- lines.append("xpi:Depends=" + " | ".join(packages) + "\n")
- lines.append("xpi:Recommends=\n")
- packages = [a.get_breaks() for a in supported_apps]
- lines.append("xpi:Breaks=" + ", ".join(sorted(packages)) + "\n")
- packages = [a.get_package() for a in supported_apps]
- lines.append("xpi:Enhances=" + ", ".join(sorted(packages)) + "\n")
- packages = get_provided_package_names(package, supported_apps)
- lines.append("xpi:Provides=" + ", ".join(sorted(packages)) + "\n")
-
- # write new variables
- substvars_file = open(filename, "w")
- substvars_file.writelines(lines)
- substvars_file.close()
-
-
-class UnknownOptionIgnoringOptionParser(optparse.OptionParser):
- def __init__ (self, **options):
- optparse.OptionParser.__init__(self, **options)
- self.unknown_options = []
-
- def _process_long_opt(self, rargs, values):
- option = rargs[0].split("=")[0]
- if not option in self._long_opt:
- self.unknown_options.append(option)
- del rargs[0]
- else:
- optparse.OptionParser._process_long_opt(self, rargs, values)
-
- def _process_short_opts(self, rargs, values):
- option = rargs[0][0:2]
- if not self._short_opt.get(option):
- self.unknown_options.append(option)
- del rargs[0]
- else:
- optparse.OptionParser._process_short_opts(self, rargs, values)
-
-
-def main():
- script_name = os.path.basename(sys.argv[0])
- epilog = "See %s(1) for more info." % (script_name)
- parser = UnknownOptionIgnoringOptionParser(epilog=epilog)
- parser.add_option("-a", "--all", action="store_true", dest="all",
- help="expand substvars to all known XUL applications "
- "(not only of your distribution)", default=False)
- parser.add_option("-p", "--package", dest="packages", metavar="PACKAGE",
- action="append", default=[],
- help="calculate substvars only for the specified PACKAGE")
- parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
- default=False, help="print more information")
-
- options = parser.parse_args()[0]
-
- if len(options.packages) == 0:
- options.packages = get_all_packages()
-
- if options.verbose:
- for unknown_option in parser.unknown_options:
- sys.stderr.write("%s: warning: no such option: %s\n" % \
- (script_name, unknown_option))
- print script_name + ": packages:", ", ".join(options.packages)
-
- xul_apps = get_xul_apps(script_name, options.all)
- if options.verbose and len(xul_apps) > 0:
- print script_name + ": found %i Xul applications:" % (len(xul_apps))
- for xul_app in xul_apps:
- print xul_app
-
- for package in options.packages:
- generate_substvars(script_name, xul_apps, package, options.verbose)
-
-if __name__ == "__main__":
- main()