Package: python-central
Version: 0.6.8
Severity: normal
Tags: patch

I have added support for reporting pycentral-managed files to cruft.

This incidentaly adds two commands to pycentral: pkglist and list.

-- System Information:
Debian Release: lenny/sid
  APT prefers hardy-updates
  APT policy: (500, 'hardy-updates'), (500, 'hardy-security'), (500, 
'hardy-proposed'), (500, 'hardy-backports'), (500, 'hardy')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.24-20-generic (SMP w/1 CPU core)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages python-central depends on:
ii  python                    2.5.2-0ubuntu1 An interactive high-level object-o

python-central recommends no packages.

-- no debconf information
>From c4d70217dd90c628e59422c59b50c9d47c28e0ef Mon Sep 17 00:00:00 2001
From: Gabriel de Perthuis <[EMAIL PROTECTED]>
Date: Wed, 6 Aug 2008 18:01:54 +0200
Subject: [PATCH] Add pkglist command, to list pycentral-managed files for a specific package.

---
 pycentral.1  |    3 ++
 pycentral.py |   73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/pycentral.1 b/pycentral.1
index 36088c2..216b7d7 100644
--- a/pycentral.1
+++ b/pycentral.1
@@ -37,6 +37,9 @@ Prepare a package for all supported runtimes.
 .I pkgremove
 Remove a package installed for all supported runtimes.
 .TP
+.I pkglist
+List pycentral-managed files of a package for all supported runtimes.
+.TP
 .I rtinstall
 Make installed packages available for this runtime.
 .TP
diff --git a/pycentral.py b/pycentral.py
index c10c587..6ddb610 100755
--- a/pycentral.py
+++ b/pycentral.py
@@ -197,6 +197,13 @@ class PythonRuntime:
         if errors:
             raise PyCentralError, 'error removing the byte-code files'
 
+    def list_byte_code(self, files):
+        logging.debug('\tremove byte-code files (%d)' % (len(files)))
+        for ext in ('c', 'o'):
+            for fn in files:
+                fnc = fn + ext
+		yield fnc
+
 installed_runtimes = None
 default_runtime = None
 
@@ -869,6 +876,15 @@ class DebPackage:
                 if os.path.exists(fn2):
                     os.unlink(fn2)
 
+    def list_shared_files(self, rt):
+        logging.debug('\tlist_shared_files %s/%s' % (rt.name, self.name))
+        if not self.shared_files:
+            return
+        ppos = len(self.shared_prefix)
+        for fn in self.shared_files:
+            fn2 = rt.prefix + fn[ppos:]
+	    yield fn2
+
 
     def install(self, runtimes, bc_option, exclude_regex,
                 byte_compile_default=True, ignore_errors=False):
@@ -1074,6 +1090,32 @@ class DebPackage:
             if self.private_files:
                 default_runtime.remove_byte_code(self.private_files)
 
+    def list(self, runtimes, list_script_files=True):
+        logging.debug('\tlist package %s' % self.name)
+        # list shared .py files
+        if self.shared_files:
+            ppos = len(self.shared_prefix)
+            for rt in runtimes:
+                linked_files = [ rt.prefix + fn[ppos:]
+                                 for fn in self.shared_files
+                                 if fn[-3:] == '.py']
+		for f in default_runtime.list_byte_code(linked_files):
+		    yield f
+		for f in self.list_shared_files(rt):
+		    yield f
+        # list byte compiled files inside prefix
+        if self.pylib_files:
+            for pyver, files in self.pylib_files.items():
+                rt = get_runtime_for_version(pyver)
+                if rt in runtimes:
+		    for f in default_runtime.list_byte_code(files):
+			yield f
+        # list byte code for script files
+        if list_script_files:
+            if self.private_files:
+		for f in default_runtime.list_byte_code(self.private_files):
+		    yield f
+
     def update_bytecode_files(self, runtimes, rt_default, bc_option):
         # byte-compile with default python version
         logging.debug('\tupdate byte-code for %s' % self.name)
@@ -1414,6 +1456,37 @@ class ActionPkgRemove(Action):
 
 register_action(ActionPkgRemove)
 
