pkgsrc-wip/import-package.sh

178 lines
5.0 KiB
Bash
Executable File

#! /bin/sh
#
# $Id: import-package.sh,v 1.12 2013/01/25 22:51:45 roelants Exp $
#
# Script designed to make add packages into wip easier.
#
# Just cd to the package directory and run ../import-package.sh
#
# It will automatically create a nice import message based on DESCR
# and PKGNAME, set up the CVS tags correctly and autodetect what CVSROOT
# to use. It also shows you what files will be imported, reminds you
# to run pkglint(1) and asks for confirmation before doing anything.
set -e
[ -n "${MKTEMP}" ] || MKTEMP=mktemp
[ -n "${EDITOR}" ] || EDITOR=vi
CLEANUP=""
DRYRUN="" # "echo dry-run:"
cleanup() {
if [ -n "${CLEANUP}" ]; then
rm -f ${CLEANUP}
fi
}
trap cleanup 0
if [ -z "${MAKE}" ]; then
if type bmake >/dev/null 2>&1; then
MAKE=bmake
else
MAKE=make
fi
fi
if [ ! -f "../../mk/bsd.pkg.mk" ]; then
echo "$0: ../../bsd.pkg.mk not found" 1>&2
exit 1
fi
stale=no
for cvsdir in $(find "$(pwd)" -type d -name CVS -print); do
echo "$0: stale CVS state directory found: ${cvsdir}" 1>&2
stale=yes
done
for gitdir in $(find "$(pwd)" -type d -name .git -print); do
echo "$0: stale git state directory found: ${gitdir}" 1>&2
stale=yes
done
for wrkdir in $(find "$(pwd)" -type d -name "work*" -print); do
echo "$0: stale work directory found: ${wrkdir}" 1>&2
stale=yes
done
if [ "${stale}" = "yes" ]; then
exit 1
fi
PACKAGE="$(basename $(pwd))"
CATEGORY="$(basename $(dirname $(pwd)))"
PKGPATH="${CATEGORY}/${PACKAGE}"
if [ "${CATEGORY}" = "wip" ]; then
SCM=GIT
if [ ! -d "../.git" ]; then
echo "$0: git state directory not found in ../.git" 1>&2
exit 1
fi
GIT_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
if [ "${GIT_BRANCH}" != "master" ]; then
echo "$0: ${GIT_BRANCH} is not the git master branch" 1>&2
exit 1
fi
if ! git config --get user.name > /dev/null; then
echo "$0: Please run 'git config --local user.name \"Your name here\"'" 1>&2
exit 1
fi
if ! git config --get user.email > /dev/null; then
echo "$0: Please run 'git config --local user.email \"you@example.com\"'" 1>&2
exit 1
fi
if git status | grep "Changes to be committed" > /dev/null; then
echo "$0: You have uncommitted changes staged!" 1>&2
echo "$0: Check output of 'git status'" 1>&2
exit 1
fi
if ! git fetch; then
echo "$0: git fetch failed"
fi
if ! git status -u no | grep "Your branch is up-to-date" > /dev/null; then
echo "$0: git repository does not appear to be up to date." 1>&2
echo "$0: You should probably run 'git pull --rebase'" 1>&2
echo "$0: and 'git push' (if you have unpushed work)" 1>&2
exit 1
fi
else
SCM=CVS
CVSROOT="$(cat ../CVS/Root | tr A-Z a-z | sed -e 's/.*@//')"
if [ "${CVSROOT}" != "cvs.netbsd.org:/cvsroot" ]; then
echo "$0: wrong CVS root" 1>&2
exit 1
fi
fi
MSG="$(${MKTEMP} -t import-package.XXXXXXXX)"
CLEANUP="${MSG}"
echo "Please wait while determining PKGNAME and DESCR_SRC."
PKGNAME="$(${MAKE} show-var VARNAME=PKGNAME)"
DESCR_SRC="$(${MAKE} show-var VARNAME=DESCR_SRC) /dev/null"
DASH70=----------------------------------------------------------------------
echo "${CATEGORY}/${PACKAGE}: import ${PKGNAME}" > ${MSG}
echo "" >> ${MSG}
cat ${DESCR_SRC} >> ${MSG}
echo "${SCM}: ${DASH70}" >> ${MSG}
echo "${SCM}: Please edit the above message to give a brief description" >> ${MSG}
echo "${SCM}: of the package for those who read the *-changes@ list." >> ${MSG}
echo "${SCM}: Did you remember to run pkglint(1) before importing?" >> ${MSG}
echo "${SCM}:" >> ${MSG}
echo "${SCM}: Lines starting with ${SCM}: will be automatically removed." >> ${MSG}
echo "${SCM}:" >> ${MSG}
ADDLIST="$(${MKTEMP} -t import-package-files.XXXXXXXX)"
CLEANUP="${CLEANUP} ${ADDLIST}"
(
cd ..
if [ "${SCM}" = "GIT" ]; then
find ${PACKAGE} -type f -print
else
find ${PACKAGE} \( -type d \) -print | sed 's,$,/,'
find ${PACKAGE} \( -type f \) -print
fi
) | sed -e '/^\./d' -e '/\/CVS/d' -e '/[^+-_,./a-zA-Z0-9]/d' | sort > ${ADDLIST}
sed "s|^|${SCM}: will add: ${CATEGORY}/|" ${ADDLIST} >> ${MSG}
${EDITOR} ${MSG}
echo "Edited message follows:"
echo ${DASH70}
grep -v "^${SCM}:" < ${MSG}
echo ${DASH70}
echo "PKGPATH: ${PKGPATH}"
if [ "${SCM}" = "GIT" ]; then
echo "GIT_BRANCH: ${GIT_BRANCH}"
else
echo "CVSROOT: ${CVSROOT}"
fi
echo ""
printf "y + enter to import, any other text + enter to abort> "
read ANS
if [ "${ANS}" = "y" ]; then
if [ "${SCM}" = "GIT" ]; then
(
cd ..
cat ${ADDLIST} | xargs -L 100 ${DRYRUN} git add
${DRYRUN} git commit -m "$(grep -v "^${SCM}:" ${MSG})" ${PACKAGE}
${DRYRUN} git push
)
else
(
cd ..
export CVS_RSH=ssh
[ -e "${PACKAGE}/CVS" ] || ${DRYRUN} cvs add ${PACKAGE} || exit 1
grep '/$' ${ADDLIST} | fgrep -vx ${PACKAGE}/ |
xargs -L 100 ${DRYRUN} cvs add
grep -v '/$' ${ADDLIST} | xargs -L 100 ${DRYRUN} cvs add
${DRYRUN} cvs commit -m "$(grep -v "^${SCM}:" ${MSG})" ${PACKAGE}
)
fi
echo ${DASH70}
echo "Don't forget to add the package to ${CATEGORY}/Makefile."
echo "When imported to pkgsrc itself, please update the CHANGES-*"
echo "file and possibly remove the package from the TODO list."
echo ""
fi