Example #1
0
 private function generateAffectedPaths()
 {
     if ($this->isRawDiffSource()) {
         return array();
     }
     $repository_api = $this->getRepositoryAPI();
     if ($repository_api instanceof ArcanistSubversionAPI) {
         $file_list = new FileList($this->getArgument('paths', array()));
         $paths = $repository_api->getSVNStatus($externals = true);
         foreach ($paths as $path => $mask) {
             if (!$file_list->contains($repository_api->getPath($path), true)) {
                 unset($paths[$path]);
             }
         }
         $warn_externals = array();
         foreach ($paths as $path => $mask) {
             $any_mod = $mask & ArcanistRepositoryAPI::FLAG_ADDED || $mask & ArcanistRepositoryAPI::FLAG_MODIFIED || $mask & ArcanistRepositoryAPI::FLAG_DELETED;
             if ($mask & ArcanistRepositoryAPI::FLAG_EXTERNALS) {
                 unset($paths[$path]);
                 if ($any_mod) {
                     $warn_externals[] = $path;
                 }
             }
         }
         if ($warn_externals && !$this->hasWarnedExternals) {
             echo phutil_console_format("%s\n\n%s\n\n", pht("The working copy includes changes to '%s' paths. These " . "changes will not be included in the diff because SVN can not " . "commit 'svn:externals' changes alongside normal changes.", 'svn:externals'), pht("Modified '%s' files:", 'svn:externals'), phutil_console_wrap(implode("\n", $warn_externals), 8));
             $prompt = pht('Generate a diff (with just local changes) anyway?');
             if (!phutil_console_confirm($prompt)) {
                 throw new ArcanistUserAbortException();
             } else {
                 $this->hasWarnedExternals = true;
             }
         }
     } else {
         $paths = $repository_api->getWorkingCopyStatus();
     }
     foreach ($paths as $path => $mask) {
         if ($mask & ArcanistRepositoryAPI::FLAG_UNTRACKED) {
             unset($paths[$path]);
         }
     }
     return $paths;
 }
 /**
  * Test whether a path is descendant from some root path after resolving all
  * symlinks and removing artifacts. Both paths must exists for the relation
  * to obtain. A path is always a descendant of itself as long as it exists.
  *
  * @param  string   Child path, absolute or relative to PWD.
  * @param  string   Root path, absolute or relative to PWD.
  * @return bool     True if resolved child path is in fact a descendant of
  *                  resolved root path and both exist.
  * @task   path
  */
 public static function isDescendant($path, $root)
 {
     try {
         self::assertExists($path);
         self::assertExists($root);
     } catch (FilesystemException $e) {
         return false;
     }
     $fs = new FileList(array($root));
     return $fs->contains($path);
 }