|
|
@@ -6,7 +6,7 @@ sharxz(){
|
|
|
CMD=""
|
|
|
OUTPUT="-"
|
|
|
DEBUG=false
|
|
|
- NO_PARSE=false
|
|
|
+ PARSE=false
|
|
|
while getopts ":dT:o:C:x:n" opt; do
|
|
|
case $opt in
|
|
|
d )
|
|
|
@@ -24,8 +24,8 @@ sharxz(){
|
|
|
x )
|
|
|
CMD="$OPTARG"
|
|
|
;;
|
|
|
- n )
|
|
|
- NO_PARSE=true
|
|
|
+ p )
|
|
|
+ PARSE=true
|
|
|
;;
|
|
|
\? ) echo "Usage: sharxz [-T TAR_OPTIONS] [-C chdir]" 1>&2
|
|
|
;;
|
|
|
@@ -38,22 +38,28 @@ sharxz(){
|
|
|
[ "$OUTPUT" == "-" ] && OUTPUT="/dev/stdout"
|
|
|
INFILE=$1
|
|
|
|
|
|
+ [ "$CHDIR" == "" ] && [ -d "$INFILE" ] &&
|
|
|
+ CHDIR="$INFILE"
|
|
|
[ "$CHDIR" == "" ] &&
|
|
|
CHDIR="$(dirname $INFILE)"
|
|
|
|
|
|
[ ! -f "$INFILE" ] &&
|
|
|
- [ ! -d "$CHDIR"] && echo "Error: $INFILE is not a file, and $CHDIR is not a directory" 1>&2 && exit 1
|
|
|
+ [ ! -d "$CHDIR" ] && echo "Error: $INFILE is not a file, and $CHDIR is not a directory" 1>&2 && exit 1
|
|
|
|
|
|
[ -z "$CMD" ] &&
|
|
|
CMD="./$(realpath "--relative-to=$CHDIR" "$INFILE")"
|
|
|
|
|
|
$DEBUG && echo "CMD: $CMD" 1>&2
|
|
|
|
|
|
- cd "$CHDIR"
|
|
|
+ {
|
|
|
+ cd "$CHDIR"
|
|
|
|
|
|
- $NO_PARSE || parse_options
|
|
|
+ $DEBUG && du -sh . 1>&2
|
|
|
|
|
|
- print_shar "$INFILE" > "$OUTPUT"
|
|
|
+ $PARSE || parse_options
|
|
|
+
|
|
|
+ print_shar "$INFILE"
|
|
|
+ } > "$OUTPUT"
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -72,9 +78,8 @@ print_shar(){
|
|
|
printf -- "#!/usr/bin/env bash\n\nDEBUG=$DEBUG\n"
|
|
|
printf -- "$UNSHAR\n"
|
|
|
$DEBUG && pwd 1>&2
|
|
|
- $DEBUG && ls ** 1>&2
|
|
|
$DEBUG && set -x
|
|
|
- tar -c ${TAR_OPTIONS[@]} ./| xz -c -3 -T 0 | base64 -w 0
|
|
|
+ tar -c ${TAR_OPTIONS[@]} .| xz -c -3 -T 0 | base64 -w 0
|
|
|
$DEBUG && set +x
|
|
|
printf -- "\n$SETUPSHAR\n"
|
|
|
|
|
|
@@ -99,10 +104,17 @@ read -r -d '' UNSHAR <<'UNSHAREOF'
|
|
|
set -e
|
|
|
$DEBUG && set -x
|
|
|
|
|
|
-FIFO_NAME=$(mktemp -u)
|
|
|
+cleanup(){
|
|
|
+ rm -f "$FIFO_NAME"
|
|
|
+ rm -r "$TMPDIR"
|
|
|
+ exit 127
|
|
|
+}
|
|
|
+
|
|
|
+FIFO_NAME=$(mktemp -u).fifo
|
|
|
mkfifo "$FIFO_NAME"
|
|
|
TMPDIR=$(mktemp -d)
|
|
|
|
|
|
+trap cleanup SIGINT
|
|
|
cat $FIFO_NAME|base64 -d |xz -d -T 0 |tar -xC $TMPDIR &
|
|
|
|
|
|
cat <<SAFEPAYLOADEOF > "$FIFO_NAME"
|
|
|
@@ -115,12 +127,13 @@ wait
|
|
|
rm "$FIFO_NAME"
|
|
|
cd $TMPDIR
|
|
|
set +e
|
|
|
+$DEBUG && pwd 1>&2
|
|
|
|
|
|
SETUPSHAREOF
|
|
|
|
|
|
read -r -d '' CLEANUPSHAR <<'CLEANUPSHAREOF'
|
|
|
EXITCODE=$?
|
|
|
-rm -r $TMPDIR
|
|
|
+cleanup
|
|
|
exit $EXITCODE
|
|
|
|
|
|
CLEANUPSHAREOF
|