Browse Source

on ajoute une fonction debardeur_json_api_call_pages() qui permet de recuperer plusieurs pages en suivant les header Link rel=next, et on l'utilise pour recuperer la liste complete des repositories

pull/5/head
Cerdic 10 months ago
parent
commit
dd4935f516
  1. 83
      mirror.php

83
mirror.php

@ -38,7 +38,6 @@ $method = reset($args);
foreach ($url_orgs as $url_org) {
$repos = debardeur_connecteur_gitea_lister_repositories($url_org, time() - 10 * 60);
var_dump($url_org, count($repos));die();
$total = count($repos);
$nb_repositories += $total;
@ -113,7 +112,7 @@ function debardeur_connecteur_gitea_lister_repositories($url_organisation, $last
$org = gitea_organisation_from_url($url_organisation);
$method = "orgs/{$org}/repos";
$res = debardeur_json_api_call('gitea', $endpoint, $method, ['limit' => 50], $last_modified_time);
$res = debardeur_json_api_call_pages(0, 'gitea', $endpoint, $method, ['limit' => 50], $last_modified_time);
$repositories = [];
if ($res) {
@ -138,9 +137,9 @@ function debardeur_connecteur_gitea_lister_repositories($url_organisation, $last
}
/**
* Appel d'une l'API JSON en get (type gitea/github) avec cache si possible
* (mais par defaut pas de cache)
* Appel d'une l'API JSON en get (type gitea/github)
*
* @param string $type
* @param string $endpoint
* @param string $method
* @param string|array $query
@ -150,12 +149,82 @@ function debardeur_connecteur_gitea_lister_repositories($url_organisation, $last
function debardeur_json_api_call($type, $endpoint, $method, $query, $last_modified_time = null){
$res = debardeur_json_api_call_raw($type, $endpoint, $method, $query, $last_modified_time);
if ($res){
if ($res and $res['status']){
return $res['content'];
}
return false;
}
/**
* Appels multiples d'une API JSON en get (type gitea/github) pour recuperer toutes les pages de resultats
*
* @param int $nb_pages
* nombre maxi de de pages
* @param string $type
* @param string $endpoint
* @param string $method
* @param string|array $query
* @param null $last_modified_time
* @return false|array
*/
function debardeur_json_api_call_pages($nb_pages, $type, $endpoint, $method, $query, $last_modified_time = null){
$res = debardeur_json_api_call_raw($type, $endpoint, $method, $query, $last_modified_time);
$nb = 1;
if ($res and $res['status']){
$results = $res['content'];
$links = debardeur_json_api_extract_links($res['header']);
while (($nb_pages<=0 or $nb<$nb_pages) and $links and !empty($links['next'])) {
$q_page = explode('?', $links['next'], 2);
$q_page = end($q_page);
// s'assurer que les pages suivantes sont au moins aussi recentes
if (!empty($res['last_modified'])) {
$last_modified_time = $res['last_modified'];
}
$res = debardeur_json_api_call_raw($type, $endpoint, $method, $q_page, $last_modified_time);
$nb++;
$links = false;
if ($res and $res['status']){
while(count($res['content'])) {
$results[] = array_shift($res['content']);
}
$links = debardeur_json_api_extract_links($res['header']);
}
}
return $results;
}
return false;
}
/**
* Extraire les links du header Link: de la pagination des resultats
* @param array $headers
* @return array
*/
function debardeur_json_api_extract_links($headers) {
// "Link":"<https:\/\/git.spip.net\/api\/v1\/orgs\/spip-contrib-squelettes\/repos?limit=50&page=2>; rel=\"next\",<https:\/\/git.spip.net\/api\/v1\/orgs\/spip-contrib-squelettes\/repos?limit=50&page=4>; rel=\"last\""
$links = [];
if (!empty($headers['Link'])) {
$list = explode(',', $headers['Link']);
foreach ($list as $l) {
$l = explode(";", $l, 2);
if (count($l) == 2) {
$url = reset($l);
$url = ltrim($url, '<');
$url = rtrim($url, '>');
$rel = explode("rel=", end($l));
$rel = trim(end($rel), '"');
if ($rel and $url) {
$links[$rel] = $url;
}
}
}
}
return $links;
}
/**
* Appel d'une l'API JSON en get (type gitea/github) avec cache si possible
* (mais par defaut pas de cache)
@ -183,13 +252,14 @@ function debardeur_json_api_call_raw($type, $endpoint, $method, $query, $last_mo
if (!is_null($last_modified_time)
and file_exists($file_cache)
and filemtime($file_cache)>$last_modified_time
and filemtime($file_cache)>=$last_modified_time
and $res = file_get_contents($file_cache)
and ($res = json_decode($res, true))!==false){
return $res;
}
$url = $endpoint . $method . $query;
// var_dump("curl $url");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
@ -224,6 +294,7 @@ function debardeur_json_api_call_raw($type, $endpoint, $method, $query, $last_mo
'status' => false,
'header' => $headers,
'content' => $json,
'last_modified' => time(),
];
if ($httpCode==200 and $json!==false and !is_null($json)){

Loading…
Cancel
Save