#! /bin/bash

##  toolbox for the Partclone
##  initial copied from VLC
##  Authors: thomas thomas at nchc dot org dot tw 

###
###  Get a sane environment, just in case
###
LC_ALL=C
export LC_ALL
LANG=C
export LANG

##
##  Give help
##
help()
{
  cat << EOF
recognized flags are:
  --update-po             update translation files
  --update-log            update Changelog files from git
  --update-contributors   update CONTRIBUTORS files from git
  --update-btrfs          update source of btrfs
    eg:
    ./toolbox --update-btrfs /tmp/partclone /tmp/btrfs-progs v6.8
  --update-version        generate src/version.h
EOF
  exit 1
}

##
## update btrfs
##

btrfs_update(){
    partcloneGitRepo=$1
    btrfsprogsGitRepo=$2
    tag=$3
    echo $@ $tag $partcloneGitRepo $btrfsprogsGitRepo

    pushd $partcloneGitRepo/src/
        btrfs_files=$(find btrfs -name "*.h" -o -name "*.c")
    popd
    echo $btrfs_files

    pushd $btrfsprogsGitRepo

        git checkout -b $tag $tag
        ./autogen.sh
        ./configure --disable-documentation 
        make

        cat libbtrfs/version.h

        set -e
        for source_file in $btrfs_files; do 
            echo $source_file
            btrfs_file=$(echo $source_file | sed s/^btrfs//)
            source_file_path=$(echo "$partcloneGitRepo/src/$source_file" | sed "s#//#/#g")
            btrfs_file_path=$(echo "$btrfsprogsGitRepo/$btrfs_file" | sed "s#//#/#g")

            if test -f "$btrfs_file_path"; then
                source_md5=$(md5sum -z $source_file_path |sed 's/ .*//')
                btrfs_md5=$(md5sum -z $btrfs_file_path |sed 's/ .*//')

                if [ "X$source_md5" != "X$btrfs_md5" ]; then
                    echo "cp $btrfs_file_path $source_file_path"
                    cp $btrfs_file_path $source_file_path
                else
                    echo "keep $source_file"
                fi
                echo "MD5: $source_md5 : $btrfs_md5"
            else
                echo "######"
                echo "can't find $source_file in $btrfs_file_path"
                echo "manually merge file!"
                find $btrfsprogsGitRepo -name `basename $source_file`
                echo "######"
            fi

        done

    popd
}

###
###  argument check
###

if test "$1" = ""
then
  help
fi

case "$1" in
  --update-po)
    action=po
    ;;
  --update-btrfs)
    action=btrfs
    ;;
  --update-contributors)
    action=contributors
    ;;
  --update-log)
    action=changelog
    ;;
  --update-version)
    action=version
    ;;
  --help)
    help
    ;;
  *)
    echo "$0: unknown option $1"
    help
    ;;
esac
shift

##
##  Update CONTRIBUTORS file
##
if test "${action}" = "contributors"
then
  git shortlog -sn > CONTRIBUTORS
  exit $?
fi

##
##  Update the potfiles because no one ever does it
##
if test "${action}" = "po"
then
  # find out the source files
  echo "WARNING: you should run \"make update-po\" instead!" >&2
  cd po
  make update-po
  exit $?
fi

##
##  Update the source of btrfs
##

if test "${action}" = "btrfs"
then
    echo "btrfs sync parameters $@"
    btrfs_update $@
fi

##
## update Changelog from SVN
##
#if test "${action}" = "changelog"
#then
#  echo "Would you want to export svn log to ChangeLog(y/N)?"
#  read log
#  case "$log" in  
#    [yY] | [Yy][Ee][Ss] )
#      if which svn2cl 2>&1 >/dev/null ; then
#        echo "please input svn password to export svn log."
#        svn2cl --reparagraph --break-before-msg=2
#      else
#        echo "WARNING: you should install subversion-tools firstly."
#      fi
#      ;;
#    esac
#  exit $?
#fi
#

##
##  Create version file
##
if test "${action}" = "version"
then
  scriptdir=`dirname "$0"`
  file="$scriptdir/src/version.h"
  GIT_REPOSITORY=`git remote -v | grep partclone`
  GIT_REVISION=`git describe --abbrev=7 --always --tags`
  git_ver="none"

  if [ "${GIT_REPOSITORY}" = "" ];
  then
    echo "not git repository?"
    exit 0
  fi

  #if [ "${GIT_REVISION_UPSTREAM}" != "" ]; then
  #    git_ver=$GIT_REVISION_UPSTREAM
  #el
  if [ "${GIT_REVISION}" != "" ]; then
      git_ver=$GIT_REVISION
  else
      git_ver="none"
  fi

  if [ "$git_ver" != "none" ];
  then

cat > ${file}.tmp << EOF
/* DO NOT EDIT THIS FILE - IT IS REGENERATED AT EVERY COMPILE -
 * IT GIVES BETTER TRACKING OF DEVELOPMENT VERSIONS
 * WHETHER THEY ARE BUILT BY OTHERS OR DURING DEVELOPMENT OR FOR THE
 * OFFICIAL PARTCLONE RELEASES.
 */
#define git_version  "${git_ver}"

EOF
  # Do not modify the version file if the content did not change
  diff ${file}.tmp ${file} > /dev/null
  if [ "$?" != "0" ]
  then
    echo "update ${file}"
    mv ${file}.tmp ${file}
  else
    rm ${file}.tmp
  fi
  fi

  exit 0

fi

if test "${action}" = "changelog"
then
    # get source code from Jim Meyering at 
    # http://git.mymadcat.com/index.php/p/tracker/source/tree/master/gitlog-to-changelog
    perl gitlog-to-changelog --since 1999-01-01 > ChangeLog
fi
