From aa664c798dc107a8ed4b5a061f3ee69f1b0e7fed Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Feb 04 2010 13:18:28 +0000 Subject: - extract provides for postscript printer drivers (#538101) --- diff --git a/rpm-4.8.0-psdriver.patch b/rpm-4.8.0-psdriver.patch new file mode 100644 index 0000000..e06929c --- /dev/null +++ b/rpm-4.8.0-psdriver.patch @@ -0,0 +1,364 @@ +diff -up rpm-4.8.0/build/rpmfc.c.postscriptdriver rpm-4.8.0/build/rpmfc.c +--- rpm-4.8.0/build/rpmfc.c.postscriptdriver 2010-02-04 12:00:09.802558577 +0000 ++++ rpm-4.8.0/build/rpmfc.c 2010-02-04 12:00:09.894684178 +0000 +@@ -489,6 +489,7 @@ static const struct rpmfcTokens_s const + { " font metrics", RPMFC_WHITE|RPMFC_INCLUDE }, + { " font", RPMFC_FONT|RPMFC_INCLUDE }, + { " Font", RPMFC_FONT|RPMFC_INCLUDE }, ++ { "PPD file", RPMFC_PSDRIVER|RPMFC_INCLUDE }, + + { " commands", RPMFC_SCRIPT|RPMFC_INCLUDE }, + { " script", RPMFC_SCRIPT|RPMFC_INCLUDE }, +@@ -1185,6 +1186,11 @@ exit: + #endif + } + ++static int rpmfcPSDRIVER(rpmfc fc) ++{ ++ return rpmfcHelper(fc, 'P', "psdriver"); ++} ++ + static int rpmfcMISC(rpmfc fc) + { + struct stat st; +@@ -1224,6 +1230,7 @@ static const struct rpmfcApplyTbl_s cons + RPMFC_PKGCONFIG|RPMFC_LIBTOOL) }, + { rpmfcMISC, RPMFC_FONT|RPMFC_TEXT }, + { rpmfcSYMLINK, RPMFC_SYMLINK }, ++ { rpmfcPSDRIVER, RPMFC_PSDRIVER }, + { NULL, 0 } + }; + +@@ -1260,6 +1267,10 @@ rpmRC rpmfcApply(rpmfc fc) + fc->fcolor->vals[fc->ix] |= RPMFC_PYTHON; + } + } ++ /* XXX HACK: get cups driver executables also recognized as psdrivers */ ++ if (strstr(fc->fn[fc->ix], "/usr/lib/cups/driver/")) { ++ fc->fcolor->vals[fc->ix] |= RPMFC_PSDRIVER; ++ } + + if (fc->fcolor->vals[fc->ix]) + for (fcat = rpmfcApplyTable; fcat->func != NULL; fcat++) { +@@ -1401,6 +1412,11 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t arg + else if (rpmFileHasSuffix(s, ".pc")) + ftype = "pkgconfig file"; + ++ /* XXX Make cups .drv's to appear as PPD's for now */ ++ else if (rpmFileHasSuffix(s, ".drv") && ++ strstr(s, "/usr/share/cups/drv")) ++ ftype = "PPD file"; ++ + /* XXX skip all files in /dev/ which are (or should be) %dev dummies. */ + else if (slen >= fc->brlen+sizeof("/dev/") && rstreqn(s+fc->brlen, "/dev/", sizeof("/dev/")-1)) + ftype = ""; +diff -up rpm-4.8.0/build/rpmfc.h.postscriptdriver rpm-4.8.0/build/rpmfc.h +--- rpm-4.8.0/build/rpmfc.h.postscriptdriver 2009-12-09 13:37:25.000000000 +0000 ++++ rpm-4.8.0/build/rpmfc.h 2010-02-04 12:00:09.894684178 +0000 +@@ -31,7 +31,8 @@ enum FCOLOR_e { + #define RPMFC_ELF (RPMFC_ELF32|RPMFC_ELF64|RPMFC_ELFMIPSN32) + /* (1 << 3) leaks into package headers, reserved */ + +- /* bits 4-6 unused */ ++ /* bits 4-5 unused */ ++ RPMFC_PSDRIVER = (1 << 6), + RPMFC_OCAML = (1 << 7), + RPMFC_PKGCONFIG = (1 << 8), + RPMFC_LIBTOOL = (1 << 9), +@@ -53,6 +54,7 @@ enum FCOLOR_e { + RPMFC_MANPAGE = (7 << 16), + RPMFC_TEXT = (8 << 16), + RPMFC_DOCUMENT = (9 << 16), ++ RPMFC_PPD = (10 << 16), + + RPMFC_ARCHIVE = (1 << 20), + RPMFC_COMPRESSED = (1 << 21), +diff -up rpm-4.8.0/macros.in.postscriptdriver rpm-4.8.0/macros.in +--- rpm-4.8.0/macros.in.postscriptdriver 2010-02-04 12:00:09.776559914 +0000 ++++ rpm-4.8.0/macros.in 2010-02-04 12:00:09.904559096 +0000 +@@ -504,6 +504,7 @@ print (t)\ + + %__fontconfig_provides %{_rpmconfigdir}/fontconfig.prov + %__desktop_provides %{_rpmconfigdir}/desktop-file.prov ++%__psdriver_provides %{_rpmconfigdir}/postscriptdriver.prov + + #============================================================================== + # ---- Database configuration macros. +diff -up rpm-4.8.0/scripts/Makefile.am.postscriptdriver rpm-4.8.0/scripts/Makefile.am +--- rpm-4.8.0/scripts/Makefile.am.postscriptdriver 2009-12-07 14:36:49.000000000 +0000 ++++ rpm-4.8.0/scripts/Makefile.am 2010-02-04 12:00:09.905560182 +0000 +@@ -20,7 +20,8 @@ EXTRA_DIST = \ + mono-find-requires mono-find-provides \ + ocaml-find-requires.sh ocaml-find-provides.sh \ + pkgconfigdeps.sh libtooldeps.sh \ +- fontconfig.prov desktop-file.prov ++ fontconfig.prov desktop-file.prov \ ++ postscriptdriver.prov + + rpmconfig_SCRIPTS = \ + brp-compress brp-python-bytecompile brp-java-gcjcompile \ +@@ -34,6 +35,7 @@ rpmconfig_SCRIPTS = \ + pkgconfigdeps.sh libtooldeps.sh \ + ocaml-find-requires.sh ocaml-find-provides.sh \ + fontconfig.prov desktop-file.prov \ ++ postscriptdriver.prov \ + rpmdb_loadcvt rpmdiff rpm2cpio.sh tcl.req tgpg + + rpmconfig_DATA = \ +diff -up rpm-4.8.0/scripts/Makefile.in.postscriptdriver rpm-4.8.0/scripts/Makefile.in +--- rpm-4.8.0/scripts/Makefile.in.postscriptdriver 2010-01-08 08:35:16.000000000 +0000 ++++ rpm-4.8.0/scripts/Makefile.in 2010-02-04 12:00:09.906559262 +0000 +@@ -317,7 +317,8 @@ EXTRA_DIST = brp-compress brp-python-byt + find-php-provides find-php-requires mono-find-requires \ + mono-find-provides ocaml-find-requires.sh \ + ocaml-find-provides.sh pkgconfigdeps.sh libtooldeps.sh \ +- fontconfig.prov desktop-file.prov macros.perl.in macros.php.in \ ++ fontconfig.prov desktop-file.prov postscriptdriver.prov \ ++ macros.perl.in macros.php.in \ + macros.python.in + rpmconfig_SCRIPTS = \ + brp-compress brp-python-bytecompile brp-java-gcjcompile \ +@@ -331,6 +332,7 @@ rpmconfig_SCRIPTS = \ + pkgconfigdeps.sh libtooldeps.sh \ + ocaml-find-requires.sh ocaml-find-provides.sh \ + fontconfig.prov desktop-file.prov \ ++ postscriptdriver.prov \ + rpmdb_loadcvt rpmdiff rpm2cpio.sh tcl.req tgpg + + rpmconfig_DATA = rpmdiff.cgi rpm.daily rpm.log rpm.xinetd macros.perl \ +diff -up rpm-4.8.0/scripts/postscriptdriver.prov.postscriptdriver rpm-4.8.0/scripts/postscriptdriver.prov +--- rpm-4.8.0/scripts/postscriptdriver.prov.postscriptdriver 2010-02-04 12:00:09.907559566 +0000 ++++ rpm-4.8.0/scripts/postscriptdriver.prov 2010-02-04 12:03:57.312559754 +0000 +@@ -0,0 +1,232 @@ ++#!/bin/bash ++shopt -s execfail ++exec -a "$0" python -- "$@" <(tail -n +4 -- "$0") || exit 0 # -*- python -*- ++ ++## Copyright (C) 2009, 2010 Red Hat, Inc. ++## Author: Tim Waugh ++ ++## This program is free software; you can redistribute it and/or modify ++## it under the terms of the GNU General Public License as published by ++## the Free Software Foundation; either version 2 of the License, or ++## (at your option) any later version. ++ ++## This program is distributed in the hope that it will be useful, ++## but WITHOUT ANY WARRANTY; without even the implied warranty of ++## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++## GNU General Public License for more details. ++ ++## You should have received a copy of the GNU General Public License ++## along with this program; if not, write to the Free Software ++## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++import sys ++ ++try: ++ import cups ++ CAN_EXAMINE_PPDS=True ++except: ++ CAN_EXAMINE_PPDS=False ++ ++from getopt import getopt ++import os ++import posix ++import re ++import shlex ++import signal ++import stat ++import subprocess ++import sys ++import tempfile ++ ++class TimedOut(Exception): ++ def __init__ (self): ++ Exception.__init__ (self, "Timed out") ++ ++class DeviceIDs: ++ def __init__ (self): ++ self.ids = dict() ++ ++ def get_dict (self): ++ return self.ids ++ ++ def get_tags (self): ++ ret = [] ++ for mfg, mdlset in self.ids.iteritems (): ++ mfgl = mfg.lower ().replace (" ", "_") ++ for mdl in mdlset: ++ mdll = mdl.lower ().replace (" ", "_") ++ ret.append ("postscriptdriver(%s;%s;)" % (mfgl, ++ mdll)) ++ ++ return ret ++ ++ def __add__ (self, other): ++ if isinstance(other, DeviceIDs): ++ for omfg, omdlset in other.ids.iteritems (): ++ try: ++ mdlset = self.ids[omfg] ++ except KeyError: ++ mdlset = set() ++ self.ids[omfg] = mdlset ++ ++ mdlset.update (omdlset) ++ ++ return self ++ ++ pieces = other.split (';') ++ mfg = mdl = None ++ for piece in pieces: ++ s = piece.split (":") ++ if len (s) != 2: ++ continue ++ key, value = s ++ key = key.upper () ++ if key in ["MFG", "MANUFACTURER"]: ++ mfg = value ++ elif key in ["MDL", "MODEL"]: ++ mdl = value ++ ++ if mfg and mdl: ++ try: ++ mdlset = self.ids[mfg] ++ except KeyError: ++ mdlset = set() ++ self.ids[mfg] = mdlset ++ ++ mdlset.add (mdl) ++ ++ return self ++ ++class Driver: ++ def __init__ (self): ++ self.ids = DeviceIDs() ++ ++ def list (self): ++ return self.ids ++ ++class PPDDriver(Driver): ++ def __init__ (self, pathname=None): ++ Driver.__init__ (self) ++ self.pathname = pathname ++ ++ def list (self): ++ if self.pathname != None: ++ self.examine_file (self.pathname) ++ ++ return Driver.list (self) ++ ++ def examine_file (self, path): ++ try: ++ ppd = cups.PPD (path) ++ except RuntimeError, e: ++ # Not a PPD file. Perhaps it's a drv file. ++ drv = DrvDriver (path) ++ self.ids += drv.list () ++ return ++ ++ attr = ppd.findAttr ('1284DeviceID') ++ if attr: ++ self.ids += attr.value ++ ++class DynamicDriver(Driver): ++ def __init__ (self, driver): ++ Driver.__init__ (self) ++ self.driver = driver ++ signal.signal (signal.SIGALRM, self._alarm) ++ ++ def _alarm (self, sig, stack): ++ raise TimedOut ++ ++ def list (self): ++ signal.alarm (60) ++ p = subprocess.Popen ([self.driver, "list"], ++ stdout=subprocess.PIPE, ++ stderr=subprocess.PIPE) ++ try: ++ (stdout, stderr) = p.communicate () ++ signal.alarm (0) ++ except TimedOut: ++ posix.kill (p.pid, signal.SIGKILL) ++ raise ++ ++ if stderr: ++ print >> sys.stderr, stderr ++ ++ ppds = [] ++ lines = stdout.split ('\n') ++ for line in lines: ++ l = shlex.split (line) ++ if len (l) < 5: ++ continue ++ self.ids += l[4] ++ ++ return Driver.list (self) ++ ++class DrvDriver(PPDDriver): ++ def __init__ (self, pathname): ++ PPDDriver.__init__ (self) ++ self.drv = pathname ++ ++ def _alarm (self, sig, stack): ++ raise TimedOut ++ ++ def list (self): ++ tmpdir = os.environ.get ("TMPDIR", "/tmp") + os.path.sep ++ outputdir = tempfile.mkdtemp (dir=tmpdir) ++ ++ argv = [ "ppdc", ++ "-d", outputdir, ++ "-I", "/usr/share/cups/ppdc", ++ self.drv ] ++ ++ signal.alarm (60) ++ p = subprocess.Popen (argv, ++ stdout=subprocess.PIPE, ++ stderr=subprocess.PIPE) ++ try: ++ (stdout, stderr) = p.communicate () ++ signal.alarm (0) ++ except TimedOut: ++ posix.kill (p.pid, signal.SIGKILL) ++ raise ++ ++ os.path.walk (outputdir, self.examine_directory, None) ++ os.rmdir (outputdir) ++ return Driver.list (self) ++ ++ def examine_directory (self, unused, dirname, fnames): ++ for fname in fnames: ++ path = dirname + os.path.sep + fname ++ self.examine_file (path) ++ os.unlink (path) ++ ++class TagBuilder: ++ def __init__ (self, filelist=None): ++ if filelist == None: ++ filelist = sys.stdin ++ ++ paths = map (lambda x: x.rstrip (), filelist.readlines ()) ++ self.ids = DeviceIDs () ++ ++ for path in paths: ++ if path.find ("/usr/lib/cups/driver/") != -1: ++ try: ++ self.ids += DynamicDriver (path).list () ++ except TimedOut: ++ pass ++ ++ if CAN_EXAMINE_PPDS: ++ for path in paths: ++ try: ++ self.ids += PPDDriver (path).list () ++ except TimedOut: ++ pass ++ ++ def get_tags (self): ++ return self.ids.get_tags () ++ ++if __name__ == "__main__": ++ builder = TagBuilder () ++ tags = builder.get_tags () ++ for tag in tags: ++ print tag diff --git a/rpm.spec b/rpm.spec index 5bb19cd..a268d69 100644 --- a/rpm.spec +++ b/rpm.spec @@ -21,7 +21,7 @@ Summary: The RPM package management system Name: rpm Version: %{rpmver} -Release: 5%{?dist} +Release: 6%{?dist} Group: System Environment/Base Url: http://www.rpm.org/ Source0: http://rpm.org/releases/testing/%{name}-%{srcver}.tar.bz2 @@ -35,6 +35,8 @@ Patch2: rpm-4.5.90-gstreamer-provides.patch # Fedora specspo is setup differently than what rpm expects, considering # this as Fedora-specific patch for now Patch3: rpm-4.7.90-fedora-specspo.patch +# Postscript driver provides extraction is Fedora specific for now +Patch4: rpm-4.8.0-psdriver.patch # Patches already in upstream Patch200: rpm-4.8.0-url-segfault.patch @@ -184,6 +186,7 @@ packages on a system. %patch1 -p1 -b .pkgconfig-path %patch2 -p1 -b .gstreamer-prov %patch3 -p1 -b .fedora-specspo +%patch4 -p1 -b .psdriver %patch200 -p1 -b .url-segfault %patch201 -p1 -b .verify-exitcode @@ -374,6 +377,7 @@ exit 0 %{rpmhome}/rpmdiff* %{rpmhome}/desktop-file.prov %{rpmhome}/fontconfig.prov +%{rpmhome}/postscriptdriver.prov %{rpmhome}/macros.perl %{rpmhome}/macros.python @@ -404,6 +408,9 @@ exit 0 %doc doc/librpm/html/* %changelog +* Thu Feb 04 2010 Panu Matilainen - 4.8.0-6 +- extract provides for postscript printer drivers (#538101) + * Wed Feb 03 2010 Panu Matilainen - 4.8.0-5 - python byte-compilation fixes + improvements (#558997)