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 ($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)
|
||||
->setTransactionType($type_name)
|
||||
->setNewValue(
|
||||
|
@ -343,7 +335,7 @@ final class DiffusionRepositoryCreateController
|
|||
}
|
||||
|
||||
|
||||
/* -( Page: Name and Callsign )-------------------------------------------- */
|
||||
/* -( Page: Name )--------------------------------------------------------- */
|
||||
|
||||
|
||||
private function buildNamePage() {
|
||||
|
@ -359,23 +351,7 @@ final class DiffusionRepositoryCreateController
|
|||
->addControl(
|
||||
id(new AphrontFormTextControl())
|
||||
->setName('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.')));
|
||||
->setLabel(pht('Name')));
|
||||
}
|
||||
|
||||
public function validateNamePage(PHUIFormPageView $page) {
|
||||
|
@ -387,38 +363,7 @@ final class DiffusionRepositoryCreateController
|
|||
pht('You must choose a name for this repository.'));
|
||||
}
|
||||
|
||||
$c_call = $page->getControl('callsign');
|
||||
$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();
|
||||
return $c_name->isValid();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -284,7 +284,12 @@ final class DiffusionRepositoryEditMainController
|
|||
$repository->getVersionControlSystem());
|
||||
|
||||
$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();
|
||||
if ($short_name === null) {
|
||||
|
|
|
@ -93,7 +93,7 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
|||
),
|
||||
self::CONFIG_COLUMN_SCHEMA => array(
|
||||
'name' => 'sort255',
|
||||
'callsign' => 'sort32',
|
||||
'callsign' => 'sort32?',
|
||||
'repositorySlug' => 'sort64?',
|
||||
'versionControlSystem' => 'text32',
|
||||
'uuid' => 'text64?',
|
||||
|
@ -149,13 +149,21 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
|||
}
|
||||
|
||||
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() {
|
||||
// TODO: This is intended to produce a human-readable name that is not
|
||||
// necessarily a global, unique identifier. Eventually, it may just return
|
||||
// a string like "skynet" instead of "rSKYNET".
|
||||
$slug = $this->getRepositorySlug();
|
||||
if (strlen($slug)) {
|
||||
return $slug;
|
||||
}
|
||||
|
||||
return $this->getMonogram();
|
||||
}
|
||||
|
||||
|
@ -699,7 +707,13 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
|||
}
|
||||
|
||||
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) {
|
||||
|
@ -708,9 +722,14 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
|||
|
||||
public function getCommitURI($identifier) {
|
||||
$callsign = $this->getCallsign();
|
||||
if (strlen($callsign)) {
|
||||
return "/r{$callsign}{$identifier}";
|
||||
}
|
||||
|
||||
$id = $this->getID();
|
||||
return "/R{$id}:{$identifier}";
|
||||
}
|
||||
|
||||
public static function parseRepositoryServicePath($request_path) {
|
||||
// NOTE: In Mercurial over SSH, the path will begin without a leading "/",
|
||||
// so we're matching it optionally.
|
||||
|
@ -1063,7 +1082,13 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
|||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue