Eskil

rev.test at trunk
Login

File tests/rev.test artifact ca87a855b2 on branch trunk


#------------------------------------------------------------*- tcl -*-
# Tests for revision control functions
#----------------------------------------------------------------------

# Overload exec during these tests
stub exec {args} {
    set cmd [lindex $args 0]
    switch -- $cmd {
        cleartool {
            # cleartool lshistory -short $filename
            # cleartool pwv -s
            # cleartool get -to $outfile $filerev
            # cleartool ls $::eskil($top,RevFile)
            if {[lindex $args 1] eq "lshistory"} {
                return [join [list x@/Apa/Bepa/12 x@/Apa/Cepa/2 x@/Apa/22 x@/Apa] \n]
            }
            if {[lindex $args 1] eq "pwv"} {
                return $::ct_pwv
            }
            if {[lindex $args 1] eq "ls"} {
                return $::ct_ls
            }
            if {[lindex $args 1] eq "describe"} {
                return $::ct_describe
            }
            return
        }
        cvs {
            # cvs -z3 update -p ?-r rev? $filename > $outfile
            return
        }
        co {
            # co -p$rev $filename > $outfile
            return
        }
        svn {
            switch -- [lindex $args 1] {
                info {
                    return {
                        Last Changed Author: pspjuth
                        Last Changed Rev: 158
                        Last Changed Date: 2008-03-04 07:39:43 +0100
                    }
                }
                log {
                    return {
                        ------------------------------------------
                        r122 | pspjuth | 2008-02-19 13:58:14 +0100
                        ------------------------------------------
                        r117 | pspjuth | 2008-02-15 09:07:16 +0100
                        ------------------------------------------
                        r115 | pspjuth | 2008-02-14 11:11:07 +0100
                        ------------------------------------------
                    }
                }
            }
            return
        }
        default {
            #eval _stub_exec $args
        }
    }
}

# Do not detect git or fossil
set ::auto_execs(git) ""
set ::auto_execs(fossil) ""

test rev-1.1 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Bepa/5
    eskil::rev::CT::ParseRevs filename 2
} -result {/Bepa/2}

test rev-1.2 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Bepa/5
    eskil::rev::CT::ParseRevs filename 22
} -result {/Bepa/22}

test rev-1.3 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Bepa/5
    eskil::rev::CT::ParseRevs filename Bepa/12
} -result {/Apa/Bepa/12}

test rev-1.4 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Bepa/5
    eskil::rev::CT::ParseRevs filename Cepa/2
} -result {/Apa/Cepa/2}

test rev-1.5 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Apa/Bepa/Cepa/7
    eskil::rev::CT::ParseRevs filename ../5
} -result {/Apa/Bepa/5}

test rev-1.6 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Apa/Bepa/12
    eskil::rev::CT::ParseRevs filename ""
} -result {/Apa/Bepa/12}

test rev-1.7 {
    ClearCase revisions
} -body {
    set ::ct_describe /Apa/Bepa/11
    eskil::rev::CT::ParseRevs filename -1
} -result {/Apa/Bepa/11}

test rev-1.8 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Apa/Bepa/7
    eskil::rev::CT::ParseRevs filename Apa/-3
} -result {/Apa/19}

test rev-1.9 {
    ClearCase revisions
} -body {
    set ::ct_ls @@/Apa/Cepa/7
    eskil::rev::CT::ParseRevs filename -5
} -result {/Apa/Cepa/0}

test rev-2.1 {
    Detecting, CVS
} -body {
    set f [tcltest::makeFile {} _rev2_1]
    file mkdir CVS
    detectRevSystem $f
} -cleanup {
    tcltest::removeFile {} _rev2_1
} -result {CVS}

test rev-2.2 {
    Detecting, CVS
} -body {
    set ::auto_execs(cvs) ""
    set f [tcltest::makeFile {} _rev2_2]
    detectRevSystem $f
} -cleanup {
    file delete -force CVS
    tcltest::removeFile {} _rev2_2
} -result {}

test rev-2.3 {
    Detecting, RCS
} -body {
    set f [tcltest::makeFile {} _rev2_3]
    file mkdir RCS
    set ch [open RCS/_rev2_3,v w]
    puts $ch x
    close $ch
    set ::auto_execs(rcs) "x"
    detectRevSystem $f
} -cleanup {
    tcltest::removeFile {} _rev2_3
} -result {RCS}

test rev-2.4 {
    Detecting, RCS
} -body {
    set f [tcltest::makeFile {} _rev2_4]
    set ::auto_execs(rcs) ""
    detectRevSystem $f
} -cleanup {
    tcltest::removeFile {} _rev2_4
    file delete -force RCS
} -result {}

