--- Registry.php	2007-05-28 22:35:44.000000000 +0200
+++ Registry_list.php	2007-05-28 22:45:03.000000000 +0200
@@ -58,6 +58,10 @@
                     'shortopt' => 'a',
                     'doc' => 'list installed packages from all channels',
                     ),
+                'channelinfo' => array(
+                    'shortopt' => 'i',
+                    'doc' => 'output fully channel-aware data, even on failure',
+                    ),
                 ),
             'doc' => '<package>
 If invoked without parameters, this command lists the PEAR packages
@@ -123,10 +127,30 @@
 
     function doList($command, $options, $params)
     {
-        if (isset($options['allchannels'])) {
+        $reg = &$this->config->getRegistry();
+        $channelinfo = (isset($options['channelinfo']) && $options['channelinfo'] == true);
+        if (isset($options['allchannels']) && !$channelinfo) {
             return $this->doListAll($command, array(), $params);
+        } elseif (isset($options['allchannels'])) {
+            // allchannels with $channelinfo
+            unset($options['allchannels']);
+            $channels = $reg->getChannels();
+            $errors = array();
+            foreach($channels as $channel) {
+                $options['channel'] = $channel->getName();
+                $ret = $this->doList($command, $options, $params);
+
+                if ($ret !== true) {
+                    $errors[] = $ret;
+                }
+            }
+            if (count($errors) !== 0) {
+                // for now, only give first error
+                return $errors[0];
+            }
+            return true;
         }
-        $reg = &$this->config->getRegistry();
+
         if (count($params) == 1) {
             return $this->doFileList($command, $options, $params);
         }
@@ -141,7 +165,6 @@
         }
         $installed = $reg->packageInfo(null, null, $channel);
         usort($installed, array(&$this, '_sortinfo'));
-        $i = $j = 0;
         $data = array(
             'caption' => 'Installed packages, channel ' .
                 $channel . ':',
@@ -149,14 +172,29 @@
             'headline' => array('Package', 'Version', 'State'),
             'channel' => $channel,
             );
+        if ($channelinfo) {
+            array_unshift($data['headline'], 'Channel');
+        }
+
         foreach ($installed as $package) {
             $pobj = $reg->getPackage(isset($package['package']) ?
                                         $package['package'] : $package['name'], $channel);
-            $data['data'][] = array($pobj->getPackage(), $pobj->getVersion(),
-                                    $pobj->getState() ? $pobj->getState() : null);
+            $data_array = array($pobj->getPackage(),
+                                $pobj->getVersion(),
+                                $pobj->getState() ? $pobj->getState() : null);
+            if ($channelinfo) {
+                array_unshift($data_array, $channel);
+            }
+            $data['data'][] = $data_array;
         }
         if (count($installed)==0) {
-            $data = '(no packages installed from channel ' . $channel . ')';
+            if (!$channelinfo) {
+                $data = '(no packages installed from channel ' . $channel . ')';
+            } else {
+                // return cleanly
+                unset($data['headline']);
+                $data['data'] = '(no packages installed)';
+            }
         }
         $this->ui->outputData($data, $command);
         return true;
@@ -164,6 +202,9 @@
     
     function doListAll($command, $options, $params)
     {
+        // This dupicate code is deprecated over
+        // list --channelinfo, which gives identical
+        // output for list and list --allchannels.
         $reg = &$this->config->getRegistry();
         $installed = $reg->packageInfo(null, null, null);
         foreach ($installed as $channel => $packages) {
