Rework gitosis config generator to use pushable settings from repository
This commit is contained in:
@@ -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);
|
||||
?>
|
||||
|
Reference in New Issue
Block a user