106 Commits

Author SHA1 Message Date
Alexander Vershilov fc1027caa6 Set file permissions on Unix platforms
Set user permissions on linux platform as follows:

  * if an existing file is added, use its permissions
  * if an entry is generated from a bytestring or a stream, use 0600

This behavior mimics the zip utility.
2021-01-18 23:55:03 +01:00
Csaba Hruska 7dee54beb6 Add support for Zstandard (zstd) compression method 2020-09-16 16:22:56 +02:00
Mark Karpov aff36c3010 Re-format with Ormolu 0.1.2.0 2020-07-10 22:29:56 +02:00
Mark Karpov 8b358565e4 Format the source code with Ormolu 2020-04-23 22:22:12 +02:00
Mark Karpov 6816fb7ac5 Add ‘packDirRecur'’ 2020-04-12 11:48:13 +02:00
Mark Karpov 88b1484373 Fix the build for Mac 2020-03-16 20:26:39 +01:00
Alexander Vershilov 26b5746cbe Introduce helpers for setting permissions
It was very hard to set permissions using this library, as the permissions
were not properly documented. Here we try to solve the problem in 2 ways:

1. We add a low level documentation that explains how to work with
   permissions.
2. We introduce unix specific helpers that allow to describe permissions in
   a human readable way.

Unfortunately making those helpers OS agnostic is a pretty hard task we
enable them only on the Unix platforms.
2020-03-11 20:35:34 +01:00
Alexander Vershilov 72970d9e47 Add OS version to the required/made by versions
As per zip spec we may want to encode host version. This version is used by
e.g. the unzip utility in order to understand how to interpret external
info (type of files and permissions).

Current algorithm is pretty naive, we do not test for all OS versions
supported by zip. Instead we check if we run on windows and put 0 in that
case (MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems). Otherwise we put 3
(UNIX).

This way code works properly on the unix OS, and we keep old behavior for
the other OS.

Note that we didn't change ‘toVersion’ function, as it already masked the
higher byte where OS information was stored.

This code was tested manually by storing archive and then unarchiving it via
unzip. There is no automated test because such test would require external
tools (unzip).
2020-03-11 20:35:34 +01:00
Moritz Kiefer 687bc036aa Ignore DoesNotExistError in removeFile
We have seen a bunch of errors on CI of the form

```
C:\users\foobar\ghcBDA1.zip: DeleteFile "\\\\?\\C:\\users\\foobar\\ghcBDA1.zip": does not exist (The system cannot find the file specified.)
```

I haven’t managed to reproduce this but looking at the code it seems
like we can be interrupted with an async exception (we kill threads
pretty aggressively) in the `bracketOnError` call after the file has
been renamed but before the whole block returns. In this case, the
file will not exist but you’ll run the cleanup in `bracketOnError`
anyway which will then fail.

We could try to fix this by masking things differently but ignoring
the error seems like a simpler and more robust solution.
2020-03-02 11:35:44 +01:00
mrkkrp d9cfb8d4a1 Add ‘since’ note for ‘BZip2Unsupported’ 2019-12-01 23:39:02 +01:00
Rodney Lorrimar 5a39029ceb Add Cabal flag to avoid the bzip2 C library dependency
The bzlib-conduit library is causing us trouble when trying to
cross-compile it for Windows.

The best thing to do in our case is to remove the dependency.

This change adds -fdisable-bzip2. Under this flag, if a caller
attempts to compress or decompress a BZip2 entry, then an exception
will be thrown.

