This commit is contained in:
Jaidyn Ann 2021-01-31 22:59:37 -06:00
commit ee7ab22140
2 changed files with 224 additions and 0 deletions

112
README.txt Normal file
View File

@ -0,0 +1,112 @@
================================================================================
SPACETEMPLATE
================================================================================
Spacetemplate lets you recursively apply a directory "template" to another
directory (on Haiku).
For example, let's say you are very particular in how your "Music" folder
windows look in Tracker― you need the "Music" folder to be a particular size, at
a particular spot, and you want all artists to be in another spot, and all
albums in another spot.
You could manually move and resize every folder in Music, but that's annoying.
Or you could write a script to apply a given template to all Music subdirectories.
 That's what this is. The template script.
========================================
USAGE
========================================
$ spacetemplate templatefolder folder
There are no arguments― it'll just apply the template folder to the folder.
========================================
TEMPLATES
========================================
A template folder hierarchy should look like the target folder's.
It'll copy the attributes from the template folder to the corresponding target,
for example:
template/Apple/ --> target/Apple/
template/Apple/Dad --> target/Apple/Dad/
template/Pear/Mom --> target/Pear/Mom/
If a folder is in the target but doesn't have a match in the template, it'll
be ignored.
There is a fallback: _default_
_default_ will match any folder in matches to its parent folder, as long
as there isn't a direct match.
So:
template/_default_/ --> target/Apple/
template/_default_/Dad/ --> target/Apple/Dad/
template/_default_/_default_/ --> target/Pear/Mom/
Keep in mind, though, that if there is a direct template for a folder, it won't
match a _default_ in the same parent directory. Default is for any folder there
is no direct match for.
template/_default_/ --> target/Pear/
template/Apple/ --> target/Apple/
Since there is a direct match to Apple, template/_default_/ won't be applied
to Apple. Only template/Apple/ will.
There is a wildcard, too: _all_
_all_ will match all (surprise) folders in its parent directory, even if they
have direct matches. It's basically _default_ applied to everything.
template/_default_/ --> target/Pear/
template/_all_/ --> target/Pear/
template/Apple/ --> target/Apple/
template/_all_/ --> target/Apple/
_default_ applies to Pear, but not Apple― _all_ applies to both Pear and Apple.
One more bit: _default_ and _all_ matches won't copy over the position of the
folder (trk/pinfo_le). Since if it did that, you'd end up with a bunch of
folders piled on top of each other. What a hassle.
Direct matches will copy location over, though.
The order of application is:
# _all_
# _default_
# Direct
If there is a direct match, it will apply after _all_. If there is a _default_,
it will apply before _all_.
========================================
EXAMPLE
========================================
Sooo back to the music organization problem…
Here's an example of how you'd solve that.
template/_default_/ --> Music/*/
template/_default_/_default_/ --> Music/*/*/
Kinda anti-climactic, for all that build-up…
Alright, let's make it more interesting.
"Rhapsody of Fire" is a band that's had several incarnations, so it would make
sense if you grouped all the Rhapsody derivatives into a single directory, as
an exception to the above rules.
template/Rhapsody/_default_/ --> Music/Rhapsody/*/
template/Rhapsody/_default_/_default_/ --> Music/Rhapsody/*/*/
Still not very interesting. Dang. Well, you get the point lol
========================================
BORING STUFF
========================================
MIT License
Jaidyn Ann, <jadedctrl@teknik.io>

112
spacetemplate Executable file
View File

@ -0,0 +1,112 @@
#!/bin/sh
# --------------------------------------
# name: spacetemplate
# main: <jadedctrl@teknik.io>
# lisc: MIT
# date: 2021
# --------------------------------------
# Recursively apply a template directory to a target directory.
function apply_template {
local template="$1"
local target="$2"
echo "$target…"
copy_template "$template" "$target"
apply_specific all "$template" "$target"
for file in "$template"/*; do
local basename="$(basename "$file")"
if test -d "${target}/$basename" \
-a ! "$basename" = '*'
then
if test -h "$file"; then file="$(readlink "$file")"; fi
apply_template "$file" "${target}/$basename"
fi
done
apply_specific default "$template" "$target"
}
# Check if a specific template folder (_all_ or _default_) exists for given
# template and target, and apply where necessary.
function apply_specific {
local type="$1"
local template="$2"
local target="$3"
if test -e "${template}/_${type}_"; then
local type_template="${template}/_${type}_"
if test -h "$type_template"; then
type_template="$(readlink "$type_template")"
fi
for file in "$target"/*; do
local basename="$(basename "$file")"
local apply=0
if test "$basename" = '*'; then break; fi
if test "$type" = "all"; then apply=1; fi
if test ! -d "${template}/$basename"; then apply=1; fi
if test "$apply" -eq 1; then
apply_template "$type_template" "$file" 0
fi
done
fi
}
# Actually copy over attributes from template file to target file
function copy_template {
local template="$1"
local target="$2"
if test ! -d "$target"; then return; fi
if test -h "$template"; then template="$(readlink "$template")"; fi
if test ! -d "$template"; then return; fi
catattr -r _trk/pinfo_le "$target" 2> /dev/null \
> "$TEMP"
copyattr "$template" "$target"
addattr -f "$TEMP" -t raw _trk/pinfo_le "$target" 2> /dev/null
echo "" \
> "$TEMP"
}
function help {
echo "usage: $(basename $0) [-h] templatedir directory"
echo
echo \
"Makes a target directory have attributes matching the templatedir, according
to certain rules. Useful if you're particular about where folders' windows
should be.
See the README for information on the structure of template dirs."
exit 1
}
while getopts ":h" arg; do
case $arg in
h) help;;
esac
done
shift $(($OPTIND - 1))
TEMPLATE=$1
TARGET=$2
if test -z "$TEMPLATE" -o -z "$TARGET"; then help; fi
if test ! -e "$TEMPLATE" -o ! -e "$TARGET"; then help; fi
TEMP="$(mktemp)"
apply_template "$TEMPLATE" "$TARGET"
rm "$TEMP"