White space fix and silent pkglint.
[pkgsrc.git] / bootstrap / pkg.sh
1 #! /bin/sh
2 #
3 # $NetBSD: pkg.sh,v 1.2 2002/07/26 13:15:28 agc Exp $
4 #
5 #
6 # Copyright (c) 2002 Alistair G. Crooks.  All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11 # 1. Redistributions of source code must retain the above copyright
12 #    notice, this list of conditions and the following disclaimer.
13 # 2. Redistributions in binary form must reproduce the above copyright
14 #    notice, this list of conditions and the following disclaimer in the
15 #    documentation and/or other materials provided with the distribution.
16 # 3. All advertising materials mentioning features or use of this software
17 #    must display the following acknowledgement:
18 #       This product includes software developed by Alistair G. Crooks
19 #       for the NetBSD project.
20 # 4. The name of the author may not be used to endorse or promote
21 #    products derived from this software without specific prior written
22 #    permission.
23 #
24 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
25 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
28 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
30 # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32 # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #
36 #set -x
37
38 version=20020615
39
40 opsys=`uname -s`
41
42 case "$opsys" in
43 Darwin)
44         awkprog=/usr/bin/awk
45         catprog=/bin/cat
46         chmodprog=/bin/chmod
47         cpprog=/bin/cp
48         lnprog=/bin/ln
49         mkdirprog=/bin/mkdir
50         rmprog=/bin/rm
51         sedprog=/usr/bin/sed
52         ;;
53 Linux)
54         awkprog=/usr/bin/awk
55         catprog=/bin/cat
56         chmodprog=/bin/chmod
57         cpprog=/bin/cp
58         lnprog=/bin/ln
59         mkdirprog=/bin/mkdir
60         rmprog=/bin/rm
61         sedprog=/bin/sed
62         ;;
63 NetBSD)
64         awkprog=/usr/bin/awk
65         catprog=/bin/cat
66         chmodprog=/bin/chmod
67         cpprog=/bin/cp
68         lnprog=/bin/ln
69         mkdirprog=/bin/mkdir
70         rmprog=/bin/rm
71         sedprog=/usr/bin/sed
72         ;;
73 SunOS)
74         awkprog=/usr/bin/nawk
75         catprog=/usr/bin/cat
76         chmodprog=/usr/bin/chmod
77         cpprog=/usr/bin/cp
78         lnprog=/usr/bin/ln
79         mkdirprog=/usr/bin/mkdir
80         rmprog=/usr/bin/rm
81         sedprog=/usr/xpg4/bin/sed
82         ;;
83 *)
84         awkprog=awk
85         catprog=cat
86         chmodprog=chmod
87         cpprog=cp
88         lnprog=ln
89         mkdirprog=mkdir
90         rmprog=rm
91         sedprog=sed
92         ;;
93 esac
94
95 getpkg()
96 {
97         if test -d $PKG_DBDIR/$1; then
98                 d=$PKG_DBDIR/$1
99         else
100                 d="`echo $PKG_DBDIR/${1}-*`"
101         fi
102         echo $d
103 }
104
105 case "$DIGESTPROG" in
106 "")     DIGESTPROG=/usr/pkg/bin/digest ;;
107 esac
108 case "$PKG_DBDIR" in
109 "")     PKG_DBDIR=/var/db/pkg ;;
110 esac
111 case "$PKG_DIGEST" in
112 "")     PKG_DIGEST=sha1 ;;
113 esac
114
115 ALLDIGESTS="sha1 sha512"
116
117 case "$0" in
118 *pkg_create)    cmd=create ;;
119 *pkg_delete)    cmd=delete ;;
120 *pkg_info)      cmd=info ;;
121 *pkg.sh|*pkg)   cmd=$1; shift ;;
122 esac
123
124 case "$cmd" in
125 create)
126         if [ $# -lt 1 ]; then
127                 echo "Usage: pkg create ..." > /dev/stderr
128                 exit 1
129         fi
130
131         BUILDINFOFILE=""                # done
132         BUILDVERSIONFILE=""             # done
133         CONFLICTS=""                    # done
134         comment=""                      # done
135         DISPLAYFILE=""                  # done
136         DESCRFILE=""                    # done
137         plist=""                        # done
138         minush=no
139         realprefix=""
140         installfile=""                  # done
141         deinstallfile=""                # done
142         srcdir=""
143         relsymlinks=no
144         mtreefile=""
145         plistonly=no
146         PREREQS=""
147         #prefix=""
148         reorder=no
149         requirements=""
150         allsizefile=""                  # done
151         thissizefile=""                 # done
152         updatefilecache=yes
153         excludefrom=""
154
155         while [ $# -gt 0 ]; do
156                 case "$1" in
157                 -B)     BUILDINFOFILE="$2"; shift ;;
158                 -C)     CONFLICTS="$2"; shift ;;
159                 -D)     DISPLAYFILE="$2"; shift ;;
160                 -I)     realprefix="$2"; shift ;;
161                 -L)     srcdir="$2"; shift ;;
162                 -O)     plistonly=yes ;;
163                 -P)     PREREQS="$PREREQS $2"; shift ;;
164                 -R)     reorder=yes ;;
165                 -S)     allsizefile="$2"; shift ;;
166                 -U)     updatefilecache=no ;;
167                 -V)     echo $version; exit 0 ;;
168                 -X)     excludefrom="$excludefrom $2"; shift ;;
169                 -b)     BUILDVERSIONFILE="$2"; shift ;;
170                 -c)     case "$2" in
171                         -*)     comment="`echo $2 | $sedprog -e 's|^-||'`"; shift ;;
172                         *)      comment=`$catprog $2` ;;
173                         esac
174                         shift ;;
175                 -d)     DESCRFILE=$2; shift ;;
176                 -f)     plist="$2"; shift ;;
177                 -h)     minush=yes ;;
178                 -i)     installfile="$2"; shift ;;
179                 -k)     deinstallfile="$2"; shift ;;
180                 -l)     relsymlinks=yes ;;
181                 -m)     mtreefile="$2"; shift ;;
182                 -p)     PREFIX="$2"; shift ;;
183                 -r)     requirements="$2"; shift ;;
184                 -s)     thissizefile="$2"; shift ;;
185                 -t)     shift ;;
186                 -v)     set -x ;;
187                 --)     shift; break ;;
188                 *)      break ;;
189                 esac
190                 shift
191         done
192
193         PKGNAME=$1
194
195         if [ ! -d $PKG_DBDIR/$PKGNAME ]; then
196                 $mkdirprog $PKG_DBDIR/$PKGNAME
197         fi
198
199         if [ -f "$BUILDINFOFILE" ]; then
200                 $cpprog $BUILDINFOFILE $PKG_DBDIR/$PKGNAME/+BUILD_INFO
201         fi
202         if [ -f "$BUILDVERSIONFILE" ]; then
203                 $cpprog $BUILDVERSIONFILE $PKG_DBDIR/$PKGNAME/+BUILD_VERSION
204         fi
205         echo $comment > $PKG_DBDIR/$PKGNAME/+COMMENT
206         $cpprog $DESCRFILE $PKG_DBDIR/$PKGNAME/+DESC
207
208         case "$installfile" in
209         "")     ;;
210         *)      $cpprog $installfile $PKG_DBDIR/$PKGNAME/+INSTALL ;;
211         esac
212         case "$deinstallfile" in
213         "")     ;;
214         *)      $cpprog $deinstallfile $PKG_DBDIR/$PKGNAME/+DEINSTALL ;;
215         esac
216         case "$DISPLAYFILE" in
217         "")     ;;
218         *)      $cpprog $DISPLAYFILE $PKG_DBDIR/$PKGNAME/+DISPLAY ;;
219         esac
220         case "$allsizefile" in
221         "")     ;;
222         *)      $cpprog $allsizefile $PKG_DBDIR/$PKGNAME/+SIZE_ALL ;;
223         esac
224         case "$thissizefile" in
225         "")     ;;
226         *)      $cpprog $thissizefile $PKG_DBDIR/$PKGNAME/+SIZE_PKG ;;
227         esac
228
229         export PREFIX PKGNAME CONFLICTS PREREQS DIGESTPROG PKG_DIGEST
230
231         $awkprog '
232         BEGIN   {
233                 if (ENVIRON["CONFLICTS"] != "") {
234                         cflc = split(ENVIRON["CONFLICTS"], cflv);
235                         for (i = 1 ; i <= cflc ; i++)
236                                 printf("@pkgcfl %s\n", cflv[i])
237                 }
238                 if (ENVIRON["PREREQS"] != "") {
239                         prec = split(ENVIRON["PREREQS"], prev);
240                         for (i = 1 ; i <= prec ; i++)
241                                 printf("@pkgdep %s\n", prev[i])
242                 }
243                 prefix = ENVIRON["PREFIX"];
244                 printf("@name %s\n@cwd %s\n", ENVIRON["PKGNAME"], prefix) }
245         /^@(comment|dirrm|src)/ { print $0; next }
246         /^@(un)?exec/   {       last = filename; gsub(".*/", "", last); gsub("%f", last);
247                 fc = split(filename, fv, "/"); fn = prefix; for (i = 1 ; i < fc ; i++) fn = fn "/" fv[i]; gsub("%B", fn);
248                 gsub("%F", filename);
249                 gsub("%D", prefix); print $0; next }
250         { filename = $0; printf("%s\n@comment MD5:", $0); cmd = sprintf("'$catprog' %s/%s | %s %s", prefix, $0, ENVIRON["DIGESTPROG"], ENVIRON["PKG_DIGEST"]); system(cmd) }
251         ' < $plist > $PKG_DBDIR/$PKGNAME/+CONTENTS
252
253         # construct the digests of all the metafiles
254         echo "#! /bin/sh" > $PKG_DBDIR/$PKGNAME/+VERIFY
255         echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
256         echo 'case $# in' >> $PKG_DBDIR/$PKGNAME/+VERIFY
257         echo '0) ;;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
258         echo '*) cd '$PKG_DBDIR/$PKGNAME ';;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
259         echo 'esac' >> $PKG_DBDIR/$PKGNAME/+VERIFY
260         echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
261         echo "$awkprog '" >> $PKG_DBDIR/$PKGNAME/+VERIFY
262         echo 'BEGIN     { ex = 0 }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
263         echo 'END       { exit(ex) }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
264         echo '/^@cwd/   { prefix = $2; next }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
265         echo '/^@/      { next }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
266         echo '  {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
267         echo '  for (done = 0 ; !done ; ) {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
268         echo '          filename = prefix "/" $0;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
269         echo '          getline;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
270         echo '          if ($0 ~ /^@comment (MD5|SHA1):/) {' >> $PKG_DBDIR/$PKGNAME/+VERIFY
271         echo '                  alg = dig = $2;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
272         echo '                  gsub(":.*", "", alg);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
273         echo '                  gsub("[A-Za-z0-9]*:", "", dig);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
274         echo '                  cmd = sprintf("s=`'$catprog' %s | '$DIGESTPROG' %s`; if test \"%s\" != \"$s\"; then echo \"Checksum mismatch (%s): expected %s, got $s\"; fi", filename, alg, dig, filename, dig);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
275         echo '                  if (system(cmd) != 0) ex = 1' >> $PKG_DBDIR/$PKGNAME/+VERIFY
276         echo '                  done = 1;' >> $PKG_DBDIR/$PKGNAME/+VERIFY
277         echo '          }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
278         echo '  }' >> $PKG_DBDIR/$PKGNAME/+VERIFY
279         echo "}' +CONTENTS" >> $PKG_DBDIR/$PKGNAME/+VERIFY
280         echo "" >> $PKG_DBDIR/$PKGNAME/+VERIFY
281         echo "$awkprog '" >> $PKG_DBDIR/$PKGNAME/+VERIFY
282         echo "BEGIN     { ex = 0 }" >> $PKG_DBDIR/$PKGNAME/+VERIFY
283         echo "END       { exit(ex) }" >> $PKG_DBDIR/$PKGNAME/+VERIFY
284         echo "          {" >> $PKG_DBDIR/$PKGNAME/+VERIFY
285         echo 'cmd = sprintf("s=`'$catprog' %s | '$DIGESTPROG' %s`; if test \"%s\" != \"$s\"; then echo \"Checksum mismatch (%s): expected %s, got $s\"; fi", $1, $2, $3, $1, $3);' >> $PKG_DBDIR/$PKGNAME/+VERIFY
286         echo "if (system(cmd) != 0) ex = 1" >> $PKG_DBDIR/$PKGNAME/+VERIFY
287         echo "}' << filesEOF" >> $PKG_DBDIR/$PKGNAME/+VERIFY
288         # construct the digests of all the metafiles
289         for f in +BUILD_INFO +BUILD_VERSION +COMMENT +CONTENTS +DEINSTALL +DESC +DISPLAY +INSTALL +SIZE_ALL +SIZE_PKG; do
290                 if [ -f $PKG_DBDIR/$PKGNAME/$f ]; then
291                         for dig in $ALLDIGESTS; do
292                                 echo "$f $dig `$catprog $PKG_DBDIR/$PKGNAME/$f | $DIGESTPROG $dig`" >> $PKG_DBDIR/$PKGNAME/+VERIFY
293                         done
294                 fi
295         done
296         echo "filesEOF" >> $PKG_DBDIR/$PKGNAME/+VERIFY
297         $chmodprog 0755 $PKG_DBDIR/$PKGNAME/+VERIFY
298
299         # change absolute symlinks to relative ones
300         case "$relsymlinks" in
301         yes)    for f in `$awkprog '
302                         $1 == "prefix"  { prefix = $2; next }
303                         $1 == "file"    { printf("%s/%s\n", prefix, $0) }
304                         ' < $PKG_DBDIR/$PKGNAME/+INVENTORY`; do
305                         if [ -h $f ]; then
306                                 target="`ls -al $1 | awk '{ print $11 }'`"
307                                 case "$target" in
308                                 /*)     echo $prefix $target $f | /usr/bin/awk '
309                                                 {
310                                                         pc = split($1, pv, "/");
311                                                         tc = split($2, tv, "/");
312                                                         for (i = tc - pc + 2 ; i <= tc ; i++)
313                                                                 linkname = linkname "../";
314                                                         for (i = pc + 1 ; i <= tc ; i++)
315                                                                 linkname = linkname "/" tv[i];
316                                                         cmd = sprintf("'$rmprog' -f %s && '$lnprog' -s %s %s", $3, linkname, $3);
317                                                         exit(system(cmd));
318                                                 }'
319                                         ;;
320                                 esac
321                         fi
322                 done
323                 ;;
324         esac
325
326         ;;
327
328 delete)
329         deinstall=yes
330         force=no
331         doit=yes
332         justdb=no
333         prefix=""
334         needs=no
335         reqs=no
336         while [ $# -gt 0 ]; do
337                 case "$1" in
338                 -D)     deinstall=no ;;
339                 -O)     justdb=yes ;;
340                 -R)     needs=yes ;;
341                 -f)     force=yes ;;
342                 -n)     doit=no ;;
343                 -p)     prefix=$2; shift ;;
344                 -r)     reqs=yes ;;
345                 esac
346                 shift
347         done
348         for pkg in $@; do
349                 d=`getpkg $pkg`
350                 hitme=yes
351                 if [ -f $d/+REQUIRED_BY ]; then
352                         hitme=no
353                         case "$force" in
354                         yes)    hitme=yes ;;
355                         esac
356                         case "$needs" in
357                         yes)    hitme=yes ;;
358                         esac
359                         case "$hitme" in
360                         no)     echo "pkg_delete: package $pkg is required by other packages:"
361                                 $catprog $d/+REQUIRED_BY
362                                 echo "pkg_delete: 1 package deletion failed"
363                                 continue
364                                 ;;
365                         esac
366                 fi
367                 case "$hitme" in
368                 yes)    if [ -f $d/+VERIFY ]; then
369                                 $d/+VERIFY
370                         fi
371                         ;;
372                 esac
373                 case "$reqs" in
374                 yes)    ;;
375                 esac
376         done
377         ;;
378
379 info)
380         allpackages=no
381         buildinfo=no
382         buildversion=no
383         comment=no
384         display=no
385         descr=no
386         exist=no
387         filedb=no
388         plist=no
389         index=no
390         install=no
391         deinstall=no
392         entries=no
393         needs=no
394         prefix=no
395         reqby=no
396         sizeall=no
397         sizepkg=no
398         version=no
399         if [ $# -eq 0 ]; then
400                 set -- -I -a
401         fi
402         while [ $# -gt 0 ]; do
403                 case "$1" in
404                 -B)     buildinfo=yes ;;
405                 -D)     display=yes ;;
406                 -F)     filedb=yes ;;
407                 -I)     index=yes ;;
408                 -L)     entries=yes ;;
409                 -S)     sizeall=yes ;;
410                 -V)     version=yes ;;
411                 -a)     allpackages=yes ;;
412                 -b)     buildversion=yes ;;
413                 -c)     comment=yes ;;
414                 -d)     descr=yes ;;
415                 -e)     exist=yes ;;
416                 -f)     plist=yes ;;
417                 -i)     install=yes ;;
418                 -k)     deinstall=yes ;;
419                 -n)     needs=yes ;;
420                 -p)     prefix=yes ;;
421                 -r)     reqby=yes ;;
422                 -s)     sizepkg=yes ;;
423                 *)      break ;;
424                 esac
425                 shift
426         done
427         case "$version" in
428         yes)    echo $version; exit 0 ;;
429         esac
430         case "$filedb" in
431         yes)    echo "-F is unimplemented" ;;
432         esac
433         case "$exist" in
434         yes)    echo "-e is unimplemented" ;;
435         esac
436         case "$allpackages" in
437         yes)    pkglist="`(cd $PKG_DBDIR; ls -d *-*)`" ;;
438         *)      pkglist="$@" ;;
439         esac
440         for pkg in $pkglist; do
441                 d=`getpkg $pkg`
442                 case "$buildinfo" in
443                 yes)    $catprog $d/+BUILD_INFO ;;
444                 esac
445                 case "$display" in
446                 yes)    if [ -f  $d/+DISPLAY ]; then
447                                 $catprog $d/+DISPLAY
448                         fi ;;
449                 esac
450                 case "$index" in
451                 yes)    echo "`echo $d | $sedprog -e 's|.*/||'` `$catprog $d/+COMMENT`" ;;
452                 esac
453                 case "$entries" in
454                 yes)    $awkprog '
455                                 /^@cwd/ { prefix = $2 }
456                                 /^@/    { next }
457                                         { printf("%s/%s\n", prefix, $0) }
458                                 ' < $d/+CONTENTS ;;
459                 esac
460                 case "$buildversion" in
461                 yes)    $catprog $d/+BUILD_VERSION ;;
462                 esac
463                 case "$comment" in
464                 yes)    $catprog $d/+COMMENT ;;
465                 esac
466                 case "$descr" in
467                 yes)    $catprog $d/+DESC ;;
468                 esac
469                 case "$install" in
470                 yes)    if [ -f  $d/+INSTALL ]; then
471                                 $catprog $d/+INSTALL
472                         fi ;;
473                 esac
474                 case "$deinstall" in
475                 yes)    if [ -f  $d/+DEINSTALL ]; then
476                                 $catprog $d/+DEINSTALL
477                         fi ;;
478                 esac
479                 case "$needs" in
480                 yes)    $awkprog '/^@pkgdep/ { print $2 }' < $d/+CONTENTS ;;
481                 esac
482                 case "$prefix" in
483                 yes)    $awkprog '/^@cwd/ { print $2; exit }' < $d/+CONTENTS ;;
484                 esac
485                 case "$reqby" in
486                 yes)    if [ -f  $d/+REQUIRED_BY ]; then
487                                 $catprog $d/+REQUIRED_BY
488                         fi ;;
489                 esac
490                 case "$sizeall" in
491                 yes)    $catprog $d/+SIZE_ALL
492                 esac
493                 case "$sizepkg" in
494                 yes)    $catprog $d/+SIZE_PKG
495                 esac
496         done
497         ;;
498
499 show)   
500         if [ $# -lt 1 ]; then
501                 echo "Usage: pkg show type packages" > /dev/stderr
502                 exit 1
503         fi
504
505         showtype=$1
506         shift
507         for pkg in $@; do
508                 d=`getpkg $pkg`
509                 case "$d" in
510                 "")     echo "No such package ($pkg)" ;;
511                 *)      
512                         case "$showtype" in
513                         allsizes)
514                                 $catprog $d/+SIZE_ALL ;;
515                         blddep|blddeps)
516                                 $awkprog '/^@blddep/ { print $2 }' $d/+CONTENTS ;;
517                         comment)
518                                 $catprog $d/+COMMENT ;;
519                         description|desc|descr)
520                                 $catprog $d/+DESC ;;
521                         deinstall)
522                                 if [ -f  $d/+DEINSTALL ]; then
523                                         $catprog $d/+DEINSTALL
524                                 fi ;;
525                         display)
526                                 if [ -f  $d/+DISPLAY ]; then
527                                         $catprog $d/+DISPLAY
528                                 fi ;;
529                         files)
530                                 $awkprog '
531                                 /^@cwd/ { prefix = $2 }
532                                 /^@/    { next }
533                                         { printf("%s/%s\n", prefix, $0) }
534                                 ' < $d/+CONTENTS ;;
535                         index)
536                                 echo "`echo $d | $sedprog -e 's|.*/||'` `$catprog $d/+COMMENT`" ;;
537                         info)
538                                 $catprog $d/+BUILD_INFO ;;
539                         install)
540                                 if [ -f  $d/+INSTALL ]; then
541                                         $catprog $d/+INSTALL
542                                 fi ;;
543                         prefix)
544                                 $awkprog '/^@cwd/ { print $2 }' $d/+CONTENTS ;;
545                         prereqs|pkgdep)
546                                 $awkprog '/^@pkgdep/ { print $2 }' $d/+CONTENTS ;;
547                         size)
548                                 $catprog $d/+SIZE_PKG ;;
549                         version)
550                                 $catprog $d/+BUILD_VERSION ;;
551                         *)
552                                 echo "Unknown type \"$showtype\""
553                                 exit 1 ;;
554                         esac
555                 esac
556         done
557         ;;
558
559 version)
560         echo $version
561         exit 0
562         ;;
563
564 *)      echo "$0: \"$cmd\" not found"
565         exit 1
566         ;;
567 esac
568
569 exit 0