1#!/bin/sh 2#- 3# Copyright (c) 2014 The FreeBSD Foundation 4# All rights reserved. 5# 6# This software were developed by Glen Barber 7# under sponsorship from the FreeBSD Foundation. 8# 9# Redistribution and use in source and binary forms, with or without 10# modification, are permitted provided that the following conditions 11# are met: 12# 1. Redistributions of source code must retain the above copyright 13# notice, this list of conditions and the following disclaimer. 14# 2. Redistributions in binary form must reproduce the above copyright 15# notice, this list of conditions and the following disclaimer in the 16# documentation and/or other materials provided with the distribution. 17# 18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28# SUCH DAMAGE. 29# 30# $FreeBSD$ 31# 32 33set -C 34 35PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" 36export PATH 37 38usage() { 39 echo "Usage:" 40 echo -n "$(basename ${0}) [-rNNNNNN]" 41 echo " [-l /path/for/output] /path/to/branch" 42 echo " -r: The oldest commit to include in the search" 43 echo "" 44 exit 1 45} 46 47main() { 48 while getopts "l:r:" arg ; do 49 case ${arg} in 50 l) 51 # Disallow '-rNNNNNN' argument for oldest 52 # revision # from becoming the log file 53 # accidentally. 54 where="${OPTARG##-r*}" 55 [ -z "${where}" ] && usage 56 if [ -e "${where}" ]; then 57 echo "Log file already exists:" 58 echo " (${where})" 59 return 2 60 fi 61 ;; 62 r) 63 rev="${OPTARG##-r}" 64 c=$(echo -n ${rev} | tr -d '0-9' | wc -c) 65 if [ ${c} -ne 0 ]; then 66 echo "Revision number must be numeric." 67 return 2 68 fi 69 # Since the last specified revision is 70 # specified, mangle the variable to 71 # make svn syntax happy. 72 rev="-r${rev}:rHEAD" 73 ;; 74 *) 75 usage 76 ;; 77 esac 78 done 79 shift $(( ${OPTIND} - 1 )) 80 81 # This assumes a local working copy, which svn search 82 # allows exactly one repository path (although the root 83 # can still be the path). 84 [ "$#" -ne 1 ] && usage 85 86 # If no log file, write to stdout. 87 [ -z "${where}" ] && where=/dev/stdout 88 89 svn= 90 # Where is svn? 91 for s in /usr/bin /usr/local/bin; do 92 if [ -x ${s}/svn ]; then 93 svn=${s}/svn 94 break 95 fi 96 if [ -x ${s}/svnlite ]; then 97 svn=${s}/svnlite 98 break 99 fi 100 done 101 # Did we find svn? 102 if [ -z "${svn}" ]; then 103 echo "svn(1) binary not found." 104 return 2 105 fi 106 # Is more than one path specified? (This should never 107 # be triggered, because the argument count is checked 108 # above, but better safe than sorry.) 109 if [ $# -gt 1 ]; then 110 echo "Cannot specify more than one working path." 111 return 2 112 fi 113 # Does the directory exist? 114 if [ ! -d "${1}" ]; then 115 echo "Specified path (${1}) is not a directory." 116 return 2 117 fi 118 # Is it a subversion repository checkout? 119 ${svn} info ${1} >/dev/null 2>&1 120 if [ "$?" -ne 0 ]; then 121 echo "Cannot determine svn repository information for ${1}" 122 return 2 123 fi 124 125 # All tests passed. Let's see what can possibly go wrong 126 # from here. The search string specified should match this 127 # in PCRE speak: ':[\t ]*' 128 ${svn} log ${rev} --search 'Relnotes:*[A-Za-z0-9]*' ${1} > ${where} 129 return $? 130} 131 132main "${@}" 133exit $? 134