Do What I Mean Extractor
Find a file
Armin Friedl 221a6afe2a
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
Don't set b_coverage by default
The coverage tracker tinkers with the binary leaving traces behind even in
release builds.
2020-08-03 06:40:34 +02:00
doc Update README fix meson build 2020-08-01 00:35:34 +02:00
src Relative root path in archive, clang-format, refactoring 2020-08-03 01:26:52 +02:00
subprojects Add tests 2020-02-25 23:01:41 +01:00
test Add argument parser 2020-08-01 20:20:27 +02:00
.clang-format Relative root path in archive, clang-format, refactoring 2020-08-03 01:26:52 +02:00
.drone.yml Don't set b_coverage by default 2020-08-03 06:40:34 +02:00
.gitignore Update README fix meson build 2020-08-01 00:35:34 +02:00
meson.build Don't set b_coverage by default 2020-08-03 06:40:34 +02:00
README.md Relative root path in archive, clang-format, refactoring 2020-08-03 01:26:52 +02:00

Build Status

XWIM

Do What I Mean Extractor

https://xkcd.com/1168/

Continuing the emacs tradition of "Do What I Mean" tools, xwim is a replacement for the excellent, but unfortunately unmaintained, dtrx. xwim is a command line tool that targets two problems with archives:

  • Command line tools for extracting archives are often archaic and differ considerably between formats
  • Inconsiderately packaged archives tend to spill their content over the directory they are extracted to

Usage

Invoking xwim is as simple as:

xwim archive.tar.gz

This will extract the archive to the current folder. If the archive contains a single root folder it is just extracted as is. Otherwise xwim first creates a folder named after the archive and extracts the contents there.

Examples

Single root folder named after the archive

archive.tar.gz
|
-- archive/
    |
    -- file.txt
    |
    -- file2.txt

xwim will just extract the archive to the current directory.

Multiple files/folders in archive root

archive.tar.gz
|
-- archive/
|    |
|    -- file.txt
| 
-- file2.txt

xwim will create a folder archive in the current directory and extract the archive contents there.

Supported formats

xwim supports most formats supported by libarchive:

  • 7-zip: 7z, 7zip
  • zip: jar, zip
  • bzip2: bz2, bzip2
  • gzip: gz, gzip
  • xzip: xz
  • rar: rar
  • tar with compression: tgz, tar.gz, tar.bz2, tar.xz

Install

xwim is currently released as a dynamically linked glibc binary only. The releases can be downloaded from https://git.friedl.net/incubator/xwim/releases and should run on most glibc based GNU/Linux distributions. The following dependencies have to be installed:

Approaching the first stable release we will release for more platforms.

Build

xwim is built with meson. To compile xwim from source you need:

  • meson
  • ninja
  • GCC or Clang (others may work too) supporting C++17

Additionally you need some libraries installed:

# Get the source
git clone https://git.friedl.net/incubator/xwim.git

# Build xwim executable
cd xwim
meson build
cd build
meson compile

# Run executable on the test archive
# This will extract root.tar.gz to 
# the current working directory
src/xwim test/archives/root.tar.gz

Configure

xwim strives to just do the right thing out of the box. Consequently, it does not require any configuration. If you are unhappy with the defaults you can change them though.

Changing the log level

Per default xwim chooses an appropriate log level according to your build type (debug/release builds). If you want to change the verbosity you can set the XWIM_LOGLEVEL environment variable. Valid levels are:

  • trace
  • debug
  • info
  • warning
  • error
  • critical
  • off

Contributing

While xwim is still in incubator phase (i.e. before version 1.0) its main repository is hosted on https://git.friedl.net/incubator/xwim with a mirror on https://github.com/arminfriedl/xwim. With the first stable release it will most likely move to GitHub as its main repository.

If you want to contribute, you can either issue a pull request on its Github mirror (will be cherry picked into the main repository) or send patches to dev[at]friedl[dot]net.

If you are interested in a long-term co-maintainership you can also drop me a mail for an account on https://git.friedl.net.