瀏覽代碼

Merge remote-tracking branch 'andrewtch/dependency-links'

Jordi Boggiano 13 年之前
父節點
當前提交
4305e4801d

+ 32 - 0
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -19,6 +19,38 @@ use Doctrine\ORM\EntityRepository;
  */
 class PackageRepository extends EntityRepository
 {
+    public function packageExists($package)
+    {
+        return in_array($package, $this->getPackageNames());
+    }
+
+    public function getPackageNames()
+    {
+        $names = false;
+        $apc = extension_loaded('apc');
+        
+        //todo: move caching to some mature bundle, not apc
+        //use container to set caching key and ttl
+        if ($apc) {
+            $names = apc_fetch('packagist_package_names');
+        }
+
+        if (false === $names) {
+            $names = array_map(function($value)
+                    {
+                        return $value['name'];
+                    }, $this->getEntityManager()
+                            ->createQuery("SELECT p.name FROM Packagist\WebBundle\Entity\Package p")
+                            ->getResult());
+
+            if ($apc) {
+                apc_store('packagist_package_names', $names, 3600);
+            }
+        }
+
+        return $names;
+    }
+
     public function getStalePackages()
     {
         $qb = $this->getEntityManager()->createQueryBuilder();

+ 5 - 0
src/Packagist/WebBundle/Resources/config/services.yml

@@ -1 +1,6 @@
 services:
+    packagist.twig.extension:
+        class: Packagist\WebBundle\Twig\PackagistExtension
+        arguments: [ @doctrine ]
+        tags:
+            - { name: twig.extension }

+ 7 - 6
src/Packagist/WebBundle/Resources/views/Web/viewPackage.html.twig

@@ -1,4 +1,5 @@
 {% extends "PackagistWebBundle::layout.html.twig" %}
+{% import "PackagistWebBundle::macros.html.twig" as packagist %}
 
 {% block scripts %}
     <script src="{{ asset('bundles/packagistweb/js/view.js?v=2')}}"></script>
@@ -80,7 +81,7 @@
                                             {% if version.require|length %}
                                                 <ul>
                                                     {%- for req in version.require -%}
-                                                        <li>{{ req.packageName }}: {{ req.packageVersion }}</li>
+                                                        <li>{{ packagist.packageLink(req.packageName) }}: {{ req.packageVersion }}</li>
                                                     {%- endfor -%}
                                                 </ul>
                                             {% else %}
@@ -92,7 +93,7 @@
                                             {% if version.recommend|length %}
                                                 <ul>
                                                     {%- for req in version.recommend -%}
-                                                        <li>{{ req.packageName }}: {{ req.packageVersion }}</li>
+                                                        <li>{{ packagist.packageLink(req.packageName) }}: {{ req.packageVersion }}</li>
                                                     {%- endfor -%}
                                                 </ul>
                                             {% else %}
@@ -104,7 +105,7 @@
                                             {% if version.suggest|length %}
                                                 <ul>
                                                     {%- for req in version.suggest -%}
-                                                        <li>{{ req.packageName }}: {{ req.packageVersion }}</li>
+                                                        <li>{{ packagist.packageLink(req.packageName) }}: {{ req.packageVersion }}</li>
                                                     {%- endfor -%}
                                                 </ul>
                                             {% else %}
@@ -116,7 +117,7 @@
                                             {% if version.provide|length %}
                                                 <ul>
                                                     {%- for req in version.provide -%}
-                                                        <li>{{ req.packageName }}: {{ req.packageVersion }}</li>
+                                                        <li>{{ packagist.packageLink(req.packageName) }}: {{ req.packageVersion }}</li>
                                                     {%- endfor -%}
                                                 </ul>
                                             {% else %}
@@ -128,7 +129,7 @@
                                             {% if version.conflict|length %}
                                                 <ul>
                                                     {%- for req in version.conflict -%}
-                                                        <li>{{ req.packageName }}: {{ req.packageVersion }}</li>
+                                                        <li>{{ packagist.packageLink(req.packageName) }}: {{ req.packageVersion }}</li>
                                                     {%- endfor -%}
                                                 </ul>
                                             {% else %}
@@ -140,7 +141,7 @@
                                             {% if version.replace|length %}
                                                 <ul>
                                                     {%- for req in version.replace -%}
-                                                        <li>{{ req.packageName }}: {{ req.packageVersion }}</li>
+                                                        <li>{{ packagist.packageLink(req.packageName) }} {{ req.packageVersion }}</li>
                                                     {%- endfor -%}
                                                 </ul>
                                             {% else %}

+ 10 - 0
src/Packagist/WebBundle/Resources/views/macros.html.twig

@@ -14,3 +14,13 @@
         {% endif %}
     </ul>
 {% endmacro %}
+
+{% macro packageLink(packageName) %}
+
+    {% if packageName is packagistPackageName and packageName is existingPackagistPackage %}
+        <a href="{{ path('view_package', { 'name': packageName }) }}">{{ packageName }}</a>
+    {% else %}
+        {{ packageName }}
+    {% endif %}
+
+{% endmacro %}

+ 42 - 0
src/Packagist/WebBundle/Twig/PackagistExtension.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace Packagist\WebBundle\Twig;
+
+use Symfony\Bridge\Doctrine\RegistryInterface;
+
+class PackagistExtension extends \Twig_Extension
+{
+    /**
+     * @var \Symfony\Bridge\Doctrine\RegistryInterface
+     */
+    private $doctrine;
+
+    public function __construct(RegistryInterface $doctrine)
+    {
+        $this->doctrine = $doctrine;
+    }
+
+    public function getTests()
+    {
+        return array(
+            'packagistPackageName' => new \Twig_Test_Method($this, 'validPackageNameTest'),
+            'existingPackagistPackage' => new \Twig_Test_Method($this, 'packageExistsTest')
+        );
+    }
+
+    public function getName()
+    {
+        return 'packagist';
+    }
+
+    public function packageExistsTest($package)
+    {
+        return $this->doctrine->getRepository('PackagistWebBundle:Package')
+            ->packageExists($package);
+    }
+
+    public function validPackageNameTest($package)
+    {
+        return preg_match('/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+/', $package);
+    }
+}