Sun May 13 13:44:00 2012 UTC ()
Updated pkgtools/pkg_chk to 2.0.1

ensure OS and arch tags are set in the binary package case as well as source
set x11 for R7 as ell as R6


(abs)
diff -r1.75 -r1.76 pkgsrc/pkgtools/pkg_chk/Makefile
diff -r1.65 -r1.66 pkgsrc/pkgtools/pkg_chk/files/pkg_chk.sh

cvs diff -r1.75 -r1.76 pkgsrc/pkgtools/pkg_chk/Makefile (switch to unified diff)

--- pkgsrc/pkgtools/pkg_chk/Makefile 2011/01/13 17:07:01 1.75
+++ pkgsrc/pkgtools/pkg_chk/Makefile 2012/05/13 13:43:59 1.76
@@ -1,47 +1,46 @@ @@ -1,47 +1,46 @@
1# $NetBSD: Makefile,v 1.75 2011/01/13 17:07:01 jmmv Exp $ 1# $NetBSD: Makefile,v 1.76 2012/05/13 13:43:59 abs Exp $
2 2
3DISTNAME= pkg_chk-2.0 3DISTNAME= pkg_chk-2.0.1
4PKGREVISION= 1 
5CATEGORIES= pkgtools 4CATEGORIES= pkgtools
6MASTER_SITES= # empty 5MASTER_SITES= # empty
7DISTFILES= # empty 6DISTFILES= # empty
8 7
9OWNER= abs@NetBSD.org 8OWNER= abs@NetBSD.org
10HOMEPAGE= ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/doc/pkgsrc.html 9HOMEPAGE= ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc/doc/pkgsrc.html
11COMMENT= Check installed package versions against pkgsrc 10COMMENT= Check installed package versions against pkgsrc
12 11
13PKG_INSTALLATION_TYPES= overwrite pkgviews 12PKG_INSTALLATION_TYPES= overwrite pkgviews
14PKG_DESTDIR_SUPPORT= user-destdir 13PKG_DESTDIR_SUPPORT= user-destdir
15 14
16WRKSRC= ${WRKDIR} 15WRKSRC= ${WRKDIR}
17USE_LANGUAGES= # empty 16USE_LANGUAGES= # empty
18USE_TOOLS+= mktemp:run 17USE_TOOLS+= mktemp:run
19USE_TOOLS+= gzcat:run 18USE_TOOLS+= gzcat:run
20USE_TOOLS+= gzip:run 19USE_TOOLS+= gzip:run
21NO_BUILD= yes 20NO_BUILD= yes
22 21
23CONFLICTS= pkgchk-[0-9]* 22CONFLICTS= pkgchk-[0-9]*
24 23
25INSTALLATION_DIRS= sbin ${PKGMANDIR}/man8 24INSTALLATION_DIRS= sbin ${PKGMANDIR}/man8
26 25
27.include "../../mk/bsd.prefs.mk" 26.include "../../mk/bsd.prefs.mk"
28 27
29SUBST_CLASSES+= vars 28SUBST_CLASSES+= vars
30SUBST_STAGE.vars= pre-configure 29SUBST_STAGE.vars= pre-configure
31SUBST_MESSAGE.vars= Configuring sources. 30SUBST_MESSAGE.vars= Configuring sources.
32SUBST_FILES.vars= pkg_chk.sh pkg_chk.8 31SUBST_FILES.vars= pkg_chk.sh pkg_chk.8
33SUBST_VARS.vars= AWK GREP GZCAT GZIP_CMD ID MAKE MAKECONF MKTEMP \ 32SUBST_VARS.vars= AWK GREP GZCAT GZIP_CMD ID MAKE MAKECONF MKTEMP \
34 PKG_ADD PKG_ADMIN PKG_DELETE PKG_INFO \ 33 PKG_ADD PKG_ADMIN PKG_DELETE PKG_INFO \
35 SED SH SORT TSORT PREFIX PKG_DBDIR XARGS 34 SED SH SORT TSORT PREFIX PKG_DBDIR XARGS
36 35
37REPLACE_SH+= pkg_chk.sh 36REPLACE_SH+= pkg_chk.sh
38 37
39do-extract: 38do-extract:
40 cp ${FILESDIR}/pkg_chk.sh ${WRKSRC} 39 cp ${FILESDIR}/pkg_chk.sh ${WRKSRC}
41 cp ${FILESDIR}/pkg_chk.8 ${WRKSRC} 40 cp ${FILESDIR}/pkg_chk.8 ${WRKSRC}
42 41
43do-install: 42do-install:
44 ${INSTALL_SCRIPT} ${WRKSRC}/pkg_chk.sh ${DESTDIR}/${PREFIX}/sbin/pkg_chk 43 ${INSTALL_SCRIPT} ${WRKSRC}/pkg_chk.sh ${DESTDIR}/${PREFIX}/sbin/pkg_chk
45 ${INSTALL_MAN} ${WRKSRC}/pkg_chk.8 ${DESTDIR}/${PREFIX}/${PKGMANDIR}/man8/pkg_chk.8 44 ${INSTALL_MAN} ${WRKSRC}/pkg_chk.8 ${DESTDIR}/${PREFIX}/${PKGMANDIR}/man8/pkg_chk.8
46 45
47.include "../../mk/bsd.pkg.mk" 46.include "../../mk/bsd.pkg.mk"

cvs diff -r1.65 -r1.66 pkgsrc/pkgtools/pkg_chk/files/pkg_chk.sh (switch to unified diff)