test rev-2.5 {
    Detecting, CT
} -body {
    set f [tcltest::makeFile {} _rev2_5]
    set ::auto_execs(cleartool) "x"
    unset -nocomplain ::ct_pwv
    detectRevSystem $f
} -cleanup {
    tcltest::removeFile {} _rev2_5
} -result {}

test rev-2.6 {
    Detecting, CT
} -body {
    set f [tcltest::makeFile {} _rev2_6]
    set ::auto_execs(cleartool) "x"
    set ::ct_pwv "** NONE **"
    detectRevSystem $f
} -cleanup {
    tcltest::removeFile {} _rev2_6
} -result {}

test rev-2.7 {
    Detecting, CT
} -body {
    set f [tcltest::makeFile {} _rev2_7]
    set ::auto_execs(cleartool) "x"
    set ::ct_pwv "gurka"
    detectRevSystem $f
} -cleanup {
    tcltest::removeFile {} _rev2_7
} -result {CT}

test rev-2.8 {
    Detecting, GIT
} -body {
    set f [tcltest::makeFile {} _rev2_8]
    set ::auto_execs(git) "x"
    set apa [file isdirectory .git]
    if {!$apa} {
        file mkdir .git
    }
    set res [detectRevSystem $f]
    if {!$apa} {
        file delete .git
    }
    set ::auto_execs(git) ""
    set res
} -cleanup {
    tcltest::removeFile {} _rev2_8
} -result {GIT}

test rev-2.9 {
    Detecting, HG
} -body {
    set f [tcltest::makeFile {} _rev2_9]
    set ::auto_execs(hg) "x"
    set apa [file isdirectory .hg]
    if {!$apa} {
        file mkdir .hg
    }
    set res [detectRevSystem $f]
    if {!$apa} {
        file delete .hg
    }
    set res
} -cleanup {
    tcltest::removeFile {} _rev2_9
} -result {HG}

test rev-2.10 {
    Detecting, SVN
} -body {
    set f [tcltest::makeFile {} _rev2_10]
    set ::auto_execs(svn) "x"
    set apa [file isdirectory .svn]
    if {!$apa} {
        file mkdir .svn
    }
    set res [detectRevSystem $f]
    if {!$apa} {
        file delete .svn
    }
    set res
} -cleanup {
    tcltest::removeFile {} _rev2_10
} -result {SVN}

test rev-2.11 {
    Detecting, BZR
} -body {
    set f [tcltest::makeFile {} _rev2_11]
    set ::auto_execs(bzr) "x"
    set apa [file isdirectory .bzr]
    if {!$apa} {
        file mkdir .bzr
    }
    set res [detectRevSystem $f]
    if {!$apa} {
        file delete .bzr
    }
    set res
} -cleanup {
    tcltest::removeFile {} _rev2_11
} -result {BZR}

test rev-2.12 {
    Detecting, Fossil
} -body {
    set f [tcltest::makeFile {} _rev2_12]
    set ::auto_execs(fossil) "x"
    set apa [file exists _FOSSIL_]
    if {!$apa} {
        file mkdir _FOSSIL_
    }
    set res [detectRevSystem $f]
    if {!$apa} {
        file delete _FOSSIL_
    }
    set ::auto_execs(fossil) ""
    set res
} -cleanup {
    tcltest::removeFile {} _rev2_12
} -result {FOSSIL}

test rev-3.1 {
    Subversion revisions
} -body {
    eskil::rev::SVN::ParseRevs filename -1
} -result {117}

test rev-3.2 {
    Subversion revisions
} -body {
    eskil::rev::SVN::ParseRevs filename -2
} -result {115}

test rev-3.3 {
    Subversion revisions
} -body {
    eskil::rev::SVN::ParseRevs filename 0
} -result {BASE}


# Tests below tries to use the real tools and temporary repos.
# They are dependent on running on a system with tools installed.
clearstub

proc Fill1 {} {
    cd $::work
    file mkdir dir1
    file mkdir dir2
    exec touch f1
    exec touch f2
    exec touch dir1/f11
    exec touch dir1/f12
    exec touch dir2/f21
    exec touch dir2/f22
}
proc Fill2 {} {
    cd $::work
    exec echo Hej > f1
    exec echo Hopp > f2
}
proc Fill3 {} {
    cd $::work
    exec echo Nisse > dir1/f11
    exec echo Hult  > dir2/f21
    exec echo Lingonben >> f1
}
proc Fill4 {} {
    cd $::work
    exec echo Musse > dir1/f11
    exec echo Pigg  > dir1/f12
    exec echo Mimmi >> dir2/f21
    exec echo Pluto >> f2
}

