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