#!/bin/sh ################################################################################ # LICENSE ################################################################################ # Copyright 2008 John Hobbs ################################################################################ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the # Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ################################################################################ ################################################################################ # ABOUT ################################################################################ # # Home: http://www.velvetcache.org/ # # This is a script to cross load subversion repositories (kind of) keeping history # intact without access to svnadmin. Import into a FRESH repository only, and # be sure to do a comprehensive diff at the end. # # Also be sure to do this in an empty directory. Temp files get added and removed # without sincere thought put into them. # # Log messages get eaten and re-inserted as shown below. Edit to taste. # $ svn log -r 1 # ------------------------------------------------------------------------ # r1 | jmhobbs | 2008-11-12 18:19:43 -0600 (Wed, 12 Nov 2008) | 7 lines # # Imported from file:///srv/svn/scs using svncrossload # # |r1 | jmhobbs | 2008-10-27 17:32:44 -0500 (Mon, 27 Oct 2008) | 2 lines # | # |Initial import. # | # # ------------------------------------------------------------------------ # $ echo "Checking out initial revisions" svn co $2 importing > /dev/null svn co -r 0 $1 updateme > /dev/null echo "Getting most recent revision number" LATESTREVISION=$(svn info $1 | grep Revision | sed 's/^Revision: *\([0-9]*\)/\1/') for i in $(seq 1 $LATESTREVISION); do echo -e "\nCopying revision $i" cd updateme svn update -r $i > ../_update echo -e "Imported from $1 using svncrossload\n" > ../_log # The '\-\-\-\-\...' looks ridiculous, but it works. svn log -r $i | grep -v '\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-' | sed 's/\(.*\)/ |\1/' >> ../_log cd .. cat _update | grep -E '^A' | sed 's/^A *//' > _update_add cat _update | grep -E '^D' | sed 's/^D *//' > _update_del cat _update | grep -E '^U' | sed 's/^U *//' > _update_mod echo "$(wc -l _update_add | sed 's/^\([0-9]*\).*/\1/') Files To Add" echo "$(wc -l _update_mod | sed 's/^\([0-9]*\).*/\1/') Files To Modify" echo "$(wc -l _update_del | sed 's/^\([0-9]*\).*/\1/') Files To Delete" # Copy for j in $(cat _update_add | tr ' ' '@'); do if [ -d "updateme/${j//@/ }" ]; then mkdir "importing/${j//@/ }" else cp -f "updateme/${j//@/ }" "importing/${j//@/ }" fi cd importing # We send cerr to null because it warns when we add existing stuff svn add "${j//@/ }" 2> /dev/null cd .. done # Modify for j in $(cat _update_mod | tr ' ' '@'); do if [ -f "updateme/${j//@/ }" ]; then cp -f "updateme/${j//@/ }" "importing/${j//@/ }" fi done # Delete for j in $(cat _update_del | tr ' ' '@'); do cd importing svn rm "${j//@/ }" cd .. done echo "Committing" cd importing svn commit -F ../_log cd .. done echo "Cleaning up" rm -rf importing _log _update _update_add _update_del updateme _update_mod echo "Done!"