This allows for adding a metadata file called ".SRCINFO" to source
tarballs to overwrite specific PKGBUILD fields. .SRCINFO files are
parsed line by line. The syntax for each line is "key = value", where
key is any of the following field names:

* pkgname
* pkgver
* pkgdesc
* url
* license
* depend

Multiple "depend" lines can be specified to add multiple dependencies.

This format closely matches the .PKGINFO format that is used for binary
packages in pacman/libalpm. It can be extended by field name prefixes or
sections to support split packages later.

Signed-off-by: Lukas Fleischer <[email protected]>
---
 web/html/pkgsubmit.php | 38 ++++++++++++++++++++++++++++++++++----
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/web/html/pkgsubmit.php b/web/html/pkgsubmit.php
index d9bb6bc..4c14be4 100644
--- a/web/html/pkgsubmit.php
+++ b/web/html/pkgsubmit.php
@@ -81,8 +81,8 @@ if ($uid):
                if (!$error) {
                        $tar = new Archive_Tar($_FILES['pfile']['tmp_name']);
 
-                       # Extract PKGBUILD into a string
-                       $pkgbuild_raw = '';
+                       # Extract PKGBUILD and .SRCINFO into a string
+                       $pkgbuild_raw = $srcinfo_raw = '';
                        $dircount = 0;
                        foreach ($tar->listContent() as $tar_file) {
                                if ($tar_file['typeflag'] == 0) {
@@ -93,6 +93,9 @@ if ($uid):
                                        elseif (substr($tar_file['filename'], 
-9) == '/PKGBUILD') {
                                                $pkgbuild_raw = 
$tar->extractInString($tar_file['filename']);
                                        }
+                                       elseif (substr($tar_file['filename'], 
-9) == '/.SRCINFO') {
+                                               $srcinfo_raw = 
$tar->extractInString($tar_file['filename']);
+                                       }
                                }
                                elseif ($tar_file['typeflag'] == 5) {
                                        if (substr_count($tar_file['filename'], 
"/") > 1) {
@@ -254,6 +257,31 @@ if ($uid):
                        }
                }
 
+               # Parse .SRCINFO and overwrite PKGBUILD fields accordingly
+               unset($pkg_version);
+               $depends = array();
+               foreach (explode("\n", $srcinfo_raw) as $line) {
+                       if ($line[0] = '#') {
+                               continue;
+                       }
+                       list($key, $value) = explode(' = ', $line, 2);
+
+                       switch ($key) {
+                       case 'pkgname':
+                       case 'pkgdesc':
+                       case 'url':
+                       case 'license':
+                               $new_pkgbuild[$key] = $value;
+                               break;
+                       case 'pkgver':
+                               $pkg_version = $value;
+                               break;
+                       case 'depend':
+                               $depends[] = $value;
+                               break;
+                       }
+               }
+
                # Validate package name
                if (!$error) {
                        $pkg_name = $new_pkgbuild['pkgname'];
@@ -266,7 +294,7 @@ if ($uid):
                }
 
                # Determine the full package version with epoch
-               if (!$error) {
+               if (!$error && !isset($pkg_version)) {
                        if (isset($new_pkgbuild['epoch']) && 
(int)$new_pkgbuild['epoch'] > 0) {
                                $pkg_version = sprintf('%d:%s-%s', 
$new_pkgbuild['epoch'], $new_pkgbuild['pkgver'], $new_pkgbuild['pkgrel']);
                        } else {
@@ -389,8 +417,10 @@ if ($uid):
                        }
 
                        # Update package depends
-                       if (!empty($new_pkgbuild['depends'])) {
+                       if (empty($depends) && 
!empty($new_pkgbuild['depends'])) {
                                $depends = explode(" ", 
$new_pkgbuild['depends']);
+                       }
+                       if (!empty($depends)) {
                                foreach ($depends as $dep) {
                                        $deppkgname = 
preg_replace("/(<|<=|=|>=|>).*/", "", $dep);
                                        $depcondition = 
str_replace($deppkgname, "", $dep);
-- 
1.8.2.rc2.352.g908df73

Reply via email to