mirror of
https://github.com/MidnightCommander/mc
synced 2025-01-12 06:19:19 +03:00
32a9d93978
On many distributions by default only the reduced version of p7zip (7zr) is installed (e.g. on Debian p7zip package provides 7zr executable and p7zip-full package provides 7za executable). This patch adds the detection of 7zr in case if 7za is not available.
80 lines
2.3 KiB
Bash
Executable File
80 lines
2.3 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# extfs support for p7zip
|
|
# Written by Pavel Roskin <proski@gnu.org>
|
|
# Some Bugfixes/workarounds by Sergiy Niskorodov <sgh@mail.zp.ua>
|
|
# Licensed under GNU GPL version 2 or later version.
|
|
|
|
P7ZIP=`which 7z 2>/dev/null` || P7ZIP=`which 7za 2>/dev/null` || P7ZIP=`which 7zr 2>/dev/null`
|
|
|
|
mcu7zip_list ()
|
|
{
|
|
# Symlinks are not shown - no idea how to distinguish them
|
|
# Read-only files are not shown as such - it's rarely useful
|
|
ugid="`id -nu` `id -ng`"
|
|
date_re='^\(....\)-\(..\)-\(..\) \(..:..:..\)'
|
|
date_mc='\2-\3-\1 \4'
|
|
size_re='............'
|
|
$P7ZIP l "$1" | sed -n "s/$date_re D.... $size_re $size_re\(.*\)/drwxr-xr-x 1 $ugid 0 $date_mc \5/p;s/$date_re \..... \($size_re\) $size_re\(.*\)/-rw-r--r-- 1 $ugid \5 $date_mc \6/p"
|
|
}
|
|
|
|
mcu7zip_copyout ()
|
|
{
|
|
#first we check if we have old p7zip archive with prefix ./ in filename
|
|
$P7ZIP l "$1" "$2" | grep -q "0 files, 0 folders" && \
|
|
EXFNAME='*./'"$2" || EXFNAME="$2"
|
|
$P7ZIP e -so "$1" "$EXFNAME" > "$3" 2>/dev/null
|
|
}
|
|
|
|
mcu7zip_copyin ()
|
|
{
|
|
$P7ZIP a -si"$2" "$1" <"$3" >/dev/null 2>&1
|
|
}
|
|
|
|
mcu7zip_mkdir ()
|
|
{
|
|
dir=`mktemp -d "${MC_TMPDIR:-/tmp}/mctmpdir-u7z.XXXXXX"` || exit 1
|
|
mkdir -p "$dir"/"$2"
|
|
$P7ZIP a -w"$dir" "$1" "$dir"/"$2" >/dev/null 2>&1
|
|
rm -rf "$dir"
|
|
}
|
|
|
|
mcu7zip_rm ()
|
|
{
|
|
# NOTE: Version 4.20 fails to delete files in subdirectories
|
|
#first we check if we have old p7zip archive with prefix ./ in filename
|
|
$P7ZIP l "$1" "$2" | grep -q "0 files, 0 folders" && \
|
|
EXFNAME='*./'"$2" || EXFNAME="$2"
|
|
$P7ZIP d "$1" "$EXFNAME" 2>&1 | grep -q E_NOTIMPL > /dev/null 2>&1 && \
|
|
{ printf "Function not implemented...\n7z cannot delete from solid archive." >&2 ; exit 1 ; }
|
|
}
|
|
|
|
mcu7zip_rmdir ()
|
|
{
|
|
#first we check if we have old p7zip archive with prefix ./ in filename
|
|
$P7ZIP l "$1" "$2" | grep -q "0 files, 0 folders" && \
|
|
EXFNAME='*./'"$2" || EXFNAME="$2"
|
|
$P7ZIP d "$1" "$EXFNAME"/ 2>&1 | grep -q E_NOTIMPL > /dev/null 2>&1 && \
|
|
{ printf "Function not implemented...\n7z cannot delete from solid archive." >&2 ; exit 1 ; }
|
|
}
|
|
|
|
# override any locale for dates
|
|
LC_DATE=C
|
|
export LC_DATE
|
|
|
|
umask 077
|
|
|
|
cmd="$1"
|
|
shift
|
|
|
|
case "$cmd" in
|
|
list) mcu7zip_list "$@" | sort -k 8 ;;
|
|
copyout) mcu7zip_copyout "$@" ;;
|
|
copyin) mcu7zip_copyin "$@" ;;
|
|
mkdir) mcu7zip_mkdir "$@" ;;
|
|
rm) mcu7zip_rm "$@" ;;
|
|
rmdir) mcu7zip_rmdir "$@" ;;
|
|
*) exit 1 ;;
|
|
esac
|
|
exit 0
|