feat(sync): GitHub en plus de Gitea, et refus d'un depot public

GitHub parle la meme API des contenus (base64, sha, corps du PUT) : meme
chemin, reconnu a api.github.com/repos/. User-Agent pose partout (GitHub
refuse sans). Un depot public est refuse avant toute lecture ou ecriture,
Gitea comme GitHub : l'historique garde tous les instantanes chiffres.
Telephone : github.com/O/R se convertit en URL d'API et inversement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-18 10:36:18 +01:00
parent d7a8b4ddff
commit 3c16b41714
5 changed files with 136 additions and 14 deletions
+13 -2
View File
@@ -1396,7 +1396,14 @@ begin
// changeait chaque ":" et "/" en trois caracteres.
var LShort := LQrUrl;
var LApi := Pos('/api/v1/repos/', LShort);
if (LApi > 0) and EndsText('/contents/vault-sync.json', LShort) then
// GitHub : l'adresse du depot est sur github.com, l'API sur api.github.com.
if StartsText('https://api.github.com/repos/', LShort) and
EndsText('/contents/vault-sync.json', LShort) then
LShort := 'https://github.com/' +
Copy(LShort, Length('https://api.github.com/repos/') + 1,
Length(LShort) - Length('https://api.github.com/repos/') -
Length('/contents/vault-sync.json'))
else if (LApi > 0) and EndsText('/contents/vault-sync.json', LShort) then
LShort := Copy(LShort, 1, LApi) +
Copy(LShort, LApi + Length('/api/v1/repos/'),
Length(LShort) - LApi - Length('/api/v1/repos/') - Length('/contents/vault-sync.json') + 1);
@@ -1608,7 +1615,9 @@ begin
// remplace l'authentification Basic, le corps d'un PUT est du JSON que JS
// a deja mis en forme (le sha y voyage, pas dans un If-Match), et le test
// de connexion se fait par GET - l'API des contenus ne repond pas a HEAD.
var LGitea := LUrl.ToLower.Contains('/api/v1/repos/');
// GitHub parle la meme API des contenus : meme traitement.
var LGitea := LUrl.ToLower.Contains('/api/v1/repos/') or
LUrl.ToLower.Contains('api.github.com/repos/');
TThread.CreateAnonymousThread(
procedure
var
@@ -1631,6 +1640,8 @@ begin
try
LHttp.ConnectionTimeout := 10000;
LHttp.ResponseTimeout := 30000;
// GitHub REFUSE toute requete sans User-Agent (403) ; Gitea l'ignore.
LHttp.UserAgent := 'PMServer';
// "token <PAT>" et non "Bearer" : c'est la forme que Gitea attend
// d'un jeton d'acces personnel, et l'autre donne un 401 muet.
if LGitea then