Skip to content

Instantly share code, notes, and snippets.

@kbinani
Last active December 18, 2021 01:03
Show Gist options
  • Save kbinani/4509082 to your computer and use it in GitHub Desktop.
Save kbinani/4509082 to your computer and use it in GitHub Desktop.
A shell script to export svn repository without subversion client.
#!/bin/bash
function svn_export {
function svn_export_one { (
local url=$1
local directory=$2
local revision=$3
local prefix="$(echo $url | cut -b $(expr ${#base_url} + 2)-)"
for file in $(curl -L "$url?p=$revision" 2>/dev/null | grep '<li><a href=".*"' | sed 's:^.*<li><a href=".*">\(.*\)</a>.*$:\1:g'); do
if [ "$file" = "$(echo $file | sed 's:^.*\(/\)$:\1:g')" -a "$file" != ".." ]; then
if [ -z "$prefix" ]; then
echo "A $directory/$file"
else
echo "A $directory/$prefix/$file"
fi
curl -L $url/$file?p=$revision 2>/dev/null -o $file
elif [ "$file" != ".." ]; then
file=$(echo $file | sed 's:/$::g')
if [ -z "$prefix" ]; then
echo "A $directory/$file"
else
echo "A $directory/$prefix/$file"
fi
mkdir $file
(cd $file && svn_export_one $url/$file $directory $revision)
fi
done
) }
function get_revision { (
local url=$1
curl -L $url 2>&1 | grep h2 | grep "Revision [0-9]*:" | sed 's/^.* Revision \([0-9]*\):.*$/\1/g' | tr -d '\n'
) }
local base_url=$1
local directory=$2
local revision=$3
if [ -z "$revision" ]; then
revision=$(get_revision $base_url)
fi
[ -d "$directory" ] || {
mkdir -p "$directory"
}
(cd $directory && svn_export_one $base_url $directory $revision)
echo "Exported revision $revision."
}
function usage {
echo "svn_export.sh: Create an unversioned copy of a tree."
echo "usage: bash $0 URL [--revision REV|-r REV] [PATH]"
echo ""
echo " URL : A repository url"
echo " --revision REV : A revision number to be exported."
echo " -r REV"
echo " PATH : A target directory to be exported."
}
revision=
base_url=
directory=
while true; do
case $1 in
-r | --revision) {
revision=$2
shift 2
};;
-h | --help) {
usage
exit 0
};;
*) {
if [ -z "$base_url" ]; then
base_url=$1
else
directory=$1
fi
shift
};;
esac
[ $# = 0 ] && break
done
if [ -z "$directory" ]; then
directory=$(basename $base_url)
fi
svn_export $base_url $directory $revision
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment