Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2013, 22:31   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Всем спасибо. Таки получилось!

Код:
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й параметр)

Сканируете рабочую копию, сравниваете с переданной вам ревизией, и по номеру ревизии файла, находятся все обновленные файлы.

Работает щикарно
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
веб-програмист для внесения дополнений и изменений в код сайта veleri Фриланс 0 25.03.2013 01:49
Требуется Программист Для Внесения Дополнений Сайта Dmitriy89 PHP 0 02.04.2012 10:23
Хостинг с поддержкой SVN Blade Свободное общение 2 22.01.2012 03:26
Как качать из SVN? TwiX Общие вопросы по программированию, компьютерный форум 13 28.09.2011 12:24
Pascal,Алгоритм для нахождения в тексте дополнений kikimka Помощь студентам 6 18.11.2009 15:57