A Tcl repository is a isn't really a repository. This page should be phased out into more appropriate pages.
Policy: If you want to add an extension or an application, simply select the proper category, add the name and a short description and include a link as to where it can be found.
AM: I created this page, 26 September 2006, because I realised that the Wiki is, with all its flaws, disorder and general unstructuredness a wonderful place that everybody can contribute to. It is very easy to add or correct information, the infrastructure to do this is all there. So, this page may not be the best repository the Tcl community can wish for, it is at least an easy one to maintain!
See Interacting with databases
See debugging
See IDE
SYStems mmm ... no. For one we already have the gutter [L1 ] if any work is to be done, I recommend it be done to improve our gutter make it work like debian's apt-get or Perl's CPAN (i.e. work on the command line interface, or the Tk interface ;))
AM: This page is not meant to replace gutter - not at all! It is just that due to the lack of an obvious central repository people can not find what they are looking for. This page is merely meant as a guide.
SYStems: The gutter (if it succeed) should be the Obvious destination to look (and add) for packages & to find information about packages. Plus a single wiki page just isn't practical or pretty. Look at the ask and it shall be give pages, I think they are horrible, a wiki can't replace a forum, a wiki can't replace a package repository either.
I'm rather uncertain what the OP and others want on this page. In the past, there have been, and continue to be, pages with long lists of tcl extensions and applications. Why start yet another one?
I can understand why one might want to have one page listing the various repositories - but why start a parallel page on this wiki for this sort of thing?
DKF: A PACKAGE FETCHING SCRIPT
Based on my recent rant [?] on comp.lang.tcl, here's a script that implements the sort of thing which I'm really looking for on the client side. Note that it uses a fair number of Tcl 8.5 features; this is deliberate.
package require Tcl 8.5 package require http 2 namespace eval pkgutil { namespace export "\[a-z]*" namespace ensemble create variable repository http://repository.tcl.tk/packages proc listPackages {{pattern *}} { variable repository # We pass the pattern, but the repository MAY ignore it set token [http::geturl $repository?[http::formatQuery pat $pattern]] if {![string match 2?? [http::ncode $token]]} { set msg [join [lrange [split [http::code $token]] 2 end]] http::cleanup $token return -code error $msg } set result {} foreach pkgName [lsort [split [http::data $token]]] { if {[string match $pattern $pkgName]} { lappend result $pkgName } } http::cleanup $token return $result } proc listVersions {pkgName {pattern *}} { variable repository # We pass the pattern, but the repository MAY ignore it set token [http::geturl \ $repository/$pkgName?[http::formatQuery pat $pattern]] if {![string match 2?? [http::ncode $token]]} { set msg [join [lrange [split [http::code $token]] 2 end]] http::cleanup $token return -code error $msg } set result {} foreach version [lsort [split [http::data $token]]] { if {[string match $pattern $version]} { lappend result $version } } http::cleanup $token return $result } proc listPlatforms {pkgName version {pattern *}} { variable repository # We pass the pattern, but the repository MAY ignore it set token [http::geturl \ $repository/$pkgName/$version?[http::formatQuery pat $pattern]] if {![string match 2?? [http::ncode $token]]} { set msg [join [lrange [split [http::code $token]] 2 end]] http::cleanup $token return -code error $msg } set result {} foreach platform [lsort [split [http::data $token]]] { if {[string match $pattern $platform]} { lappend result $platform } } http::cleanup $token return $result } proc fetch {pkgName version platform {targetFilename ~}} { if {[file isdirectory $targetFilename]} { set targetFilename [file join $targetFilename $pkgName-$version.tm] } set out [open $targetFilename wb] set url $repository/$pkgName/$version/$platform/$pkgName-$version.tm for {set i 0} {$i<5} {incr i} { set token [http::geturl $url -binary 1 -channel $out $url] if {![string match 3?? [http::ncode $token]]} { break } # Follow redirects a few times (the loop around this) set url [dict get [array get $token] meta Location] http::cleanup $token } if {![string match 2?? [http::ncode $token]]} { set msg [join [lrange [split [http::code $token]] 2 end]] http::cleanup $token return -code error $msg } http::cleanup $token close $out } } package provide pkgutil 0.1
SC: This sort of functionality has been available in the CANTCL code since the start, eg:
# installer::install_extension -- # # Download a zip file contianing a tcl extension from the given # uri and install it in the current tcl installation. # # Arguments: # uri -- the location of the zip file # Results: # The file is downloaded, installed and the local copy is deleted
This is in the installer package, you can still browse the code via cantcl at http://www.ics.mq.edu.au/~cassidy/cgi-bin/cantcl/package/installer-0.6/tcl along with a bunch of other utilities. The CANTCL package manages the server side of this.
LV 2009-09-18
Note that since the above list is manually maintained, some of the versions mentioned may not be the latest available - or for that matter, may not be available at all, in the case of the equi4.com URLs.