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_ALLSCC_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:\AC:\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 存储在本地,因此源代码管理无法解决差异。

有两种方法可以解决这种情况,即源代码管理版本的本地缓存与源代码管理数据库不同步:

  1. 不允许重命名当前已检查的源代码管理数据库中的文件。

  2. 执行等效的“删除旧”,后跟“添加新”。 以下算法是实现此目的的一种方法。

    1. 调用 SccQueryChanges 函数,了解如何在源代码管理数据库中将 a.txt 重命名b.txt

    2. 将本地 a.txt 重命名为 b.txt

    3. SccGeta.txtb.txt 调用函数。

    4. 由于 源代码管理数据库中不存在 a.txt ,因此会清除缺少 a.txt 版本信息的本地版本缓存。

    5. 要检查的 b.txt 文件与本地 b.txt 文件的内容合并。

    6. 现在可以在其中检查更新的 b.txt 文件。

另请参阅