[JEDI.NET-commits] main/run Jedi.System.SourceVersioning.pas,1.2,1.3
Status: Pre-Alpha
Brought to you by:
jedi_mbe
From: Marcel B. <jed...@us...> - 2005-01-22 14:39:17
|
Update of /cvsroot/jedidotnet/main/run In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6714/main/run Modified Files: Jedi.System.SourceVersioning.pas Log Message: Completed the unit. Index: Jedi.System.SourceVersioning.pas =================================================================== RCS file: /cvsroot/jedidotnet/main/run/Jedi.System.SourceVersioning.pas,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Jedi.System.SourceVersioning.pas 21 Jan 2005 20:09:02 -0000 1.2 --- Jedi.System.SourceVersioning.pas 22 Jan 2005 14:39:05 -0000 1.3 *************** *** 1,2 **** --- 1,25 ---- + {--------------------------------------------------------------------------------------------------- + The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you + may not use this file except in compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/MPL-1.1.html + + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + KIND, either expressed or implied. See the License for the specific language governing rights and + limitations under the License. + + The Original Code is: Jedi.System.SourceVersioning.pas, released on 2006-01-21. + + The Initial Developer of the Original Code is Marcel Bestebroer + Portions created by Marcel Bestebroer are Copyright (C) 2004 Marcel Bestebroer + All Rights Reserved. + + Contributor(s): + + You may retrieve the latest version of this file at the JEDI.NET home page, located at + http://sf.net/projects/jedidotnet + + Known Issues: + ---------------------------------------------------------------------------------------------------} + // $Id$ unit Jedi.System.SourceVersioning; *************** *** 5,29 **** type {$REGION 'Forward declarations'} ! SourceVersionAttribute = class; ! SourceVersionRevision = record; {$ENDREGION} ! {$REGION 'SourceVersion attribute'} [AttributeUsage(AttributeTargets.Class or AttributeTargets.Delegate or AttributeTargets.Enum or AttributeTargets.Interface or AttributeTargets.Struct, &Inherited = False)] ! SourceVersionAttribute = class (Attribute) {$REGION 'Constructors'} public ! constructor Create(id: string); overload; constructor Create(sourceFile, revision, date: string); overload; ! {$ENDREGION} ! {$REGION 'Constants'} ! strict protected ! const dateFormat = 'yyyy\/MM\/dd HH\:mm\:ss'; {$ENDREGION} {$REGION 'Data'} strict private FDate: DateTime; ! FRevision: SourceVersionRevision; FSourceFile: string; {$ENDREGION} --- 28,53 ---- type {$REGION 'Forward declarations'} ! Revision = record; {$ENDREGION} ! {$REGION 'SourceInfo attribute'} [AttributeUsage(AttributeTargets.Class or AttributeTargets.Delegate or AttributeTargets.Enum or AttributeTargets.Interface or AttributeTargets.Struct, &Inherited = False)] ! SourceInfoAttribute = class (Attribute) ! {$REGION 'Constants'} ! strict protected ! const dateFormat = 'yyyy''/''MM''/''dd HH'':''mm'':''ss'; ! {$ENDREGION} {$REGION 'Constructors'} public ! constructor Create(sourceFile: string; revision: Revision; date: DateTime); overload; ! constructor Create(sourceFile: string; revision: Revision; date: string); overload; constructor Create(sourceFile, revision, date: string); overload; ! constructor Create(sourceFile: string; revision: Double; date: string); overload; {$ENDREGION} {$REGION 'Data'} strict private FDate: DateTime; ! FRevision: Revision; FSourceFile: string; {$ENDREGION} *************** *** 31,51 **** public property Date: DateTime read FDate; ! property Revision: SourceVersionRevision read FRevision; property SourceFile: string read FSourceFile; {$ENDREGION} {$REGION 'Static parsing methods'} public class function ParseDate(date: string): DateTime; static; ! class procedure ParseId(id: string; out source: string; out revision: SourceVersionRevision; out date: DateTime); static; ! class function ParseRevision(revision: string): SourceVersionRevision; static; class function ParseSource(source: string): string; static; {$ENDREGION} end; {$ENDREGION} ! {$REGION 'SourceVersion revision type'} ! [SourceVersion('$Header$')] ! SourceVersionRevision = record (IComparable) {$REGION 'Constructors'} public --- 55,105 ---- public property Date: DateTime read FDate; ! property Revision: Revision read FRevision; property SourceFile: string read FSourceFile; {$ENDREGION} + end; + {$ENDREGION} + + {$REGION 'CVSSourceVersion attribute'} + CVSSourceInfoAttribute = class (SourceInfoAttribute) + {$REGION 'Constructors'} + public + constructor Create(id: string); overload; + constructor Create(id: string; pathIgnoreLevel: Integer); overload; + constructor Create(sourceFile, revision, date: string); overload; + constructor Create(sourceFile, revision, date: string; pathIgnoreLevel: Integer); overload; + {$ENDREGION} {$REGION 'Static parsing methods'} public class function ParseDate(date: string): DateTime; static; ! class procedure ParseId(id: string; out source: string; out revision: Revision; out date: DateTime); static; ! class function ParseRevision(revision: string): Revision; static; class function ParseSource(source: string): string; static; {$ENDREGION} + {$REGION 'Static utility methods'} + strict protected + class function RemovePathLevels(path: string; levels: Integer): string; static; + {$ENDREGION} end; {$ENDREGION} ! {$REGION 'JediSourceVersion attribute'} ! JediSourceInfoAttribute = class (CVSSourceInfoAttribute) ! {$REGION 'Constants'} ! public ! const IgnoreLevel = 2; ! {$ENDREGION} ! {$REGION 'Constructors'} ! public ! constructor Create(id: string); overload; ! constructor Create(sourceFile, revision, date: string); overload; ! {$ENDREGION} ! end; ! {$ENDREGION} ! ! {$REGION 'Revision type'} ! [JediSourceInfoAttribute('$Header$')] ! Revision = record (IComparable) {$REGION 'Constructors'} public *************** *** 65,84 **** {$REGION 'Operators: comparisons'} public ! class operator Equal(left, right: SourceVersionRevision): Boolean; ! class operator GreaterThan(left, right: SourceVersionRevision): Boolean; ! class operator GreaterThanOrEqual(left, right: SourceVersionRevision): Boolean; ! class operator LessThan(left, right: SourceVersionRevision): Boolean; ! class operator LessThanOrEqual(left, right: SourceVersionRevision): Boolean; ! class operator NotEqual(left, right: SourceVersionRevision): Boolean; {$ENDREGION} {$REGION 'Operators: conversions'} public ! class operator Implicit(const Value: Double): SourceVersionRevision; ! class operator Implicit(const Value: SourceVersionRevision): Double; ! class operator Implicit(const Value: string): SourceVersionRevision; ! class operator Implicit(const Value: SourceVersionRevision): string; {$ENDREGION} {$REGION 'Overrides'} public function ToString: string; override; {$ENDREGION} --- 119,139 ---- {$REGION 'Operators: comparisons'} public ! class operator Equal(left, right: Revision): Boolean; ! class operator GreaterThan(left, right: Revision): Boolean; ! class operator GreaterThanOrEqual(left, right: Revision): Boolean; ! class operator LessThan(left, right: Revision): Boolean; ! class operator LessThanOrEqual(left, right: Revision): Boolean; ! class operator NotEqual(left, right: Revision): Boolean; {$ENDREGION} {$REGION 'Operators: conversions'} public ! class operator Implicit(const Value: Double): Revision; ! class operator Implicit(const Value: Revision): Double; ! class operator Implicit(const Value: string): Revision; ! class operator Implicit(const Value: Revision): string; {$ENDREGION} {$REGION 'Overrides'} public + function Equals(obj: &Object): Boolean; override; function ToString: string; override; {$ENDREGION} *************** *** 93,96 **** --- 148,188 ---- property Items[&index: Integer]: Integer read get_Items; default; {$ENDREGION} + {$REGION 'Additional comparisons'} + public + function IsSubBranchOf(revision: Revision): Boolean; + {$ENDREGION} + end; + {$ENDREGION} + + {$REGION 'SourceInfo class'} + type + [JediSourceInfoAttribute('$Header$')] + SourceInfo = class (&Object) + {$REGION 'Constructor'} + strict protected + constructor Create(sourceFile: string; revision: Revision; date: DateTime); + {$ENDREGION} + {$REGION 'Data'} + strict private + FDate: DateTime; + FRevision: Revision; + FSourceFile: string; + {$ENDREGION} + {$REGION 'Properties'} + public + property Date: DateTime read FDate; + property Revision: Revision read FRevision; + property SourceFile: string read FSourceFile; + {$ENDREGION} + {$REGION 'Static retrieval methods'} + public + class function GetInfoOf(obj: &Object): SourceInfo; overload; static; + class function GetInfoOf(&type: &Type): SourceInfo; overload; static; + {$ENDREGION} + {$REGION 'Static revision checks'} + public + class function IsAtLeastRevision(obj: &Object; revision: Revision): Boolean; overload; static; + class function IsAtLeastRevision(&type: &Type; revision: Revision): Boolean; overload; static; + {$ENDREGION} end; {$ENDREGION} *************** *** 103,106 **** --- 195,199 ---- uses System.Globalization, + System.IO, System.Text, Jedi.System.Strings; *************** *** 112,131 **** {$ENDREGION} ! {$REGION 'SourceVersionAttribute'} ! constructor SourceVersionAttribute.Create(id: string); begin ! inherited Create; ! ParseId(id, FSourceFile, FRevision, FDate); end; ! constructor SourceVersionAttribute.Create(sourceFile, revision, date: string); begin ! inherited Create; ! FDate := ParseDate(date); ! FSourceFile := ParseSource(sourceFile); ! FRevision := ParseRevision(revision); end; ! class function SourceVersionAttribute.ParseDate(date: string): DateTime; begin if date.ToLower.StartsWith('$date: ') then --- 205,240 ---- {$ENDREGION} ! {$REGION 'CVSSourceInfoAttribute'} ! constructor CVSSourceInfoAttribute.Create(id: string); begin ! Create(id, 0); end; ! constructor CVSSourceInfoAttribute.Create(id: string; pathIgnoreLevel: Integer); ! var ! source: string; ! revision: Jedi.System.SourceVersioning.Revision; ! date: DateTime; begin ! ParseId(id, source, revision, date); ! if source.StartsWith(Path.AltDirectorySeparatorChar) or source.StartsWith(Path.DirectorySeparatorChar) then ! source := source.Substring(1); ! if pathIgnoreLevel > 0 then ! source := RemovePathLevels(source, pathIgnoreLevel); ! inherited Create(source, revision, date); end; ! constructor CVSSourceInfoAttribute.Create(sourceFile, revision, date: string); ! begin ! Create(sourceFile, revision, date, 0); ! end; ! ! constructor CVSSourceInfoAttribute.Create(sourceFile, revision, date: string; pathIgnoreLevel: Integer); ! begin ! inherited Create(RemovePathLevels(ParseSource(sourceFile), pathIgnoreLevel), ParseRevision(revision), ! ParseDate(date)); ! end; ! ! class function CVSSourceInfoAttribute.ParseDate(date: string): DateTime; begin if date.ToLower.StartsWith('$date: ') then *************** *** 135,139 **** end; ! class procedure SourceVersionAttribute.ParseId(id: string; out source: string; out revision: SourceVersionRevision; out date: DateTime); var --- 244,248 ---- end; ! class procedure CVSSourceInfoAttribute.ParseId(id: string; out source: string; out revision: Revision; out date: DateTime); var *************** *** 163,170 **** if idx < 0 then raise FormatException.Create('date not found in the specified id string.'); ! date := DateTime.ParseExact(id.Substring(0, idx), dateFormat, DateTimeFormatInfo.InvariantInfo); end; ! class function SourceVersionAttribute.ParseRevision(revision: string): SourceVersionRevision; begin if revision.ToLower.StartsWith('$revision: ') then --- 272,282 ---- if idx < 0 then raise FormatException.Create('date not found in the specified id string.'); ! idx := id.IndexOf(' ', idx + 1); ! if idx < 0 then ! raise FormatException.Create('date not found in the specified id string.'); ! date := DateTime.ParseExact(id.Substring(0, idx).Trim, dateFormat, DateTimeFormatInfo.InvariantInfo); end; ! class function CVSSourceInfoAttribute.ParseRevision(revision: string): Revision; begin if revision.ToLower.StartsWith('$revision: ') then *************** *** 174,195 **** end; ! class function SourceVersionAttribute.ParseSource(source: string): string; begin if source.ToLower.StartsWith('$rcsfile: ') then ! Result := source.Substring(10, source.Length - 13) else if source.ToLower.StartsWith('$source: ') then ! Result := source.Substring(9, source.Length - 12) else - begin Result := source.Trim; ! if Result.ToLower.EndsWith(',v') then ! Result := Result.Substring(0, Result.Length - 2); end; end; {$ENDREGION} ! {$REGION 'SourceVersionRevision'} ! constructor SourceVersionRevision.Create(revision: string); var elements: array of string; --- 286,343 ---- end; ! class function CVSSourceInfoAttribute.ParseSource(source: string): string; begin if source.ToLower.StartsWith('$rcsfile: ') then ! Result := source.Substring(10, source.Length - 11).Trim else if source.ToLower.StartsWith('$source: ') then ! Result := source.Substring(9, source.Length - 10).Trim else Result := source.Trim; ! if Result.ToLower.EndsWith(',v') then ! Result := Result.Substring(0, Result.Length - 2); ! if Result.StartsWith(Path.AltDirectorySeparatorChar) or Result.StartsWith(Path.DirectorySeparatorChar) then ! Result := Result.Substring(1); ! end; ! ! class function CVSSourceInfoAttribute.RemovePathLevels(path: string; levels: Integer): string; ! var ! idx: Integer; ! begin ! if levels < 0 then ! raise ArgumentOutOfRangeException.Create('levels', 'Must be zero or positive.'); ! idx := -1; ! while levels > 0 do ! begin ! idx := path.IndexOfAny([System.IO.Path.AltDirectorySeparatorChar, ! System.IO.Path.DirectorySeparatorChar], idx + 1); ! if idx < 0 then ! raise ArgumentOutOfRangeException.Create('levels', 'Path does not contain that many levels.'); ! Dec(levels); end; + Result := path.Substring(idx + 1); end; {$ENDREGION} ! {$REGION 'JediSourceInfoAttribute'} ! constructor JediSourceInfoAttribute.Create(id: string); ! begin ! if id.ToLower.StartsWith('$id: ') then ! inherited Create(id, 0) ! else ! inherited Create(id, IgnoreLevel); ! end; ! ! constructor JediSourceInfoAttribute.Create(sourceFile, revision, date: string); ! begin ! if sourceFile.ToLower.StartsWith('$rcsfile: ') then ! inherited Create(sourceFile, revision, date, 0) ! else ! inherited Create(sourceFile, revision, date, IgnoreLevel); ! end; ! {$ENDREGION} ! ! {$REGION 'Revision'} ! constructor Revision.Create(revision: string); var elements: array of string; *************** *** 203,212 **** end; ! constructor SourceVersionRevision.Create(revision: Double); begin ! Create(revision.ToString('r', NumberFormatInfo.InvariantInfo)); end; ! constructor SourceVersionRevision.Create(major, minor: Integer); begin inherited Create; --- 351,363 ---- end; ! constructor Revision.Create(revision: Double); begin ! if Math.Floor(revision) = revision then ! Create(Trunc(revision), 0) ! else ! Create(revision.ToString('r', NumberFormatInfo.InvariantInfo)); end; ! constructor Revision.Create(major, minor: Integer); begin inherited Create; *************** *** 214,218 **** end; ! constructor SourceVersionRevision.Create(values: array of Integer); begin inherited Create; --- 365,369 ---- end; ! constructor Revision.Create(values: array of Integer); begin inherited Create; *************** *** 220,230 **** end; ! function SourceVersionRevision.CompareTo(obj: &Object): Integer; var ! secRev: SourceVersionRevision; maxIdx: Integer; idx: Integer; begin ! secRev := SourceVersionRevision(obj); maxIdx := Math.Min(&Array(FValues).Length, &Array(secRev.FValues).Length) - 1; Result := 0; --- 371,381 ---- end; ! function Revision.CompareTo(obj: &Object): Integer; var ! secRev: Revision; maxIdx: Integer; idx: Integer; begin ! secRev := Revision(obj); maxIdx := Math.Min(&Array(FValues).Length, &Array(secRev.FValues).Length) - 1; Result := 0; *************** *** 239,273 **** end; ! class operator SourceVersionRevision.Equal(left, right: SourceVersionRevision): Boolean; begin Result := left.CompareTo(right) = 0; end; ! function SourceVersionRevision.get_Count: Integer; begin Result := &Array(FValues).Length; end; ! function SourceVersionRevision.get_Items(index: Integer): Integer; begin Result := FValues[index]; end; ! class operator SourceVersionRevision.GreaterThan(left, right: SourceVersionRevision): Boolean; begin Result := left.CompareTo(right) > 0; end; ! class operator SourceVersionRevision.GreaterThanOrEqual(left, right: SourceVersionRevision): Boolean; begin Result := left.CompareTo(right) >= 0; end; ! class operator SourceVersionRevision.Implicit(const value: Double): SourceVersionRevision; begin ! Result := SourceVersionRevision.Create(value); end; ! class operator SourceVersionRevision.Implicit(const value: SourceVersionRevision): Double; begin if value.Count > 2 then --- 390,429 ---- end; ! class operator Revision.Equal(left, right: Revision): Boolean; begin Result := left.CompareTo(right) = 0; end; ! function Revision.Equals(obj: &Object): Boolean; ! begin ! Result := Self.CompareTo(obj) = 0; ! end; ! ! function Revision.get_Count: Integer; begin Result := &Array(FValues).Length; end; ! function Revision.get_Items(index: Integer): Integer; begin Result := FValues[index]; end; ! class operator Revision.GreaterThan(left, right: Revision): Boolean; begin Result := left.CompareTo(right) > 0; end; ! class operator Revision.GreaterThanOrEqual(left, right: Revision): Boolean; begin Result := left.CompareTo(right) >= 0; end; ! class operator Revision.Implicit(const value: Double): Revision; begin ! Result := Revision.Create(value); end; ! class operator Revision.Implicit(const value: Revision): Double; begin if value.Count > 2 then *************** *** 277,306 **** end; ! class operator SourceVersionRevision.Implicit(const value: string): SourceVersionRevision; begin ! Result := SourceVersionRevision.Create(value); end; ! class operator SourceVersionRevision.Implicit(const value: SourceVersionRevision): string; begin Result := value.ToString; end; ! class operator SourceVersionRevision.LessThan(left, right: SourceVersionRevision): Boolean; begin Result := left.CompareTo(right) < 0; end; ! class operator SourceVersionRevision.LessThanOrEqual(left, right: SourceVersionRevision): Boolean; begin Result := left.CompareTo(right) <= 0; end; ! class operator SourceVersionRevision.NotEqual(left, right: SourceVersionRevision): Boolean; begin Result := left.CompareTo(right) <> 0; end; ! function SourceVersionRevision.ToString: string; var sb: StringBuilder; --- 433,480 ---- end; ! class operator Revision.Implicit(const value: string): Revision; begin ! Result := Revision.Create(value); end; ! class operator Revision.Implicit(const value: Revision): string; begin Result := value.ToString; end; ! function Revision.IsSubBranchOf(revision: Revision): Boolean; ! var ! idx: Integer; ! begin ! if Count > revision.Count then ! begin ! Result := True; ! idx := 0; ! while Result and (idx < revision.Count) do ! begin ! Result := Items[idx] = revision[idx]; ! Inc(idx); ! end; ! end ! else ! Result := False; ! end; ! ! class operator Revision.LessThan(left, right: Revision): Boolean; begin Result := left.CompareTo(right) < 0; end; ! class operator Revision.LessThanOrEqual(left, right: Revision): Boolean; begin Result := left.CompareTo(right) <= 0; end; ! class operator Revision.NotEqual(left, right: Revision): Boolean; begin Result := left.CompareTo(right) <> 0; end; ! function Revision.ToString: string; var sb: StringBuilder; *************** *** 320,322 **** --- 494,573 ---- {$ENDREGION} + {$REGION 'SourceInfoAttribute'} + constructor SourceInfoAttribute.Create(sourceFile: string; revision: Revision; date: DateTime); + begin + inherited Create; + FSourceFile := sourceFile.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); + FRevision := revision; + FDate := date; + end; + + constructor SourceInfoAttribute.Create(sourceFile: string; revision: Revision; date: string); + begin + Create(sourceFile, revision, DateTime.ParseExact(date, dateFormat, DateTimeFormatInfo.InvariantInfo)); + end; + + constructor SourceInfoAttribute.Create(sourceFile, revision, date: string); + begin + Create(sourceFile, Jedi.System.SourceVersioning.Revision(revision), date); + end; + + constructor SourceInfoAttribute.Create(sourceFile: string; revision: Double; date: string); + begin + Create(sourceFile, Jedi.System.SourceVersioning.Revision(revision), date); + end; + {$ENDREGION} + + {$REGION 'SourceInfo'} + constructor SourceInfo.Create(sourceFile: string; revision: Revision; date: DateTime); + begin + inherited Create; + FSourceFile := sourceFile; + FRevision := revision; + FDate := date; + end; + + class function SourceInfo.IsAtLeastRevision(obj: &Object; revision: Revision): Boolean; + begin + if not Assigned(obj) then + raise ArgumentNullException.Create('obj'); + Result := IsAtLeastRevision(obj.GetType, revision); + end; + + class function SourceInfo.IsAtLeastRevision(&type: &Type; revision: Revision): Boolean; + var + si: SourceInfo; + begin + si := GetInfoOf(&type); + Result := si.Revision >= revision; + end; + + class function SourceInfo.GetInfoOf(obj: &Object): SourceInfo; + begin + if not Assigned(obj) then + raise ArgumentNullException.Create('obj'); + Result := GetInfoOf(obj.GetType); + end; + + class function SourceInfo.GetInfoOf(&type: &Type): SourceInfo; + var + attrs: array of &Object; + sourceInfoAttr: SourceInfoAttribute; + begin + if not Assigned(&type) then + raise ArgumentNullException.Create('type'); + attrs := &type.GetCustomAttributes(TypeOf(SourceInfoAttribute), False); + if &Array(attrs).Length <> 1 then + Result := SourceInfo.Create('', 0.0, DateTime.Create(0)) + else + begin + sourceInfoAttr := SourceInfoAttribute(attrs[0]); + if Assigned(sourceInfoAttr) then + Result := SourceInfo.Create(sourceInfoAttr.SourceFile, sourceInfoAttr.Revision, sourceInfoAttr.Date) + else + Result := SourceInfo.Create('', 0.0, DateTime.Create(0)); + end; + end; + {$ENDREGION} + end. |