Artifact Content
Not logged in

Artifact 0d2f09ecb4c7582010e1e1154c136232e299c2d6

File tools/lib/importcvs.tcl part of check-in [7b2619b7ef] - Unhacked the fossil backend. IOW reworked the API and made it nicer, more structured, better command and option names. Gave the internals more structure, and simplified the handling of -breakat (old -stopat breakpoint). Updated users, and updated the user visible switches as well. Added a -h switch for help. by aku on 2007-09-13 08:02:26.

# -----------------------------------------------------------------------------
# Tool packages. Main control module for importing from a CVS repository.

# -----------------------------------------------------------------------------
# Requirements

package require Tcl 8.4
package require vc::cvs::ws     ; # Frontend, reading from source repository
package require vc::fossil::ws  ; # Backend,  writing to destination repository.
package require vc::tools::log  ; # User feedback

namespace eval ::vc::fossil::import::cvs {
    vc::tools::log::system import
    namespace import ::vc::tools::log::write
    namespace eval cvs    { namespace import ::vc::cvs::ws::* }
    namespace eval fossil { namespace import ::vc::fossil::ws::* }

    fossil::configure -appname cvs2fossil
    fossil::configure -ignore  ::vc::cvs::ws::wsignore
}

# -----------------------------------------------------------------------------
# API

# Configuration
#
#	vc::fossil::import::cvs::configure key value - Set configuration
#
#	Legal keys:	-nosign		<bool>, default false
#			-breakat	<int>,  default :none:
#			-saveto		<path>, default :none:
#
# Functionality
#
#	vc::fossil::import::cvs::run src dst         - Perform an import.

# -----------------------------------------------------------------------------
# API Implementation - Functionality

proc ::vc::fossil::import::cvs::configure {key value} {
    # The options are simply passed through to the fossil importer
    # backend.
    switch -exact -- $key {
	-breakat { fossil::configure -breakat $value }
	-nosign  { fossil::configure -nosign  $value }
	-saveto  { fossil::configure -saveto  $value }
	default {
	    return -code error "Unknown switch $key, expected one of \
                                   -breakat, -nosign, or -saveto"
	}
    }
    return
}

# Import the CVS repository found at directory 'src' into the new
# fossil repository at 'dst'.

proc ::vc::fossil::import::cvs::run {src dst} {
    cvs::at $src  ; # Define location of CVS repository
    cvs::scan     ; # Gather revision data from the archives
    cvs::csets    ; # Group changes into sets
    cvs::rtree    ; # Build revision tree (trunk only right now).

    set tot 0.0
    set nto 0

    write 0 import {Begin conversion}
    write 0 import {Setting up workspaces}

    cvs::workspace      ; # cd's to workspace
    fossil::begin [pwd] ; # Uses cwd as workspace to connect to.

    set ntrunk [cvs::ntrunk] ; set ntfmt %[string length $ntrunk]s
    set nmax   [cvs::ncsets] ; set nmfmt %[string length $nmax]s

    cvs::foreach_cset cset [cvs::root] {
	write 0 import "ChangeSet [format $nmfmt $cset] @ [format $ntfmt $nto]/$ntrunk ([format %6.2f [expr {$nto*100.0/$ntrunk}]]%)"
	Statistics [OneChangeSet $cset]
    }

    write 0 import "========= [string repeat = 61]"
    write 0 import "Imported $nto [expr {($nto == 1) ? "changeset" : "changesets"}]"
    write 0 import "Within [format %.2f $tot] seconds (avg [format %.2f [expr {$tot/$nto}]] seconds/changeset)"

    cvs::wsclear
    fossil::close $dst
    write 0 import Ok.
    return
}

# -----------------------------------------------------------------------------
# Internal operations - Import a single changeset.

proc ::vc::fossil::import::cvs::Statistics {sec} {
    upvar 1 tot tot nto nto ntrunk ntrunk

    # No statistics if the commit was stopped before it was run
    if {$sec eq ""} return

    incr nto

    set tot [expr {$tot + $sec}]
    set avg [expr {$tot/$nto}]
    set max [expr {$ntrunk * $avg}]
    set rem [expr {$max - $tot}]

    write 3 import "st avg [format %.2f $avg] sec"
    write 3 import "st run [format %7.2f $tot] sec [format %6.2f [expr {$tot/60}]] min [format %5.2f [expr {$tot/3600}]] hr"
    write 3 import "st end [format %7.2f $max] sec [format %6.2f [expr {$max/60}]] min [format %5.2f [expr {$max/3600}]] hr"
    write 3 import "st rem [format %7.2f $rem] sec [format %6.2f [expr {$rem/60}]] min [format %5.2f [expr {$rem/3600}]] hr"
    return
}

proc ::vc::fossil::import::cvs::OneChangeSet {cset} {
    set usec [lindex [time {
	foreach {user message timestamp} [cvs::wssetup $cset] break
	foreach {uuid ad rm ch} [fossil::commit $cset $user $timestamp $message] break
    } 1] 0]
    cvs::uuid $cset $uuid

    set sec [expr {$usec/1e6}]

    write 2 import "== $uuid +${ad}-${rm}*${ch}"
    write 2 import "st in  [format %.2f $sec] sec"

    return $sec
}

# -----------------------------------------------------------------------------

namespace eval ::vc::fossil::import::cvs {
    namespace export run configure
}

# -----------------------------------------------------------------------------
# Ready

package provide vc::fossil::import::cvs 1.0
return