Browse Source

in VersionParser only truncate the version if hash

Zbigniew Czapran 12 years ago
parent
commit
80c2736021

+ 20 - 3
src/Composer/Package/Version/VersionParser.php

@@ -26,6 +26,7 @@ use Composer\Package\LinkConstraint\VersionConstraint;
 class VersionParser
 {
     private static $modifierRegex = '[._-]?(?:(beta|b|RC|alpha|a|patch|pl|p)(?:[.-]?(\d+))?)?([.-]?dev)?';
+    private static $sha1Length = 40;
 
     /**
      * Returns the stability of a version
@@ -73,10 +74,26 @@ class VersionParser
         if (!$package->isDev() || !in_array($package->getSourceType(), array('hg', 'git'))) {
             return $package->getPrettyVersion();
         }
-
-        return $package->getPrettyVersion() . ' ' . ($truncate ? substr($package->getSourceReference(), 0, 6) : $package->getSourceReference());
+        
+        // if source reference is a sha1 hash -- truncate
+        if ($truncate && self::isHash($package->getSourceReference())) {
+            return $package->getPrettyVersion() . ' ' . substr($package->getSourceReference(), 0, 6);
+        } else {
+            return $package->getPrettyVersion() . ' ' . $package->getSourceReference();
+        }
     }
 
+    /**
+     * Indicates whether version is in form of hash.
+     * 
+     * @param string $version
+     * @return boolean
+     */
+    private static function isHash($version)
+    {
+        return strlen($version) == self::$sha1Length;
+    }
+    
     /**
      * Normalizes a version string to be able to perform comparisons on it
      *
@@ -274,5 +291,5 @@ class VersionParser
         }
 
         throw new \UnexpectedValueException('Could not parse version constraint '.$constraint);
-    }
+    }    
 }

+ 239 - 0
tests/Composer/Test/Mock/PackageMock.php

@@ -0,0 +1,239 @@
+<?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\Test\Mock;
+
+use Composer\Package\PackageInterface;
+
+/**
+ * Mock class for PackageInterface.
+ * 
+ * More fields might be added if required in test cases.
+ */
+class PackageMock implements PackageInterface
+{
+
+    private $isDev;
+    private $prettyVersion;
+    private $sourceReference;
+    private $sourceType;
+
+    public function __toString()
+    {
+        return 'PackageMock';
+    }
+
+    public function getAlias()
+    {
+        
+    }
+
+    public function getAutoload()
+    {
+        
+    }
+
+    public function getBinaries()
+    {
+        
+    }
+
+    public function getConflicts()
+    {
+        
+    }
+
+    public function getDevRequires()
+    {
+        
+    }
+
+    public function getDistReference()
+    {
+        
+    }
+
+    public function getDistSha1Checksum()
+    {
+        
+    }
+
+    public function getDistType()
+    {
+        
+    }
+
+    public function getDistUrl()
+    {
+        
+    }
+
+    public function getExtra()
+    {
+        
+    }
+
+    public function getId()
+    {
+        
+    }
+
+    public function getIncludePaths()
+    {
+        
+    }
+
+    public function getInstallationSource()
+    {
+        
+    }
+
+    public function getName()
+    {
+        
+    }
+
+    public function getNames()
+    {
+        
+    }
+
+    public function getPrettyAlias()
+    {
+        
+    }
+
+    public function getPrettyName()
+    {
+        
+    }
+
+    public function getPrettyString()
+    {
+        
+    }
+
+    public function getPrettyVersion()
+    {
+        return $this->prettyVersion;
+    }
+
+    public function getProvides()
+    {
+        
+    }
+
+    public function getReleaseDate()
+    {
+        
+    }
+
+    public function getReplaces()
+    {
+        
+    }
+
+    public function getRepository()
+    {
+        
+    }
+
+    public function getRequires()
+    {
+        
+    }
+
+    public function getSourceReference()
+    {
+        return $this->sourceReference;
+    }
+
+    public function getSourceType()
+    {
+        return $this->sourceType;
+    }
+
+    public function getSourceUrl()
+    {
+        
+    }
+
+    public function getStability()
+    {
+        
+    }
+
+    public function getSuggests()
+    {
+        
+    }
+
+    public function getTargetDir()
+    {
+        
+    }
+
+    public function getType()
+    {
+        
+    }
+
+    public function getUniqueName()
+    {
+        
+    }
+
+    public function getVersion()
+    {
+        
+    }
+
+    public function isDev()
+    {
+        return $this->isDev;
+    }
+
+    public function setId($id)
+    {
+        
+    }
+
+    public function setInstallationSource($type)
+    {
+        
+    }
+
+    public function setIsDev($isDev)
+    {
+        $this->isDev = $isDev;
+    }
+
+    public function setPrettyVersion($prettyVersion)
+    {
+        $this->prettyVersion = $prettyVersion;
+    }
+
+    public function setSourceReference($sourceReference)
+    {
+        $this->sourceReference = $sourceReference;
+    }
+
+    public function setSourceType($sourceType)
+    {
+        $this->sourceType = $sourceType;
+    }
+
+    public function setRepository(\Composer\Repository\RepositoryInterface $repository)
+    {
+        
+    }
+}

+ 35 - 0
tests/Composer/Test/Package/Version/VersionParserTest.php

@@ -15,9 +15,44 @@ namespace Composer\Test\Package\Version;
 use Composer\Package\Version\VersionParser;
 use Composer\Package\LinkConstraint\MultiConstraint;
 use Composer\Package\LinkConstraint\VersionConstraint;
+use Composer\Package\PackageInterface;
+use Composer\Test\Mock\PackageMock;
 
 class VersionParserTest extends \PHPUnit_Framework_TestCase
 {
+    /**
+     * @dataProvider formattedVersions
+     * 
+     * @param \Composer\Package\PackageInterface $package
+     * @param string $expected
+     */
+    public function testFormatVersionForDevPackage(PackageInterface $package, $truncate, $expected)
+    {
+        $this->assertSame($expected, VersionParser::formatVersion($package, $truncate));
+    }
+    
+    public function formattedVersions()
+    {
+        $data = array(
+            array('sourceReference' => 'v2.1.0-RC2', 'truncate' => true, 'expected' => 'PrettyVersion v2.1.0-RC2'),
+            array('sourceReference' => 'bbf527a27356414bfa9bf520f018c5cb7af67c77', 'truncate' => true, 'expected' => 'PrettyVersion bbf527'),
+            array('sourceReference' => 'v1.0.0', 'truncate' => false, 'expected' => 'PrettyVersion v1.0.0'),
+            array('sourceReference' => 'bbf527a27356414bfa9bf520f018c5cb7af67c77', 'truncate' => false, 'expected' => 'PrettyVersion bbf527a27356414bfa9bf520f018c5cb7af67c77'),
+        );
+        
+        $createPackage = function($arr) {
+            $package = new PackageMock();
+            $package->setIsDev(true);
+            $package->setSourceType('git');
+            $package->setPrettyVersion('PrettyVersion');
+            $package->setSourceReference($arr['sourceReference']);
+            
+            return array($package, $arr['truncate'], $arr['expected']);
+        };
+        
+        return array_map($createPackage, $data);
+    }
+    
     /**
      * @dataProvider successfulNormalizedVersions
      */