Merge pull request #5476 from mcornella/fix-extract-deb-packages

Fix extract of deb packages with data.tar.xz
This commit is contained in:
Marc Cornellà 2016-09-30 00:38:58 +02:00 committed by GitHub
commit 1159aa14fa
3 changed files with 117 additions and 81 deletions

46
plugins/extract/README.md Normal file
View File

@ -0,0 +1,46 @@
# extract plugin
This plugin defines a function called `extract` that extracts the archive file
you pass it, and it supports a wide variety of archive filetypes.
This way you don't have to know what specific command extracts a file, you just
do `extract <filename>` and the function takes care of the rest.
To use it, add `extract` to the plugins array in your zshrc file:
```zsh
plugins=(... extract)
```
## Supported file extensions
| Extension | Description |
|:------------------|:-------------------------------------|
| `7z` | 7zip file |
| `Z` | Z archive (LZW) |
| `apk` | Android app file |
| `bz2` | Bzip2 file |
| `deb` | Debian package |
| `gz` | Gzip file |
| `ipsw` | iOS firmware file |
| `jar` | Java Archive |
| `lzma` | LZMA archive |
| `rar` | WinRAR archive |
| `sublime-package` | Sublime Text package |
| `tar` | Tarball |
| `tar.bz2` | Tarball with bzip2 compression |
| `tar.gz` | Tarball with gzip compression |
| `tar.xz` | Tarball with lzma2 compression |
| `tar.zma` | Tarball with lzma compression |
| `tbz` | Tarball with bzip compression |
| `tbz2` | Tarball with bzip2 compression |
| `tgz` | Tarball with gzip compression |
| `tlz` | Tarball with lzma compression |
| `txz` | Tarball with lzma2 compression |
| `war` | Web Application archive (Java-based) |
| `xpi` | Mozilla XPI module file |
| `xz` | LZMA2 archive |
| `zip` | Zip archive |
See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for
more information regarding archive formats.

View File

@ -3,6 +3,5 @@
_arguments \ _arguments \
'(-r --remove)'{-r,--remove}'[Remove archive.]' \ '(-r --remove)'{-r,--remove}'[Remove archive.]' \
"*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|ipsw|rar|7z|deb)(-.)'" && return 0 "*::archive file:_files -g '(#i)*.(7z|Z|apk|bz2|deb|gz|ipsw|jar|lzma|rar|sublime-package|tar|tar.bz2|tar.gz|tar.xz|tar.zma|tbz|tbz2|tgz|tlz|txz|war|xpi|xz|zip)(-.)'" \
&& return 0

View File

@ -1,24 +1,17 @@
# ------------------------------------------------------------------------------ alias x=extract
# FILE: extract.plugin.zsh
# DESCRIPTION: oh-my-zsh plugin file.
# AUTHOR: Sorin Ionescu (sorin.ionescu@gmail.com)
# VERSION: 1.0.1
# ------------------------------------------------------------------------------
extract() {
function extract() {
local remove_archive local remove_archive
local success local success
local file_name
local extract_dir local extract_dir
if (( $# == 0 )); then if (( $# == 0 )); then
echo "Usage: extract [-option] [file ...]" cat <<-'EOF' >&2
echo Usage: extract [-option] [file ...]
echo Options:
echo " -r, --remove Remove archive." Options:
echo -r, --remove Remove archive.
echo "Report bugs to <sorin.ionescu@gmail.com>." EOF
fi fi
remove_archive=1 remove_archive=1
@ -29,25 +22,26 @@ function extract() {
while (( $# > 0 )); do while (( $# > 0 )); do
if [[ ! -f "$1" ]]; then if [[ ! -f "$1" ]]; then
echo "extract: '$1' is not a valid file" 1>&2 echo "extract: '$1' is not a valid file" >&2
shift shift
continue continue
fi fi
success=0 success=0
file_name="$( basename "$1" )" extract_dir="${1:t:r}"
extract_dir="$( echo "$file_name" | sed "s/\.${1##*.}//g" )"
case "$1" in case "$1" in
(*.tar.gz|*.tgz) [ -z $commands[pigz] ] && tar zxvf "$1" || pigz -dc "$1" | tar xv ;; (*.tar.gz|*.tgz) (( $+commands[pigz] )) && { pigz -dc "$1" | tar xv } || tar zxvf "$1" ;;
(*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;; (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;;
(*.tar.xz|*.txz) tar --xz --help &> /dev/null \ (*.tar.xz|*.txz)
tar --xz --help &> /dev/null \
&& tar --xz -xvf "$1" \ && tar --xz -xvf "$1" \
|| xzcat "$1" | tar xvf - ;; || xzcat "$1" | tar xvf - ;;
(*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \ (*.tar.zma|*.tlz)
tar --lzma --help &> /dev/null \
&& tar --lzma -xvf "$1" \ && tar --lzma -xvf "$1" \
|| lzcat "$1" | tar xvf - ;; || lzcat "$1" | tar xvf - ;;
(*.tar) tar xvf "$1" ;; (*.tar) tar xvf "$1" ;;
(*.gz) [ -z $commands[pigz] ] && gunzip "$1" || pigz -d "$1" ;; (*.gz) (( $+commands[pigz] )) && pigz -d "$1" || gunzip "$1" ;;
(*.bz2) bunzip2 "$1" ;; (*.bz2) bunzip2 "$1" ;;
(*.xz) unxz "$1" ;; (*.xz) unxz "$1" ;;
(*.lzma) unlzma "$1" ;; (*.lzma) unlzma "$1" ;;
@ -60,12 +54,12 @@ function extract() {
mkdir -p "$extract_dir/data" mkdir -p "$extract_dir/data"
cd "$extract_dir"; ar vx "../${1}" > /dev/null cd "$extract_dir"; ar vx "../${1}" > /dev/null
cd control; tar xzvf ../control.tar.gz cd control; tar xzvf ../control.tar.gz
cd ../data; tar xzvf ../data.tar.gz cd ../data; extract ../data.tar.*
cd ..; rm *.tar.gz debian-binary cd ..; rm *.tar.* debian-binary
cd .. cd ..
;; ;;
(*) (*)
echo "extract: '$1' cannot be extracted" 1>&2 echo "extract: '$1' cannot be extracted" >&2
success=1 success=1
;; ;;
esac esac
@ -75,6 +69,3 @@ function extract() {
shift shift
done done
} }
alias x=extract