If using cygwin, there is no pbcopy or xsel, but we do have putclip.
[metze/wireshark/wip.git] / tools / backport-rev
1 #!/bin/bash
2 #
3 # Copyrev - copies a revision from the Wireshark trunk to the current
4 # directory.
5 #
6 # Usage: backport-rev <svn revision>
7 #
8 # $Id$
9 #
10 # Copyright 2013 Gerald Combs
11 #
12 # This program is free software; you can redistribute it and/or
13 # modify it under the terms of the GNU General Public License
14 # as published by the Free Software Foundation; either version 2
15 # of the License, or (at your option) any later version.
16 #
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU General Public License for more details.
21 #
22 # You should have received a copy of the GNU General Public License
23 # along with this program; if not, write to the Free Software
24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
25 #
26
27 if [ -z "$VISUAL" ] ; then
28     VISUAL=$EDITOR
29 fi
30
31 #Check if pbcopy (or similar) is available...
32 if [ `builtin type -p pbcopy` ] ; then
33     PBCOPY="pbcopy"
34 fi
35
36 if [ `builtin type -p xsel` ]  ; then
37     PBCOPY="xsel --clipboard --input"
38 fi
39
40 if [ `builtin type -p putclip` ]  ; then
41     PBCOPY="putclip"
42 fi
43
44 if [ -z "$PBCOPY" ] ; then
45     echo "Can't find an clipboard copy. Check if pbcopy, xsel or putclip is installed in your system"
46     exit 1
47 fi
48 function exit_err
49 {
50     if [ -n "$*" ] ; then
51         echo "$*"
52     fi
53     echo -n $patchfile | $PBCOPY
54     echo "Patch saved to $patchfile and copied to pasteboard"
55     if [ -n "$VISUAL" ] ; then
56         "$VISUAL" $patchfile $logfile
57     else
58         echo "Can't find an editor. You'll have to open $patchfile and $logfile yourself."
59     fi
60     exit 1
61 }
62
63 subdir=""
64 trunk="trunk"
65
66 while getopts "at:" opt ; do
67     case $opt in
68         a)
69             subdir="/asn1"
70             ;;
71         t)
72             trunk="trunk-$OPTARG"
73             ;;
74         \?)
75             echo "Unknown option -$OPTARG"
76             ;;
77     esac
78 done
79 shift $((OPTIND-1))
80
81 svninfo="`svn info | grep ^URL | cut -f2 -d' '`"
82 if [ -z "$svninfo" ] ; then
83     exit_err "Can't find repository information. Are you running this from a Wireshark SVN directory?"
84 fi
85
86 svnurl=`dirname $svninfo`
87 svnurl="$svnurl/$trunk"
88 #svnurl="$HOME/Development/wireshark"
89
90 rev="$1"
91
92 patchfile="/tmp/copyrev-$rev.patch"
93 logfile="/tmp/copyrev-$rev.log"
94 oldrev=$(( $rev - 1 ))
95 echo "Working on r$rev ($oldrev)"
96
97 echo -n "Attempting 'svn merge' dry run. "
98 if [ -n "$subdir" ] ; then
99     cd .$subdir
100 fi
101
102 svn diff --diff-cmd /usr/bin/diff -x "-w -b -U 5" -c $rev $svnurl$subdir \
103     > $patchfile || exit_err "Error"
104
105 svn log -v -r $rev $svnurl | sed -e 's/^..*/  &/' > $logfile || exit 1
106
107 merge_ok="Giving up. You'll have to merge the patch yourself."
108 svn merge --dry-run -c$rev $svnurl | grep '^Summary' \
109     > /dev/null 2>&1 || merge_ok="OK"
110
111 if [ "$merge_ok" != "OK" ] ; then
112     dry_run_cmd="patch --batch --ignore-whitespace --strip=0 --dry-run"
113     echo "Failed. Trying 'patch' dry run:"
114     echo "    $dry_run_cmd < $patchfile"
115     echo ""
116     $dry_run_cmd < $patchfile
117     echo ""
118     exit_err "$merge_ok"
119 fi
120
121 echo "$merge_ok"
122 echo "Attempting 'svn merge' live run:"
123 svn merge -c$rev $svnurl
124
125 if [ -n "$subdir" ] ; then
126     cd ..
127 fi
128 echo Done with r$rev
129
130 echo "Copy over revisions from the trunk:"
131 echo ""
132 uniq < $logfile
133
134 rm -v $patchfile $logfile
135
136 #
137 # Editor modelines  -  http://www.wireshark.org/tools/modelines.html
138 #
139 # Local variables:
140 # c-basic-offset: 4
141 # tab-width: 8
142 # indent-tabs-mode: nil
143 # End:
144 #
145 # vi: set shiftwidth=4 tabstop=8 expandtab:
146 # :indentSize=4:tabSize=8:noTabs=true:
147 #