From e573610ce4117b6b69d95b54e6b4014d5d68f485 Mon Sep 17 00:00:00 2001 From: durham Date: Sun, 14 Apr 2013 11:48:22 -0700 Subject: [PATCH] Add arc.land.update.default config for setting the default strategy Summary: This adds a arcconfig setting to allow specifying whether to use the merge or rebase strategy when doing the feature branch update. arc.land.update.default can be set to either 'rebase' or 'merge'. The command line flags will override this setting. We have had trouble with arc land producing merge commits (introduced with D4080) in git. They usually appear when arc land fails, and our users are confused by the presence of a merge commit afterwards. Today it got even worse since a user managed to get arc land to push the merge commit to the server. This setting will allow us to turn it off for our uses. Test Plan: Verified the following combinations: update.default not set + arc land (saw git merge in the trace) update.default = 'rebase' + arc land (saw git rebase) update.default = 'merge' + arc land (saw git merge) update.default = 'rebase' + arc land --update-with-merge (saw git merge) update.default = 'merge' + arc land --update-with-rebase (saw git rebase) Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Differential Revision: https://secure.phabricator.com/D5683 --- src/configuration/ArcanistSettings.php | 14 ++++++++++ src/workflow/ArcanistLandWorkflow.php | 38 +++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/configuration/ArcanistSettings.php b/src/configuration/ArcanistSettings.php index 4867f980..58a9642a 100644 --- a/src/configuration/ArcanistSettings.php +++ b/src/configuration/ArcanistSettings.php @@ -48,6 +48,13 @@ final class ArcanistSettings { 'engine is specified by the current project.', 'example' => '"ExampleUnitTestEngine"', ), + 'arc.feature.start.default' => array( + 'type' => 'string', + 'help' => + 'The name of the default branch to create the new feature branch '. + 'off of.', + 'example' => '"develop"', + ), 'arc.land.onto.default' => array( 'type' => 'string', 'help' => @@ -55,6 +62,13 @@ final class ArcanistSettings { '`arc land` is run.', 'example' => '"develop"', ), + 'arc.land.update.default' => array( + 'type' => 'string', + 'help' => + 'The default strategy to use when arc land updates the feature '. + 'branch. Supports \'rebase\' and \'merge\' strategies.', + 'example' => '"rebase"', + ), 'history.immutable' => array( 'type' => 'bool', 'legacy' => 'immutable_history', diff --git a/src/workflow/ArcanistLandWorkflow.php b/src/workflow/ArcanistLandWorkflow.php index 65b37c02..69e2f8f0 100644 --- a/src/workflow/ArcanistLandWorkflow.php +++ b/src/workflow/ArcanistLandWorkflow.php @@ -121,10 +121,29 @@ EOTEXT ), ), 'update-with-rebase' => array( - 'help' => 'When updating the feature branch, use rebase intead of '. - 'merge. This might make things work better in some cases.', + 'help' => 'When updating the feature branch, use rebase instead of '. + 'merge. This might make things work better in some cases.'. + 'Set arc.land.update.default to \'rebase\' to make this '. + 'default.', 'conflicts' => array( 'merge' => 'The --merge strategy does not update the feature branch.', + 'update-with-merge' => 'Cannot be used with --update-with-merge.', + ), + 'supports' => array( + 'git', + ), + ), + 'update-with-merge' => array( + 'help' => 'When updating the feature branch, use merge instead of '. + 'rebase. This is the default behavior. '. + 'Setting arc.land.update.default to \'merge\' can also '. + 'be used to make this the default.', + 'conflicts' => array( + 'merge' => 'The --merge strategy does not update the feature branch.', + 'update-with-rebase' => 'Cannot be used with --update-with-rebase.', + ), + 'supports' => array( + 'git', ), ), 'revision' => array( @@ -222,7 +241,18 @@ EOTEXT } $this->branch = head($branch); $this->keepBranch = $this->getArgument('keep-branch'); - $this->shouldUpdateWithRebase = $this->getArgument('update-with-rebase'); + + $working_copy = $this->getWorkingCopy(); + $update_strategy = $working_copy->getConfigFromAnySource( + 'arc.land.update.default', + 'merge'); + $this->shouldUpdateWithRebase = $update_strategy == 'rebase'; + if ($this->getArgument('update-with-rebase')) { + $this->shouldUpdateWithRebase = true; + } else if ($this->getArgument('update-with-merge')) { + $this->shouldUpdateWithRebase = false; + } + $this->preview = $this->getArgument('preview'); if (!$this->branchType) { @@ -231,7 +261,7 @@ EOTEXT $onto_default = $this->isGit ? 'master' : 'default'; $onto_default = nonempty( - $this->getWorkingCopy()->getConfigFromAnySource('arc.land.onto.default'), + $working_copy->getConfigFromAnySource('arc.land.onto.default'), $onto_default); $this->onto = $this->getArgument('onto', $onto_default); $this->ontoType = $this->getBranchType($this->onto);