1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2025-02-01 09:28:22 +01:00
phorge-arcanist/src/workingcopyidentity/ArcanistWorkingCopyIdentity.php

279 lines
7.1 KiB
PHP
Raw Normal View History

2011-01-09 15:22:25 -08:00
<?php
/**
* Interfaces with basic information about the working copy.
*
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
*
* @task config
*
* @group workingcopy
*/
final class ArcanistWorkingCopyIdentity {
2011-01-09 15:22:25 -08:00
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
protected $localConfig;
2011-01-09 15:22:25 -08:00
protected $projectConfig;
protected $runtimeConfig;
2011-01-09 15:22:25 -08:00
protected $projectRoot;
public static function newDummyWorkingCopy() {
return new ArcanistWorkingCopyIdentity('/', array());
}
2011-01-09 15:22:25 -08:00
public static function newFromPath($path) {
$project_id = null;
$project_root = null;
$config = array();
foreach (Filesystem::walkToRoot($path) as $dir) {
$config_file = $dir.'/.arcconfig';
if (!Filesystem::pathExists($config_file)) {
continue;
}
$proj_raw = Filesystem::readFile($config_file);
$config = self::parseRawConfigFile($proj_raw, $config_file);
2011-01-09 15:22:25 -08:00
$project_root = $dir;
break;
}
if (!$project_root) {
foreach (Filesystem::walkToRoot($path) as $dir) {
$try = array(
$dir.'/.svn',
$dir.'/.hg',
$dir.'/.git',
);
foreach ($try as $trydir) {
if (Filesystem::pathExists($trydir)) {
$project_root = $dir;
break 2;
}
}
}
}
2011-01-09 15:22:25 -08:00
return new ArcanistWorkingCopyIdentity($project_root, $config);
}
public static function newFromRootAndConfigFile(
$root,
$config_raw,
$from_where) {
if ($config_raw === null) {
$config = array();
} else {
$config = self::parseRawConfigFile($config_raw, $from_where);
}
return new ArcanistWorkingCopyIdentity($root, $config);
}
private static function parseRawConfigFile($raw_config, $from_where) {
$proj = json_decode($raw_config, true);
if (!is_array($proj)) {
throw new Exception(
"Unable to parse '.arcconfig' file '{$from_where}'. The file contents ".
"should be valid JSON.\n\n".
"FILE CONTENTS\n".
substr($raw_config, 0, 2048));
}
$required_keys = array(
'project_id',
);
foreach ($required_keys as $key) {
if (!array_key_exists($key, $proj)) {
throw new Exception(
"Required key '{$key}' is missing from '.arcconfig' file ".
"'{$from_where}'.");
}
}
return $proj;
}
2011-01-09 15:22:25 -08:00
protected function __construct($root, array $config) {
$this->projectRoot = $root;
$this->projectConfig = $config;
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
$this->localConfig = array();
$this->runtimeConfig = array();
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
$vc_dirs = array(
'.git',
'.hg',
'.svn',
);
[Arcanist] fix scratch dir for svn >= 1.7 Summary: svn 1.7 got rid of the per-direcotry .svn dirs in favor of a single .svn directory under the root of the working copy. Unfortunately, we relied on ther being a .svn directory at the same level as .arcconfig, which may or may not be at the root of the working copy. We now walk up the directory tree until we find a .svn directory that we can use for scratch files. Test Plan: [16:27:52 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ls -la .arcconfig .svn ../../../.svn/arc/config ls: .svn: No such file or directory ls: ../../../.svn/arc/config: No such file or directory -rw-r--r-- 1 dschleimer users 239 Jun 25 16:15 .arcconfig [16:27:54 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ~/devtools/arcanist/bin/arc set-config --local foo bar Set key 'foo' = 'bar' in local config. [16:29:40 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ls -la .arcconfig .svn ../../../.svn/arc/config ls: .svn: No such file or directory -rw-r--r-- 1 dschleimer users 239 Jun 25 16:15 .arcconfig -rw-r--r-- 1 dschleimer users 20 Jun 25 16:29 ../../../.svn/arc/config [16:29:43 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ cat ../../../.svn/arc/config { "foo" : "bar" } [16:29:48 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21299 $ ~/devtools/arcanist/bin/arc get-config foo (global) foo = (local) foo = bar Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1411 Differential Revision: https://secure.phabricator.com/D2856
2012-06-25 17:13:29 -07:00
$found_meta_dir = false;
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
foreach ($vc_dirs as $dir) {
[Arcanist] fix scratch dir for svn >= 1.7 Summary: svn 1.7 got rid of the per-direcotry .svn dirs in favor of a single .svn directory under the root of the working copy. Unfortunately, we relied on ther being a .svn directory at the same level as .arcconfig, which may or may not be at the root of the working copy. We now walk up the directory tree until we find a .svn directory that we can use for scratch files. Test Plan: [16:27:52 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ls -la .arcconfig .svn ../../../.svn/arc/config ls: .svn: No such file or directory ls: ../../../.svn/arc/config: No such file or directory -rw-r--r-- 1 dschleimer users 239 Jun 25 16:15 .arcconfig [16:27:54 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ~/devtools/arcanist/bin/arc set-config --local foo bar Set key 'foo' = 'bar' in local config. [16:29:40 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ls -la .arcconfig .svn ../../../.svn/arc/config ls: .svn: No such file or directory -rw-r--r-- 1 dschleimer users 239 Jun 25 16:15 .arcconfig -rw-r--r-- 1 dschleimer users 20 Jun 25 16:29 ../../../.svn/arc/config [16:29:43 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ cat ../../../.svn/arc/config { "foo" : "bar" } [16:29:48 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21299 $ ~/devtools/arcanist/bin/arc get-config foo (global) foo = (local) foo = bar Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1411 Differential Revision: https://secure.phabricator.com/D2856
2012-06-25 17:13:29 -07:00
$meta_path = Filesystem::resolvePath(
$dir,
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
$this->projectRoot);
[Arcanist] fix scratch dir for svn >= 1.7 Summary: svn 1.7 got rid of the per-direcotry .svn dirs in favor of a single .svn directory under the root of the working copy. Unfortunately, we relied on ther being a .svn directory at the same level as .arcconfig, which may or may not be at the root of the working copy. We now walk up the directory tree until we find a .svn directory that we can use for scratch files. Test Plan: [16:27:52 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ls -la .arcconfig .svn ../../../.svn/arc/config ls: .svn: No such file or directory ls: ../../../.svn/arc/config: No such file or directory -rw-r--r-- 1 dschleimer users 239 Jun 25 16:15 .arcconfig [16:27:54 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ~/devtools/arcanist/bin/arc set-config --local foo bar Set key 'foo' = 'bar' in local config. [16:29:40 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ ls -la .arcconfig .svn ../../../.svn/arc/config ls: .svn: No such file or directory -rw-r--r-- 1 dschleimer users 239 Jun 25 16:15 .arcconfig -rw-r--r-- 1 dschleimer users 20 Jun 25 16:29 ../../../.svn/arc/config [16:29:43 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21298 $ cat ../../../.svn/arc/config { "foo" : "bar" } [16:29:48 Mon Jun 25 2012] dschleimer@dev4022.snc6 ~/data/admin/facebook/scripts/db db 21299 $ ~/devtools/arcanist/bin/arc get-config foo (global) foo = (local) foo = bar Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1411 Differential Revision: https://secure.phabricator.com/D2856
2012-06-25 17:13:29 -07:00
if (Filesystem::pathExists($meta_path)) {
$found_meta_dir = true;
$local_path = Filesystem::resolvePath(
'arc/config',
$meta_path);
if (Filesystem::pathExists($local_path)) {
$file = Filesystem::readFile($local_path);
if ($file) {
$this->localConfig = json_decode($file, true);
}
}
break;
}
}
if (!$found_meta_dir) {
// Try for a single higher-level .svn directory as used by svn 1.7+
foreach (Filesystem::walkToRoot($this->projectRoot) as $parent_path) {
$local_path = Filesystem::resolvePath(
'.svn/arc/config',
$parent_path);
if (Filesystem::pathExists($local_path)) {
$file = Filesystem::readFile($local_path);
if ($file) {
$this->localConfig = json_decode($file, true);
}
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
}
}
}
2011-01-09 15:22:25 -08:00
}
public function getProjectID() {
return $this->getConfig('project_id');
}
public function getProjectRoot() {
return $this->projectRoot;
}
Lay groundwork for configuration-driven linters Summary: Ref T2039. That task has a bunch of discussion, but basically we do a poor job of serving the midrange of lint configuration right now. If you have something simple, the default linters work. If you have something complex, building your own engine lets you do whatever you want. But many users want something in between, which isn't really well accommodated. The idea is to let you write a `.arclint` file, which looks something like this: { "linters" : { "css" : { "type" : "csslint", "include" : "(\.css$)", "exclude" : "(^externals/)", "bin" : "/usr/local/bin/csslint" }, "js" : { "type" : "jshint", "include" : "(\.js$)", "exclude" : "(^externals/)", "bin" : "support/bin/jshint", "interpreter" : "/usr/local/bin/node" } } } ...which will provide a bunch of common options around lint severity, interpreter and binary locaitons, included and excluded files, etc. This implements some basics, and very rough support in the Filename linter. Test Plan: Generated a `.arclint` file and saw it apply filename lint correctly. Used `debug` mode and tried invalid regexps. { "debug" : true, "linters" : { "filename" : { "type" : "filename", "exclude" : ["@^externals/@"] } } } Next steps include: - Provide an external linter archetype (T3186) and expose a common set of configuration here ("bin", "interpreter", "flags", "severity"). - Provide a `.arcunit` file which works similarly (it can probably be simpler). Reviewers: btrahan, Firehed Reviewed By: btrahan CC: aran Maniphest Tasks: T2039 Differential Revision: https://secure.phabricator.com/D6797
2013-08-22 16:02:16 -07:00
public function getProjectPath($to_file) {
return $this->projectRoot.'/'.$to_file;
}
2011-01-09 15:22:25 -08:00
public function getConduitURI() {
return $this->getConfig('conduit_uri');
}
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
/* -( Config )------------------------------------------------------------- */
public function getProjectConfig() {
return $this->projectConfig;
}
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
/**
* Read a configuration directive from project configuration. This reads ONLY
* permanent project configuration (i.e., ".arcconfig"), not other
* configuration sources. See @{method:getConfigFromAnySource} to read from
* user configuration.
*
* @param key Key to read.
* @param wild Default value if key is not found.
* @return wild Value, or default value if not found.
*
* @task config
*/
public function getConfig($key, $default = null) {
$settings = new ArcanistSettings();
$pval = idx($this->projectConfig, $key);
// Test for older names in the per-project config only, since
// they've only been used there.
if ($pval === null) {
$legacy = $settings->getLegacyName($key);
if ($legacy) {
$pval = $this->getConfig($legacy);
}
}
if ($pval === null) {
$pval = $default;
} else {
$pval = $settings->willReadValue($key, $pval);
}
return $pval;
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
}
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
/**
* Read a configuration directive from local configuration. This
* reads ONLY the per-working copy configuration,
* i.e. .(git|hg|svn)/arc/config, and not other configuration
* sources. See @{method:getConfigFromAnySource} to read from any
* config source or @{method:getConfig} to read permanent
* project-level config.
*
* @task config
*/
public function getLocalConfig($key, $default=null) {
return idx($this->localConfig, $key, $default);
}
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
/**
* Read a configuration directive from any available configuration source.
* In contrast to @{method:getConfig}, this will look for the directive in
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
* local and user configuration in addition to project configuration.
* The precedence is local > project > user
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
*
* @param key Key to read.
* @param wild Default value if key is not found.
* @return wild Value, or default value if not found.
*
* @task config
*/
public function getConfigFromAnySource($key, $default = null) {
$settings = new ArcanistSettings();
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
// try runtime config first
$pval = idx($this->runtimeConfig, $key);
// try local config
if ($pval === null) {
$pval = $this->getLocalConfig($key);
}
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
// then per-project config
if ($pval === null) {
$pval = $this->getConfig($key);
}
Allow global config to load libraries and set test engines Summary: Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs. - Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well. - Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines. - Add some type checking to "arc set-config". - Add "arc set-config --show". Test Plan: - **load** - Ran `arc set-config load xxx`, got error about format. - Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it. - Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked. - Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries. - Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded. - Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library. - Set `.arcconfig` to point at a bad library, verified hard error. - **lint.engine** / **unit.engine** - Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine. - Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine. - **--show** - Ran `arc set-config --show`. - **misc** - Ran `arc get-config`. Reviewers: csilvers, btrahan, vrana Reviewed By: csilvers CC: aran Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 11:41:39 -07:00
// now try global (i.e. user-level) config
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
if ($pval === null) {
$global_config = ArcanistBaseWorkflow::readGlobalArcConfig();
$pval = idx($global_config, $key);
}
// Finally, try system-level config.
if ($pval === null) {
$system_config = ArcanistBaseWorkflow::readSystemArcConfig();
$pval = idx($system_config, $key);
}
if ($pval === null) {
$pval = $default;
} else {
$pval = $settings->willReadValue($key, $pval);
[Arcanist] add a local (per working copy) config file Summary: This adds the concept of a local (i.e. working copy local) config file to arc. This config file has the highest precedence for config settings that may come from any config file. The config is stored in .(git|hg|sv)/arc/config, and is read ahead of the project config by getConfigFromAnySource(). Test Plan: #Testing arc set-config and arc get-config [16:57:04 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit [16:57:12 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19410 $ ./bin/arc set-config foo bar Set key 'foo' = 'bar' in global config. [16:57:23 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar [16:57:26 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19411 $ ./bin/arc set-config --local foo baz Set key 'foo' = 'baz' in local config. [16:57:35 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = bar (local) foo = baz [16:57:39 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19412 $ ./bin/arc set-config foo '' Deleted key 'foo' from global config (was 'bar'). [16:57:49 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit (global) foo = (local) foo = baz [16:57:51 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19413 $ ./bin/arc set-config --local foo '' Deleted key 'foo' from local config (was 'baz'). [16:58:05 Tue Jun 12 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19414 $ ./bin/arc get-config (global) default = https://phabricator.fb.com/conduit #testing getConfigFromAnySource by means of lint [11:26:57 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19612 $ ./bin/arc set-config lint.engine BogusLintEngine Set key 'lint.engine' = 'BogusLintEngine' in global config. [11:30:04 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19613 $ ./bin/arc set-config --local lint.engine DummyLintEngine Set key 'lint.engine' = 'DummyLintEngine' in local config. [11:30:19 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint Exception Failed to load symbol 'DummyLintEngine'. If this symbol was recently added or moved, your library map may be out of date. You can rebuild the map by running 'arc liberate'. For more information, see: http://www.phabricator.com/docs/phabricator/article/libphutil_Libraries_User_Guide.html (Run with --trace for a full exception trace.) [11:30:25 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19586 $ ./bin/arc set-config --local lint.engine '' Deleted key 'lint.engine' from local config (was 'DummyLintEngine'). [11:30:34 Wed Jun 13 2012] dschleimer@dev4022.snc6 ~/devtools/arcanist arcanist local_config 19587 $ ./bin/arc lint OKAY No lint warnings. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1233 Differential Revision: https://secure.phabricator.com/D2739
2012-06-13 16:02:29 -07:00
}
return $pval;
2011-01-09 15:22:25 -08:00
}
/**
* Sets a runtime config value that takes precedence over any static
* config values.
*
* @param key Key to set.
* @param value The value of the key.
*
* @task config
*/
public function setRuntimeConfig($key, $value) {
$this->runtimeConfig[$key] = $value;
return $this;
}
2011-01-09 15:22:25 -08:00
}