Summary: Ref T4189. This adds a per-repository "dangerous changes" flag, which defaults to off. This flag must be enabled to do non-appending branch mutation (delete branches / rewrite history).
Test Plan:
With flag on and off, performed various safe and dangerous pushes.
>>> orbital ~/repos/POEMS $ git push origin :blarp
remote: +---------------------------------------------------------------+
remote: | * * * PUSH REJECTED BY EVIL DRAGON BUREAUCRATS * * * |
remote: +---------------------------------------------------------------+
remote: \
remote: \ ^ /^
remote: \ / \ // \
remote: \ |\___/| / \// .\
remote: \ /V V \__ / // | \ \ *----*
remote: / / \/_/ // | \ \ \ |
remote: @___@` \/_ // | \ \ \/\ \
remote: 0/0/| \/_ // | \ \ \ \
remote: 0/0/0/0/| \/// | \ \ | |
remote: 0/0/0/0/0/_|_ / ( // | \ _\ | /
remote: 0/0/0/0/0/0/`/,_ _ _/ ) ; -. | _ _\.-~ / /
remote: ,-} _ *-.|.-~-. .~ ~
remote: \ \__/ `/\ / ~-. _ .-~ /
remote: \____(Oo) *. } { /
remote: ( (--) .----~-.\ \-` .~
remote: //__\\ \ DENIED! ///.----..< \ _ -~
remote: // \\ ///-._ _ _ _ _ _ _{^ - - - - ~
remote:
remote:
remote: DANGEROUS CHANGE: The change you're attempting to push deletes the branch 'blarp'.
remote: Dangerous change protection is enabled for this repository.
remote: Edit the repository configuration before making dangerous changes.
remote:
To ssh://dweller@localhost/diffusion/POEMS/
! [remote rejected] blarp (pre-receive hook declined)
error: failed to push some refs to 'ssh://dweller@localhost/diffusion/POEMS/'
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, chad, richardvanvelzen
Maniphest Tasks: T4189
Differential Revision: https://secure.phabricator.com/D7689
138 lines
4.9 KiB
PHP
138 lines
4.9 KiB
PHP
<?php
|
|
|
|
final class PhabricatorApplicationDiffusion extends PhabricatorApplication {
|
|
|
|
public function getShortDescription() {
|
|
return pht('Repository Browser');
|
|
}
|
|
|
|
public function getBaseURI() {
|
|
return '/diffusion/';
|
|
}
|
|
|
|
public function getIconName() {
|
|
return 'diffusion';
|
|
}
|
|
|
|
public function getHelpURI() {
|
|
return PhabricatorEnv::getDoclink('article/Diffusion_User_Guide.html');
|
|
}
|
|
|
|
public function getFactObjectsForAnalysis() {
|
|
return array(
|
|
new PhabricatorRepositoryCommit(),
|
|
);
|
|
}
|
|
|
|
public function getEventListeners() {
|
|
return array(
|
|
new DiffusionHovercardEventListener(),
|
|
);
|
|
}
|
|
|
|
public function getRemarkupRules() {
|
|
return array(
|
|
new DiffusionRemarkupRule(),
|
|
);
|
|
}
|
|
|
|
public function getRoutes() {
|
|
return array(
|
|
'/r(?P<callsign>[A-Z]+)(?P<commit>[a-z0-9]+)'
|
|
=> 'DiffusionCommitController',
|
|
'/diffusion/' => array(
|
|
'(?:query/(?P<queryKey>[^/]+)/)?'
|
|
=> 'DiffusionRepositoryListController',
|
|
'new/' => 'DiffusionRepositoryNewController',
|
|
'(?P<edit>create)/' => 'DiffusionRepositoryCreateController',
|
|
'(?P<edit>import)/' => 'DiffusionRepositoryCreateController',
|
|
'(?P<callsign>[A-Z]+)/' => array(
|
|
'' => 'DiffusionRepositoryController',
|
|
|
|
'repository/(?P<dblob>.*)' => 'DiffusionRepositoryController',
|
|
'change/(?P<dblob>.*)' => 'DiffusionChangeController',
|
|
'history/(?P<dblob>.*)' => 'DiffusionHistoryController',
|
|
'browse/(?P<dblob>.*)' => 'DiffusionBrowseMainController',
|
|
'lastmodified/(?P<dblob>.*)' => 'DiffusionLastModifiedController',
|
|
'diff/' => 'DiffusionDiffController',
|
|
'tags/(?P<dblob>.*)' => 'DiffusionTagListController',
|
|
'branches/(?P<dblob>.*)' => 'DiffusionBranchTableController',
|
|
'lint/(?P<dblob>.*)' => 'DiffusionLintController',
|
|
|
|
'commit/(?P<commit>[a-z0-9]+)/branches/'
|
|
=> 'DiffusionCommitBranchesController',
|
|
'commit/(?P<commit>[a-z0-9]+)/tags/'
|
|
=> 'DiffusionCommitTagsController',
|
|
'commit/(?P<commit>[a-z0-9]+)/edit/'
|
|
=> 'DiffusionCommitEditController',
|
|
'edit/' => array(
|
|
'' => 'DiffusionRepositoryEditMainController',
|
|
'basic/' => 'DiffusionRepositoryEditBasicController',
|
|
'encoding/' => 'DiffusionRepositoryEditEncodingController',
|
|
'activate/' => 'DiffusionRepositoryEditActivateController',
|
|
'dangerous/' => 'DiffusionRepositoryEditDangerousController',
|
|
'policy/' => 'DiffusionRepositoryEditPolicyController',
|
|
'branches/' => 'DiffusionRepositoryEditBranchesController',
|
|
'subversion/' => 'DiffusionRepositoryEditSubversionController',
|
|
'actions/' => 'DiffusionRepositoryEditActionsController',
|
|
'(?P<edit>remote)/' => 'DiffusionRepositoryCreateController',
|
|
'local/' => 'DiffusionRepositoryEditLocalController',
|
|
'delete/' => 'DiffusionRepositoryEditDeleteController',
|
|
'hosting/' => 'DiffusionRepositoryEditHostingController',
|
|
'(?P<serve>serve)/' => 'DiffusionRepositoryEditHostingController',
|
|
),
|
|
'mirror/' => array(
|
|
'edit/(?:(?P<id>\d+)/)?' => 'DiffusionMirrorEditController',
|
|
'delete/(?P<id>\d+)/' => 'DiffusionMirrorDeleteController',
|
|
),
|
|
),
|
|
|
|
// NOTE: This must come after the rule above; it just gives us a
|
|
// catch-all for serving repositories over HTTP. We must accept
|
|
// requests without the trailing "/" because SVN commands don't
|
|
// necessarily include it.
|
|
'(?P<callsign>[A-Z]+)(/|$).*' => 'DiffusionRepositoryDefaultController',
|
|
|
|
'inline/' => array(
|
|
'edit/(?P<phid>[^/]+)/' => 'DiffusionInlineCommentController',
|
|
'preview/(?P<phid>[^/]+)/' =>
|
|
'DiffusionInlineCommentPreviewController',
|
|
),
|
|
'services/' => array(
|
|
'path/' => array(
|
|
'complete/' => 'DiffusionPathCompleteController',
|
|
'validate/' => 'DiffusionPathValidateController',
|
|
),
|
|
),
|
|
'symbol/(?P<name>[^/]+)/' => 'DiffusionSymbolController',
|
|
'external/' => 'DiffusionExternalController',
|
|
'lint/' => 'DiffusionLintController',
|
|
),
|
|
);
|
|
}
|
|
|
|
public function getApplicationGroup() {
|
|
return self::GROUP_CORE;
|
|
}
|
|
|
|
public function getApplicationOrder() {
|
|
return 0.120;
|
|
}
|
|
|
|
protected function getCustomCapabilities() {
|
|
return array(
|
|
DiffusionCapabilityDefaultView::CAPABILITY => array(
|
|
),
|
|
DiffusionCapabilityDefaultEdit::CAPABILITY => array(
|
|
'default' => PhabricatorPolicies::POLICY_ADMIN,
|
|
),
|
|
DiffusionCapabilityDefaultPush::CAPABILITY => array(
|
|
),
|
|
DiffusionCapabilityCreateRepositories::CAPABILITY => array(
|
|
'default' => PhabricatorPolicies::POLICY_ADMIN,
|
|
),
|
|
);
|
|
}
|
|
|
|
}
|