#!/bin/sh
# List version-controlled file names.

# Print a version string.
scriptversion=2018-03-07.03; # UTC

# Copyright (C) 2006-2019 Free Software Foundation, Inc.

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.


# List the specified version-controlled files.
# With no argument, list them all.  With a single DIRECTORY argument,
# list the version-controlled files in that directory.

# If there's an argument, it must be a single, "."-relative directory name.
# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/

postprocess=
case $1 in
  --help) cat <<EOF
Usage: $0 [-C SRCDIR] [DIR...]

Output a list of version-controlled files in DIR (default .), relative to
SRCDIR (default .).  SRCDIR must be the top directory of a checkout.

Options:
  --help     print this help, then exit
  --version  print version number, then exit
  -C SRCDIR  change directory to SRCDIR before generating list

Report bugs and patches to <bug-gnulib@gnu.org>.
EOF
    exit ;;

  --version)
    year=`echo "$scriptversion" | sed 's/[^0-9].*//'`
    cat <<EOF
vc-list-files $scriptversion
Copyright (C) $year Free Software Foundation, Inc,
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
EOF
    exit ;;

  -C)
    test "$2" = . || postprocess="| sed 's|^|$2/|'"
    cd "$2" || exit 1
    shift; shift ;;
esac

test $# = 0 && set .

for dir
do
  if test -d .git || test -f .git; then
    test "x$dir" = x. \
      && dir= sed_esc= \
      || { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; }
    # Ignore git symlinks - either they point into the tree, in which case
    # we don't need to visit the target twice, or they point somewhere
    # else (often into a submodule), in which case the content does not
    # belong to this package.
    eval exec git ls-tree -r 'HEAD:"$dir"' \
      \| sed -n '"s/^100[^	]*./$sed_esc/p"' $postprocess
  elif test -d .hg; then
    eval exec hg locate '"$dir/*"' $postprocess
  elif test -d .bzr; then
    test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
    eval exec bzr ls -R --versioned '"$dir"' $postprocess
  elif test -d CVS; then
    test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
    if test -x build-aux/cvsu; then
      eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess
    elif (cvsu --help) >/dev/null 2>&1; then
      eval cvsu --find --types=AFGM '"$dir"' $postprocess
    else
      eval awk -F/ \''{			\
          if (!$1 && $3 !~ /^-/) {	\
            f=FILENAME;			\
            if (f ~ /CVS\/Entries$/)	\
              f = substr(f, 1, length(f)-11); \
            print f $2;			\
          }}'\''				\
        `find "$dir" -name Entries -print` /dev/null' $postprocess
    fi
  elif test -d .svn; then
    eval exec svn list -R '"$dir"' $postprocess
  else
    echo "$0: Failed to determine type of version control used in `pwd`" 1>&2
    exit 1
  fi
done

# Local variables:
# eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC"
# End:
