mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-18 19:40:55 +01:00
Make repository callsigns optional
Summary: Ref T4245. This could still use a little UI smoothing, but: - Don't require a callsign on the create flow (you can add one later in "Edit Basic Information" if you want). - Allow existing callsigns to be removed. Test Plan: - Created a new repository with no callsign. - Cloned it; pushed to it. - Browsed around Diffusion a bunch. - Visited a commit URI. - Added a callsign to it. - Removed the callsign again. - Referenced it with `R22` in remarkup. Reviewers: chad Reviewed By: chad Maniphest Tasks: T4245 Differential Revision: https://secure.phabricator.com/D15305
This commit is contained in:
parent
dfc8f8bcb4
commit
dc7d0b4a56
4 changed files with 46 additions and 67 deletions
4
resources/sql/autopatches/20160218.callsigns.1.sql
Normal file
4
resources/sql/autopatches/20160218.callsigns.1.sql
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/* Make callsigns nullable, and thus optional. */
|
||||||
|
|
||||||
|
ALTER TABLE {$NAMESPACE}_repository.repository
|
||||||
|
CHANGE callsign callsign VARCHAR(32) COLLATE {$COLLATE_SORT};
|
|
@ -149,14 +149,6 @@ final class DiffusionRepositoryCreateController
|
||||||
|
|
||||||
// If we're creating a new repository, set all this core stuff.
|
// If we're creating a new repository, set all this core stuff.
|
||||||
if ($is_create) {
|
if ($is_create) {
|
||||||
$callsign = $form->getPage('name')
|
|
||||||
->getControl('callsign')->getValue();
|
|
||||||
|
|
||||||
// We must set this to a unique value to save the repository
|
|
||||||
// initially, and it's immutable, so we don't bother using
|
|
||||||
// transactions to apply this change.
|
|
||||||
$repository->setCallsign($callsign);
|
|
||||||
|
|
||||||
$xactions[] = id(clone $template)
|
$xactions[] = id(clone $template)
|
||||||
->setTransactionType($type_name)
|
->setTransactionType($type_name)
|
||||||
->setNewValue(
|
->setNewValue(
|
||||||
|
@ -343,7 +335,7 @@ final class DiffusionRepositoryCreateController
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( Page: Name and Callsign )-------------------------------------------- */
|
/* -( Page: Name )--------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
private function buildNamePage() {
|
private function buildNamePage() {
|
||||||
|
@ -359,23 +351,7 @@ final class DiffusionRepositoryCreateController
|
||||||
->addControl(
|
->addControl(
|
||||||
id(new AphrontFormTextControl())
|
id(new AphrontFormTextControl())
|
||||||
->setName('name')
|
->setName('name')
|
||||||
->setLabel(pht('Name'))
|
->setLabel(pht('Name')));
|
||||||
->setCaption(pht('Human-readable repository name.')))
|
|
||||||
->addRemarkupInstructions(
|
|
||||||
pht(
|
|
||||||
'**Choose a "Callsign" for the repository.** This is a short, '.
|
|
||||||
'unique string which identifies commits elsewhere in Phabricator. '.
|
|
||||||
'For example, you might use `M` for your mobile app repository '.
|
|
||||||
'and `B` for your backend repository.'.
|
|
||||||
"\n\n".
|
|
||||||
'**Callsigns must be UPPERCASE**, and can not be edited after the '.
|
|
||||||
'repository is created. Generally, you should choose short '.
|
|
||||||
'callsigns.'))
|
|
||||||
->addControl(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setName('callsign')
|
|
||||||
->setLabel(pht('Callsign'))
|
|
||||||
->setCaption(pht('Short UPPERCASE identifier.')));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function validateNamePage(PHUIFormPageView $page) {
|
public function validateNamePage(PHUIFormPageView $page) {
|
||||||
|
@ -387,38 +363,7 @@ final class DiffusionRepositoryCreateController
|
||||||
pht('You must choose a name for this repository.'));
|
pht('You must choose a name for this repository.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$c_call = $page->getControl('callsign');
|
return $c_name->isValid();
|
||||||
$v_call = $c_call->getValue();
|
|
||||||
if (!strlen($v_call)) {
|
|
||||||
$c_call->setError(pht('Required'));
|
|
||||||
$page->addPageError(
|
|
||||||
pht('You must choose a callsign for this repository.'));
|
|
||||||
} else if (!preg_match('/^[A-Z]+\z/', $v_call)) {
|
|
||||||
$c_call->setError(pht('Invalid'));
|
|
||||||
$page->addPageError(
|
|
||||||
pht('The callsign must contain only UPPERCASE letters.'));
|
|
||||||
} else {
|
|
||||||
$exists = false;
|
|
||||||
try {
|
|
||||||
$repo = id(new PhabricatorRepositoryQuery())
|
|
||||||
->setViewer($this->getRequest()->getUser())
|
|
||||||
->withCallsigns(array($v_call))
|
|
||||||
->executeOne();
|
|
||||||
$exists = (bool)$repo;
|
|
||||||
} catch (PhabricatorPolicyException $ex) {
|
|
||||||
$exists = true;
|
|
||||||
}
|
|
||||||
if ($exists) {
|
|
||||||
$c_call->setError(pht('Not Unique'));
|
|
||||||
$page->addPageError(
|
|
||||||
pht(
|
|
||||||
'Another repository already uses that callsign. You must choose '.
|
|
||||||
'a unique callsign.'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $c_name->isValid() &&
|
|
||||||
$c_call->isValid();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -284,7 +284,12 @@ final class DiffusionRepositoryEditMainController
|
||||||
$repository->getVersionControlSystem());
|
$repository->getVersionControlSystem());
|
||||||
|
|
||||||
$view->addProperty(pht('Type'), $type);
|
$view->addProperty(pht('Type'), $type);
|
||||||
$view->addProperty(pht('Callsign'), $repository->getCallsign());
|
|
||||||
|
$callsign = $repository->getCallsign();
|
||||||
|
if (!strlen($callsign)) {
|
||||||
|
$callsign = phutil_tag('em', array(), pht('No Callsign'));
|
||||||
|
}
|
||||||
|
$view->addProperty(pht('Callsign'), $callsign);
|
||||||
|
|
||||||
$short_name = $repository->getRepositorySlug();
|
$short_name = $repository->getRepositorySlug();
|
||||||
if ($short_name === null) {
|
if ($short_name === null) {
|
||||||
|
|
|
@ -93,7 +93,7 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
),
|
),
|
||||||
self::CONFIG_COLUMN_SCHEMA => array(
|
self::CONFIG_COLUMN_SCHEMA => array(
|
||||||
'name' => 'sort255',
|
'name' => 'sort255',
|
||||||
'callsign' => 'sort32',
|
'callsign' => 'sort32?',
|
||||||
'repositorySlug' => 'sort64?',
|
'repositorySlug' => 'sort64?',
|
||||||
'versionControlSystem' => 'text32',
|
'versionControlSystem' => 'text32',
|
||||||
'uuid' => 'text64?',
|
'uuid' => 'text64?',
|
||||||
|
@ -149,13 +149,21 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getMonogram() {
|
public function getMonogram() {
|
||||||
return 'r'.$this->getCallsign();
|
$callsign = $this->getCallsign();
|
||||||
|
if (strlen($callsign)) {
|
||||||
|
return "r{$callsign}";
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = $this->getID();
|
||||||
|
return "R{$id}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDisplayName() {
|
public function getDisplayName() {
|
||||||
// TODO: This is intended to produce a human-readable name that is not
|
$slug = $this->getRepositorySlug();
|
||||||
// necessarily a global, unique identifier. Eventually, it may just return
|
if (strlen($slug)) {
|
||||||
// a string like "skynet" instead of "rSKYNET".
|
return $slug;
|
||||||
|
}
|
||||||
|
|
||||||
return $this->getMonogram();
|
return $this->getMonogram();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -699,7 +707,13 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getURI() {
|
public function getURI() {
|
||||||
return '/diffusion/'.$this->getCallsign().'/';
|
$callsign = $this->getCallsign();
|
||||||
|
if (strlen($callsign)) {
|
||||||
|
return "/diffusion/{$callsign}/";
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = $this->getID();
|
||||||
|
return "/diffusion/{$id}/";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPathURI($path) {
|
public function getPathURI($path) {
|
||||||
|
@ -708,7 +722,12 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
|
|
||||||
public function getCommitURI($identifier) {
|
public function getCommitURI($identifier) {
|
||||||
$callsign = $this->getCallsign();
|
$callsign = $this->getCallsign();
|
||||||
return "/r{$callsign}{$identifier}";
|
if (strlen($callsign)) {
|
||||||
|
return "/r{$callsign}{$identifier}";
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = $this->getID();
|
||||||
|
return "/R{$id}:{$identifier}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function parseRepositoryServicePath($request_path) {
|
public static function parseRepositoryServicePath($request_path) {
|
||||||
|
@ -1063,7 +1082,13 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($need_scope) {
|
if ($need_scope) {
|
||||||
$scope = 'r'.$this->getCallsign();
|
$callsign = $this->getCallsign();
|
||||||
|
if ($callsign) {
|
||||||
|
$scope = "r{$callsign}";
|
||||||
|
} else {
|
||||||
|
$id = $this->getID();
|
||||||
|
$scope = "R{$id}:";
|
||||||
|
}
|
||||||
$name = $scope.$name;
|
$name = $scope.$name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue