Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
4th
Окт
Разработка дополнений для SVN
Posted by Chas under Delphi
Собственно сабж. Кто-нибудь, что-нибудь знает, делал?
Хочу написать плагин к TurtoiseSVN, чтобы после обновления файлов со спец. расширением из репозитория, с ними, автоматом, происходило что-то ещё(в моём случае — перекомпиляция этих файлов). Руками уж очень муторно это делать, отнимает много времени.
может кто-нибудь занимался чем-то подобным, или есть способ проще?
Человек_Борща
Всем спасибо. Таки получилось!
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й параметр)
Сканируете рабочую копию, сравниваете с переданной вам ревизией, и по номеру ревизии файла, находятся все обновленные файлы.
Работает щикарно
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)