CRM-12030 - Always use '/' in URLs (even for Windows)
authorTim Otten <totten@civicrm.org>
Thu, 7 Mar 2013 00:11:02 +0000 (19:11 -0500)
committerTim Otten <totten@civicrm.org>
Thu, 7 Mar 2013 00:11:02 +0000 (19:11 -0500)
CRM/Extension/Container/Basic.php
tests/phpunit/CRM/Extension/Container/BasicTest.php

index 68ca76bf782a7ba92294338e95acabcee5c5efb1..99138a0fb34a72000a117dc01fd4ad168ec16b6f 100644 (file)
@@ -72,6 +72,17 @@ class CRM_Extension_Container_Basic implements CRM_Extension_Container_Interface
    */
   public $relPaths = FALSE;
 
+  /**
+   * @var array($key => $relUrl)
+   *
+   * Derived from $relPaths. On Unix systems (where file-paths and
+   * URL-paths both use '/' separator), this isn't necessary. On Windows
+   * systems, this is derived from $relPaths.
+   *
+   * Note: Treat as private. This is only public to facilitate debugging.
+   */
+  public $relUrls = FALSE;
+
   /**
    * @param string $baseDir local path to the container
    * @param string $baseUrl public URL of the container
@@ -170,4 +181,37 @@ class CRM_Extension_Container_Basic implements CRM_Extension_Container_Interface
     }
     return $this->relPaths;
   }
+
+  /**
+   * Scan $basedir for a list of extension-keys
+   *
+   * @param string $dirSep the local system's directory separator
+   * @return array($key => $relUrl)
+   */
+  protected function getRelUrls() {
+    if (DIRECTORY_SEPARATOR == '/') {
+      return $this->getRelPaths();
+    }
+    if (!is_array($this->relUrls)) {
+      $this->relUrls = self::convertPathsToUrls(DIRECTORY_SEPARATOR, $this->getRelPaths());
+    }
+    return $this->relUrls;
+  }
+
+  /**
+   * Convert a list of relative paths to relative URLs.
+   *
+   * Note: Treat as private. This is only public to facilitate testing.
+   *
+   * @param string $dirSep
+   * @param array $relPaths ($key => $relPath)
+   * @return array($key => $relUrl)
+   */
+  public static function convertPathsToUrls($dirSep, $relPaths) {
+    $relUrls = array();
+    foreach ($relPaths as $key => $relPath) {
+      $relUrls[$key] = str_replace($dirSep, '/', $relPath);
+    }
+    return $relUrls;
+  }
 }
index 8fd1fd4f5348246a2284e35b4f6e17709dce1203..ed3c25427ea46b6e1de95aa3739cea4b2e39e9b0 100644 (file)
@@ -96,4 +96,17 @@ class CRM_Extension_Container_BasicTest extends CiviUnitTestCase {
     $c = new CRM_Extension_Container_Basic($basedir . $appendPathGarbage, 'http://example/basedir' . $appendPathGarbage, $cache, $cacheKey);
     return array($basedir, $c);
   }
+
+  function testConvertPathsToUrls() {
+    $relPaths = array(
+      'foo.bar' => 'foo\bar',
+      'whiz.bang' => 'tests\extensions\whiz\bang'
+    );
+    $expectedRelUrls = array(
+      'foo.bar' => 'foo/bar',
+      'whiz.bang' => 'tests/extensions/whiz/bang',
+    );
+    $actualRelUrls = CRM_Extension_Container_Basic::convertPathsToUrls('\\', $relPaths);
+    $this->assertEquals($expectedRelUrls, $actualRelUrls);
+  }
 }