@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add `repository list-paths` and `repository move-paths`

Summary: Ref T7149. These formalize the local path adjustment step for cluster imports, rather than relying on an ad-hoc script.

Test Plan: Used `list-paths` and `move-paths` to list and move repositories.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T7149

Differential Revision: https://secure.phabricator.com/D13621

+200
+4
src/__phutil_library_map__.php
··· 2572 2572 'PhabricatorRepositoryManagementDiscoverWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php', 2573 2573 'PhabricatorRepositoryManagementEditWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementEditWorkflow.php', 2574 2574 'PhabricatorRepositoryManagementImportingWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementImportingWorkflow.php', 2575 + 'PhabricatorRepositoryManagementListPathsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListPathsWorkflow.php', 2575 2576 'PhabricatorRepositoryManagementListWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListWorkflow.php', 2576 2577 'PhabricatorRepositoryManagementLookupUsersWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementLookupUsersWorkflow.php', 2577 2578 'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMarkImportedWorkflow.php', 2578 2579 'PhabricatorRepositoryManagementMirrorWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMirrorWorkflow.php', 2580 + 'PhabricatorRepositoryManagementMovePathsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php', 2579 2581 'PhabricatorRepositoryManagementParentsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php', 2580 2582 'PhabricatorRepositoryManagementPullWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementPullWorkflow.php', 2581 2583 'PhabricatorRepositoryManagementRefsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementRefsWorkflow.php', ··· 6438 6440 'PhabricatorRepositoryManagementDiscoverWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6439 6441 'PhabricatorRepositoryManagementEditWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6440 6442 'PhabricatorRepositoryManagementImportingWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6443 + 'PhabricatorRepositoryManagementListPathsWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6441 6444 'PhabricatorRepositoryManagementListWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6442 6445 'PhabricatorRepositoryManagementLookupUsersWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6443 6446 'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6444 6447 'PhabricatorRepositoryManagementMirrorWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6448 + 'PhabricatorRepositoryManagementMovePathsWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6445 6449 'PhabricatorRepositoryManagementParentsWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6446 6450 'PhabricatorRepositoryManagementPullWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 6447 6451 'PhabricatorRepositoryManagementRefsWorkflow' => 'PhabricatorRepositoryManagementWorkflow',
+50
src/applications/repository/management/PhabricatorRepositoryManagementListPathsWorkflow.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryManagementListPathsWorkflow 4 + extends PhabricatorRepositoryManagementWorkflow { 5 + 6 + protected function didConstruct() { 7 + $this 8 + ->setName('list-paths') 9 + ->setSynopsis(pht('List repository local paths.')) 10 + ->setArguments(array()); 11 + } 12 + 13 + public function execute(PhutilArgumentParser $args) { 14 + $console = PhutilConsole::getConsole(); 15 + 16 + $repos = id(new PhabricatorRepositoryQuery()) 17 + ->setViewer($this->getViewer()) 18 + ->execute(); 19 + if (!$repos) { 20 + $console->writeErr("%s\n", pht('There are no repositories.')); 21 + return 0; 22 + } 23 + 24 + $table = id(new PhutilConsoleTable()) 25 + ->addColumn( 26 + 'monogram', 27 + array( 28 + 'title' => pht('Repository'), 29 + )) 30 + ->addColumn( 31 + 'path', 32 + array( 33 + 'title' => pht('Path'), 34 + )) 35 + ->setBorders(true); 36 + 37 + foreach ($repos as $repo) { 38 + $table->addRow( 39 + array( 40 + 'monogram' => $repo->getMonogram(), 41 + 'path' => $repo->getLocalPath(), 42 + )); 43 + } 44 + 45 + $table->draw(); 46 + 47 + return 0; 48 + } 49 + 50 + }
+146
src/applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryManagementMovePathsWorkflow 4 + extends PhabricatorRepositoryManagementWorkflow { 5 + 6 + protected function didConstruct() { 7 + $this 8 + ->setName('move-paths') 9 + ->setSynopsis(pht('Move repository local paths.')) 10 + ->setArguments( 11 + array( 12 + array( 13 + 'name' => 'from', 14 + 'param' => 'prefix', 15 + 'help' => pht('Move paths with this prefix.'), 16 + ), 17 + array( 18 + 'name' => 'to', 19 + 'param' => 'prefix', 20 + 'help' => pht('Replace matching prefixes with this string.'), 21 + ), 22 + )); 23 + } 24 + 25 + public function execute(PhutilArgumentParser $args) { 26 + $console = PhutilConsole::getConsole(); 27 + 28 + $repos = id(new PhabricatorRepositoryQuery()) 29 + ->setViewer($this->getViewer()) 30 + ->execute(); 31 + if (!$repos) { 32 + $console->writeErr("%s\n", pht('There are no repositories.')); 33 + return 0; 34 + } 35 + 36 + $from = $args->getArg('from'); 37 + if (!strlen($from)) { 38 + throw new Exception( 39 + pht( 40 + 'You must specify a path prefix to move from with --from.')); 41 + } 42 + 43 + $to = $args->getArg('to'); 44 + if (!strlen($to)) { 45 + throw new Exception( 46 + pht( 47 + 'You must specify a path prefix to move to with --to.')); 48 + } 49 + 50 + $rows = array(); 51 + 52 + $any_changes = false; 53 + foreach ($repos as $repo) { 54 + $src = $repo->getLocalPath(); 55 + 56 + $row = array( 57 + 'repository' => $repo, 58 + 'move' => false, 59 + 'monogram' => $repo->getMonogram(), 60 + 'src' => $src, 61 + 'dst' => '', 62 + ); 63 + 64 + if (strncmp($src, $from, strlen($from))) { 65 + $row['action'] = pht('Ignore'); 66 + } else { 67 + $dst = $to.substr($src, strlen($from)); 68 + 69 + $row['action'] = phutil_console_format('**%s**', pht('Move')); 70 + $row['dst'] = $dst; 71 + $row['move'] = true; 72 + $any_changes = true; 73 + } 74 + 75 + $rows[] = $row; 76 + } 77 + 78 + $table = id(new PhutilConsoleTable()) 79 + ->addColumn( 80 + 'action', 81 + array( 82 + 'title' => pht('Action'), 83 + )) 84 + ->addColumn( 85 + 'monogram', 86 + array( 87 + 'title' => pht('Repository'), 88 + )) 89 + ->addColumn( 90 + 'src', 91 + array( 92 + 'title' => pht('Src'), 93 + )) 94 + ->addColumn( 95 + 'dst', 96 + array( 97 + 'title' => pht('dst'), 98 + )) 99 + ->setBorders(true); 100 + 101 + foreach ($rows as $row) { 102 + $display = array_select_keys( 103 + $row, 104 + array( 105 + 'action', 106 + 'monogram', 107 + 'src', 108 + 'dst', 109 + )); 110 + $table->addRow($display); 111 + } 112 + 113 + $table->draw(); 114 + 115 + if (!$any_changes) { 116 + $console->writeOut(pht('No matching repositories.')."\n"); 117 + return 0; 118 + } 119 + 120 + $prompt = pht('Apply these changes?'); 121 + if (!phutil_console_confirm($prompt)) { 122 + throw new Exception(pht('Declining to apply changes.')); 123 + } 124 + 125 + foreach ($rows as $row) { 126 + if (empty($row['move'])) { 127 + continue; 128 + } 129 + 130 + $repo = $row['repository']; 131 + $details = $repo->getDetails(); 132 + $details['local-path'] = $row['dst']; 133 + 134 + queryfx( 135 + $repo->establishConnection('w'), 136 + 'UPDATE %T SET details = %s WHERE id = %d', 137 + $repo->getTableName(), 138 + phutil_json_encode($details), 139 + $repo->getID()); 140 + } 141 + 142 + $console->writeOut(pht('Applied changes.')."\n"); 143 + return 0; 144 + } 145 + 146 + }