From acf5350221c28b29e1595723202eb2fbb09e6723 Mon Sep 17 00:00:00 2001 From: dschleimer Date: Mon, 25 Jun 2012 17:13:29 -0700 Subject: [PATCH] [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 --- src/repository/api/ArcanistSubversionAPI.php | 15 +++++++- .../ArcanistWorkingCopyIdentity.php | 36 +++++++++++++++---- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/repository/api/ArcanistSubversionAPI.php b/src/repository/api/ArcanistSubversionAPI.php index 0c165a62..eb1a2632 100644 --- a/src/repository/api/ArcanistSubversionAPI.php +++ b/src/repository/api/ArcanistSubversionAPI.php @@ -37,7 +37,20 @@ final class ArcanistSubversionAPI extends ArcanistRepositoryAPI { } public function getMetadataPath() { - return $this->getPath('.svn'); + static $svn_dir = null; + if ($svn_dir === null) { + // from svn 1.7, subversion keeps a single .svn directly under + // the working copy root. However, we allow .arcconfigs that + // aren't at the working copy root. + foreach (Filesystem::walkToRoot($this->getPath()) as $parent) { + $possible_svn_dir = Filesystem::resolvePath('.svn', $parent); + if (Filesystem::pathExists($possible_svn_dir)) { + $svn_dir = $possible_svn_dir; + break; + } + } + } + return $svn_dir; } protected function buildLocalFuture(array $argv) { diff --git a/src/workingcopyidentity/ArcanistWorkingCopyIdentity.php b/src/workingcopyidentity/ArcanistWorkingCopyIdentity.php index 3ab892a7..15e48a54 100644 --- a/src/workingcopyidentity/ArcanistWorkingCopyIdentity.php +++ b/src/workingcopyidentity/ArcanistWorkingCopyIdentity.php @@ -105,15 +105,37 @@ final class ArcanistWorkingCopyIdentity { '.hg', '.svn', ); + $found_meta_dir = false; foreach ($vc_dirs as $dir) { - $local_path = Filesystem::resolvePath( - $dir.'/arc/config', + $meta_path = Filesystem::resolvePath( + $dir, $this->projectRoot); - if (Filesystem::pathExists($local_path)) { - $file = Filesystem::readFile($local_path); - if ($file) { - $this->localConfig = json_decode($file, true); - break; + 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); + } } } }