]> granicus.if.org Git - php/commitdiff
* added "pear makerpm" command for wrapping PEAR packages in RPMs
authorStig Bakken <ssb@php.net>
Sat, 12 Oct 2002 14:19:50 +0000 (14:19 +0000)
committerStig Bakken <ssb@php.net>
Sat, 12 Oct 2002 14:19:50 +0000 (14:19 +0000)
pear/PEAR/Command/Package.php
pear/package-PEAR.xml
pear/template.spec [new file with mode: 0644]

index 51fe8be05d1dd37454ed03ac36e4268488d717c0..1ea1bf60e313b96f3967afdac55926a38582f1e0 100644 (file)
@@ -106,6 +106,36 @@ List all depencies the package has.'
             'doc' => '<package-file>
 Signs a package distribution (.tar or .tgz) file with GnuPG.',
             ),
+        'makerpm' => array(
+            'summary' => 'Builds an RPM package from a PEAR package',
+            'function' => 'doMakeRPM',
+            'shortcut' => 'rpm',
+            'options' => array(
+                'spec-template' => array(
+                    'shortopt' => 't',
+                    'arg' => 'FILE',
+                    'doc' => 'Use FILE as RPM spec file template'
+                    ),
+                'rpm-pkgname' => array(
+                    'shortopt' => 'p',
+                    'arg' => 'FORMAT',
+                    'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced
+by the PEAR package name, defaults to "PEAR::%s".',
+                    ),
+                ),
+            'doc' => '<package-file>
+
+Creates an RPM .spec file for wrapping a PEAR package inside an RPM
+package.  Intended to be used from the SPECS directory, with the PEAR
+package tarball in the SOURCES directory:
+
+$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz
+Wrote RPM spec file PEAR::Net_Geo-1.0.spec
+$ rpm -bb PEAR::Net_Socket-1.0.spec
+...
+Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm
+',
+            ),
         );
 
     var $output;
@@ -374,6 +404,93 @@ Signs a package distribution (.tar or .tgz) file with GnuPG.',
         $tar->addModify("$tmpdir/package.sig", '', $tmpdir);
         return true;
     }
+
+    function doMakeRPM($command, $options, $params)
+    {
+        if (sizeof($params) != 1) {
+            return $this->raiseError("bad parameter(s), try \"help $command\"");
+        }
+        if (!file_exists($params[0])) {
+            return $this->raiseError("file does not exist: $params[0]");
+        }
+        include_once "Archive/Tar.php";
+        include_once "PEAR/Installer.php";
+        include_once "System.php";
+        $tar = new Archive_Tar($params[0]);
+        $tmpdir = System::mktemp('-d pear2rpm');
+        $instroot = System::mktemp('-d pear2rpm');
+        $tmp = $this->config->get('verbose');
+        $this->config->set('verbose', 0);
+        $installer = new PEAR_Installer($this->ui);
+        $info = $installer->install($params[0],
+                                    array('installroot' => $instroot,
+                                          'nodeps' => true));
+        $pkgdir = "$info[package]-$info[version]";
+//        print "instroot=$instroot\n";
+//        print_r($info);
+//        return true;
+
+        $info['rpm_xml_dir'] = '/var/lib/pear';
+        $this->config->set('verbose', $tmp);
+        if (!$tar->extractList("$pkgdir/package.xml", $tmpdir, $pkgdir)) {
+            return $this->raiseError("failed to extract $params[0]");
+        }
+        if (!file_exists("$tmpdir/package.xml")) {
+            return $this->raiseError("no package.xml found in $params[0]");
+        }
+//        System::mkdir("-p $instroot$info[rpm_xml_dir]");
+//        if (!@copy("$tmpdir/package.xml", "$instroot$info[rpm_xml_dir]/$info[package].xml")) {
+//            return $this->raiseError("could not copy package.xml file: $php_errormsg");
+//        }
+        if (isset($options['spec-template'])) {
+            $spec_template = $options['spec-template'];
+        } else {
+            $spec_template = $this->config->get('data_dir') .
+                '/PEAR/template.spec';
+        }
+        if (isset($options['rpm-pkgname'])) {
+            $rpm_pkgname_format = $options['rpm-pkgname'];
+        } else {
+            $rpm_pkgname_format = "PEAR::%s";
+        }
+
+        $info['extra_headers'] = '';
+        $info['doc_files'] = '';
+        $info['files'] = '';
+        $info['rpm_package'] = sprintf($rpm_pkgname_format, $info['package']);
+        $srcfiles = 0;
+        foreach ($info['filelist'] as $name => $attr) {
+            if ($attr['role'] == 'doc') {
+                $info['doc_files'] .= " $name";
+            } elseif ($attr['role'] == 'src') {
+                $srcfiles++;
+            }
+            $info['files'] .= "$attr[installed_as]\n";
+        }
+        if ($srcfiles > 0) {
+            include_once "OS/Guess.php";
+            $os = new OS_Guess;
+            $arch = $os->getCpu();
+        } else {
+            $arch = 'noarch';
+        }
+        $fp = @fopen($spec_template, "r");
+        if (!$fp) {
+            return $this->raiseError("could not open RPM spec file template $spec_template: $php_errormsg");
+        }
+        $spec_contents = preg_replace('/@([a-z0-9_-]+)@/e', '$info["\1"]', fread($fp, filesize($spec_template)));
+        fclose($fp);
+        $spec_file = "$info[rpm_package]-$info[version].spec";
+        $wp = fopen($spec_file, "w");
+        if (!$wp) {
+            return $this->raiseError("could not write RPM spec file $spec_file: $php_errormsg");
+        }
+        fwrite($wp, $spec_contents);
+        fclose($wp);
+        $this->ui->outputData("Wrote RPM spec file $spec_file", $command);
+        
+        return true;
+    }
 }
 
 ?>
