Index: third_party/sqlite/src/vsixtest/vsixtest.tcl |
diff --git a/third_party/sqlite/src/vsixtest/vsixtest.tcl b/third_party/sqlite/src/vsixtest/vsixtest.tcl |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5dce821dc4e70075f43aecf9a739ee3ec9eb5466 |
--- /dev/null |
+++ b/third_party/sqlite/src/vsixtest/vsixtest.tcl |
@@ -0,0 +1,373 @@ |
+#!/usr/bin/tclsh |
+# |
+# This script is used to quickly test a VSIX (Visual Studio Extension) file |
+# with Visual Studio 2015 on Windows. |
+# |
+# PREREQUISITES |
+# |
+# 1. This tool is Windows only. |
+# |
+# 2. This tool must be executed with "elevated administrator" privileges. |
+# |
+# 3. Tcl 8.4 and later are supported, earlier versions have not been tested. |
+# |
+# 4. The "sqlite-UWP-output.vsix" file is assumed to exist in the parent |
+# directory of the directory containing this script. The [optional] first |
+# command line argument to this script may be used to specify an alternate |
+# file. However, currently, the file must be compatible with both Visual |
+# Studio 2015 and the Universal Windows Platform. |
+# |
+# 5. The "VERSION" file is assumed to exist in the parent directory of the |
+# directory containing this script. It must contain a version number that |
+# matches the VSIX file being tested. |
+# |
+# 6. The temporary directory specified in the TEMP or TMP environment variables |
+# must refer to an existing directory writable by the current user. |
+# |
+# 7. The VS140COMNTOOLS environment variable must refer to the Visual Studio |
+# 2015 common tools directory. |
+# |
+# USAGE |
+# |
+# The first argument to this script is optional. If specified, it must be the |
+# name of the VSIX file to test. |
+# |
+package require Tcl 8.4 |
+ |
+proc fail { {error ""} {usage false} } { |
+ if {[string length $error] > 0} then { |
+ puts stdout $error |
+ if {!$usage} then {exit 1} |
+ } |
+ |
+ puts stdout "usage:\ |
+[file tail [info nameofexecutable]]\ |
+[file tail [info script]] \[vsixFile\]" |
+ |
+ exit 1 |
+} |
+ |
+proc isWindows {} { |
+ # |
+ # NOTE: Returns non-zero only when running on Windows. |
+ # |
+ return [expr {[info exists ::tcl_platform(platform)] && \ |
+ $::tcl_platform(platform) eq "windows"}] |
+} |
+ |
+proc isAdministrator {} { |
+ # |
+ # NOTE: Returns non-zero only when running as "elevated administrator". |
+ # |
+ if {[isWindows]} then { |
+ if {[catch {exec -- whoami /groups} groups] == 0} then { |
+ set groups [string map [list \r\n \n] $groups] |
+ |
+ foreach group [split $groups \n] { |
+ # |
+ # NOTE: Match this group line against the "well-known" SID for |
+ # the "Administrators" group on Windows. |
+ # |
+ if {[regexp -- {\sS-1-5-32-544\s} $group]} then { |
+ # |
+ # NOTE: Match this group line against the attributes column |
+ # sub-value that should be present when running with |
+ # elevated administrator credentials. |
+ # |
+ if {[regexp -- {\sEnabled group(?:,|\s)} $group]} then { |
+ return true |
+ } |
+ } |
+ } |
+ } |
+ } |
+ |
+ return false |
+} |
+ |
+proc getEnvironmentVariable { name } { |
+ # |
+ # NOTE: Returns the value of the specified environment variable or an empty |
+ # string for environment variables that do not exist in the current |
+ # process environment. |
+ # |
+ return [expr {[info exists ::env($name)] ? $::env($name) : ""}] |
+} |
+ |
+proc getTemporaryPath {} { |
+ # |
+ # NOTE: Returns the normalized path to the first temporary directory found |
+ # in the typical set of environment variables used for that purpose |
+ # or an empty string to signal a failure to locate such a directory. |
+ # |
+ set names [list] |
+ |
+ foreach name [list TEMP TMP] { |
+ lappend names [string toupper $name] [string tolower $name] \ |
+ [string totitle $name] |
+ } |
+ |
+ foreach name $names { |
+ set value [getEnvironmentVariable $name] |
+ |
+ if {[string length $value] > 0} then { |
+ return [file normalize $value] |
+ } |
+ } |
+ |
+ return "" |
+} |
+ |
+proc appendArgs { args } { |
+ # |
+ # NOTE: Returns all passed arguments joined together as a single string |
+ # with no intervening spaces between arguments. |
+ # |
+ eval append result $args |
+} |
+ |
+proc readFile { fileName } { |
+ # |
+ # NOTE: Reads and returns the entire contents of the specified file, which |
+ # may contain binary data. |
+ # |
+ set file_id [open $fileName RDONLY] |
+ fconfigure $file_id -encoding binary -translation binary |
+ set result [read $file_id] |
+ close $file_id |
+ return $result |
+} |
+ |
+proc writeFile { fileName data } { |
+ # |
+ # NOTE: Writes the entire contents of the specified file, which may contain |
+ # binary data. |
+ # |
+ set file_id [open $fileName {WRONLY CREAT TRUNC}] |
+ fconfigure $file_id -encoding binary -translation binary |
+ puts -nonewline $file_id $data |
+ close $file_id |
+ return "" |
+} |
+ |
+proc putsAndEval { command } { |
+ # |
+ # NOTE: Outputs a command to the standard output channel and then evaluates |
+ # it in the callers context. |
+ # |
+ catch { |
+ puts stdout [appendArgs "Running: " [lrange $command 1 end] ...\n] |
+ } |
+ |
+ return [uplevel 1 $command] |
+} |
+ |
+proc isBadDirectory { directory } { |
+ # |
+ # NOTE: Returns non-zero if the directory is empty, does not exist, -OR- is |
+ # not a directory. |
+ # |
+ catch { |
+ puts stdout [appendArgs "Checking directory \"" $directory \"...\n] |
+ } |
+ |
+ return [expr {[string length $directory] == 0 || \ |
+ ![file exists $directory] || ![file isdirectory $directory]}] |
+} |
+ |
+proc isBadFile { fileName } { |
+ # |
+ # NOTE: Returns non-zero if the file name is empty, does not exist, -OR- is |
+ # not a regular file. |
+ # |
+ catch { |
+ puts stdout [appendArgs "Checking file \"" $fileName \"...\n] |
+ } |
+ |
+ return [expr {[string length $fileName] == 0 || \ |
+ ![file exists $fileName] || ![file isfile $fileName]}] |
+} |
+ |
+# |
+# NOTE: This is the entry point for this script. |
+# |
+set script [file normalize [info script]] |
+ |
+if {[string length $script] == 0} then { |
+ fail "script file currently being evaluated is unknown" true |
+} |
+ |
+if {![isWindows]} then { |
+ fail "this tool only works properly on Windows" |
+} |
+ |
+if {![isAdministrator]} then { |
+ fail "this tool must run with \"elevated administrator\" privileges" |
+} |
+ |
+set path [file normalize [file dirname $script]] |
+set argc [llength $argv]; if {$argc > 1} then {fail "" true} |
+ |
+if {$argc == 1} then { |
+ set vsixFileName [lindex $argv 0] |
+} else { |
+ set vsixFileName [file join \ |
+ [file dirname $path] sqlite-UWP-output.vsix] |
+} |
+ |
+############################################################################### |
+ |
+if {[isBadFile $vsixFileName]} then { |
+ fail [appendArgs \ |
+ "VSIX file \"" $vsixFileName "\" does not exist"] |
+} |
+ |
+set versionFileName [file join [file dirname $path] VERSION] |
+ |
+if {[isBadFile $versionFileName]} then { |
+ fail [appendArgs \ |
+ "Version file \"" $versionFileName "\" does not exist"] |
+} |
+ |
+set projectTemplateFileName [file join $path vsixtest.vcxproj.data] |
+ |
+if {[isBadFile $projectTemplateFileName]} then { |
+ fail [appendArgs \ |
+ "Project template file \"" $projectTemplateFileName \ |
+ "\" does not exist"] |
+} |
+ |
+set envVarName VS140COMNTOOLS |
+set vsDirectory [getEnvironmentVariable $envVarName] |
+ |
+if {[isBadDirectory $vsDirectory]} then { |
+ fail [appendArgs \ |
+ "Visual Studio 2015 directory \"" $vsDirectory \ |
+ "\" from environment variable \"" $envVarName \ |
+ "\" does not exist"] |
+} |
+ |
+set vsixInstaller [file join \ |
+ [file dirname $vsDirectory] IDE VSIXInstaller.exe] |
+ |
+if {[isBadFile $vsixInstaller]} then { |
+ fail [appendArgs \ |
+ "Visual Studio 2015 VSIX installer \"" $vsixInstaller \ |
+ "\" does not exist"] |
+} |
+ |
+set envVarName ProgramFiles |
+set programFiles [getEnvironmentVariable $envVarName] |
+ |
+if {[isBadDirectory $programFiles]} then { |
+ fail [appendArgs \ |
+ "Program Files directory \"" $programFiles \ |
+ "\" from environment variable \"" $envVarName \ |
+ "\" does not exist"] |
+} |
+ |
+set msBuild [file join $programFiles MSBuild 14.0 Bin MSBuild.exe] |
+ |
+if {[isBadFile $msBuild]} then { |
+ fail [appendArgs \ |
+ "MSBuild v14.0 executable file \"" $msBuild \ |
+ "\" does not exist"] |
+} |
+ |
+set temporaryDirectory [getTemporaryPath] |
+ |
+if {[isBadDirectory $temporaryDirectory]} then { |
+ fail [appendArgs \ |
+ "Temporary directory \"" $temporaryDirectory \ |
+ "\" does not exist"] |
+} |
+ |
+############################################################################### |
+ |
+set installLogFileName [appendArgs \ |
+ [file rootname [file tail $vsixFileName]] \ |
+ -install- [pid] .log] |
+ |
+set commands(1) [list exec [file nativename $vsixInstaller]] |
+ |
+lappend commands(1) /quiet /norepair |
+lappend commands(1) [appendArgs /logFile: $installLogFileName] |
+lappend commands(1) [file nativename $vsixFileName] |
+ |
+############################################################################### |
+ |
+set buildLogFileName [appendArgs \ |
+ [file rootname [file tail $vsixFileName]] \ |
+ -build-%configuration%-%platform%- [pid] .log] |
+ |
+set commands(2) [list exec [file nativename $msBuild]] |
+ |
+lappend commands(2) [file nativename [file join $path vsixtest.sln]] |
+lappend commands(2) /target:Rebuild |
+lappend commands(2) /property:Configuration=%configuration% |
+lappend commands(2) /property:Platform=%platform% |
+ |
+lappend commands(2) [appendArgs \ |
+ /logger:FileLogger,Microsoft.Build.Engine\;Logfile= \ |
+ [file nativename [file join $temporaryDirectory \ |
+ $buildLogFileName]] \;Verbosity=diagnostic] |
+ |
+############################################################################### |
+ |
+set uninstallLogFileName [appendArgs \ |
+ [file rootname [file tail $vsixFileName]] \ |
+ -uninstall- [pid] .log] |
+ |
+set commands(3) [list exec [file nativename $vsixInstaller]] |
+ |
+lappend commands(3) /quiet /norepair |
+lappend commands(3) [appendArgs /logFile: $uninstallLogFileName] |
+lappend commands(3) [appendArgs /uninstall:SQLite.UWP.2015] |
+ |
+############################################################################### |
+ |
+if {1} then { |
+ catch { |
+ puts stdout [appendArgs \ |
+ "Install log: \"" [file nativename [file join \ |
+ $temporaryDirectory $installLogFileName]] \"\n] |
+ } |
+ |
+ catch { |
+ puts stdout [appendArgs \ |
+ "Build logs: \"" [file nativename [file join \ |
+ $temporaryDirectory $buildLogFileName]] \"\n] |
+ } |
+ |
+ catch { |
+ puts stdout [appendArgs \ |
+ "Uninstall log: \"" [file nativename [file join \ |
+ $temporaryDirectory $uninstallLogFileName]] \"\n] |
+ } |
+} |
+ |
+############################################################################### |
+ |
+if {1} then { |
+ putsAndEval $commands(1) |
+ |
+ set versionNumber [string trim [readFile $versionFileName]] |
+ set data [readFile $projectTemplateFileName] |
+ set data [string map [list %versionNumber% $versionNumber] $data] |
+ |
+ set projectFileName [file join $path vsixtest.vcxproj] |
+ writeFile $projectFileName $data |
+ |
+ set platforms [list x86 x64 ARM] |
+ set configurations [list Debug Release] |
+ |
+ foreach platform $platforms { |
+ foreach configuration $configurations { |
+ putsAndEval [string map [list \ |
+ %platform% $platform %configuration% $configuration] \ |
+ $commands(2)] |
+ } |
+ } |
+ |
+ putsAndEval $commands(3) |
+} |