Index: client/1.0/pkgd.eagle ================================================================== --- client/1.0/pkgd.eagle +++ client/1.0/pkgd.eagle @@ -57,14 +57,14 @@ # # NOTE: The URI where a single package file may be found. This file will # belong to a specific version of one package. # - variable downloadUri; # DEFAULT: ${baseUri}?...&filename=${fileName}&m=bin + variable downloadUri; # DEFAULT: ${baseUri}?...&filename=${fileName} if {![info exists downloadUri]} then { - set downloadUri {${baseUri}?download&ci=trunk&filename=${fileName}&m=bin} + set downloadUri {${baseUri}?download&ci=trunk&filename=${fileName}} } # # NOTE: The root directory where any persistent packages will be saved. # @@ -82,10 +82,20 @@ if {![info exists temporaryRootDirectory]} then { set temporaryRootDirectory \ [::PackageRepository::getFileTempDirectory PKGD_TEMP] } } + + # + # NOTE: This procedure returns a directory name suffix that is unique to + # the running process at the current point in time. There are no + # arguments. + # + proc getUniqueDirectorySuffix {} { + return [appendArgs \ + [string trim [pid] -] _ [string trim [clock seconds] -]] + } # # NOTE: This procedure returns the root directory where any packages that # are downloaded should be saved to permanent storage for subsequent # use. There are no arguments. @@ -193,10 +203,98 @@ } else { error "unsupported language, no idea how to modify auto-path" } } + # + # NOTE: This procedure verifies the combination of language and version + # specified by the caller. The language argument must be one of the + # literal strings "eagle", "tcl", or "client". The version argument + # must be one of the literal strings "8.4", "8.5", or "8.6" when the + # language is "tcl" -OR- the literal string "1.0" when the language + # is either "eagle" or "client". The varName argument is the name + # of a scalar variable in the context of the immediate caller that + # will receive a boolean value indicating if the specified language + # is actually a reference to the package downloader client itself. + # + proc verifyLanguageAndVersion { language version varName } { + if {[string length $varName] > 0} then { + upvar 1 $varName isClient + } + + set isClient false + + if {[string length $language] == 0 || $language eq "eagle"} then { + if {$version ne "1.0"} then { + error "unsupported Eagle version" + } + } elseif {$language eq "tcl"} then { + if {$version ne "8.4" && $version ne "8.5" && $version ne "8.6"} then { + error "unsupported Tcl version" + } + } elseif {$language eq "client"} then { + if {$version ne "1.0"} then { + error "unsupported client version" + } + + set isClient true + } else { + error "unsupported language" + } + } + + # + # NOTE: This procedure checks if there is a higher version available of the + # specified package on the package file server. The language argument + # must be one of the literal strings "eagle", "tcl", or "client". The + # version argument must be one of the literal strings "8.4", "8.5", or + # "8.6" when the language is "tcl" -OR- the literal string "1.0" when + # the language is either "eagle" or "client". The packageName argument + # is a directory name relative to the language and version-specific + # directory on the package file server and may be an empty string. The + # usePgp argument should be non-zero when an OpenPGP signature file + # needs to be downloaded and verified for the downloaded file. + # + # + proc checkForHigherVersion { language version packageName usePgp } { + variable clientDirectory + variable temporaryRootDirectory + + verifyLanguageAndVersion $language $version isClient + + set temporaryDirectory [file join \ + $temporaryRootDirectory [appendArgs \ + pkgd_ver_ [getUniqueDirectorySuffix]]] + + if {$isClient} then { + set persistentDirectory $clientDirectory + } else { + set persistentDirectory $persistentRootDirectory + } + + set fileName [file join $packageName VERSION] + set downloadFileName [file join $temporaryDirectory $fileName] + + file mkdir [file dirname $downloadFileName] + downloadOneFile $language $version $fileName $downloadFileName $usePgp + + if {$usePgp} then { + downloadOneFile $language $version [appendArgs $fileName .asc] \ + [appendArgs $downloadFileName .asc] $usePgp + } + + set localFileName [file join $persistentDirectory $fileName] + + if {[package vcompare \ + [string trim [readFile $downloadFileName]] \ + [string trim [readFile $localFileName]]] > 0} then { + return true + } else { + return false + } + } + # # NOTE: This procedure downloads a single file from the package file server, # writing its contents to the specified local file name. It can also # verify the OpenPGP signatures. When an OpenPGP signature file is # downloaded, this procedure assumes the corresponding data file was @@ -229,12 +327,12 @@ # server and write it to the specified local file. # if {[isEagle]} then { writeFile $localFileName [interp readorgetscriptfile -- "" $uri] } else { - writeFile $localFileName \ - [::PackageRepository::getFileViaHttp $uri 10 stdout $quiet] + writeFile $localFileName [::PackageRepository::getFileViaHttp \ + $uri 10 stdout $quiet -binary true] } # # NOTE: Is use of OpenPGP for signature verification enabled? Also, # did we just download an OpenPGP signature file? @@ -274,35 +372,17 @@ language version fileNames persistent usePgp useAutoPath } { variable clientDirectory variable persistentRootDirectory variable temporaryRootDirectory - set client false - - if {[string length $language] == 0 || $language eq "eagle"} then { - if {$version ne "1.0"} then { - error "unsupported Eagle version" - } - } elseif {$language eq "tcl"} then { - if {$version ne "8.4" && $version ne "8.5" && $version ne "8.6"} then { - error "unsupported Tcl version" - } - } elseif {$language eq "client"} then { - if {$version ne "1.0"} then { - error "unsupported client version" - } - - set client true - } else { - error "unsupported language" - } - - set temporaryDirectory [file join $temporaryRootDirectory \ - [appendArgs pkgd_ [string trim [pid] -] _ [string trim \ - [clock seconds] -]]] - - if {$client} then { + verifyLanguageAndVersion $language $version isClient + + set temporaryDirectory [file join \ + $temporaryRootDirectory [appendArgs \ + pkgd_lib_ [getUniqueDirectorySuffix]]] + + if {$isClient} then { set persistentDirectory $clientDirectory } else { set persistentDirectory $persistentRootDirectory } @@ -365,11 +445,11 @@ set directory(persistent) [lindex $downloadedFileName 2] file mkdir $directory(persistent) set command [list file copy] - if {$client} then { + if {$isClient} then { lappend command -force } lappend command -- lappend command [file join $directory(temporary) $fileNameOnly] Index: client/1.0/pkgd.eagle.asc ================================================================== --- client/1.0/pkgd.eagle.asc +++ client/1.0/pkgd.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJXt3FrAAoJEFAslq9JXcLZ3HAP+wZDIVusu6DEYgHlEj4RvJqz -oNAc+8wX2hjy8EN3zUKkn5rRrLEjKz6Tq1GNNMZXMKYwtoJWFuly44fbyxGIx0IU -zYbGtASMCApHKTAgmm+VQjI6OXWB0i3rS5KOE7MwOmsk9k0Zxl6cuV5vqi8dvNvL -Ge6RBQX2n9g67rqjUtyXPOCWOgpTlFRlf6zZiw1BT6vZIt66WCbDjnupwOXJDI9M -X+I6HzdQgkwvMzzsbncWz08avL/COzLq8sxrN7nmCpM2KjJjCDxPUzHUoW+EJjX6 -ZccCgRJ8Wa61mRPZc5HZ7vfn0RTzucUat/nKwfO6XqMGyncmVJinCwko/jzLYxwI -7dd8KmigIax9PZ1kUXuByCUQ2HmgVW/gfcH14MGTscQHH98/g0RErEJsoEEQn2V6 -4NNkTa0J1xaZTHMDwoMElENo86FMGBeoTATb6W5voskZb9IKGA9rLojJqqZtG4Xy -KHYDOcZMTu/KeVQnx3pZ5AEMScjQInAi/qrZ1T34fDtr4ao8gfmaUY3jpR4WQOF1 -RacKLfWVq2Neeu/5sLmW8fZSQk0wMF0pRJqwiyxBtgIep3tofsA+4Cm252oHGK3R -hXva/th2hrVrcRJNzxZGlBjpZaCIqys9+ICr2823I4AehGpjnzrpZEZ1YDba2H3Z -t4L8uO/eoZ8x0kL5DyKX -=uPPS +iQIcBAABCAAGBQJXt5RqAAoJEFAslq9JXcLZcTsQALpS7Eu6mlGbfXKEH/hyL7cI +89NHNHpThrJ972rb8qj8PX7MyCxEaWCuYeumdBLctB68k56f1Mej9NTf8vdV+aJp +NgpGjTwZ0WskmfaI7QbVd4+IyKNoh5+g09rN4T63L11ds0g1BbwF1E2KJL82l0Sv +XeyLAKOvznTOStmuS42ES60Cy1atPTTeqCwU+qmmazz9hxuzUe/QFqcK+1Tj3Yed +mY/+tNjH1jYtGfwfipeMcpGE1jfY7dEXBQW/8i5R89cw99w42MTXvEouEICjZTdc +TX5/woJFXpqDKvr7gdHkJd6IGyXJIOOsBvsOuF2PbSgj3kLGb4I3YOkSS3mZiOcn +kQ89Tr8tz9B936oY/kB+g4ggI3O+e3eXGrBI56NhFZuTMYoIVHuAiHAdZQlWxtQt +Uinqv6/k13auivCBHZ7+Ji+BcIbHuqgXuheDw88XwpL/zRrPsGEwblwrEAIvQDsT +kHcrsh0vW/6uBxy5CGlxt5gaYidtiMqEXBob3uFiFQIfQpS7MXB7a45MMYdT6RYN +kd8pN+mYf58x1joEgnSJSOjHIYayZjPzHMrYBqxl84t8SrzYUCXBDu0edSjj4cAB +0wqJnDlP2Z8DYDfnRSyPla+IsyjKSHMFF24kbMue6OjeBxcdBlhecN0yV+xdEf7B +46u1TdrHuYAJt2E4YzJp +=/psR -----END PGP SIGNATURE----- Index: client/1.0/pkgd.eagle.harpy ================================================================== --- client/1.0/pkgd.eagle.harpy +++ client/1.0/pkgd.eagle.harpy @@ -19,32 +19,32 @@ None Mistachkin Systems - 21f5fa8f-c141-462c-92a8-28469b2a8807 + c787e54c-9543-4fa4-9d61-ed59debfd70f SHA512 Script - 2016-08-19T20:44:05.7051250Z + 2016-08-19T23:20:52.9053203Z -1.00:00:00 0x2c322765603b5278 - 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 Index: client/1.0/pkgd.eagle.harpy.asc ================================================================== --- client/1.0/pkgd.eagle.harpy.asc +++ client/1.0/pkgd.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJXt3FrAAoJEFAslq9JXcLZl/IP/2kTXwtDOAVfNAoOxOjQoBpl -EjC0sU/5RoanGLoxun9zQ2Y90Fjg2hqQHebOgDmR673NG9GUloAUPYeo54J/tcdx -ckPGRYn789WhLJEctiyz+iNXuYLszYwVF6PdcVHI9cdVZix6mpRoViLeRXr6X50x -f29Bfj8WawLBKPAEVzuT0HilsGkQR7fyw1YOJoXtPtiilDo1bL6f5J3+3fCrgcN2 -KbtS8HgNUvlAUtl4DfLBJkvk6hpzF5MMp7J2Jx5MuAJBMyoNaax61PJPRN+IbfgB -/NtavvYST2Aja1BYC3I2uH3R3uTEtDV+iTmztThRVSl2jRjpIF342M2gLcCHSskO -45LbNgJyJVmwPwMyZHwDqHWGaSv/Ej1hBamscxwpcpAtuEAAoyuOrKfbtZutFYL6 -iHZPHyRt9AuuQ0LnYNtvbcObkSNc/b7lFpBrUVDex4xVvrgXsn6gFsX9AX2cH35X -+ZuxnpUQ2vACqnhjsoGwFu5NLDcDD2isyVM8AAjytRQD8Rb4xqAdkROXLQFqqaUM -jDypb3GZP8FsE18T+D7OIvi9MiLLOEYecz1xiA84D7Ra5wsOX8C5GthGjSuIuACn -lPXMTL4nToMouijzjvzhBY0ot3JnwUTz4VmoFcirtT9eRg+kjeheBNOOpY4Z8Hxc -yFahBboYPI7ZQCKv2VXc -=DHdZ +iQIcBAABCAAGBQJXt5RrAAoJEFAslq9JXcLZJpEP/27cOy348eY7K6yPyIg3c626 +c2G0l7EM9Wp+9XuutyI6g2QFf4Y9zjMmsYaNaFFyHM2MC2MPrj3B7g1t9t7p+jPq +o4f6Zt9R1ordVTcD4obKKdjZkn+Ww4F9q6YuKSFBhZ3zT/5DF9arNrC3JhQEL3YB +/eCFqLS1p9hsHWTaT5Tb0uz1wYR2O+dPl74DxOcXSjACixZZPqhWzpxAmXesc2Aq +C51AOg5djF9obIaPIsGEngEEk8///HHSjuJRHZjyu2ugIlMoBUIt4cyJC+wt3v7C +2LcK5C52YuW+WJwUxAN0LAuMNVFsdZSVutYS2I9zAYPMl3MYmW1UIfoFgit5CoIu +sRRyl6uP11bNSAICrfAoSUPn405yFtqCk80bTvOXu6Ager1kg0GGhMFF1uVCl8ap +1UgZIthwqp7o0p5bsqK0L63j5HKEGlNyW9PuWxhmpcegd0nbosA5Yzj3iAeSnv1H +hteHAE9ZiNcBs8BmHifdVxSGfKtuBnG55BzgOzLPTDibmecdAIJCPRTCv4UhPCzw +HW1xzjz4jLArtscskeNw4cPNXAVzJSB1y9mV/iqq+6PJimKwSfzLrpkVuHRlEM+C +3OpyAue+14PKqrD1EIdsZ6Owa3d2dwddbQjsooyjm0180n+LEDR3AWcOxWg0I4Pp +HOMPUI/J6/zxi6Cs3eFQ +=NzCV -----END PGP SIGNATURE-----