Resolves #57
2019-11-30 16:46:42 +01:00
mrkkrp 8b4ae21a6b Replace the current year by the word “present” in copyright notes
[skip ci]
2019-07-03 21:17:43 +02:00
mrkkrp 8c9ebd1f8f Update copyright years
[skip ci]
2019-01-01 12:54:19 +07:00
mrkkrp d7eae13e34 Misc corrections 2018-09-22 21:17:55 +07:00
Ramakrishnan Muthukrishnan fe2e6cbc2d Allow to manipulate external file attributes (#52) 2018-09-22 19:39:46 +07:00
mrkkrp 1f9283d345 A couple of cosmetic changes 2018-06-23 20:13:38 +07:00
Mark Karpov bcbcd0b9de Test Zip64 features on CI (#49) 2018-06-23 18:54:58 +07:00
Mark Karpov a09152b92c Make ‘saveEntry’ and ‘unpackInto’ restore modification time (#47) 2018-05-24 11:00:44 +07:00
mrkkrp 756ba096f1 Enable more warnings 2018-03-21 19:04:07 +07:00
Mark Karpov e131160592 Stop depending on ‘path’, ‘path-io’, and ‘plan-b’ plus more (#43) 2018-02-09 20:33:35 +07:00
mrkkrp 1d2559e953 Compatibility with newer conduit 2018-02-05 23:05:18 +07:00
mrkkrp 88ed27108c Include 2018 into the copyright years range
[skip ci]
2018-01-01 13:59:31 +07:00
Mark Karpov a5f189f0fe Add some ‘monad-control’ instances for ‘ZipArchive’ (#38) 2017-08-08 22:27:20 +07:00
mrkkrp c00236f7d1 Use ‘ZipSink’ from the public Conduit API 2017-08-01 17:59:41 +07:00
Mark Karpov 3f187d099d Switch to the newer Conduit API (#37) 2017-07-31 21:19:13 +07:00
mrkkrp 2c9ed28477 Even more documentation improvements
[skip ci]
2017-05-24 20:29:57 +07:00
mrkkrp 2008d72f33 Refactor an ugly fragment of code 2017-05-24 18:26:40 +07:00
mrkkrp 0417b9afe0 Improve the documentation
[skip ci]
2017-05-24 18:26:34 +07:00
mrkkrp 783004da4a Update my email address
[skip ci]
2017-05-24 17:16:52 +07:00
mrkkrp 260efe3e11 Derive ‘Eq’ and ‘Ord’ for ‘EntrySelectorException’, ‘ZipException’ 2017-04-01 18:43:51 +03:00
mrkkrp 2f04ec8d75 Numerous cosmetic corrections to the docs 2017-04-01 18:40:39 +03:00
Alexey Karakulov 70123f3996 Allow any MonadResource for getEntrySource (#34) 2017-04-01 15:29:09 +03:00
mrkkrp d8d28e14d2 Fix the issue with mod time serialization on 32 bit systems
Close #32.
2017-03-04 23:36:24 +03:00
Rahul Muttineni e1b2a4eb23 Write correct number of entries to central directory with Zip64 (#31) 2017-02-25 17:40:08 +04:00
mrkkrp 5f7af58011 Remove the ‘zip64-ecd’ flag
Now that the situation is clear, I think it's pretty safe to remove this
additional run of the test suite. It's unlikely that we will run into new
Zip64-related issues.
2017-02-09 20:13:00 +03:00
mrkkrp 9511fd0e57 Fix literal overflows on 32 bit systems 2017-02-09 20:11:10 +03:00
Mark Karpov e5fe94940c Fix reading of empty Zip 64 archives
* Try to catch the Zip64 ECD issue on Travis
* Fix detection of end of central directory
2017-02-08 23:40:38 +04:00
mrkkrp 0927c6189e Include 2017 into copyright years range 2017-01-01 14:27:47 +03:00
mrkkrp e729dd9c6d Use ‘withBinaryFile’ instead of ‘withFile’
Using ‘withFile’ on Windows may lead to incorrect results, see documentation
for ‘openBinaryFile’.
2016-12-28 00:43:10 +03:00
mrkkrp 9acb0e80c2 Derive more instances for some types 2016-12-12 21:16:18 +03:00
mrkkrp 28dfc18d54 Add ‘since’ label to ‘getEntrySource’ 2016-07-22 00:30:09 +03:00
Christopher Wells 692079a784 Add examples to documentation
Add some examples of common uses of the library to the documentation.
2016-06-07 17:45:03 +07:00
mrkkrp 5d857874ba Add ‘getEntrySource’ function
Close #15.
2016-05-15 23:50:49 +07:00
mrkkrp 905328dd57 Speed up detection of invalid archives
Close #16.
2016-05-15 22:56:36 +07:00
mrkkrp 93c670fcc5 Calculate “version needed to extract” field
Close #14.

Two new features:

* Added explicit check of “version needed to extract”, so if archive
  uses some advanced features that we do not support yet, parsing fails.

* Value of “version needed to extract” field is now calculated
  dynamically with respect to actually used features, e.g. if you just
  store or deflate a not very big file, ‘2.0’ version will be
  written (previously we wrote ‘4.6’ unconditionally). This is needed to
  avoid scaring tools that can only handle basic Zip archives.
2016-04-09 14:55:44 +07:00
mrkkrp 1e7d02215c Fix a typo in description of ‘decodeText’ 2016-03-25 19:45:25 +06:00
Michael Thompson c108d12569 Update CP437.hs
One is supposed to accumulate a builder with a right fold:

 https://www.reddit.com/r/haskell/comments/35udfy/fixing_an_aeson_performance_bug_sometimes_the_old/cr94pdj

I skipped that with this attempt, which unfolds the text directly. It
seems 10 or more times as fast if I send /usr/share/dict/words through
it. ‘unfoldrN’ is a pretty strong function with text since it is
basically just replicates to the stream representation.
2016-03-05 23:54:03 +06:00
mrkkrp 26cfc197a2 Add missing word in docs 2016-03-03 21:51:14 +06:00
mrkkrp 740fe99ab7 Work around a bug in ‘path’ package
‘.’ should not be accepted as valid relative file name, it least in the
context of this package.
2016-03-02 23:22:21 +06:00
mrkkrp 52170ab594 Fix undoing 2016-03-02 17:51:35 +06:00