summaryrefslogtreecommitdiffstats
path: root/bin/chkmanifest
blob: 38b751f3f2c90150a4e246ad6c08aff0d9620480 (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/sh
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5.  The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the files COPYING and Copyright.html.  COPYING can be found at the root
# of the source code distribution tree; Copyright.html can be found at the
# root level of an installed copy of the electronic HDF5 document set and
# is linked from the top-level documents page.  It can also be found at
# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
# access to either file, you may request a copy from help@hdfgroup.org.
#

# Check that all the files in MANIFEST exist and (if this is a
# GIT clone) that all the GIT-managed files appear in the
# MANIFEST.

verbose=yes
MANIFEST=/tmp/HD_MANIFEST.$$

# Main
test "$verbose" && echo "   Checking MANIFEST..." 1>&2
# clean up $MANIFEST file when exits
trap "rm -f $MANIFEST" 0

# Only split lines on newline, not whitespace
set -f
IFS='
'

# First make sure i am in the directory in which there is an MANIFEST file
# and then do the checking from there.  Will try the following,
# current directory, parent directory, the directory this command resides.
if [ -f MANIFEST ]; then
    continue
elif [ -f ../MANIFEST ]; then
    cd ..
else
    commanddir=`dirname $0`
    if [ -d "$commanddir" -a -f $commanddir/MANIFEST ]; then
	cd $commanddir
	continue
    else
	echo MANIFEST file not found. Abort.
	exit 1
    fi
fi

# Do an autogen if generated files (e.g., configure) is not present
if [ ! -f configure ]; then
    echo "   running $AUTOGEN"
    $AUTOGEN > $AUTOGEN_LOG 2>&1
    if [ $? -ne 0 ]; then
	echo $AUTOGEN encountered error. Abort.
	echo output from $AUTOGEN:
	cat $AUTOGEN_LOG
	exit 1
    fi
    rm $AUTOGEN_LOG
fi

# Check for duplicate entries.  This can be done at any time, but it may as 
# well be sooner so that if something else fails the presence of duplicates
# will already be known.
errcode=0
DUPLICATES=`perl -ne 's/#.*//; next if /^\s*$/; if ($uniq{$_}++) { print $_; }' MANIFEST`
if [ "$DUPLICATES" ]; then
   cat 1>&2 <<EOF
These entries appear more than once in the MANIFEST:  
$DUPLICATES
Please remove the duplicate lines and try again.

EOF
errcode=1 
fi

# Copy the manifest file to get a list of file names.
grep '^\.' MANIFEST | expand | cut -f1 -d' ' >$MANIFEST

for file in `cat $MANIFEST`; do
    if [ ! -f $file ]; then
       echo "- $file"
       fail=yes
    fi
done

# Get the list of files under version control and check that they are
# present.
#
# First get a list of all the pending files with git status and
# check those.
git_stat=`git status -s`
for file in $git_stat; do

    # Newly added files are not listed by git ls-files, which
    # we check later.

    # The line listing new files starts with 'A'.
    letter=`echo $file | head -c 1`
    if [ "$letter" = "A" ]; then
        # Convert the git status columns to './' so it matches
        # the manifest file name.
        #
        # There is a space between the status columns and file name, hence
        # the '3'.
        path=`echo $file | sed 's/^.\{3\}/\.\//g'`
        # Ignore directories
        if [ ! -d $path ]; then
            if (grep ^$path$ $MANIFEST >/dev/null); then
                :
            else
                echo "- $path"
                fail=yes
            fi
        fi
    fi
done

# Next check git ls-files, which gets a list of all files that are
# checked in.
git_ls=`git ls-files`
for file in $git_ls; do
    path="./${file}"
    # Ignore directories
    if [ ! -d $path ]; then
        if (grep ^$path$ $MANIFEST >/dev/null); then
            :
        else
            echo "+ $path"
            fail=yes
        fi
    fi
done

# Finish up
if [ "X$fail" = "Xyes" ]; then
    cat 1>&2 <<EOF
The MANIFEST is out of date. Files marked with a minus sign (-) no
longer exist; files marked with a plus sign (+) are GIT-managed but do
not appear in the MANIFEST.  Please remedy the situation and try again.
EOF
    exit 1
fi

if [ $errcode -ne 0 ]; then
    exit 1
fi 

test "$verbose" && echo "   The MANIFEST is up to date." 1>&2
exit 0