From: <ah...@us...> - 2012-03-10 18:22:16
|
Revision: 3767 http://jcl.svn.sourceforge.net/jcl/?rev=3767&view=rev Author: ahuser Date: 2012-03-10 18:22:09 +0000 (Sat, 10 Mar 2012) Log Message: ----------- Fixed: Items, Properties and Matadata are case-insensitive Fixed: ParseItemMetaData was broken Fixed: User defined metadata wasn't replaced in EvaluateTransform Modified Paths: -------------- trunk/jcl/source/windows/JclMsBuild.pas Modified: trunk/jcl/source/windows/JclMsBuild.pas =================================================================== --- trunk/jcl/source/windows/JclMsBuild.pas 2012-03-09 12:43:15 UTC (rev 3766) +++ trunk/jcl/source/windows/JclMsBuild.pas 2012-03-10 18:22:09 UTC (rev 3767) @@ -329,6 +329,8 @@ function FindItemDefinition(const ItemName: string): TJclMsBuildItem; function FindTarget(const TargetName: string): TJclMsBuildTarget; + class function SameItemName(const ItemName1, ItemName2: string): Boolean; + procedure Init; procedure InitEnvironmentProperties; procedure InitReservedProperties; @@ -1033,7 +1035,8 @@ if Start > 0 then begin Position := Start; - FindClosingBrace(Result, Position); + if not FindClosingBrace(Result, Position) then + raise EJclMsBuildError.CreateResFmt(@RsEEndOfString, [Result]); PropertyName := Copy(Result, Start + 2, Position - Start - 2); PropertyValue := EvaluateList(PropertyName); @@ -1054,21 +1057,41 @@ function TJclMsBuildParser.EvaluateTransform(ItemList: TStrings; const Transform: string): string; type TVarRecArray = array of TVarRec; +const + WellKnownItemMetadataCount = 11; +var + UserDefinedMetadataNames: TStrings; function GetTransformPattern(const Transform: string): string; + var + Index, EndIndex, Num: Integer; + MetaDataName: string; begin Result := Transform; - StrReplace(Result, '%(FullPath)', '%0:s', [rfReplaceAll]); - StrReplace(Result, '%(RootDir)', '%1:s', [rfReplaceAll]); - StrReplace(Result, '%(Filename)', '%2:s', [rfReplaceAll]); - StrReplace(Result, '%(Extension)', '%3:s', [rfReplaceAll]); - StrReplace(Result, '%(RelativeDir)', '%4:s', [rfReplaceAll]); - StrReplace(Result, '%(Directory)', '%5:s', [rfReplaceAll]); - StrReplace(Result, '%(RecursiveDir)', '%6:s', [rfReplaceAll]); - StrReplace(Result, '%(Identity)', '%7:s', [rfReplaceAll]); - StrReplace(Result, '%(ModifiedTime)', '%8:s', [rfReplaceAll]); - StrReplace(Result, '%(CreatedTime)', '%9:s', [rfReplaceAll]); - StrReplace(Result, '%(AccessedTime)', '%10:s', [rfReplaceAll]); + StrReplace(Result, '%(FullPath)', '%0:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(RootDir)', '%1:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(Filename)', '%2:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(Extension)', '%3:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(RelativeDir)', '%4:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(Directory)', '%5:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(RecursiveDir)', '%6:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(Identity)', '%7:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(ModifiedTime)', '%8:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(CreatedTime)', '%9:s', [rfReplaceAll, rfIgnoreCase]); + StrReplace(Result, '%(AccessedTime)', '%10:s', [rfReplaceAll, rfIgnoreCase]); + + // replace user defined metadata + Num := WellKnownItemMetadataCount; + Index := Pos('%(', Result); + while Index <> 0 do + begin + EndIndex := StrSearch(')', Result, Index + 2); + MetaDataName := Copy(Result, Index + 2, EndIndex - Index - 2); + UserDefinedMetadataNames.Add(MetaDataName); + StrReplace(Result, '%(' + MetaDataName + ')', '%' + IntToStr(Num) + ':s', [rfReplaceAll]); + Inc(Num); + Index := StrSearch('%(', Result, Index); + end; end; procedure GetTransformParameters(Item: TJclMsBuildItem; var Storage: TDynStringArray; @@ -1076,13 +1099,13 @@ const DateTimeFormat = 'yyyy-mm-dd hh:nn:ss.zzz'; var - Index: Integer; + Index, DotIdx: Integer; ItemFullInclude: string; LocalDateTime: TDateTime; begin - if Length(Formats) <> 11 then + if Length(Formats) <> WellKnownItemMetadataCount + UserDefinedMetadataNames.Count then begin - SetLength(Formats, 11); + SetLength(Formats, WellKnownItemMetadataCount + UserDefinedMetadataNames.Count); for Index := Low(Formats) to High(Formats) do begin {$IFDEF SUPPORTS_UNICODE} @@ -1095,11 +1118,11 @@ end; end; - if Length(Storage) <> 11 then - SetLength(Storage, 11); + if Length(Storage) <> WellKnownItemMetadataCount + UserDefinedMetadataNames.Count then + SetLength(Storage, WellKnownItemMetadataCount + UserDefinedMetadataNames.Count); ItemFullInclude := Item.ItemFullInclude; - + // %(FullPath) Contains the full path of the item. For example: Storage[0] := ItemFullInclude; @@ -1153,6 +1176,17 @@ else Storage[10] := ''; + for Index := 0 to UserDefinedMetadataNames.Count - 1 do + begin + DotIdx := Pos('.', UserDefinedMetadataNames[Index]); + if DotIdx <> 0 then // references different item => batch + begin + Storage[WellKnownItemMetadataCount + Index] := ''; // not implemented yet. Outer loop must iterator over this item + end + else + Storage[WellKnownItemMetadataCount + Index] := Item.ItemMetaData.Values[UserDefinedMetadataNames[Index]]; + end; + for Index := Low(Formats) to High(Formats) do {$IFDEF SUPPORTS_UNICODE} Formats[Index].VPWideChar := PChar(Storage[Index]); @@ -1160,23 +1194,29 @@ Formats[Index].VPChar := PChar(Storage[Index]); {$ENDIF ~SUPPORTS_UNICODE} end; + var Index: Integer; TransformPattern, TransformResult: string; TransformParameters: TVarRecArray; TransformStorage: TDynStringArray; begin - TransformPattern := GetTransformPattern(Transform); + UserDefinedMetadataNames := TStringList.Create; + try + TransformPattern := GetTransformPattern(Transform); - Result := ''; - for Index := 0 to ItemList.Count - 1 do - begin - GetTransformParameters(TJclMsBuildItem(ItemList.Objects[Index]), TransformStorage, TransformParameters); - TransformResult := Format(TransformPattern, TransformParameters); - if Result <> '' then - Result := Result + ';' + TransformResult - else - Result := TransformResult; + Result := ''; + for Index := 0 to ItemList.Count - 1 do + begin + GetTransformParameters(TJclMsBuildItem(ItemList.Objects[Index]), TransformStorage, TransformParameters); + TransformResult := Format(TransformPattern, TransformParameters); + if Result <> '' then + Result := Result + ';' + TransformResult + else + Result := TransformResult; + end; + finally + UserDefinedMetadataNames.Free; end; end; @@ -1234,7 +1274,7 @@ for Index := 0 to FItemDefinitions.Count - 1 do begin Result := TJclMsBuildItem(FItemDefinitions.Items[Index]); - if Result.ItemName = ItemName then + if SameItemName(Result.ItemName, ItemName) then Exit; end; Result := nil; @@ -1251,7 +1291,7 @@ for Index := 0 to FItems.Count - 1 do begin Item := TJclMsBuildItem(FItems.Items[Index]); - if Item.ItemName = ItemName then + if SameItemName(Item.ItemName, ItemName) then List.AddObject(Item.ItemInclude, Item); end; finally @@ -1272,6 +1312,11 @@ Result := nil; end; +class function TJclMsBuildParser.SameItemName(const ItemName1, ItemName2: string): Boolean; +begin + Result := SameText(ItemName1, ItemName2); +end; + function TJclMsBuildParser.GetItem(Index: Integer): TJclMsBuildItem; begin Result := TJclMsBuildItem(FItems.Items[Index]); @@ -1954,10 +1999,10 @@ if Condition then for Index := 0 to XmlElem.ItemCount - 1 do - begin - SubElem := XmlElem.Items.Item[Index]; - ParseItem(SubElem, True); - end; + begin + SubElem := XmlElem.Items.Item[Index]; + ParseItem(SubElem, True); + end; end; procedure TJclMsBuildParser.ParseItemGroup(XmlElem: TJclSimpleXmlElem); @@ -1980,17 +2025,16 @@ if Condition then for Index := 0 to XmlElem.ItemCount - 1 do - begin - SubElem := XmlElem.Items.Item[Index]; - ParseItem(SubElem, False); - end; + begin + SubElem := XmlElem.Items.Item[Index]; + ParseItem(SubElem, False); + end; end; procedure TJclMsBuildParser.ParseItemMetaData(XmlElem: TJclSimpleXmlElem; ItemMetaData: TStrings); var Index: Integer; Prop: TJclSimpleXMLProp; - SubElem: TJclSimpleXmlElem; Condition: Boolean; begin Condition := True; @@ -2005,11 +2049,7 @@ end; if Condition then - for Index := 0 to XmlElem.ItemCount - 1 do - begin - SubElem := XmlElem.Items.Item[Index]; - ItemMetaData.Values[SubElem.Name] := EvaluateString(SubElem.Value); - end; + ItemMetaData.Values[XmlElem.Name] := EvaluateString(XmlElem.Value); end; procedure TJclMsBuildParser.ParseOnError(XmlElem: TJclSimpleXMLElem; Target: TJclMsBuildTarget); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |