Artifact eadeb78341c0c59f1dec0f0db0383bf797f5ca8f:

  • File tools/cvs2fossil/lodtree — part of check-in [b8c35421] at 2007-11-22 07:24:06 on branch trunk — Added two helper applications which peek into a conversion state and generate graphs from it. Both helpers look at the tree of symbols and show it in toto (symbol tree), or restrict themselves to the branches, aka lines of development (lodtree). (user: aku size: 3001) [more...]

#!/bin/sh
## -*- tcl -*- \
exec tclsh "$0" ${1+"$@"}

# # ## ### ##### ######## ############# #####################
## Copyright (c) 2007 Andreas Kupries.
#
# This software is licensed as described in the file LICENSE, which
# you should have received as part of this distribution.
#
# This software consists of voluntary contributions made by many
# individuals.  For exact contribution history, see the revision
# history and logs, available at http://fossil-scm.hwaci.com/fossil
# # ## ### ##### ######## ############# #####################

## Command line application to extract the tree of branches (lines of
## development) from a state database and show it graphically. The
## code uses GraphViz's 'dot' to do the layouting and conversion into
## an image.

# # ## ### ##### ######## ############# #####################
## Requirements, extended package management for local packages.

lappend auto_path [file join [file dirname [info script]] lib]

package require Tcl 8.4                               ; # Required runtime.
package require struct::graph                         ; # Graph handling.
package require struct::list                          ; # Higher order list ops.
package require vc::fossil::import::cvs::state        ; # State storage.
package require vc::tools::dot                        ; # Graph export to DOT.

namespace import ::vc::fossil::import::cvs::state
namespace import ::vc::tools::dot

# Process the command line. Get the database to access.

state use [lindex $argv 0]
state reading symbol
state reading parent

# Get the data of all symbols in the state as a list for iteration,
# and as array for random access of neighbouring symbols.

foreach {sid name} [set symbols [state run { SELECT sid, name FROM symbol }]] {
    set sym($sid) [list $name]
}
foreach {sid lod} [state run { SELECT sid, lod FROM tag }] {
    catch {unset sym($sid)}
}
foreach {sid lod} [state run { SELECT sid, lod FROM branch }] {
    lappend sym($sid) $lod $sym($lod) diamond Branch
}

# Start the graph

struct::graph dg

# Convert the symbols into nodes of the graph, and use node attributes
# to highlight various pieces of interest for the dot conversion.
# Label => Symbol name.

foreach sid [array names sym] {
    dg node insert $sid
    struct::list assign $sym($sid) name lod lodname shape what
    if {$shape eq ""} { set shape circle }
    if {$what ne ""} { append what " " }
    dg node set $sid label "$what$name"
    dg node set $sid shape $shape
}

# Go through the symbols a second time, now set up the arcs based on
# their parent choices. Use arc attributes to highlight interesting
# things (...).

foreach sid [array names sym] {
    struct::list assign $sym($sid) name lod lodname shape
    if {$lod eq ""} continue ; # Root has no parent.
    dg arc insert $sid $lod
}

# Convert the graph to dot, then run the layouter and convert to png,
# at last show the image.

vc::tools::dot layout png dg SymbolTree st.png
exec display st.png
file delete st.png
exit