\ No newline at end of file
index 75b2e39aec1468885f33cc4293c778f3e1c05c12..689fe169eb8ad1e66432e187fd7ca09de44f2021 100644 (file)
@@ -31,7 +31,7 @@
     </maintainer>
   </maintainers>
   <release>
-    <version>1.0RC1</version>
+    <version>1.0b1</version>
     <state>stable</state>
     <date>2002-10-13</date>
     <notes>
@@ -77,6 +77,7 @@ Bugfixes, PEAR Library:
 </notes>
     <filelist>
       <file role="data" name="package.dtd"/>
+      <file role="data" name="template.spec"/>
       <file role="php" name="PEAR.php"/>
       <file role="php" name="System.php"/>
       <dir name="PEAR">
diff --git a/pear/template.spec b/pear/template.spec
new file mode 100644 (file)
index 0000000..ea8972b
--- /dev/null
@@ -0,0 +1,43 @@
+Summary: PEAR: @summary@
+Name: @rpm_package@
+Version: @version@
+Release: 1
+License: @release_license@
+Group: Development/Libraries
+Source: http://pear.php.net/get/@package@-%{version}.tgz
+BuildRoot: %{_tmppath}/%{name}-root
+URL: http://pear.php.net/
+Prefix: %{_prefix}
+Docdir: %{_docdir}
+@extra_headers@
+
+%description
+@description@
+
+%prep
+#rm -rf Console_Getopt-%{version} package.xml
+#mkdir -p Console_Getopt-%{version}
+#ln -s Console_Getopt-%{version}/package.xml package.xml
+%setup -q -D -n @package@-%{version}
+mv ../package.xml .
+
+%build
+echo BuildRoot=%{buildroot}
+
+%post
+pear uninstall --nodeps -r @package@
+
+%postun
+pear install --nodeps -r @rpm_xml_dir@/@package@.xml
+
+%install
+rm -rf %{buildroot}/*
+pear -q install -R %{buildroot} -n package.xml
+mkdir -p %{buildroot}@rpm_xml_dir@
+cp -p package.xml %{buildroot}@rpm_xml_dir@/@package@.xml
+
+%files
+%defattr(-,root,root)
+%doc @doc_files@
+@files@
+@rpm_xml_dir@/@package@.xml