Всем спасибо. Таки получилось!
Код:
unit clSVNMngr;
interface
uses SysUtils, ComObj, ActiveX, Variants, Windows;
const
cOleName = 'SubWCRev.object';
//Сабж: http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-subwcrev-com-interface.html
type
TSVNObjectInfo = packed record
Name: WideString; //Название элемента
Author: WideString; //Автор
Revision: Integer; //Ревизия
MinRevision: Integer; //Минимальная ревизия рабочей копии
MaxRevision: Integer; //Макс. ревизия рабочей копии
HasLocalChanges: Boolean; //Есть ли изменения в локальной копии
HasUnversioned: Boolean; //Есть ли не синхронизированные, с SVN, элементы(для папок)?
HasVersioned: Boolean; //Элемент версирован?
NeedsLocking: Boolean; //Нужна ли блокировка?
IsLocked: Boolean; //Блокирован?
LockCreationDate: string; // дата и время блокировки
LockOwner: string; //Кто блокировал
LockComment: string; //Камент от блокировавшего
Date: string; //Дата и время наибольшей ревизии
end;
type
TSVNManager = class(TObject)
private
fConnector: OleVariant;
fAttached: Boolean;
protected
function CheckSVNInstalled: Boolean;
public
function IsSVNItem(aPath: string): Boolean; //Является ли папка\файл частью SVN-копии?
function GetRevesionNumber(aPath: string): Integer; //Получает номер ревизии папки/файла
function GetInfo(aPath: string; out aInfo: TSVNObjectInfo): Boolean; //Получает информацию об папке/файле
property Installed: Boolean read CheckSVNInstalled; //Установен ли COM-серверб TotroiseSVN?
property Connector: OleVariant read fConnector write fConnector;
property Attached: Boolean read fAttached; //Подключены к COM?
function Attach(out sError: string): Boolean; //Подключение
procedure Detach; //Отклюение
constructor Create;
destructor Destroy; override;
end;
implementation
{ TSVNManager }
function TSVNManager.CheckSVNInstalled: boolean;
var
ClassID: TCLSID;
begin
Result := (CLSIDFromProgID(PWideChar(WideString(cOleName)), ClassID) = S_OK);
end;
function TSVNManager.Attach(out sError: string): Boolean;
begin
Result := False;
Detach;
if installed then
begin
fConnector := CreateOLEObject(cOleName);
fAttached := not VarIsNull(fConnector);
Result := fAttached; //AMAZING LOGIC.. :d
end
else
sError := 'TortoiseSVN not installed.';
end;
constructor TSVNManager.Create;
begin
inherited Create;
end;
destructor TSVNManager.Destroy;
begin
if Attached then
Detach;
inherited;
end;
procedure TSVNManager.Detach;
begin
fConnector := Unassigned; //Release link to object
end;
function TSVNManager.IsSVNItem(aPath: string): Boolean;
var
v: OleVariant;
begin
Result := False;
if Attached then
begin
V := fConnector.GetWCInfo(aPath, True, True);
Result := v.IsSvnItem;
end;
end;
function TSVNManager.GetRevesionNumber(aPath: string): Integer;
var
s: string;
begin
Result := -1;
if Attached then
begin
fConnector.GetWCInfo(aPath, True, True);
if not fConnector.IsSvnItem then
Exit;
s := fConnector.Revision;
Result := StrToIntDef(s, -1);
end;
end;
function TSVNManager.GetInfo(aPath: string;
out aInfo: TSVNObjectInfo): Boolean;
var
Rec: TSVNObjectInfo;
begin
Result := False;
ZeroMemory(@rec, SizeOf(TSVNObjectInfo));
if Attached then
begin
fConnector.GetWCInfo(aPath, True, True);
Rec.Name := aPath;
Rec.Revision := StrToIntDef(fConnector.Revision, -1);
Rec.Author := fConnector.Author;
Rec.Date := fConnector.Date;
Rec.MinRevision := StrToIntDef(fConnector.MinRev, -1);
Rec.MaxRevision := StrToIntDef(fConnector.MaxRev, -1);
Rec.HasLocalChanges := fConnector.HasModifications;
Rec.HasUnversioned := fConnector.HasUnversioned;
Rec.HasVersioned := fConnector.IsSvnItem;
Rec.NeedsLocking := fConnector.NeedsLocking;
Rec.IsLocked := fConnector.IsLocked;
Rec.LockCreationDate := fConnector.LockCreationDate;
Rec.LockOwner := fConnector.LockOwner;
Rec.LockComment := fConnector.LockComment;
Result := True;
end;
end;
end.
Программа:
3м параметром вам передается ревизия, 5м - путь к рабочей копии.
TortoiseSVN:
В настройках, в разделе Hook scripts указываете путь к рабочей копии, тип ловушки(в моём случае post-update), в command line указываете путь к своему exe.
TortoiseSVN не передает вам список файлов.
Все, что вам передается, это:
Глубина чего-то там(2й параметр)
Номер ревизии(3й параметр)
Файл ошибок(4й параметр)
Путь к рабочей копии(5й параметр)
Сканируете рабочую копию, сравниваете с переданной вам ревизией, и по номеру ревизии файла, находятся все обновленные файлы.
Работает щикарно