mkCTM revision 2886
1#!/usr/local/bin/tclsh 2 3source $argv 4 5set tmp $CTMtmp 6set dd $CTMdest 7set d1 $CTMcopy 8set d2 $CTMref 9set foo $CTMdate 10set foo $CTMprefix 11set foo $CTMname 12 13exec rm -f $tmp.* 14 15set f1 [open "| ./ctm_scan $d1"] 16set f2 [open "| ./ctm_scan $d2"] 17 18set fo_del [open $tmp.del w] 19set fo_rmdir [open $tmp.rmdir w] 20set fo_mkdir [open $tmp.mkdir w] 21set fo_files [open $tmp.files w] 22set changes 0 23 24#### 25# Find CTM# 26for {set i 0} {1} {incr i} { 27 if {[file exists [format "%s/$CTMname.%04d" $dd $i]]} continue 28 if {[file exists [format "%s/$CTMname.%04d.gz" $dd $i]]} continue 29 break 30} 31set CTMnbr $i 32 33puts "Doing CTMname $CTMname CTMnbr $CTMnbr CTMdate $CTMdate" 34 35##### 36# Type Name Mode User Group Barf Size Hash 37 38proc CTMadd {t n m u g b s h} { 39 global fo_files fo_mkdir changes d2 40 puts stderr "A $b $t $n" 41 if {$t == "d"} { 42 puts $fo_mkdir "CTMDM $n $u $g $m" 43 incr changes 44 return 45 } 46 puts $fo_files "CTMFM $n $u $g $m $h $s" 47 flush $fo_files 48 exec cat $d2/$n >@ $fo_files 49 puts $fo_files "" 50 incr changes 51 return 52} 53proc CTMdel {t n m u g b s h} { 54 global fo_del fo_rmdir changes 55 puts stderr "D $b $t $n" 56 if {$t == "d"} { 57 puts $fo_rmdir "CTMDR $n" 58 incr changes 59 return 60 } 61 puts $fo_del "CTMFR $n $h" 62 incr changes 63 return 64} 65proc CTMchg {t1 n1 m1 u1 g1 b1 s1 h1 t2 n2 m2 u2 g2 b2 s2 h2} { 66 global fo_files d2 d1 changes 67 if {$t1 == "d" && $t2 == "d"} { 68 return 69 } 70 if {$t1 == "d" || $t2 == "d"} { 71 CTMdel $t1 $n1 $m1 $u1 $g1 $b1 $s1 $h1 72 CTMadd $t2 $n2 $m2 $u2 $g2 $b2 $s2 $h2 73 return 74 } 75 if {"x$h1" == "x$h2" && $s1 == $s2} { 76 return 77 puts stderr "M $b1$b2 $t1$t2 $n1" 78 puts $fo_files "CTMFA $n2 $u2 $g2 $m2 $h2" 79 incr changes 80 return 81 } 82 if {$b1 != "0" || $b2 != "0"} { 83 puts stderr "R $b1$b2 $t1$t2 $n1" 84 puts $fo_files "CTMFS $n2 $u2 $g2 $m2 $h1 $h2 $s2" 85 flush $fo_files 86 exec cat $d2/$n2 >@ $fo_files 87 puts $fo_files "" 88 incr changes 89 return 90 } 91 puts stderr "E $b1$b2 $t1$t2 $n1" 92 set i [catch "exec diff -e $d1/$n1 $d2/$n2 > tmp" j] 93 set s [file size tmp] 94 puts $fo_files "CTMFE $n1 $u2 $g2 $m2 $h1 $h2 $s" 95 flush $fo_files 96 exec cat tmp >@ $fo_files 97 puts $fo_files "" 98 incr changes 99} 100##### 101set l1 "" 102set l2 "" 103 104while 1 { 105 106 if {$l1 == ""} {gets $f1 l1} 107 108 if {$l2 == ""} {gets $f2 l2} 109 110 if {$l1 == "" && $l2 == ""} break 111 112 set n1 [lindex $l1 1] 113 set n2 [lindex $l2 1] 114 115 if {$l1 == $l2} { set l1 "" ; set l2 "" ; continue } 116 117 if {$l1 == "" } { eval CTMadd $l2 ; set l2 "" ; continue } 118 119 if {$l2 == "" } { eval CTMdel $l1 ; set l1 "" ; continue } 120 121 if {$n1 < $n2 } { eval CTMdel $l1 ; set l1 "" ; continue } 122 123 if {$n1 > $n2 } { eval CTMadd $l2 ; set l2 "" ; continue } 124 125 if {$n1 == $n2} { eval CTMchg $l1 $l2 ; set l1 "" ; set l2 "" ; continue } 126} 127 128close $fo_del 129close $fo_rmdir 130close $fo_mkdir 131close $fo_files 132 133exec echo CTM_BEGIN 2.0 $CTMname $CTMnbr $CTMdate $CTMprefix > $tmp.begin 134exec echo -n "CTM_END " >> $tmp.end 135set m [exec cat $tmp.begin $tmp.del $tmp.rmdir $tmp.mkdir $tmp.files $tmp.end | md5] 136exec echo "$m" >> $tmp.end 137 138if {!$changes} { 139 puts "no changes" 140 exec sh -c "rm -f $tmp.*" 141 exit 0 142} 143 144set nm [format "%s/%s.%04d" $dd $CTMname $CTMnbr] 145exec cat $tmp.begin $tmp.del $tmp.rmdir $tmp.mkdir $tmp.files $tmp.end | gzip -9 -v > ${nm}.gz 2>@ stdout 146exec sh -c "rm -f $tmp.*" 147exec sh -e -x -c "cd $CTMcopy ; /root/CTM/ctm -v -v -v ${nm}.gz" >&@ stdout 148