1

Delphiの履歴フ​​ァイルを読み取ることができるWindows用のツールはありますか。
セッションごとに書き込まれたコード行を、セッションのタイムスタンプとともに抽出します。

どんな情報が欲しいですか

session_id   date+time             filename      lines_of_code changed
1            1-1-2011 - 13:14:36   unit1.pas     100
....


Delphi 2007を使用している場合、これを抽出するにはどのような情報が必要ですか
。 ソースファイル内のすべての変更は、次のような履歴と呼ばれるサブディレクトリに書き込まれます。

name                date_changed    type     size
project1.dpr.~1~    date-time       ~1~      1  kb
project1.dpr.~2~    date-time       ~2~      1  kb
unit1.pas.~1~       date-time       ~1~      83 kb
...

すべての履歴ファイルには、違いだけでなく、完全なソースコードが含まれています。
(したがって、ソースファイルに戻したい場合は、そのファイルを古いファイルにコーディングするだけで済みます)

Subversionではありません
将来的にはSubversionプログラムを使用してこのようなものを追跡しますが、過去のものについては、いくつかの記録も残したいと思います。
したがって、Subversionクローンがフォルダー内の古いソースファイルのバックアップにインデックスを付けることができない限り、history私は今それを探していません。

4

3 に答える 3

4

私は鈍くなります。

あなたが非常に危険な領域を踏みにじっているプロジェクトマネージャーであるかのように私には聞こえます。Johanは(激しく)プロジェクトマネージャーであることを否定しています。:D
Delphiの履歴を具体的に確認したいという願望は別として、これはプログラミングの質問というよりもスーパーユーザーの質問のように聞こえます。

このようなアプローチの危険性については、次のリンクを参照してください。
-2000行のコード
ナレッジワーカーの
生産性2.0の測定

コードの行と時間を相関させようとするときはいつでも、他の多くの考慮事項を犠牲にしてそうします。次のリストは確かに網羅的ではありません!

  • コードのセクションに関する特定の開発者の知識。
  • コードのセクションの脆弱性。
  • バグや機能の複雑さ....これはコード行とは何の関係もありません。
  • 既存の冗長性。
  • 冗長性が導入されました。
  • 行われた作業の正確さ。
  • 行われた仕事の徹底。
  • 特定の時間に行われる作業の性質。
  • 手書きと生成されたコード(dprsが生成され、dfmsが部分的に生成されます-プロパティの設定はコードの記述に似ています)。
  • 既存のコードの読みやすさ。
  • 既存のコードの柔軟性。

編集
私はあなたの質問に実際に答えていないことを知っていますが、それを十分に考慮してください。あなたが達成しようとしていることについて慎重に考えてください。


EDIT2
プロジェクトマネージャー以外の人でも、このアドバイスは有効です。時間とコード行の相関関係から意味のある結論を引き出すことはできません。科学的な観点からは、「干渉」が多すぎます。

繰り返します:あなたが達成しようとしていることについて慎重に考えてください
あなたのコメントは「あなたが何でどのくらいの期間働いたのか」と言っています。それは私にはタイムシート情報のように聞こえます。その場合、影響を受けるファイルは単純に十分です。

その結果、次のDOSコマンドの組み合わせで逃げることができる場合があります:dir、、。findstrsort

于 2011-04-20T22:13:55.230 に答える
3

いわゆる「diff互換」diffファイルまたは「パッチ」を生成する事実上すべてのDiffツールをジョブに使用できます。たとえば、これを使用できると確信しています:http: //gnuwin32.sourceforge.net/packages/diffutils.htm

コマンドラインツールを呼び出して、ファイルの新旧バージョンをパラメーターとして指定し、その出力をアナライズするだけです。基本的に、単一-またはで始まる行を気にし+ます。これにより、変更された行数の概算が得られます。凝ったものにしたい場合は、変更されたブロックを適切に検出するようにアルゴリズムを変更する必要がありますが、diffの仕事は「古い」ファイルを「新しい」ファイルに変換するために使用される出力を生成することなので、それははるかに困難です変更をカウントしません。行の編集は通常、削除とそれに続く追加として表示されます。

diffを使用して直面する問題は次のとおりです。

  • 移動された行は、削除と追加の両方として表示され、プログラマーがコードを少し再構築しただけでも、2回カウントされる可能性があります。
  • 編集された行は、複数回カウントされる場合があります。

実際のは気にせずdiff、変更されたコード行の概算が必要なため、数値を提供するもう1つの非常に単純なアイデアを次に示します。あまり正確ではありませんが、LOCカウントは、プログラマーのパフォーマンスを正確に測定するものではありません。このコードは、OLDファイルとNEWファイルの両方を調べ、OLDで見つかったがNEWでは見つからなかった行数と、NEWで見つかったがOLDでは見つからなかった行数を示します。

function CountLineChanges(const OldFile, NewFile:string):Integer;
var OldL: TStringList;
    NewL: TStringList;
    i: Integer;

  procedure FillListWithStringsFromFile(const FileName: string; const L:TStringList);
  var F: TStringList;
      i,n: Integer;
      s: string;
  begin
    F := TStringList.Create;
    try
      F.LoadFromFile(FileName);
      for i:=0 to F.Count-1 do
      begin
        s := F[i];
        if L.IndexOf(s) = -1 then
          L.Add(s)
        else
          begin
            // Seeing this line again!
            n := 1;
            while L.IndexOf(s + '#' + IntToStr(n)) <> -1 do
              Inc(n);
            L.Add(s + '#' + IntToStr(n));
          end;
      end;
    finally F.Free;
    end;
  end;

begin
  OldL := TStringList.Create;
  try
    OldL.Sorted := True;
    NewL := TStringList.Create;
    try
      NewL.Sorted := True;

      FillListWithStringsFromFile(OldFile, OldL);
      FillListWithStringsFromFile(NewFile, NewL);

      Result := 0;
      for i:=0 to OldL.Count-1 do
        if NewL.IndexOf(OldL[i]) = -1 then
          Inc(Result);
      for i:=0 to NewL.Count-1 do
        if OldL.IndexOf(NewL[i]) = -1 then
          Inc(Result);

    finally NewL.Free;
    end;
  finally OldL.Free;
  end;
end;

このコードの問題:

  • 結果として、ある場所から別の場所に移動したコードのブロックが与え0られます。
  • 編集されたすべての行は正確に2回カウントされます。
于 2011-04-20T13:11:44.170 に答える
0

IMO、代わりにソースリポジトリの履歴を使用する必要があります。つまり、破壊。すべてのユーザーのすべてのチェックインのログがタイムスタンプとともに表示されます。永遠に。

于 2011-04-20T12:23:50.643 に答える