SccGet 函数
此函数检索一个或多个文件的副本,用于查看和编译,但不用于编辑。 在大多数系统中,文件标记为只读。
语法
SCCRTN SccGet(
LPVOID pvContext,
HWND hWnd,
LONG nFiles,
LPCSTR* lpFileNames,
LONG fOptions,
LPCMDOPTS pvOptions
);
参数
pvContext
[in]源代码管理插件的上下文结构。
hWnd
[in]源代码管理插件可以作为其提供的任何对话框的父级的 IDE 窗口的句柄。
nFiles
[in]数组中指定的 lpFileNames
文件数。
lpFileNames
[in]要检索的文件的完全限定名称数组。
fOptions
[in]命令标志 (SCC_GET_ALL
, SCC_GET_RECURSIVE
)。
pvOptions
[in]特定于源代码管理插件的选项。
返回值
此函数的源代码管理插件实现应返回以下值之一:
值 | 说明 |
---|---|
SCC_OK | 获取操作成功。 |
SCC_E_FILENOTCONTROLLED | 该文件不在源代码管理下。 |
SCC_E_OPNOTSUPPORTED | 源代码管理系统不支持此操作。 |
SCC_E_FILEISCHECKEDOUT | 无法获取用户当前已检查的文件。 |
SCC_E_ACCESSFAILURE | 访问源代码管理系统时出现问题,可能是因为网络或争用问题。 建议重试。 |
SCC_E_NOSPECIFIEDVERSION | 指定了无效的版本或日期/时间。 |
SCC_E_NONSPECIFICERROR | 非特定故障;文件未同步。 |
SCC_I_OPERATIONCANCELED | 操作在完成前已取消。 |
SCC_E_NOTAUTHORIZED | 用户无权执行此操作。 |
备注
此函数使用要检索的文件的名称计数和数组进行调用。 如果 IDE 传递标志 SCC_GET_ALL
,则表示项 lpFileNames
不是文件,而是目录,并且将检索给定目录中源代码管理下的所有文件。
标志 SCC_GET_ALL
可以与标志结合使用 SCC_GET_RECURSIVE
,以检索给定目录和所有子目录中的所有文件。
注意
SCC_GET_RECURSIVE
不应在没有 . 的情况下 SCC_GET_ALL
通过。 另请注意,如果目录 C:\A 和 C:\A\B 在递归 get 上传递, 则 C:\A\B 及其所有子目录实际上将检索两次。 IDE 负责(而不是源代码管理插件)以确保将此类重复项保留在数组中。
最后,即使源代码管理插件在初始化时指定 SCC_CAP_GET_NOUI
了标志,指示它没有 Get 命令的用户界面,IDE 仍可能调用此函数来检索文件。 该标志只是意味着 IDE 不显示“获取”菜单项,并且插件不应提供任何 UI。
重命名文件和 SccGet
情况:用户检查文件(例如 a.txt)并对其进行修改。 在可以检查 a.txt 之前,第二个用户在源代码管理数据库中将 a.txt 重命名为 b.txt,检查 b.txt,对该文件进行一些修改,并检查该文件。 第一个用户希望第二个用户所做的更改,以便第一个用户将其本地版本的 a.txt 文件重命名为 b.txt,并获取该文件。 但是,跟踪版本号的本地缓存仍认为第一个版本的 a.txt 存储在本地,因此源代码管理无法解决差异。
有两种方法可以解决这种情况,即源代码管理版本的本地缓存与源代码管理数据库不同步:
不允许重命名当前已检查的源代码管理数据库中的文件。
执行等效的“删除旧”,后跟“添加新”。 以下算法是实现此目的的一种方法。
调用 SccQueryChanges 函数,了解如何在源代码管理数据库中将 a.txt 重命名为 b.txt。
将本地 a.txt 重命名为 b.txt。
SccGet
为 a.txt 和 b.txt 调用函数。由于 源代码管理数据库中不存在 a.txt ,因此会清除缺少 a.txt 版本信息的本地版本缓存。
要检查的 b.txt 文件与本地 b.txt 文件的内容合并。
现在可以在其中检查更新的 b.txt 文件。