いわゆる「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回カウントされます。