瀏覽代碼

Update package parsing rules, added auto-versioning

Jordi Boggiano 13 年之前
父節點
當前提交
2917d9050e
共有 2 個文件被更改,包括 45 次插入21 次删除
  1. 44 20
      src/Packagist/WebBundle/Command/UpdatePackagesCommand.php
  2. 1 1
      src/Packagist/WebBundle/Entity/Version.php

+ 44 - 20
src/Packagist/WebBundle/Command/UpdatePackagesCommand.php

@@ -93,38 +93,57 @@ EOF
 
             try {
                 foreach ($repository->getTags() as $tag => $identifier) {
-                    if ($repository->hasComposerFile($identifier) && $this->validateTag($tag)) {
+                    if ($repository->hasComposerFile($identifier) && $parsedTag = $this->validateTag($tag)) {
                         $data = $repository->getComposerInformation($identifier);
-                        $data['version_normalized'] = $this->versionParser->normalize($data['version']);
-                        // Strip -dev that could have been left over accidentally in a tag
-                        $data['version'] = preg_replace('{[.-]?dev$}i', '', $data['version']);
+
+                        // manually versioned package
+                        if (isset($data['version'])) {
+                            $data['version_normalized'] = $this->versionParser->normalize($data['version']);
+                            if ($data['version_normalized'] !== $parsedTag) {
+                                // broken package, version doesn't match tag
+                                continue;
+                            }
+                        } else {
+                            // auto-versionned package, read value from tag
+                            $data['version'] = preg_replace('{[.-]?dev$}i', '', $tag);
+                            $data['version_normalized'] = preg_replace('{[.-]?dev$}i', '', $parsedTag);
+                        }
                         $this->updateInformation($output, $doctrine, $package, $repository, $identifier, $data);
                         $doctrine->getEntityManager()->flush();
                     }
                 }
 
                 foreach ($repository->getBranches() as $branch => $identifier) {
-                    if ($repository->hasComposerFile($identifier) && $this->validateBranch($branch)) {
+                    if ($repository->hasComposerFile($identifier) && $parsedBranch = $this->validateBranch($branch)) {
                         $data = $repository->getComposerInformation($identifier);
-                        $data['version_normalized'] = $this->versionParser->normalize($data['version']);
 
-                        // Skip branches that contain a version that's been tagged already
+                        // manually versioned package
+                        if (isset($data['version'])) {
+                            $data['version_normalized'] = $this->versionParser->normalize($data['version']);
+                        } else {
+                            // auto-versionned package, read value from branch name
+                            $data['version'] = $branch;
+                            $data['version_normalized'] = $parsedBranch;
+                        }
+
+                        // make sure branch packages have a -dev flag
+                        $data['version'] = preg_replace('{[.-]?dev$}i', '', $data['version']) . '-dev';
+                        $data['version_normalized'] = preg_replace('{[.-]?dev$}i', '', $data['version_normalized']) . '-dev';
+
+                        // Skip branches that contain a version that has been tagged already
                         foreach ($package->getVersions() as $existingVersion) {
                             if ($data['version_normalized'] === $existingVersion->getNormalizedVersion() && !$existingVersion->getDevelopment()) {
                                 continue;
                             }
                         }
 
-                        // Force branches to use -dev releases
-                        if (!preg_match('{[.-]?dev$}i', $data['version'])) {
-                            $data['version'] .= '-dev';
-                        }
-
                         $this->updateInformation($output, $doctrine, $package, $repository, $identifier, $data);
                         $doctrine->getEntityManager()->flush();
                     }
                 }
 
+                // TODO -dev versions that were not updated should be deleted
+
                 $package->setUpdatedAt(new \DateTime);
                 $package->setCrawledAt(new \DateTime);
                 $doctrine->getEntityManager()->flush();
@@ -137,18 +156,17 @@ EOF
 
     private function validateBranch($branch)
     {
-        if (in_array($branch, array('master', 'trunk'))) {
-            return true;
+        try {
+            return $this->versionParser->normalizeBranch($branch);
+        } catch (\Exception $e) {
+            return false;
         }
-
-        return (Boolean) preg_match('#^v?(\d+)(\.(?:\d+|[x*]))?(\.(?:\d+|[x*]))?(\.[x*])?$#i', $branch, $matches);
     }
 
     private function validateTag($version)
     {
         try {
-            $this->versionParser->normalize($version);
-            return true;
+            return $this->versionParser->normalize($version);
         } catch (\Exception $e) {
             return false;
         }
@@ -160,9 +178,7 @@ EOF
         $version = new Version();
 
         $version->setName($package->getName());
-        $version->setVersion($data['version']);
         $version->setNormalizedVersion($data['version_normalized']);
-        $version->setDevelopment(substr($data['version'], -4) === '-dev');
 
         // check if we have that version yet
         foreach ($package->getVersions() as $existingVersion) {
@@ -175,9 +191,13 @@ EOF
             }
         }
 
+        $version->setVersion($data['version']);
+        $version->setDevelopment(substr($data['version_normalized'], -4) === '-dev');
+
         $em->persist($version);
 
         $version->setDescription($data['description']);
+        $package->setDescription($data['description']);
         $version->setHomepage($data['homepage']);
         $version->setLicense(is_array($data['license']) ? $data['license'] : array($data['license']));
 
@@ -261,5 +281,9 @@ EOF
                 }
             }
         }
+
+        if (!$package->getVersions()->contains($version)) {
+            $package->addVersions($version);
+        }
     }
 }

+ 1 - 1
src/Packagist/WebBundle/Entity/Version.php

@@ -224,7 +224,7 @@ class Version
     public function equals(Version $version)
     {
         return strtolower($version->getName()) === strtolower($this->getName())
-            && $version->getNormalizedVersion() === $this->getNormalizedVersion();
+            && strtolower($version->getNormalizedVersion()) === strtolower($this->getNormalizedVersion());
     }
 
     /**