1

Mercurial への移行の準備として、何千もの ,v ファイルに体系的な変更を加えたいと考えています。(オリジナルのコピーを編集して、急いで追加します。)

私が求めている種類の変更の例:

  1. メッセージが既知のユーザー名を示すテキスト (例: [Fred Bloggs]) で始まる各リビジョンについて、コメント内のユーザー名が .v ファイル内の作成者と一致する場合、不要なユーザー名テキストをコミット メッセージから削除します。
  2. ,v に有用な説明が含まれている場合は、それをリビジョン 1.1 のコミット メッセージに追加します (cvs2hg は説明を無視しますが、多くの CVS ファイルは実際には RCS から取得したものであり、最初のコミット メッセージを説明フィールドに簡単に入力できます。間違い)
  3. 特定の共有ユーザー アカウントから行われた編集については、コミット メッセージの内容に応じて作成者を調整します。

私が検討したこと:

  1. 個々の .v ファイルごとに 'cvs log' を実行します - 出力を解析し、rcs -mこの履歴を変更するために使用します。これには次のような問題があります。
    • テキストファイルを渡す方法がないようですrcs -m- そのため、リビジョンメッセージに一重引用符や二重引用符が含まれている場合、または複数行にまたがっている場合、スクリプトでそれを正しく引用するのは非常に困難です
    • リビジョンに関連付けられた作成者名を変更するための rcs または cvs 機能が見当たりません
    • それほど重要ではありませんが、膨大な数のプロセスが開始される可能性があります-遅くなる可能性があると思います
  2. .vファイルを解析し、内容を調整するPython を作成します。これには次のような問題があります。
    • ,v ファイルには、テキストであるはずのバイナリ ファイルやその逆の行末が混在しているため、ファイルが破損しないように細心の注意を払う必要があります。
    • @ 文字が複数行コメントの行頭にある場合は、コミット メッセージで @ 文字を引用する際に注意が必要です。
    • コミットされたファイルの最後の行が変更され、改行がないリビジョンでも注意が必要です。\n
  3. 使用しているcvs2hgのバージョンを複製し、そのコードを調整して目的の編集をインプレースで行います。

作業が少ない他のアプローチや、この種の機能を実装する既存のコードはありますか?

4

2 に答える 2

2

Your first approach may be the best one. I know that in Perl, handling quotation marks and multiple lines wouldn't be a problem. For example:

my $revision = ...;
my $log_message = ...;
system('rcs', "-m$revision:$log_message", $filename);

where $log_message can contain any arbitrary text. Since the string doesn't go through the shell, newlines and other metacharacters won't be reinterpreted. I'm sure you can do the same thing in Python.

(As for your second approach, I wouldn't expect line endings to be a problem. If you have Unix-style \n endings and Windows-style \r\n endings, you can just treat the trailing \r as part of the line, and everything should stay consistent. I'm making some assumptions here about the layout of ,v files.)

于 2012-06-05T05:01:13.710 に答える