146 lines
5.6 KiB
ObjectPascal
146 lines
5.6 KiB
ObjectPascal
unit VersionControl;
|
|
{$MODE Delphi}
|
|
{$codepage UTF8}
|
|
interface
|
|
uses LCLIntf, LCLType, LMessages, SysUtils, StrUtils, Forms, Classes,
|
|
{$IFDEF WINDOWS}PJVersionInfo{$ENDIF};
|
|
type TSmallVersionInfo = record
|
|
sviMajor, sviMinor: int64;
|
|
end;
|
|
type TVersionInfo = record
|
|
viMajor, viMinor, viRelease, viBuild: integer;
|
|
end;
|
|
function SmallVersionInfoToStr (const Value: TSmallVersionInfo): string; stdcall;
|
|
function VersionInfoToStr (const Value: TVersionInfo): string; stdcall;
|
|
function VersionInfoToSmallVersionInfo (const Value: TVersionInfo): TSmallVersionInfo; stdcall;
|
|
function SmallVersionInfoToVersionInfo (const Value: TSmallVersionInfo; const ANilValue: integer = 0): TVersionInfo; stdcall;
|
|
function StrToVersionInfo (const AString: string): TVersionInfo; stdcall;
|
|
function StrToSmallVersionInfo (const AString: string): TSmallVersionInfo; stdcall;
|
|
function CompareVersionInfo (const AVersionInfo1, AVersionInfo2: TVersionInfo): integer; stdcall;
|
|
function CompareSmallVersionInfo (const ASmallVersionInfo1, ASmallVersionInfo2: TSmallVersionInfo): integer; stdcall;
|
|
{$IFDEF WINDOWS}function GetApplicationVersionInfoStr (const AFileName, AVersionSTR: string): string; STDCALL;{$ENDIF}
|
|
const NilVersionInfo: TVersionInfo = (viMajor: 0; viMinor: 0; viRelease: 0; viBuild: 0);
|
|
NilSmallVersionInfo: TSmallVersionInfo = (sviMajor: 0; sviMinor: 0);
|
|
implementation
|
|
function SmallVersionInfoToStr (const Value: TSmallVersionInfo): string;
|
|
const Mask: string = '%d.%d';
|
|
begin
|
|
Result:= Format(Mask, [Value.sviMajor, Value.sviMinor]);
|
|
end;
|
|
function VersionInfoToStr (const Value: TVersionInfo): string;
|
|
const Mask: string = '%d.%d.%d.%d';
|
|
begin
|
|
Result:= Format(Mask, [Value.viMajor, Value.viMinor, Value.viRelease, Value.viBuild]);
|
|
end;
|
|
function VersionInfoToSmallVersionInfo (const Value: TVersionInfo): TSmallVersionInfo;
|
|
begin
|
|
Result.sviMajor:= Value.viMajor;
|
|
Result.sviMinor:= Value.viMinor;
|
|
end;
|
|
function SmallVersionInfoToVersionInfo (const Value: TSmallVersionInfo; const ANilValue: integer = 0): TVersionInfo;
|
|
begin
|
|
Result.viMajor:= Value.sviMajor;
|
|
Result.viMinor:= Value.sviMinor;
|
|
Result.viRelease:= ANilValue;
|
|
Result.viBuild:= ANilValue;
|
|
end;
|
|
function StrToVersionInfo (const AString: string): TVersionInfo;
|
|
var stringver: string;
|
|
CurrDelim, NextDelim, CurrIndex: Integer;
|
|
StrArray: array [1..4] of string;
|
|
begin
|
|
stringver:= AString;
|
|
CurrDelim:= 1;
|
|
CurrIndex:= 1;
|
|
repeat
|
|
NextDelim:= PosEx('.', stringver, CurrDelim);
|
|
if NextDelim = 0 then
|
|
NextDelim:= Length(stringver) + 1;
|
|
StrArray[CurrIndex]:= Copy(stringver, CurrDelim, NextDelim - CurrDelim);
|
|
CurrDelim:= NextDelim + 1;
|
|
CurrIndex:= CurrIndex + 1;
|
|
until CurrDelim > Length(stringver);
|
|
Result.viMajor:= StrToInt(StrArray[1]);
|
|
Result.viMinor:= StrToInt(StrArray[2]);
|
|
Result.viRelease:= StrToInt(StrArray[3]);
|
|
Result.viBuild:= StrToInt(StrArray[4]);
|
|
end;
|
|
function StrToSmallVersionInfo (const AString: string): TSmallVersionInfo;
|
|
var stringver: string;
|
|
CurrDelim, NextDelim: Integer;
|
|
StrArray: array [1..2] of string;
|
|
begin
|
|
stringver:= AString;
|
|
NextDelim:= PosEx('.', stringver, 1);
|
|
if NextDelim = 0 then
|
|
begin
|
|
StrArray[1]:= stringver;
|
|
Exit;
|
|
end;
|
|
StrArray[1]:= Copy(stringver, 1, NextDelim - 1);
|
|
CurrDelim:= NextDelim + 1;
|
|
NextDelim:= PosEx('.', stringver, CurrDelim);
|
|
if NextDelim = 0 then
|
|
NextDelim:= Length(stringver) + 1;
|
|
StrArray[2]:= Copy(stringver, CurrDelim, NextDelim - CurrDelim);
|
|
Result.sviMajor:= StrToInt(StrArray[1]);
|
|
Result.sviMinor:= StrToInt(StrArray[2]);
|
|
end;
|
|
function CompareVersionInfo (const AVersionInfo1, AVersionInfo2: TVersionInfo): integer;
|
|
//Result:
|
|
// 0 - AVersionInfo1 = AVersionInfo2
|
|
// -1 - AVersionInfo1 > AVersionInfo2
|
|
// 1 - AVersionInfo1 < AVersionInfo2
|
|
begin
|
|
//by default this versions are equal
|
|
Result:= 0;
|
|
//equal
|
|
if ((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
|
|
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
|
|
(AVersionInfo1.viRelease = AVersionInfo2.viRelease) and
|
|
(AVersionInfo1.viBuild = AVersionInfo2.viBuild)) then
|
|
Result:= 0;
|
|
//more
|
|
if ((AVersionInfo1.viMajor > AVersionInfo2.viMajor) or
|
|
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
|
|
(AVersionInfo1.viMinor > AVersionInfo2.viMinor)) or
|
|
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
|
|
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
|
|
(AVersionInfo1.viRelease > AVersionInfo2.viRelease)) or
|
|
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
|
|
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
|
|
(AVersionInfo1.viRelease = AVersionInfo2.viRelease) and
|
|
(AVersionInfo1.viBuild > AVersionInfo2.viBuild))) then
|
|
Result:= -1;
|
|
//less
|
|
if ((AVersionInfo1.viMajor < AVersionInfo2.viMajor) or
|
|
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
|
|
(AVersionInfo1.viMinor < AVersionInfo2.viMinor)) or
|
|
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
|
|
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
|
|
(AVersionInfo1.viRelease < AVersionInfo2.viRelease)) or
|
|
((AVersionInfo1.viMajor = AVersionInfo2.viMajor) and
|
|
(AVersionInfo1.viMinor = AVersionInfo2.viMinor) and
|
|
(AVersionInfo1.viRelease = AVersionInfo2.viRelease) and
|
|
(AVersionInfo1.viBuild < AVersionInfo2.viBuild))) then
|
|
Result:= 1;
|
|
end;
|
|
function CompareSmallVersionInfo (const ASmallVersionInfo1, ASmallVersionInfo2: TSmallVersionInfo): integer;
|
|
var AVI1, AVI2: TVersionInfo;
|
|
begin
|
|
AVI1:= SmallVersionInfoToVersionInfo(ASmallVersionInfo1);
|
|
AVI2:= SmallVersionInfoToVersionInfo(ASmallVersionInfo2);
|
|
Result:= CompareVersionInfo(AVI1, AVI2);
|
|
end;
|
|
{$IFDEF WINDOWS}
|
|
function GetApplicationVersionInfoStr (const AFileName, AVersionSTR: string): string;
|
|
var VIC: TPJVersionInfo;
|
|
begin
|
|
VIC:= TPJVersionInfo.Create(nil);
|
|
VIC.FileName:= AFileName;
|
|
Result:= VIC.StringFileInfo[AVersionSTR];
|
|
VIC.Free;
|
|
end;
|
|
{$ENDIF WINDOWS}
|
|
end.
|