Browse Source

Make it work. (Reverted previous commit by force push, didn't need the overload.)

Martijn Laan 4 months ago
parent
commit
bbcadf5620

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

@@ -287,8 +287,6 @@ const
     'the "Source" parameter contains wildcards';
   SCompilerFilesStrongAssemblyNameMustBeSpecified = 'Parameter "StrongAssemblyName" must be specified if ' +
     'the flag "gacinstall" is used';
-  SCompilerFilesCantHaveExternalExclude = 'Parameter "Excludes" may not be used when ' +
-    'the "external" flag is used';
   SCompilerFilesCantHaveNonExternalExternalSize = 'Parameter "ExternalSize" may only be used when ' +
     'the "external" flag is used';
   SCompilerFilesExcludeTooLong = 'Parameter "Excludes" contains a pattern that is too long';

+ 5 - 4
Projects/Src/Compiler.SetupCompiler.pas

@@ -5147,6 +5147,8 @@ begin
 
   AExcludes := TStringList.Create();
   try
+    AExcludes.StrictDelimiter := True;
+    AExcludes.Delimiter := ',';
     PrevFileEntry := nil;
     NewFileEntry := AllocMem(SizeOf(TSetupFileEntry));
     try
@@ -5295,7 +5297,7 @@ begin
                AStrongAssemblyName := Values[paStrongAssemblyName].Data;
 
                { Excludes }
-               ProcessWildcardsParameter(Values[paExcludes].Data, AExcludes, SCompilerFilesExcludeTooLong);
+               ProcessWildcardsParameter(Values[paExcludes].Data, AExcludes, SCompilerFilesExcludeTooLong); { for an external file the Excludes field is set below }
 
                { ExternalSize }
                if Values[paExternalSize].Found then begin
@@ -5384,11 +5386,10 @@ begin
           AbortCompileFmt(SCompilerParamFlagMissing, ['nocompression', 'dontverifychecksum']);
 
         if ExternalFile then begin
-          if (AExcludes.Count > 0) then
-            AbortCompile(SCompilerFilesCantHaveExternalExclude)
-          else if Sign <> fsNoSetting then
+          if Sign <> fsNoSetting then
             AbortCompileFmt(SCompilerParamErrorBadCombo2,
               [ParamCommonFlags, 'external', SignFlags[Sign]]);
+          Excludes := AExcludes.CommaText;
         end;
 
         if (ISSigKeyEntries.Count = 0) and (foISSigVerify in Options) then

+ 16 - 5
Projects/Src/Setup.Install.pas

@@ -1787,7 +1787,7 @@ var
 
     function RecurseExternalCopyFiles(const DisableFsRedir: Boolean;
       const SearchBaseDir, SearchSubDir, SearchWildcard: String; const SourceIsWildcard: Boolean;
-      const CurFile: PSetupFileEntry; const FileLocationFilenames: TStringList;
+      const Excludes: TStringList; const CurFile: PSetupFileEntry; const FileLocationFilenames: TStringList;
       var ExpectedBytesLeft: Integer64; var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
       var WarnedPerUserFonts: Boolean): Boolean;
     var
@@ -1815,6 +1815,9 @@ var
               else
                 FileName := SearchWildcard;  { use the case specified in the script }
 
+              if IsExcluded(SearchSubDir + FileName, Excludes) then
+                Continue;
+
               Result := True;
               SourceFile := SearchBaseDir + SearchSubDir + FileName;
               DestName := ExpandConst(CurFile^.DestName);
@@ -1848,7 +1851,7 @@ var
               if IsRecurseableDirectory(FindData) then
                 Result := RecurseExternalCopyFiles(DisableFsRedir, SearchBaseDir,
                   SearchSubDir + FindData.cFileName + '\', SearchWildcard,
-                  SourceIsWildcard, CurFile, FileLocationFileNames,
+                  SourceIsWildcard, Excludes, CurFile, FileLocationFileNames,
                   ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
                   WarnedPerUserFonts) or Result;
             until not FindNextFile(H, FindData);
@@ -1882,7 +1885,6 @@ var
     end;
 
   var
-    FileLocationFilenames: TStringList;
     I: Integer;
     CurFileNumber: Integer;
     CurFile: PSetupFileEntry;
@@ -1897,10 +1899,17 @@ var
     PromptIfOlderOverwriteAll := oaUnknown;
     WarnedPerUserFonts := False;
 
-    FileLocationFilenames := TStringList.Create;
+    var FileLocationFilenames: TStringList := nil;
+    var Excludes: TStringList := nil;
     try
+      FileLocationFilenames := TStringList.Create;
       for I := 0 to Entries[seFileLocation].Count-1 do
         FileLocationFilenames.Add('');
+
+      Excludes := TStringList.Create;
+      Excludes.StrictDelimiter := True;
+      Excludes.Delimiter := ',';
+
       for CurFileNumber := 0 to Entries[seFile].Count-1 do begin
         CurFile := PSetupFileEntry(Entries[seFile][CurFileNumber]);
         if ((CurFile^.FileType <> ftUninstExe) or Uninstallable) and
@@ -1932,13 +1941,14 @@ var
             end
             else
               SourceWildcard := ExpandConst(CurFile^.SourceFilename);
+            Excludes.CommaText := CurFile^.Excludes;
             ProgressBefore := CurProgress;
             repeat
               SetProgress(ProgressBefore);
               ExpectedBytesLeft := CurFile^.ExternalSize;
               FoundFiles := RecurseExternalCopyFiles(DisableFsRedir,
                 PathExtractPath(SourceWildcard), '', PathExtractName(SourceWildcard),
-                IsWildcard(SourceWildcard), CurFile, FileLocationFileNames,
+                IsWildcard(SourceWildcard), Excludes, CurFile, FileLocationFileNames,
                 ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
                 WarnedPerUserFonts);
             until FoundFiles or
@@ -1956,6 +1966,7 @@ var
         end;
       end;
     finally
+      Excludes.Free;
       FileLocationFilenames.Free;
     end;
   end;

+ 33 - 21
Projects/Src/Setup.MainFunc.pas

@@ -1744,7 +1744,7 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
 
   function RecurseExternalFiles(const DisableFsRedir: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String;
-    const SourceIsWildcard: Boolean; const CurFile: PSetupFileEntry): Boolean;
+    const SourceIsWildcard: Boolean; const Excludes: TStringList; const CurFile: PSetupFileEntry): Boolean;
   var
     SearchFullPath, DestName: String;
     H: THandle;
@@ -1764,6 +1764,9 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
               if FindData.dwFileAttributes and FILE_ATTRIBUTE_HIDDEN <> 0 then
                 Continue;
 
+            if IsExcluded(SearchSubDir + FindData.cFileName, Excludes) then
+              Continue;
+
             DestName := ExpandConst(CurFile^.DestName);
             if not(foCustomDestName in CurFile^.Options) then
               DestName := DestName + SearchSubDir + FindData.cFileName
@@ -1788,7 +1791,7 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
             if IsRecurseableDirectory(FindData) then
               if not RecurseExternalFiles(DisableFsRedir, SearchBaseDir,
                  SearchSubDir + FindData.cFileName + '\', SearchWildcard,
-                 SourceIsWildcard, CurFile) then begin
+                 SourceIsWildcard, Excludes, CurFile) then begin
                 Result := False;
                 Exit;
               end;
@@ -1809,28 +1812,37 @@ begin
   Result := True;
 
   { [Files] }
-  for I := 0 to Entries[seFile].Count-1 do begin
-    CurFile := PSetupFileEntry(Entries[seFile][I]);
-    if (CurFile^.FileType = ftUserFile) and
-       ShouldProcessFileEntry(WizardComponents, WizardTasks, CurFile, False) then begin
-      DisableFsRedir := ShouldDisableFsRedirForFileEntry(CurFile);
-      if CurFile^.LocationEntry <> -1 then begin
-        { Non-external file }
-        if not EnumFilesProc(DisableFsRedir, ExpandConst(CurFile^.DestName), Param) then begin
-          Result := False;
-          Exit;
-        end;
-      end
-      else begin
-        { External file }
-        SourceWildcard := ExpandConst(CurFile^.SourceFilename);
-        if not RecurseExternalFiles(DisableFsRedir, PathExtractPath(SourceWildcard), '',
-           PathExtractName(SourceWildcard), IsWildcard(SourceWildcard), CurFile) then begin
-          Result := False;
-          Exit;
+  const Excludes = TStringList.Create;
+  try
+    Excludes.StrictDelimiter := True;
+    Excludes.Delimiter := ',';
+
+    for I := 0 to Entries[seFile].Count-1 do begin
+      CurFile := PSetupFileEntry(Entries[seFile][I]);
+      if (CurFile^.FileType = ftUserFile) and
+         ShouldProcessFileEntry(WizardComponents, WizardTasks, CurFile, False) then begin
+        DisableFsRedir := ShouldDisableFsRedirForFileEntry(CurFile);
+        if CurFile^.LocationEntry <> -1 then begin
+          { Non-external file }
+          if not EnumFilesProc(DisableFsRedir, ExpandConst(CurFile^.DestName), Param) then begin
+            Result := False;
+            Exit;
+          end;
+        end
+        else begin
+          { External file }
+          SourceWildcard := ExpandConst(CurFile^.SourceFilename);
+          Excludes.CommaText := CurFile^.Excludes;
+          if not RecurseExternalFiles(DisableFsRedir, PathExtractPath(SourceWildcard), '',
+             PathExtractName(SourceWildcard), IsWildcard(SourceWildcard), Excludes, CurFile) then begin
+            Result := False;
+            Exit;
+          end;
         end;
       end;
     end;
+  finally
+    Excludes.Free;
   end;
 
   { [InstallDelete] }

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

@@ -231,8 +231,8 @@ const
 type
   PSetupFileEntry = ^TSetupFileEntry;
   TSetupFileEntry = packed record
-    SourceFilename, DestName, InstallFontName, StrongAssemblyName: String;
-    Components, Tasks, Languages, Check, AfterInstall, BeforeInstall: String;
+    SourceFilename, DestName, InstallFontName, StrongAssemblyName, Components,
+    Tasks, Languages, Check, AfterInstall, BeforeInstall, Excludes: String;
     ISSigAllowedKeys: AnsiString;
     MinVersion, OnlyBelowVersion: TSetupVersionData;
     LocationEntry: Integer;