243 lines
6.4 KiB
Bash
Executable File
243 lines
6.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# /etc/profile.d/dev-perso
|
|
#
|
|
# (c) 2006-2008, mmu_man
|
|
#
|
|
# project-specific environment handling:
|
|
# - sources project-specific .profile,
|
|
# - maintains project-specific .bash_history with bigger default size,
|
|
# to avoid mixing command histories
|
|
# - pushes "cvs up -d" or "svn up" or "p4 sync" as last history command
|
|
# for quick access
|
|
# - has a nice prompt
|
|
# - lowers shell priority on BeOS to limit the effects of svn or jam on
|
|
# the gui
|
|
# - automatically completes project names on the "dev" function
|
|
# from project subfolders containing a .profile
|
|
#
|
|
# This script should be sourced by bash, either from /etc/profile
|
|
# (in /etc/profile.d/) or your own .bashrc or .profile
|
|
# after exporting DEVROOT optionally to point to the projects folder.
|
|
#
|
|
# setup:
|
|
# - edit DRLIST below to include your own possible devroots
|
|
# (ie. where you have subfolders for your own projects)
|
|
# or export DEVROOT before sourcing dev-perso.
|
|
# - optionally edit PWLIST below to where you possibly have a
|
|
# PASSWDS/ folder with passwords stored as plain text.
|
|
# (not really a good idea though :) It's exported
|
|
# for use by project's .profile
|
|
# - optionally force EDITOR globally (for all projects)
|
|
# - for each project create a .profile in the subfolder,
|
|
# which might include commands like the following, but can remain empty.
|
|
# usually it will just contain a "cd" to the source/trunk subfolder...
|
|
#
|
|
# # force svn ssh user for this project
|
|
# export SVN_SSH='ssh -l myuser'
|
|
#
|
|
# # force CVSROOT for this project
|
|
# export CVSROOT='...'
|
|
#
|
|
# # shortcut to display password file for this svn
|
|
# alias pass="cat $PASSWDS/myself.developer.berlios.de.pass"
|
|
#
|
|
# # change to the source tree
|
|
# cd trunk
|
|
# # ease use of cd
|
|
# export CDPATH=":$PWD"
|
|
#
|
|
# Now you just have to type:
|
|
# dev h[TAB]
|
|
# to complete to "dev haiku", [RET] and you'll get the history from the
|
|
# last time you worked on it, and everything set up.
|
|
|
|
|
|
# automagically find them on different machines...
|
|
if [ -z "$DEVROOT" ]; then
|
|
DRLIST="$HOME/devel /Data /work /Volumes/Data/devel"
|
|
for d in $DRLIST; do
|
|
test -d "$d" && DEVROOT="$d" && break;
|
|
done
|
|
fi
|
|
export DEVROOT
|
|
|
|
# automagically find password files
|
|
PWLIST="/Data /fat32 $HOME"
|
|
for d in $PWLIST; do
|
|
test -d "$d/PASSWDS" && PASSWDS="$d/PASSWDS" && break;
|
|
done
|
|
export PASSWDS
|
|
|
|
# svn sometimes forgets about vi and wants me to use nano...
|
|
#export EDITOR=vim
|
|
|
|
dev() {
|
|
if [ $# -lt 1 ]; then
|
|
#ls $DEVROOT/*/.profile | sed 's,.*/\([^/]*\)/.profile,\1,'
|
|
for f in "$DEVROOT/"*; do test -e "$f/.profile" || continue; echo ${f##*/}; done
|
|
return 0
|
|
fi
|
|
if [ "x$1" = "x--help" ]; then
|
|
echo "setup project-specific development environment"
|
|
echo "usage: dev [-n] [project]"
|
|
echo "running without argument lists available projects"
|
|
echo "-n projname initializes a new project"
|
|
return 1
|
|
fi
|
|
if [ "x$1" = "x-n" -a -n "$2" ]; then
|
|
shift
|
|
mkdir "$DEVROOT/$1" && touch "$DEVROOT/$1/.profile"
|
|
# fallback
|
|
fi
|
|
|
|
export DEVPROJ="$1"
|
|
if [ ! -d "$DEVROOT/$1" ]; then
|
|
echo "invalid project name '$1'"
|
|
return 1
|
|
fi
|
|
|
|
# change to the project root folder
|
|
cd "$DEVROOT/$1"
|
|
|
|
# use a specific history file
|
|
export HISTFILE="$DEVROOT/$1/.bash_history"
|
|
# and bump up the history limits
|
|
export HISTSIZE=1000
|
|
export HISTFILESIZE=100000
|
|
export HISTCONTROL=ignoreboth
|
|
# and force loading the new histfile
|
|
history -r
|
|
|
|
# force default locale so that compiler errors and such are reported in english
|
|
#export LC_ALL=C.UTF-8
|
|
|
|
# set the prompt
|
|
# cf. http://tldp.org/HOWTO/Bash-Prompt-HOWTO/
|
|
NICEPS1='\[\033[1m\][\u@\h \w]\[\033[0m\]\$ '
|
|
case "$TERM" in
|
|
dumb|emacs)
|
|
# simpler prompt
|
|
export PS1='[\u@\h \w]\$ '
|
|
;;
|
|
linux)
|
|
export PS1="$NICEPS1"
|
|
;;
|
|
*)
|
|
# prompt: set window title to [project:folder] also
|
|
#export PS1='\[\033]0;['$1':\W]\a\]\[\033[1m\][\u@\h \w]\[\033[0m\]\$ '
|
|
#export PS1='\033]0;['$1':\W]\a\033[1m[\u@\h \w]\033[0m\$ '
|
|
export PS1="$NICEPS1"
|
|
export PROMPT_COMMAND='echo -en "\033]0;['$1':${PWD##*/}]\a"'
|
|
;;
|
|
esac
|
|
|
|
# lower priority so background builds don't slow the GUI too much
|
|
case "$OSTYPE" in
|
|
beos|haiku)
|
|
prio $$ 1
|
|
;;
|
|
darwin10.*)
|
|
renice 3 $$
|
|
;;
|
|
linux-*)
|
|
# linux doesn't really need it much
|
|
#renice 3 $$
|
|
;;
|
|
esac
|
|
|
|
DEVUPCMD=""
|
|
|
|
# source the specific profile file
|
|
test -f .profile && . .profile
|
|
|
|
# if no editor defined, set one
|
|
test -z "$EDITOR" -a -z "$SVN_EDITOR" && export EDITOR=vim
|
|
|
|
# make sure the update action is the first found in history.
|
|
test -z "$DEVUPCMD" -a -d .svn && DEVUPCMD="svn up"
|
|
test -z "$DEVUPCMD" -a -d .bzr && DEVUPCMD="bzr update"
|
|
test -z "$DEVUPCMD" -a -d .hg && DEVUPCMD="hg pull"
|
|
test -z "$DEVUPCMD" -a -d .git && DEVUPCMD="git pull"
|
|
test -z "$DEVUPCMD" -a -d CVS && DEVUPCMD="cvs up -d"
|
|
test -z "$DEVUPCMD" -a \( -f _FOSSIL_ -o -f .fslckout \) && DEVUPCMD="fossil update"
|
|
test -z "$DEVUPCMD" -a -n "$P4PORT" && DEVUPCMD="p4 sync"
|
|
test -n "$DEVUPCMD" && history -s "$DEVUPCMD"
|
|
|
|
# spice up terminal window title for git, add current branch name
|
|
test -d .git && PROMPT_COMMAND='echo -en "\033]0;['$DEVPROJ':`git branch 2>/dev/null | sed "/^[^*]/d;s/^\*\s//"`:${PWD##*/}]\a"'
|
|
}
|
|
|
|
complete -W complete -W "$(dev)" dev
|
|
|
|
_devup_notify() {
|
|
echo "#### $*" >&2
|
|
}
|
|
|
|
devup() {
|
|
if [ $# -lt 1 ]; then
|
|
#ls $DEVROOT/*/.profile | sed 's,.*/\([^/]*\)/.profile,\1,'
|
|
for f in "$DEVROOT/"*; do
|
|
test -e "$f/.profile" || continue
|
|
grep "^# AUTOUP$" "$f/.profile" > /dev/null 2>&1 || continue
|
|
p="${f##*/}"
|
|
_devup_notify "Updating $p..."
|
|
devup "$p" && _devup_notify "Updated $p: OK" || (_devup_notify "Updating $p: Error: $?"; read)
|
|
done
|
|
return 0
|
|
fi
|
|
|
|
# subshell!!!
|
|
(
|
|
|
|
export DEVPROJ="$1"
|
|
if [ ! -d "$DEVROOT/$1" ]; then
|
|
echo "invalid project name '$1'"
|
|
return 1
|
|
fi
|
|
|
|
# change to the project root folder
|
|
cd "$DEVROOT/$1"
|
|
|
|
# lower priority so background builds don't slow the GUI too much
|
|
case "$OSTYPE" in
|
|
beos|haiku)
|
|
prio $$ 1
|
|
;;
|
|
darwin10.*)
|
|
renice 3 $$
|
|
;;
|
|
linux-*)
|
|
# linux doesn't really need it much
|
|
#renice 3 $$
|
|
;;
|
|
esac
|
|
|
|
DEVUPCMD=""
|
|
|
|
# source the specific profile file
|
|
test -f .profile && . .profile
|
|
|
|
# make sure the update action is the first found in history.
|
|
if [ -z "$DEVUPCMD" ]; then
|
|
test -d .svn && DEVUPCMD="svn up"
|
|
test -d .bzr && DEVUPCMD="bzr update"
|
|
test -d .hg && DEVUPCMD="hg pull"
|
|
test -d .git && DEVUPCMD="git pull"
|
|
test -d CVS && DEVUPCMD="cvs up -d"
|
|
test -n "$P4PORT" && DEVUPCMD="p4 sync"
|
|
fi
|
|
|
|
test -n "$DEVUPCMD" || return 7
|
|
|
|
# run the update command...
|
|
eval "$DEVUPCMD"
|
|
|
|
return $?
|
|
)
|
|
|
|
return $?
|
|
}
|
|
|
|
complete -W complete -W "$(dev)" devup
|
|
|