When TreeBuilder.BuildFromFiles() runs and the user answers 'follow all'
or 'skip all', the choice is stored in TreeBuilder.FSymLinkOption.
But after FreeAndNil(TreeBuilder) the choice was lost, so each new batch
of files started fresh with gOperationOptionSymLinks (default: ask), and
the dialog re-appeared for every symlink in every subsequent batch.
Fix: write back TreeBuilder.SymLinkOption to Self.SymLinkOption before
freeing the builder so the answer carries forward.
Co-authored-by: heredie <heredie@localhost>
* FIX: zip plugin - allow cancelling TAR archive packing mid-operation
TAbTarArchive.SaveArchive iterated all items without ever checking
the abort flag, making it impossible to cancel a TAR/TGZ/TBZ2 pack
operation until all files had been written.
Add a DoArchiveProgress call with abort check after each item in the
save loop, identical to the pattern already used in TAbZipArchive.SaveArchive
(abziptyp.pas) and in all extract loops (abarctyp.pas).
When the user cancels, EAbUserAbort is raised, caught in PackFilesW,
and the incomplete archive is deleted if it did not exist before packing.
* FIX: zip plugin - prevent crash on TAR abort inside GZip archive
When TAbUserAbort propagates out of TAbTarArchive.SaveArchive (e.g.
from the abort check added to the save loop), it exits the IsGzippedTar
branch of TAbGzipArchive.SaveArchive without calling SwapToGzip. The
outer finally block then compares FStream (which equals FTarStream,
possibly nil) with NewStream (FGzStream) and incorrectly frees
NewStream. The destructor later calls SwapToGzip (restoring FStream to
the already-freed FGzStream) and then frees FStream a second time,
causing an access violation.
Fix: compare FGzStream instead of FStream in the finally condition.
FGzStream always holds the original gzip stream reference and is never
changed by SwapToTar/SwapToGzip, so the NewStream ownership check is
correct regardless of which swap state the archive is in.
---------
Co-authored-by: heredie <heredie@localhost>
* UPD: NormalizeAccentedChar function
Changes in function logic to improve its performance especially in quick search / filter
instead of Result := Result + cWorkingChar, which allocates memory on each iteration
the changed function in PR now works like so
allocate memory for string -> fill in accent-striped characters -> trim excess of space
* Update uaccentsutils.pas
---------
Co-authored-by: Alexander Koblov <alexx2000@mail.ru>
on macOS, it's inconvenient to restore minimized non-MainForms, and they're easily forgotten.
it's more convenient to switch between the forms by Command+`, rather than minimizing them.