diff --git a/src/repository/api/ArcanistGitAPI.php b/src/repository/api/ArcanistGitAPI.php index e9a170c5..9aedfbf1 100644 --- a/src/repository/api/ArcanistGitAPI.php +++ b/src/repository/api/ArcanistGitAPI.php @@ -527,6 +527,12 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { return $files; } + public function getAllFiles() { + $future = $this->buildLocalFuture(array('ls-files -z')); + return id(new LinesOfALargeExecFuture($future)) + ->setDelimiter("\0"); + } + public function getBlame($path) { // TODO: 'git blame' supports --porcelain and we should probably use it. list($stdout) = $this->execxLocal( diff --git a/src/repository/api/ArcanistMercurialAPI.php b/src/repository/api/ArcanistMercurialAPI.php index 83d94d4d..749f753f 100644 --- a/src/repository/api/ArcanistMercurialAPI.php +++ b/src/repository/api/ArcanistMercurialAPI.php @@ -245,6 +245,12 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { return $this->localCommitInfo; } + public function getAllFiles() { + // TODO: Handle paths with newlines. + $future = $this->buildLocalFuture(array('manifest')); + return new LinesOfALargeExecFuture($future); + } + public function getBlame($path) { list($stdout) = $this->execxLocal( 'annotate -u -v -c --rev %s -- %s', diff --git a/src/repository/api/ArcanistRepositoryAPI.php b/src/repository/api/ArcanistRepositoryAPI.php index d177ca14..2c0469db 100644 --- a/src/repository/api/ArcanistRepositoryAPI.php +++ b/src/repository/api/ArcanistRepositoryAPI.php @@ -148,6 +148,11 @@ abstract class ArcanistRepositoryAPI { } } + /** + * @return Traversable + */ + abstract public function getAllFiles(); + abstract public function getBlame($path); abstract public function getWorkingCopyStatus(); abstract public function getRawDiffText($path); diff --git a/src/repository/api/ArcanistSubversionAPI.php b/src/repository/api/ArcanistSubversionAPI.php index ab028586..a57c891a 100644 --- a/src/repository/api/ArcanistSubversionAPI.php +++ b/src/repository/api/ArcanistSubversionAPI.php @@ -465,6 +465,22 @@ Index: {$path} EODIFF; } + public function getAllFiles() { + // TODO: Handle paths with newlines. + $future = $this->buildLocalFuture(array('list -R')); + return new PhutilCallbackFilterIterator( + new LinesOfALargeExecFuture($future), + array($this, 'filterFiles')); + } + + public function filterFiles($path) { + // NOTE: SVN uses '/' also on Windows. + if ($path == '' || substr($path, -1) == '/') { + return null; + } + return $path; + } + public function getBlame($path) { $blame = array();