瀏覽代碼

Enable Excludes support.

Martijn Laan 3 月之前
父節點
當前提交
e3a968e10f

+ 0 - 1
Projects/Src/Compiler.Messages.pas

@@ -224,7 +224,6 @@ const
   SCompilerParamFlagMissing = 'Flag "%s" must be used if flag "%s" is used';
   SCompilerParamFlagMissing2 = 'Flag "%s" must be used if parameter "%s" is used';
   SCompilerParamFlagMissing3 = 'Flag "%s" must be used if flags "%s" and "%s" are both used';
-  SCompilerParamFlagNotAllowed = 'Flag "%s" must not be used if parameter "%s" is used';
 
   { Types, components, tasks, check, beforeinstall, afterinstall }
   SCompilerParamUnknownType = 'Parameter "%s" includes an unknown type';

+ 1 - 3
Projects/Src/Compiler.SetupCompiler.pas

@@ -5433,9 +5433,7 @@ begin
           if not ExternalFile then
             AbortCompileFmt(SCompilerParamFlagMissing, ['external', 'extractarchive'])
           else if SetupHeader.SevenZipLibraryName = '' then
-            AbortCompileFmt(SCompilerEntryValueUnsupported, ['Setup', 'ArchiveExtraction', 'basic', 'extractarchive'])
-          else if AExcludes.Count > 0 then
-            AbortCompileFmt(SCompilerParamFlagNotAllowed, [ParamFilesExcludes, 'extractarchive']);
+            AbortCompileFmt(SCompilerEntryValueUnsupported, ['Setup', 'ArchiveExtraction', 'basic', 'extractarchive']);
         end;
 
         if (ISSigKeyEntries.Count = 0) and (foISSigVerify in Options) then

+ 9 - 4
Projects/Src/Setup.Install.pas

@@ -1790,7 +1790,7 @@ var
 
     function RecurseExternalCopyFiles(const DisableFsRedir: Boolean;
       const SearchBaseDir, SearchSubDir, SearchWildcard: String; const SourceIsWildcard: Boolean;
-      const Excludes: TStringList; const CurFile: PSetupFileEntry; var ExpectedBytesLeft: Integer64;
+      const Excludes: TStrings; const CurFile: PSetupFileEntry; var ExpectedBytesLeft: Integer64;
       var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
       var WarnedPerUserFonts: Boolean): Boolean;
     begin
@@ -1888,8 +1888,9 @@ var
     end;
 
      function RecurseExternalArchiveCopyFiles(const DisableFsRedir: Boolean;
-      const ArchiveFilename, Password: String; const CurFile: PSetupFileEntry;
-      var ExpectedBytesLeft: Integer64; var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
+      const ArchiveFilename, Password: String; const Excludes: TStrings;
+      const CurFile: PSetupFileEntry; var ExpectedBytesLeft: Integer64;
+      var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
       var WarnedPerUserFonts: Boolean): Boolean;
     begin
       { See above }
@@ -1903,6 +1904,10 @@ var
         try
           repeat
             if FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
+
+              if IsExcluded(FindData.cFileName, Excludes) then
+                Continue;
+
               Result := True;
               var SourceFile := ArchiveIndex.ToString; {!!!}
               if foCustomDestName in CurFile^.Options then
@@ -1992,7 +1997,7 @@ var
               ExpectedBytesLeft := CurFile^.ExternalSize;
               if foExtractArchive in CurFile^.Options then
                 FoundFiles := RecurseExternalArchiveCopyFiles(DisableFsRedir,
-                  SourceWildcard, CurFile^.ExtractArchivePassword, CurFile,
+                  SourceWildcard, CurFile^.ExtractArchivePassword, Excludes, CurFile,
                   ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
                   WarnedPerUserFonts)
               else

+ 18 - 8
Projects/Src/Setup.MainFunc.pas

@@ -1746,7 +1746,7 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
 
   function RecurseExternalFiles(const DisableFsRedir: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String;
-    const SourceIsWildcard: Boolean; const Excludes: TStringList; const CurFile: PSetupFileEntry): Boolean;
+    const SourceIsWildcard: Boolean; const Excludes: TStrings; const CurFile: PSetupFileEntry): Boolean;
   begin
     { Also see RecurseExternalGetSizeOfFiles below and RecurseExternalCopyFiles in Setup.Install
       Also see RecurseExternalArchiveFiles directly below }
@@ -1803,7 +1803,8 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
   end;
 
   function RecurseExternalArchiveFiles(const DisableFsRedir: Boolean;
-    const ArchiveFilename, Password: String; const CurFile: PSetupFileEntry): Boolean;
+    const ArchiveFilename, Password: String; const Excludes: TStrings;
+    const CurFile: PSetupFileEntry): Boolean;
   begin
     { See above }
     Result := True;
