Artifact ab8cd1f9b92a776119fd83e9f725f9d789373e34
File
tools/cvs2fossil/lib/c2f_wsstate.tcl
part of check-in
[011fb38dda]
- Remember #commits to a workspace (= lod), and also their parental relationship. This will be used to control branch tagging (add/cancel), and provides us with the proper names for the tags as well.
by
aku on
2008-03-05 03:30:43.
## -*- tcl -*-
# # ## ### ##### ######## ############# #####################
## Copyright (c) 2008 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
# # ## ### ##### ######## ############# #####################
## Track the state of a cvs workspace as changesets are committed to
## it. Nothing actually happens in the filesystem, this is completely
## virtual.
# # ## ### ##### ######## ############# #####################
## Requirements
package require Tcl 8.4 ; # Required runtime.
package require snit ; # OO system.
package require struct::list ; # List assignment
package require vc::tools::log ; # User feedback.
# # ## ### ##### ######## ############# #####################
##
snit::type ::vc::fossil::import::cvs::wsstate {
# # ## ### ##### ######## #############
## Public API
constructor {lod} {
# Start with an empty state
set myname $lod
set myticks 0
set myparent {}
return
}
method name {} { return $myname }
method ticks {} { return $myticks }
method add {oprevisioninfo} {
# oprevisioninfo = list (rid path label op ...) /quadruples
# Overwrite all changed files (identified by path) with the
# new revisions. This keeps all unchanged files. Files marked
# as dead are removed.
foreach {rid path label rop} $oprevisioninfo {
log write 5 wss {$myop($rop) $label}
if {$rop < 0} {
if {[catch {
unset mystate($path)
}]} {
log write 0 wss "Removed path \"$path\" is not known to the workspace"
}
} else {
set mystate($path) [list $rid $label]
}
}
incr myticks
return
}
method get {} {
set res {}
foreach path [lsort -dict [array names mystate]] {
struct::list assign $mystate($path) rid label
lappend res $rid $path $label
}
return $res
}
method defid {id} {
set myid $id
return
}
method getid {} { return $myid }
method defstate {s} { array set mystate $s ; return }
method getstate {} { return [array get mystate] }
method parent {} { return $myparent }
method defparent {parent} {
set myparent $parent
return
}
# # ## ### ##### ######## #############
## State
variable myname {} ; # Name of the LOD the workspace is
# for.
variable myid {} ; # Record id of the fossil manifest
# associated with the current state.
variable mystate -array {} ; # Map from paths to the recordid of
# the file revision behind it, and
# the associated label for logging.
variable myticks 0 ; # Number of 'add' operations
# performed on the state.
variable myparent {} ; # Reference to the parent workspace.
typevariable myop -array {
-1 REM
0 ---
1 ADD
2 CHG
}
# # ## ### ##### ######## #############
## Configuration
pragma -hastypeinfo no ; # no type introspection
pragma -hasinfo no ; # no object introspection
pragma -hastypemethods no ; # type is not relevant.
# # ## ### ##### ######## #############
}
namespace eval ::vc::fossil::import::cvs {
namespace export wsstate
namespace eval wsstate {
namespace import ::vc::tools::log
log register wss
}
}
# # ## ### ##### ######## ############# #####################
## Ready
package provide vc::fossil::import::cvs::wsstate 1.0
return