ae54e928c2 2007-09-17 aku: # ----------------------------------------------------------------------------- ae54e928c2 2007-09-17 aku: # Repository management (CVS), Changeset grouping and storage. ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # ----------------------------------------------------------------------------- ae54e928c2 2007-09-17 aku: # Requirements ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: package require Tcl 8.4 ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: namespace eval ::vc::cvs::ws::csets::Current {} ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # ----------------------------------------------------------------------------- ae54e928c2 2007-09-17 aku: # API ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # vc::cvs::ws::csets::init - Initialize accumulator ae54e928c2 2007-09-17 aku: # vc::cvs::ws::csets::add - Add timeline entry to accumulor, may generate new cset ae54e928c2 2007-09-17 aku: # vc::cvs::ws::csets::done - Complete cset generation. ae54e928c2 2007-09-17 aku: # ae54e928c2 2007-09-17 aku: # vc::cvs::ws::csets::get id - Get data of a cset. ae54e928c2 2007-09-17 aku: # vc::cvs::ws::csets::num - Get number of csets. ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # ----------------------------------------------------------------------------- ae54e928c2 2007-09-17 aku: # API Implementation ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::init {} { ae54e928c2 2007-09-17 aku: Current::Clear ae54e928c2 2007-09-17 aku: return ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::add {date file revision operation author cmsg} { ae54e928c2 2007-09-17 aku: if {![Current::Empty] && [Current::New $file $revision $author $cmsg]} { ae54e928c2 2007-09-17 aku: Save [Current::Complete] ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: Current::Add $date $file $revision $operation $author $cmsg ae54e928c2 2007-09-17 aku: return ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::done {} { ae54e928c2 2007-09-17 aku: if {![Current::Empty]} { ae54e928c2 2007-09-17 aku: Save [Current::Complete] ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: return ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::get {id} { ae54e928c2 2007-09-17 aku: variable csets ae54e928c2 2007-09-17 aku: return $csets($id) ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::num {} { ae54e928c2 2007-09-17 aku: variable csets ae54e928c2 2007-09-17 aku: return [array size csets] ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # ----------------------------------------------------------------------------- ae54e928c2 2007-09-17 aku: # Internal helper commands: Changeset inspection and construction. ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::Save {data} { ae54e928c2 2007-09-17 aku: variable csets ae54e928c2 2007-09-17 aku: variable ncs ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: set csets($ncs) $data ae54e928c2 2007-09-17 aku: incr ncs ae54e928c2 2007-09-17 aku: return ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::Current::Clear {} { ae54e928c2 2007-09-17 aku: variable start {} ; # date the changeset begins ae54e928c2 2007-09-17 aku: variable cmsg {} ; # commit message of the changeset ae54e928c2 2007-09-17 aku: variable author {} ; # user creating the changeset ae54e928c2 2007-09-17 aku: variable lastd {} ; # version depth of last added file. ae54e928c2 2007-09-17 aku: variable removed {} ; # file -> revision of removed files. ae54e928c2 2007-09-17 aku: variable added {} ; # file -> revision of added files. ae54e928c2 2007-09-17 aku: variable changed {} ; # file -> revision of modified files. ae54e928c2 2007-09-17 aku: variable files ae54e928c2 2007-09-17 aku: array unset files * ae54e928c2 2007-09-17 aku: array set files {} ; # file -> revision ae54e928c2 2007-09-17 aku: return ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::Current::Empty {} { ae54e928c2 2007-09-17 aku: variable start ae54e928c2 2007-09-17 aku: return [expr {$start eq ""}] ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::Current::New {nfile nrevision nauthor ncmsg} { ae54e928c2 2007-09-17 aku: upvar 1 reason reason ae54e928c2 2007-09-17 aku: variable cmsg ae54e928c2 2007-09-17 aku: variable author ae54e928c2 2007-09-17 aku: variable lastd ae54e928c2 2007-09-17 aku: variable files ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # User change ae54e928c2 2007-09-17 aku: if {$nauthor ne $author} { ae54e928c2 2007-09-17 aku: set reason user ae54e928c2 2007-09-17 aku: return 1 ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # File already in current cset ae54e928c2 2007-09-17 aku: if {[info exists files($nfile)]} { ae54e928c2 2007-09-17 aku: set reason file ae54e928c2 2007-09-17 aku: return 1 ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # Current cset trunk/branch different from entry. ae54e928c2 2007-09-17 aku: set ndepth [llength [split $nrevision .]] ae54e928c2 2007-09-17 aku: if {($lastd == 2) != ($ndepth == 2)} { ae54e928c2 2007-09-17 aku: set reason depth/$lastd/$ndepth/($nrevision)/$nfile ae54e928c2 2007-09-17 aku: return 1 ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # Commit message changed ae54e928c2 2007-09-17 aku: if {$ncmsg ne $cmsg} { ae54e928c2 2007-09-17 aku: set reason cmsg/<<$ncmsg>> ae54e928c2 2007-09-17 aku: return 1 ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # The new entry still belongs to the current changeset ae54e928c2 2007-09-17 aku: return 0 ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::Current::Add {ndate nfile nrevision noperation nauthor ncmsg} { ae54e928c2 2007-09-17 aku: variable start ae54e928c2 2007-09-17 aku: variable cmsg ae54e928c2 2007-09-17 aku: variable author ae54e928c2 2007-09-17 aku: variable lastd ae54e928c2 2007-09-17 aku: variable removed ae54e928c2 2007-09-17 aku: variable added ae54e928c2 2007-09-17 aku: variable changed ae54e928c2 2007-09-17 aku: variable files ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: if {$start eq ""} {set start $ndate} ae54e928c2 2007-09-17 aku: set cmsg $ncmsg ae54e928c2 2007-09-17 aku: set author $nauthor ae54e928c2 2007-09-17 aku: set lastd [llength [split $nrevision .]] ae54e928c2 2007-09-17 aku: set files($nfile) $nrevision ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: if {$noperation eq "R"} { ae54e928c2 2007-09-17 aku: lappend removed $nfile $nrevision ae54e928c2 2007-09-17 aku: } elseif {$noperation eq "A"} { ae54e928c2 2007-09-17 aku: lappend added $nfile $nrevision ae54e928c2 2007-09-17 aku: } else { ae54e928c2 2007-09-17 aku: lappend changed $nfile $nrevision ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: return ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: proc ::vc::cvs::ws::csets::Current::Complete {} { ae54e928c2 2007-09-17 aku: variable start ae54e928c2 2007-09-17 aku: variable cmsg ae54e928c2 2007-09-17 aku: variable author ae54e928c2 2007-09-17 aku: variable lastd ae54e928c2 2007-09-17 aku: variable removed ae54e928c2 2007-09-17 aku: variable added ae54e928c2 2007-09-17 aku: variable changed ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: set res [list \ ae54e928c2 2007-09-17 aku: date $start \ ae54e928c2 2007-09-17 aku: author $author \ ae54e928c2 2007-09-17 aku: cmsg $cmsg \ ae54e928c2 2007-09-17 aku: removed $removed \ ae54e928c2 2007-09-17 aku: added $added \ ae54e928c2 2007-09-17 aku: changed $changed \ ae54e928c2 2007-09-17 aku: lastd $lastd] ae54e928c2 2007-09-17 aku: Clear ae54e928c2 2007-09-17 aku: return $res ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # ----------------------------------------------------------------------------- ae54e928c2 2007-09-17 aku: # Internals ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: namespace eval ::vc::cvs::ws::csets { ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # Cset storage ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # csets: id -> dict ae54e928c2 2007-09-17 aku: # dict: date ae54e928c2 2007-09-17 aku: # author ae54e928c2 2007-09-17 aku: # csmg ae54e928c2 2007-09-17 aku: # removed ae54e928c2 2007-09-17 aku: # added ae54e928c2 2007-09-17 aku: # changed ae54e928c2 2007-09-17 aku: # lastd ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: variable ncs 0 ; # Counter for changesets ae54e928c2 2007-09-17 aku: variable csets ae54e928c2 2007-09-17 aku: array set csets {} ; # Changeset data ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # Data of the current changeset built from timeline entries. ae54e928c2 2007-09-17 aku: namespace eval Current { ae54e928c2 2007-09-17 aku: variable start {} ; # date the changeset begins ae54e928c2 2007-09-17 aku: variable cmsg {} ; # commit message of the changeset ae54e928c2 2007-09-17 aku: variable author {} ; # user creating the changeset ae54e928c2 2007-09-17 aku: variable lastd {} ; # version depth of last added file. ae54e928c2 2007-09-17 aku: variable removed {} ; # file -> revision of removed files. ae54e928c2 2007-09-17 aku: variable added {} ; # file -> revision of added files. ae54e928c2 2007-09-17 aku: variable changed {} ; # file -> revision of modified files. ae54e928c2 2007-09-17 aku: variable files ae54e928c2 2007-09-17 aku: array set files {} ; # file -> revision ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: namespace export init add done get num ae54e928c2 2007-09-17 aku: } ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: # ----------------------------------------------------------------------------- ae54e928c2 2007-09-17 aku: # Ready ae54e928c2 2007-09-17 aku: ae54e928c2 2007-09-17 aku: package provide vc::cvs::ws::csets 1.0 ae54e928c2 2007-09-17 aku: return