diff --git a/doc/03-cli.md b/doc/03-cli.md
index 3a964c390..217d2ea0a 100644
--- a/doc/03-cli.md
+++ b/doc/03-cli.md
@@ -605,6 +605,8 @@ See the [Config](06-config.md) chapter for valid configuration options.
that this cannot be used in conjunction with the `--global` option.
* **--absolute:** Returns absolute paths when fetching *-dir config values
instead of relative.
+* **--json:** JSON decode the setting value, to be used with `extra.*` keys.
+* **--merge:** Merge the setting value with the current value, to be used with `extra.*` keys in combination with `--json`.
### Modifying Repositories
@@ -633,6 +635,13 @@ php composer.phar config extra.foo.bar value
The dots indicate array nesting, a max depth of 3 levels is allowed though. The above
would set `"extra": { "foo": { "bar": "value" } }`.
+If you have a complex value to add/modify, you can use the `--json` and `--merge` flags
+to edit extra fields as json:
+
+```sh
+php composer.phar config --json extra.foo.bar '{"baz": true, "qux": []}'
+```
+
## create-project
You can use Composer to create new projects from an existing package. This is
diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php
index 8c186e407..099e5c872 100644
--- a/src/Composer/Command/ConfigCommand.php
+++ b/src/Composer/Command/ConfigCommand.php
@@ -73,6 +73,8 @@ class ConfigCommand extends BaseCommand
new InputOption('list', 'l', InputOption::VALUE_NONE, 'List configuration settings'),
new InputOption('file', 'f', InputOption::VALUE_REQUIRED, 'If you want to choose a different composer.json or config.json'),
new InputOption('absolute', null, InputOption::VALUE_NONE, 'Returns absolute paths when fetching *-dir config values instead of relative'),
+ new InputOption('json', 'j', InputOption::VALUE_NONE, 'JSON decode the setting value, to be used with extra.* keys'),
+ new InputOption('merge', 'm', InputOption::VALUE_NONE, 'Merge the setting value with the current value, to be used with extra.* keys in combination with --json'),
new InputArgument('setting-key', null, 'Setting key'),
new InputArgument('setting-value', InputArgument::IS_ARRAY, 'Setting value'),
))
@@ -119,6 +121,10 @@ To add or edit extra properties you can use:
%command.full_name% extra.property value
+Or to add a complex value you can use json with:
+
+ %command.full_name% extra.property --json '{"foo":true, "bar": []}'
+
To edit the file in an external editor:
%command.full_name% --editor
@@ -622,7 +628,21 @@ EOT
return 0;
}
- $this->configSource->addProperty($settingKey, $values[0]);
+ $value = $values[0];
+ if ($input->getOption('json')) {
+ $value = JsonFile::parseJson($value);
+ if ($input->getOption('merge')) {
+ $currentValue = $this->configFile->read();
+ $bits = explode('.', $settingKey);
+ foreach ($bits as $bit) {
+ $currentValue = isset($currentValue[$bit]) ? $currentValue[$bit] : null;
+ }
+ if (is_array($currentValue)) {
+ $value = array_merge($currentValue, $value);
+ }
+ }
+ }
+ $this->configSource->addProperty($settingKey, $value);
return 0;
}