#!/usr/bin/env zsh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. set -e # setup 0=${0:t}; NAME=$0 svn=${SVN:-svn} svnadmin=${SVNADMIN:-svnadmin} usage() { echo "usage: $NAME -r N:M" echo " will retrieve all log messages in the range rN:rM, open them in" echo " \$EDITOR, and commit any edits to them." echo "" echo " Run this with cwd being a working copy of ^/subversion/trunk." # TODO: We only need the cwd in case SVN_CLIENT__REVKIND_NEEDS_WC() is true # for N or M. When N and M are both numeric or HEAD, teach this script # to disregard its cwd and contact ^/subversion/trunk directly. } # parse argv while getopts r: letter; do if [[ $letter == r ]]; then revision_range=$OPTARG else usage >&2 exit 1 fi done shift $((OPTIND - 1)) [[ -n $revision_range ]] || { usage >&2; exit 1; } # get log messages cd "$(mktemp -d)" echo "${0}: Temporary directory: ${(q-)PWD}" revisions=( ${(f)"$( # We use $OLDPWD rather than a URL in case $revision_range is, say, # "BASE:HEAD". $svn log -q -r $revision_range -- $OLDPWD | grep '^r' | cut -d' ' -f1 | grep '^r[0-9]*$' )"} ) for rN in $revisions; do $svn propget --revprop -r $rN --strict 'svn:log' -- $OLDPWD > ./$rN & done wait # set up to detect which ones have changed $svnadmin create ./.r $svn checkout -q file://$PWD/.r ./ $svn add -q ./r* $svn commit -q -m "Import revisions $revision_range" rm -rf ./.r # (!) # edit case $EDITOR in (*vim*) $EDITOR -p ./r*;; (*) $EDITOR ./r*;; esac # prompt for permission to continue if $svn status -q | grep -q ''; then $svn status -q read -q "?Commit the above propedits? " || { echo "${0}: exiting"; exit 0; } echo "" else echo "${0}: No changes." echo "${0}: You can remove ${(q-)PWD} now." exit 0 fi # make propedits # TODO: make these changes atomically # 'svn propedit' is atomic and could drive a non-interactive $EDITOR, but for # now, we just trust the committer to read commits@. targets=( ${(f)"$($svn status -q | grep '^M' | cut -c9-)"} ) for i in $targets; do $svn propset --revprop -r $i -F ./$i -- 'svn:log' $OLDPWD done