C++ Builder CE tips

Remote Repository Managerの改良 Code Fragment

RRM(Remote Repository Manager)は拙作のUtilityで、何度か折に触れて紹介しています。例えば、

ですね。このサイトからもVectorにアップしたものより新しいバージョンをダウンロード可能です。Giteaサーバの栄枯盛衰などに伴って、このUtility(ないしIDEのプラグイン)で使う”noenc-urls-pats.txt”ファイルのサーバーエントリを削除したり、追加したり、修正したりする機会が時々ありますが、いままでのバージョンではコメントが使えませんでした。それを直して、コメントが使えるようにするというのが今回の記事の目指すところです。といっても、単に入力行の頭の1文字が’#’だったら読み飛ばすというだけのものですが、少し注意する点があります。まずは元々のcode fragmentから、

void ReadInFile(std::string fname,bool decode)
{
	int svrcount;
	Form1->Codec1->Password = key;
/*
	whole = new TStringList();
	urls = new TStringList();
	pats = new TStringList();
	names = new TStringList();
 */
	whole->LoadFromFile(fname.c_str());

	svrcount = whole->Count / 5;
	AnsiString aurl;
	AnsiString apat;
	AnsiString aid;

	//AnsiString key = Form1->Edit1->Text;
	//std::string restored;
	//std::string keystring(key.c_str());

	UnicodeString temp;
	UnicodeString urestored;

これではコメントも何もないので、1行読み込んで、先頭文字が’#’だったら行全体を読み飛ばすということにすれば良いので、

	String filename = fname.c_str();  //ファイル名
	TEncoding* enc = TEncoding::Default;  //使用する文字エンコーディング
	bool detectBOM = false; //ファイルの先頭にあるバイト順序マークを検索するかどうか
	int bufferSize = 1024;

	std::unique_ptr<TStreamReader> reader(new TStreamReader(filename, enc, detectBOM, bufferSize));
	while (reader->EndOfStream == false) {
		String temp = reader->ReadLine(); //1行読み込む
		if( temp.Pos("#") != 1 ){
			whole->Add(temp);
		}

	}
	reader->Close();

TStreamReaderを使って、1行読み込んで、先頭文字が#でなければ、その行を足すというアプローチになりました。全部読んでから、先頭文字を調べて’#’だったらその行を削除というのでもいいのですが、ほぼ2回scanするのも無駄だし、deleteすると即刻indexに反映されるので、エラーを出さないためには、index max -> 1という逆方向にscanしないといけないので、コードの可視性が損なわれるためです。

これでコメントが自由に使えるので、一次的にサーバーを隠したりする時にコメントが使えますね。他にも修正点があるので、まとまったらバイナリをアップするかもしれません。RRM自体に責任はないのですが、最新のGiteaサーバーとの相性が悪く、少し古いバージョンと合わせるのが吉です。

で動いています。Migrateが動きます。ちゃんと。web-uiからだと1個毎にclone urlやらpat入れないといかんのですが、rrmだと簡単にバルク処理できます。2個以上のMigrateの場合お勧めです。

ただし上記のコメント対応により、同梱のアプリケーション使えなくなりました。こちらもバルクでnoenc->encへの変換プログラムを作成するかもしれません。それまでは平文のnoenc-urls-pats.txtでご使用ください。

コメント