我试图确定在给定工作副本中执行的最后一次cvs update
操作的时间,并且证明是困难的。 cvs history -w
被记录为'仅显示从执行历史记录的同一工作目录完成的修改的记录' - 但是它们必须意味着别的东西,因为它根本没有这样做(据我所见)。
我希望如果我第一次从存储库中检出项目,然后进行一些小的更改,cvs history -e -w
只会报告这些修改 - 但它仍会报告存储库中的每个更改,包括在不同项目中所做的更改。
例如,请采取以下情况:
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
究竟做了什么?
答案 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;
}
根据代码中前面的评论,我们发现hr
和lr
都是struct hrec
类型 - 从历史文件中的单行读取的记录。该列表首先按存储库的根目录排序,然后按文件名本身排序。 hr
指向列表中的下一条记录,lr
指向当前记录。此外,hrec.dir
和hrec.end
表示路径 - 第一部分(dir
)跟踪存储库的根目录,end
跟踪存储库中的目录(在某些之后)压缩等。)。
现在,如果我们想要打印出这个hrec,accept_hrec
被设计为返回非零。因此,我们看到上述两个“工作”条件都简化为相同:
if (working && !STREQ (hr->dir, lr->dir) && !STREQ (hr->end, lr->end)) return 1
即。如果目录/结束组合不匹配,则返回NON-ZERO。由于我们的列表按路径和文件排序,因此只有在我们读完该文件的所有hrec后,该组合才会有所不同。
所以最后我们可以确定history
和history -w
之间的区别是什么。
history
遍历历史记录文件中的条目列表,按照采取操作的存储库进行排序,然后按文件名本身进行排序。每当遇到文件名更改(即对该文件采取的最后记录的操作)时,它会检查:此记录是否为“结帐”记录?如果是这样,请打印 - 目前已检出此文件。
history -w
完全相同 - 除了它认为文件名中的更改或存储库目录中的更改是“最后记录的操作”。因此,cvs history -w
将始终打印出cvs history
的超集。
遗憾的是,这对我遇到的问题没有帮助,因为CVS跟踪任何和所有远程客户端的“存储库目录” - 意味着我绝对无法获得'此repo的上次更新时间'我想。但至少我知道现在发生了什么。