Remote Repository Manager 改良

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

コメント