@@ -0,0 +1,88 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #!/bin/sh
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## -*- tcl -*- \
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exec tclsh "$0" ${1+"$@"}
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Copyright (c) 2007 Andreas Kupries.
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This software is licensed as described in the file LICENSE, which
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # you should have received as part of this distribution.
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # This software consists of voluntary contributions made by many
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # individuals. For exact contribution history, see the revision
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # history and logs, available at http://fossil-scm.hwaci.com/fossil
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Command line application to extract the tree of symbols (tags and
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## branches) from a state database and show it graphically. The code
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## uses GraphViz's 'dot' to do the layouting and conversion into an
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## image.
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## ############# #####################
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Requirements, extended package management for local packages.
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend auto_path [file join [file dirname [info script]] lib]
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require Tcl 8.4 ; # Required runtime.
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require struct::graph ; # Graph handling.
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require struct::list ; # Higher order list ops.
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::fossil::import::cvs::state ; # State storage.
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::dot ; # Graph export to DOT.
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::fossil::import::cvs::state
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::dot
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Process the command line. Get the database to access.
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state use [lindex $argv 0]
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state reading symbol
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ state reading parent
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Get the data of all symbols in the state as a list for iteration,
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # and as array for random access of neighbouring symbols.
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {sid name} [set symbols [state run { SELECT sid, name FROM symbol }]] {
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set sym($sid) [list $name]
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {sid lod} [state run { SELECT sid, lod FROM tag }] {
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend sym($sid) $lod $sym($lod) box Tag
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach {sid lod} [state run { SELECT sid, lod FROM branch }] {
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend sym($sid) $lod $sym($lod) diamond Branch
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Start the graph
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct::graph dg
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Convert the symbols into nodes of the graph, and use node attributes
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # to highlight various pieces of interest for the dot conversion.
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Label => Symbol name.
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach sid [array names sym] {
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dg node insert $sid
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct::list assign $sym($sid) name lod lodname shape what
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$shape eq ""} { set shape circle }
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$what ne ""} { append what " " }
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dg node set $sid label "$what$name"
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dg node set $sid shape $shape
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Go through the symbols a second time, now set up the arcs based on
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # their parent choices. Use arc attributes to highlight interesting
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # things (...).
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach sid [array names sym] {
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct::list assign $sym($sid) name lod lodname shape
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$lod eq ""} continue ; # Root has no parent.
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dg arc insert $sid $lod
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Convert the graph to dot, then run the layouter and convert to png,
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # at last show the image.
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ vc::tools::dot layout png dg SymbolTree st.png
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exec display st.png
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file delete st.png
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exit
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+