### 
### Utility for the build process. Main purpose currently:
###
###  - Build the pkgIndex in each directory
###

# adjust the paths;
# - auto_path is needed, when nx is loaded via good old pkgIndex.tcl
# - tcl::tm::roots is needed when nx is provided as a Tcl module (.tm)
lappend auto_path ..

# Is support for Tcl modules available (>= Tcl 8.5)?
if {[info commands ::tcl::tm::roots] ne ""} {
    ::tcl::tm::roots [pwd]
}

set verbose 0

proc mkIndex {} {
    if {$::verbose} {
        puts stderr "+++ mkIndex in [pwd]"
    }
    set fls {}
    foreach f [glob -nocomplain *tcl] {
	if {![file isdirectory $f] && $f ne "pkgIndex.tcl"} {
	    set F [open $f]; set c [read $F]; close $F
	    if {[string match "*package provide*" $c]} {
		lappend fls $f 
		#puts "provide in $f"
		foreach l [split $c \n] {
		    #puts stderr "check $l"
		    if {[regexp {^\s*package\s+provide\s+(\S+)\s+([0-9]\S+)\s*$} $l _ pkg version]} {
			#puts stderr "found package $pkg $version in $f"
			set pkg_file($pkg) $f
			set pkg_version($pkg) $version
			break
		    }
		}
	    }
	}
    }

    set pkgIndex ""
    foreach pkg [lsort [array names pkg_file]] {
	append pkgIndex "package ifneeded $pkg $pkg_version($pkg)\
	       \"\[list source \[file join \$dir $pkg_file($pkg)\]\];\
	       \[list package provide $pkg $pkg_version($pkg)\]\"\n"
    }

    foreach addFile [glob -nocomplain *.add] {
	if {[file exists $addFile]} {
	    puts stderr "Appending $addFile to pkgIndex.tcl in [pwd]"
	    set IN [open $addFile]
	    append pkgIndex [read $IN]\n
	    close $IN
	}
    }
    
    if {$pkgIndex ne ""} {
	if {$::verbose} {
            puts stderr "Write [pwd]/pkgIndex.tcl"
        }
	set OUT [open pkgIndex.tcl w]
	puts -nonewline $OUT $pkgIndex
	close $OUT
    }

    #puts stderr "+++ mkIndex pwd=[pwd] DONE"
}

proc inEachDir {path cmd} {
    if {$::verbose} {
        puts stderr "[pwd] inEachDir $path (dir [file isdirectory $path]) $cmd"
    }
    if { [file isdirectory $path] 
         && ![string match *CVS $path]
         && ![string match *SCCS $path]
         && ![string match *Attic $path]
         && ![string match *dbm* $path]
       } {
	set olddir [pwd]
	cd $path
	if {[catch $cmd errMsg]} {
	    error  "$errMsg (in directory [pwd])"
	}
	set files [glob -nocomplain *]
	cd $olddir
	foreach p $files {
            inEachDir $path/$p $cmd
        }
	if {$::verbose} {
            puts stderr "+++ change back to $olddir"
        }
    }
}

inEachDir . mkIndex
