[zi-cvs] packages/com.zzoss.package.lib Dependency.php,1.5,1.6

Sandro Zic <[email protected]> Fri, 02 Apr 2004 12:34:37 +0000
Newsgroups gmane.comp.php.zzoss.installer.cvs
Message-ID <[email protected]>
Update of /cvsroot/zzossinstaller/packages/com.zzoss.package.lib
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8601/com.zzoss.package.lib

Modified Files:
	Dependency.php 
Log Message:
detect circular dependencies of packages depending on each other

Index: Dependency.php
===================================================================
RCS file: /cvsroot/zzossinstaller/packages/com.zzoss.package.lib/Dependency.php,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** Dependency.php	1 Apr 2004 18:59:04 -0000	1.5
--- Dependency.php	2 Apr 2004 12:34:34 -0000	1.6
***************
*** 51,54 ****
--- 51,64 ----
      
      /**
+     * Stack of those packages that depend on another package.
+     */
+     var $_circular_pkgs = array();
+     
+     /**
+     * Stack of those packages that are needeb by another package.
+     */
+     var $_circular_deps = array();
+     
+     /**
      * Packages not defined in application.xml.
      */
***************
*** 141,145 ****
  		if(is_array($this->actions)) {
  			foreach($this->actions as $key=>$val) {
! 				if($val==$value) {
  					$name = $this->packages_resolve[$key];
  					$this->packages_check[$name] = $this->packages[$name];
--- 151,155 ----
  		if(is_array($this->actions)) {
  			foreach($this->actions as $key=>$val) {
! 				if($val == $value) {
  					$name = $this->packages_resolve[$key];
  					$this->packages_check[$name] = $this->packages[$name];
***************
*** 292,297 ****
--- 302,310 ----
               $is_available = true;
          }
+         
          $is_installed = isset($this->packages[$this->dep["#"].'-'.$v_available]["installed"]);
          
+         $is_resolved = true;
+         
          switch($dep_rel) {
              case 'ge':
***************
*** 299,306 ****
                  if($is_available && $is_installed){
                      //echo "ge - $dep_name: $v_available >= $v_required<br/>";
!                     return version_compare($v_available, $v_required, 'ge');
                  } else {
                      //echo "ge - $dep_name: !\$is_available<br/>";
!                     return false;
                  }
                  break;
--- 312,320 ----
                  if($is_available && $is_installed){
                      //echo "ge - $dep_name: $v_available >= $v_required<br/>";
!                     $is_resolved = version_compare($v_available, $v_required, $dep_rel);
                  } else {
+                     //var_dump($is_installed);
                      //echo "ge - $dep_name: !\$is_available<br/>";
!                     $is_resolved = false;
                  }
                  break;
***************
*** 309,336 ****
                  // greater-or-equal comparing
                  if($is_available && $is_installed){
!                     return version_compare($v_available, $v_required, 'le');
                  } else {
!                     return false;
                  }
                  break;
              case 'has':
                  //echo "has - $dep_name: $is_installed<br/>";
!                 return $is_installed;
!                 //return $is_available;
                  break;
              default:
                  // equal comparing
                  // greater-or-equal comparing
                  if($is_available && $is_installed){
!                     return version_compare($v_available, $v_required, 'eq');
                  } else {
!                     return false;
                  }
                  break;
          }
          
!         return true;
      }
  
  }
  ?>
\ No newline at end of file
--- 323,403 ----
                  // greater-or-equal comparing
                  if($is_available && $is_installed){
!                     $is_resolved = version_compare($v_available, $v_required, $dep_rel);
                  } else {
!                     $is_resolved = false;
                  }
                  break;
              case 'has':
                  //echo "has - $dep_name: $is_installed<br/>";
!                 $is_resolved = $is_installed;
!                 //$is_resolved = $is_available;
                  break;
              default:
+                 $dep_rel = 'eq';
                  // equal comparing
                  // greater-or-equal comparing
                  if($is_available && $is_installed){
!                     $is_resolved = version_compare($v_available, $v_required, $dep_rel);
                  } else {
!                     $is_resolved = false;
                  }
                  break;
          }
          
!         // check for circular dependencies:
!         // if the needed package has a dependency on a package that depends on it
!         if(
!             isset($this->_circular_pkgs[$this->dep["#"]]) &&
!             in_array($this->package['name'], $this->_circular_pkgs[$this->dep["#"]]) &&
!             isset($this->_circular_deps[$this->package['name']]) &&
!             in_array($this->dep["#"], $this->_circular_deps[$this->package['name']])){
!             /*
!             echo "Circular dependency between '".$this->dep["#"]."' and '".$this->package['name']."'.";
!             //$this->_unsetCircular();
!             echo '<pre>deps:';
!             print_r($this->_circular_deps);
!             echo 'pkgs:';
!             print_r($this->_circular_pkgs);
!             echo '</pre>';
!             */
!             return PEAR::raiseError("Circular dependency between '".$this->dep["#"]."' and '".$this->package['name']."'.");
!         }
!         
!         if(!$is_resolved) {
!            $this->_setCircularDeps();
!         } else {
!             $this->_unsetCircular();
!         }
!         
!         return $is_resolved;
      }
  
+     function _setCircularDeps()
+     {
+         if(!isset($this->_circular_deps[$this->dep["#"]]) && !isset($this->_circular_pkgs[$this->package['name']])) {
+             /*
+             echo '<br/>';
+             echo "Setting deps: '".$this->dep["#"]."'.";
+             echo '<br/>';
+             echo "Setting pkgs: '".$this->package['name']."'.";
+             echo '<hr/>';
+             */
+             $this->_circular_deps[$this->dep["#"]][]         = $this->package['name'];
+             $this->_circular_pkgs[$this->package['name']][]  = $this->dep["#"];
+         }
+     }
+     
+     function _unsetCircular()
+     {
+         /*
+         echo '<br/>';
+         echo "Unsetting deps: '".$this->dep["#"]."'.";
+         echo '<br/>';
+         echo "Unsetting pkgs: '".$this->package['name']."'.";
+         echo '<hr/>';
+         */
+         unset($this->_circular_deps[$this->dep["#"]]);
+         unset($this->_circular_pkgs[$this->package['name']]);
+     }
  }
  ?>
\ No newline at end of file



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click