Browse Source

feat: add archive.name config option

Basil Peace 4 years ago
parent
commit
6140897d08

+ 15 - 0
doc/04-schema.md

@@ -883,6 +883,21 @@ A set of options for creating package archives.
 
 The following options are supported:
 
+* **name:** Allows configuring base name for archive.
+  By default (if not configured, and `--file` is not passed as command-line argument),
+  `preg_replace('#[^a-z0-9-_]#i', '-', name)` is used.
+
+Example:
+
+```json
+{
+    "name": "org/strangeName",
+    "archive": {
+        "name": "Strange_name"
+    }
+}
+```
+
 * **exclude:** Allows configuring a list of patterns for excluded paths. The
   pattern syntax matches .gitignore files. A leading exclamation mark (!) will
   result in any matching files to be included even if a previous pattern

+ 4 - 0
res/composer-schema.json

@@ -354,6 +354,10 @@
             "type": ["object"],
             "description": "Options for creating package archives for distribution.",
             "properties": {
+                "name": {
+                    "type": "string",
+                    "description": "A base name for archive."
+                },
                 "exclude": {
                     "type": "array",
                     "description": "A list of patterns for paths to exclude or include if prefixed with an exclamation mark."

+ 5 - 0
src/Composer/Package/AliasPackage.php

@@ -387,6 +387,11 @@ class AliasPackage extends BasePackage implements CompletePackageInterface
         return $this->aliasOf->getNotificationUrl();
     }
 
+    public function getArchiveName()
+    {
+        return $this->aliasOf->getArchiveName();
+    }
+
     public function getArchiveExcludes()
     {
         return $this->aliasOf->getArchiveExcludes();

+ 24 - 15
src/Composer/Package/Archiver/ArchiveManager.php

@@ -72,7 +72,12 @@ class ArchiveManager
      */
     public function getPackageFilename(PackageInterface $package)
     {
-        $nameParts = array(preg_replace('#[^a-z0-9-_]#i', '-', $package->getName()));
+        if ($package->getArchiveName()) {
+            $baseName = $package->getArchiveName();
+        } else {
+            $baseName = preg_replace('#[^a-z0-9-_]#i', '-', $package->getName());
+        }
+        $nameParts = array($baseName);
 
         if (preg_match('{^[a-f0-9]{40}$}', $package->getDistReference())) {
             array_push($nameParts, $package->getDistReference(), $package->getDistType());
@@ -125,20 +130,6 @@ class ArchiveManager
         }
 
         $filesystem = new Filesystem();
-        if (null === $fileName) {
-            $packageName = $this->getPackageFilename($package);
-        } else {
-            $packageName = $fileName;
-        }
-
-        // Archive filename
-        $filesystem->ensureDirectoryExists($targetDir);
-        $target = realpath($targetDir).'/'.$packageName.'.'.$format;
-        $filesystem->ensureDirectoryExists(dirname($target));
-
-        if (!$this->overwriteFiles && file_exists($target)) {
-            return $target;
-        }
 
         if ($package instanceof RootPackageInterface) {
             $sourcePath = realpath('.');
@@ -159,12 +150,30 @@ class ArchiveManager
             if (file_exists($composerJsonPath = $sourcePath.'/composer.json')) {
                 $jsonFile = new JsonFile($composerJsonPath);
                 $jsonData = $jsonFile->read();
+                if (!empty($jsonData['archive']['name'])) {
+                    $package->setArchiveName($jsonData['archive']['name']);
+                }
                 if (!empty($jsonData['archive']['exclude'])) {
                     $package->setArchiveExcludes($jsonData['archive']['exclude']);
                 }
             }
         }
 
+        if (null === $fileName) {
+            $packageName = $this->getPackageFilename($package);
+        } else {
+            $packageName = $fileName;
+        }
+
+        // Archive filename
+        $filesystem->ensureDirectoryExists($targetDir);
+        $target = realpath($targetDir).'/'.$packageName.'.'.$format;
+        $filesystem->ensureDirectoryExists(dirname($target));
+
+        if (!$this->overwriteFiles && file_exists($target)) {
+            return $target;
+        }
+
         // Create the archive
         $tempTarget = sys_get_temp_dir().'/composer_archive'.uniqid().'.'.$format;
         $filesystem->ensureDirectoryExists(dirname($tempTarget));

+ 3 - 0
src/Composer/Package/Dumper/ArrayDumper.php

@@ -70,6 +70,9 @@ class ArrayDumper
             }
         }
 
+        if ($package->getArchiveName()) {
+            $data['archive']['name'] = $package->getArchiveName();
+        }
         if ($package->getArchiveExcludes()) {
             $data['archive']['exclude'] = $package->getArchiveExcludes();
         }

+ 3 - 0
src/Composer/Package/Loader/ArrayLoader.php

@@ -159,6 +159,9 @@ class ArrayLoader implements LoaderInterface
             $package->setNotificationUrl($config['notification-url']);
         }
 
+        if (!empty($config['archive']['name'])) {
+            $package->setArchiveName($config['archive']['name']);
+        }
         if (!empty($config['archive']['exclude'])) {
             $package->setArchiveExcludes($config['archive']['exclude']);
         }

+ 19 - 0
src/Composer/Package/Package.php

@@ -57,6 +57,7 @@ class Package extends BasePackage
     protected $autoload = array();
     protected $devAutoload = array();
     protected $includePaths = array();
+    protected $archiveName;
     protected $archiveExcludes = array();
 
     /**
@@ -551,6 +552,24 @@ class Package extends BasePackage
         return $this->notificationUrl;
     }
 
+    /**
+     * Sets default base filename for archive
+     *
+     * @param string $name
+     */
+    public function setArchiveName($name)
+    {
+        $this->archiveName = $name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getArchiveName()
+    {
+        return $this->archiveName;
+    }
+
     /**
      * Sets a list of patterns to be excluded from archives
      *

+ 7 - 0
src/Composer/Package/PackageInterface.php

@@ -345,6 +345,13 @@ interface PackageInterface
      */
     public function getPrettyString();
 
+    /**
+     * Returns default base filename for archive
+     *
+     * @return array
+     */
+    public function getArchiveName();
+
     /**
      * Returns a list of patterns to exclude from package archives
      *