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}