You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
5.1 KiB
Bash

#!/usr/bin/env bash
# vim:ts=4:sts=4:sw=4:et
#
# Author: Hari Sekhon
# Date: circa 2006 (forked from .bashrc)
#
# https://github.com/harisekhon/bash-tools
#
# License: see accompanying Hari Sekhon LICENSE file
#
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
#
# https://www.linkedin.com/in/harisekhon
#
# ============================================================================ #
# R e v i s i o n C o n t r o l - S u b v e r s i o n
# ============================================================================ #
# I don't use SVN any more so a lot of the convenient aliases for daily use are commented out
bash_tools="${bash_tools:-$(dirname "${BASH_SOURCE[0]}")/..}"
# shellcheck disable=SC1090
. "$bash_tools/.bash.d/os_detection.sh"
# superceded by hg and then git pull
#alias u="svn up"
#alias sd="svn diff"
#alias svnl=svnlog
#alias svnr="svn revert"
# remapped to screen
#s(){ svn st "$@" | more; }
#stx(){ svn st "$@" | grep -v "^?"; }
isSvn(){
local target=${1:-.}
if [ -d "$target/.svn" ]; then
return 0
elif [ -f "$target" ] &&
[ -d "$(dirname "$target")/.svn" ]; then
return 0
else
return 1
fi
}
svn(){
if isMac; then
export stat_formatopt=f
else
export stat_formatopt=c
fi
local svn_owner
for x in "$@"; do
if [ -d "$x/.svn" ]; then
local dir_tested=true
svn_owner="$(stat -$stat_formatopt "%u" "$x/.svn")"
if [ "$EUID" != "$svn_owner" ]; then
echo "YOU ARE RUNNING SVN AS THE WRONG USER ON $x"
return 1
fi
fi
done
if [ "$dir_tested" != "true" ]; then
if [ -d "./.svn" ]; then
svn_owner="$(stat -$stat_formatopt "%u" ./.svn)"
if [ "$EUID" != "$svn_owner" ]; then
echo "YOU ARE RUNNING SVN AS THE WRONG USER HERE"
return 1
fi
fi
fi
command svn "$@"
}
svnst(){
svn st "$@"
}
svnkw(){
svn ps svn:keywords "LastChangedBy LastChangedDate Revision URL Id" "$@"
}
svnadd(){
svn add "$@" &&
svnkw "$@"
}
svni(){
svn pe svn:ignore "${@:-.}"
}
svnaddci(){
svnadd "$@" &&
svn ci -m "added $*" "$@"
}
svnci() {
local svncimsg=""
for x in "$@"; do
if svn st "$x" | grep -q "^[?A]"; then
svncimsg+="$x, "
fi
done
[ -z "$svncimsg" ] && return 1
svncimsg="${svncimsg%, }"
svncimsg="added $svncimsg"
svn add "$@" &&
svn ci -m "$svncimsg" "$@"
}
svnrm(){
svn rm "$@" &&
svn ci -m "removed $*" "$*"
}
svnrmf(){
svn rm --force "$@" &&
svn ci -m "removed $*" "$@"
}
svnrename(){
svn up "$(dirname "$1")" "$(dirname "$2")"
svn mv "$1" "$2" &&
svn ci -m "renamed $1 to $2" "$1" "$2"
}
svnrename2(){
local svn_url
svn_url=$(svn info "$1" | grep "^URL: " | sed 's/^URL: //')
[ -n "$svn_url" ] || return
svn rename -m "renamed $1 to $2" "$svn_url" "$(dirname "$svn_url")/$2"
svn up "$1" "$2"
}
svnmkdir(){
svn mkdir --parents "$@" &&
svn ci -m "created directory $*" "$@"
}
svnmv(){
svn up "$(dirname "$1")" "$(dirname "$2")"
svn mv "$1" "$2" &&
svn ci -m "moved $1 to $2" "$1" "$2"
}
svnrevert(){
svn revert "$@"
}
svnlog(){
local args=
local args2=
until [ $# -lt 1 ]; do
case "$1" in
-*) args+="$1 "
;;
*) args2+="$1 "
;;
esac
shift
done
# shellcheck disable=SC2086
svn up $args2 &&
read -r -p "press enter to see log" &&
svn log $args $args2 | less
}
svnu(){
[ -n "$1" ] || { echo "ERROR: must supply arg"; return 1; }
[ "$(svn diff "$@" | wc -l)" -gt 0 ] || return
svn diff "$@" | more &&
read -r &&
svn ci -m "updated $*" "$@"
}
svne(){
svn ps svn:executable on "$@"
}
svnec(){
svne "$@";
for x in "$@"; do
svn ci -m "set executable on $x"
done
}
svncommitauthors(){
svn log |
awk '/^r[[:digit:]]+[[:space:]]/ {print $3}' |
sort |
uniq -c |
sort -k1nr
}
rmnonsvn(){
svn st |
grep "^?" |
awk '{print $2}' |
xargs rm -f
}
svndifflast(){
local rev=HEAD
local rev_last=PREV
if grep -q '^[[:digit:]]\+' <<< "$1"; then
rev="$1"
shift;
fi
if [ "$rev" != "HEAD" ]; then
#let rev_last=$rev-1
(( rev_last = rev - 1 ))
fi
svn diff -r "$rev_last:$rev" "$@" |
more
}
#alias sdl=svndifflast
svndiff(){
local filename="${1:-}"
[ -n "$filename" ] || { echo "usage: svndiff filename"; return 1; }
svn diff "$filename" > "/tmp/svndiff.tmp"
diffnet.pl "/tmp/svndiff.tmp"
}
svndiffcumulative(){
local url
svn up
url="$(svn info | awk '/^URL/ {print $2}')"
HEAD="$(svn info | awk '/Revision/ {print $2}')"
for x in $(eval echo "{25470..$HEAD}"); do
((y=x+1))
echo -n "svn $x => $y: "
svn diff -r "$x:$y" "$url"
done
}
alias svndiffcum="svndiffcumulative"
svncommmitcount(){
svn up
svn log -r 25470:HEAD |
grep "^r[[:digit:]]\+ |" |
wc
}