diff options
Diffstat (limited to 'merge-helpers/commit')
-rwxr-xr-x | merge-helpers/commit | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/merge-helpers/commit b/merge-helpers/commit new file mode 100755 index 0000000..8d32ebc --- /dev/null +++ b/merge-helpers/commit @@ -0,0 +1,171 @@ +#! /bin/sh +# +# Recurse from current directory assisting in generating ChangeLog entries +# and committing files to the Source Code Repository. +# +# TODO: +# + Currently supports CVS and git. Could add svn +# + +progname=${0##*/} +usage() +{ + echo "$progname [-dlq] [-e editor] [-u user] [-m message] [-M msgfile]" + echo "options:" + echo " -d .. debug, don't delete change files"; + echo " -q .. quiet, don't display directories"; + echo " -l .. local directory only"; + echo " -m message .. text to use for modified files"; + echo " -M msgfile .. file containing to use for modified files"; + echo " -u user .. use user instead of LOGNAME"; + echo " -U user .. use explicit user info -- not from passwd"; + echo " -p PR .. PR info"; + echo " -c CID .. Coverity Id number"; + echo + exit 1 +} + +# Determine VCS in use +if [ -d .git ] ; then + VCS=git +elif [ -d CVS ] ; then + VCS=cvs +else + echo "This does not look like a checkout from a VCS I understand." + exit 1 +fi + +editor="vim" +changefile="changes-xxx" +rem_changes="yes" +quiet="no" +user=$LOGNAME +mkchoptions="-n" +message= +localdir="no" +while getopts dlqe:M:m:u:U:p:c: OPT +do + case "$OPT" in + d) rem_changes="yes" ;; + e) editor=$OPTARG ;; + l) localdir="yes" ;; + m) message=$OPTARG ;; + M) message=`cat $OPTARG` ;; + q) quiet="yes" ;; + u) user=$OPTARG ; mkchoptions=${mkchoptions}" -u ${user}" ;; + U) userArg="-U" userInfo=$OPTARG ;; + p) PrInfo=$OPTARG ; mkchoptions=${mkchoptions}" -p ${PrInfo}" ;; + c) CoverityInfo=$OPTARG ; mkchoptions=${mkchoptions}" -c ${CoverityInfo}" ;; + *) usage ;; + esac +done + +export message +let $((shiftcount = $OPTIND - 1)) +shift #shiftcount + +args=$* + +# find ChangeLogs and print them by depth +get_subdirs() +{ + find . -name ChangeLog | while read f + do + case $1 in + */*/*/*/*/*/*/*/*/*) d=9 ;; + */*/*/*/*/*/*/*/*) d=8 ;; + */*/*/*/*/*/*/*) d=7 ;; + */*/*/*/*/*/*) d=6 ;; + */*/*/*/*/*) d=5 ;; + */*/*/*/*) d=4 ;; + */*/*/*) d=3 ;; + */*/*) d=2 ;; + */*) d=1 ;; + *) d=0 ;; + esac + echo ${d} ${f} + done | sort -n -r | cut -d' ' -f2- | while read f + do + dirname $f + done +} +if [ ${localdir} = "yes" ] ; then + subdirs="." +else + subdirs=`get_subdirs` +fi + +# Make sure we have user information +if test "X${userInfo}" = "X" ; then + user_name=`grep ^${user} /etc/passwd | cut -d':' -f5 | cut -d',' -f1` + if test "X${user_name}" = "X" ; then + echo "User information not set" + usage + fi +fi + +commit() +{ + if [ $? -ne 0 ] ; then + return + fi + + prepend ${changefile} + + # Specify VCS support directory + case ${VCS} in + cvs) + ${CVS} up ChangeLog + cvs commit -F ${changefile} + ;; + git) + echo "git commit -F ${changefile}" + git commit -a -F ${changefile} + ;; + *) echo "${VCS} to be implemented" ; exit 1 ;; + esac +} + +# Specify VCS support directory +case ${VCS} in + cvs) VCSDIR=CVS ;; + git) VCSDIR=.git ;; + *) + echo "${VCS} to be implemented" + exit 1 + ;; +esac + +for ddir in ${subdirs} ; do + test "${ddir}" = "${VCSDIR}" && continue + test "${ddir}" = "autom4te.cache" && continue + test "${ddir}" = "install" && continue + if [ -d "${ddir}" ]; then + if [ ! -d "${ddir}/${VCSDIR}" ] ; then + echo "WARNING - ${ddir} is not in .git" + continue + fi + test -f "${ddir}/ChangeLog" || continue + cd "$ddir" >/dev/null + mkChangeLogList ${mkchoptions} ${userArg} "${userInfo}" \ + -m "${message}" >${changefile} + test $? -ne 0 && continue + while test -s ${changefile} ; do + fullpath=`pwd` + test "$quiet" = "no" && echo "** directory: $fullpath **" + cat ${changefile} + response="n" + read -p "Commit changes? [y/n/e(edit)]: " response + case ${response} in + y) commit; break ;; + n) break ;; + e) ${editor} ${changefile} ;; + *) echo "*** enter y,n, or e ***" ;; + esac + done + test $rem_changes = "yes" && rm -rf $changefile + cd - >/dev/null + fi +done + + |