Skip to content

Commit

Permalink
Merge pull request #18444 from owncloud/occ-config-types
Browse files Browse the repository at this point in the history
occ config:system:set can now set other value types
  • Loading branch information
DeepDiver1975 committed Jan 25, 2016
2 parents 9d36972 + f2cb03e commit ce75323
Show file tree
Hide file tree
Showing 6 changed files with 413 additions and 73 deletions.
60 changes: 51 additions & 9 deletions core/command/config/system/deleteconfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ protected function configure() {
->setDescription('Delete a system config value')
->addArgument(
'name',
InputArgument::REQUIRED,
'Name of the config to delete'
InputArgument::REQUIRED | InputArgument::IS_ARRAY,
'Name of the config to delete, specify multiple for array parameter'
)
->addOption(
'error-if-not-exists',
Expand All @@ -61,15 +61,57 @@ protected function configure() {
}

protected function execute(InputInterface $input, OutputInterface $output) {
$configName = $input->getArgument('name');
$configNames = $input->getArgument('name');
$configName = $configNames[0];

if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) {
$output->writeln('<error>System config ' . $configName . ' could not be deleted because it did not exist</error>');
return 1;
if (sizeof($configNames) > 1) {
if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) {
$output->writeln('<error>System config ' . implode(' => ', $configNames) . ' could not be deleted because it did not exist</error>');
return 1;
}

$value = $this->systemConfig->getValue($configName);

try {
$value = $this->removeSubValue(array_slice($configNames, 1), $value, $input->hasParameterOption('--error-if-not-exists'));
}
catch (\UnexpectedValueException $e) {
$output->writeln('<error>System config ' . implode(' => ', $configNames) . ' could not be deleted because it did not exist</error>');
return 1;
}

$this->systemConfig->setValue($configName, $value);
$output->writeln('<info>System config value ' . implode(' => ', $configNames) . ' deleted</info>');
return 0;
} else {
if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) {
$output->writeln('<error>System config ' . $configName . ' could not be deleted because it did not exist</error>');
return 1;
}

$this->systemConfig->deleteValue($configName);
$output->writeln('<info>System config value ' . $configName . ' deleted</info>');
return 0;
}
}

