1

是否有可以读取 Delphi 历史文件的 Windows 工具。
并提取每个会话编写的代码行以及会话的时间戳。

我想要什么信息

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


我必须从我使用 Delphi 2007中提取什么信息
。 源文件中的每个更改都会写入一个名为 history 的子目录,如下所示:

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
...

每个历史文件都包含完整的源代码,而不仅仅是差异。
(因此,如果您想恢复到源文件,您只需对该文件进行编码即可)

不是颠覆
对于未来我将使用颠覆程序来跟踪这些东西,但对于过去的东西我也想有一些记录。
因此,除非颠覆克隆可以索引文件夹中的旧源文件备份,否则history我现在不寻找它。

4

3 回答 3

4

我会直言不讳。

在我看来,您好像是一名项目经理,正在涉足极其危险的领域。约翰(强烈地)否认自己是项目经理。:D
尽管除了希望专门检查 Delphi 历史之外,这听起来更像是一个超级用户问题而不是编程问题。

请参阅以下链接了解此类方法的危险:
-2000 行代码
衡量知识工作者
生产力 2.0

每当您尝试将代码行与时间相关联时,都会以许多其他因素为代价。以下列表当然不是详尽无遗的!

  • 特定开发人员对一段代码的熟悉程度。
  • 一段代码的脆弱性。
  • 错误或功能的复杂性......与代码行无关。
  • 现有的裁员。
  • 引入了裁员。
  • 工作的准确性。
  • 开展工作的彻底性。
  • 在特定时间进行的工作的性质。
  • 手写与生成代码(生成 dprs,部分生成 dfms - 设置属性就像编写代码)。
  • 现有代码的可读性。
  • 现有代码的灵活性。

编辑
我知道我还没有真正回答你的问题,但我恳请你给予应有的考虑。请仔细考虑您要达到的目标。


EDIT2
即使对于非项目经理,这个建议也成立。您无法从时间和代码行之间的相关性中得出有意义的结论。从科学的角度来看,“干扰”太多了。

我再说一遍:请仔细考虑您要达到的目标
你的评论说“当你在什么地方工作了多长时间”。这对我来说听起来像是时间表信息,在这种情况下,只需影响哪些文件就足够了。

因此,您可能能够通过以下 DOS 命令的组合逃脱:dir, findstr, sort.

于 2011-04-20T22:13:55.230 回答
3

几乎任何生成所谓的“diff 兼容”diff 文件或“补丁”的 Diff 工具都可以用于这项工作。例如,我相信你可以使用这个: http: //gnuwin32.sourceforge.net/packages/diffutils.htm

只需调用命令行工具,将文件的新旧版本作为参数并对其输出进行Annalize:您基本上关心以单个-or开头的行+。这将使您粗略估计更改的行数。如果您想变得花哨,则需要修改算法以正确检测更改的块,但这困难得多,因为 diff 的工作是生成用于将“旧”文件转换为“新”文件的输出,不计算变化。行编辑通常显示为先删除后添加。

以下是使用 diff 时您将面临的问题:

  • 移动的行显示为删除和添加,并且可能会被计算两次,即使程序员所做的只是稍微重构代码。
  • 编辑的行数可能不止一次。

由于您不关心实际的diff,并且您想要对更改的代码行进行粗略估计,因此这是另一个非常简单的想法,它为您提供了一个数字。不是很准确,但是再一次,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
  • 所有编辑的行都被精确计算两次。
于 2011-04-20T13:11:44.170 回答
0

IMO,您应该改用您的源存储库历史记录。即颠覆。它将向您显示所有用户的所有签到日志以及时间戳。永远。

于 2011-04-20T12:23:50.643 回答