--- pkgsrc/pkgtools/pkg_chk/files/pkg_chk.sh 2009/07/22 21:56:13 1.65
+++ pkgsrc/pkgtools/pkg_chk/files/pkg_chk.sh 2012/05/13 13:43:59 1.66
@@ -1,936 +1,942 @@ @@ -1,936 +1,942 @@
1#!@SH@ -e 1#!@SH@ -e
2# 2#
3# $Id: pkg_chk.sh,v 1.65 2009/07/22 21:56:13 sketch Exp $ 3# $Id: pkg_chk.sh,v 1.66 2012/05/13 13:43:59 abs Exp $
4# 4#
5# TODO: Make -g check dependencies and tsort 5# TODO: Make -g check dependencies and tsort
6# TODO: Make -g list user-installed packages first, followed by commented 6# TODO: Make -g list user-installed packages first, followed by commented
7# out automatically installed packages 7# out automatically installed packages
8# TODO: List user-installed packages that are not in config 8# TODO: List user-installed packages that are not in config
9 9
10PATH=${PATH}:/usr/sbin:/usr/bin 10PATH=${PATH}:/usr/sbin:/usr/bin
11 11
12SUMMARY_FILE=pkg_summary.gz 12SUMMARY_FILE=pkg_summary.gz
13OLD_SUMMARY_FILE=pkg_chk-summary 13OLD_SUMMARY_FILE=pkg_chk-summary
14 14
15is_binary_available() 15is_binary_available()
16 { 16 {
17 if [ -n "$PKGDB" ]; then 17 if [ -n "$PKGDB" ]; then
18 for iba_pkg in $PKGDB; do 18 for iba_pkg in $PKGDB; do
19 case $iba_pkg in 19 case $iba_pkg in
20 *:"$1") 20 *:"$1")
21 return 0; 21 return 0;
22 ;; 22 ;;
23 esac 23 esac
24 done 24 done
25 return 1; 25 return 1;
26 else 26 else
27 if [ -f "$PACKAGES/$1$PKG_SUFX" ]; then 27 if [ -f "$PACKAGES/$1$PKG_SUFX" ]; then
28 return 0; 28 return 0;
29 else 29 else
30 return 1; 30 return 1;
31 fi 31 fi
32 fi 32 fi
33 } 33 }
34 34
35bin_pkg_info2pkgdb() 35bin_pkg_info2pkgdb()
36 { 36 {
37 ${AWK} '/^PKGNAME=/ {sub("^PKGNAME=", ""); PKGNAME=$0} \ 37 ${AWK} '/^PKGNAME=/ {sub("^PKGNAME=", ""); PKGNAME=$0} \
38 /^PKGPATH=/ {sub("^PKGPATH=", ""); printf("%s:%s ", $0, PKGNAME)}' 38 /^PKGPATH=/ {sub("^PKGPATH=", ""); printf("%s:%s ", $0, PKGNAME)}'
39 } 39 }
40 40
41check_packages_installed() 41check_packages_installed()
42 { 42 {
43 MISSING_TODO= 43 MISSING_TODO=
44 MISMATCH_TODO= 44 MISMATCH_TODO=
45 45
46 for pkgdir in $* ; do 46 for pkgdir in $* ; do
47 47
48 if [ -n "$opt_B" ];then 48 if [ -n "$opt_B" ];then
49 extract_pkg_vars $pkgdir PKGNAME FILESDIR PKGDIR DISTINFO_FILE PATCHDIR 49 extract_pkg_vars $pkgdir PKGNAME FILESDIR PKGDIR DISTINFO_FILE PATCHDIR
50 elif [ -n "$opt_s" ] ; then 50 elif [ -n "$opt_s" ] ; then
51 extract_pkg_vars $pkgdir PKGNAME 51 extract_pkg_vars $pkgdir PKGNAME
52 else 52 else
53 PKGNAME=`pkgdir2pkgname $pkgdir` 53 PKGNAME=`pkgdir2pkgname $pkgdir`
54 fi 54 fi
55 if [ -z "$PKGNAME" ]; then 55 if [ -z "$PKGNAME" ]; then
56 MISS_DONE=$MISS_DONE" "$pkgdir 56 MISS_DONE=$MISS_DONE" "$pkgdir
57 continue 57 continue
58 fi 58 fi
59 if [ ! -d $PKG_DBDIR/$PKGNAME ];then 59 if [ ! -d $PKG_DBDIR/$PKGNAME ];then
60 msg_n "$pkgdir - " 60 msg_n "$pkgdir - "
61 pkg=$(echo $PKGNAME | ${SED} 's/-[0-9].*//') 61 pkg=$(echo $PKGNAME | ${SED} 's/-[0-9].*//')
62 pkginstalled=$(sh -c "${PKG_INFO} -e $pkg" || true) 62 pkginstalled=$(sh -c "${PKG_INFO} -e $pkg" || true)
63 INSTALL= 63 INSTALL=
64 if [ -n "$pkginstalled" ];then 64 if [ -n "$pkginstalled" ];then
65 msg_n "$pkginstalled < $PKGNAME" 65 msg_n "$pkginstalled < $PKGNAME"
66 MISMATCH_TODO="$MISMATCH_TODO $pkginstalled" 66 MISMATCH_TODO="$MISMATCH_TODO $pkginstalled"
67 else 67 else
68 msg_n "$PKGNAME missing" 68 msg_n "$PKGNAME missing"
69 MISSING_TODO="$MISSING_TODO $PKGNAME $pkgdir" 69 MISSING_TODO="$MISSING_TODO $PKGNAME $pkgdir"
70 fi 70 fi
71 if is_binary_available $PKGNAME ;then 71 if is_binary_available $PKGNAME ;then
72 msg_n " (binary package available)" 72 msg_n " (binary package available)"
73 fi 73 fi
74 msg 74 msg
75 else 75 else
76 if [ -n "$opt_B" ];then 76 if [ -n "$opt_B" ];then
77 # sort here temporarily to handle older +BUILD_VERSION 77 # sort here temporarily to handle older +BUILD_VERSION
78 current_build_ver=$(get_build_ver | ${SED} 's|.*\$Net''BSD\: ||' | ${SORT} -u) 78 current_build_ver=$(get_build_ver | ${SED} 's|.*\$Net''BSD\: ||' | ${SORT} -u)
79 installed_build_ver=$(${SED} 's|.*\$Net''BSD\: ||' $PKG_DBDIR/$PKGNAME/+BUILD_VERSION | ${SORT} -u) 79 installed_build_ver=$(${SED} 's|.*\$Net''BSD\: ||' $PKG_DBDIR/$PKGNAME/+BUILD_VERSION | ${SORT} -u)
80 if [ x"$current_build_ver" != x"$installed_build_ver" ];then 80 if [ x"$current_build_ver" != x"$installed_build_ver" ];then
81 msg "$pkgdir - $PKGNAME build_version mismatch" 81 msg "$pkgdir - $PKGNAME build_version mismatch"
82 verbose "--current--" 82 verbose "--current--"
83 verbose "$current_build_ver" 83 verbose "$current_build_ver"
84 verbose "--installed--" 84 verbose "--installed--"
85 verbose "$installed_build_ver" 85 verbose "$installed_build_ver"
86 verbose "----" 86 verbose "----"
87 MISMATCH_TODO="$MISMATCH_TODO $PKGNAME" 87 MISMATCH_TODO="$MISMATCH_TODO $PKGNAME"
88 else 88 else
89 verbose "$PKGNAME: OK" 89 verbose "$PKGNAME: OK"
90 fi 90 fi
91 else 91 else
92 verbose "$PKGNAME: OK" 92 verbose "$PKGNAME: OK"
93 fi 93 fi
94 fi 94 fi
95 done 95 done
96 } 96 }
97 97
98cleanup_and_exit() 98cleanup_and_exit()
99 { 99 {
100 rm -f $MY_TMPFILE 100 rm -f $MY_TMPFILE
101 rmdir $MY_TMPDIR 101 rmdir $MY_TMPDIR
102 exit "$@" 102 exit "$@"
103 } 103 }
104 104
105delete_pkgs() 105delete_pkgs()
106 { 106 {
107 for pkg in $* ; do 107 for pkg in $* ; do
108 if [ -d $PKG_DBDIR/$pkg ] ; then 108 if [ -d $PKG_DBDIR/$pkg ] ; then
109 run_cmd_su "${PKG_DELETE} -r $pkg" 1 109 run_cmd_su "${PKG_DELETE} -r $pkg" 1
110 fi 110 fi
111 done 111 done
112 } 112 }
113 113
114extract_make_vars() 114extract_make_vars()
115 { 115 {
116 MAKEFILE=$1 116 MAKEFILE=$1
117 shift 117 shift
118 MAKEDATA=".PHONY: x\nx:\n"; 118 MAKEDATA=".PHONY: x\nx:\n";
119 for var in $* ; do 119 for var in $* ; do
120 MAKEDATA=$MAKEDATA"\t@echo $var=\${$var}\n" 120 MAKEDATA=$MAKEDATA"\t@echo $var=\${$var}\n"
121 done 121 done
122 eval $(printf "$MAKEDATA" | ${MAKE} -f - -f $MAKEFILE x | \ 122 eval $(printf "$MAKEDATA" | ${MAKE} -f - -f $MAKEFILE x | \
123 ${SED} -e 's/[^=]*=/&"/' -e 's/$/"/') 123 ${SED} -e 's/[^=]*=/&"/' -e 's/$/"/')
124 for var in $* ; do 124 for var in $* ; do
125 verbose_var $var 125 verbose_var $var
126 done 126 done
127 } 127 }
128 128
129# $1 = name of variable 129# $1 = name of variable
130# $2 = default value 130# $2 = default value
131extract_mk_var() 131extract_mk_var()
132 { 132 {
133 if [ -z "`eval echo \\$$1`" ] ; then 133 if [ -z "`eval echo \\$$1`" ] ; then
134 eval $(printf "BSD_PKG_MK=1\n.PHONY: x\nx:\n\t@echo $1="'$'"{$1}\n" | ${MAKE} -f - -f $MAKECONF x) 134 eval $(printf "BSD_PKG_MK=1\n.PHONY: x\nx:\n\t@echo $1="'$'"{$1}\n" | ${MAKE} -f - -f $MAKECONF x)
135 if [ -z "`eval echo \\$$1`" ]; then 135 if [ -z "`eval echo \\$$1`" ]; then
136 eval "$1=$2" 136 eval "$1=$2"
137 verbose_var $1 '(using default)' 137 verbose_var $1 '(using default)'
138 else 138 else
139 verbose_var $1 139 verbose_var $1
140 fi 140 fi
141 fi 141 fi
142 } 142 }
143 143
144extract_pkg_vars() 144extract_pkg_vars()
145 { 145 {
146 PKGDIR=$1 146 PKGDIR=$1
147 PKGNAME= 147 PKGNAME=
148 shift; 148 shift;
149 if [ ! -f $PKGSRCDIR/$pkgdir/Makefile ];then 149 if [ ! -f $PKGSRCDIR/$pkgdir/Makefile ];then
150 msg "WARNING: No $pkgdir/Makefile - package moved or obsolete?" 150 msg "WARNING: No $pkgdir/Makefile - package moved or obsolete?"
151 return 151 return
152 fi 152 fi
153 cd $PKGSRCDIR/$PKGDIR 153 cd $PKGSRCDIR/$PKGDIR
154 extract_make_vars Makefile "$@" 154 extract_make_vars Makefile "$@"
155 if [ -z "$PKGNAME" ]; then 155 if [ -z "$PKGNAME" ]; then
156 fatal "Unable to extract PKGNAME for $pkgdir" 156 fatal "Unable to extract PKGNAME for $pkgdir"
157 fi 157 fi
158 } 158 }
159 159
160extract_variables() 160extract_variables()
161 { 161 {
162 extract_mk_var PKGSRCDIR '' 162 extract_mk_var PKGSRCDIR ''
163 extract_mk_var LOCALBASE '' 163 extract_mk_var LOCALBASE ''
164 if [ -z "$PKGSRCDIR" ] ; then 164 if [ -z "$PKGSRCDIR" ] ; then
165 for dir in $LOCALBASE/pkgsrc /usr/pkgsrc . .. ../.. ; do 165 for dir in $LOCALBASE/pkgsrc /usr/pkgsrc . .. ../.. ; do
166 if [ -f "${dir}/mk/bsd.pkg.mk" ]; then 166 if [ -f "${dir}/mk/bsd.pkg.mk" ]; then
167 case "${dir}" in 167 case "${dir}" in
168 /*) PKGSRCDIR="${dir}" ;; 168 /*) PKGSRCDIR="${dir}" ;;
169 *) PKGSRCDIR="$( cd "${dir}" >/dev/null 2>&1 && pwd )" ;; 169 *) PKGSRCDIR="$( cd "${dir}" >/dev/null 2>&1 && pwd )" ;;
170 esac 170 esac
171 break 171 break
172 fi 172 fi
173 done 173 done
174 fi 174 fi
175 175
176 if [ -z "$opt_g" ]; then 176 if [ -z "$opt_g" ]; then
177 # Now we have PKGSRCDIR, use it to determine PACKAGES, and PKGCHK_CONF 177 # Now we have PKGSRCDIR, use it to determine PACKAGES, and PKGCHK_CONF
178 # as well as AWK, GREP, SED, PKGCHK_TAGS and PKGCHK_NOTAGS 178 # as well as AWK, GREP, SED, PKGCHK_TAGS and PKGCHK_NOTAGS
179 # 179 #
180 if [ ! -d "$PKGSRCDIR" -a \( -z "$opt_b" -o -n "$opt_s" \) ] ; then 180 if [ ! -d "$PKGSRCDIR" -a \( -z "$opt_b" -o -n "$opt_s" \) ] ; then
181 fatal "Unable to locate PKGSRCDIR (${PKGSRCDIR:-not set})" 181 fatal "Unable to locate PKGSRCDIR (${PKGSRCDIR:-not set})"
182 fi 182 fi
183 if [ -z "$opt_b" -o -n "$opt_s" -o -d $PKGSRCDIR/pkgtools/pkg_chk ] ; 183 if [ -z "$opt_b" -o -n "$opt_s" -o -d $PKGSRCDIR/pkgtools/pkg_chk ] ;
184 then 184 then
185 cd $PKGSRCDIR/pkgtools/pkg_chk 185 cd $PKGSRCDIR/pkgtools/pkg_chk
186 extract_make_vars Makefile \ 186 extract_make_vars Makefile \
187 AWK GREP GZCAT GZIP_CMD ID PACKAGES PKGCHK_CONF PKGCHK_NOTAGS \ 187 AWK GREP GZCAT GZIP_CMD ID PACKAGES PKGCHK_CONF PKGCHK_NOTAGS \
188 PKGCHK_TAGS PKGCHK_UPDATE_CONF PKG_ADD PKG_DBDIR \ 188 PKGCHK_TAGS PKGCHK_UPDATE_CONF PKG_ADD PKG_DBDIR \
189 PKG_DELETE PKG_ADMIN PKG_INFO PKG_SUFX SED SORT SU_CMD TSORT 189 PKG_DELETE PKG_ADMIN PKG_INFO PKG_SUFX SED SORT SU_CMD TSORT
190 if [ -z "$PACKAGES" ];then 190 if [ -z "$PACKAGES" ];then
191 PACKAGES=$PKGSRCDIR/packages 191 PACKAGES=$PKGSRCDIR/packages
192 fi 192 fi
193 elif [ $MAKECONF != /dev/null ] ; then 193 elif [ $MAKECONF != /dev/null ] ; then
194 extract_make_vars $MAKECONF PACKAGES PKGCHK_CONF \ 194 extract_make_vars $MAKECONF PACKAGES PKGCHK_CONF \
195 PKGCHK_UPDATE_CONF PKGCHK_TAGS PKGCHK_NOTAGS PKG_SUFX 195 PKGCHK_UPDATE_CONF PKGCHK_TAGS PKGCHK_NOTAGS PKG_SUFX
196 if [ -z "$PACKAGES" ] ; then 196 if [ -z "$PACKAGES" ] ; then
197 PACKAGES=`pwd` 197 PACKAGES=`pwd`
198 fi 198 fi
199 fi 199 fi
200 fi 200 fi
201 201
202 # .tgz/.tbz to regexp 202 # .tgz/.tbz to regexp
203 PKG_SUFX_RE=`echo $PKG_SUFX | ${SED} 's/[.]/[.]/'` 203 PKG_SUFX_RE=`echo $PKG_SUFX | ${SED} 's/[.]/[.]/'`
204 204
205 if [ ! -d $PKG_DBDIR ] ; then 205 if [ ! -d $PKG_DBDIR ] ; then
206 fatal "Unable to access PKG_DBDIR ($PKG_DBDIR)" 206 fatal "Unable to access PKG_DBDIR ($PKG_DBDIR)"
207 fi 207 fi
208 208
209 if [ -z "$PKGCHK_CONF" ];then 209 if [ -z "$PKGCHK_CONF" ];then
210 PKGCHK_CONF=$PKGSRCDIR/pkgchk.conf 210 PKGCHK_CONF=$PKGSRCDIR/pkgchk.conf
211 fi 211 fi
212 if [ -z "$PKGCHK_UPDATE_CONF" ];then 212 if [ -z "$PKGCHK_UPDATE_CONF" ];then
213 PKGCHK_UPDATE_CONF=$PKGSRCDIR/pkgchk_update-$(hostname).conf 213 PKGCHK_UPDATE_CONF=$PKGSRCDIR/pkgchk_update-$(hostname).conf
214 fi 214 fi
215 } 215 }
216 216
217fatal() 217fatal()
218 { 218 {
219 msg "*** $@" >&2 219 msg "*** $@" >&2
220 cleanup_and_exit 1 220 cleanup_and_exit 1
221 } 221 }
222 222
223fatal_later() 223fatal_later()
224 { 224 {
225 msg "*** $@" >&2 225 msg "*** $@" >&2
226 fatal_later=1 226 fatal_later=1
227 } 227 }
228 228
229fatal_later_check() 229fatal_later_check()
230 { 230 {
231 if [ "$fatal_later" = 1 ] ; then 231 if [ "$fatal_later" = 1 ] ; then
232 cleanup_and_exit 1 232 cleanup_and_exit 1
233 fi 233 fi
234 } 234 }
235 235
236fatal_maybe() 236fatal_maybe()
237 { 237 {
238 if [ -z "$opt_k" ];then 238 if [ -z "$opt_k" ];then
239 fatal "$@" 239 fatal "$@"
240 else 240 else
241 msg "$@" 241 msg "$@"
242 fi 242 fi
243 } 243 }
244 244
245generate_conf_from_installed() 245generate_conf_from_installed()
246 { 246 {
247 FILE=$1 247 FILE=$1
248 if [ -r $FILE ]; then 248 if [ -r $FILE ]; then
249 mv $FILE ${FILE}.old 249 mv $FILE ${FILE}.old
250 fi 250 fi
251 echo "# Generated automatically at $(date)" > $FILE 251 echo "# Generated automatically at $(date)" > $FILE
252 echo $(pkgdirs_from_installed) | tr ' ' '\n' >> $FILE 252 echo $(pkgdirs_from_installed) | tr ' ' '\n' >> $FILE
253 } 253 }
254 254
255get_bin_pkg_info() 255get_bin_pkg_info()
256 { 256 {
257 summary_file=$PACKAGES/$SUMMARY_FILE 257 summary_file=$PACKAGES/$SUMMARY_FILE
258 if [ -f $summary_file ] ; then 258 if [ -f $summary_file ] ; then
259 if [ -z "$(find $PACKAGES -type f -newer $summary_file -name '*.t[bg]z')" ] ; then 259 if [ -z "$(find $PACKAGES -type f -newer $summary_file -name '*.t[bg]z')" ] ; then
260 msg_progress Reading $summary_file 260 msg_progress Reading $summary_file
261 ${GZCAT} $summary_file 261 ${GZCAT} $summary_file
262 return; 262 return;
263 fi 263 fi
264 echo "*** Ignoring $SUMMARY_FILE as PACKAGES contains newer files" >&2 264 echo "*** Ignoring $SUMMARY_FILE as PACKAGES contains newer files" >&2
265 fi 265 fi
266 msg_progress Scan $PACKAGES 266 msg_progress Scan $PACKAGES
267 list_bin_pkgs | ${XARGS} ${PKG_INFO} -X 267 list_bin_pkgs | ${XARGS} ${PKG_INFO} -X
268 } 268 }
269 269
270get_build_ver() 270get_build_ver()
271 { 271 {
272 if [ -n "$opt_b" -a -z "$opt_s" ] ; then 272 if [ -n "$opt_b" -a -z "$opt_s" ] ; then
273 ${PKG_INFO} -q -b $PACKAGES/$PKGNAME$PKG_SUFX | ${GREP} . 273 ${PKG_INFO} -q -b $PACKAGES/$PKGNAME$PKG_SUFX | ${GREP} .
274 return 274 return
275 fi 275 fi
276 # Unfortunately pkgsrc always outputs to a file, but it does 276 # Unfortunately pkgsrc always outputs to a file, but it does
277 # helpfully allows us to specify the name 277 # helpfully allows us to specify the name
278 rm -f $MY_TMPFILE 278 rm -f $MY_TMPFILE
279 ${MAKE} _BUILD_VERSION_FILE=$MY_TMPFILE $MY_TMPFILE 279 ${MAKE} _BUILD_VERSION_FILE=$MY_TMPFILE $MY_TMPFILE
280 cat $MY_TMPFILE 280 cat $MY_TMPFILE
281 } 281 }
282 282
283list_bin_pkgs () 283list_bin_pkgs ()
284 { 284 {
285 ls -t $PACKAGES | grep "$PKG_SUFX_RE"'$' | ${SED} "s|^|$PACKAGES/|" 285 ls -t $PACKAGES | grep "$PKG_SUFX_RE"'$' | ${SED} "s|^|$PACKAGES/|"
286 } 286 }
287 287
288# Given a binary package filename as the first argumennt, return a list 288# Given a binary package filename as the first argumennt, return a list
289# of exact package versions against which it was built and on which it 289# of exact package versions against which it was built and on which it
290# depends 290# depends
291# 291#
292list_dependencies() 292list_dependencies()
293 { 293 {
294 ${PKG_INFO} -q -n $1 | ${GREP} .. || true 294 ${PKG_INFO} -q -n $1 | ${GREP} .. || true
295 } 295 }
296 296
297# Pass a list of pkgdirs, outputs a tsorted list including any dependencies 297# Pass a list of pkgdirs, outputs a tsorted list including any dependencies
298# 298#
299list_packages() 299list_packages()
300 { 300 {
301 # Convert passed in list of pkgdirs to a list of binary package files 301 # Convert passed in list of pkgdirs to a list of binary package files
302 pkglist='' 302 pkglist=''
303 for pkgdir in $* ; do 303 for pkgdir in $* ; do
304 pkgname=`pkgdir2pkgname $pkgdir` 304 pkgname=`pkgdir2pkgname $pkgdir`
305 if [ -z "$pkgname" ]; then 305 if [ -z "$pkgname" ]; then
306 fatal_later "$pkgdir - Unable to extract pkgname" 306 fatal_later "$pkgdir - Unable to extract pkgname"
307 continue 307 continue
308 fi 308 fi
309 if is_binary_available $pkgname ; then 309 if is_binary_available $pkgname ; then
310 pkglist="$pkglist $pkgname$PKG_SUFX" 310 pkglist="$pkglist $pkgname$PKG_SUFX"
311 else 311 else
312 fatal_later "$pkgname - no binary package found" 312 fatal_later "$pkgname - no binary package found"
313 fi 313 fi
314 done 314 done
315 315
316 # Variables used in this loop: 316 # Variables used in this loop:
317 # pkglist: Current list of binary package files to check for dependencies 317 # pkglist: Current list of binary package files to check for dependencies
318 # next_pkglist: List of binary package files to check after pkglist 318 # next_pkglist: List of binary package files to check after pkglist
319 # pairlist: completed list of package + dependency for use in tsort 319 # pairlist: completed list of package + dependency for use in tsort
320 while [ -n "$pkglist" ] ; do 320 while [ -n "$pkglist" ] ; do
321 verbose "pkglist: $pkglist" 321 verbose "pkglist: $pkglist"
322 for pkg in $pkglist ; do 322 for pkg in $pkglist ; do
323 set -o noglob 323 set -o noglob
324 deplist="$(list_dependencies $PACKAGES/$pkg)" 324 deplist="$(list_dependencies $PACKAGES/$pkg)"
325 verbose "$pkg: dependencies - `echo $deplist`" 325 verbose "$pkg: dependencies - `echo $deplist`"
326 if [ -n "$deplist" ] ; then 326 if [ -n "$deplist" ] ; then
327 for depmatch in $deplist ; do 327 for depmatch in $deplist ; do
328 dep=`${PKG_ADMIN} -b -d $PACKAGES lsbest "$depmatch"` 328 dep=`${PKG_ADMIN} -b -d $PACKAGES lsbest "$depmatch"`
329 if [ -z "$dep" ] ; then 329 if [ -z "$dep" ] ; then
330 fatal_later "$depmatch: dependency missing for $pkg" 330 fatal_later "$depmatch: dependency missing for $pkg"
331 else 331 else
332 pairlist="$pairlist$dep $pkg\n" 332 pairlist="$pairlist$dep $pkg\n"
333 case $dep_cache in 333 case $dep_cache in
334 *" $dep "*) 334 *" $dep "*)
335 # depmatch_cache is a quick cache of already 335 # depmatch_cache is a quick cache of already
336 verbose "$pkg: $deplist - cached" 336 verbose "$pkg: $deplist - cached"
337 ;; 337 ;;
338 *) 338 *)
339 next_pkglist="$next_pkglist $dep" 339 next_pkglist="$next_pkglist $dep"
340 dep_cache="$dep_cache $dep " 340 dep_cache="$dep_cache $dep "
341 ;; 341 ;;
342 esac 342 esac
343 fi 343 fi
344 done 344 done
345 else 345 else
346 pairlist="$pairlist$pkg $pkg\n" 346 pairlist="$pairlist$pkg $pkg\n"
347 fi 347 fi
348 set +o noglob 348 set +o noglob
349 done 349 done
350 pkglist="$next_pkglist" 350 pkglist="$next_pkglist"
351 next_pkglist= 351 next_pkglist=
352 done 352 done
353 if [ -z "$opt_k" ] ; then 353 if [ -z "$opt_k" ] ; then
354 fatal_later_check 354 fatal_later_check
355 fi 355 fi
356 printf "$pairlist" | ${TSORT} 356 printf "$pairlist" | ${TSORT}
357 } 357 }
358 358
359pkgdir2pkgname() 359pkgdir2pkgname()
360 { 360 {
361 pkgdir=$1 361 pkgdir=$1
362 for pkgline in $PKGDB ; do 362 for pkgline in $PKGDB ; do
363 case $pkgline in 363 case $pkgline in
364 "$pkgdir:"*) 364 "$pkgdir:"*)
365 echo $pkgline | ${SED} 's/[^:]*://' 365 echo $pkgline | ${SED} 's/[^:]*://'
366 return; 366 return;
367 ;; 367 ;;
368 esac 368 esac
369 done 369 done
370 } 370 }
371 371
372pkgdirs_from_conf() 372determine_tags()
373 { 373 {
374 CONF=$1; shift 
375 LIST="$*" 
376 if [ ! -r $CONF ];then 
377 fatal "Unable to read PKGCHK_CONF '$CONF'" 
378 fi 
379 
380 # Determine list of tags 374 # Determine list of tags
381 # 375 #
382 if [ "$PKGSRCDIR" = NONE ]; then 376 if [ "$PKGSRCDIR" = NONE ]; then
383 OPSYS=$(uname -s) 377 OPSYS=$(uname -s)
384 OS_VERSION=$(uname -r) 378 OS_VERSION=$(uname -r)
385 MACHINE_ARCH=$(uname -p) 379 MACHINE_ARCH=$(uname -p)
386 else 380 else
387 extract_make_vars Makefile OPSYS OS_VERSION MACHINE_ARCH 381 extract_make_vars Makefile OPSYS OS_VERSION MACHINE_ARCH
388 fi 382 fi
389 383
390 TAGS="$(hostname | ${SED} -e 's,\..*,,'),$(hostname),$OPSYS-$OS_VERSION-$MACHINE_ARCH,$OPSYS-$OS_VERSION,$OPSYS-$MACHINE_ARCH,$OPSYS,$OS_VERSION,$MACHINE_ARCH" 384 TAGS="$(hostname | ${SED} -e 's,\..*,,'),$(hostname),$OPSYS-$OS_VERSION-$MACHINE_ARCH,$OPSYS-$OS_VERSION,$OPSYS-$MACHINE_ARCH,$OPSYS,$OS_VERSION,$MACHINE_ARCH"
391 if [ -f /usr/X11R6/lib/libX11.so -o -f /usr/X11R6/lib/libX11.a ];then 385 if [ -f /usr/X11R7/lib/libX11.a -o -f /usr/X11R6/lib/libX11.a ];then
392 TAGS="$TAGS,x11" 386 TAGS="$TAGS,x11"
393 fi 387 fi
394 if [ -n "$PKGCHK_TAGS" ];then 388 if [ -n "$PKGCHK_TAGS" ];then
395 TAGS="$TAGS,$PKGCHK_TAGS" 389 TAGS="$TAGS,$PKGCHK_TAGS"
396 fi 390 fi
397 if [ -n "$PKGCHK_NOTAGS" ];then 391 if [ -n "$PKGCHK_NOTAGS" ];then
398 if [ -n "$opt_U" ];then 392 if [ -n "$opt_U" ];then
399 opt_U="$opt_U,$PKGCHK_NOTAGS" 393 opt_U="$opt_U,$PKGCHK_NOTAGS"
400 else 394 else
401 opt_U="$PKGCHK_NOTAGS" 395 opt_U="$PKGCHK_NOTAGS"
402 fi 396 fi
403 fi 397 fi
404 398
405 # If '-U' contains a '*' then we need to unset TAGS and PKGCHK_TAGS, but 399 # If '-U' contains a '*' then we need to unset TAGS and PKGCHK_TAGS, but
406 # still pick up -D, and even package specific -U options 400 # still pick up -D, and even package specific -U options
407 verbose "unset TAGS=$opt_U" 401 verbose "unset TAGS=$opt_U"
408 case ",$opt_U," in 402 case ",$opt_U," in
409 *,\*,*) 403 *,\*,*)
410 TAGS='' 404 TAGS=''
411 ;; 405 ;;
412 esac 406 esac
413 if [ -n "$TAGS" ];then 407 if [ -n "$TAGS" ];then
414 if [ -n "$opt_D" ];then 408 if [ -n "$opt_D" ];then
415 opt_D="$opt_D,$TAGS" 409 opt_D="$opt_D,$TAGS"
416 else 410 else
417 opt_D="$TAGS" 411 opt_D="$TAGS"
418 fi 412 fi
419 fi 413 fi
420 verbose "set TAGS=$opt_D" 414 verbose "set TAGS=$opt_D"
 415 }
 416
 417pkgdirs_from_conf()
 418 {
 419 CONF=$1; shift
 420 LIST="$*"
 421 if [ ! -r $CONF ];then
 422 fatal "Unable to read PKGCHK_CONF '$CONF'"
 423 fi
 424
421 425
422 # Extract list of valid pkgdirs (skip any 'alreadyset' in $LIST) 426 # Extract list of valid pkgdirs (skip any 'alreadyset' in $LIST)
423 # 427 #
424 LIST="$LIST "$(${AWK} -v alreadyset="$LIST" -v setlist="$opt_D" -v unsetlist="$opt_U" ' 428 LIST="$LIST "$(${AWK} -v alreadyset="$LIST" -v setlist="$opt_D" -v unsetlist="$opt_U" '
425 BEGIN { 429 BEGIN {
426 split(alreadyset, tmp, " "); 430 split(alreadyset, tmp, " ");
427 for (tag in tmp) { skip[tmp[tag]] = 1; } 431 for (tag in tmp) { skip[tmp[tag]] = 1; }
428 432
429 split(setlist, tmp, ","); 433 split(setlist, tmp, ",");
430 for (tag in tmp) { taglist[tmp[tag]] = 1; } 434 for (tag in tmp) { taglist[tmp[tag]] = 1; }
431 435
432 split(unsetlist, tmp, ","); 436 split(unsetlist, tmp, ",");
433 for (tag in tmp) { skip[tmp[tag]] = 1; nofile[tmp[tag]] = 1 ; 437 for (tag in tmp) { skip[tmp[tag]] = 1; nofile[tmp[tag]] = 1 ;
434 delete taglist[tmp[tag]] } 438 delete taglist[tmp[tag]] }
435 439
436 taglist["*"] = "*" 440 taglist["*"] = "*"
437 } 441 }
438 function and_expr_with_dict(expr, dict, ary, i, r, d) { 442 function and_expr_with_dict(expr, dict, ary, i, r, d) {
439 split(expr,ary,/\+/); 443 split(expr,ary,/\+/);
440 r = 1; 444 r = 1;
441 for (i in ary) { 445 for (i in ary) {
442 if (ary[i] ~ /^\// && ! nofile[ary[i]]) { 446 if (ary[i] ~ /^\// && ! nofile[ary[i]]) {
443 if (getline d < ary[i] == -1) 447 if (getline d < ary[i] == -1)
444 { r = 0; break ;} 448 { r = 0; break ;}
445 } 449 }
446 else if (! (ary[i] in dict)) 450 else if (! (ary[i] in dict))
447 { r = 0; break ;} 451 { r = 0; break ;}
448 } 452 }
449 return r; 453 return r;
450 } 454 }
451 { 455 {
452 sub("#.*", ""); 456 sub("#.*", "");
453 if (skip[$1]) 457 if (skip[$1])
454 next; 458 next;
455 need = 0; 459 need = 0;
456 if ($0 ~ /\=/) { 460 if ($0 ~ /\=/) {
457 split($0, tmp, "[ \t]*="); 461 split($0, tmp, "[ \t]*=");
458 taggroup = tmp[1]; 462 taggroup = tmp[1];
459 sub("[ \t]*=", "="); 463 sub("[ \t]*=", "=");
460 } 464 }
461 else 465 else
462 { 466 {
463 taggroup = "" 467 taggroup = ""
464 if (NF == 1) # If only one arg, we want pkg 468 if (NF == 1) # If only one arg, we want pkg
465 need = 1; 469 need = 1;
466 } 470 }
467 for (f = 2 ; f<=NF ; ++f) { # For each word on the line 471 for (f = 2 ; f<=NF ; ++f) { # For each word on the line
468 if (sub("^-", "", $f)) { # If it begins with a '-' 472 if (sub("^-", "", $f)) { # If it begins with a '-'
469 if (f == 2) # If first entry '-', assume '*' 473 if (f == 2) # If first entry '-', assume '*'
470 { need = 1; } 474 { need = 1; }
471 if (and_expr_with_dict($f, taglist)) 475 if (and_expr_with_dict($f, taglist))
472 next; # If it is true, discard 476 next; # If it is true, discard
473 } else { 477 } else {
474 if (and_expr_with_dict($f, taglist)) 478 if (and_expr_with_dict($f, taglist))
475 need = 1; # If it is true, note needed 479 need = 1; # If it is true, note needed
476 } 480 }
477 } 481 }
478 if (need) 482 if (need)
479 if (taggroup) 483 if (taggroup)
480 taglist[taggroup] = 1 484 taglist[taggroup] = 1
481 else 485 else
482 print $1; 486 print $1;
483 } 487 }
484 ' < $CONF 488 ' < $CONF
485 ) 489 )
486 echo $LIST 490 echo $LIST
487 } 491 }
488 492
489pkgdirs_from_installed() 493pkgdirs_from_installed()
490 { 494 {
491 ${PKG_INFO} -Bqa | ${AWK} -F= '/^PKGPATH=/{print $2}' | ${SORT} 495 ${PKG_INFO} -Bqa | ${AWK} -F= '/^PKGPATH=/{print $2}' | ${SORT}
492 } 496 }
493 497
494msg() 498msg()
495 { 499 {
496 if [ -n "$opt_L" ] ; then 500 if [ -n "$opt_L" ] ; then
497 echo "$@" >> "$opt_L" 501 echo "$@" >> "$opt_L"
498 fi 502 fi
499 if [ -n "$opt_l" ] ; then 503 if [ -n "$opt_l" ] ; then
500 echo "$@" >&2 504 echo "$@" >&2
501 else 505 else
502 echo "$@" 506 echo "$@"
503 fi 507 fi
504 } 508 }
505 509
506msg_progress() 510msg_progress()
507 { 511 {
508 if [ -z "$opt_q" ] ; then 512 if [ -z "$opt_q" ] ; then
509 msg "[ $@ ]" 513 msg "[ $@ ]"
510 fi 514 fi
511 } 515 }
512 516
513msg_n() 517msg_n()
514 { 518 {
515 msg $ac_n "$*"$ac_c 519 msg $ac_n "$*"$ac_c
516 } 520 }
517 521
518pkg_fetch() 522pkg_fetch()
519 { 523 {
520 PKGNAME=$1 524 PKGNAME=$1
521 PKGDIR=$2 525 PKGDIR=$2
522 526
523 run_cmd "cd $PKGSRCDIR/$PKGDIR && ${MAKE} fetch-list | sh" 527 run_cmd "cd $PKGSRCDIR/$PKGDIR && ${MAKE} fetch-list | sh"
524 if [ -n "$FAIL" ]; then 528 if [ -n "$FAIL" ]; then
525 FAIL_DONE=$FAIL_DONE" "$PKGNAME 529 FAIL_DONE=$FAIL_DONE" "$PKGNAME
526 else 530 else
527 FETCH_DONE=$FETCH_DONE" "$PKGNAME 531 FETCH_DONE=$FETCH_DONE" "$PKGNAME
528 fi 532 fi
529 } 533 }
530 534
531pkg_fetchlist() 535pkg_fetchlist()
532 { 536 {
533 PKGLIST=$@ 537 PKGLIST=$@
534 msg_progress Fetch 538 msg_progress Fetch
535 while [ $# != 0 ]; do 539 while [ $# != 0 ]; do
536 pkg_fetch $1 $2 540 pkg_fetch $1 $2
537 shift ; shift; 541 shift ; shift;
538 done 542 done
539 } 543 }
540 544
541pkg_install() 545pkg_install()
542 { 546 {
543 PKGNAME=$1 547 PKGNAME=$1
544 PKGDIR=$2 548 PKGDIR=$2
545 INSTALL=$3 549 INSTALL=$3
546 550
547 FAIL= 551 FAIL=
548 if [ -d $PKG_DBDIR/$PKGNAME ];then 552 if [ -d $PKG_DBDIR/$PKGNAME ];then
549 msg "$PKGNAME installed in previous stage" 553 msg "$PKGNAME installed in previous stage"
550 run_cmd_su "${PKG_ADMIN} unset automatic $PKGNAME" 554 run_cmd_su "${PKG_ADMIN} unset automatic $PKGNAME"
551 elif [ -n "$opt_b" ] && is_binary_available $PKGNAME; then 555 elif [ -n "$opt_b" ] && is_binary_available $PKGNAME; then
552 if [ -n "$saved_PKG_PATH" ] ; then 556 if [ -n "$saved_PKG_PATH" ] ; then
553 export PKG_PATH=$saved_PKG_PATH 557 export PKG_PATH=$saved_PKG_PATH
554 fi 558 fi
555 run_cmd_su "${PKG_ADD} $PACKAGES/$PKGNAME$PKG_SUFX" 559 run_cmd_su "${PKG_ADD} $PACKAGES/$PKGNAME$PKG_SUFX"
556 if [ -n "$saved_PKG_PATH" ] ; then 560 if [ -n "$saved_PKG_PATH" ] ; then
557 unset PKG_PATH 561 unset PKG_PATH
558 fi 562 fi
559 elif [ -n "$opt_s" ]; then 563 elif [ -n "$opt_s" ]; then
560 run_cmd "cd $PKGSRCDIR/$PKGDIR && ${MAKE} update CLEANDEPENDS=yes" 564 run_cmd "cd $PKGSRCDIR/$PKGDIR && ${MAKE} update CLEANDEPENDS=yes"
561 fi 565 fi
562 566
563 if [ -z "$opt_n" -a -z "$opt_q" -a ! -d $PKG_DBDIR/$PKGNAME ];then 567 if [ -z "$opt_n" -a -z "$opt_q" -a ! -d $PKG_DBDIR/$PKGNAME ];then
564 FAIL=1 568 FAIL=1
565 fi 569 fi
566 570
567 if [ -n "$FAIL" ]; then 571 if [ -n "$FAIL" ]; then
568 FAIL_DONE=$FAIL_DONE" "$PKGNAME 572 FAIL_DONE=$FAIL_DONE" "$PKGNAME
569 else 573 else
570 INSTALL_DONE=$INSTALL_DONE" "$PKGNAME 574 INSTALL_DONE=$INSTALL_DONE" "$PKGNAME
571 fi 575 fi
572 } 576 }
573 577
574pkg_installlist() 578pkg_installlist()
575 { 579 {
576 INSTALL=$1 ; shift 580 INSTALL=$1 ; shift
577 msg_progress $INSTALL 581 msg_progress $INSTALL
578 while [ $# != 0 ]; do 582 while [ $# != 0 ]; do
579 pkg_install $1 $2 $INSTALL 583 pkg_install $1 $2 $INSTALL
580 shift ; shift; 584 shift ; shift;
581 done 585 done
582 } 586 }
583 587
584run_cmd() 588run_cmd()
585 { 589 {
586 FAIL= 590 FAIL=
587 if [ -n "$2" ]; then 591 if [ -n "$2" ]; then
588 FAILOK=$2 592 FAILOK=$2
589 else 593 else
590 FAILOK=$opt_k 594 FAILOK=$opt_k
591 fi 595 fi
592 if [ -z "$opt_q" ];then 596 if [ -z "$opt_q" ];then
593 msg $(date +%R) $1 597 msg $(date +%R) $1
594 fi 598 fi
595 if [ -z "$opt_n" -a -z "$opt_q" ];then 599 if [ -z "$opt_n" -a -z "$opt_q" ];then
596 if [ -n "$opt_L" ] ; then 600 if [ -n "$opt_L" ] ; then
597 sh -c "$1" >> "$opt_L" 2>&1 || FAIL=1 601 sh -c "$1" >> "$opt_L" 2>&1 || FAIL=1
598 else 602 else
599 sh -c "$1" || FAIL=1 603 sh -c "$1" || FAIL=1
600 fi 604 fi
601 if [ -n "$FAIL" ] ; then 605 if [ -n "$FAIL" ] ; then
602 msg "** '$1' failed" 606 msg "** '$1' failed"
603 if [ -n "$opt_L" ] ; then 607 if [ -n "$opt_L" ] ; then
604 tail -100 "$opt_L" | egrep -v '^(\*\*\* Error code 1|Stop\.)' |\ 608 tail -100 "$opt_L" | egrep -v '^(\*\*\* Error code 1|Stop\.)' |\
605 tail -40 609 tail -40
606 fi 610 fi
607 if [ "$FAILOK" != 1 ]; then 611 if [ "$FAILOK" != 1 ]; then
608 fatal "** '$1' failed" 612 fatal "** '$1' failed"
609 fi 613 fi
610 fi 614 fi
611 fi 615 fi
612 } 616 }
613 617
614run_cmd_su() 618run_cmd_su()
615 { 619 {
616 if [ -n "$SU_CMD" ]; then 620 if [ -n "$SU_CMD" ]; then
617 run_cmd "${SU_CMD} '$1'" "$2" 621 run_cmd "${SU_CMD} '$1'" "$2"
618 else 622 else
619 run_cmd "$1" "$2" 623 run_cmd "$1" "$2"
620 fi 624 fi
621 } 625 }
622 626
623set_path() 627set_path()
624 { 628 {
625 arg=$1 629 arg=$1
626 case $arg in 630 case $arg in
627 http://*|ftp://*|/*) 631 http://*|ftp://*|/*)
628 echo $arg ;; 632 echo $arg ;;
629 *) echo $basedir/$arg ;; 633 *) echo $basedir/$arg ;;
630 esac 634 esac
631 } 635 }
632 636
633usage() 637usage()
634 { 638 {
635 if [ -n "$1" ] ; then 639 if [ -n "$1" ] ; then
636 echo "$@" 640 echo "$@"
637 echo 641 echo
638 fi 642 fi
639 echo 'Usage: pkg_chk [opts] 643 echo 'Usage: pkg_chk [opts]
640 -a Add all missing packages 644 -a Add all missing packages
641 -B Check the "Build version" of packages 645 -B Check the "Build version" of packages
642 -b Use binary packages 646 -b Use binary packages
643 -C conf Use pkgchk.conf file 'conf' 647 -C conf Use pkgchk.conf file 'conf'
644 -D tags Comma separated list of additional pkgchk.conf tags to set 648 -D tags Comma separated list of additional pkgchk.conf tags to set
645 -f Perform a 'make fetch' for all required packages 649 -f Perform a 'make fetch' for all required packages
646 -g Generate an initial pkgchk.conf file 650 -g Generate an initial pkgchk.conf file
647 -h This help 651 -h This help
648 -k Continue with further packages if errors are encountered 652 -k Continue with further packages if errors are encountered
649 -L file Redirect output from commands run into file (should be fullpath) 653 -L file Redirect output from commands run into file (should be fullpath)
650 -l List binary packages including dependencies 654 -l List binary packages including dependencies
651 -N List installed packages for which a newer version is in TODO 655 -N List installed packages for which a newer version is in TODO
652 -n Display actions that would be taken, but do not perform them 656 -n Display actions that would be taken, but do not perform them
653 -p Display the list of pkgdirs that match the current tags 657 -p Display the list of pkgdirs that match the current tags
654 -P dir Set PACKAGES dir (overrides any other setting) 658 -P dir Set PACKAGES dir (overrides any other setting)
655 -q Do not display actions or take any action; only list packages 659 -q Do not display actions or take any action; only list packages
656 -r Recursively remove mismatches (use with care) 660 -r Recursively remove mismatches (use with care)
657 -s Use source for building packages 661 -s Use source for building packages
658 -U tags Comma separated list of pkgchk.conf tags to unset ('*' for all) 662 -U tags Comma separated list of pkgchk.conf tags to unset ('*' for all)
659 -u Update all mismatched packages 663 -u Update all mismatched packages
660 -v Verbose 664 -v Verbose
661 665
662pkg_chk verifies installed packages against pkgsrc. 666pkg_chk verifies installed packages against pkgsrc.
663The most common usage is 'pkg_chk -u -q' to check all installed packages or 667The most common usage is 'pkg_chk -u -q' to check all installed packages or
664'pkg_chk -u' to update all out of date packages. 668'pkg_chk -u' to update all out of date packages.
665For more advanced usage, including defining a set of desired packages based 669For more advanced usage, including defining a set of desired packages based
666on hostname and type, see pkg_chk(8). 670on hostname and type, see pkg_chk(8).
667 671
668If neither -b nor -s is given, both are assumed with -b preferred. 672If neither -b nor -s is given, both are assumed with -b preferred.
669' 673'
670 exit 1 674 exit 1
671 } 675 }
672 676
673verbose() 677verbose()
674 { 678 {
675 if [ -n "$opt_v" ] ; then 679 if [ -n "$opt_v" ] ; then
676 msg "$@" >&2 680 msg "$@" >&2
677 fi 681 fi
678 } 682 }
679 683
680verbose_var() 684verbose_var()
681 { 685 {
682 if [ -n "$opt_v" ] ; then 686 if [ -n "$opt_v" ] ; then
683 var=$1 687 var=$1
684 shift 688 shift
685 verbose Variable $var = $(eval echo \$$var) $@ 689 verbose Variable $var = $(eval echo \$$var) $@
686 fi 690 fi
687 } 691 }
688 692
689args=$(getopt BC:D:L:P:U:abcfghiklNnpqrsuv "$@") 693args=$(getopt BC:D:L:P:U:abcfghiklNnpqrsuv "$@")
690if [ $? != 0 ]; then 694if [ $? != 0 ]; then
691 opt_h=1 695 opt_h=1
692fi 696fi
693set -o noglob # -U can be '*' 697set -o noglob # -U can be '*'
694set -- $args 698set -- $args
695set +o noglob 699set +o noglob
696while [ $# != 0 ]; do 700while [ $# != 0 ]; do
697 case "$1" in 701 case "$1" in
698 -a ) opt_a=1 ;; 702 -a ) opt_a=1 ;;
699 -B ) opt_B=1 ;; 703 -B ) opt_B=1 ;;
700 -b ) opt_b=1 ;; 704 -b ) opt_b=1 ;;
701 -C ) opt_C="$2" ; shift ;; 705 -C ) opt_C="$2" ; shift ;;
702 -c ) opt_a=1 ; opt_q=1 ; echo "-c is deprecated - use -a -q" ;; 706 -c ) opt_a=1 ; opt_q=1 ; echo "-c is deprecated - use -a -q" ;;
703 -D ) opt_D="$2" ; shift ;; 707 -D ) opt_D="$2" ; shift ;;
704 -f ) opt_f=1 ;; 708 -f ) opt_f=1 ;;
705 -g ) opt_g=1 ;; 709 -g ) opt_g=1 ;;
706 -h ) opt_h=1 ;; 710 -h ) opt_h=1 ;;
707 -i ) opt_u=1 ; opt_q=1 ; echo "-i is deprecated - use -u -q" ;; 711 -i ) opt_u=1 ; opt_q=1 ; echo "-i is deprecated - use -u -q" ;;
708 -k ) opt_k=1 ;; 712 -k ) opt_k=1 ;;
709 -L ) opt_L="$2" ; shift ;; 713 -L ) opt_L="$2" ; shift ;;
710 -l ) opt_l=1 ;; 714 -l ) opt_l=1 ;;
711 -N ) opt_N=1 ;; 715 -N ) opt_N=1 ;;
712 -n ) opt_n=1 ;; 716 -n ) opt_n=1 ;;
713 -p ) opt_p=1 ;; 717 -p ) opt_p=1 ;;
714 -P ) opt_P="$2" ; shift ;; 718 -P ) opt_P="$2" ; shift ;;
715 -q ) opt_q=1 ;; 719 -q ) opt_q=1 ;;
716 -r ) opt_r=1 ;; 720 -r ) opt_r=1 ;;
717 -s ) opt_s=1 ;; 721 -s ) opt_s=1 ;;
718 -U ) opt_U="$2" ; shift ;; 722 -U ) opt_U="$2" ; shift ;;
719 -u ) opt_u=1 ;; 723 -u ) opt_u=1 ;;
720 -v ) opt_v=1 ;; 724 -v ) opt_v=1 ;;
721 -- ) shift; break ;; 725 -- ) shift; break ;;
722 esac 726 esac
723 shift 727 shift
724done 728done
725 729
726if [ -z "$opt_b" -a -z "$opt_s" ];then 730if [ -z "$opt_b" -a -z "$opt_s" ];then
727 opt_b=1; opt_s=1; 731 opt_b=1; opt_s=1;
728fi 732fi
729 733
730if [ -z "$opt_a$opt_g$opt_l$opt_p$opt_r$opt_u$opt_N" ]; 734if [ -z "$opt_a$opt_g$opt_l$opt_p$opt_r$opt_u$opt_N" ];
731then 735then
732 usage "Must specify at least one of -a, -g, -l, -p, -r, -u or -N"; 736 usage "Must specify at least one of -a, -g, -l, -p, -r, -u or -N";
733fi 737fi
734 738
735if [ -n "$opt_h" ];then 739if [ -n "$opt_h" ];then
736 usage 740 usage
737fi 741fi
738 742
739if [ $# != 0 ];then 743if [ $# != 0 ];then
740 usage "Additional argument ($*) given" 744 usage "Additional argument ($*) given"
741fi 745fi
742 746
743# Hide PKG_PATH to avoid breakage in 'make' calls 747# Hide PKG_PATH to avoid breakage in 'make' calls
744saved_PKG_PATH=$PKG_PATH 748saved_PKG_PATH=$PKG_PATH
745unset PKG_PATH || true 749unset PKG_PATH || true
746 750
747test -n "$AWK" || AWK="@AWK@" 751test -n "$AWK" || AWK="@AWK@"
748test -n "$GREP" || GREP="@GREP@" 752test -n "$GREP" || GREP="@GREP@"
749test -n "$GZCAT" || GZCAT="@GZCAT@" 753test -n "$GZCAT" || GZCAT="@GZCAT@"
750test -n "$GZIP_CMD" || GZIP_CMD="@GZIP_CMD@" 754test -n "$GZIP_CMD" || GZIP_CMD="@GZIP_CMD@"
751export GZIP_CMD 755export GZIP_CMD
752test -n "$ID" || ID="@ID@" 756test -n "$ID" || ID="@ID@"
753test -n "$MAKE" || MAKE="@MAKE@" 757test -n "$MAKE" || MAKE="@MAKE@"
754test -n "$MAKECONF" || MAKECONF="@MAKECONF@" 758test -n "$MAKECONF" || MAKECONF="@MAKECONF@"
755test -n "$MKTEMP" || MKTEMP="@MKTEMP@" 759test -n "$MKTEMP" || MKTEMP="@MKTEMP@"
756test -n "$PKG_ADD" || PKG_ADD="@PKG_ADD@" 760test -n "$PKG_ADD" || PKG_ADD="@PKG_ADD@"
757test -n "$PKG_ADMIN" || PKG_ADMIN="@PKG_ADMIN@" 761test -n "$PKG_ADMIN" || PKG_ADMIN="@PKG_ADMIN@"
758test -n "$PKG_DBDIR" || PKG_DBDIR="@PKG_DBDIR@" 762test -n "$PKG_DBDIR" || PKG_DBDIR="@PKG_DBDIR@"
759test -n "$PKG_DELETE" || PKG_DELETE="@PKG_DELETE@" 763test -n "$PKG_DELETE" || PKG_DELETE="@PKG_DELETE@"
760test -n "$PKG_INFO" || PKG_INFO="@PKG_INFO@" 764test -n "$PKG_INFO" || PKG_INFO="@PKG_INFO@"
761test -n "$SED" || SED="@SED@" 765test -n "$SED" || SED="@SED@"
762test -n "$SORT" || SORT="@SORT@" 766test -n "$SORT" || SORT="@SORT@"
763test -n "$TSORT" || TSORT="@TSORT@" 767test -n "$TSORT" || TSORT="@TSORT@"
764test -n "$XARGS" || XARGS="@XARGS@" 768test -n "$XARGS" || XARGS="@XARGS@"
765 769
766MY_TMPDIR=`${MKTEMP} -d ${TMPDIR-/tmp}/${0##*/}.XXXXXX` 770MY_TMPDIR=`${MKTEMP} -d ${TMPDIR-/tmp}/${0##*/}.XXXXXX`
767test -n "$MY_TMPDIR" || fatal "Couldn't create temporary directory." 771test -n "$MY_TMPDIR" || fatal "Couldn't create temporary directory."
768MY_TMPFILE=$MY_TMPDIR/tmp 772MY_TMPFILE=$MY_TMPDIR/tmp
769 773
770if [ -z "$MAKECONF" ] ; then 774if [ -z "$MAKECONF" ] ; then
771 for mkconf in "@MAKECONF@" "@PREFIX@/etc/mk.conf" /etc/mk.conf ; do 775 for mkconf in "@MAKECONF@" "@PREFIX@/etc/mk.conf" /etc/mk.conf ; do
772 if [ -f "$mkconf" ] ; then 776 if [ -f "$mkconf" ] ; then
773 MAKECONF="$mkconf" 777 MAKECONF="$mkconf"
774 break 778 break
775 fi 779 fi
776 done 780 done
777fi 781fi
778if [ -z "$MAKECONF" -o ! -f "$MAKECONF" ] ; then 782if [ -z "$MAKECONF" -o ! -f "$MAKECONF" ] ; then
779 MAKECONF=/dev/null 783 MAKECONF=/dev/null
780fi 784fi
781verbose_var MAKECONF 785verbose_var MAKECONF
782 786
783# grabbed from GNU configure 787# grabbed from GNU configure
784if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then 788if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
785 # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. 789 # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
786 if (echo -n testing; echo 1,2,3) | ${SED} s/-n/xn/ | grep xn >/dev/null; then 790 if (echo -n testing; echo 1,2,3) | ${SED} s/-n/xn/ | grep xn >/dev/null; then
787 ac_n= ac_c=' 791 ac_n= ac_c='
788' ac_t=' ' 792' ac_t=' '
789 else 793 else
790 ac_n=-n ac_c= ac_t= 794 ac_n=-n ac_c= ac_t=
791 fi 795 fi
792else 796else
793 ac_n= ac_c='\c' ac_t= 797 ac_n= ac_c='\c' ac_t=
794fi 798fi
795 799
796if [ -n "$opt_L" ] ; then 800if [ -n "$opt_L" ] ; then
797 printf '' > $opt_L 801 printf '' > $opt_L
798fi 802fi
799 803
800basedir=$(pwd) 804basedir=$(pwd)
801extract_variables 805extract_variables
802if [ -n "$opt_C" ] ; then 806if [ -n "$opt_C" ] ; then
803 PKGCHK_CONF="$(set_path $opt_C)" 807 PKGCHK_CONF="$(set_path $opt_C)"
804fi 808fi
805if [ -n "$opt_P" ] ; then 809if [ -n "$opt_P" ] ; then
806 PACKAGES="$(set_path $opt_P)" 810 PACKAGES="$(set_path $opt_P)"
807fi 811fi
808if [ -d $PACKAGES/All ] ; then 812if [ -d $PACKAGES/All ] ; then
809 PACKAGES="$PACKAGES/All" 813 PACKAGES="$PACKAGES/All"
810fi 814fi
811 815
812if [ "`${ID} -u`" = 0 ] ; then 816if [ "`${ID} -u`" = 0 ] ; then
813 SU_CMD= 817 SU_CMD=
814fi 818fi
815 819
816if [ -n "$opt_N" ]; then 820if [ -n "$opt_N" ]; then
817 ${PKG_INFO} | \ 821 ${PKG_INFO} | \
818 ${SED} -e "s/[ ].*//" -e "s/-[^-]*$//" \ 822 ${SED} -e "s/[ ].*//" -e "s/-[^-]*$//" \
819 -e "s/py[0-9][0-9]pth-/py-/" \ 823 -e "s/py[0-9][0-9]pth-/py-/" \
820 -e "s/py[0-9][0-9]-/py-/" | \ 824 -e "s/py[0-9][0-9]-/py-/" | \
821 while read a 825 while read a
822 do 826 do
823 b=$(grep "o $a-[0-9]" $PKGSRCDIR/doc/TODO | \ 827 b=$(grep "o $a-[0-9]" $PKGSRCDIR/doc/TODO | \
824 ${SED} -e "s/[ ]*o //") 828 ${SED} -e "s/[ ]*o //")
825 if [ "$b" ] 829 if [ "$b" ]
826 then 830 then
827 echo $a: $b 831 echo $a: $b
828 fi 832 fi
829 done 833 done
830fi 834fi
831 835
832AWK_PARSE_SUMMARY='$1=="PKGNAME"{pkgname=$2} $1=="PKGPATH"{pkgpath=$2} NF==0{if (pkgpath && pkgname) print pkgpath ":" pkgname; pkgpath=""; pkgname=""} END{if (pkgpath && pkgname) print pkgpath ":" pkgname}' 836AWK_PARSE_SUMMARY='$1=="PKGNAME"{pkgname=$2} $1=="PKGPATH"{pkgpath=$2} NF==0{if (pkgpath && pkgname) print pkgpath ":" pkgname; pkgpath=""; pkgname=""} END{if (pkgpath && pkgname) print pkgpath ":" pkgname}'
833 837
834if [ -n "$opt_b" -a -z "$opt_s" ] ; then 838if [ -n "$opt_b" -a -z "$opt_s" ] ; then
835 case $PACKAGES in 839 case $PACKAGES in
836 http://*|ftp://*) 840 http://*|ftp://*)
837 PKGDB=`ftp -o - $PACKAGES/$SUMMARY_FILE | ${GZIP_CMD} -cd \ 841 PKGDB=`ftp -o - $PACKAGES/$SUMMARY_FILE | ${GZIP_CMD} -cd \
838 | ${AWK} -F= "$AWK_PARSE_SUMMARY"` 842 | ${AWK} -F= "$AWK_PARSE_SUMMARY"`
839 if [ -z "$PKGDB" ] 843 if [ -z "$PKGDB" ]
840 then 844 then
841 PKGDB=`ftp -o - $PACKAGES/$OLD_SUMMARY_FILE` 845 PKGDB=`ftp -o - $PACKAGES/$OLD_SUMMARY_FILE`
842 fi;; 846 fi;;
843 *) 847 *)
844 if [ -d "$PACKAGES" ] ; then 848 if [ -d "$PACKAGES" ] ; then
845 PKGDB=$(get_bin_pkg_info | bin_pkg_info2pkgdb) 849 PKGDB=$(get_bin_pkg_info | bin_pkg_info2pkgdb)
846 PKGSRCDIR=NONE 850 PKGSRCDIR=NONE
847 fi;; 851 fi;;
848 esac 852 esac
849fi 853fi
850 854
 855determine_tags
 856
