add "all" option for scanning all choicepoints
[rrq/nilfs2sss.git] / ssbrowse.sh
1 #!/bin/bash
2 #
3 # Browse snapshots of a given path and run meld to compare with
4 # current directory
5 # $1: path -- for mounted nilfs
6
7 ## Prepare for mounting of snapshots
8 MOUNT=/tmp/ssmeld-$$
9 mkdir -p $MOUNT || exit 1
10
11 function exitbrowse() {
12     umount $MOUNT 2>/dev/null
13     rmdir $MOUNT
14     trap "" 0
15 }
16 trap "exitbrowse" 0 2 9 15
17
18 ARG1="${1-/backup}"
19 DF=( $(df $ARG1 | awk '{d=$1;p=$NF;} END {printf "%s %s", d, p;}') )
20
21 NILFSROOT="${DF[1]}"
22 NILFSDEV="${DF[0]}"
23 PTR="${ARG1#$NILFSROOT}"
24 DIR0="$MOUNT$PTR"
25 DIR1="$NILFSROOT"
26
27 function snap2iselect() {
28     lscp -r -s $NILFSDEV  | while read CNO DATE TIME REST ; do
29         [ $CNO = CNO ] && continue
30         echo "  <s:$CNO> [$CNO] ${DATE} ${TIME}"
31     done
32 }
33
34 function dirof() {
35     x="${1%%|*}"
36     x="${x%%(*}"
37     echo "${x}" | sed 's/\(\S\+\s\+\)\{8\}//;s/\s*$//'
38 }
39
40 function dirsdiff() {
41     while true ; do
42         LEFT="$(cd $DIR0/${1#/} && ls -l)"
43         RIGHT="$(cd $DIR1/${1#/} && ls -l)"
44         SEL="$(diff -W 500 -y --left-column <(echo "$LEFT") <(echo "$RIGHT")| \
45              column -t | \
46              iselect -n "($CNO ~ $DIR1)" -K -kd -kx -kz -a -t "${1-/}" )"
47         KEY="${SEL%%:*}"
48         SEL="${SEL#*:}"
49         [ -z "$SEL" ] && break
50         case "$KEY" in
51             RETURN|KEY_RIGHT)
52                 ZEL="$(echo "${SEL}" | sed 's/^>\s*//;s/\s*$//')"
53                 if [ -z "${ZEL##d*}" ] ; then
54                     D="$(dirof "$ZEL")"
55                     dirsdiff "$1/$D" || return 1
56                 else
57                     D="$(dirof "$ZEL")"
58                     diff -D "$CNO" -N $DIR0/${1#/}/$D $DIR1/${1#/}/$D |\
59                         less
60                          
61                 fi
62                 ;;
63             d) # Find next dept-first difference 
64                 :
65                 ;;
66             x) # Exit
67                 return 1
68                 ;;
69             *)
70                 echo "*** ${KEY}:${SEL}"
71                 read x
72                 ;;
73         esac
74     done
75 }
76
77 N=2
78 while true ; do
79     SNAPS="$(snap2iselect)"
80     CNO="$(iselect -n "($DIR1/)" \
81                   -t "Snapshots for $NILFSDEV=$NILFSROOT" -p $N -P \
82                   "Select snapshot" "$SNAPS")"
83     [ -z "$CNO" ] && break
84     N=${CNO%%:*}
85     CNO=${CNO#*:}
86     if sudo mount -t nilfs2 -oro,cp=$CNO $NILFSDEV $MOUNT ; then
87         dirsdiff /
88         sudo umount $MOUNT
89     fi
90 done