2009-06-25 7 views
8

CVSを使用して2分法を実装するためのスクリプトでは、現在のチェックアウトの「タイムスタンプ」が何であるか把握したいと思います。言い換えると、私がブランチ/タグ上にいる場合、そのブランチ/タグにコミットされた最後のタイムスタンプを知りたい。私が頭の上にいるなら、私は頭の最後のタイムスタンプを知りたい。CVSチェックアウトで最新のコミット日付を取得する方法

cvsチェックアウトは異なるタイムスタンプ/リビジョン/ ...で異なるファイルを持つことができるので、これは100%保証されていませんが、ほとんどの場合正解です。

単純には、私は

cvs log -N | grep ^date: | sort | tail -n 1 | cut -d\; -f1 

はそれをするつもりだったと思ったが、それはそれはすべてのブランチ/タグのために、歴史をコミット全体を通過判明します。

答えて

2

ブランチ上のCVSファイルのタイムスタンプが異なるため、ブランチの最後の時刻情報を得るために1つのファイルを選ぶ正確さはほとんどありません。

しかし、頻繁に変更されるファイルがあれば、より良い結果が得られます。 たとえば、私の拠点では、version.hというファイルがあります。このファイルはすべてのバージョンシフト(マイナーまたはメジャー)で更新されます。これは、現在のバージョンの時間情報に使用できます(ブランチ内のすべてのファイルでは正確ではありませんが、最終結果が得られます)。

あなたはあなたのボトムライン値を与えることができたファイルを知っているのであれば、

cvs log path/to/version.h -r branch/tag | grep ^date | sort | tail -1 

はあなたにそのファイルの最後のタイムスタンプを提供します。


あなたが

find /base/dir -type f | grep -v CVS > files.txt 

、このようなベースのファイル全体の集合を列挙することができる場合、あなたはループCVSはファイルごとに上記のコマンドができ、

rm -f allFiles.txt 
for f in $(<files.txt); do cvs log $f ...etc... tail -1 >> allFiles.txt 
sort allFiles.txt | tail -1 

最終ライン最新のコミットの正確な日付が表示されます。
ああ、あなたはファイル名を取得しません。(それはさらにいくつかのfuで行うことができます)

+0

私はあまりにも、あまりにも思いつくことができる唯一のものでした。結局、私は1つのCVSログを作成し、それをすべてのファイルについて解析しました。それぞれのファイルでそれを行うと、遅くなってしまいます。 –

+0

これは固定日付をサポートしていないと考えられます。つまり、選択した日付の代わりに最新の日付が表示されます。 – Penz

0

ファイルが変更された最新の時刻を得るためのより速い方法です。

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date 

日付のみを取得したい場合は、使用:

cvs log -bd `date +%Y-%m-%d` ChangeLog | grep ^date | sed 's/date: \([^ ]*\).*/\1/' 

これはあなたが唯一気にCVSに伝えることを可能にする、デフォルトの枝と-dを使用しています-bフラグを使用しています所定の時間までの最新バージョン。 ``式は現在の日付を制限として渡し、最新のコミットを与えます。

gnuplot CVSリポジトリで、-dフラグを使用すると、実行時間が〜4秒から〜1.5秒に短縮されます。