diff options
| -rw-r--r-- | REFLECTION | 27 | ||||
| -rw-r--r-- | examples/librpm.php | 47 | ||||
| -rw-r--r-- | package.xml | 3 | ||||
| -rw-r--r-- | rpminfo.c | 87 | ||||
| -rw-r--r-- | tests/003-rpminfo.phpt | 2 | ||||
| -rw-r--r-- | tests/bidon-src.rpm | bin | 6257 -> 6336 bytes | |||
| -rw-r--r-- | tests/bidon.rpm | bin | 6808 -> 6972 bytes | 
7 files changed, 161 insertions, 5 deletions
@@ -1,7 +1,30 @@ -Extension [ <persistent> extension #15 rpminfo version 0.2.0 ] { +Extension [ <persistent> extension #15 rpminfo version 0.2.1-dev ] { -  - Constants [1] { +  - Constants [24] {      Constant [ string RPMVERSION ] { 4.14.1 } +    Constant [ integer RPMSENSE_ANY ] { 0 } +    Constant [ integer RPMSENSE_LESS ] { 2 } +    Constant [ integer RPMSENSE_GREATER ] { 4 } +    Constant [ integer RPMSENSE_EQUAL ] { 8 } +    Constant [ integer RPMSENSE_POSTTRANS ] { 32 } +    Constant [ integer RPMSENSE_PREREQ ] { 64 } +    Constant [ integer RPMSENSE_PRETRANS ] { 128 } +    Constant [ integer RPMSENSE_INTERP ] { 256 } +    Constant [ integer RPMSENSE_SCRIPT_PRE ] { 512 } +    Constant [ integer RPMSENSE_SCRIPT_POST ] { 1024 } +    Constant [ integer RPMSENSE_SCRIPT_PREUN ] { 2048 } +    Constant [ integer RPMSENSE_SCRIPT_POSTUN ] { 4096 } +    Constant [ integer RPMSENSE_SCRIPT_VERIFY ] { 8192 } +    Constant [ integer RPMSENSE_FIND_REQUIRES ] { 16384 } +    Constant [ integer RPMSENSE_FIND_PROVIDES ] { 32768 } +    Constant [ integer RPMSENSE_TRIGGERIN ] { 65536 } +    Constant [ integer RPMSENSE_TRIGGERUN ] { 131072 } +    Constant [ integer RPMSENSE_TRIGGERPOSTUN ] { 262144 } +    Constant [ integer RPMSENSE_MISSINGOK ] { 524288 } +    Constant [ integer RPMSENSE_RPMLIB ] { 16777216 } +    Constant [ integer RPMSENSE_TRIGGERPREIN ] { 33554432 } +    Constant [ integer RPMSENSE_KEYRING ] { 67108864 } +    Constant [ integer RPMSENSE_CONFIG ] { 268435456 }    }    - Functions { diff --git a/examples/librpm.php b/examples/librpm.php index 90082e0..b012e54 100644 --- a/examples/librpm.php +++ b/examples/librpm.php @@ -7,6 +7,28 @@ namespace Remi\RPM;  abstract class Common {  	protected $info = NULL; +	protected function _dep(Array $names, Array $flags, Array $vers) { +		$ret = []; +		$signs = [ +			RPMSENSE_EQUAL                    => ' = ', +			RPMSENSE_LESS                     => ' < ', +			RPMSENSE_GREATER                  => ' > ', +			RPMSENSE_LESS    | RPMSENSE_EQUAL => ' <= ', +			RPMSENSE_GREATER | RPMSENSE_EQUAL => ' >= ', +		]; + +		if (count($names) == count($vers) && count($vers) == count($flags)) { +			for ($i=0 ; $i<count($names) ; $i++) { +				if (isset($signs[$flags[$i] & 15])) { +					$ret[] = $names[$i] . $signs[$flags[$i] & 15] . $vers[$i]; +				} else { +					$ret[] = $names[$i] . '('. ($flags[$i] & 15) .')' . $vers[$i]; +				} +			} +		} +		return $ret; +	} +  	public function __get($name) {  		switch ($name) {  			case 'EVR': @@ -25,6 +47,22 @@ abstract class Common {  					$ret .= '.' . $this->info['Arch'];  				}  				return $ret; +			case 'Requires': +				if (isset($this->info['Requirename'])) { +					return $this->_dep($this->info['Requirename'], $this->info['Requireflags'], $this->info['Requireversion']); +				} +			case 'Conflicts': +				if (isset($this->info['Conflictname'])) { +					return $this->_dep($this->info['Conflictname'], $this->info['Conflictflags'], $this->info['Conflictversion']); +				} +			case 'Obsoletes': +				if (isset($this->info['Obsoletename'])) { +					return $this->_dep($this->info['Obsoletename'], $this->info['Obsoleteflags'], $this->info['Obsoleteversion']); +				} +			case 'Provides': +				if (isset($this->info['Providename'])) { +					return $this->_dep($this->info['Providename'], $this->info['Provideflags'], $this->info['Provideversion']); +				}  			default:  				if (isset($this->info[$name])) {  					return $this->info[$name]; @@ -76,3 +114,12 @@ class Package extends Common {  	}  } + +/* +$a = new File(dirname(__DIR__).'/tests/bidon.rpm'); +echo "Requires: ";  print_r($a->Requires); +echo "Provides: ";  print_r($a->Provides); +echo "Conflicts: "; print_r($a->Conflicts); +echo "Obsoletes: "; print_r($a->Obsoletes); +*/ + diff --git a/package.xml b/package.xml index ab41d56..dbba8ae 100644 --- a/package.xml +++ b/package.xml @@ -27,7 +27,8 @@ Available functions:    <license>PHP 3.01</license>    <notes>  - add summary in minimal information set -- retrieve array of strings from metadata +- retrieve array from metadata +- add RPMSENSE_* macros    </notes>    <contents>      <dir name="/"> @@ -69,6 +69,7 @@ static void rpm_header_to_zval(zval *return_value, Header h, zend_bool full)  				}  		} +		//printf("Tag: %-30s  Type: %8lx - %8lx - %8lx\n", rpmTagGetName(tag), (long)rpmTagGetTagType(tag), (long)rpmTagGetType(tag), (long)rpmTagGetReturnType(tag));  		type = rpmTagGetTagType(tag);  		switch (type) {  			case RPM_STRING_TYPE: @@ -82,10 +83,70 @@ static void rpm_header_to_zval(zval *return_value, Header h, zend_bool full)  				break;  			case RPM_CHAR_TYPE:  			case RPM_INT8_TYPE: +				add_assoc_long(return_value, rpmTagGetName(tag), (zend_long)headerGetNumber(h, tag)); +				break;  			case RPM_INT16_TYPE: +				if (rpmTagGetReturnType(tag) == RPM_ARRAY_RETURN_TYPE) { +					struct rpmtd_s keys; +					if (headerGet(h, tag, &keys, HEADERGET_MINMEM)) { +						uint16_t *key; +						zval tmp; + +						array_init(&tmp); +						rpmtdInit(&keys); +						while (rpmtdNext(&keys)>=0) { +							key = rpmtdGetUint16(&keys); +							add_next_index_long(&tmp, (zend_long)*key); +						} +						add_assoc_zval(return_value, rpmTagGetName(tag), &tmp); +					} else { +						add_assoc_null(return_value, rpmTagGetName(tag)); +					} +				} else { +					add_assoc_long(return_value, rpmTagGetName(tag), (zend_long)headerGetNumber(h, tag)); +				} +				break;  			case RPM_INT32_TYPE: +				if (rpmTagGetReturnType(tag) == RPM_ARRAY_RETURN_TYPE) { +					struct rpmtd_s keys; +					if (headerGet(h, tag, &keys, HEADERGET_MINMEM)) { +						uint32_t *key; +						zval tmp; + +						array_init(&tmp); +						rpmtdInit(&keys); +						while (rpmtdNext(&keys)>=0) { +							key = rpmtdGetUint32(&keys); +							add_next_index_long(&tmp, (zend_long)*key); +						} +						add_assoc_zval(return_value, rpmTagGetName(tag), &tmp); +					} else { +						add_assoc_null(return_value, rpmTagGetName(tag)); +					} +				} else { +					add_assoc_long(return_value, rpmTagGetName(tag), (zend_long)headerGetNumber(h, tag)); +				} +				break;  			case RPM_INT64_TYPE: -				add_assoc_long(return_value, rpmTagGetName(tag), (zend_long)headerGetNumber(h, tag)); +				if (rpmTagGetReturnType(tag) == RPM_ARRAY_RETURN_TYPE) { +					struct rpmtd_s keys; +					if (headerGet(h, tag, &keys, HEADERGET_MINMEM)) { +						uint64_t *key; +						zval tmp; + +						array_init(&tmp); +						rpmtdInit(&keys); +						while (rpmtdNext(&keys)>=0) { +							key = rpmtdGetUint64(&keys); +							add_next_index_long(&tmp, (zend_long)*key); +						} +						add_assoc_zval(return_value, rpmTagGetName(tag), &tmp); +					} else { +						add_assoc_null(return_value, rpmTagGetName(tag)); +					} +				} else { +					add_assoc_long(return_value, rpmTagGetName(tag), (zend_long)headerGetNumber(h, tag)); +				}  				break;  			case RPM_STRING_ARRAY_TYPE:  				{ @@ -245,6 +306,30 @@ PHP_MINIT_FUNCTION(rpminfo)  {  	REGISTER_STRING_CONSTANT("RPMVERSION", (char *)RPMVERSION, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_ANY",           RPMSENSE_ANY,           CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_LESS",          RPMSENSE_LESS,          CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_GREATER",       RPMSENSE_GREATER,       CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_EQUAL",         RPMSENSE_EQUAL,         CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_POSTTRANS",     RPMSENSE_POSTTRANS,     CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_PREREQ",        RPMSENSE_PREREQ,        CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_PRETRANS",      RPMSENSE_PRETRANS,      CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_INTERP",        RPMSENSE_INTERP,        CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_SCRIPT_PRE",    RPMSENSE_SCRIPT_PRE,    CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_SCRIPT_POST",   RPMSENSE_SCRIPT_POST,   CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_SCRIPT_PREUN",  RPMSENSE_SCRIPT_PREUN,  CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_SCRIPT_POSTUN", RPMSENSE_SCRIPT_POSTUN, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_SCRIPT_VERIFY", RPMSENSE_SCRIPT_VERIFY, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_FIND_REQUIRES", RPMSENSE_FIND_REQUIRES, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_FIND_PROVIDES", RPMSENSE_FIND_PROVIDES, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_TRIGGERIN",     RPMSENSE_TRIGGERIN,     CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_TRIGGERUN",     RPMSENSE_TRIGGERUN,     CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_TRIGGERPOSTUN", RPMSENSE_TRIGGERPOSTUN, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_MISSINGOK",     RPMSENSE_MISSINGOK,     CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_RPMLIB",        RPMSENSE_RPMLIB,        CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_TRIGGERPREIN",  RPMSENSE_TRIGGERPREIN,  CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_KEYRING",       RPMSENSE_KEYRING,       CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("RPMSENSE_CONFIG",        RPMSENSE_CONFIG,        CONST_CS | CONST_PERSISTENT); +  	return SUCCESS;  }  /* }}} */ diff --git a/tests/003-rpminfo.phpt b/tests/003-rpminfo.phpt index e5e01ab..beb7b47 100644 --- a/tests/003-rpminfo.phpt +++ b/tests/003-rpminfo.phpt @@ -14,7 +14,7 @@ array(5) {    ["Version"]=>    string(1) "1"    ["Release"]=> -  string(11) "1.fc25.remi" +  string(11) "1.fc27.remi"    ["Summary"]=>    string(5) "Bidon"    ["Arch"]=> diff --git a/tests/bidon-src.rpm b/tests/bidon-src.rpm Binary files differindex c1c05cf..7943ac6 100644 --- a/tests/bidon-src.rpm +++ b/tests/bidon-src.rpm diff --git a/tests/bidon.rpm b/tests/bidon.rpm Binary files differindex 259ddf6..6cbfa04 100644 --- a/tests/bidon.rpm +++ b/tests/bidon.rpm  | 
