Skip to content

Commit

Permalink
"arc upgrade", to automatically upgrade arc (client changes)
Browse files Browse the repository at this point in the history
Summary:
  - Try to limit the pain of //future// version bumps by making arc self-updating.
  - When the server needs a newer version, prompt the user to update.
  - (We need them to reissue their command because we may already have loaded classes which have changed in the update.)
  - Make the message sound exciting!

Test Plan: Artifically bumped server forward, ran "arc list", got to upgrade!

Reviewers: Makinde, nh, jungejason, btrahan

Reviewed By: nh

CC: aran

Differential Revision: https://secure.phabricator.com/D2435
  • Loading branch information
epriestley committed May 9, 2012
1 parent b349150 commit 19aa759
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/__phutil_library_map__.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@
'ArcanistUncommittedChangesException' => 'exception/usage/uncommittedchanges',
'ArcanistUnitTestResult' => 'unit/result',
'ArcanistUnitWorkflow' => 'workflow/unit',
'ArcanistUpgradeWorkflow' => 'workflow/upgrade',
'ArcanistUploadWorkflow' => 'workflow/upload',
'ArcanistUsageException' => 'exception/usage',
'ArcanistUserAbortException' => 'exception/usage/userabort',
Expand Down Expand Up @@ -185,6 +186,7 @@
'ArcanistTextLinterTestCase' => 'ArcanistLinterTestCase',
'ArcanistUncommittedChangesException' => 'ArcanistUsageException',
'ArcanistUnitWorkflow' => 'ArcanistBaseWorkflow',
'ArcanistUpgradeWorkflow' => 'ArcanistBaseWorkflow',
'ArcanistUploadWorkflow' => 'ArcanistBaseWorkflow',
'ArcanistUserAbortException' => 'ArcanistUsageException',
'ArcanistWhichWorkflow' => 'ArcanistBaseWorkflow',
Expand Down
24 changes: 24 additions & 0 deletions src/workflow/base/ArcanistBaseWorkflow.php
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,30 @@ final public function authenticateConduit() {
"\n".
$ex->getMessage();
throw new ArcanistUsageException($message);
} else if ($ex->getErrorCode() == 'NEW-ARC-VERSION') {

// Cleverly disguise this as being AWESOME!!!

echo phutil_console_format("**New Version Available!**\n\n");
echo phutil_console_wrap($ex->getMessage());
echo "\n\n";
echo "In most cases, arc can be upgraded automatically.\n";

$ok = phutil_console_confirm(
"Upgrade arc now?",
$default_no = false);
if (!$ok) {
throw $ex;
}

$root = dirname(phutil_get_library_root('arcanist'));

chdir($root);
$err = phutil_passthru('%s upgrade', $root.'/bin/arc');
if (!$err) {
echo "\nTry running your arc command again.\n";
}
exit(1);
} else {
throw $ex;
}
Expand Down
87 changes: 87 additions & 0 deletions src/workflow/upgrade/ArcanistUpgradeWorkflow.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

/*
* Copyright 2012 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
* Upgrade arcanist itself.
*
* @group workflow
*/
final class ArcanistUpgradeWorkflow extends ArcanistBaseWorkflow {

public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT
**upgrade**
EOTEXT
);
}

public function getCommandHelp() {
return phutil_console_format(<<<EOTEXT
Supports: cli
Upgrade arc to the latest version.
EOTEXT
);
}

public function getArguments() {
return array();
}

public function run() {
echo "Upgrading arc...\n";
$root = dirname(phutil_get_library_root('arcanist'));

if (!Filesystem::pathExists($root.'/.git')) {
throw new ArcanistUsageException(
"arc must be in its git working copy to be automatically upgraded. ".
"This copy of arc (in '{$root}') is not in a git working copy.");
}

$working_copy = ArcanistWorkingCopyIdentity::newFromPath($root);

$repository_api = ArcanistRepositoryAPI::newAPIFromWorkingCopyIdentity(
$working_copy);
$this->setRepositoryAPI($repository_api);

// Require no local changes.
$this->requireCleanWorkingCopy();

// Require arc be on master.
$branch_name = $repository_api->getBranchName();
if ($branch_name != 'master') {
throw new ArcanistUsageException(
"arc must be on branch 'master' to be automatically upgraded. ".
"This copy of arc (in '{$root}') is on branch '{$branch_name}'.");
}

chdir($root);
try {
phutil_passthru('git pull --rebase');
} catch (Exception $ex) {
phutil_passthru('git rebase --abort');
throw $ex;
}

echo phutil_console_wrap(
phutil_console_format(
"**Updated!** Your copy of arc is now up to date.\n"));

return 0;
}

}
20 changes: 20 additions & 0 deletions src/workflow/upgrade/__init__.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/



phutil_require_module('arcanist', 'exception/usage');
phutil_require_module('arcanist', 'repository/api/base');
phutil_require_module('arcanist', 'workflow/base');
phutil_require_module('arcanist', 'workingcopyidentity');

phutil_require_module('phutil', 'console');
phutil_require_module('phutil', 'filesystem');
phutil_require_module('phutil', 'future/exec');
phutil_require_module('phutil', 'moduleutils');


phutil_require_source('ArcanistUpgradeWorkflow.php');

0 comments on commit 19aa759

Please sign in to comment.