#!/bin/sh

# Copyright 2016 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# Given a source directory, returns the non-test Go files that should
# be built for this target.  This implements Go's build constraints in
# a shell script.  There is similar code in testsuite/gotest.

set -e

LANG=C
LC_ALL=C
LC_CTYPE=C
export LANG LC_ALL LC_CTYPE

srcdir=""
goarch=""
goos=""
extrafiles=""
cmdlinetag="nosuchtag"
cgotag="cgo"

for arg; do
    case "x$arg" in
	x--srcdir)
	    srcdir=$2
	    shift
	    shift
	    ;;
	x--srcdir=*)
	    srcdir=`echo $1 | sed -e 's/^--srcdir=//'`
	    shift
	    ;;
	x--goarch)
	    goarch=$2
	    shift
	    shift
	    ;;
	x--goarch=*)
	    goarch=`echo $1 | sed -e 's/^--goarch=//'`
	    shift
	    ;;
	x--goos)
	    goos=$2
	    shift
	    shift
	    ;;
	x--goos=*)
	    goos=`echo $1 | sed -e 's/^--goos=//'`
	    shift
	    ;;
	x--extrafiles)
	    extrafiles=$2
	    shift
	    shift
	    ;;
	x--extrafiles=*)
	    extrafiles=`echo $1 | sed -e 's/^--extrafiles=//'`
	    shift
	    ;;
	x--tag)
	    cmdlinetag=$2
	    shift
	    shift
	    ;;
	x--tag=*)
	    cmdlinetag=`echo $1 | sed -e 's/^--tag=//'`
	    shift
	    ;;
	x--nocgo)
	    cgotag="nosuchtag"
	    shift
	    ;;
	*)
	    echo 1>&2 "unknown argument $arg"
	    exit 1
	    ;;
    esac
done

cd $srcdir

gofiles=
for f in *.go; do
    case $f in
	*_test.go)
	    ;;
	*.go)
	    gofiles="$gofiles $f"
	    ;;
    esac
done

if test "$gofiles" = ""; then
    echo 1>&2 "no non-test .go files in $srcdir"
    exit 1
fi

matched=
for f in $gofiles; do
    tag1=`echo $f | sed -e 's/^.*_\([^_]*\).go$/\1/'`
    tag2=`echo $f | sed -e 's/^.*_\([^_]*\)_[^_]*.go$/\1/'`
    if test x$tag1 = x$f; then
	tag1=
    fi
    if test x$tag2 = x$f; then
	tag2=
    fi

    case "$tag1" in
	"") ;;
	$goarch) ;;
	$goos) ;;
	aix | android | darwin | dragonfly | freebsd | illumos | hurd | ios | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows | zos)
	    tag1=nonmatchingtag
	    ;;
	386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm)
	    tag1=nonmatchingtag
	    ;;
	*)
	    # File name like x_amd64_random.go, where tag1=random.
	    # Don't match based on tag2.
	    tag2=
	    ;;
    esac

    case "$tag2" in
	"") ;;
	$goarch) ;;
	$goos) ;;
	aix | android | darwin | dragonfly | freebsd | hurd | ios | illumos | js | linux | nacl | netbsd | openbsd | plan9 | solaris | windows | zos)
	    tag2=nonmatchingtag
	    ;;
	386 | amd64 | amd64p32 | arm | armbe | arm64 | arm64be | alpha | ia64 | m68k | mips | mipsle | mips64 | mips64le | mips64p32 | mips64p32le | nios2 | ppc | ppc64 | ppc64le | riscv | riscv64 | s390 | s390x | sh | shbe | sparc | sparc64 | wasm)
	    tag2=nonmatchingtag
	    ;;
    esac

    if test x$tag1 != xnonmatchingtag -a x$tag2 != xnonmatchingtag; then
	# Pipe through cat so that `set -e` doesn't affect fgrep.
	tags=`sed '/^package /q' < $f | grep '^// *+build ' | cat`
	omatch=true
	first=true
	match=false
	for tag in $tags; do
	    case $tag in
		"//")
		    ;;
		"+build" | "//+build")
		    if test "$first" = "true"; then
			first=false
		    elif test "$match" = "false"; then
			omatch=false
		    fi
		    match=false
		    ;;
		$goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | "goexperiment.fieldtrack" | go1.[0-9] | go1.[0-9][0-9])
		    match=true
		    ;;
		"!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7])
		    ;;
		*,*)
		    cmatch=true
		    for ctag in `echo $tag | sed -e 's/,/ /g'`; do
			case $ctag in
			    $goos | $goarch | $cgotag | $cmdlinetag | "gccgo" | "goexperiment.fieldtrack" | go1.[0-9] | go1.[0-9][0-9])
				;;
			    "!"$goos | "!"$goarch | "!"$cgotag | "!"$cmdlinetag | "!gccgo" | "!goexperiment.fieldtrack" | "!"go1.[0-9] | "!"go1.1[0-7])
				cmatch=false
				;;
			    "!"*)
				;;
			    *)
				cmatch=false
				;;
			esac
		    done
		    if test "$cmatch" = "true"; then
			match=true
		    fi
		    ;;
		"!"*)
		    match=true
		    ;;
	    esac
	done

	if test "$match" = "false" -a "$first" = "false"; then
	    omatch=false
	fi

	if test "$omatch" = "true"; then
	    matched="$matched $srcdir/$f"
	fi
    fi
done

echo $matched $extrafiles

exit 0