proc CreateRepo {type} {
    set repoDir [tmpFile]
    file mkdir $repoDir
    switch $type {
        FOSSIL {
            set repo $repoDir/apa.fossil
            set ::work $repoDir/wk
            exec fossil new $repo
            file mkdir $::work
            cd $::work
            exec fossil open $repo
            set cmt "fossil commit -m"
        }
        GIT {
            set ::work $repoDir
            file mkdir $::work
            cd $::work
            exec git init
            set cmt "git commit -am"
        }
        SVN {
            exec svnadmin create $repoDir
            set ::work [tmpFile]
            exec svn checkout file://$repoDir $::work
            cd $::work
            set cmt "svn commit -m"
        }
        HG {
            set ::work $repoDir
            file mkdir $::work
            cd $::work
            exec hg init
            set cmt "hg commit -u Eskil -m"
        }
        default { error MOO }
    }
    Fill1
    switch $type {
        FOSSIL { exec fossil addremove }
        GIT    { exec git add *}
        SVN    { exec svn add {*}[glob *]}
        HG     { exec hg  add {*}[glob *]}
    }
    exec {*}$cmt "First"
    Fill2
    exec {*}$cmt "Second"
    Fill3
    exec {*}$cmt "Third"
    # Local changes
    Fill4

    # Any cleanup?
    switch $type {
        SVN { exec svn update }
        FOSSIL {exec fossil status --sha1sum}
    }
}

foreach type {FOSSIL GIT SVN HG} {
    test rev-4.$type.1 {
        Setup fake repo
    } -body {
        CreateRepo $type
        # Dump info for debug of setup
        if 0 {
            puts "------------------- $type --------------------"
            puts "--- $::work"
            switch $type {
                FOSSIL { puts [exec fossil timeline -v] }
                GIT    { puts [exec git log --name-only] }
                SVN    { puts [exec svn log --verbose] }
                HG     { puts [exec hg log --verbose] }
            }
        }
        list
    }

    test rev-4.$type.2 {
        GetTopDir
    } -body {
        cd ~
        eskil::rev::${type}::GetTopDir $::work/dir1/f11 dir tail
        list [expr {$dir eq $::work}] $tail
    } -result {1 dir1/f11}

    test rev-4.$type.3 {
        get
    } -body {
        cd ~
        set out [tmpFile]
        eskil::rev::${type}::get $::work/dir1/f11 $out ""
        exec cat $out
    } -result {Nisse}

    test rev-4.$type.4 {
        getChangedFiles
    } -body {
        cd ~
        set f $::work/dir1/f11
        set revs [eskil::rev::${type}::ParseRevs $f "-1 0"]
        lsort -dictionary [eskil::rev::${type}::getChangedFiles $f $revs]
    } -match regexp -result {^/\S+/dir1/f11 /\S+/dir2/f21 /\S+/f1 /\S+/f2$}

    test rev-4.$type.5 {
        getChangedFiles
    } -body {
        cd ~
        set f $::work/f1
        set revs [eskil::rev::${type}::ParseRevs $f "-1 0"]
        lsort -dictionary [eskil::rev::${type}::getChangedFiles $f $revs]
    } -match regexp -result {^/\S+/dir1/f11 /\S+/dir2/f21 /\S+/f1$}

    test rev-4.$type.16 {
        getPatch, list of files
    } -body {
        # getPatch needs to be in the checkout
        cd $::work
        set files [list $::work/dir1 $::work/f1 $::work/f2]
        if {$type in "SVN"} {
            # SVN gives full paths when given full paths
            set expect [list $::work/dir1/f11 $::work/dir1/f12 $::work/f2]
        } else {
            set expect [list dir1/f11 dir1/f12 f2]
        }
        set expect [lsort -dictionary $expect]
        set patch [eskil::rev::${type}::getPatch {} $files outFileList]
        if {$outFileList ne $expect} {
            return $outFileList ;#$patch
        } else {
            return 1
        }
    } -result 1

    test rev-4.$type.7 {
        getPatch, list of files
    } -body {
        # getPatch needs to be in the checkout
        cd $::work
        set files [list dir1 f1 f2]
        set expect [list dir1/f11 dir1/f12 f2]
        set expect [lsort -dictionary $expect]
        set patch [eskil::rev::${type}::getPatch {} $files outFileList]
        if {$outFileList ne $expect} {
            return $outFileList ;#$patch
        } else {
            return 1
        }
    } -result 1

    test rev-4.$type.8 {
        getPatch, list of files
    } -body {
        # getPatch needs to be in the checkout
        cd $::work
        set f f1
        set revs [eskil::rev::${type}::ParseRevs $f "-1 0"]
        set files [list dir1 f1 f2]
        set expect [list dir1/f11 f1]
        set expect [lsort -dictionary $expect]
        set patch [eskil::rev::${type}::getPatch $revs $files outFileList]
        if {$outFileList ne $expect} {
            return $outFileList ;#$patch
        } else {
            return 1
        }
    } -result 1
    
    clearTmp
}