| #!/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 |
| from distutils.version import LooseVersion |
| |
| # 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" |
| |
| # Packages part of X.org releases that we do not want to package in |
| # Buildroot (old drivers for hardware unlikely to be used in embedded |
| # contexts). |
| XORG_EXCEPTIONS = [ |
| 'xf86-video-suncg6', |
| 'xf86-video-sunffb', |
| ] |
| |
| # 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) |
| # Skip packages we don't want to hear about |
| if name in XORG_EXCEPTIONS: |
| continue |
| 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 information 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 information 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 |
| elif LooseVersion(pkg[XORG_VERSION_KEY]) > LooseVersion(pkg[BR_VERSION_KEY]): |
| br_version = pkg[BR_VERSION_KEY] |
| xorg_version = pkg[XORG_VERSION_KEY] |
| action = "Upgrade" |
| upgrade_pkgs += 1 |
| elif LooseVersion(pkg[XORG_VERSION_KEY]) < LooseVersion(pkg[BR_VERSION_KEY]): |
| br_version = pkg[BR_VERSION_KEY] |
| xorg_version = pkg[XORG_VERSION_KEY] |
| action = "More recent" |
| nothing_todo_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) |
| |