Subject: Prefer to extract package data from the *contents* not the directory name.

From: dgp <[email-masked]>
Date: Wed, 12 Dec 2012 20:16:13 +0000

---
 pkgs/package.list.txt    |  2 +-
 tools/tcltk-man2html.tcl | 57 +++++++++++++++++++++++++++++++++++++++++-------
 unix/Makefile.in         |  3 +--
 3 files changed, 51 insertions(+), 11 deletions(-)

diff --git a/pkgs/package.list.txt b/pkgs/package.list.txt
index f12111d..a13b0fb 100644
--- a/pkgs/package.list.txt
+++ b/pkgs/package.list.txt
@@ -23,4 +23,4 @@ TDBC TDBC
 tdbcmysql	tdbc::mysql
 tdbcodbc	tdbc::odbc
 tdbcpostgres	tdbc::postgres
-tdbcsqlite3-	tdbc::sqlite3
+tdbcsqlite3	tdbc::sqlite3
diff --git a/tools/tcltk-man2html.tcl b/tools/tcltk-man2html.tcl
index 270a774..f392bce 100755
--- a/tools/tcltk-man2html.tcl
+++ b/tools/tcltk-man2html.tcl
@@ -461,18 +461,15 @@ proc plus-pkgs {type args} {
     if {!$build_tcl} return
     set result {}
     set pkgsdir $tcltkdir/$tcldir/pkgs
-    foreach {dir name} $args {
-	set globpat $pkgsdir/{$dir,$dir\[0-9\]*}/doc/*.$type
+    foreach {dir name version} $args {
+	set globpat $pkgsdir/$dir/doc/*.$type
 	if {![llength [glob -type f -nocomplain $globpat]]} {
 	    # Fallback for manpages generated using doctools
-	    set globpat $pkgsdir/{$dir,$dir\[0-9\]*}/doc/man/*.$type
+	    set globpat $pkgsdir/$dir/doc/man/*.$type
 	    if {![llength [glob -type f -nocomplain $globpat]]} {
 		continue
 	    }
 	}
-	regexp "pkgs/${dir}(.*)/doc$" \
-	    [lindex [glob -type d $pkgsdir/{$dir,$dir\[0-9\]*}/doc] 0] \
-	    -> version
 	switch $type {
 	    n {
 		set title "$name Package Commands"
@@ -650,6 +647,42 @@ try {
 	append appdir "$tkdir"
     }
 
+
+    # When building docs for Tcl, try to build docs for bundled packages too
+    set packageBuildList {}
+    if  {$build_tcl} {
+	set pkgsDir [file join $tcltkdir $tcldir pkgs]
+	set subdirs [glob -nocomplain -types d -tails -directory $pkgsDir *]
+
+	foreach dir [lsort $subdirs] {
+	    # Parse the subdir name into (name, version) as fallback...
+	    set description [split $dir -]
+	    if {2 != [llength $description]} {
+		regexp {([^0-9]*)(.*)} $dir -> n v
+		set description [list $n $v]
+	    }
+
+	    # ... but try to extract (name, version) from subdir contents
+	    try {
+		set f [open [file join $pkgsDir $dir configure.in]]
+		foreach line [split [read $f] \n] {
+		    if {2 == [scan $line \
+			    { AC_INIT ( [%[^]]] , [%[^]]] ) } n v]} {
+			set description [list $n $v]
+			break
+		    }
+		}
+	    } finally {
+		catch {close $f; unset f}
+	    }
+
+	    if {[file exists [file join $pkgsDir $dir configure]]} {
+		# Looks like a package, record our best extraction attempt
+		lappend packageBuildList $dir {*}$description
+	    }
+	}
+    }
+
     # Get the list of packages to try, and what their human-readable names
     # are. Note that the package directory list should be version-less.
     try {
@@ -674,6 +707,14 @@ try {
 	}
     }
 
+    # Convert to human readable names, if applicable
+    for {set idx 0} {$idx < [llength $packageBuildList]} {incr idx 3} {
+	lassign [lrange $packageBuildList $idx $idx+2] d n v
+	if {[dict exists $packageDirNameMap $n]} {
+	    lset packageBuildList $idx+1 [dict get $packageDirNameMap $n]
+	}
+    }
+
     #
     # Invoke the scraper/converter engine.
     #
@@ -684,12 +725,12 @@ try {
 	     "The commands which the <B>tclsh</B> interpreter implements."] \
 	[plus-base $build_tk $tkdir doc/*.n {Tk Commands} TkCmd \
 	     "The additional commands which the <B>wish</B> interpreter implements."] \
-	{*}[plus-pkgs n {*}$packageDirNameMap] \
+	{*}[plus-pkgs n {*}$packageBuildList] \
 	[plus-base $build_tcl $tcldir doc/*.3 {Tcl C API} TclLib \
 	     "The C functions which a Tcl extended C program may use."] \
 	[plus-base $build_tk $tkdir doc/*.3 {Tk C API} TkLib \
 	     "The additional C functions which a Tk extended C program may use."] \
-	{*}[plus-pkgs 3 {*}$packageDirNameMap]
+	{*}[plus-pkgs 3 {*}$packageBuildList]
 } on error {msg opts} {
     # On failure make sure we show what went wrong. We're not supposed
     # to get here though; it represents a bug in the script.
diff --git a/unix/Makefile.in b/unix/Makefile.in
index 680d4ce..df05759 100644
--- a/unix/Makefile.in
+++ b/unix/Makefile.in
@@ -2019,8 +2019,7 @@ dist: $(UNIX_DIR)/configure $(UNIX_DIR)/tclConfig.h.in $(UNIX_DIR)/tcl.pc.in $(M
 	cp -p $(TOMMATH_SRCS) $(TOMMATH_DIR)/*.h \
 		$(DISTDIR)/libtommath
 	mkdir $(DISTDIR)/pkgs
-	cp $(TOP_DIR)/pkgs/README $(TOP_DIR)/pkgs/package.list.txt \
-		$(DISTDIR)/pkgs
+	cp $(TOP_DIR)/pkgs/README $(DISTDIR)/pkgs
 	for i in `ls $(DISTROOT)/pkgs/*.tar.gz 2> /dev/null`; do \
 	    tar -C $(DISTDIR)/pkgs -xzf "$$i"; \
 	done
-- 
cgit v0.12