Changeset View
Changeset View
Standalone View
Standalone View
src/workingcopy/ArcanistSubversionWorkingCopy.php
- This file was added.
| <?php | |||||
| final class ArcanistSubversionWorkingCopy | |||||
| extends ArcanistWorkingCopy { | |||||
| public function getProjectConfigurationFilePath() { | |||||
| // In Subversion, we allow ".arcconfig" to appear at any level of the | |||||
| // filesystem between the working directory and the working copy root. | |||||
| // We allow this because Subversion repositories are hierarchical and | |||||
| // may have a "projects/xyz/" directory which is meaningfully an entirely | |||||
| // different project from "projects/abc/". | |||||
| // You can checkout "projects/" and have the ".svn/" directory appear | |||||
| // there, then change into "abc/" and expect "arc" to operate within the | |||||
| // context of the "abc/" project. | |||||
| $paths = Filesystem::walkToRoot($this->getWorkingDirectory()); | |||||
| $root = $this->getPath(); | |||||
| foreach ($paths as $path) { | |||||
| if (!Filesystem::isDescendant($path, $root)) { | |||||
| break; | |||||
| } | |||||
| $candidate = $path.'/.arcconfig'; | |||||
| if (Filesystem::pathExists($candidate)) { | |||||
| return $candidate; | |||||
| } | |||||
| } | |||||
| return parent::getProjectConfigurationFilePath(); | |||||
| } | |||||
| public function getMetadataDirectory() { | |||||
| return $this->getPath('.svn'); | |||||
| } | |||||
| protected function newWorkingCopyFromDirectories( | |||||
| $working_directory, | |||||
| $ancestor_directory) { | |||||
| if (!Filesystem::pathExists($ancestor_directory.'/.svn')) { | |||||
| return null; | |||||
| } | |||||
| return new self(); | |||||
| } | |||||
| protected function selectFromNestedWorkingCopies(array $candidates) { | |||||
| // To select the best working copy in Subversion, we first walk up the | |||||
| // tree looking for a working copy with an ".arcconfig" file. If we find | |||||
| // one, this anchors us. | |||||
| foreach (array_reverse($candidates) as $candidate) { | |||||
| $arcconfig = $candidate->getPath('.arcconfig'); | |||||
| if (Filesystem::pathExists($arcconfig)) { | |||||
| return $candidate; | |||||
| } | |||||
| } | |||||
| // If we didn't find one, we select the outermost working copy. This is | |||||
| // because older versions of Subversion (prior to 1.7) put a ".svn" file | |||||
| // in every directory, and all versions of Subversion allow you to check | |||||
| // out any subdirectory of the project as a working copy. | |||||
| // We could possibly refine this by testing if the working copy was made | |||||
| // with a recent version of Subversion and picking the deepest working copy | |||||
| // if it was, similar to Git and Mercurial. | |||||
| return head($candidates); | |||||
| } | |||||
| public function newRepositoryAPI() { | |||||
| return new ArcanistSubversionAPI($this->getPath()); | |||||
| } | |||||
| } | |||||