Selaa lähdekoodia

installer and downloaders update

everzet 13 vuotta sitten
vanhempi
commit
d2150a3c2e

+ 1 - 0
src/Composer/Downloader/DownloaderInterface.php

@@ -20,4 +20,5 @@ use Composer\Package\PackageInterface;
 interface DownloaderInterface
 interface DownloaderInterface
 {
 {
     function download(PackageInterface $package, $path, $url, $checksum = null);
     function download(PackageInterface $package, $path, $url, $checksum = null);
+    function isDownloaded(PackageInterface $package, $path);
 }
 }

+ 7 - 8
src/Composer/Downloader/GitDownloader.php

@@ -28,18 +28,17 @@ class GitDownloader implements DownloaderInterface
 
 
     public function download(PackageInterface $package, $path, $url, $checksum = null)
     public function download(PackageInterface $package, $path, $url, $checksum = null)
     {
     {
-        if (!is_dir($path)) {
-            if (file_exists($path)) {
-                throw new \UnexpectedValueException($path.' exists and is not a directory.');
-            }
-            if (!mkdir($path, 0777, true)) {
-                throw new \UnexpectedValueException($path.' does not exist and could not be created.');
-            }
-        }
         if ($this->clone) {
         if ($this->clone) {
             system('git clone '.escapeshellarg($url).' -b master '.escapeshellarg($path.'/'.$package->getName()));
             system('git clone '.escapeshellarg($url).' -b master '.escapeshellarg($path.'/'.$package->getName()));
         } else {
         } else {
             system('git archive --format=tar --prefix='.escapeshellarg($package->getName()).' --remote='.escapeshellarg($url).' master | tar -xf -');
             system('git archive --format=tar --prefix='.escapeshellarg($package->getName()).' --remote='.escapeshellarg($url).' master | tar -xf -');
         }
         }
     }
     }
+
+    public function isDownloaded(PackageInterface $package, $path)
+    {
+        $targetPath = $path . '/' . $package->getName();
+
+        return is_dir($targetPath);
+    }
 }
 }

+ 7 - 0
src/Composer/Downloader/PearDownloader.php

@@ -66,4 +66,11 @@ class PearDownloader implements DownloaderInterface
         }
         }
         chdir($cwd);
         chdir($cwd);
     }
     }
+
+    public function isDownloaded(PackageInterface $package, $path)
+    {
+        $targetPath = $path . '/' . $package->getName();
+
+        return is_dir($targetPath);
+    }
 }
 }

+ 7 - 0
src/Composer/Downloader/ZipDownloader.php

@@ -73,4 +73,11 @@ class ZipDownloader implements DownloaderInterface
             throw new \UnexpectedValueException($zipName.' is not a valid zip archive, got error code '.$retval);
             throw new \UnexpectedValueException($zipName.' is not a valid zip archive, got error code '.$retval);
         }
         }
     }
     }
+
+    public function isDownloaded(PackageInterface $package, $path)
+    {
+        $targetPath = $path . '/' . $package->getName();
+
+        return is_dir($targetPath);
+    }
 }
 }

+ 36 - 20
src/Composer/Installer/LibraryInstaller.php

@@ -18,15 +18,18 @@ use Composer\Composer;
 
 
 /**
 /**
  * @author Jordi Boggiano <j.boggiano@seld.be>
  * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
  */
  */
 class LibraryInstaller implements InstallerInterface
 class LibraryInstaller implements InstallerInterface
 {
 {
     private $dir;
     private $dir;
     private $composer;
     private $composer;
+    private $preferSource;
 
 
-    public function __construct($dir = 'vendor')
+    public function __construct($dir = 'vendor', $preferSource = false)
     {
     {
         $this->dir = $dir;
         $this->dir = $dir;
+        $this->preferSource = $preferSource;
     }
     }
 
 
     public function setComposer(Composer $composer)
     public function setComposer(Composer $composer)
@@ -36,39 +39,52 @@ class LibraryInstaller implements InstallerInterface
 
 
     public function install(PackageInterface $package)
     public function install(PackageInterface $package)
     {
     {
-        if ($package->getDistType()) {
+        if (!is_dir($this->dir)) {
+            if (file_exists($this->dir)) {
+                throw new \UnexpectedValueException($this->dir.' exists and is not a directory.');
+            }
+            if (!mkdir($this->dir, 0777, true)) {
+                throw new \UnexpectedValueException($this->path.' does not exist and could not be created.');
+            }
+        }
 
 
-            $this->composer->getDownloader($package->getDistType())->download(
+        if (!($this->preferSource && $package->getSourceType()) && $package->getDistType()) {
+            $downloader = $this->composer->getDownloader($package->getDistType());
+
+            return $downloader->download(
                 $package, $this->dir, $package->getDistUrl(), $package->getDistSha1Checksum()
                 $package, $this->dir, $package->getDistUrl(), $package->getDistSha1Checksum()
             );
             );
+        }
 
 
-        } elseif ($package->getSourceType()) {
+        if ($package->getSourceType()) {
+            $downloader = $this->composer->getDownloader($package->getSourceType());
 
 
-            $this->composer->getDownloader($package->getSourceType())->download(
+            return $downloader->download(
                 $package, $this->dir, $package->getSourceUrl()
                 $package, $this->dir, $package->getSourceUrl()
             );
             );
-
-        } else {
-            throw new \InvalidArgumentException(
-                'Type must be one of (dist, source), '.$type.' given.'
-            );
         }
         }
 
 
-        return true;
+        throw new \InvalidArgumentException('Package should have dist or source specified');
     }
     }
 
 
     public function isInstalled(PackageInterface $package)
     public function isInstalled(PackageInterface $package)
     {
     {
-        // TODO: implement installation check
-    }
+        if ($package->getSourceType()) {
+            $downloader = $this->composer->getDownloader($package->getSourceType());
 
 
-    public function update(PackageInterface $package)
-    {
-        // TODO: implement package update
-    }
+            if ($downloader->isDownloaded($package, $this->dir)) {
+                return true;
+            }
+        }
 
 
-    public function remove(PackageInterface $package)
-    {
-        // TODO: implement package removal
+        if ($package->getDistType()) {
+            $downloader = $this->composer->getDownloader($package->getDistType());
+
+            if ($downloader->isDownloaded($package, $this->dir)) {
+                return true;
+            }
+        }
+
+        return false;
     }
     }
 }
 }