@@ -1814,6 +1815,10 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
       try
         repeat
           if FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
+
+            if IsExcluded(FindData.cFileName, Excludes) then
+              Continue;
+
             if foCustomDestName in CurFile^.Options then
               InternalError('Unexpected custom DestName');
             const DestName = ExpandConst(CurFile^.DestName) + FindData.cFileName;
@@ -1856,12 +1861,12 @@ begin
         else begin
           { External file }
           SourceWildcard := ExpandConst(CurFile^.SourceFilename);
+          Excludes.DelimitedText := CurFile^.Excludes;
           if foExtractArchive in CurFile^.Options then begin
             if not RecurseExternalArchiveFiles(DisableFsRedir, SourceWildcard,
-               CurFile^.ExtractArchivePassword, CurFile) then
+               CurFile^.ExtractArchivePassword, Excludes, CurFile) then
               Exit(False);
           end else begin
-            Excludes.DelimitedText := CurFile^.Excludes;
             if not RecurseExternalFiles(DisableFsRedir, PathExtractPath(SourceWildcard), '',
                PathExtractName(SourceWildcard), IsWildcard(SourceWildcard), Excludes, CurFile) then
               Exit(False);
@@ -2747,7 +2752,8 @@ var
 
   function RecurseExternalGetSizeOfFiles(const DisableFsRedir: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String;
-    const SourceIsWildcard: Boolean; const Excludes: TStringList; const RecurseSubDirs: Boolean): Integer64;
+    const SourceIsWildcard: Boolean; const Excludes: TStrings;
+    const RecurseSubDirs: Boolean): Integer64;
   begin
     { Also see RecurseExternalFiles above and RecurseExternalCopyFiles in Setup.Install
       Also see RecurseExternalArchiveGetSizeOfFiles directly below }
@@ -2796,7 +2802,7 @@ var
   end;
 
   function RecurseExternalArchiveGetSizeOfFiles(const DisableFsRedir: Boolean;
-    const ArchiveFilename, Password: String): Integer64;
+    const ArchiveFilename, Password: String; const Excludes: TStrings): Integer64;
   begin
     { See above }
     Result.Hi := 0;
@@ -2808,6 +2814,10 @@ var
       try
         repeat
           if FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
+
+            if IsExcluded(FindData.cFileName, Excludes) then
+              Continue;
+
             var I: Integer64;
             I.Hi := FindData.nFileSizeHigh;
             I.Lo := FindData.nFileSizeLow;
@@ -3490,16 +3500,16 @@ begin
 	      end else begin
 	        if not(foExternalSizePreset in Options) then begin
 	          try
+              LExcludes.DelimitedText := Excludes;
 	            if foExtractArchive in Options then begin
 	              ExternalSize := RecurseExternalArchiveGetSizeOfFiles(
 	                ShouldDisableFsRedirForFileEntry(PSetupFileEntry(Entries[seFile][I])),
-	                ExpandConst(SourceFilename), ExtractArchivePassword);
+	                ExpandConst(SourceFilename), ExtractArchivePassword, LExcludes);
 	            end else begin
 	              if FileType <> ftUserFile then
 	                SourceWildcard := NewParamStr(0)
 	              else
 	                SourceWildcard := ExpandConst(SourceFilename);
-	              LExcludes.DelimitedText := Excludes;
 	              ExternalSize := RecurseExternalGetSizeOfFiles(
 	                ShouldDisableFsRedirForFileEntry(PSetupFileEntry(Entries[seFile][I])),
 	                PathExtractPath(SourceWildcard),

+ 2 - 2
Projects/Src/Shared.SetupTypes.pas

@@ -58,7 +58,7 @@ procedure GenerateEncryptionKey(const Password: String; const Salt: TSetupKDFSal
 procedure SetISSigAllowedKey(var ISSigAllowedKeys: AnsiString; const KeyIndex: Integer);
 function GetISSigAllowedKeys([ref] const ISSigAvailableKeys: TArrayOfECDSAKey;
   const ISSigAllowedKeys: AnsiString): TArrayOfECDSAKey;
-function IsExcluded(Text: String; const AExcludes: TStringList): Boolean;
+function IsExcluded(Text: String; const AExcludes: TStrings): Boolean;
 
 implementation
 
@@ -351,7 +351,7 @@ begin
     Result := ISSigAvailableKeys;
 end;
 
-function IsExcluded(Text: String; const AExcludes: TStringList): Boolean;
+function IsExcluded(Text: String; const AExcludes: TStrings): Boolean;
 
   function CountBackslashes(S: PChar): Integer;
   begin