Init
This commit is contained in:
commit
ee7ab22140
|
@ -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>
|
|
@ -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"
|
Ŝarĝante…
Reference in New Issue