summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/cvs/contrib/descend.sh
blob: 039a7a3d3ee4227c4d850e36b30c8c9d40ddceb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#! /bin/sh
#
# descend - walk down a directory tree and execute a command at each node

fullname=$0
name=descend
usage="Usage: $name [-afqrv] command [directory ...]\n
\040\040-a\040\040All: descend into directories starting with '.'\n
\040\040-f\040\040Force: ignore errors during descent\n
\040\040-q\040\040Quiet: don't print directory names\n
\040\040-r\040\040Restricted: don't descend into RCS, CVS.adm, SCCS directories\n
\040\040-v\040\040Verbose: print command before executing it"

# Scan for options
while getopts afqrv option; do
    case $option in
	a)
	    alldirs=$option
	    options=$options" "-$option
	    ;;
	f)
	    force=$option
	    options=$options" "-$option
	    ;;
	q)
	    verbose=
	    quiet=$option
	    options=$options" "-$option
	    ;;
	r)
	    restricted=$option
	    options=$options" "-$option
	    ;;
	v)
	    verbose=$option
	    quiet=
	    options=$options" "-$option
	    ;;
	\?)
	    /usr/5bin/echo $usage 1>&2
	    exit 1
	    ;;
    esac
done
shift `expr $OPTIND - 1`

# Get command to execute
if [ $# -lt 1 ] ; then
    /usr/5bin/echo $usage 1>&2
    exit 1
else
    command=$1
    shift
fi

# If no directory specified, use '.'
if [ $# -lt 1 ] ; then
    default_dir=.
fi

# For each directory specified
for dir in $default_dir "$@" ; do

    # Spawn sub-shell so we return to starting directory afterward
    (cd $dir

	# Execute specified command
	if [ -z "$quiet" ] ; then
	    echo In directory `hostname`:`pwd`
	fi
	if [ -n "$verbose" ] ; then
	    echo $command
	fi
	eval "$command" || if [ -z "$force" ] ; then exit 1; fi

	# Collect dot file names if necessary
	if [ -n "$alldirs" ] ; then
	    dotfiles=.*
	else
	    dotfiles=
	fi

	# For each file in current directory
	for file in $dotfiles * ; do

	    # Skip '.' and '..'
	    if [ "$file" = "." -o "$file" = ".." ] ; then
		continue
	    fi

	    # If a directory but not a symbolic link
	    if [ -d "$file" -a ! -h "$file" ] ; then

		# If not skipping this type of directory
		if [ \( "$file" != "RCS" -a \
			"$file" != "SCCS" -a \
			"$file" != "CVS" -a \
			"$file" != "CVS.adm" \) \
			-o -z "$restricted" ] ; then

		    # Recursively descend into it
		    $fullname $options "$command" "$file" \
		    || if [ -z "$force" ] ; then exit 1; fi
		fi

	    # Else if a directory AND a symbolic link
	    elif [ -d "$file" -a -h "$file" ] ; then

		if [ -z "$quiet" ] ; then
		    echo In directory `hostname`:`pwd`/$file: symbolic link: skipping
		fi
	    fi
	done
    ) || if [ -z "$force" ] ; then exit 1; fi
done