summarylogtreecommitdiffstats
path: root/get_latest_info.py
diff options
context:
space:
mode:
Diffstat (limited to 'get_latest_info.py')
-rwxr-xr-xget_latest_info.py99
1 files changed, 99 insertions, 0 deletions
diff --git a/get_latest_info.py b/get_latest_info.py
new file mode 100755
index 000000000000..6b0168e188f7
--- /dev/null
+++ b/get_latest_info.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+
+import requests
+import requests.exceptions
+import sys
+
+from argparse import ArgumentParser
+from xml.etree import ElementTree as ET
+
+
+def setup_argparser():
+ arg_parser = ArgumentParser(
+ description="Retrieve latest information for a Mozilla add-on. This "
+ "includes the latest version and the current download URL."
+ )
+
+ arg_parser.add_argument(
+ "-u",
+ "--url-prefix",
+ default="",
+ help="Optional string to prepend to URL before outputting it."
+ )
+ arg_parser.add_argument(
+ "-o",
+ "--os",
+ help="If given, fetch URL for the given operating system. Not "
+ "specifying this option fetches the first URL in the API response."
+ )
+ arg_parser.add_argument(
+ "-p",
+ "--pkgbuild",
+ action="store_true",
+ help="Output appropriate lines for a PKGBUILD."
+ )
+
+ arg_parser.add_argument(
+ "addon_id",
+ type=int,
+ help="ID of add-on to retrieve information for."
+ )
+
+ return arg_parser
+
+def get_latest_addon_info(addon_id, os):
+ resp = requests.get(
+ "https://services.addons.mozilla.org/api/1.5/addon/%d" % addon_id
+ )
+ resp.raise_for_status()
+
+ # Now we got the API response, so parse it.
+ parsed_resp = ET.fromstring(resp.text)
+
+ install_xpath = "install"
+ if os is not None:
+ install_xpath += "[@os='%s']" % os
+
+ version = parsed_resp.find("version")
+ install = parsed_resp.find(install_xpath)
+
+ # XXX: Quick and dirty: If the response does not contain
+ # the version tag, then we fail horribly here. Should be handled
+ # properly.
+ return version.text, install.text if install is not None else None
+
+
+parsed_args = setup_argparser().parse_args()
+
+try:
+ version, url = get_latest_addon_info(parsed_args.addon_id, parsed_args.os)
+except (requests.exceptions.RequestException, ET.ParseError) as e:
+ print(
+ "Could not retrieve latest information: %s" % e,
+ file=sys.stderr
+ )
+ sys.exit(2)
+
+if url is None:
+ print(
+ "No matching URL for OS `%s' found." % parsed_args.os,
+ file=sys.stderr
+ )
+ sys.exit(3)
+
+url = parsed_args.url_prefix + url
+
+if not parsed_args.pkgbuild:
+ print(
+ "VERSION=%s" % version
+ )
+ print(
+ "URL=%s" % url
+ )
+else:
+ print(
+ "pkgver='%s'" % version
+ )
+ print(
+ "source=('%s')" % url
+ )