Giteaのpagenationに対応、noenc-urls-pats.txt内でコメント許容
大改造ではなく懸案のbug fixに近いです。
前記事のスクリプトを参考にして、swaggerさんでtryoutもして、Gemini君の吐くコードも参考にしました。ちょっと面倒なんだよね、実装するのはね。できてみれば簡単なんですけどね。Remote Repository Managerは、Gitea,GitHub,Gitlab,Bitbucke全てに対応していますが、今回実装したのは、Giteaの場合のList Repositoriesだけですので、ご注意ください。要望があれば全部やりますけど、筆者自体がGiteaへまとめようというので……。
さて、旧版のRRM(Remote Repository Manger)では手抜きで、レポジトリが100個以上あっても、101個から先は表示されませんでした。

これをfixするのがまず最初。swagger使ってlist repositoryをおさらいしておきましょう。swaggerは、
を参照願います。

ここで、右下の“API”をクリック。この時点でサインインしてなくてもおけですが、idと関連するPATは用意しておきましょう。すぐに必要になります。

先に右上の方の“Authorize”をクリック。

上から2番目のAuthorizationHeader Token(apiKey)を使います。注意書きにあるように、”token” + ” ” +PATを入力します。今、PATが”xxxxxxyyyyyyyyzzzzz”だとすると、

で、“Authorize”します。

ここで“Close”。

この画面に戻りますが、List Repositoriesは、“user”以下にあるので、一番下の“user”をクリック。

このように“user”以下が開くので、ctrl-fからの”list”で検索。

が見つかるので、開きます。

右上の“Try it out”をクリックすると、入力ができるようになりますので、page=1,limit=50等を入れて、

中程の“Execute”をクリック。

のように結果が得られます。一番上が、curlコマンドで、
curl -X 'GET' \
'http://192.168.0.147:3000/api/v1/user/repos?page=1&limit=50' \
-H 'accept: application/json' \
-H 'Authorization: token 95401d5662220e9eb49c035524010772cac0fc6d'
継続行が効く環境ならば、そのままbashで起動できます。Git for Windowsもおけです。その下は、Response bodyです。今回重要なのは、一番下の
access-control-expose-headers: Link,X-Total-Count
content-type: application/json;charset=utf-8
date: Fri,14 Aug 2026 06:11:57 GMT
link: <http://192.168.0.147:3000/api/v1/user/repos?limit=50&page=2>; rel="next",<http://192.168.0.147:3000/api/v1/user/repos?limit=50&page=3>; rel="last"
transfer-encoding: chunked
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-total-count: 102
この部分で、特に“link”の項目で継続があるかどうか、pageが最後かどうかを判断できます。indyのhttp[s]のgetの場合には、IdHTTP->RawHeaders->Values[“Link”]でチェックできます。この行内に、rel=”next”がなければ最終行であると判定できます。なので、実際のコードは、
while( more ){
if( gitea ){
url = baseurl +"/user/repos?page=" + IntToStr(page) + "&" + "limit=50";// format change for gitea.com
}
try {
kick->Get(url,ms);
}
catch(const Exception& e)
{
ShowMessage(e.ClassName());
return;
}
String link = kick->Response->RawHeaders->Values["Link"];
if( !link.Pos("rel=\"next\"")){
more = false;
} else {
// 次のページへ
page++;
}
}となります。ただし、こうするとgetした回数分の、JSON Arrayになるので、少し工夫して、joinしています。
ms->Position = 0;
String text = "dummy";
TStringStream* ss = new TStringStream(text,TEncoding::UTF8,false);
String dummy="";
if( gitea ){
ss->CopyFrom(ms,ms->Size);
dummy = ss->DataString;
jsonorig = StringReplace(
dummy, // Source string
L"]\n[", // Substring to find
L",", // Replacement text
TReplaceFlags() << rfReplaceAll // Replace all occurrences
);
ms->Position = 0;
}
else {
atlist->LoadFromStream(ms, TEncoding::UTF8);
jsonorig="";
Form1->Memo2->Lines->Add("line count: " + IntToStr(atlist->Count));
//for( int i = 0 ; i < Memo1->Lines->Count ; i++ )
for( int i = 0 ; i < atlist->Count ; i++ )
jsonorig += atlist->Strings[i];
}
こうすることで、

ようやくfixできました。できてしまえば簡単なんですがね。他に二つほど改良点があります。2番目は、urls-pats.txtでコメント可能としました。一時的に特定のエントリーをスキップする、あるいはメモ書きを加える等が可能となりました。’#’で始まる行はコメントとして読み飛ばします。3番目はbitbucketサポートの関連で、bitbucketがid,pat,登録e-mailアドレスを要求するようになっていたので、urls-pats.txt内のbitbucketのエントリーも、id,e-mailという形に変更しましたので、ご注意ください。更新したバイナリは下記からダウンロードください。純粋に実行形式のみを用意します。他付随するユーティリティーなどは別途ダウンロードしてください。
“Remote Repository Manager 改訂版” をダウンロード RemoteRepositoryManager.zip 1.83 MB



コメント