master
rcpm
1#!/bin/rc
2
3flag e +
4
5fn log {printf '%s\n' $"*}
6
7fn errexit {
8 log ERROR: $"*
9 exit 1
10}
11
12fn rcpm_help {log 'Usage: rcpm b|c|d||h|i|l|m|u|r|s'}
13
14if (~ $#rcpm_path 0) errexit rcpm_path needs to be set
15if (~ $#rcpm_root 0) rcpm_root=/
16if (~ $#rcpm_db 0) rcpm_db=/var/db/rcpm
17if (~ $#rcpm_cache 0) {
18 if (~ `{id -u} 0) rcpm_cache=/root/$rcpm_db/bin
19 if not {
20 user=`{whoami}
21 rcpm_cache=/home/$user/$rcpm_db/bin
22 }
23}
24
25fn dl_pkg {
26 cd $rcpm_path/$pkg
27 srcs=()
28 if (grep -q pkg/$pkg/src ../../.gitmodules) {
29 git submodule update --init --checkout src
30 git -C src clean -xfdq
31 git -C src reset --hard
32 srcs=1
33 }
34 if (test -f url) {
35 curl --skip-existing -LK url -O
36 srcs=1
37 }
38 if (test -d files/) srcs=1
39 if (! ~ $srcs 1) errexit No sources found
40 if not status=()
41
42}
43
44fn chksum_pkg {
45 dl_pkg
46 if (test -f sha256) sha256sum -c sha256
47 if not status=()
48}
49
50fn unpack_pkg {
51 if (test -f fetch.rc) ./fetch.rc
52 if not {
53 for (archive in `{awk '{print $2}' sha256}) {
54 switch($archive) {
55 case *.tar.gz
56 tool=gzip
57 case *.tar.xz
58 tool=xz
59 case *.tar.bz2
60 tool=bzip2
61 case *.tar.zst
62 tool=zstd
63 case *
64 exit 1
65 }
66 $tool -dc $archive | pax -r -s ',^[^/]*,src,'
67 }
68 }
69}
70
71fn get_ver {
72 version=`{cat $rcpm_path/$pkg/ver}
73 ver=$version(1)
74 rev=$version(2)
75}
76
77fn compressor {
78 if (~ $#rcpm_compression 0) rcpm_compression=gzip
79 switch($rcpm_compression) {
80 case gzip
81 tool=gzip
82 ext=gz
83 case bzip
84 tool=bzip2
85 ext=bz2
86 case xz
87 tool=xz
88 ext=xz
89 case zstd
90 tool=zstd
91 ext=zst
92 }
93}
94
95fn check_prebuilt {
96 compressor && status=()
97 if (test ! -f $rcpm_cache/$pkg@$ver-$rev.tar.$ext) {
98 errexit $pkg is not built
99 }
100}
101
102fn gen_manifest {
103 find . | sed -e '/^\.\/$/d' \
104 -e 's/^\.//g' -e 's/\/$//g' \
105 -e '/^[[:space:]]*$/d' | \
106 sort -ru >./$rcpm_db/$pkg/manifest
107}
108
109fn push_pkg {
110 cp -fR * $rcpm_root
111 log $pkg installed successfully
112}
113
114fn install_pkg {
115 cd $rcpm_root
116 get_ver || status=()
117 if (! check_prebuilt) {
118 outdir=/tmp/$pid/$pkg/out
119 mkdir -p $outdir
120 cd $outdir
121 $tool -dc $rcpm_cache/$pkg@$ver-$rev.tar.$ext | pax -r
122 mv -f ./$rcpm_db/$pkg/manifest ..
123 gen_manifest
124 if (cmp -s ../manifest ./$rcpm_db/$pkg/manifest) {
125 if (test -d $rcpm_root/$rcpm_db/$pkg) {
126 if (cmp -s $rcpm_root/$rcpm_db/$pkg/manifest ./$rcpm_db/$pkg/manifest) {
127 push_pkg
128 }
129 if not {
130 filelist=`{grep -Fxvf ./$rcpm_db/$pkg/manifest $rcpm_root/$rcpm_db/$pkg/manifest}
131 for (files in $filelist) {
132 rmdir $rcpm_root/$files >[2=] || \
133 rm -f $rcpm_root/$files >[2=]
134 }
135 push_pkg
136 }
137 }
138 if not {
139 push_pkg
140 }
141 }
142 if not errexit Manifest does not match!
143 }
144}
145
146fn build_pkg {
147 chksum_pkg $pkg
148 if (test -f url) {
149 if (test -f .submodule) unpack_pkg $archive
150 if not {
151 rm -rf src/
152 unpack_pkg $archive
153 }
154 }
155 if (test -d files/) {
156 mkdir -p src/
157 cp -Rf files/* src/
158 }
159 cd src
160 destdir=/tmp/$pid/$pkg/in
161 test -d $destdir && rm -rf $destdir
162 ../build
163 cd $destdir
164 mkdir -p ./$rcpm_db/$pkg
165 get_ver
166 printf $"version >./$rcpm_db/$pkg/ver
167 gen_manifest
168 test -d $rcpm_cache || mkdir -p $rcpm_cache
169 compressor
170 pax -w . | $tool -9 >$rcpm_cache/$pkg@$ver-$rev.tar.$ext
171 install_pkg
172}
173
174fn get_local_ver {
175 _version=`{cat $rcpm_root/$rcpm_db/$pkg/ver}
176 _ver=$_version(1)
177 _rev=$_version(2)
178}
179
180fn rm_pkg {
181 if (! test -d $rcpm_root/$rcpm_db/$pkg) {
182 errexit Package not installed!
183 }
184 filelist=`{cat $rcpm_root/$rcpm_db/$pkg/manifest}
185 for (files in $filelist) {
186 rmdir $rcpm_root/$files >[2=] || rm -f $rcpm_root/$files >[2=]
187 }
188 log $pkg uninstalled successfully
189}
190
191fn update_pkg {
192 for (file in $rcpm_root/$rcpm_db/*) {
193 pkg=`{basename $file}
194 if (cmp -s $rcpm_root/$rcpm_db/$pkg/ver $rcpm_path/$pkg/ver) {
195 log $pkg is up to date
196 }
197 if not {
198 get_ver
199 if (check_prebuilt) build_pkg $pkg
200 if not install_pkg $pkg
201 }
202 }
203}
204
205cmd=$1
206shift
207
208switch($cmd) {
209 case b
210 for (pkg) build_pkg $pkg
211 case c
212 for (pkg) chksum_pkg $pkg
213 case d
214 for (pkg) dl_pkg $pkg
215 case h
216 rcpm_help
217 case i
218 for (pkg) install_pkg $pkg
219 case l
220 switch($#*) {
221 case 0
222 for (file in $rcpm_root/$rcpm_db/*) {
223 pkg=`{basename $file}
224 get_local_ver
225 log $pkg $_ver-$_rev
226 }
227 case *
228 for (pkg) {
229 get_local_ver
230 log $pkg $_ver-$_rev
231 }
232 }
233 case m
234 cat $rcpm_root/$rcpm_db/$1/manifest
235 case r
236 for (pkg) rm_pkg $pkg
237 case s
238 for (pkg) find $rcpm_path -type d -name $pkg
239 case u
240 update_pkg
241 case *
242 rcpm_help
243 errexit Invalid arguement!
244}