Page Menu
Home
Sealhub
Search
Configure Global Search
Log In
Files
F969227
ArcanistCloseRevisionWorkflow.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Referenced Files
None
Subscribers
None
ArcanistCloseRevisionWorkflow.php
View Options
<?php
/**
* Explicitly closes Differential revisions.
*/
final
class
ArcanistCloseRevisionWorkflow
extends
ArcanistWorkflow
{
public
function
getWorkflowName
()
{
return
'close-revision'
;
}
public
function
getCommandSynopses
()
{
return
phutil_console_format
(
<<<EOTEXT
**close-revision** [__options__] __revision__
EOTEXT
);
}
public
function
getCommandHelp
()
{
return
phutil_console_format
(
<<<EOTEXT
Supports: git, hg, svn
Close a revision which has been committed (svn) or pushed (git, hg).
You should not normally need to do this: arc commit (svn), arc amend
(git, hg), arc land (git, hg), or repository tracking on the master
remote repository should do it for you. However, if these mechanisms
have failed for some reason you can use this command to manually
change a revision status from "Accepted" to "Closed".
EOTEXT
);
}
public
function
getArguments
()
{
return
array
(
'finalize'
=>
array
(
'help'
=>
pht
(
"Close only if the repository is untracked and the revision is "
.
"accepted. Continue even if the close can't happen. This is a soft "
.
"version of '' used by other workflows."
,
'close-revision'
),
),
'quiet'
=>
array
(
'help'
=>
pht
(
'Do not print a success message.'
),
),
'*'
=>
'revision'
,
);
}
public
function
requiresConduit
()
{
return
true
;
}
public
function
requiresAuthentication
()
{
return
true
;
}
public
function
requiresRepositoryAPI
()
{
// NOTE: Technically we only use this to generate the right message at
// the end, and you can even get the wrong message (e.g., if you run
// "arc close-revision D123" from a git repository, but D123 is an SVN
// revision). We could be smarter about this, but it's just display fluff.
return
true
;
}
public
function
run
()
{
$is_finalize
=
$this
->
getArgument
(
'finalize'
);
$conduit
=
$this
->
getConduit
();
$revision_list
=
$this
->
getArgument
(
'revision'
,
array
());
if
(!
$revision_list
)
{
throw
new
ArcanistUsageException
(
pht
(
'%s requires a revision number.'
,
'close-revision'
));
}
if
(
count
(
$revision_list
)
!=
1
)
{
throw
new
ArcanistUsageException
(
pht
(
'%s requires exactly one revision.'
,
'close-revision'
));
}
$revision_id
=
reset
(
$revision_list
);
$revision_id
=
$this
->
normalizeRevisionID
(
$revision_id
);
$revisions
=
$conduit
->
callMethodSynchronous
(
'differential.query'
,
array
(
'ids'
=>
array
(
$revision_id
),
));
$revision
=
head
(
$revisions
);
if
(!
$revision
&&
!
$is_finalize
)
{
throw
new
ArcanistUsageException
(
pht
(
'Revision %s does not exist.'
,
"D{$revision_id}"
));
}
$status_accepted
=
ArcanistDifferentialRevisionStatus
::
ACCEPTED
;
$status_closed
=
ArcanistDifferentialRevisionStatus
::
CLOSED
;
if
(!
$is_finalize
&&
$revision
[
'status'
]
!=
$status_accepted
)
{
throw
new
ArcanistUsageException
(
pht
(
"Revision %s can not be closed. You can only close "
.
"revisions which have been 'accepted'."
,
"D{$revision_id}"
));
}
if
(
$revision
)
{
if
(!
$is_finalize
&&
$revision
[
'authorPHID'
]
!=
$this
->
getUserPHID
())
{
$prompt
=
pht
(
'You are not the author of revision %s, '
.
'are you sure you want to close it?'
,
"D{$revision_id}"
);
if
(!
phutil_console_confirm
(
$prompt
))
{
throw
new
ArcanistUserAbortException
();
}
}
$actually_close
=
true
;
if
(
$is_finalize
)
{
if
(
$this
->
getRepositoryPHID
()
||
$revision
[
'status'
]
!=
$status_accepted
)
{
$actually_close
=
false
;
}
}
if
(
$actually_close
)
{
$revision_name
=
$revision
[
'title'
];
echo
pht
(
"Closing revision %s '%s'...
\n
"
,
"D{$revision_id}"
,
$revision_name
);
$conduit
->
callMethodSynchronous
(
'differential.close'
,
array
(
'revisionID'
=>
$revision_id
,
));
}
}
$status
=
$revision
[
'status'
];
if
(
$status
==
$status_accepted
||
$status
==
$status_closed
)
{
// If this has already been attached to commits, don't show the
// "you can push this commit" message since we know it's been pushed
// already.
$is_finalized
=
empty
(
$revision
[
'commits'
]);
}
else
{
$is_finalized
=
false
;
}
if
(!
$this
->
getArgument
(
'quiet'
))
{
if
(
$is_finalized
)
{
$message
=
$this
->
getRepositoryAPI
()->
getFinalizedRevisionMessage
();
echo
phutil_console_wrap
(
$message
).
"
\n
"
;
}
else
{
echo
pht
(
'Done.'
).
"
\n
"
;
}
}
return
0
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Fri, Nov 22, 08:12 (32 m, 42 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
547642
Default Alt Text
ArcanistCloseRevisionWorkflow.php (4 KB)
Attached To
Mode
R118 Arcanist - fork
Attached
Detach File
Event Timeline
Log In to Comment