summaryrefslogtreecommitdiff
path: root/tools/cvs2fossil/lib/c2f_wsstate.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/cvs2fossil/lib/c2f_wsstate.tcl')
-rw-r--r--tools/cvs2fossil/lib/c2f_wsstate.tcl136
1 files changed, 136 insertions, 0 deletions
diff --git a/tools/cvs2fossil/lib/c2f_wsstate.tcl b/tools/cvs2fossil/lib/c2f_wsstate.tcl
new file mode 100644
index 0000000..502d479
--- /dev/null
+++ b/tools/cvs2fossil/lib/c2f_wsstate.tcl
@@ -0,0 +1,136 @@
+## -*- 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