|
@@ -0,0 +1,165 @@
|
|
|
+#!/usr/bin/python
|
|
|
+
|
|
|
+# This script generates a report on the packaging status of X.org
|
|
|
+# releases in Buildroot. It does so by downloading the list of
|
|
|
+# tarballs that are part of a given X.org release, and compare that
|
|
|
+# with the packages that are available in Buildroot.
|
|
|
+
|
|
|
+import BeautifulSoup
|
|
|
+import re
|
|
|
+import os
|
|
|
+import urllib
|
|
|
+
|
|
|
+# This can be customized
|
|
|
+XORG_VERSION = "X11R7.7"
|
|
|
+
|
|
|
+# Key names in dictionaries
|
|
|
+XORG_VERSION_KEY = "xorg-version"
|
|
|
+BR_VERSION_KEY = "br-version"
|
|
|
+BR_NAME_KEY = "br-name"
|
|
|
+
|
|
|
+# Get the list of tarballs of a X.org release, parse it, and return a
|
|
|
+# dictionary of dictionaries, of the form:
|
|
|
+#
|
|
|
+# { <name_of_package> : { XORG_VERSION_KEY: <version_of_package> },
|
|
|
+# <name_of_package2> : { XORG_VERSION_KEY: <version_of_package2> }}
|
|
|
+#
|
|
|
+def get_xorg_release_pkgs():
|
|
|
+ u = urllib.URLopener().open("http://www.x.org/releases/%s/src/everything/" % XORG_VERSION)
|
|
|
+ b = BeautifulSoup.BeautifulSoup()
|
|
|
+ b.feed(u.read())
|
|
|
+ links = b.findAll("a")
|
|
|
+ packages = {}
|
|
|
+ r = re.compile("(.*)-([0-9\.]*).tar.bz2")
|
|
|
+ # We now have a list of all links.
|
|
|
+ for link in links:
|
|
|
+ href = link.get("href")
|
|
|
+ # Skip everything but tarballs
|
|
|
+ if not href.endswith(".tar.bz2"):
|
|
|
+ continue
|
|
|
+ # Separate the name and the version
|
|
|
+ groups = r.match(href)
|
|
|
+ if not groups:
|
|
|
+ continue
|
|
|
+ name = groups.group(1)
|
|
|
+ version = groups.group(2)
|
|
|
+ packages[name] = { XORG_VERSION_KEY : version }
|
|
|
+ return packages
|
|
|
+
|
|
|
+# Files and directories in package/x11r7/ that should be ignored in
|
|
|
+# our processing.
|
|
|
+BUILDROOT_EXCEPTIONS = [
|
|
|
+ "mcookie", # Code is directly in package directory
|
|
|
+ "x11r7.mk",
|
|
|
+ "Config.in",
|
|
|
+ "xdriver_xf86-input-tslib", # From Pengutronix, not part of X.org releases
|
|
|
+]
|
|
|
+
|
|
|
+# Prefixes of directories in package/x11r7/ that must be stripped
|
|
|
+# before trying to match Buildroot package names with X.org tarball
|
|
|
+# names.
|
|
|
+BUILDROOT_PREFIXES = [
|
|
|
+ "xapp",
|
|
|
+ "xdriver",
|
|
|
+ "xfont",
|
|
|
+ "xlib",
|
|
|
+ "xserver",
|
|
|
+ "xutil",
|
|
|
+ "xproto",
|
|
|
+]
|
|
|
+
|
|
|
+# From a Buildroot package name, try to see if a prefix should be
|
|
|
+# stripped from it. For example, passing "xapp_xlsfonts" as argument
|
|
|
+# to this function will return "xlsfonts".
|
|
|
+def buildroot_strip_prefix(dirname):
|
|
|
+ for prefix in BUILDROOT_PREFIXES:
|
|
|
+ if dirname.startswith(prefix + "_"):
|
|
|
+ return dirname[len(prefix) + 1:]
|
|
|
+ return dirname
|
|
|
+
|
|
|
+# From a Buildroot package name, parse its .mk file to find the
|
|
|
+# Buildroot version of the package by looking at the <foo>_VERSION
|
|
|
+# line.
|
|
|
+def buildroot_get_version(dirname):
|
|
|
+ f = open(os.path.join("package", "x11r7", dirname, dirname + ".mk"))
|
|
|
+ r = re.compile("^([A-Z0-9_]*)_VERSION = ([0-9\.]*)$")
|
|
|
+ for l in f.readlines():
|
|
|
+ m = r.match(l)
|
|
|
+ if m:
|
|
|
+ return m.group(2)
|
|
|
+ return None
|
|
|
+
|
|
|
+# Augment the informations of the X.org list of packages (given as
|
|
|
+# argument) by details about their packaging in Buildroot. Those
|
|
|
+# details are found by looking at the contents of package/x11r7/.
|
|
|
+def get_buildroot_pkgs(packages):
|
|
|
+ dirs = os.listdir(os.path.join(os.getcwd(), "package", "x11r7"))
|
|
|
+ for d in dirs:
|
|
|
+ # Skip exceptions
|
|
|
+ if d in BUILDROOT_EXCEPTIONS:
|
|
|
+ continue
|
|
|
+ pkgname = buildroot_strip_prefix(d)
|
|
|
+ version = buildroot_get_version(d)
|
|
|
+ if packages.has_key(pkgname):
|
|
|
+ # There is a X.org package of the same name, so we just
|
|
|
+ # add informations to the existing dict entry.
|
|
|
+ packages[pkgname]['br-version'] = version
|
|
|
+ packages[pkgname]['br-name'] = d
|
|
|
+ else:
|
|
|
+ # There is no X.org package with this name, so we add a
|
|
|
+ # new dict entry.
|
|
|
+ packages[pkgname] = { BR_VERSION_KEY: version,
|
|
|
+ BR_NAME_KEY : d }
|
|
|
+ return packages
|
|
|
+
|
|
|
+def show_summary(packages):
|
|
|
+ FORMAT_STRING = "%40s | %15s | %15s | %-30s"
|
|
|
+ print FORMAT_STRING % ("Package name", "Vers in BR", "Vers in X.org", "Action")
|
|
|
+ print FORMAT_STRING % ("-" * 40, "-" * 15, "-" * 15, "-" * 30)
|
|
|
+ pkgs = packages.keys()
|
|
|
+ pkgs.sort()
|
|
|
+ total_pkgs = 0
|
|
|
+ upgrade_pkgs = 0
|
|
|
+ add_pkgs = 0
|
|
|
+ remove_pkgs = 0
|
|
|
+ nothing_todo_pkgs = 0
|
|
|
+ for pkgname in pkgs:
|
|
|
+ pkg = packages[pkgname]
|
|
|
+ total_pkgs += 1
|
|
|
+ if pkg.has_key(XORG_VERSION_KEY) and not pkg.has_key(BR_VERSION_KEY):
|
|
|
+ xorg_version = pkg[XORG_VERSION_KEY]
|
|
|
+ br_version = "N/A"
|
|
|
+ action = "Add to Buildroot"
|
|
|
+ add_pkgs += 1
|
|
|
+ elif not pkg.has_key(XORG_VERSION_KEY) and pkg.has_key(BR_VERSION_KEY):
|
|
|
+ br_version = pkg[BR_VERSION_KEY]
|
|
|
+ xorg_version = "N/A"
|
|
|
+ action = "Remove from Buildroot"
|
|
|
+ remove_pkgs += 1
|
|
|
+ # For now, we assume that if a package version is different,
|
|
|
+ # it's because an upgrade is needed.
|
|
|
+ elif pkg[XORG_VERSION_KEY] != pkg[BR_VERSION_KEY]:
|
|
|
+ br_version = pkg[BR_VERSION_KEY]
|
|
|
+ xorg_version = pkg[XORG_VERSION_KEY]
|
|
|
+ action = "Upgrade"
|
|
|
+ upgrade_pkgs += 1
|
|
|
+ else:
|
|
|
+ br_version = pkg[BR_VERSION_KEY]
|
|
|
+ xorg_version = pkg[XORG_VERSION_KEY]
|
|
|
+ action = "-"
|
|
|
+ nothing_todo_pkgs += 1
|
|
|
+
|
|
|
+ print FORMAT_STRING % (pkgname, br_version.center(15), xorg_version.center(15), action)
|
|
|
+ print FORMAT_STRING % ("-" * 40, "-" * 15, "-" * 15, "-" * 30)
|
|
|
+ STAT_FORMAT_STRING = "%40s : %3d"
|
|
|
+ print STAT_FORMAT_STRING % ("Total number of packages", total_pkgs)
|
|
|
+ print STAT_FORMAT_STRING % ("Packages to upgrade", upgrade_pkgs)
|
|
|
+ print STAT_FORMAT_STRING % ("Packages to add", add_pkgs)
|
|
|
+ print STAT_FORMAT_STRING % ("Packages to remove", remove_pkgs)
|
|
|
+ print STAT_FORMAT_STRING % ("Packages with nothing to do", nothing_todo_pkgs)
|
|
|
+
|
|
|
+packages = get_xorg_release_pkgs()
|
|
|
+packages = get_buildroot_pkgs(packages)
|
|
|
+# print packages
|
|
|
+show_summary(packages)
|
|
|
+
|