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}