Преглед на файлове

implement a self-update command (closes #83)

Igor Wiedler преди 13 години
родител
ревизия
b15ec17a06
променени са 5 файла, в които са добавени 70 реда и са изтрити 2 реда
  1. 2 1
      composer.json
  2. 57 0
      src/Composer/Command/SelfUpdateCommand.php
  3. 9 0
      src/Composer/Compiler.php
  4. 1 1
      src/Composer/Composer.php
  5. 1 0
      src/Composer/Console/Application.php

+ 2 - 1
composer.json

@@ -20,7 +20,8 @@
     "require": {
         "php": ">=5.3.0",
         "symfony/console": "2.0.5",
-        "symfony/finder": "2.0.5"
+        "symfony/finder": "2.0.5",
+        "symfony/process": "2.0.5"
     },
     "recommends": {
         "ext-zip": "*"

+ 57 - 0
src/Composer/Command/SelfUpdateCommand.php

@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Command;
+
+use Composer\Composer;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @author Igor Wiedler <igor@wiedler.ch>
+ */
+class SelfUpdateCommand extends Command
+{
+    protected function configure()
+    {
+        $this
+            ->setName('self-update')
+            ->setDescription('Updates composer.phar to the latest version.')
+            ->setHelp(<<<EOT
+The <info>self-update</info> command checks getcomposer.org for newer
+versions of composer and if found, installs the latest.
+
+<info>php composer.phar self-update</info>
+
+EOT
+            )
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $composer = $this->getComposer();
+
+        $latest = file_get_contents('http://getcomposer.org/version');
+
+        if (Composer::VERSION !== $latest) {
+            $output->writeln(sprintf("Updating to version %s.", $latest));
+
+            $remoteFilename = 'http://getcomposer.org/composer.phar';
+            $localFilename = getcwd().'/composer.phar';
+
+            file_put_contents($localFilename, file_get_contents($remoteFilename));
+        } else {
+            $output->writeln("You are using the latest composer version.");
+        }
+    }
+}

+ 9 - 0
src/Composer/Compiler.php

@@ -13,6 +13,7 @@
 namespace Composer;
 
 use Symfony\Component\Finder\Finder;
+use Symfony\Component\Process\Process;
 
 /**
  * The Compiler class compiles composer into a phar
@@ -34,6 +35,12 @@ class Compiler
             unlink($pharFile);
         }
 
+        $process = new Process('git log --pretty="%h" -n1 HEAD');
+        if ($process->run() > 0) {
+            throw new \RuntimeException('The git binary cannot be found.');
+        }
+        $this->version = trim($process->getOutput());
+
         $phar = new \Phar($pharFile, 0, 'composer.phar');
         $phar->setSignatureAlgorithm(\Phar::SHA1);
 
@@ -88,6 +95,8 @@ class Compiler
             $content = "\n".file_get_contents($file)."\n";
         }
 
+        $content = str_replace('@package_version@', $this->version, $content);
+
         $phar->addFromString($path, $content);
     }
 

+ 1 - 1
src/Composer/Composer.php

@@ -24,7 +24,7 @@ use Composer\Downloader\DownloadManager;
  */
 class Composer
 {
-    const VERSION = '1.0.0-DEV';
+    const VERSION = '@package_version@';
 
     private $package;
     private $locker;

+ 1 - 0
src/Composer/Console/Application.php

@@ -66,6 +66,7 @@ class Application extends BaseApplication
         $this->add(new Command\AboutCommand());
         $this->add(new Command\InstallCommand());
         $this->add(new Command\UpdateCommand());
+        $this->add(new Command\SelfUpdateCommand());
         $this->add(new Command\DebugPackagesCommand());
     }
 }