1#! /bin/sh
2#
3#         $NetBSD: makesrctars,v 1.46 2023/11/08 13:02:47 christos Exp $
4#
5# makesrctars srcdir setdir
6#         Create source tarballs in setdir from the source under srcdir.
7#
8
9prog="${0##*/}"
10rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
11. "${rundir}/sets.subr"
12
13# set defaults
14xsrcdir=
15quiet=false
16
17GZIP=-9n
18export GZIP
19
20usage()
21{
22          cat 1>&2 <<USAGE
23Usage: ${prog} [-N password/group dir] [-q] [-x xsrcdir] srcdir setdir
24          -N dir              location which contains master.passwd and group files
25                              (defaults to \${srcdir}/etc)
26          -q                  quiet operation
27          -x xsrcdir          build xsrc.tgz from xsrcdir
28          srcdir              location of sources
29          setdir              where to write the .tgz files to
30USAGE
31          exit 1
32}
33
34msg()
35{
36          $quiet || echo $*
37}
38
39
40umask 022
41# handle args
42while getopts N:qx: ch; do
43          case ${ch} in
44          q)
45                    quiet=true
46                    ;;
47          x)
48                    xsrcdir="${OPTARG}"
49                    ;;
50          N)
51                    PASSWD="${OPTARG}"
52                    ;;
53          *)
54                    usage
55                    ;;
56          esac
57done
58shift $((${OPTIND} - 1))
59
60if [ $# -ne 2 ]; then
61          usage
62fi
63srcdir="$1"
64setdir="$2"
65: ${PASSWD:="${srcdir}/etc"}
66
67if [ ! -d "${setdir}" ]; then
68          echo >&2 "${prog}: ${setdir} is not a directory"
69          exit 1
70fi
71
72makeset()
73{(
74          set="${1}.tgz"
75          shift
76          dir="$1"
77          shift
78          intmp="/tmp/in$$"
79          msg "Creating ${set}"
80          if [ "${dir}" != "." ]; then
81                    cd "${dir}"
82                    srcprefix="${srcprefix}/${dir}"
83          fi
84          # Gets rid of any obj dirs and things below it. Also skip
85          # .hg or .git repositories (if we got the source via git
86          # or mercurial)
87          printf "obj\n./.git\n./.hg\n" > "${intmp}"
88          egrep="$*"
89          if [ "${egrep}" = "" ]; then
90                    egrep='.'
91          fi
92          set -f
93          ${MTREE} -c -X "${intmp}" | ${MTREE} -CS -k type | \
94                    ${EGREP} -v 'type=link' | ${EGREP} ${egrep} | \
95                    ${SED} -e 's:type=file:& mode=0664:' \
96                              -e 's:type=dir:& mode=0775:' \
97                              -e 's:$: uname=root gname=wsrc:' \
98                              -e '/\/move-if-change /s:\(mode\)=[0-9]*:\1=0775:' \
99                              -e '/^\.\/.*[.-]sh /s:\(mode\)=[0-9]*:\1=0775:' | \
100                    ${PAX} -M -N "${PASSWD}" -w -d -s'|^\.|'"${srcprefix}"'|' | \
101                    ${GZIP_CMD} > "${setdir}/${set}"
102          rm -f "${intmp}"
103)}
104
105
106# create (base)src sets
107#
108
109if ! cd "${srcdir}"; then
110          echo >&2 "${prog}: can't chdir to ${srcdir}"
111          exit 1
112fi
113
114srcprefix=usr/src
115export setdir MTREE PAX CKSUM GZIP PASSWD srcprefix
116
117makeset src . -v '^\.\/common|^\.\/external\/gpl2|^\.\/external\/gpl3|^\.\/share|^\.\/sys|^\.\/usr\.bin\/config'
118
119makeset gnusrc . -e '^\..type=dir|^\.\/external.type=dir|^\.\/external\/gpl2|^\.\/external\/gpl3'
120
121makeset syssrc . -e '^\..type=dir|^\.\/sys|^\.\/usr\.bin.type=dir|^\.\/usr\.bin\/config|^\.\/common'
122
123makeset sharesrc share
124
125
126# create xsrc sets
127#
128if [ -n "${xsrcdir}" ]; then
129          if ! cd "${xsrcdir}"; then
130                    echo >&2 "${prog}: can't chdir to ${xsrcdir}"
131                    exit 1
132          fi
133          srcprefix=usr/xsrc
134          makeset xsrc .
135fi
136
137
138msg "Creating checksum files"
139(cd "${setdir}"
140          ${CKSUM} -a md5  *.tgz *.tar.xz > MD5
141          ${CKSUM} -a sha512 *.tgz *.tar.xz > SHA512
142)
143exit 0
144