Added design() function to manage synchronization of design development assets for git repos, without checking them in
This commit is contained in:
107
lib/design.sh
Normal file
107
lib/design.sh
Normal file
@@ -0,0 +1,107 @@
|
||||
# -------------------------------------------------------
|
||||
# Design Assets Management (for Git projects)
|
||||
# Written by Nathan Broadbent (www.madebynathan.com)
|
||||
# -------------------------------------------------------
|
||||
#
|
||||
# * The `design` function manages the 'design assets' directories for the current project,
|
||||
# including folders such as Backgrounds, Logos, Icons, and Samples. The actual directories are
|
||||
# created in the root design directory, symlinked into the project, and ignored from source control.
|
||||
# This is because we usually don't want to check in design development files such as bitmaps or wav files.
|
||||
# It also gives us the option to sync the root design directory via Dropbox.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# $ design link # Requires SCM Breeze - Links existing design directories into each of your projects
|
||||
# $ design init # Creates default directory structure at $root_design_dir/**/ubuntu_config and symlinks into project.
|
||||
# (Images Backgrounds Logos Icons Mockups Screenshots)
|
||||
# $ design init --av # Creates extra directories for audio/video assets
|
||||
# (Images Backgrounds Logos Icons Mockups Screenshots Animations Videos Flash Music Samples)
|
||||
# $ design rm # Removes any design directories for ubuntu_config
|
||||
# $ design trim # Trims empty design directories for ubuntu_config
|
||||
#
|
||||
|
||||
|
||||
# Add ignore rule to .git/info/exclude if not already present
|
||||
_design_add_git_exclude(){
|
||||
if [ -e "$1/.git/info/exclude" ] && ! $(grep -q "$project_design_dir" "$1/.git/info/exclude"); then
|
||||
echo "$project_design_dir" >> "$1/.git/info/exclude"
|
||||
fi
|
||||
}
|
||||
|
||||
# Manage design directories for project.
|
||||
design() {
|
||||
local project=`basename $(pwd)`
|
||||
local all_project_dirs="$design_base_dirs $design_av_dirs"
|
||||
# Ensure design dir contains all subdirectories
|
||||
unset IFS
|
||||
for dir in $design_ext_dirs $design_base_dirs $design_av_dirs; do mkdir -p "$root_design_dir/$dir"; done
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "design: Manage design directories for project assets that are external to source control."
|
||||
echo
|
||||
echo " Examples:"
|
||||
echo
|
||||
echo " $ design init # Creates default directory structure at $root_design_dir/**/$project and symlinks into project."
|
||||
echo " ($design_base_dirs)"
|
||||
echo " $ design link # Links existing design directories into existing repos"
|
||||
echo " $ design init --av # Adds extra directories for audio/video assets"
|
||||
echo " ($design_base_dirs $design_av_dirs)"
|
||||
echo " $ design rm # Removes any design directories for $project"
|
||||
echo " $ design trim # Trims empty design directories for $project"
|
||||
echo
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ "$1" = "init" ]; then
|
||||
create_dirs="$design_base_dirs"
|
||||
if [ "$2" = "--av" ]; then create_dirs+=" $design_av_dirs"; fi
|
||||
echo "Creating the following design directories for $project: $create_dirs"
|
||||
mkdir -p "$project_design_dir"
|
||||
# Create and symlink each directory
|
||||
for dir in $create_dirs; do
|
||||
mkdir -p "$root_design_dir/$dir/$project"
|
||||
if [ ! -e ./$project_design_dir/$dir ]; then ln -sf "$root_design_dir/$dir/$project" $project_design_dir/$dir; fi
|
||||
done
|
||||
_design_add_git_exclude $PWD
|
||||
|
||||
elif [ "$1" = "link" ]; then
|
||||
enable_nullglob
|
||||
echo "== Linking existing Design directories into existing repos..."
|
||||
for dir in $all_project_dirs; do
|
||||
for design_path in $root_design_dir/$dir/*; do
|
||||
proj=$(basename $design_path)
|
||||
repo_path=$(grep "/$proj$" $GIT_REPO_DIR/.git_index)
|
||||
if [ -n "$repo_path" ]; then
|
||||
mkdir -p "$repo_path/$project_design_dir"
|
||||
if [ -e "$repo_path/$project_design_dir/*" ]; then rm $repo_path/$project_design_dir/*; fi
|
||||
_design_add_git_exclude $repo_path
|
||||
if ! [ -e "$repo_path/$project_design_dir/$dir" ]; then ln -fs "$design_path" "$repo_path/$project_design_dir/$dir"; fi
|
||||
echo "=> $repo_path/$project_design_dir/$dir"
|
||||
fi
|
||||
done
|
||||
done
|
||||
disable_nullglob
|
||||
|
||||
elif [ "$1" = "rm" ]; then
|
||||
echo "Removing all design directories for $project..."
|
||||
for dir in $all_project_dirs; do rm -rf "$root_design_dir/$dir/$project"; done
|
||||
rm -rf $project_design_dir
|
||||
|
||||
elif [ "$1" = "trim" ]; then
|
||||
echo "Trimming empty design directories for $project..."
|
||||
for dir in $(find -L $project_design_dir/ -type d -empty); do
|
||||
asset=$(basename $dir)
|
||||
rm -rf "$root_design_dir/$asset/$project"
|
||||
rm -f $project_design_dir/$asset
|
||||
done
|
||||
# Remove design dir from project if there's nothing in it.
|
||||
if find $project_design_dir -type d -empty | grep -q $project_design_dir; then
|
||||
rm -rf $project_design_dir
|
||||
fi
|
||||
|
||||
else
|
||||
printf "Invalid command.\n\n"
|
||||
design
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -5,6 +5,9 @@ if [ $shell = "zsh" ]; then zsh_shwordsplit=$( (setopt | grep -q shwordsplit) &&
|
||||
# Switch on/off shwordsplit for functions that require it.
|
||||
zsh_compat(){ if [ $shell = "zsh" ] && [ -z $zsh_shwordsplit ]; then setopt shwordsplit; fi; }
|
||||
zsh_reset(){ if [ $shell = "zsh" ] && [ -z $zsh_shwordsplit ]; then unsetopt shwordsplit; fi; }
|
||||
# Enable/disable nullglob for zsh or bash
|
||||
enable_nullglob() { if [ $shell = "zsh" ]; then setopt NULL_GLOB; else shopt -s nullglob; fi; }
|
||||
disable_nullglob() { if [ $shell = "zsh" ]; then unsetopt NULL_GLOB; else shopt -u nullglob; fi; }
|
||||
|
||||
# Alias wrapper that ignores errors if alias is not defined.
|
||||
_alias(){ alias "$@" 2> /dev/null; }
|
||||
@@ -27,22 +30,23 @@ update_scm_breeze() {
|
||||
# Create '~/.*.scmbrc' files, or attempt to patch them if passed a previous revision
|
||||
_create_or_patch_scmbrc() {
|
||||
patchfile=$(mktemp -t tmp.XXXXXXXXXX)
|
||||
for scm in git; do
|
||||
# Process '~/.scmbrc' and '~/.*.scmbrc'
|
||||
for prefix in "" "git."; do
|
||||
# Create file from example if it doesn't already exist
|
||||
if ! [ -e "$HOME/.$scm.scmbrc" ]; then
|
||||
cp "$scmbDir/$scm.scmbrc.example" "$HOME/.$scm.scmbrc"
|
||||
printf "== '~/.$scm.scmbrc' has been created. Please edit this file to change SCM Breeze settings for '$scm'.\n"
|
||||
if ! [ -e "$HOME/.$prefix""scmbrc" ]; then
|
||||
cp "$scmbDir/$prefix""scmbrc.example" "$HOME/.$prefix""scmbrc"
|
||||
printf "== '~/.$prefix""scmbrc' has been created. Please edit this file to change SCM Breeze settings.\n"
|
||||
# If file exists, attempt to update it with any new settings
|
||||
elif [ -n "$1" ]; then
|
||||
# Create diff of example file, substituting example file for user's config.
|
||||
git diff $1 "$scm.scmbrc.example" | sed "s/$scm.scmbrc.example/.$scm.scmbrc/g" > $patchfile
|
||||
git diff $1 "$prefix""scmbrc.example" | sed "s/$prefix""scmbrc.example/.$prefix""scmbrc/g" > $patchfile
|
||||
if [ -s $patchfile ]; then # If patchfile is not empty
|
||||
cd $HOME
|
||||
# If the patch cannot be applied cleanly, show the updates and tell user to update file manually.
|
||||
if ! patch -f "$HOME/.$scm.scmbrc" $patchfile; then
|
||||
printf "== \e[0;31mUpdates could not be applied to '\e[1m~/.$scm.scmbrc\e[0;31m'.\e[0m\n"
|
||||
printf "== Please look at the following changes and manually update '~/.$scm.scmbrc', if necessary.\n\n"
|
||||
cat "$HOME/.$scm.scmbrc.rej"
|
||||
if ! patch -f "$HOME/.$prefix""scmbrc" $patchfile; then
|
||||
printf "== \e[0;31mUpdates could not be applied to '\e[1m~/.$prefix""scmbrc\e[0;31m'.\e[0m\n"
|
||||
printf "== Please look at the following changes and manually update '~/.$prefix""scmbrc', if necessary.\n\n"
|
||||
cat "$HOME/.$prefix""scmbrc.rej"
|
||||
fi
|
||||
cd "$scmbDir"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user