#!/bin/sh
# Copyright (c) 2017 Jonas 'Sortie' Termansen.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# tix-iso-add
# Add directory to iso filesystem.

set -e

directory=
input=
operand=1
output=

dashdash=
previous_option=
for argument do
  if test -n "$previous_option"; then
    eval $previous_option=\$argument
    previous_option=
    continue
  fi

  case $argument in
  *=?*) parameter=$(expr "X$argument" : '[^=]*=\(.*\)' || true) ;;
  *=)   parameter= ;;
  *)    parameter=yes ;;
  esac

  case $dashdash$argument in
  --) dashdash=yes ;;
  -o) previous_option=output ;;
  --output=*) output=$parameter ;;
  --output) previous_option=output ;;
  -*) echo "$0: unrecognized option $argument" >&2
      exit 1 ;;
  *)
    if [ $operand = 1 ]; then
      input="$argument"
      operand=2
    elif [ $operand = 2 ]; then
      directory="$argument"
      operand=3
    else
      echo "$0: unexpected extra operand $argument" >&2
      exit 1
    fi
    ;;
  esac
done

if test -n "$previous_option"; then
  echo "$0: option '$argument' requires an argument" >&2
  exit 1
fi

if test -z "$input"; then
  echo "$0: No input file was specified" >&2
  exit 1
fi

if test -z "$output"; then
  output="$input"
fi

tmpdir=
tmpdest=
cleanup() {
  if [ -n "$tmpdir" ]; then rm -rf "$tmpdir"; fi
  if [ -n "$tmpdest" ]; then rm -rf "$tmpdest"; fi
}
trap cleanup EXIT HUP INT QUIT TERM

if [ -z "$directory" ]; then
  tmpdir=$(mktemp -d)
  directory=$tmpdir
fi

# Use different -indev and -outdev as just xorriso -dev doesn't rewrite the .iso
# in the same manner.
if [ "$input" = "$output" ]; then
  tmpdest=$(mktemp -d)
  dest=$tmpdest/iso
else
  dest=$output
  rm -f -- "$dest"
fi

xorriso \
  -indev "$input" \
  -outdev "$dest" \
  -boot_image grub keep \
  -pathspecs on \
  -add \
  ="$directory"

# xorriso doesn't write out the destination file if the directory is empty.
if [ ! -e "$dest" ]; then
  cp -- "$input" "$dest"
fi

if [ "$dest" != "$output" ]; then
  cp -- "$dest" "$output"
fi