mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-26 08:42:40 +01:00
Push to staging areas when running "arc diff"
Summary: Ref T8238. If a staging area is configured for a repository (see D13019), push a copy of changes to it after creating a diff. Test Plan: Ran `arc diff` with various options, saw applicable changes get pushed to staging. Reviewers: btrahan Reviewed By: btrahan Subscribers: cburroughs, epriestley Maniphest Tasks: T8238 Differential Revision: https://secure.phabricator.com/D13020
This commit is contained in:
parent
a36dc81715
commit
3ac80200e2
2 changed files with 115 additions and 0 deletions
|
@ -370,6 +370,9 @@ EOTEXT
|
||||||
'skip-binaries' => array(
|
'skip-binaries' => array(
|
||||||
'help' => pht('Do not upload binaries (like images).'),
|
'help' => pht('Do not upload binaries (like images).'),
|
||||||
),
|
),
|
||||||
|
'skip-staging' => array(
|
||||||
|
'help' => pht('Do not copy changes to the staging area.'),
|
||||||
|
),
|
||||||
'ignore-unsound-tests' => array(
|
'ignore-unsound-tests' => array(
|
||||||
'help' => pht('Ignore unsound test failures without prompting.'),
|
'help' => pht('Ignore unsound test failures without prompting.'),
|
||||||
),
|
),
|
||||||
|
@ -517,6 +520,8 @@ EOTEXT
|
||||||
'unitResult' => $unit_result,
|
'unitResult' => $unit_result,
|
||||||
));
|
));
|
||||||
|
|
||||||
|
$this->pushChangesToStagingArea($this->diffID);
|
||||||
|
|
||||||
$this->updateLintDiffProperty();
|
$this->updateLintDiffProperty();
|
||||||
$this->updateUnitDiffProperty();
|
$this->updateUnitDiffProperty();
|
||||||
$this->updateLocalDiffProperty();
|
$this->updateLocalDiffProperty();
|
||||||
|
@ -2604,4 +2609,85 @@ EOTEXT
|
||||||
return $this->getArgument('browse');
|
return $this->getArgument('browse');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function pushChangesToStagingArea($id) {
|
||||||
|
if ($this->getArgument('skip-staging')) {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('SKIP STAGING'),
|
||||||
|
pht('Flag --skip-staging was specified.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->isRawDiffSource()) {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('SKIP STAGING'),
|
||||||
|
pht('Raw changes can not be pushed to a staging area.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->getRepositoryPHID()) {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('SKIP STAGING'),
|
||||||
|
pht('Unable to determine repository for this change.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$staging = $this->getRepositoryStagingConfiguration();
|
||||||
|
if ($staging === null) {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('SKIP STAGING'),
|
||||||
|
pht('The server does not support staging areas.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$supported = idx($staging, 'supported');
|
||||||
|
if (!$supported) {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('SKIP STAGING'),
|
||||||
|
pht('Phabricator does not support staging areas for this repository.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$staging_uri = idx($staging, 'uri');
|
||||||
|
if (!$staging_uri) {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('SKIP STAGING'),
|
||||||
|
pht('No staging area is configured for this repository.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$api = $this->getRepositoryAPI();
|
||||||
|
if (!($api instanceof ArcanistGitAPI)) {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('SKIP STAGING'),
|
||||||
|
pht('This client version does not support staging this repository.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$commit = $api->getHeadCommit();
|
||||||
|
$prefix = idx($staging, 'prefix', 'phabricator');
|
||||||
|
$tag = $prefix.'/diff/'.$id;
|
||||||
|
|
||||||
|
$this->writeOkay(
|
||||||
|
pht('PUSH STAGING'),
|
||||||
|
pht('Pushing changes to staging area...'));
|
||||||
|
|
||||||
|
$err = phutil_passthru(
|
||||||
|
'git push --no-verify -- %s %s:refs/tags/%s',
|
||||||
|
$staging_uri,
|
||||||
|
$commit,
|
||||||
|
$tag);
|
||||||
|
|
||||||
|
if ($err) {
|
||||||
|
$this->writeWarn(
|
||||||
|
pht('STAGING FAILED'),
|
||||||
|
pht('Unable to push changes to the staging area.'));
|
||||||
|
} else {
|
||||||
|
$this->writeOkay(
|
||||||
|
pht('STAGING PUSHED'),
|
||||||
|
pht(
|
||||||
|
'Pushed a copy of the changes to tag "%s" in the staging area.',
|
||||||
|
$tag));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1338,6 +1338,30 @@ abstract class ArcanistWorkflow extends Phobject {
|
||||||
fwrite(STDERR, $msg);
|
fwrite(STDERR, $msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final protected function writeInfo($title, $message) {
|
||||||
|
$this->writeStatusMessage(
|
||||||
|
phutil_console_format(
|
||||||
|
"<bg:blue>** %s **</bg> %s\n",
|
||||||
|
$title,
|
||||||
|
$message));
|
||||||
|
}
|
||||||
|
|
||||||
|
final protected function writeWarn($title, $message) {
|
||||||
|
$this->writeStatusMessage(
|
||||||
|
phutil_console_format(
|
||||||
|
"<bg:yellow>** %s **</bg> %s\n",
|
||||||
|
$title,
|
||||||
|
$message));
|
||||||
|
}
|
||||||
|
|
||||||
|
final protected function writeOkay($title, $message) {
|
||||||
|
$this->writeStatusMessage(
|
||||||
|
phutil_console_format(
|
||||||
|
"<bg:green>** %s **</bg> %s\n",
|
||||||
|
$title,
|
||||||
|
$message));
|
||||||
|
}
|
||||||
|
|
||||||
final protected function isHistoryImmutable() {
|
final protected function isHistoryImmutable() {
|
||||||
$repository_api = $this->getRepositoryAPI();
|
$repository_api = $this->getRepositoryAPI();
|
||||||
|
|
||||||
|
@ -1669,6 +1693,11 @@ abstract class ArcanistWorkflow extends Phobject {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
final protected function getRepositoryStagingConfiguration() {
|
||||||
|
return idx($this->getRepositoryInformation(), 'staging');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get human-readable reasoning explaining how `arc` evaluated which
|
* Get human-readable reasoning explaining how `arc` evaluated which
|
||||||
* Phabricator repository corresponds to this working copy. Used by
|
* Phabricator repository corresponds to this working copy. Used by
|
||||||
|
|
Loading…
Reference in a new issue