### Script to clear Visual Studio's web cache for projects in a given solution file.
variable VS2K3VersionString "Microsoft Visual Studio Solution File, Format Version 8.00"
# We need the uri package to parse the project URLs
package require uri
proc find_projects {sln_body} {
# Returns a list containing the projects in the solution. Each list item is itself a list:
# element 0 is the project name, element 1 is the location for the project
variable VS2K3VersionString
set projects_out [list]
if {[string first $VS2K3VersionString $sln_body] != 0} {
error "This doesn't appear to be a VS2003 solution file. I don't know what to do with it."
}
set sln_body [string range $sln_body [string length $VS2K3VersionString] end]
# An arbitrary unicode character used to mark the end of projects so we can split the projects
set arbitrary_unicode_char \u9999
set sln_body [string map [list {EndProjectSection} {EndProjectSection} {EndProject} "EndProject${arbitrary_unicode_char}"] $sln_body]
# Split the sln_body into projects and drop all the non-project stuff at the end of the .sln
# This assumes that projects are always at the beginning of the .sln file.
# We also assume that there is non-project stuff in the .sln following the projects -
# lrange trims off everything after the last project
set projects [lrange [split $sln_body $arbitrary_unicode_char] 0 end-1]
foreach p $projects {
set p [string trim $p]
set temp [string range $p [expr {[string first "=" $p]+1}] end]
foreach {name location} [split $temp ","] {break}
set name [string trim [string map [list {"} {}] $name]]
set location [string trim [string map [list {"} {}] $location]]
lappend projects_out [list $name $location]
}
return $projects_out
}
proc find_web_projects {sln_body} {
# Returns just the web projects in a solution
set projects_out [list]
set plist [find_projects $sln_body]
foreach project $plist {
foreach {name location} $project {break}
if {[string match "http://*" $location]} {
lappend projects_out $project
}
}
return $projects_out
}
proc clear_web_cache {sln_body cache_dir} {
foreach project [find_web_projects $sln_body] {
foreach {name url} $project {break}
array set url_arr [uri::split $url]
if {[string equal "localhost" $url_arr(host)]} {
set url_arr(host) [info hostname]
}
set url_arr(host) [string toupper $url_arr(host)]
set path_to_delete [file join $cache_dir $url_arr(host) [file dirname $url_arr(path)]]
if {[file exists $path_to_delete] && [file isdirectory $path_to_delete]} {
file delete -force $path_to_delete
puts "Deleted cache directory $path_to_delete"
}
}
}
# Usage sample:
set fd [open SomeSolution.sln r]
set sln_body [read $fd]
close $fd
clear_web_cache $sln_body [file join $env(USERPROFILE) VSWebCache]-- Joseph Anderson

