From a77a33dc50e0c8c40ebf76e6526c856bb94eb9e8 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 7 Nov 2013 00:00:36 +0600 Subject: [PATCH] Rework gitosis config generator to use pushable settings from repository --- scripts/gitadmin/rebuild_gitadmin.php | 179 +++++++++++++++----------- 1 file changed, 106 insertions(+), 73 deletions(-) diff --git a/scripts/gitadmin/rebuild_gitadmin.php b/scripts/gitadmin/rebuild_gitadmin.php index 183fc5e708..d19d497b80 100755 --- a/scripts/gitadmin/rebuild_gitadmin.php +++ b/scripts/gitadmin/rebuild_gitadmin.php @@ -28,6 +28,102 @@ function write_ini_file($array, $file) { file_put_contents($file, implode("\n", $res)); } +function handleSingleUserPHID( + $keydir, $viewer, $userPHID, &$used_keys) { + $user = id(new PhabricatorPeopleQuery()) + ->setViewer($viewer) + ->withPHIDs(array($userPHID)) + ->executeOne(); + + $keys = id(new PhabricatorUserSSHKey())->loadAllWhere( + 'userPHID = %s', + $user->getPHID()); + + $members = array(); + foreach ($keys as $key) { + $escaped_key_name = escape_name($key->getName()); + $member = 'PHAB_'.$user->getUserName(). + '@'.$escaped_key_name. + '_'.$key->getID(); + $members[] = $member; + if (!array_key_exists($member, $used_keys)) { + $used_keys[$member] = true; + $full_key_content = + $key->getKeyType().' '. + $key->getKeyBody().' '. + $key->getKeyComment()."\n"; + file_put_contents("$keydir/$member", $full_key_content); + } + } + return $members; +} + +function handleSingleRepository( + $keydir, $viewer, $repository, &$new_configuration, &$used_keys) { + $policies = PhabricatorPolicyQuery::loadPolicies( + $viewer, + $repository); + + $pushable = $policies[DiffusionCapabilityPush::CAPABILITY]; + $type = phid_get_type($pushable->getPHID()); + + $members = array(); + + if ($type == PhabricatorProjectPHIDTypeProject::TYPECONST) { + $project = id(new PhabricatorProjectQuery()) + ->setViewer($viewer) + ->needMembers(true) + ->withPHIDs(array($pushable->getPHID())) + ->executeOne(); + + $memberPHIDs = $project->getMemberPHIDs(); + foreach ($memberPHIDs as $memberPHID) { + $members = array_merge($members, + handleSingleUserPHID($keydir, $viewer, $memberPHID, $used_keys)); + } + } else if ($type == PhabricatorPeoplePHIDTypeUser::TYPECONST) { + $members = handleSingleUserPHID( + $keydir, $viewer, $pushable->getPHID(), $used_keys); + } else if ($type == PhabricatorPolicyPHIDTypePolicy::TYPECONST) { + /* pass */ + } else { + /* pass */ + } + + if (count($members)) { + $escaped_repository_name = escape_name($repository->getName()); + $group_name = "PHAB_${escaped_repository_name}"; + $values = array(); + $values['members'] = join(' ', $members); + $values['readonly'] = '@all'; + $values['writable'] = $repository->getName(); + $new_configuration["group $group_name"] = $values; + } +} + +// Remove groups from previous automated configuration built +function getCleanOldConfiguration($old_configuration) { + $new_configuration = array(); + foreach ($old_configuration as $group => $values) { + if (!startswith($group, 'group PHAB')) { + $new_configuration[$group] = $values; + } + } + return $new_configuration; +} + +// Remove unused public keys +function removeUnusedPublicKeys($keydir, $used_keys) { + $files = scandir($keydir); + foreach ($files as $file) { + if (startswith($file, "PHAB")) { + if (!array_key_exists($file, $used_keys)) { + unlink("$keydir/$file"); + } + } + } +} + if (count($argv) != 2) { print("Usage: {$argv[0]} /path/to/gitosis-admin\n"); exit(1); @@ -41,89 +137,26 @@ if (!file_exists($configuration_file)) { exit(1); } -$projects_to_repo_map = - array('Addons' => 'blender-addons', - 'Blender 2.x Release' => 'blender', - 'Blender UI Translations' => 'blender-translations'); - $viewer = id(new PhabricatorUser()) ->loadOneWhere('username = %s', 'sergey'); -$projects = id(new PhabricatorProjectQuery()) - ->setViewer($viewer) - ->needMembers(true) - ->execute(); - $old_configuration = parse_ini_file( $configuration_file, true, INI_SCANNER_RAW); -$new_configuration = array(); -// Remove groups from previous automated configuration built -foreach ($old_configuration as $group => $values) { - if (!startswith($group, 'group PHAB')) { - $new_configuration[$group] = $values; - } -} +$new_configuration = getCleanOldConfiguration( + $old_configuration); -// Fill in new ocnfiguration and keys +// Fill in new configuration and keys $used_keys = array(); -foreach ($projects as $project_id => $project) { - if (!array_key_exists($project->getName(), - $projects_to_repo_map)) { - continue; - } +$repositories = id(new PhabricatorRepositoryQuery()) + ->setViewer($viewer) + ->execute(); - $memberPHIDs = $project->getMemberPHIDs(); - $members = array(); - foreach ($memberPHIDs as $memberPHID) { - $user = id(new PhabricatorPeopleQuery()) - ->setViewer($viewer) - ->withPHIDs(array($memberPHID)) - ->executeOne(); - - $keys = id(new PhabricatorUserSSHKey())->loadAllWhere( - 'userPHID = %s', - $user->getPHID()); - - foreach ($keys as $key) { - $escaped_key_name = escape_name($key->getName()); - $member = 'PHAB_'.$user->getUserName(). - '@'.$escaped_key_name. - '_'.$key->getID(); - $members[] = $member; - if (!array_key_exists($member, $used_keys)) { - $used_keys[$member] = true; - $full_key_content = - $key->getKeyType().' '. - $key->getKeyBody().' '. - $key->getKeyComment()."\n"; - file_put_contents("$keydir/$member", $full_key_content); - } - } - } - - if (count($members)) { - $escaped_project_name = escape_name($project->getName()); - $repo = $projects_to_repo_map[$project->getName()]; - $group_name = "PHAB_${escaped_project_name}"; - $values = array(); - $values['members'] = join(' ', $members); - $values['readonly'] = '@all'; - $values['writable'] = $repo; - $new_configuration["group $group_name"] = $values; - } +foreach ($repositories as $repository_id => $repository) { + handleSingleRepository( + $keydir, $viewer, $repository, $new_configuration, $used_keys); } write_ini_file($new_configuration, $configuration_file); - -// Remove unused keys -$files = scandir($keydir); -foreach ($files as $file) { - if (startswith($file, "PHAB")) { - if (!array_key_exists($file, $used_keys)) { - unlink("$keydir/$file"); - } - } -} - +removeUnusedPublicKeys($keydir, $used_keys); ?>