> проекты > компоненты инфраструктуры
Source Code Control Interface

Введение

       Для унификации способа доступа к хранилищам исходных кодов ваших проектов, управляемыми различными средствами контроля версий, корпорацией Microsoft был разработан и в настоящее время остается стандартом de-facto интерфейс SCCI. Данный интерфейс реализуют все самые популярные для платформы Microsoft Windows средства контроля версий: WinCVS, PVCS, Visual Source Safe и Rational ClearCase. Однако, для реализации программного способа подключения к хранилищам этих сред необходим по крайней мере заголовочный файл, получить который можно только в случае подписания с Microsoft договора о неразглашении.

      Зачастую сторонним разработчикам достаточно лишь примитивных функций получения списка файлов, их блокирования (checkout) и "возвращения" (checkin) обратно в хранилище. Jim Kingdon (электронного адреса, к сожалению, у меня нет) исследовал библиотеку CVS, реализующую данный интерфейс и описал ту его часть, которую чаще всего приходится использовать. Мною был разработан класс-обертка интерфейса SCCI с некоторыми дополнительными расширениями, позволяющими получить список установленных сред (vendor) и подключиться к любому из них, что реализуется путем динамической загрузки библиотек.

Описание функций
EnumVendorsВозвращает список установленных на машине средств контроля версий, а также индекс в этом списке текущего используемого средства.
SelectVendorВыбор средства контроля версий, загрузка динамической библиотеки, реализующей интерфейс SCCI.
GetErrorTextВозвращает текст последней ошибки.
SccInitializeИнициализация библиотеки.
SccUninitializeДеинициализация библиотеки.
SccGetProjPathВозвращет путь к проекту в терминах конкретной среды. Желательно использовать перед открытием проекта, даже если вы уверены в передаваемом пути.
SccOpenProjectОткрывает заданный проект, перед деинициализацией необходимо закрывать проекты.
SccCloseProjectЗакрывает проект, необходимо вызывать каждый раз после открытия проекта.
SccPopulateListВозвращает список файлов в данном проекте.
SccCheckoutCheckout одного или нескольких файлов.
SccUncheckoutОтмена предыдущей операции.
SccCheckinСохранение одного или нескольких файлов в хранилище версий.
SccGetLatestЗагрузка на локальную машину последних версий заданных файлов.
SccGetCommandOptionsВозвращает число-параметр, специфичные для конкретной среды, по заданной команде.
HasAdvancedOptionsОпределяет, есть ли расширенные опции для конкретной команды.
Пример использования
===================getsccfilelist.cpp========================
...
#include <list>
#include <map>
#include "cstring.h"
#include "sccvendor.h"
...
CSCCVendor m_scc;
...
// определяем имя текущего пользователя для подключения к 
// VSS, чтобы не происходило интерфейсное перелогонивание
//
TCHAR lptName[_MAX_PATH] = {0};
DWORD dwNameSize = _MAX_PATH - 1;

if(::GetUserName(lptName, &dwNameSize)) {
	return false;
}
username = lptName;

// загружаем библиотеку, реализующую SCC-интерфейс
//
m_scc.SelectVendor("Microsoft Visual Source Safe");

// инициализация окружения SCC
//
TCHAR comment[255] = {0};

if(!m_scc.SccInitialize(NULL, comment)) {
	error(m_scc.GetErrorText());
	return false;
}

TCHAR lpProject[255] = {0};
TCHAR lpResource[255] = {0};
TCHAR lpAuxProject[255] = {0};

sprintf(lpProject, "\"$/PROJECT_NAME\"");
	
// определим путь (в терминах SCC vendor) к проекту
//
if(!m_scc.SccGetProjPath(NULL, (char *) username, 
	lpProject, (char *) local, 
	lpAuxProject, FALSE, &bNew)) 
{
	error(m_scc.GetErrorText());
	return false;
}

TCHAR lpComment[255] = {0};

// открываем проект
//
if(!m_scc.SccOpenProject(NULL, (char *) username, 
	lpProject, (char *) local, 
	lpAuxProject, lpComment, 0)) 
{
	error(m_scc.GetErrorText());
	return false;
}

// получаем список файлов проекта
//
std::vector libs;

if(!m_scc.SccPopulateList(SCC_command_get, 
		0, NULL, libs, NULL, 0)) {
	error(m_scc.GetErrorText());
	return false;
}

// по окончании всех действий закрываем проект
//
m_scc.SccCloseProject();
...
=======================================================

 Evgeny Savitsky © 2002-2003