initial commit.
This commit is contained in:
commit
259d48d3b1
|
@ -0,0 +1,2 @@
|
||||||
|
pkg/
|
||||||
|
default/
|
|
@ -0,0 +1,20 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright 2020 "yafox"
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,44 @@
|
||||||
|
# how.sh
|
||||||
|
|
||||||
|
takes a package name, a version, and a path. mounts scripts for patching,
|
||||||
|
configuring, building, and installing the given version of the package at the
|
||||||
|
given path in read-only mode using either overlayfs or, if no package-specific
|
||||||
|
scripts were found, a bind mount.
|
||||||
|
|
||||||
|
dependencies: `shsort` and `vercmp`, as well as 'how-defaults' and 'how-pkgs'
|
||||||
|
repositories. (see makefile.)
|
||||||
|
|
||||||
|
55 SLOC.
|
||||||
|
|
||||||
|
usage: how <package> <version> <path>
|
||||||
|
|
||||||
|
## package structure
|
||||||
|
|
||||||
|
if a package or version is not recognized, how.sh will bind-mount the `default`
|
||||||
|
directory in read-only mode at the requested path. a package and version is
|
||||||
|
recognized based on the presence of a subdirectory in the `pkg` directory
|
||||||
|
matching the package name with a subdirectory whose name translates to a version
|
||||||
|
equal to or less than version of the package requested, or a subdirectory named
|
||||||
|
`default`. the structure looks something like this:
|
||||||
|
|
||||||
|
pkg/
|
||||||
|
|-- <package>/
|
||||||
|
| |-- <version>/
|
||||||
|
...
|
||||||
|
|
||||||
|
`version` is matched using `vercmp`. if `vercmp` has a format that matches the
|
||||||
|
package name, then that format is used to compare versions for the package.
|
||||||
|
otherwise, the default comparison function is used.
|
||||||
|
|
||||||
|
the version directories are sorted using `shsort` and `vercmp` and mounted as an
|
||||||
|
overlay filesystem with the lower versions being lower in the overlay and higher
|
||||||
|
versions being higher. `default` package subdirectories are always one layer
|
||||||
|
above the `default` directory; the `default` directory is always lowest.
|
||||||
|
|
||||||
|
## patches
|
||||||
|
|
||||||
|
multiple patches may be offered in a package. by convention, patches are kept
|
||||||
|
in the `patches` subdirectory of the package root. the default `patch` command
|
||||||
|
looks for a single combined patch, likely constructed by concatenating or
|
||||||
|
otherwise combining offered patches, under the filename `patch` in the package
|
||||||
|
root.
|
|
@ -0,0 +1,6 @@
|
||||||
|
usage: $(basename $0) <package> <version> [<path>]
|
||||||
|
|
||||||
|
arguments:
|
||||||
|
<package>: name of the package to examine.
|
||||||
|
<version>: version of the package to examine.
|
||||||
|
[<path>]: mount path for 'how' scripts. prints "lowerdir" string if omitted.
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
HOWROOT="${HOWROOT:-$(dirname "$(readlink -f "$0")")}"
|
||||||
|
|
||||||
|
if [ ! -d "$HOWROOT" ]; then
|
||||||
|
echo "$HOWROOT is not a directory!" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
{ [ "$1" ] && [ "$2" ]; } \
|
||||||
|
|| { eval "echo \"$(cat "$HOWROOT/USAGE")\"" && exit 0; }
|
||||||
|
|
||||||
|
. "$HOWROOT/lib/log.sh"
|
||||||
|
|
||||||
|
pkg="$1"
|
||||||
|
ver="$2"
|
||||||
|
tgt="$3"
|
||||||
|
|
||||||
|
if [ "$tgt" ] && [ ! -d "$tgt" ]; then
|
||||||
|
echo "$tgt isn't a directory!" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
{ vercmp formats | grep -q "^$pkg"; } \
|
||||||
|
&& fmt="$pkg" \
|
||||||
|
|| fmt="default"
|
||||||
|
|
||||||
|
[ ! -d "$HOWROOT/pkg/$pkg/default" ] || layers="$HOWROOT/pkg/$pkg/default:"
|
||||||
|
|
||||||
|
if [ -d "$HOWROOT/pkg/$pkg" ]; then
|
||||||
|
layers="$(ls -d $HOWROOT/pkg/$pkg/*/ \
|
||||||
|
| rev | cut -d/ -f2 | rev \
|
||||||
|
| shsort "vercmp -f $fmt" \
|
||||||
|
| while read dir; do
|
||||||
|
[ "$dir" ] || continue;
|
||||||
|
[ "$dir" != "default" ] || continue;
|
||||||
|
|
||||||
|
if [ "$(vercmp -f "$fmt" "$dir <= $ver")" = "yes" ]; then
|
||||||
|
printf "$HOWROOT/pkg/$pkg/$dir:"
|
||||||
|
fi
|
||||||
|
|
||||||
|
done)$layers"
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ "$tgt" ] || { echo "$layers$HOWROOT/default" && exit 0; }
|
||||||
|
|
||||||
|
# mounting an overlayfs fails if only given a single lower directory, so use a
|
||||||
|
# read-only bind mount if just mounting the default scripts directory. the
|
||||||
|
# behaviour of a read-only bind mount should be roughly equivalent to an
|
||||||
|
# overlayfs mounted with a single lower directory and no upper directory. (the
|
||||||
|
# only difference which comes to mind is that a bind mount does not count
|
||||||
|
# against overlayfs' nesting limit.)
|
||||||
|
if [ "$layers" ]; then
|
||||||
|
mount -t overlay -o lowerdir="$layers$HOWROOT/default" none "$tgt"
|
||||||
|
else
|
||||||
|
mount -o ro,bind "$HOWROOT/default" "$tgt"
|
||||||
|
fi
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
err() {
|
||||||
|
>&2 echo "[ERR] $1"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
>&2 echo "[WRN] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[LOG] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
debug() {
|
||||||
|
[ -z "$DEBUG" ] || echo "[DBG] $1"
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
SRCDIR = $(dir $(realpath $(firstword $(MAKEFILE_LIST))))
|
||||||
|
PREFIX ?= /usr
|
||||||
|
HOWROOT ?= $(PREFIX)/share/how
|
||||||
|
DESTDIR ?= $(PREFIX)/bin
|
||||||
|
GITBASE ?= $(shell realpath $(shell git config --get remote.origin.url) | rev \
|
||||||
|
| cut -d/ -f2- | rev)
|
||||||
|
|
||||||
|
.PHONY: install uninstall lix-os-how
|
||||||
|
|
||||||
|
lix-os-how: lix-os-defaults lix-os-pkgs
|
||||||
|
|
||||||
|
lix-os-defaults:
|
||||||
|
git clone $(GITBASE)/how-lix-os-defaults default
|
||||||
|
|
||||||
|
lix-os-pkgs:
|
||||||
|
git clone $(GITBASE)/how-lix-os-pkgs pkg
|
||||||
|
|
||||||
|
install:
|
||||||
|
ln -sf $(SRCDIR) $(HOWROOT)
|
||||||
|
ln -sf $(HOWROOT)/how.sh $(DESTDIR)/how
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm $(DESTDIR)/how
|
||||||
|
rm $(HOWROOT)
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# find all *.sh files not under `pkg` that are not symbolic links, strip all
|
||||||
|
# trailing whitespace, then all leading whitespace, then all lines starting
|
||||||
|
# with '#', then all empty lines. then count the remaining lines.
|
||||||
|
|
||||||
|
find . -name "*.sh" ! -path "**/pkg/**" ! -path "**/default/**" ! -type l \
|
||||||
|
| xargs sed 's/[[:space:]]*$//g; s/^[[:space:]]*//g; s/^#.*$//g; /^$/d' \
|
||||||
|
| wc -l - \
|
||||||
|
| cut -d' ' -f1
|
||||||
|
|
||||||
|
# note that this script's ELOC is also included in the count.
|
Loading…
Reference in New Issue