@@ -27,19 +27,36 @@
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc ::vc::cvs::ws::sig::next {id added changed removed tag ts} {
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
variable sig
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
array set rev $sig($id)
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #puts sig::next/$ts
32 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach {f r} [concat $changed $removed] {
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![info exists rev($f)] || ![branch::successor $r $rev($f)]} {
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![info exists rev($f)]} {
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # A file missing in the candidate parent changeset is
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # _not_ a reason to reject it, at least not immediately.
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # The code generating the timeline entries has only
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # partial information and is prone to misclassify files
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # added to branches as changed instead of added. Thus we
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # move this file to the list of added things and check it
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # again as part of that, see below.
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend added $f $r
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[branch::rootSuccessor $r $rev($f)]} continue
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![branch::successor $r $rev($f)]} {
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #puts "not-successor($r of $rev($f))"
34 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0
35 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
36 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
37 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
38 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {[llength $added]} {
39 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Check that added files belong to the branch too!
40 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {$tag ne [branch::has $ts $added]} {
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #puts "not-added-into-same-branch"
41 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0
42 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
43 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
44 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1
45 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -80,48 +97,108 @@
80 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return $res
81 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
82 99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
83 100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc ::vc::cvs::ws::sig::Find {sig} {
84 101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Locate all changesets which contain the given signature.
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # First we try to the exact changeset, by intersecting the
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # live-intervals for all file revisions found in the
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # signature. This however may fail, as CVS is able to contain
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # a-causal branch definitions.
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Example: sqlite, branch "gdbm-branch".
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # File 'db.c', branch 1.6.2, root 1.6, entered on Jan 31, 2001.
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Then 'dbbegdbm.c', 1.1.2, root 1.1, entered on Oct 19, 2000.
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # More pertinent, revision 1.2 was entered Jan 13, 2001,
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # i.e. existed before Jan 31, before the branchwas actually
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # made. Thus it is unclear why 1.1 is in the branch instead.
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # An alternative complementary question would be how db.c 1.6
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ended up in a branch tag created before Jan 13, when this
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # revision did not exist yet.
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # So, CVS repositories can be a-causal when it comes to branches,
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # at least in the details. Therefore while try for an exact result
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # first we do not fail if that fails, but use a voting scheme as
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # fallback which answers the question about which changeset is
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # acceptable to the most file revisions in the signature.
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Note that multiple changesets are ok at this level and are
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # simply returned.
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set res [Intersect $sig]
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ puts Exact=($res)
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[llength $res]} { return $res }
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set res [Vote $sig]
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ puts Vote=($res)
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return $res
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc ::vc::cvs::ws::sig::Intersect {sig} {
85 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
variable csl
86 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set res {}
88 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set first 1
89 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach {f r} $sig {
90 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#puts $f/$r?
91 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# Unknown file not used anywhere
92 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {![info exists csl($f,$r)]} {return {}}
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- puts $f/$r\t=\t($csl($f,$r))*($res)/$first
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #puts $f/$r\t=\t($csl($f,$r))*($res)/$first
94 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
95 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if {$first} {
96 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set res $csl($f,$r)
97 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set first 0
98 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#puts F($res)
99 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} else {
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set new [struct::set intersect $res $csl($f,$r)]
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set rv $r
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while {![llength $new]} {
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Assume that the problem file was added and as such
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # does not exist yet at the root revision. However its
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # root should exist, and some point.
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set rv [branch::revroot $rv]
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {$rv eq ""} {
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- puts BREAK/\t($f\ $r)
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- exit
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if {![info exists csl($f,$rv)]} {return {}}
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #puts $f/$r\t=\t($csl($f,$rv))
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set new [struct::set intersect $res $csl($f,$rv)]
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- set res $new
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set res [struct::set intersect $res $csl($f,$r)]
117 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#puts R($res)
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if {![llength $res]} {return {}}
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $res]} {return {}}
119 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return $res
122 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc ::vc::cvs::ws::sig::Vote {sig} {
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ variable csl
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # I. Accumulate votes.
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set v {}
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {f r} $sig {
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Unknown revisions do not vote.
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![info exists csl($f,$r)]} continue
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach c $csl($f,$r) {
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[info exists v($c)]} {
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr v($c)
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set v($c) 1
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Invert index for easier finding the max, compute the max at the
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # same time.
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ array set tally {}
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set max -1
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {c n} [array get v] {
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend tally($n) $c
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$n > $max} {set max $n}
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #parray tally
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ puts Max=$max
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Return the changesets having the most votes.
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return $tally($max)
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
proc ::vc::cvs::ws::sig::DictSort {dict} {
125 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
array set a $dict
126 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set r {}
127 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
foreach k [lsort [array names a]] {
128 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!