'cvs history -w'有什么作用?

时间:2014-08-27 22:29:35

标签: cvs

我试图确定在给定工作副本中执行的最后一次cvs update操作的时间,并且证明是困难的。 cvs history -w被记录为'仅显示从执行历史记录的同一工作目录完成的修改的记录' - 但是它们必须意味着别的东西,因为它根本没有这样做(据我所见)。

我希望如果我第一次从存储库中检出项目,然后进行一些小的更改,cvs history -e -w只会报告这些修改 - 但它仍会报告存储库中的每个更改,包括在不同项目中所做的更改。

例如,请采取以下情况:

  • $ CVSROOT包含两个项目 - project-one和project-two
  • cvs history返回修改为project-one
  • 的几行输出

如果我运行以下内容:

mkdir /home/lmitchell/cvs-repo
cd /home/lmitchell/cvs-repo
cvs checkout project-two
echo "//comment" >> bar.cpp
cvs commit bar.cpp

我希望cvs history -w只返回一行输出 - 结帐操作 - 我希望cvs history -e -w能给我两行 - 结账操作和提交操作。但是,它仍然会从存储库中的任何位置返回历史记录,如上所示。事实上,无论情况如何,我都没有看到输出的变化(在过去几个小时的尝试中)增加或删除-w标志。

那么cvs history -w究竟做了什么?

1 个答案:

答案 0 :(得分:0)

我想我已经明白了。

通过CVS源代码挖掘,发现历史记录的-w选项设置了一个名为“working”的标志,然后在以下行的函数accept_hrec()中使用:

if (!hr                 /* The last record */
    || !STREQ (hr->user, lr->user)  /* User has changed */
    || !STREQ (hr->mod, lr->mod)    /* Module has changed */
    || (working             /* If must match "workdir" */
        && (!STREQ (hr->dir, lr->dir)   /* and the 1st parts or */
        || !STREQ (hr->end, lr->end))))/* the 2nd parts differ */

    return 1;

if (working)
{                   /* If must match "workdir" */
    if (!STREQ (hr->dir, lr->dir)   /*    and the 1st parts or */
    || !STREQ (hr->end, lr->end))   /*    the 2nd parts differ */
    return 1;
}

根据代码中前面的评论,我们发现hrlr都是struct hrec类型 - 从历史文件中的单行读取的记录。该列表首先按存储库的根目录排序,然后按文件名本身排序。 hr指向列表中的下一条记录,lr指向当前记录。此外,hrec.dirhrec.end表示路径 - 第一部分(dir)跟踪存储库的根目录,end跟踪存储库中的目录(在某些之后)压缩等。)。

现在,如果我们想要打印出这个hrec,accept_hrec被设计为返回非零。因此,我们看到上述两个“工作”条件都简化为相同:

if (working && !STREQ (hr->dir, lr->dir) && !STREQ (hr->end, lr->end)) return 1

即。如果目录/结束组合不匹配,则返回NON-ZERO。由于我们的列表按路径和文件排序,因此只有在我们读完该文件的所有hrec后,该组合才会有所不同。

所以最后我们可以确定historyhistory -w之间的区别是什么。

history遍历历史记录文件中的条目列表,按照采取操作的存储库进行排序,然后按文件名本身进行排序。每当遇到文件名更改(即对该文件采取的最后记录的操作)时,它会检查:此记录是否为“结帐”记录?如果是这样,请打印 - 目前已检出此文件。

history -w完全相同 - 除了它认为文件名中的更改或存储库目录中的更改是“最后记录的操作”。因此,cvs history -w将始终打印出cvs history的超集。

遗憾的是,这对我遇到的问题没有帮助,因为CVS跟踪任何和所有远程客户端的“存储库目录” - 意味着我绝对无法获得'此repo的上次更新时间'我想。但至少我知道现在发生了什么。