#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

# Script to check subversion settings for known file types.

ufind . \( -name .svn -prune \) -o \( -type f -name \*.java    \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.cs      \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.txt     \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.c       \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.h       \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.py      \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.xml     \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.etch    \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.etchinc \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.vm      \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.kwd     \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.sh      \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.bash    \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.bat     \! -exec sh scripts/checkeol.sh \{} \; -print \)
ufind . \( -name .svn -prune \) -o \( -type f -name \*.tmpl    \! -exec sh scripts/checkeol.sh \{} \; -print \)
