52f2254007 2007-10-04 aku: ## -*- tcl -*- 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# ##################### 52f2254007 2007-10-04 aku: ## Copyright (c) 2007 Andreas Kupries. 52f2254007 2007-10-04 aku: # 52f2254007 2007-10-04 aku: # This software is licensed as described in the file LICENSE, which 52f2254007 2007-10-04 aku: # you should have received as part of this distribution. 52f2254007 2007-10-04 aku: # 52f2254007 2007-10-04 aku: # This software consists of voluntary contributions made by many 52f2254007 2007-10-04 aku: # individuals. For exact contribution history, see the revision 52f2254007 2007-10-04 aku: # history and logs, available at http://fossil-scm.hwaci.com/fossil 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# ##################### 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: ## Project, part of a CVS repository. Multiple instances are possible. 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# ##################### 52f2254007 2007-10-04 aku: ## Requirements 52f2254007 2007-10-04 aku: da9295c6f6 2007-10-12 aku: package require Tcl 8.4 ; # Required runtime. da9295c6f6 2007-10-12 aku: package require snit ; # OO system. da9295c6f6 2007-10-12 aku: package require vc::fossil::import::cvs::file ; # CVS archive file. 27470a9304 2007-10-13 aku: package require vc::fossil::import::cvs::state ; # State storage. 27470a9304 2007-10-13 aku: package require vc::fossil::import::cvs::project::sym ; # Per project symbols. 27470a9304 2007-10-13 aku: package require struct::list ; # Advanced list operations.. 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# ##################### 52f2254007 2007-10-04 aku: ## 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: snit::type ::vc::fossil::import::cvs::project { 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# 52f2254007 2007-10-04 aku: ## Public API 52f2254007 2007-10-04 aku: 8487172254 2007-10-06 aku: constructor {path r} { 8487172254 2007-10-06 aku: set mybase $path 8487172254 2007-10-06 aku: set myrepository $r 52f2254007 2007-10-04 aku: return 52f2254007 2007-10-04 aku: } 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: method base {} { return $mybase } 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: method printbase {} { 52f2254007 2007-10-04 aku: if {$mybase eq ""} {return <Repository>} 52f2254007 2007-10-04 aku: return $mybase 52f2254007 2007-10-04 aku: } 52f2254007 2007-10-04 aku: 27470a9304 2007-10-13 aku: method addfile {rcs usr executable} { 27470a9304 2007-10-13 aku: set myfiles($rcs) [list $usr $executable] 52f2254007 2007-10-04 aku: return 042d54bae5 2007-10-05 aku: } 042d54bae5 2007-10-05 aku: 8a93ffa9c1 2007-10-06 aku: method filenames {} { ec053168a8 2007-10-06 aku: return [lsort -dict [array names myfiles]] 52f2254007 2007-10-04 aku: } 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: method files {} { 8a93ffa9c1 2007-10-06 aku: # TODO: Loading from state 6d1811d61e 2007-10-06 aku: return [TheFiles] 8487172254 2007-10-06 aku: } 8487172254 2007-10-06 aku: 8487172254 2007-10-06 aku: delegate method author to myrepository 8487172254 2007-10-06 aku: delegate method cmessage to myrepository da9295c6f6 2007-10-12 aku: da9295c6f6 2007-10-12 aku: method getsymbol {name} { da9295c6f6 2007-10-12 aku: if {![info exists mysymbols($name)]} { da9295c6f6 2007-10-12 aku: set mysymbols($name) [sym %AUTO% $name] 8a93ffa9c1 2007-10-06 aku: } da9295c6f6 2007-10-12 aku: return $mysymbols($name) 042d54bae5 2007-10-05 aku: } 042d54bae5 2007-10-05 aku: 6d1811d61e 2007-10-06 aku: # pass I persistence 042d54bae5 2007-10-05 aku: method persist {} { 042d54bae5 2007-10-05 aku: state transaction { 042d54bae5 2007-10-05 aku: # Project data first. Required so that we have its id 042d54bae5 2007-10-05 aku: # ready for the files. 042d54bae5 2007-10-05 aku: 042d54bae5 2007-10-05 aku: state run { 042d54bae5 2007-10-05 aku: INSERT INTO project (pid, name) 042d54bae5 2007-10-05 aku: VALUES (NULL, $mybase); 042d54bae5 2007-10-05 aku: } 042d54bae5 2007-10-05 aku: set pid [state id] 042d54bae5 2007-10-05 aku: 042d54bae5 2007-10-05 aku: # Then all files, with proper backreference to their 042d54bae5 2007-10-05 aku: # project. 042d54bae5 2007-10-05 aku: 27470a9304 2007-10-13 aku: foreach {rcs item} [array get myfiles] { 27470a9304 2007-10-13 aku: struct::list assign $item usr executable 042d54bae5 2007-10-05 aku: state run { 27470a9304 2007-10-13 aku: INSERT INTO file (fid, pid, name, visible, exec) 27470a9304 2007-10-13 aku: VALUES (NULL, $pid, $rcs, $usr, $executable); 042d54bae5 2007-10-05 aku: } 6d1811d61e 2007-10-06 aku: } 6d1811d61e 2007-10-06 aku: } 6d1811d61e 2007-10-06 aku: return 6d1811d61e 2007-10-06 aku: } 6d1811d61e 2007-10-06 aku: 6d1811d61e 2007-10-06 aku: # pass II persistence 6d1811d61e 2007-10-06 aku: method persistrev {} { 6d1811d61e 2007-10-06 aku: state transaction { 6d1811d61e 2007-10-06 aku: # TODO: per project persistence (symbols, meta data) 6d1811d61e 2007-10-06 aku: foreach f [TheFiles] { 6d1811d61e 2007-10-06 aku: $f persist 042d54bae5 2007-10-05 aku: } 042d54bae5 2007-10-05 aku: } 042d54bae5 2007-10-05 aku: return 52f2254007 2007-10-04 aku: } 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# 52f2254007 2007-10-04 aku: ## State 52f2254007 2007-10-04 aku: da9295c6f6 2007-10-12 aku: variable mybase {} ; # Project directory da9295c6f6 2007-10-12 aku: variable myfiles -array {} ; # Maps rcs archive to their user files. da9295c6f6 2007-10-12 aku: variable myfobj {} ; # File objects for the rcs archives da9295c6f6 2007-10-12 aku: variable myrepository {} ; # Repository the prject belongs to. da9295c6f6 2007-10-12 aku: variable mysymbols -array {} ; # Map symbol names to project-level symbol objects. 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# 52f2254007 2007-10-04 aku: ## Internal methods 52f2254007 2007-10-04 aku: 6d1811d61e 2007-10-06 aku: proc TheFiles {} { 6d1811d61e 2007-10-06 aku: upvar 1 myfiles myfiles myfobj myfobj self self 6d1811d61e 2007-10-06 aku: if {![llength $myfobj]} { 6d1811d61e 2007-10-06 aku: set myfobj [EmptyFiles myfiles] 6d1811d61e 2007-10-06 aku: } 6d1811d61e 2007-10-06 aku: return $myfobj 6d1811d61e 2007-10-06 aku: } 6d1811d61e 2007-10-06 aku: 6d1811d61e 2007-10-06 aku: proc EmptyFiles {fv} { 6d1811d61e 2007-10-06 aku: upvar 1 $fv myfiles self self 6d1811d61e 2007-10-06 aku: set res {} 27470a9304 2007-10-13 aku: foreach item [lsort -dict [array names myfiles]] { 27470a9304 2007-10-13 aku: struct::list assign $item f executable 27470a9304 2007-10-13 aku: lappend res [file %AUTO% $f $executable $self] 6d1811d61e 2007-10-06 aku: } 6d1811d61e 2007-10-06 aku: return $res 6d1811d61e 2007-10-06 aku: } 6d1811d61e 2007-10-06 aku: 6d1811d61e 2007-10-06 aku: # # ## ### ##### ######## ############# 6d1811d61e 2007-10-06 aku: ## Configuration 6d1811d61e 2007-10-06 aku: 52f2254007 2007-10-04 aku: pragma -hastypeinfo no ; # no type introspection 52f2254007 2007-10-04 aku: pragma -hasinfo no ; # no object introspection 52f2254007 2007-10-04 aku: pragma -hastypemethods no ; # type is not relevant. 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# 52f2254007 2007-10-04 aku: } 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: namespace eval ::vc::fossil::import::cvs { 52f2254007 2007-10-04 aku: namespace export project 042d54bae5 2007-10-05 aku: namespace eval project { 8a93ffa9c1 2007-10-06 aku: namespace import ::vc::fossil::import::cvs::file 042d54bae5 2007-10-05 aku: namespace import ::vc::fossil::import::cvs::state da9295c6f6 2007-10-12 aku: # Import not required, already a child namespace. da9295c6f6 2007-10-12 aku: # namespace import ::vc::fossil::import::cvs::project::sym 042d54bae5 2007-10-05 aku: } 52f2254007 2007-10-04 aku: } 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: # # ## ### ##### ######## ############# ##################### 52f2254007 2007-10-04 aku: ## Ready 52f2254007 2007-10-04 aku: 52f2254007 2007-10-04 aku: package provide vc::fossil::import::cvs::project 1.0 52f2254007 2007-10-04 aku: return