experimental old/new eatmydata support switch
[shellsnippets/shellsnippets.git] / mksh / editdiff
1 #!/bin/mksh
2 # $MirOS: src/scripts/editdiff,v 1.12 2009/03/29 13:04:20 tg Exp $
3 #-
4 # Copyright (c) 2004, 2006, 2007, 2008
5 #       Thorsten Glaser <tg@mirbsd.de>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21
22 unset CVSREADONLYFS
23
24 f=$1; shift
25 rev=$1
26 if [[ $rev = ask ]]; then
27         read rev?'Revision: '
28         [[ -z $rev ]] && exit 0
29         shift
30 elif [[ -n $rev ]]; then
31         shift
32 fi
33 if [[ $rev = +(-) ]]; then
34         rev=
35 elif [[ -n $rev && $rev != -* ]]; then
36         rev=-r$rev
37 fi
38 cp=
39 dp=
40 x=cp
41 while [[ $# -gt 0 ]]; do
42         if [[ $1 = -- ]]; then
43                 x=dp
44         elif [[ $x = cp ]]; then
45                 cp="$cp $1"
46         else
47                 dp="$dp $1"
48         fi
49         shift
50 done
51
52 T=$(mktemp /tmp/editdiff.XXXXXXXXXX) || exit 1
53 trap 'rm -f $T ${T}.{lock,orig} ; exit 0' 0
54 trap 'rm -f $T ${T}.{lock,orig} ; exit 1' 1 2 3 5 13 15
55
56 # heuristics for finding out if CVSREADONLYFS is supposedly supported:
57 # we assume it is on local access or if :ext: is skipped but it is not
58 # if :ext: or :pserver: are used
59 [[ -s CVS/Root && "$(<CVS/Root)" != :* ]] && export CVSREADONLYFS=1
60
61 eval cvs -q $cp diff -upa $EXTRA_DIFF $rev $dp "$f" >$T 2>&1
62 touch ${T}.lock
63
64 if ! patch -Rlt -o ${T}.orig "$f" $T; then
65         print continue?
66         read
67 fi
68 ${EDITOR:-ed} $T
69
70 if [[ $T -nt ${T}.lock ]]; then
71         mv "$f" "$f".orig
72         patch -l -o "$f" ${T}.orig $T
73         rv=$?
74         if [[ ! -f $f ]]; then
75                 cp ${T}.orig "$f"
76         fi
77         exit $rv
78 fi
79
80 print Ignoring patch.
81 exit 0