851if [ -n "$opt_g" ]; then 857if [ -n "$opt_g" ]; then
852 verbose "Write $PKGCHK_CONF based on installed packages" 858 verbose "Write $PKGCHK_CONF based on installed packages"
853 generate_conf_from_installed $PKGCHK_CONF 859 generate_conf_from_installed $PKGCHK_CONF
854fi 860fi
855 861
856if [ -n "$opt_r" -o -n "$opt_u" ];then 862if [ -n "$opt_r" -o -n "$opt_u" ];then
857 verbose "Enumerate PKGDIRLIST from installed packages" 863 verbose "Enumerate PKGDIRLIST from installed packages"
858 PKGDIRLIST=$(pkgdirs_from_installed) 864 PKGDIRLIST=$(pkgdirs_from_installed)
859fi 865fi
860 866
861if [ -n "$opt_p" ] ; then 867if [ -n "$opt_p" ] ; then
862 pkgdirs_from_conf $PKGCHK_CONF $PKGDIRLIST | tr ' ' '\n' 868 pkgdirs_from_conf $PKGCHK_CONF $PKGDIRLIST | tr ' ' '\n'
863 exit 869 exit
864fi 870fi
865 871
866if [ -n "$opt_a" -o -n "$opt_l" ];then # Append to PKGDIRLIST based on conf 872if [ -n "$opt_a" -o -n "$opt_l" ];then # Append to PKGDIRLIST based on conf
867 verbose "Append to PKGDIRLIST based on config $PKGCHK_CONF" 873 verbose "Append to PKGDIRLIST based on config $PKGCHK_CONF"
868 PKGDIRLIST="$(pkgdirs_from_conf $PKGCHK_CONF $PKGDIRLIST)" 874 PKGDIRLIST="$(pkgdirs_from_conf $PKGCHK_CONF $PKGDIRLIST)"
869fi 875fi
870 876
871if [ -n "$opt_l" ] ; then 877if [ -n "$opt_l" ] ; then
872 list_packages $PKGDIRLIST 878 list_packages $PKGDIRLIST
873else 879else
874 check_packages_installed $PKGDIRLIST 880 check_packages_installed $PKGDIRLIST
875fi 881fi
876 882
877if [ -n "$MISMATCH_TODO" ]; then 883if [ -n "$MISMATCH_TODO" ]; then
878 delete_and_recheck=1 884 delete_and_recheck=1
879elif [ -n "$opt_u" -a -f $PKGCHK_UPDATE_CONF ] ; then 885elif [ -n "$opt_u" -a -f $PKGCHK_UPDATE_CONF ] ; then
880 delete_and_recheck=1 886 delete_and_recheck=1
881fi 887fi
882 888
883if [ -n "$delete_and_recheck" ]; then 889if [ -n "$delete_and_recheck" ]; then
884 if [ -n "$opt_u" ] ; then # Save current installed list 890 if [ -n "$opt_u" ] ; then # Save current installed list
885 if [ -f $PKGCHK_UPDATE_CONF ] ; then 891 if [ -f $PKGCHK_UPDATE_CONF ] ; then
886 msg "Merging in previous $PKGCHK_UPDATE_CONF" 892 msg "Merging in previous $PKGCHK_UPDATE_CONF"
887 if [ -z "$opt_n" -a -z "$opt_q" ] ; then 893 if [ -z "$opt_n" -a -z "$opt_q" ] ; then
888 tmp=$(cat $PKGCHK_UPDATE_CONF) 894 tmp=$(cat $PKGCHK_UPDATE_CONF)
889 echo $tmp $(pkgdirs_from_installed) | tr ' ' '\n' | ${SORT} -u \ 895 echo $tmp $(pkgdirs_from_installed) | tr ' ' '\n' | ${SORT} -u \
890 > $PKGCHK_UPDATE_CONF 896 > $PKGCHK_UPDATE_CONF
891 tmp= 897 tmp=
892 fi 898 fi
893 else 899 else
894 if [ -z "$opt_n" -a -z "$opt_q" ] ; then 900 if [ -z "$opt_n" -a -z "$opt_q" ] ; then
895 echo $(pkgdirs_from_installed) | tr ' ' '\n' \ 901 echo $(pkgdirs_from_installed) | tr ' ' '\n' \
896 > $PKGCHK_UPDATE_CONF 902 > $PKGCHK_UPDATE_CONF
897 fi 903 fi
898 fi 904 fi
899 fi 905 fi
900 if [ -n "$opt_r" -o -n "$opt_u" ] ; then 906 if [ -n "$opt_r" -o -n "$opt_u" ] ; then
901 if [ -n "$MISMATCH_TODO" ]; then 907 if [ -n "$MISMATCH_TODO" ]; then
902 delete_pkgs $MISMATCH_TODO 908 delete_pkgs $MISMATCH_TODO
903 msg_progress Rechecking packages after deletions 909 msg_progress Rechecking packages after deletions
904 fi 910 fi
905 if [ -n "$opt_u" ]; then 911 if [ -n "$opt_u" ]; then
906 PKGDIRLIST="$(pkgdirs_from_conf $PKGCHK_UPDATE_CONF $PKGDIRLIST)" 912 PKGDIRLIST="$(pkgdirs_from_conf $PKGCHK_UPDATE_CONF $PKGDIRLIST)"
907 fi 913 fi
908 if [ -n "$opt_a" -o -n "$opt_u" ]; then 914 if [ -n "$opt_a" -o -n "$opt_u" ]; then
909 check_packages_installed $PKGDIRLIST # May need to add more 915 check_packages_installed $PKGDIRLIST # May need to add more
910 fi 916 fi
911 fi 917 fi
912fi 918fi
913 919
914if [ -n "$opt_f" ] ; then 920if [ -n "$opt_f" ] ; then
915 pkg_fetchlist $MISSING_TODO 921 pkg_fetchlist $MISSING_TODO
916fi 922fi
917 923
918if [ -n "$MISSING_TODO" ] ; then 924if [ -n "$MISSING_TODO" ] ; then
919 if [ -n "$opt_a" -o -n "$opt_u" ] ; then 925 if [ -n "$opt_a" -o -n "$opt_u" ] ; then
920 pkg_installlist Install $MISSING_TODO 926 pkg_installlist Install $MISSING_TODO
921 fi 927 fi
922fi 928fi
923 929
924if [ -n "$opt_u" -a -z "$FAIL_DONE" -a -f $PKGCHK_UPDATE_CONF ] ; then 930if [ -n "$opt_u" -a -z "$FAIL_DONE" -a -f $PKGCHK_UPDATE_CONF ] ; then
925 run_cmd "rm -f $PKGCHK_UPDATE_CONF" 931 run_cmd "rm -f $PKGCHK_UPDATE_CONF"
926fi 932fi
927 933
928[ -z "$MISS_DONE" ] || msg "Missing:$MISS_DONE" 934[ -z "$MISS_DONE" ] || msg "Missing:$MISS_DONE"
929[ -z "$INSTALL_DONE" ] || msg "Installed:$INSTALL_DONE" 935[ -z "$INSTALL_DONE" ] || msg "Installed:$INSTALL_DONE"
930 936
931if [ -n "$FAIL_DONE" ] ; then 937if [ -n "$FAIL_DONE" ] ; then
932 msg "Failed:$FAIL_DONE" 938 msg "Failed:$FAIL_DONE"
933 cleanup_and_exit 1 939 cleanup_and_exit 1
934fi 940fi
935 941
936cleanup_and_exit 942cleanup_and_exit