1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-12-22 21:40:54 +01:00

[Arcanist] move scratch directory into the vcs metadata directory

Summary:
Using .arc as the scratch and per-repository configuration directory
has some unfortunate consequenses in the real world.  Among other
things, people forget to .gitignore it so it gets checked in.

Test Plan:
the only thing that seems to use this is the relative commit setting
for git.  This diff consists of 2 commits, one for the .gitignore and
one for everything else.

Comment out the portion of my .git/config that defines the upstream
for the branch.  Run arc diff --only with HEAD^ in
.arc/default-relative-commit.  See that .gitignore is not included in
the resultant diff, that .arc no longer exists, and that .git/arc
exists and has HEAD^ in .git/arc/default-relative-commit.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T1233

Differential Revision: https://secure.phabricator.com/D2725
This commit is contained in:
dschleimer 2012-06-12 12:39:15 -07:00
parent 6d98ac0e3d
commit 1100e8768a
5 changed files with 40 additions and 3 deletions

1
.gitignore vendored
View file

@ -3,4 +3,3 @@
/src/.phutil_module_cache
/docs/
/.divinercache/
/.arc/

View file

@ -53,6 +53,10 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI {
return 'git';
}
public function getMetadataPath() {
return $this->getPath('.git');
}
public function getHasCommits() {
return !$this->repositoryHasNoCommits;
}
@ -192,7 +196,7 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI {
if ($default_relative) {
$this->relativeExplanation =
"it is the merge-base of '{$default_relative}' and HEAD, as ".
"specified in '.arc/default-relative-commit'.";
"specified in '.git/arc/default-relative-commit'.";
}
}

View file

@ -58,6 +58,10 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
return 'hg';
}
public function getMetadataPath() {
return $this->getPath('.hg');
}
public function getSourceControlBaseRevision() {
return $this->getCanonicalRevisionName($this->getRelativeCommit());
}

View file

@ -175,6 +175,7 @@ abstract class ArcanistRepositoryAPI {
abstract public function supportsRelativeLocalCommits();
abstract public function getWorkingCopyRevision();
abstract public function updateWorkingCopy();
abstract public function getMetadataPath();
abstract public function loadWorkingCopyDifferentialRevisions(
ConduitClient $conduit,
array $query);
@ -353,7 +354,32 @@ abstract class ArcanistRepositoryAPI {
* @task scratch
*/
public function getScratchFilePath($path) {
return $this->getPath('.arc/'.$path);
$new_scratch_path = Filesystem::resolvePath(
'arc',
$this->getMetadataPath());
static $checked = false;
if (!$checked) {
$checked = true;
$old_scratch_path = $this->getPath('.arc');
// we only want to do the migration once
// unfortunately, people have checked in .arc directories which
// means that the old one may get recreated after we delete it
if (Filesystem::pathExists($old_scratch_path) &&
!Filesystem::pathExists($new_scratch_path)) {
Filesystem::createDirectory($new_scratch_path);
$existing_files = Filesystem::listDirectory($old_scratch_path, true);
foreach ($existing_files as $file) {
$new_path = Filesystem::resolvePath($file, $new_scratch_path);
$old_path = Filesystem::resolvePath($file, $old_scratch_path);
Filesystem::writeFile(
$new_path,
Filesystem::readFile($old_path));
}
Filesystem::remove($old_scratch_path);
}
}
return Filesystem::resolvePath($path, $new_scratch_path);
}
}

View file

@ -36,6 +36,10 @@ final class ArcanistSubversionAPI extends ArcanistRepositoryAPI {
return 'svn';
}
public function getMetadataPath() {
return $this->getPath('.svn');
}
protected function buildLocalFuture(array $argv) {
$argv[0] = 'svn '.$argv[0];