#!/bin/bash

# mkbuildtree <build tree>
#
# Creates symbolic links in <build tree> for the sparse tree
# in the current directory.

# Script to determine the relative path between two directories.
# Copyright (c) D. J. Hawkey Jr. 2002
# Fixed for Xen project by K. Fraser in 2003.  
abs_to_rel ()
{
	local CWD SRCPATH
                
	if [ "$1" != "/" -a "${1##*[^/]}" = "/" ]; then
		SRCPATH=${1%?}
	else
		SRCPATH=$1
	fi
	if [ "$2" != "/" -a "${2##*[^/]}" = "/" ]; then
		DESTPATH=${2%?}
	else
		DESTPATH=$2
	fi

	CWD=$PWD
	[ "${1%%[^/]*}" != "/" ] && cd $1 && SRCPATH=$PWD
	[ "${2%%[^/]*}" != "/" ] && cd $2 && DESTPATH=$PWD
	[ "$CWD" != "$PWD" ] && cd $CWD

	BASEPATH=$SRCPATH

	[ "$SRCPATH" = "$DESTPATH" ] && DESTPATH="." && return
	[ "$SRCPATH" = "/" ] && DESTPATH=${DESTPATH#?} && return

	while [ "$BASEPATH/" != "${DESTPATH%${DESTPATH#$BASEPATH/}}" ]; do
          BASEPATH=${BASEPATH%/*}
	done

	SRCPATH=${SRCPATH#$BASEPATH}
        DESTPATH=${DESTPATH#$BASEPATH}
        DESTPATH=${DESTPATH#?}
	while [ -n "$SRCPATH" ]; do
		SRCPATH=${SRCPATH%/*}
		DESTPATH="../$DESTPATH"
	done

	[ -z "$BASEPATH" ] && BASEPATH="/"
	[ "${DESTPATH##*[^/]}" = "/" ] && DESTPATH=${DESTPATH%?}
}

# relative_lndir <target_dir>
# Creates a tree of symlinks in the current working directory that mirror
# real files in <target_dir>. <target_dir> should be relative to the current
# working directory. Symlinks in <target_dir> are ignored. Source-control files
# are ignored.
relative_lndir ()
{
  local SYMLINK_DIR REAL_DIR pref i j
  SYMLINK_DIR=$PWD
  REAL_DIR=$1
  (
  cd $REAL_DIR
  for i in `find . -type d | grep -v SCCS`; do
    [ -d $SYMLINK_DIR/$i ] || mkdir -p $SYMLINK_DIR/$i
    (
    cd $i
    pref=`echo $i | sed -e 's#/[^/]*#../#g' -e 's#^\.##'`
    for j in `find . -type f -o -type l -maxdepth 1`; do
      ln -sf ${pref}${REAL_DIR}/$i/$j ${SYMLINK_DIR}/$i/$j
    done
    )
  done
  )
}

[ "$1" == "" ] && { echo "Syntax: $0 <linux tree to xenify>"; exit 1; }

# Get absolute path to the destination directory
pushd . >/dev/null
cd ${1}
AD=$PWD
popd >/dev/null
  
# Get absolute path to the source directory
AS=`pwd`

# Get name of sparse directory
SDN=$(basename $AS)

# Get path to source, relative to destination
abs_to_rel ${AD} ${AS}
RS=$DESTPATH

# We now work from the destination directory
cd ${AD}

# Remove old symlinks
find sys -type l | while read f
do
  case $(readlink $f) in
  */$SDN/*)
    rm -f $f
    ;;
  esac
done

if [ -f ${AD}/BUILDING ]; then
  # Create symlinks of files and directories which exist in the sparse source
  (cd sys && relative_lndir ../${RS}/sys)
else
  # Create symlinks of files and directories which exist in the sparse source
  relative_lndir ${RS}
  rm -f mkbuildtree
fi
