master rcpm
  1#!/bin/rc
  2
  3flag e +
  4
  5fn log {
  6	printf '%s\n' $"*
  7}
  8
  9fn errexit {
 10	log ERROR: $"*
 11	exit 1
 12}
 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/var/rcpm/bin
 19	if not {
 20		user=`{whoami}
 21		RCPM_CACHE=/home/$user/var/rcpm/bin
 22	}
 23}
 24
 25fn rcpm_help {log 'Usage: rcpm b|c|d||h|i|l|m|u|r|s'}
 26
 27fn dl_pkg {
 28	cd $RCPM_PATH/$pkg
 29	if (test -f .submodule) {
 30		git submodule update --init --checkout src
 31		git -C src clean -xfdq
 32		git -C src reset --hard
 33		srcs=1
 34	}
 35	if (test -f url) {
 36		curl --skip-existing -LK url -O
 37		srcs=1
 38	}
 39	if (test -d files/) srcs=1
 40	if (~ $#srcs 0) errexit 'No sources found'
 41	if not status=()
 42
 43}
 44
 45fn chksum_pkg {
 46	dl_pkg
 47	if (test -f sha256) sha256sum -c sha256
 48	if not status=()
 49}
 50
 51fn unpack_pkg {
 52	for (archive in `{awk '{print $2}' sha256}) {
 53		switch($archive) {
 54			case *.tar.gz
 55				tool=gzip
 56			case *.tar.xz
 57				tool=xz
 58			case *.tar.bz2
 59				tool=bzip2
 60			case *
 61				exit 1
 62		}
 63	$tool -dc $archive | pax -r -s ',^[^/]*,src,'
 64	}
 65}
 66
 67fn get_ver {
 68	version=`{cat $RCPM_PATH/$pkg/ver}
 69	ver=$version(1)
 70	rev=$version(2)
 71
 72}
 73
 74fn packup_pkg {
 75	mkdir -p ./$RCPM_DB/$pkg
 76	get_ver
 77	printf $"version >./$RCPM_DB/$pkg/ver
 78	gen_manifest
 79	test -d $RCPM_CACHE || mkdir -p $RCPM_CACHE
 80	pax -w . | gzip > $RCPM_CACHE/$pkg@$ver-$rev.tar.gz
 81}
 82
 83fn check_prebuilt {
 84	if (test ! -f $RCPM_CACHE/$pkg@$ver-$rev.tar.gz) {
 85		log $pkg is not built
 86	}
 87}
 88
 89fn gen_manifest {
 90	find . | sed -e '/^\.\/$/d' \
 91		-e 's/^\.//g' -e 's/\/$//g' \
 92		-e '/^[[:space:]]*$/d' | \
 93		sort -ru >./$RCPM_DB/$pkg/manifest
 94}
 95
 96fn install_pkg {
 97	cd $RCPM_ROOT
 98	get_ver || status=()
 99	check_prebuilt || {gzip -dc $RCPM_CACHE/$pkg@$ver-$rev.tar.gz | pax -r
100	log $pkg installed successfully}
101}
102
103fn build_pkg {
104	chksum_pkg $pkg
105	if (test -f url) unpack_pkg $archive
106	if (test -d files/) {
107		mkdir -p src/ && cp -Rf files/* src/
108	}
109	cd src
110	destdir=/tmp/$pid/$pkg
111	../build
112	cd $destdir
113	packup_pkg
114	install_pkg
115}
116
117fn get_local_ver {
118	_version=`{cat $RCPM_ROOT/$RCPM_DB/$pkg/ver}
119	_ver=$_version(1)
120	_rev=$_version(2)
121}
122
123fn rm_pkg {
124	filelist=`{cat $RCPM_ROOT/$RCPM_DB/$pkg/manifest}
125	for (files in $filelist) {
126		rmdir $RCPM_ROOT/$files >[2=] || rm -f $RCPM_ROOT/$files >[2=]
127	}
128	log $pkg uninstalled successfully 
129}
130
131fn update_pkg {
132	for (file in $RCPM_ROOT/$RCPM_DB/*) {
133		pkg=`{basename $file}
134		if (cmp -s $RCPM_ROOT/$RCPM_DB/$pkg/ver $RCPM_PATH/$pkg/ver) {
135			log $pkg is up to date
136		}
137		if not {
138			get_ver
139			if (check_prebuilt) build_pkg $pkg
140			if not install_pkg $pkg
141		}
142	}
143}
144
145cmd=$1
146shift
147
148switch($cmd) {
149	case b
150		for (pkg) build_pkg $pkg
151	case c
152		for (pkg) chksum_pkg $pkg
153	case d
154		for (pkg) dl_pkg $pkg
155	case h
156		rcpm_help
157	case i
158		for (pkg) install_pkg $pkg
159	case l
160		switch($#*) {
161		case 0
162			for (file in $RCPM_ROOT/$RCPM_DB/*) {
163				pkg=`{basename $file}
164				get_local_ver
165				log $pkg $_ver-$_rev
166			}
167		case *
168			for (pkg) {
169				get_local_ver
170				log $pkg $_ver-$_rev
171			}
172		}
173	case m
174		cat $RCPM_ROOT/$RCPM_DB/$1/manifest
175	case r
176		for (pkg) rm_pkg $pkg
177	case s
178		for (pkg) find $RCPM_PATH -type d -name $pkg
179	case u
180		update_pkg
181	case *
182		rcpm_help
183		errexit 'Invalid arguement!'
184}