177 lines
5 KiB
Bash
Executable file
177 lines
5 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 "Import ${PKGNAME} as ${CATEGORY}/${PACKAGE}." > ${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
|