Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2896313
ArcanistMergeWorkflow.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
4 KB
Referenced Files
None
Subscribers
None
ArcanistMergeWorkflow.php
View Options
<?php
/*
* Copyright 2011 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.
*/
/**
* Merges a branch using "git merge" or "hg merge", using a template commit
* message from Differential.
*
* @group workflow
*/
class
ArcanistMergeWorkflow
extends
ArcanistBaseWorkflow
{
public
function
getCommandHelp
(
)
{
return
phutil_console_format
(
<<<EOTEXT
**merge** [__branch__] [--revision __revision_id__] [--show]
Supports: git, hg
Execute a "git merge <branch>" or "hg merge --rev <branch>" of a
reviewed branch, but give the merge commit a useful commit message
with information from Differential.
In Git, this operates like "git merge <branch>" and should be executed
from the branch you want to merge __into__, just like "git merge".
Branch is required.
In Mercurial, this operates like "hg merge" (default) or
"hg merge --rev <branch>" and should be executed from the branch you
want to merge __from__, just like "hg merge". It will also effect an
"hg commit" with a rich commit message.
EOTEXT
)
;
}
public
function
requiresWorkingCopy
(
)
{
return
true
;
}
public
function
requiresConduit
(
)
{
return
true
;
}
public
function
requiresAuthentication
(
)
{
return
true
;
}
public
function
requiresRepositoryAPI
(
)
{
return
true
;
}
public
function
getArguments
(
)
{
return
array
(
'show'
=>
array
(
'help'
=>
"Don't merge, just show the commit message."
)
,
'revision'
=>
array
(
'param'
=>
'revision'
,
'help'
=>
"Use the message for a specific revision. If 'arc' can't figure "
.
"out which revision you want, you can tell it explicitly."
,
)
,
'*'
=>
'branch'
,
)
;
}
public
function
run
(
)
{
$this
->
writeStatusMessage
(
phutil_console_format
(
"**WARNING:** 'arc merge' is new and experimental.\n"
)
)
;
$repository_api
=
$this
->
getRepositoryAPI
(
)
;
if
(
!
$repository_api
->
supportsLocalBranchMerge
(
)
)
{
$name
=
$repository_api
->
getSourceControlSystemName
(
)
;
throw
new
ArcanistUsageException
(
"This source control system ('{$name}') does not support 'arc merge'."
)
;
}
if
(
$repository_api
->
getUncommittedChanges
(
)
)
{
throw
new
ArcanistUsageException
(
"You have uncommitted changes in this working copy. Commit "
.
"(or revert) them before proceeding."
)
;
}
$branch
=
$this
->
getArgument
(
'branch'
)
;
if
(
count
(
$branch
)
>
1
)
{
throw
new
ArcanistUsageException
(
"Specify only one branch to merge."
)
;
}
else
{
$branch
=
head
(
$branch
)
;
}
$conduit
=
$this
->
getConduit
(
)
;
$revisions
=
$conduit
->
callMethodSynchronous
(
'differential.find'
,
array
(
'guids'
=>
array
(
$this
->
getUserPHID
(
)
)
,
'query'
=>
'committable'
,
)
)
;
// TODO: Make an effort to guess which revision the user means here. Branch
// name is a very strong heuristic but Conduit doesn't make it easy to get
// right now. We now also have "commits:local" after D857. Between these
// we should be able to get this right automatically in essentially every
// reasonable case.
try
{
$revision
=
$this
->
chooseRevision
(
$revisions
,
$this
->
getArgument
(
'revision'
)
,
'Which revision do you want to merge?'
)
;
$revision_id
=
$revision
->
getID
(
)
;
}
catch
(
ArcanistChooseInvalidRevisionException
$ex
)
{
throw
new
ArcanistUsageException
(
"You can only merge Differential revisions which have been accepted."
)
;
}
catch
(
ArcanistChooseNoRevisionsException
$ex
)
{
throw
new
ArcanistUsageException
(
"You have no accepted Differential revisions."
)
;
}
$message
=
$conduit
->
callMethodSynchronous
(
'differential.getcommitmessage'
,
array
(
'revision_id'
=>
$revision_id
,
'edit'
=>
false
,
)
)
;
if
(
$this
->
getArgument
(
'show'
)
)
{
echo
$message
.
"\n"
;
}
else
{
$repository_api
->
performLocalBranchMerge
(
$branch
,
$message
)
;
echo
"Merged '{$branch}'.\n"
;
$done_message
=
$repository_api
->
getFinalizedRevisionMessage
(
)
;
echo
phutil_console_wrap
(
$done_message
.
"\n"
)
;
}
return
0
;
}
protected
function
getSupportedRevisionControlSystems
(
)
{
return
array
(
'git'
)
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Jan 19 2025, 22:53 (6 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1129603
Default Alt Text
ArcanistMergeWorkflow.php (4 KB)
Attached To
Mode
rARC Arcanist
Attached
Detach File
Event Timeline
Log In to Comment