+class ActionPkgList(Action):
+    name = 'pkglist'
+    help = 'list all pycentral-managed files for <package>'
+    usage = '<package>'
+
+    def check_args(self, global_options):
+        if len(self.args) != 1:
+            self._option_parser.print_help()
+            sys.exit(1)
+        self.pkgname = self.args[0]
+        if not os.path.exists('/var/lib/dpkg/info/%s.list' % self.pkgname):
+            self.error("package %s is not installed" % self.pkgname)
+        return self.errors_occured
+
+    def run(self, global_options):
+        runtimes = get_installed_runtimes(with_unsupported=True)
+        pkg = DebPackage('package', self.args[0], oldstyle=False)
+        pkg.read_version_info()
+        try:
+            pkg.set_default_runtime_from_version_info()
+        except ValueError:
+            # original runtime may be removed, use the default
+            pkg.default_runtime = get_default_runtime()
+        try:
+	    for f in pkg.list(runtimes, list_script_files=True):
+		print f
+        except PyCentralError, msg:
+            self.error(msg)
+
+register_action(ActionPkgList)
+
 
 class ActionRuntimeInstall(Action):
     name = 'rtinstall'
-- 
1.6.0.rc1.64.g61192

>From 40d63992837c30378de9620941c969add3be1e0e Mon Sep 17 00:00:00 2001
From: Gabriel de Perthuis <[EMAIL PROTECTED]>
Date: Wed, 6 Aug 2008 18:20:33 +0200
Subject: [PATCH] Add 'list' action.

---
 pycentral.1  |    3 +++
 pycentral.py |   21 +++++++++++++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/pycentral.1 b/pycentral.1
index 216b7d7..9f825d9 100644
--- a/pycentral.1
+++ b/pycentral.1
@@ -28,6 +28,9 @@ Byte compile .py files in a package.
 .I bcremove
 Remove the byte compiled .py files.
 .TP
+.I list
+List all managed files.
+.TP
 .I pkginstall
 Make a package available for all supported runtimes.
 .TP
diff --git a/pycentral.py b/pycentral.py
index 6ddb610..a1a63aa 100755
--- a/pycentral.py
+++ b/pycentral.py
@@ -1666,6 +1666,27 @@ class ActionUpdateDefault(Action):
 register_action(ActionUpdateDefault)
 
 
+class ActionList(Action):
+    name = 'list'
+    help = 'List all pycentral-managed files'
+
+    def check_args(self, global_options):
+        if len(self.args) != 0:
+            self._option_parser.print_help()
+            sys.exit(1)
+        return self.errors_occured
+
+    def run(self, global_options):
+        runtimes = get_installed_runtimes(with_unsupported=True)
+       for (p, v) in read_dpkg_status():
+           pkg = DebPackage('package', p)
+           pkg.read_version_info()
+           for f in pkg.list(runtimes, list_script_files=True):
+               print f
+
+register_action(ActionList)
+
+
 class ActionShowDefault(Action):
     name = 'showdefault'
     help = 'Show default python version number'
-- 
1.6.0.rc1.64.g61192

>From ce217de42b52d7f85ad5ecd9d10fa808b4a6fef4 Mon Sep 17 00:00:00 2001
From: Gabriel de Perthuis <[EMAIL PROTECTED]>
Date: Wed, 6 Aug 2008 18:39:41 +0200
Subject: [PATCH] Add a cruft explain script.

Cruft will pick up this script automatically.
The script tells cruft that pycentral-managed files
have a valid reason for being on the system.
---
 debian/dirs            |    1 +
 debian/rules           |    2 ++
 python-central.explain |    2 ++
 3 files changed, 5 insertions(+), 0 deletions(-)
 create mode 100755 python-central.explain

diff --git a/debian/dirs b/debian/dirs
index 891bf2f..2d3cebc 100644
--- a/debian/dirs
+++ b/debian/dirs
@@ -1,4 +1,5 @@
 usr/bin
+usr/lib/cruft/explain
 usr/share/pycentral-data
 usr/share/debhelper/autoscripts
 usr/share/python/runtime.d
diff --git a/debian/rules b/debian/rules
index abf54ef..3730124 100755
--- a/debian/rules
+++ b/debian/rules
@@ -39,6 +39,8 @@ install: build
                debian/$(PACKAGE)/usr/share/python/runtime.d/
        install -m644 python_central.pm \
                debian/$(PACKAGE)/usr/share/perl5/Debian/Debhelper/Sequence/
+       install -m755 python-central.explain \
+               debian/$(PACKAGE)/usr/lib/cruft/explain/python-central
 
 # Build architecture-independent files here.
 binary-indep: build install
diff --git a/python-central.explain b/python-central.explain
new file mode 100755
index 0000000..c62be42
--- /dev/null
+++ b/python-central.explain
@@ -0,0 +1,2 @@
+#!/bin/sh
+pycentral list >&3
-- 
1.6.0.rc1.64.g61192

Reply via email to