#!/bin/bash

export LC_ALL=C

prefix_matches() {
  local f

  f="$1"
  shift
  for s in "$@"; do
    if [ "$f" = "$s" ] || [ "${f#s/}" != "$f" ]; then
      return 0
    fi
  done
  return 1
}

for d in "${@-.}"; do
(
  cd "$d" &&
  if git branch >&/dev/null; then
    exec 3< <(find . -type f | cut -c3- | grep -v '^\.git/' | sort)
    git ls-tree -r HEAD | cut -f2 -d'	' | sort |
      while read -r f; do
        while { read -r g; } <&3 && [ "$g" '<' "$f" ]; do echo "$g"; done
      done
    while { read -r g; } <&3; do echo "$g"; done
    exec 3<&-
  elif hg branch >&/dev/null; then
    subrepos=$(if [ -e .hgsub ]; then sed 's/ = .*//' .hgsub; fi)""
    exec 3< <(find . -type f | cut -c3- | grep -Ev '^$|^\.hg/' | sort)
    hg locate |
      sort |
      while read -r f; do
        while { read -r g; } <&3 && [ "$g" '<' "$f" ]; do
          if ! prefix_matches "$g" "$subrepos"; then
            echo "$g"
          fi
        done
      done
    while { read -r g; } <&3; do echo "$g"; done
    exec 3<&-
    for s in $subrepos; do
      $0 "$s"
    done
  else
    echo "Ignored directory $PWD"
  fi
)
done