protected function removeSubValue($keys, $currentValue, $throwError) {
$nextKey = array_shift($keys);

if (is_array($currentValue)) {
if (isset($currentValue[$nextKey])) {
if (empty($keys)) {
unset($currentValue[$nextKey]);
} else {
$currentValue[$nextKey] = $this->removeSubValue($keys, $currentValue[$nextKey], $throwError);
}
} else if ($throwError) {
throw new \UnexpectedValueException('Config parameter does not exist');
}
} else if ($throwError) {
throw new \UnexpectedValueException('Config parameter does not exist');
}

$this->systemConfig->deleteValue($configName);
$output->writeln('<info>System config value ' . $configName . ' deleted</info>');
return 0;
return $currentValue;
}
}
19 changes: 16 additions & 3 deletions core/command/config/system/getconfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ protected function configure() {
->setDescription('Get a system config value')
->addArgument(
'name',
InputArgument::REQUIRED,
'Name of the config to get'
InputArgument::REQUIRED | InputArgument::IS_ARRAY,
'Name of the config to get, specify multiple for array parameter'
)
->addOption(
'default-value',
Expand All @@ -68,7 +68,8 @@ protected function configure() {
* @return null|int null or 0 if everything went fine, or an error code
*/
protected function execute(InputInterface $input, OutputInterface $output) {
$configName = $input->getArgument('name');
$configNames = $input->getArgument('name');
$configName = array_shift($configNames);
$defaultValue = $input->getOption('default-value');

if (!in_array($configName, $this->systemConfig->getKeys()) && !$input->hasParameterOption('--default-value')) {
Expand All @@ -79,6 +80,18 @@ protected function execute(InputInterface $input, OutputInterface $output) {
$configValue = $defaultValue;
} else {
$configValue = $this->systemConfig->getValue($configName);
if (!empty($configNames)) {
foreach ($configNames as $configName) {
if (isset($configValue[$configName])) {
$configValue = $configValue[$configName];
} else if (!$input->hasParameterOption('--default-value')) {
return 1;
} else {
$configValue = $defaultValue;
break;
}
}
}
}

$this->writeMixedInOutputFormat($input, $output, $configValue);
Expand Down
133 changes: 124 additions & 9 deletions core/command/config/system/setconfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,15 @@ protected function configure() {
->setDescription('Set a system config value')
->addArgument(
'name',
InputArgument::REQUIRED,
'Name of the config to set'
InputArgument::REQUIRED | InputArgument::IS_ARRAY,
'Name of the config parameter, specify multiple for array parameter'
)
->addOption(
'type',
null,
InputOption::VALUE_REQUIRED,
'Value type [string, integer, double, boolean]',
'string'
)
->addOption(
'value',
Expand All @@ -67,16 +74,124 @@ protected function configure() {
}

protected function execute(InputInterface $input, OutputInterface $output) {
$configName = $input->getArgument('name');
$configNames = $input->getArgument('name');
$configName = $configNames[0];
$configValue = $this->castValue($input->getOption('value'), $input->getOption('type'));
$updateOnly = $input->getOption('update-only');

if (sizeof($configNames) > 1) {
$existingValue = $this->systemConfig->getValue($configName);

$newValue = $this->mergeArrayValue(
array_slice($configNames, 1), $existingValue, $configValue['value'], $updateOnly
);

$this->systemConfig->setValue($configName, $newValue);
} else {
if ($updateOnly && !in_array($configName, $this->systemConfig->getKeys(), true)) {
throw new \UnexpectedValueException('Config parameter does not exist');
}

if (!in_array($configName, $this->systemConfig->getKeys()) && $input->hasParameterOption('--update-only')) {
$output->writeln('<comment>Config value ' . $configName . ' not updated, as it has not been set before.</comment>');
return 1;
$this->systemConfig->setValue($configName, $configValue['value']);
}
$configValue = $input->getOption('value');

$this->systemConfig->setValue($configName, $configValue);
$output->writeln('<info>System config value ' . $configName . ' set to ' . $configValue . '</info>');
$output->writeln('<info>System config value ' . implode(' => ', $configNames) . ' set to ' . $configValue['readable-value'] . '</info>');
return 0;
}

/**
* @param string $value
* @param string $type
* @return mixed
* @throws \InvalidArgumentException
*/
protected function castValue($value, $type) {
switch ($type) {
case 'integer':
case 'int':
if (!is_numeric($value)) {
throw new \InvalidArgumentException('Non-numeric value specified');
}
return [
'value' => (int) $value,
'readable-value' => 'integer ' . (int) $value,
];

case 'double':
case 'float':
if (!is_numeric($value)) {
throw new \InvalidArgumentException('Non-numeric value specified');
}
return [
'value' => (double) $value,
'readable-value' => 'double ' . (double) $value,
];

case 'boolean':
case 'bool':
$value = strtolower($value);
switch ($value) {
case 'true':
return [
'value' => true,
'readable-value' => 'boolean ' . $value,
];

case 'false':
return [
'value' => false,
'readable-value' => 'boolean ' . $value,
];

default:
throw new \InvalidArgumentException('Unable to parse value as boolean');
}

case 'null':
return [
'value' => null,
'readable-value' => 'null',
];

case 'string':
$value = (string) $value;
return [
'value' => $value,
'readable-value' => ($value === '') ? 'empty string' : 'string ' . $value,
];

default:
throw new \InvalidArgumentException('Invalid type');
}
}

/**
* @param array $configNames
* @param mixed $existingValues
* @param mixed $value
* @param bool $updateOnly
* @return array merged value
* @throws \UnexpectedValueException
*/
protected function mergeArrayValue(array $configNames, $existingValues, $value, $updateOnly) {
$configName = array_shift($configNames);
if (!is_array($existingValues)) {
$existingValues = [];
}
if (!empty($configNames)) {
if (isset($existingValues[$configName])) {
$existingValue = $existingValues[$configName];
} else {
$existingValue = [];
}
$existingValues[$configName] = $this->mergeArrayValue($configNames, $existingValue, $value, $updateOnly);
} else {
if (!isset($existingValues[$configName]) && $updateOnly) {
throw new \UnexpectedValueException('Config parameter does not exist');
}
$existingValues[$configName] = $value;
}
return $existingValues;
}

}
Loading

0 comments on commit ce75323

Please sign in to comment.