|
@@ -1,14 +1,19 @@
|
|
|
#!/usr/bin/env bash
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
sharxz(){
|
|
sharxz(){
|
|
|
- TAR_OPTIONS=""
|
|
|
|
|
|
|
+ TAR_OPTIONS=()
|
|
|
CHDIR=""
|
|
CHDIR=""
|
|
|
|
|
+ CMD=""
|
|
|
OUTPUT="-"
|
|
OUTPUT="-"
|
|
|
- TAR_EXCLUDE=()
|
|
|
|
|
- while getopts ":T:S:C:o:" opt; do
|
|
|
|
|
- case ${opt} in
|
|
|
|
|
|
|
+ DEBUG=false
|
|
|
|
|
+ NO_PARSE=false
|
|
|
|
|
+ while getopts ":dT:o:C:x:n" opt; do
|
|
|
|
|
+ case $opt in
|
|
|
|
|
+ d )
|
|
|
|
|
+ DEBUG=true
|
|
|
|
|
+ ;;
|
|
|
T )
|
|
T )
|
|
|
- TAR_OPTIONS="$OPTARG"
|
|
|
|
|
|
|
+ TAR_OPTIONS+=( $OPTARG )
|
|
|
;;
|
|
;;
|
|
|
o )
|
|
o )
|
|
|
OUTPUT="$OPTARG"
|
|
OUTPUT="$OPTARG"
|
|
@@ -16,47 +21,83 @@ sharxz(){
|
|
|
C )
|
|
C )
|
|
|
CHDIR="$OPTARG"
|
|
CHDIR="$OPTARG"
|
|
|
;;
|
|
;;
|
|
|
|
|
+ x )
|
|
|
|
|
+ CMD="$OPTARG"
|
|
|
|
|
+ ;;
|
|
|
|
|
+ n )
|
|
|
|
|
+ NO_PARSE=true
|
|
|
|
|
+ ;;
|
|
|
\? ) echo "Usage: sharxz [-T TAR_OPTIONS] [-C chdir]" 1>&2
|
|
\? ) echo "Usage: sharxz [-T TAR_OPTIONS] [-C chdir]" 1>&2
|
|
|
;;
|
|
;;
|
|
|
: )
|
|
: )
|
|
|
echo "Invalid option: $OPTARG requires an argument" 1>&2
|
|
echo "Invalid option: $OPTARG requires an argument" 1>&2
|
|
|
- ;;
|
|
|
|
|
|
|
+ ;;
|
|
|
esac
|
|
esac
|
|
|
done
|
|
done
|
|
|
shift $((OPTIND -1))
|
|
shift $((OPTIND -1))
|
|
|
[ "$OUTPUT" == "-" ] && OUTPUT="/dev/stdout"
|
|
[ "$OUTPUT" == "-" ] && OUTPUT="/dev/stdout"
|
|
|
INFILE=$1
|
|
INFILE=$1
|
|
|
|
|
|
|
|
- if [ "$CHDIR" == "" ]; then
|
|
|
|
|
|
|
+ [ "$CHDIR" == "" ] &&
|
|
|
CHDIR="$(dirname $INFILE)"
|
|
CHDIR="$(dirname $INFILE)"
|
|
|
- fi
|
|
|
|
|
|
|
|
|
|
- [ ! -f "$INFILE" ] && echo "Error: $INFILE is not a file" 1>&2 && exit 1
|
|
|
|
|
|
|
+ [ ! -f "$INFILE" ] &&
|
|
|
|
|
+ [ ! -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")"
|
|
|
|
|
|
|
|
- INFILE="$(realpath "--relative-to=$CHDIR" "$INFILE")"
|
|
|
|
|
|
|
+ $DEBUG && echo "CMD: $CMD" 1>&2
|
|
|
|
|
|
|
|
cd "$CHDIR"
|
|
cd "$CHDIR"
|
|
|
|
|
|
|
|
|
|
+ $NO_PARSE || parse_options
|
|
|
|
|
+
|
|
|
print_shar "$INFILE" > "$OUTPUT"
|
|
print_shar "$INFILE" > "$OUTPUT"
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+parse_options(){
|
|
|
|
|
+ [ -f .sharxz/env ] && source .sharxz/env
|
|
|
|
|
+ [ -f .sharxz/exclude ] && while read -r line; do
|
|
|
|
|
+ local OPTION="$(trim "$line")"
|
|
|
|
|
+ [ -z "$OPTION" ] && continue
|
|
|
|
|
+ [[ $OPTION == \#* ]] && continue
|
|
|
|
|
+ $DEBUG && echo "Excluding: $line" 1>&2
|
|
|
|
|
+ TAR_OPTIONS+=( "--exclude=$OPTION" )
|
|
|
|
|
+ done < .sharxz/exclude
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
print_shar(){
|
|
print_shar(){
|
|
|
|
|
+ printf -- "#!/usr/bin/env bash\n\nDEBUG=$DEBUG\n"
|
|
|
printf -- "$UNSHAR\n"
|
|
printf -- "$UNSHAR\n"
|
|
|
- tar -c $TAR_OPTIONS .| xz -c -3 -T 0 | base64 -w 0
|
|
|
|
|
|
|
+ $DEBUG && pwd 1>&2
|
|
|
|
|
+ $DEBUG && ls ** 1>&2
|
|
|
|
|
+ $DEBUG && set -x
|
|
|
|
|
+ tar -c ${TAR_OPTIONS[@]} ./| xz -c -3 -T 0 | base64 -w 0
|
|
|
|
|
+ $DEBUG && set +x
|
|
|
printf -- "\n$SETUPSHAR\n"
|
|
printf -- "\n$SETUPSHAR\n"
|
|
|
|
|
|
|
|
- printf -- "./$INFILE "'$@'"\n"
|
|
|
|
|
|
|
+ printf -- "$CMD"' $@'"\n"
|
|
|
|
|
|
|
|
printf -- "\n$CLEANUPSHAR\n"
|
|
printf -- "\n$CLEANUPSHAR\n"
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+trim() {
|
|
|
|
|
+ local var="$*"
|
|
|
|
|
+ # remove leading whitespace characters
|
|
|
|
|
+ var="${var#"${var%%[![:space:]]*}"}"
|
|
|
|
|
+ # remove trailing whitespace characters
|
|
|
|
|
+ var="${var%"${var##*[![:space:]]}"}"
|
|
|
|
|
+ printf '%s' "$var"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
|
|
|
read -r -d '' UNSHAR <<'UNSHAREOF'
|
|
read -r -d '' UNSHAR <<'UNSHAREOF'
|
|
|
-#!/usr/bin/env bash
|
|
|
|
|
|
|
|
|
|
set -e
|
|
set -e
|
|
|
-set +x
|
|
|
|
|
|
|
+$DEBUG && set -x
|
|
|
|
|
|
|
|
FIFO_NAME=$(mktemp -u)
|
|
FIFO_NAME=$(mktemp -u)
|
|
|
mkfifo "$FIFO_NAME"
|
|
mkfifo "$FIFO_NAME"
|