#!/bin/bash

update_toplevel () {
  # Don't "pull" if checkout is not on a named branch
  if test "$2" = "pull" && ( ! git symbolic-ref HEAD >/dev/null 2>/dev/null ); then
    first_args="$1 fetch"
  else
    first_args="$1 $2"
  fi
  shift 2
  echo "[$solution] $first_args $@" 1>&2
  $first_args $@ | sed "s/^/[$solution] /g" 1>&2
  status=$?
  if [ "$status" -ne 0 ]; then
    exit $status
  fi
}

set_target_os () {
  # Get the os we're building for.  On first run, this will be unset.
  target_os=$(git config --get-all target.os 2>/dev/null)
  if [ -z "$target_os" ]; then
    case $(uname -s) in
      Linux) target_os=unix ;;
      Darwin) target_os=mac ;;
      CYGWIN*|MINGW*) target_os=win ;;
      *)
        echo "[$solution] *** No target.os set in .git/config, and I can't" 1>&2
        echo "[$solution] *** figure it out from 'uname -s'" 1>&2
        exit 1
        ;;
    esac
    git config target.os "$target_os"
  fi
}

update_submodule_url () {
  # If the submodule's URL in .gitmodules has changed, propagate the new
  # new URL down.  This is the same as `git submodule sync`, but we do it
  # this way because `git submodule sync` is absurdly slow.
  new_url=$(git config -f .gitmodules "submodule.$1.url" 2>/dev/null)
  old_url=$(git config "submodule.$1.url" 2>/dev/null)
  if [ "$new_url" != "$old_url" ]; then
    git config "submodule.$1.url" "$new_url"
    if [ -e "$1"/.git ]; then
      ( cd $submod && git config remote.origin.url "$new_url" )
    fi
  fi
}

process_submodule () {
  # Check whether this submodule should be ignored or updated.
  # If it's a new submodule, match the os specified in .gitmodules against
  # the os specified in .git/config.
  update_policy=$(git config --get "submodule.$1.update")
  if [ -z "$update_policy" ]; then
    submod_os=$(git config -f .gitmodules --get "submodule.$1.os")
    if [ -n "$submod_os" -a "$submod_os" != "all" ]; then
      update_policy=none
      for os in $target_os; do
        if [ "${submod_os/${os}/}" != "${submod_os}" ]; then
          update_policy=checkout
        fi
      done
    else
      update_policy=checkout
    fi
    if [ "$update_policy" != "none" ]; then
      git submodule --quiet init "$1"
    fi
    git config "submodule.$1.update" $update_policy
  fi
  ignore_policy=$(git config --get "submodule.$1.ignore")
  if [ -z "$ignore_policy" ]; then
    git config "submodule.$1.ignore" all
  fi
  if [ "$update_policy" != "none" ]; then
    update_submodule_url "$1"
    echo "$solution/$1"
  fi
}

if [ -z "$*" ]; then
  exit 0
fi
set -o pipefail
dir="$1"
solution="${1%%/*}"
cd "$solution" 1>/dev/null

if [ "$solution" = "$1" ]; then
  # Skip git checkouts not managed by crup.
  gitdir="$(git rev-parse --git-dir)"
  if ! grep -q -s "The Chromium Authors" "$gitdir/description"; then
    echo "Skipping unmanaged git directory $1" 1>&2
    exit 0
  fi

  # Set default behavior to ignore diffs in submodule checkouts
  diff_policy=$(git config --get "diff.ignoreSubmodules")
  if [ -z "$diff_policy" ]; then
    git config diff.ignoreSubmodules all
  fi

  # Don't "pull" if checkout is not on a named branch
  shift
  if test $# -ne 0; then
    update_toplevel "$@"
  fi

  set_target_os

  git ls-files -s | grep ^160000 | awk '{print $4}' |
  while read submod; do
    process_submodule "$submod"
  done
  status=$?
else
  submodule="${1#*/}"
  echo "[$solution] updating $submodule"
  git submodule update --recursive --quiet "$submodule" |
  ( grep -v '^Skipping submodule' || true ) | sed "s|^|[$1] |g" 2>/dev/null
  status=$?
  if [ "$status" -ne "0" ]; then
    echo "[$solution] FAILED to update $submodule"
  fi
fi
exit $status
