#! /bin/sh
#
# by dw 2013-11-12
#
# relies on tar to autodetect the used compression method (gz, bz2, xz, ...)
# supported formats (posix, ...) depend on the found version of tar
# due to proprietory options works only with GNU tar (1.26)
# list and copyout working
# rm, mkdir, rmdir partly working (only uncompressed tar archives)
# copyin works partly (only uncompressed tar archives, archive rootdir)
# besides modifying the tar file can cause problems (duplicate files, ...)
# and should be avoided

TAR=`which tar 2>/dev/null` || exit 1

mctarfs_list ()
{
  # link count is hardcoded to 1
  # can't use $6 for the filename in case of blanks or other separators
  # output of GNU tar 1.26 for tar tvf:
  # drwxr-xr-x user/group      0 2013-08-22 20:27 directory/
  # mc expects: AAAAAAA NNN OOOOOOOO GGGGGGGG SSSSSSSS DATETIME [PATH/]FILENAME [-> [PATH/]FILENAME[/]]]
  # gawk strips blanks => trailing blanks of filenames are lost
  $TAR tvf "$1" | gawk '
  BEGIN { FS="" }
  {
    split($0,b," ")
    sub(/\//, " ", b[2])
    split(b[4], DATE, "-")
    name_offs = index($0, b[5])+6
    printf "%s 1 %s %s %s-%s-%s %s ./%s\n", b[1], b[2], b[3], DATE[2], DATE[3], DATE[1], b[5], substr($0, name_offs)
  }'
}

mctarfs_copyin ()
{
  $TAR rf "$1" "$2" >/dev/null
}

mctarfs_copyout ()
{
  $TAR xOf "$1" "$2" > "$3"
}

mctarfs_mkdir ()
{
  pwd="`pwd`"
  dir=`mktemp -d "${MC_TMPDIR:-/tmp}/mctmpdir-utar.XXXXXX"` || exit 1
  cd "$dir"
  mkdir -p "$2"  
  $TAR rf "$1" "$2" >/dev/null
  cd "$pwd"
  rm -rf "$dir"
}

mctarfs_rm ()
{
  $TAR --delete -f "$1" "$2" >/dev/null
}

# override any locale for dates
LC_DATE=C
export LC_DATE

umask 077

if [ -z "$TAR" ]; then
  echo "Error: could not find tar." >&2
  exit 1
fi

cmd="$1"
shift

case "$cmd" in
  # Workaround for a bug in mc - directories must precede files to
  # avoid duplicate entries, so we sort output by filenames
  list)    mctarfs_list    "$@" | sort -k 8 ;;
  rm)      mctarfs_rm      "$@" ;;
  rmdir)   mctarfs_rm      "$@" ;;
  mkdir)   mctarfs_mkdir   "$@" ;;
  copyin)  mctarfs_copyin  "$@" ;;
  copyout) mctarfs_copyout "$@" ;;
  *) exit 1 ;;
esac
exit 0
