blob: 33d8fa95d2a11c7dee9edd348b039f13f0d80c3e [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2017 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
/*
* NOT API. This script may change in the future.
*
* This script exports a list of all known Git source code repositories.
* Essentially, this is the list of all repositories that are registered
* by projects in their metadata.
*
* KEEP THIS FILE. As of September 2023, this is used by our metrics
* gathering process.
*
* TODO This is a candidate for inclusion in api.eclipse.org
*/
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
$App = new App();
require_once dirname(__FILE__) . '/../classes/debug.php';
require_once dirname(__FILE__) . '/../classes/database.inc';
$where = array("1 = 1");
$args = array();
if ($id = @$_GET['id']) {
$where[] = "project = ':id:'";
$args[':id:'] = $id;
}
$where = implode(" and ", $where);
/*
* There is some chance that a repository (path) may be claimed by two projects.
* This should be unlikely, but may happen if the repository data is not specified
* correctly in the PMI.
*
* We mitigate against this with a hack that should have reasonably good results.
* The query favours the longest project id based on an assumption that this sort
* of scenario may happen when a project and its incubator (for example) share
* a GitHub org. When, for example, a repository is claimed by both `automotive.leda`
* and `automotive.leda.ledaincubator`, we assume that the repository is actually
* owned by the latter.
*
* We do periodically scan for and resolve these sorts of anomalies.
*/
$sql = <<< EOQ
select
substring_index(group_concat(distinct project order by length(project) desc),',',1) as project,
path
from GitRepo
group by path
having {$where}
EOQ;
$fp = fopen('php://output', 'w');
fwrite($fp, "# NOT API; this script is subject to change without notice.\n");
query('dashboard', $sql, $args, function($row) use (&$fp) {
$project = $row['project'];
$path = trim($row['path']);
if (preg_match('/^\/gitroot\//',$path))
$path = "git://git.eclipse.org{$path}";
fputcsv($fp, array($project, $path));
});
fclose($fp);