Index: client/1.0/pkgd.eagle ================================================================== --- client/1.0/pkgd.eagle +++ client/1.0/pkgd.eagle @@ -174,28 +174,34 @@ # 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. # proc getPersistentRootDirectory {} { + global env + + # + # NOTE: Allow the persistent root directory to be overridden via the + # environment. Typically, this customization will only be needed + # if multiple instances of Tcl need to share packages. + # + if {[info exists env(PKGD_ROOT)]} then { + return $env(PKGD_ROOT) + } + # - # NOTE: Return a directory parallel to the one containing the library - # directory. + # NOTE: Fallback to returning a directory parallel to the one containing + # the library directory. # return [file join [file dirname [info library]] pkgd] } # - # NOTE: This procedure, which is only used with native Tcl, generates a - # package index file (i.e. "pkgIndex.tcl") suitable for use with - # native Tcl 8.4 (or higher). It will recursively [source] other - # native Tcl package index files that are within the configured - # persistent root directory, thereby causing all packages located - # within it to become available. Since Eagle (by default) already - # performs a recursive search for its package index files, this - # procedure is not necessary for Eagle packages. - # - proc maybeCreateMasterTclPackageIndex {} { + # NOTE: This procedure checks the configured persistent root directory for + # downloaded packages. If any checks fail, a script error is raised. + # There are no arguments. The return value is undefined. + # + proc verifyPersistentRootDirectory {} { variable persistentRootDirectory if {![info exists persistentRootDirectory]} then { error "persistent root directory not set" } @@ -202,17 +208,81 @@ if {[string length $persistentRootDirectory] == 0} then { error "persistent root directory is invalid" } - if {![file isdirectory $persistentRootDirectory]} then { + # + # NOTE: Either the persistent root directory must already exist -OR- we + # must be able to create it. + # + if {![file isdirectory $persistentRootDirectory] && \ + [catch {file mkdir $persistentRootDirectory}]} then { error "persistent root directory does not exist" } + } + + # + # NOTE: This procedure returns the name of the package index file for the + # language specified by the language argument. An empty string will + # be returned if the language is unsupported or unrecognized. + # + proc getPackageIndexFileName { language } { + if {[string length $language] == 0 || $language eq "eagle"} then { + return pkgIndex.eagle + } elseif {$language eq "tcl"} then { + return pkgIndex.tcl + } else { + return "" + } + } + + # + # NOTE: This procedure returns non-zero if the specified file appears + # to contain a master package index for native Tcl. The fileName + # argument is the name of the file to check. + # + proc isMasterTclPackageIndex { fileName } { + # + # NOTE: Read all data from the specified file. This should always be + # a relatively small file with a constant size. + # + set data [readFile $fileName] - set fileName [file join $persistentRootDirectory pkgIndex.tcl] + # + # NOTE: Check the data read from the file for the magic string that + # we use to indicate a "master package index" file. + # + if {[string first $data] == -1} then { + return false + } - if {[file exists $fileName]} then { + # + # TODO: Make this procedure smarter? + # + return true + } + + # + # NOTE: This procedure, which is only used for native Tcl, generates a + # package index file (i.e. "pkgIndex.tcl") suitable for use with + # native Tcl 8.4 (or higher). It will recursively [source] other + # native Tcl package index files that are within the configured + # persistent root directory, thereby causing all packages located + # within it to become available. Since Eagle (by default) already + # performs a recursive search for its package index files, this + # procedure is not necessary for Eagle packages. This procedure + # will return non-zero if productive work was done. + # + proc maybeModifyMasterTclPackageIndex {} { + variable persistentRootDirectory + + verifyPersistentRootDirectory + set persistentDirectory $persistentRootDirectory + + set fileName [file join $persistentDirectory pkgIndex.tcl] + + if {[file exists $fileName] && ![isMasterPackageIndex $fileName]} then { return false } writeFile $fileName [string trim [string map [list \r\n \n] { ############################################################################### @@ -250,29 +320,33 @@ eval lappend pkgd(dirs) \ [glob -nocomplain -types {d} [file join $pkgd(dir) *]] } set dir $pkgd(savedDir); unset -nocomplain pkgd +## ## }]] + + return true } # # NOTE: This procedure returns non-zero if the specified file seems to be # an OpenPGP signature file. The fileName argument is the name of # the file to check, which may or may not exist. The nameOnly # argument should be non-zero to ignore the contents of the file. # - proc isPgpSignatureFileName { fileName nameOnly } { + proc isOpenPgpSignatureFileName { fileName nameOnly } { if {[string length $fileName] == 0} then { return false } set extension [file extension $fileName] if {$extension eq ".asc"} then { if {!$nameOnly && [file exists $fileName]} then { - return [::PackageRepository::isPgpSignature [readFile $fileName]] + return [::PackageRepository::isOpenPgpSignature \ + [readFile $fileName]] } else { return true } } else { return false @@ -293,18 +367,65 @@ set extension [file extension $fileName] if {$extension eq ".harpy"} then { if {!$nameOnly && [file exists $fileName]} then { - return [::PackageRepository::isHarpyCertificate [readFile $fileName]] + return [::PackageRepository::isHarpyCertificate \ + [readFile $fileName]] } else { return true } } else { return false } } + + # + # NOTE: This procedure returns the auto-path for the language specified by + # the language argument. An empty list is returned if the auto-path + # does not exist in the target language. This procedure may raise + # script errors. + # + proc getAutoPath { language } { + if {[string length $language] == 0 || $language eq "eagle"} then { + if {[isEagle]} then { + if {![info exists ::auto_path]} then { + return [list] + } + + return $::auto_path + } else { + ::PackageRepository::eagleMustBeReady + + eagle { + if {![info exists ::auto_path]} then { + return [list] + } + + return $::auto_path + } + } + } elseif {$language eq "tcl"} then { + if {[isEagle]} then { + tcl eval [tcl master] { + if {![info exists ::auto_path]} then { + return [list] + } + + return $::auto_path + } + } else { + if {![info exists ::auto_path]} then { + return [list] + } + + return $::auto_path + } + } else { + error "unsupported language, no idea how to query auto-path" + } + } # # NOTE: This procedure adds a directory to the auto-path of the specified # language (i.e. native Tcl or Eagle). The directory will not be # added if it is already present. The language argument must be the @@ -349,10 +470,86 @@ } } else { error "unsupported language, no idea how to modify auto-path" } } + + # + # NOTE: This procedure adds a directory to the auto-path of the specified + # language (i.e. native Tcl or Eagle). The directory will not be + # added if it is already present. The language argument must be the + # literal string "eagle" or the literal string "tcl". The directory + # argument is the fully qualified path for the directory to add to + # the auto-path. The directory will not be added if it falls under + # a directory already in the auto-path. + # + proc maybeAddToAutoPath { language directory } { + # + # NOTE: Verify that the directory to be added is valid and exists. If + # not, do nothing. + # + if {[string length $directory] == 0 || \ + ![file isdirectory $directory]} then { + return false + } + + # + # NOTE: Normalize the specified directory. This is necessary so that + # we can compare apples-to-apples within the auto-path. + # + set directory [file normalize $directory] + set directoryLength [string length $directory] + + # + # NOTE: Query the auto-path for the target language. + # + set autoPath [getAutoPath $language] + + # + # NOTE: Check each directory in the auto-path to see if the specified + # directory is already underneath it. + # + foreach autoDirectory $autoPath { + # + # NOTE: Normalize the auto-path directory. This is necessary so + # that we can compare apples-to-apples with the specified + # directory. + # + set autoDirectory [file normalize $autoDirectory] + set autoDirectoryLength [string length $autoDirectory] + + # + # NOTE: Prefix match is impossible if the length of the specified + # directory is less than the length of this directory in the + # auto-path. + # + if {$directoryLength < $autoDirectoryLength} then { + continue + } + + # + # NOTE: If the initial portion of the specified directory is the + # same as this directory in the auto-path, it must reside + # underneath it. In that case, there is no need to modify + # the auto-path, bail out now. + # + set last [expr {$autoDirectoryLength - 1}] + + if {[string range $directory 0 $last] eq $autoDirectory} then { + return false + } + } + + # + # NOTE: At this point, it is pretty safe to assume that the specified + # directory is not in the auto-path, nor underneath a directory + # within the auto-path. + # + addToAutoPath $language $directory + + return true + } # # 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 @@ -593,10 +790,11 @@ # needs to be downloaded and verified for the downloaded file. # # proc checkForHigherVersion { language version packageName usePgp } { variable clientDirectory + variable persistentRootDirectory variable temporaryRootDirectory verifyLanguageAndVersion $language $version isClient set temporaryDirectory [file join \ @@ -604,10 +802,11 @@ pkgd_ver_ [::PackageRepository::getUniqueSuffix]]] if {$isClient} then { set persistentDirectory $clientDirectory } else { + verifyPersistentRootDirectory set persistentDirectory $persistentRootDirectory } set fileName [file join $packageName VERSION] set downloadFileName [file join $temporaryDirectory $fileName] @@ -671,18 +870,18 @@ # # NOTE: Is use of OpenPGP for signature verification enabled? Also, # did we just download an OpenPGP signature file? # - if {$usePgp && [isPgpSignatureFileName $localFileName true]} then { + if {$usePgp && [isOpenPgpSignatureFileName $localFileName true]} then { # # NOTE: Attempt to verify the OpenPGP signature. If this fails, # an error is raised. # - if {![::PackageRepository::verifyPgpSignature $localFileName]} then { + if {![::PackageRepository::verifyOpenPgpSignature $localFileName]} then { error [appendArgs \ - "bad PGP signature \"" $localFileName \"] + "bad OpenPGP signature \"" $localFileName \"] } } } # @@ -718,10 +917,11 @@ pkgd_lib_ [::PackageRepository::getUniqueSuffix]]] if {$isClient} then { set persistentDirectory $clientDirectory } else { + verifyPersistentRootDirectory set persistentDirectory $persistentRootDirectory } set downloadedFileNames [list] @@ -760,11 +960,11 @@ downloadOneFile $language $version $fileName $downloadFileName $usePgp lappend downloadedFileNames [list \ $fileNameOnly $directory(temporary) $directory(persistent)] - if {$usePgp && ![isPgpSignatureFileName $downloadFileName true]} then { + if {$usePgp && ![isOpenPgpSignatureFileName $downloadFileName true]} then { downloadOneFile $language $version [appendArgs $fileName .asc] \ [appendArgs $downloadFileName .asc] $usePgp lappend downloadedFileNames [list \ [appendArgs $fileNameOnly .asc] $directory(temporary) \ @@ -782,10 +982,14 @@ set directory(persistent) [lindex $downloadedFileName 2] file mkdir $directory(persistent) set command [list file copy] + # + # NOTE: When updating the package repository client files, always + # use the -force option to overwrite existing files. + # if {$isClient} then { lappend command -force } lappend command -- @@ -798,27 +1002,79 @@ } else { lappend downloadDirectories $directory(temporary) } } - set downloadDirectories [lsort -unique $downloadDirectories] - - if {$useAutoPath} then { - foreach downloadDirectory $downloadDirectories { - addToAutoPath $language $downloadDirectory - } - } + # + # NOTE: Does the package need to be persisted locally? This can be set + # via the direct caller or via the installer tool. + # + set addPersistentDirectoryToAutoPath false if {$persistent || $viaInstall} then { + # + # NOTE: In Eagle, a slightly different command is required to delete + # an entire directory tree. + # if {[isEagle]} then { file delete -recursive -- $temporaryDirectory } else { file delete -force -- $temporaryDirectory - maybeCreateMasterTclPackageIndex + } + + # + # NOTE: When dealing with packages for native Tcl, modify the master + # package index. + # + if {$language eq "tcl"} then { + set addPersistentDirectoryToAutoPath [maybeModifyMasterTclPackageIndex] + } + } + + # + # NOTE: Sort the list of directories that downloaded files were written + # to, removing any duplicates in the process. + # + set downloadDirectories [lsort -unique $downloadDirectories] + + if {$useAutoPath} then { + # + # NOTE: The auto-path, for whatever language this package belongs to, + # needs to be modified. + # + if {$addPersistentDirectoryToAutoPath} then { + # + # NOTE: The downloaded package was persisted -AND- will be handled + # by the master package index; therefore, just make sure the + # package persistence root directory is in the auto-path and + # then return only that directory in the result. + # + maybeAddToAutoPath $language $persistentDirectory + set downloadDirectories [list $persistentDirectory] + } else { + # + # NOTE: Check each unique download directory for a package index + # file. If a directory has a package index for the target + # language, add to the auto-path for the target language. + # + set packageIndexFileName [getPackageIndexFileName $language] + + if {[string length $packageIndexFileName] > 0} then { + foreach downloadDirectory $downloadDirectories { + if {[file exists [file join \ + $downloadDirectory $packageIndexFileName]]} then { + addToAutoPath $language $downloadDirectory + } + } + } } } + # + # NOTE: Always return the list of directories that were actually added + # to the auto-path, if any. + # return $downloadDirectories } # # NOTE: This package requires that support for namespaces, which is an @@ -842,12 +1098,22 @@ # # NOTE: Setup the variables, within this namespace, used by this script. # setupDownloadVars [info script] + # + # NOTE: If necessary, add the package persistence root directory to the + # auto-path for the current language. This will only be done if + # it falls outside of the existing auto-path. + # + variable persistentRootDirectory + + maybeAddToAutoPath [expr {[isEagle] ? "eagle" : "tcl"}] \ + $persistentRootDirectory + # # NOTE: Provide the package to the interpreter. # package provide Eagle.Package.Downloader \ [expr {[isEagle] ? [info engine PatchLevel] : "1.0"}] } 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 -iQIcBAABCAAGBQJX3Jv9AAoJEFAslq9JXcLZKXYP/jfWs2uQfENz4BWTRal3H6Cp -AHAuhn1rDmt8lyQWBzG4ZrYcJRJsI0mQhlBwiqYQt3Lcwi5FS5cWznXG7brr2taU -Mz72IOgep/d+7owYfOEGA4WvgOJ+o+mZSCohSc2f3/bGSnzMK2jUoH1TZCuUsekL -+pBKADYyVfXekmNxYFpUuDcxoRgyNigGTtIdalHXJR0eRTjLfiKfEVsVPfDBVD/B -LAionvoeKfYM6d1F3Z13AT8rF/v/rlwRv+4hAbHT42qnpunPS9FZ/ncRDRSGsTVD -fWIyu9bv8sZwWLXfgxCZQlsUyM/3seyb1ve36zuLBsfLjRuGxrmdmD8Nnkk8w2Of -Z3RoYV/dCV36iNpQWt5GwyttUo4gAc5a8bN5M6OCuRUiwbCC7lZhjRrVifONYxZv -BsqPCCFH+/IKJQf8eBmE7n5YF0GMtUUIzX5GJJhxLttt12oFOuE5a9rNhT2whmaT -mWiqmONZs6DmM7sDMOBDFT2oZVlcJfCHKt7RF0Df2yi0cCGfGb2IQyZzhx4mgt3b -CL8etRY4B8pq3z0Q4PuRGQokFmJCmAz21KTjkxPgFoHsVHRlTPSlOaqsWKEyVB2B -DJ3pvZCp0cv6F6hK5/UD9BiTt5XNfMuMftUo9P/O83mYPSNuRG5/ZXk1xIDIGNOs -XFyVcjEMOGwm5xtS329I -=bOve +iQIcBAABCAAGBQJYBbdiAAoJEFAslq9JXcLZC+wP/0TeacdSKVxp7/XcGjoUNW9P +iiCPLqG2QQ0E1E2hR/pkyVsf8zppjFyUxQbPvzlca89vT5/f0YzHPx7V00rwGupY +wr3jHXP4yT2EZ1EvRQr5DxHgIbXUnxBUmiIE6h3QzA4y32yfD4WenEy01SuiVw99 +BvDa4T1e/WXTpMckf4QGwZ8i9U+EEcYcBud2KV+y2TabtHOPMP6K5PFQcyNfmKtd +ptm3wIyn92VAnkiEcI5BvK3fWFquCsum6Q7XsY4/7gn9StKiAC/ohrhwyWaE+rVv +NxaAv4/XbgjrAurrVoozBmtph+dcM0GzQXJ8PMDoqAxq0jgHtFL+075KrEDcGuix +lBX1XaDyz8OeAux0cZxGUPnvqI0KfvTIYYyo56uR6kZ+TEnf6FDRY+g6Y653jU/T +0gvcg820fpqjFa5zNRj3f4X58nhdW1bqllruZxZljTm65DMsVHyqA1liaZlq94tv +N9/PTfGj4NtF0bC1LqbKNO/Z/pvYtwfMBFEBab8P6CJb8WlWVwvjLDiVfscQ2zZx +JeJRHygELZp/BNwtluDYrEH9lxiyct4x0FHggYMylCYLBdfnsOiCX6G6ecIhgokR +nWAHbN9DOKZIPLThQU6xZ52UMqUIkyWqyJ3rZZv9mSZYnwVkojEmuYWgYL6QlDVX +pGAQh9Wz+7khXrfQdC3i +=4L9D -----END PGP SIGNATURE----- Index: client/1.0/pkgd.eagle.harpy ================================================================== --- client/1.0/pkgd.eagle.harpy +++ client/1.0/pkgd.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - 8ecc0b95-a997-4dff-8963-9cb6e6fdb873 + a912d50c-3171-48a7-81d2-1a95025d18a4 SHA512 Script - 2016-09-17T01:27:00.6660156Z + 2016-10-18T05:45:09.9171172Z -1.00:00:00 0x9559f6017247e3e2 - udjF+t3LUOw5Tx8PXYAD4PhDV/9sAi5XpWBqvmUAOd1CT1/9btl9eEUNVwKr+crv1MA+yME1remF - EETyAX5fghp+Y+zKED9fEX6F/59ILpurfCgoR+CMj69TxJHEPc4LZab8CyimMSH0c5rnAplJkMTQ - QBrqOnYaDd2FexQU1SROBt8M2Cri0NDfBe9C/JPp5SsyRMIud8J4ChMGzDi273QDTskCv7ctDdcI - uiEcetdeFPHOa6ZRV382HTdwkFWtKR/uRGSOIOE4ARsIBlro+hINS8E4J7x55cHakP5vdmilx7ip - nojYWZcEUalJRmR8e6kpn6UHiBg3kVcDFMjVRQK7q90P2+3Vx191HNPDqryTMG/SvC7hMBGzFuqn - PAzF/xYUwGN4LL7mWYfcv8THRgzE9ot4cBVrHR2LQaA2JKkRnjZgiQeJaV50SuUIIwl0qxN2y9ga - xCkqEIs207UVCNXjEgeg/soeJq3clyz5jfA9lbsbMFaHRS/hrmMYTyJd8Z23GfilfljOs+4vjMvw - c1vKzKNrNhpVbhzJkr5PEdRHuTrGZ2lXXJw7Z9LHEqXqbsUDYTFyaVtugDqNzTtaNvvOkXVmY2nx - sC49xg5BqQeeHZ7ZSbYMVAVIRP0yQ0a3qJaLYx5oleMYl9aW/W0elmMELTJXmlZWqlWvNDPCoCWp - 8NDVFsktMlWFrF6K5hYckilYQZZkFT5fr1sJixwDLFC+BflUUZCNf8LWuF/VSARp7iXrUFc05ePR - v+YFQSwagVN+wePCzFn3gu3wc0X6S/L0uVotgnZIOJM6iXNNMMnARjx0REZQtDYZoQLrF2u2RMTr - pXO04m/J4xoiBgolJ6u9IHBYG7ZOqk7G2Xz+ahvJnl51z7uD26qWM6PDaPZlPoGL0CO0duG2EFR4 - hGOOZMMzJsN+lgvDX1JSw4EqmTRiVuEp9MlF1dLeLyJZQcwNGrlfnva1i4XuIU1m+hxkTqSC+mZQ - QrGTIzsYhWpnPX7deqJ0wbquLe9whhhn7RSt1+n04zc5z9vvs/eFkSpFvMgOlAGa2i5amysjYCZL - cIyjJdjcjHDiE9v1O7bC64nXTqhQtZAFFwrU4CcsyvHShba7RyN9osr+3+lLFalSSD00QDtJFQWa - Ttq2/bVDcNvZyP6yaHVee/aIhFP4OnfjFtbKtApw79B/DIrjbqz5lhpzr+Wf5RPOC2IFeYIWOXdm - ifm/HTQxPrObrIaosFHU7eCrdCxGle4gNJUf8LjxOWvxJuRYE1ckV3UjPU8/jBOVOHuvc71NgqDd - laA/jWtyzy4ZfgBAZPxAy4FsZmIIxgnnpqREpbUE8sNLfGnxJPg+Bu2qqGDAhJ9Uoew8XY5G1y84 - joqWPc9SXWCOl4KA8/GqTSXahR0Mexw2XJB27jWy/8qHTbr8racchukhS7hAlgMpnf356i4pqiNf - qggIphBxED25M7kFg8ccqa10sq0wd2ZfMl70xZa0kMQV0hMb73FekFRuYFWH6bh1M4baMOKoJdXs - JQ2Xed/sNsQBRMnJOaj4JC0RoiLQ6F6SVLL1zU78HkE4gJTzOvFrUOCgw6qzEswzvMIw+pIEMzH5 - e968iteao0U+yPq2lGGr6uSJgH1IXouCuQpEfn9Vbn17Reamdon6gUczTSMepLpGVSvKpirhzNiS - I3otTzR5Uc4jhTNVHFnsVX5M4bLKJ6uAGZjrNQefCSyZSFX4d8JoncVe7/Lfzu2QxtsGdK8i3Z1t - PbjraLlx15/zijPYCleLgl/8XtaHbo0Wmx9eR4VcUOaTVX6Eyc30Dl+SzD8kShmt8+yQCoJT1STn - Ptee/6UIcFx+tZ7qPmGvnHtOU49eAZOSrysXwCEmSjZCfG+2TxpYujuviLjPYCnKNTIArG3K6tNd - y8Pji/Hgwv95lP9aQLjPVhCNXdA/aOPHed6poXS1pLWgDCXnI78YM0C+4NqHnqZ+lDLiZvvVYR5G - HegHOxiydhlCXp+1XsENPFXtNcWpDzMS11p3LNyzrkkMKlJF/3xfzc+mtHGCQa1M5dE6vWEv2k2m - WiyKTFvPMYJ988C3p4qce89LUqF/QYxYahJH/dPGFwSdQn4ea8TcfgnRXhvwx+ypUE2wRnjzY8WT - YON0EGsgQZhKcDBr7M2C7ING2rz+M88vULqOuEYely6Z3FeYHPTDhrH8uTGC0400oU9xa4Chw1i6 - L/vJb0mcjTokr5F4iOfaH47GotXY9wW+SctGzUJNvQ6/05QQpz2w/NJ5n0gtvVrYhNDr7z1pUE+t - +HSJuU/oRMm7Ogk7nLf/L5KcL6DxcjgA1LJM6q01SjmqL/KxpuhfXE9TndXgnD7Yuu4WPneBMzk6 - LqmNzdH8lrvbUoorz3/s3+/RBeNV6ZcW2YTWICPCKFS15sCffLuu0fgkn6s37+6Ta7/m8VTljITr - gpnYlHZZeCC7rTykjDKkiOt1PBo8F0wzTWbk0G5kKjh7/mHqzfYAVcRwuWj5GZRFYlzL9tGpJ4vf - 4Ad+9h71Yn4LWySnV5L72ppsNrxG2yT7NBaHyeUVLC8r4oA+XhfwTBjpxAa+UQ/QGwzBmoUlg1BV - IBp16uzMGq2I7HWrHhXzTwTyOZ7sDoPBPFalwNCMZi4HTIPQFTnDSdv4XI5YiFiZi+3h36wT11wb - aQNHmHLz3RKww4yIDETJT/jwRFXEskpOCIydICMceuRTU3o3S+ADx/PxUGY+47Fs9WC7rRI= + F5nakHt4pZF1YHdeFQvpm0Xmqei5v/Pf2/lH6D3gyJE48LWLIxTvhb3h1rmwoJPUj3qiqrNEwfdp + uuQgpaVc4jIrI7W5katANZfLBmXw5vM+K+dPCYOitYEeNnKJQ1nKqgs7Lnd8+2jDONsDVzmygDUv + vQCs5PZQJRxLF75iXWMCYJpHJjYRQ96FnTAPE7lwhF95Mmw889rwAih8JK13QHtdT6bB9NbAivex + NSCKvCZ/GPE/FeKQ36zWd5QlXNkd+1QUkvXEb9OZm08lCNkGeuISqsgbvCwBV7jqkCijQdPDuVsy + Y1COvlDCf/OheaAoWW2rH1oclTu9mGiNOCPcNkdBt4Mm8yN/t33jm8bgMK19vOMAE+bd3Taxysbh + 3Tu/5ki/hr2VTj6SGGCUPsUhZJ2klhenfCPIR04jEEwp17rICPWsbqqSFFzPYc2CTV73bgFTcj4b + jieTgljanf3JYJIoaYDNbewMHPigQaVLL28kQbuKPXP8kK0uIODZQmK4CIXUNEKM6JQUyH3qRP8q + VMfNfcdED8iQSYUOHqKKoH3TGbltxoYs2wYrUu4uc0+hKIwejr/Y2oZx3Mbhgs5kF3wPpahxFN3b + SsfHld+LSsA4ikisOK7dnwtrF8dr4qzaYZ2aPi63sfl8Nm99ePgQAaMEWlwIbGICltlHtnBehbrV + CHFDlax9ACNjiyBV2gNkx8LAFaoBWP7kkvAVtu1IuZhQxtwXmzcvZTpbZ02LDP85OKNRfyq2BV4k + o4+jMdJ626OjU40SICOcwH2sxTFhy8U/oBI+9C/twWbNTYVB07TyCphrjLziaj4eCCekwQlu0Nvj + 0dHQBjq+f6vgrcjFaSA46P1SQDcWEhP6oC+syXdDlUBZl/KTi8f2Z6FYpaFaic86aNow4VWYVnqX + tBDkUevXrKugyHNyaVISluoAhJrFzJswXR0HSAVxcZP3LnQDjZIedqmpJMkks+aR/MwjAcF6XXfJ + sPzLDv5zAnkElyq+Ew2znz/ITfhrgh8ViPxIrqNqMJUv+SMQ5cRZYQVNoBTBfspXhRASADaI4izi + CbwCbixqouKKEbKSdGBkyt3rHUwPsPbUkS5UfyBW739htPrswynQt8UwJENyiFdiGWP02xexkc/8 + hoaZBcs21ykUHFuTBBKypld8rQdYDynV0/Yq8VsDisJHyirrttSjx7UZx9l2RAcx3ZSbvxnIs/nj + FuEcb1Kp0zliMLp9AIqawL4EyZN3bjs6hkMp507rpo1/S9X/CxQ5EWGHC48NCZ77qqkTYmZs3/fS + i+l6M2A5lyoyqOF8KZ6o6iSkmQzz5yljY2s5tdARhE5JsJnt1PCAVwA+tpV914Z2B3dLHvcvr5yq + rTuN/4JfAE75i44ppaCiIGcfDlSFr3Xr2+UtELKCqpsvmhrZw8Deh4QT3GFBDMLRt/29siB/rsH1 + FZm04unOQq4jmuU/5f8TmwzDbIe8u1tP2JX6dWhdLpRIFt6CFnhlFRS5kPxsCklF4Q1San9neUUw + PRsaWbs+ZuO/uHEFgXp6D7OmjQEi99BRM7oBoHooJ3veETGEnmAx9JvtjcgD1v2yw1Oljo/gTtZ5 + yYUO08vWbVW0Em90A06oBHKS1gCgxhlIrLyFeB8v3QOqzAS3+dPed+s6z/+Lqx9Mgi/udDtoAAgs + b3gj2E+FjEtgsq0ei/igMLIfpbbetvFEDYNSrpZwOb0FFJKIvWnA9tVc1o6HSRnlpbkCePTGJ482 + +qJ+nfW8+4XqI7d+vUTOEXQsJZ/iYZKv/Arg/iQlmd1zmo5p2Ks9OP6G85KWoE0hqz8Vy1wODa71 + 6C9jJaF55j0Y6z/UU6UpOFOHX8TLbnEx5DxCanqsMT+EtXwJNER0aZoF0F9kbcOw4B1IBIF8sww/ + qjYpxIsoIUxQS1mnkMJKmh32oOxasJ3HQt8RqRErOWxR1/OJ7xwQO8rcw+IGLi7wj60g3909HMOj + TANHMk+AU/Ud6HU804yUA7OBqyHaXzZnURes7rc6Zhr3QCAj0C+9/dv1LI3sOVB2ziMvWBOkIXpe + IHdZp+mmDrCQ7CxpO0f2xLwXutSsYysV1JZLFS90WdxxpEmTFIF9/KaQR/sNs3s2P2qlgVgqWYHY + GUGOhbPFLqKfoVNNGWjYsqZJ5t3ruwASZW8oKYAgiz87TEhWKo+AZ+M20YDCLfnOcF8nrWPDot9A + aeh4c36ewkVc3QRtJq2Dr51IUFLZi7cxxc5JHq8aZNT+wSX5X7fanrRkLcBaRiDhuHgdDCRKu4x9 + eLv6Nba2o8t0x3Xuz6Ri2AX5yid+KrEzpLRQbps2JPOWaggDcSvB9TCO2ZZjvYycNs7VF8gsMtgc + 60AmcQAvAG48yJmL4TNGOr9sD0KDoG+ty5x6nWSpnXPBZNGD7mw58nUhnVrXNuhmibX8RCaPKaXj + zRzf5QQIKzlx4USO2t1ZprSnJ0qOtp02XceaZ6OT5evkiDvXHLyiwsoChxxd+kzZtrHPtegJjE0a + p0p31D7bH+HOYxLZaf38L8/s+eoRmxe/zjp5kTMHdTtCt9WO8gDTRD9kekCQuiU/qPzFRRGrF0f4 + bUIvCh+jddxs0D65AvXoE3HByKvtUv9rt/Q5y7h9HaUEnhPQUUWxKA69/kthwZsLhBdSy8q4EovI + ZQKi7mcNagT6has23ljGIZ4TPJ7rD2yqy8UMF3NCsK687io5DAqZHoxe4M5GXZdahWgQHuc= 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 -iQIcBAABCAAGBQJX3Jv+AAoJEFAslq9JXcLZpUkQAJEaqgCgi4nVyU+3rA904TMC -vgExhr5Zoh1MtUVJwbMjP+89PUdFfN+wdc78GOl3ppJ2aYOqQj6hrmvnnLxcR3F1 -eYm2XfaLTt7gZzL574ZRWH0CmTl+fZNWdsJdZieCI61uazobyVAdXBxgiNw66m6h -WH0Dp959Fm9HAOIiG1XWwjAuijcetVuM1dMYXDWKfZo7TU2FXugH0H5Twy3AkI6n -/aAQAm2uxVmCSLH3f9ItgzG5OY0Ll9IVJuclH67sZuELoTrCDFydRmlIx2+9LjCI -WcFVEc/6p4uAQYxpDuB0qc5vrv0g1NlMurlB9pK+x5O3kuFvFFsL/Lg3a0zOx4Uv -2P7T7dF4r7g+uPKpYoqliWQ2dnmZJsSy4erDPChg5yOj5zg0gzvq75mgqTy8vxXB -VnB2q+SPZtbNCC8ZMn7sMZPhucNR9pygsGYvWARuZorQ3zuc7yceXCHNMyzoPY46 -CYxTok0imW33/Fma4dTcsK0yYIA9msixEtN+Ml1e6mQKwl7of8KRcTAmuj/WVO7Y -CWXWImY2LSHIHKZEIw+KQGb9D5tGt/aHaqPQ8Fqo6FRAidEBgqhvGaqhvKKVkILY -b1EOYPolMc51FPQK5c1gK3mjKB72MV+CGjBDwkRXmT8p0penqbqEKPpShHbaYUT5 -qZbPcfDsRDe6KBUR/EC4 -=2kxw +iQIcBAABCAAGBQJYBbdkAAoJEFAslq9JXcLZl7oP/23sOD1PpaYZAxEJ07AuQBeV +IAA71jqm5VGUXoIcbODxMkdK8BCPcVon3bcsetr0Bpud9ZB93BFCg+8rzmu54kId +M/5cUzWwN2Kl0/yCFqENUV1JdPAtsENjBisKOw6C8tLJJoUZJG2r3L02j4l566dU +2IeVfkd9qw9zcahYXUmfTJNa4x/Skph85QQyUY1gjkVKAipMyrgxvQm4P4/M9fkD +GST66LzIoMEqZ3LpnLJ8coapxHdz//4v7Y28dkpCwK+7DPXINSSHvHqcspVIlvGi +w16Xt7ZTMcyejXXN+n+SsGBxtb/C3bXc9qsyAhuIfenX3QONShPIyxL4YUj5fBMV +I2jD6oklQ/UidDitHeox5AII9mz23Qq0Qk/vVCX0nGqmsgg/+1Ope3Tx+uRPTrp2 +z/f8P+CVcWvqIl2NWqEoGEOCOKqBuJPNsAJ05/MzSMVK+66XbA+7G6PIGYSXouFS +1wB0cOI3zvpvILNe53ZchKo3S0iAwB5/3/uyxKE8Kg9LMWQSleosPLT7TcXP1xP3 +T3Y4tgggBCGDb9u6YzzTDWTPZ0GKt9ZhjJm+Os+eHHKgj4i9+MDYIkm1fryiKDPO +mzRsW33EN7bsjFJ+y8KqjiMlgZtN8eSfCdIefos4x+y4I4MJ6n04xNBmyliID72X +Lc4O+yPj9v6eik4db2gW +=1i2t -----END PGP SIGNATURE----- Index: client/1.0/pkgd.settings.mistachkin.eagle ================================================================== --- client/1.0/pkgd.settings.mistachkin.eagle +++ client/1.0/pkgd.settings.mistachkin.eagle @@ -13,5 +13,6 @@ # RCS: @(#) $Id: $ # ############################################################################### variable quiet false +variable persistentRootDirectory [file join $::env(TEMP) pkgd_override] Index: client/1.0/pkgd.settings.mistachkin.eagle.harpy ================================================================== --- client/1.0/pkgd.settings.mistachkin.eagle.harpy +++ client/1.0/pkgd.settings.mistachkin.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - 755dcca1-be85-46ab-9bf5-533a4a0844fa + a4a30140-8aec-40b7-89af-44cecdef8193 SHA512 Script - 2016-08-25T21:28:05.9804687Z + 2016-10-18T03:47:22.9220000Z -1.00:00:00 0x9559f6017247e3e2 - puq+o0SkqurNT5seuh6Ato2glSGUq+mky+YYH7v1czUP7nb4ym/znem1AOlWaWZpwvoNOIeKZSLN - SCE/yqxwlrrDX0YByBH28speJWljJXD5y0pqrahr85C9egn2+QLLMy+PmI/I1O+Lhcnhwmoe+UtC - jK/5IpUGiKwApoeA8vX8LfwJ6SYHUCxiRR6cbY/azxTPW57f2go+GJDLb0MGiURdchRj2pbVBYpM - g0DwHfztPl+R2BBkC7/GL9IUav+Ycr2Qt40htqxZE30pQr63KlYp997efp1x2c7AE888Q+s8wU7w - hoJTU5YB/O1t+QbqahF/3/CbjcQNgQLF4iiIv7c+DkAA8GFG3hMlXYvI+3qZIyXqM3d+W5WpwLN2 - DUwhtZKjyx3D72MSfQYZcxQgtCnc5ecepR/jizXRu2j/OF26j7VAqj7PrDpEvJqjhLtM2LUjTekH - 3d3ua+g1dqvUQDQ1wkgHhsPt7GQD3vzUeHyS1NdAQAPqvvc0/Dgl+NtWpxpTc0ixuHAypQqwB8fi - 20g4+Qlt0yBIfXud5XFHSvifHXzA0410NQvN4mdX6DQJIzbQijFS4nt/Km0tFQHBaFtVMHxKVyIx - yPr0OSLqUxFEmHFezgHMYGXreonwQxvR+PXQQxHMS+0nPfG3tykIpvAr7t1yL8chx1RtfrrALjoH - DXXj33ff3rhUjtRoqEBV8etNHvP2F8/eqchhdop/Unt1PUKe6RTeZRQt5j5zTi93NkeENaAnq6T8 - H9Z2bq9hR+ilhBVnd+PzrLrLER5It2OoldDiJUXb2xA/M+dnE6/jtMD6LojdVn8bYouzDPdUWCgF - jUH2aFT3/VQal/4v5mNN3ma0f4ae2BeswnSUqKO7QweXxAQg7pp6cjtNNvmb+aQ3dIr3D5IkI13W - v0P3CqSGjDwa2QiEh2M3Ay1U36EP+c9tUYU5bbVb3ESeHHvLVpRUBpIzzxIfSiteXjkM0+Cnpi8H - MONFlu9FAw3mLMh0LrgAo+Pz+OsSUBT/+YJCJ4FQvYiGlCQfPxOS1km3vr1nhy6WeKy4Jiv1z6nK - 9fRPC0tsLW0Ze8WpldD937xJnm/pbae7XAJnSs9RNZ5V0UW0A8oxD4uT9ij8pAS1f9jFuTqD8dhE - yvcobqaTWaKnQZ/KR6NUkgddj+z3RKHBmvFYPP3IjktAWQPbDcINTw8mmlwNs4kaagf8rDUpU0Xi - FyeyDgfVwy2f26Ljh4zGYU7hkA5vVpE1SjaomEMN1Xk2rWSld5bslpgrWJWidXM28n/5DQsRhEHv - DeWdQgW4yOlGReZFawqrPciqgPKo6xc+eCw1Bl29L9sjeyO9WtGvUWdvnjxrDuI5FhVNNsaVQc/7 - F4iqR+KnK9RXXvyoGRbSP3ES6D5GXh0sWNrvHwudFVlq4A76yvP7xyuuyjP4CY3qanV1axvR99Ch - 9+6sIiZpL3PF1LSFgH15n4oIboJ0wTslXBgbT5OdsxSI1XjfAFpvSjMOxVm5oJUd7Po9z6ILWGwj - 39mWFig6XWFyWjqY0bjxzoslnykh5wzxfX5t8ofqUwQFux1wn1dJPmJkiiPSUH/niABSxvIh8e8C - K1mtsLPT1QLPqnTgyn/BP0C0UOqb89k7OovnuQKUKD3oWTVeWN9MvhfwlpMygJl760xUUdyUonmv - NbHpeNDrC6Tf7Y+fhet4OZ3NfeY8Hor7zD8JZ2KYTWShSzw00FOxlNjII2pM5trPaESXqMhhknxU - 7FQaCLA4Dzf7PvBtHvf+grQvwF2yvYp6hHEp9eWtW/+a1mb8mT6m97ce7IOm5o3whv52ws/0nfpJ - VEsJvTQiZs4W7rbL3GGOyV08hBkkyQN88/ItDXlS35b1fqmU3pMgS8qwvu1M18UB4+iYOFUSQ8pK - CobnqDqrLmMXvJUm4q5s9vGyOxr2SXDxaygvNyMiaHLkpPeWOMmRF0tT1SiS4N5rfzCjyhLfOiIN - Y6VU+Exk1VPpXWScUQES4AnwlJs6fi5EZfW0sghgTuNaQExdwPPMZMZHVfjqWnPfAdbieYNvzNzT - rOOTKRIUiNfeb3kk8qVWS0RmSra82+gVhTpSHNU/NylrPgBRh+O9/mVYkAX0pPSX1zL/PsWi9CoA - YxJ51PSOhf38v3jtH9utCNrw1qupW3IEuV4k7KJs0sWqt3ltQLKMthUOY2g6ex40J/g6R2VNmzzX - cYCtnfbae7zzm/1xtK9/QOmDcPbtPpDBVylaTrbPR4U0dxIN21FXNmZMGjGX0mco8ro1BfufojYS - 1LKwLBjqkvChlpOeSMxvJTLaI/Ui5XIgqF9KFmHELoPGi6sZHFFKLzSleog+tlmIs2OLY2Z6OnuN - B06ZrKhZwXI30AX/3pVRk+t3trHQqfEPYorAzE7qG1soGDn1aAzyTdCKR4D0aY8UPuSM6N7olbdM - X3iCwxOEAH789U1oOsu0n3su2WW2WQw/XgZV0wqN9CVeKRZwFaIRHID35EU3zzs97PH/bJVSPtZ1 - 1AjOLqYx3ne0+PleroXrWxDJhjfxUCc0bEisclEz6YV5n/NbfWlmXMU6mmUHMIb5hSFgJLx83ICO - jJaSxfM1OykNqjiDe6rJfcBfvDVnDhoVELEL6fgMZNNqFU5ZN55y5lYOZkvYONkUVf/QfnRTu918 - 6wVuMHT6nydz0choUSa/q31yIPTPvVB4Rjqcni+WkvGwLMoSr7dtCCUx0nLEzizInGg7nX0= + f6cAq6Lfc1MvY8Af1mRIuDqC37TUTIJ6gTnYqMkHIByR2gjxqvjiZ7OVK62kdi7ScTVMgc6SP7Fc + 9ZtLjk4dIHSlAZVVK4GRvPnmtP1UGazqsAhvOOSKteH4VlEDFF1gU7GE8daS9i0yYNJhL7aUspEj + bki20aex55+jOpr2/yu8doE4KEwBMZfrnnNvOTNt7mdNwenzLCeHu4BZo2rs5oC+Yqumyo5d2t7z + r86OZOqEhc62Y54fQjFn+he+MWGIb3GObmdTR8EQANPNgiJm28z90WZtortIAV65qPAWVOqVeVZC + k9G08PhI8Ul2HSMTD8hppTz14L28cI0zvz1R78L7bLoV6npKa9WayCX5Y1KWwfJZGUL2n0hwZczV + YiHDmYVqFTBDu2EorsjT2ow9fxW42V+S5NQFEFq9ZX9dOE5gGN+O692NnXO0MI/Cgwr3sbCw2oMg + CIy2Z69sLdbHn1s1ZQJbL7/a80MSEmOCN2z8hyi9UwiFIz+KZWHig+vevEGNnUrUb8nNb99A1evy + f1Hn+hS1M5HrhLNEEs3QDKzWk5LUK3REkmUe8AeZ2rJF1Gd3R2DmFBJvZ5QSKMm15ErIlb8tPONJ + 2zem6VC8UAz5JIIlcThGTARIIRSzpFx7P6qduhydZ+PKSdKD/ZUcbl4Uy4yb9558KnDi9GuJPnND + O3DtybDUbgltpFAc2EwIY8mITmF/E0bzD1M8EoLJvEHS82YJHmTr/KA3YYzKX94MD9zW8wgk6h3W + igIP7A2h5fLBXyVAlY2ED8SD6p7vHQadxaWanYbPd2DEjpmvyQ7aSStGBzX1VrtD+c4Xkw8MZLc6 + Pvio6Z5PXtL8CjEdWytgo2itzh5w32naAsaripDJ9eq0Mucu7FYQLPcdHqDS1NFmcNrSttbp/Qqd + ButKEC0sTbVfxRiRgewAyeKB2dz6gxrgbfhzqkqrVJlZcqzYbijjpxRnwEWoJVR+RcZy/8wZS5DJ + 9WoO+sL20QvFlMW6qPkUDKbUTpSel1SsecakDN9BnNQlBCRN0tORmZQMNCKSEOwWfZd0T61KJ8Jc + P9tY108eYFWE/E2/PBf7p1foLRQTgIpEodWyNsgqMj9rd6kBx/xNmradJv69Cw+RXh2JCgcpB86H + qovnsfZh692tOxnQp1YWRqSWZOqqc5jok5T7pHtEh4XTzLKhHc5qLRfmVsbNZl63yoyStJST5+Mt + qgM3fH4R50MzsXZA+7AAvKn2f8bfrn9STPCEREHZDJndO7IHPPC2F4Eogvb5ph7iisj2UhI7neeW + xFf/rL+6zDWCpz20FFsXltrkd5mLrUiqnTTPuFBHb4Xq0NX6/4W8hYJITdKxLzjm0Rk2yd5j4jT1 + Oyyv7ZXJXKedembzlmYLGdmf3y4i0hB8dynmuiYyHzWg90haCAJxFhVcgB7wRL+heG8h+BMXqtdw + R7ktLM8aZlUqElJxLcFWUg44LKAM9MpO1mfClfkHyQk6EWplpMF3GjEsEfBqk8twgvsczVrzwS6j + bi6aM6siM0WpDfI23cPlJHUvD78hFZWmGbmqTtMk8WfVf08+BG4YmdKq4b3guK41fdXeLzNqBvbO + V7ApCzN/4JZIYod5I1MUc1CEY3rM12uFKsY285ZtosY8AT/KLZjAUMy6Q64iNbCaiaWXDMnEVYYO + D2SN67WHmf3keh+L/U+md7/IjE8ed3scCb7fMNr+8pLo4RcTKrgThKWjoxR1Mb64STQ8o32t3Q/d + qnnMuyMT+wQKwyIIRHGCLdWslthFwyGEPyggWYegdCwr65PHPbM3wy+9kXZs/tumVUjyMyYM8Yqn + XeEHBzi1ofBvZry4WTIHFju1X84UphCvOldLJyh/KYEpLIwEgGp9cJ7Zzcg2fMop7Vvll33Lzvp4 + XVXz8tta9BL0D8tpfuaTsYIwGjGLPpV9A9Xl4VHrA2rJyGXRxdL5Stqb7VbhQEr+tJfdW502pONu + peg3u8vnynWaijM8wrxJxGP1DegFjFwwqbZfnYWrCjvBieVQZ31n7nG+MiDySxrOIRwvJYXLVjol + aje7S7Rb90Ht40dqJ5/e2jSQkzdWGcf32yTdBnUAqPYmTnPlONtYRlgktrQKAKEvuSzGxrPLR3O+ + huqNVKQOhy8r2NpGQt7UbyKp3cT6ozaCe42FNDQt6XQ4LDpaNwVYkZLlgodCkuxFZr9MLC3XDNOe + kUXL/a2MD4b7vq7cqFfL0Hc4+CRXicBZkW8WV9uTNHH9bHT0wEIqxynexlYCwa+sZW76em2h3tc1 + LZluObrx1lOR6/+ZvTUyeG1YyoPNcbumxqhgwRhB2N40TXSFHXxmKeCyK+0ueJ6bqeMvzQn6XXgR + DXcYhJNrul5YL3WPnSBqIiykqZH6sXeknfPVaHexG54GMSgpK9Zod6QYCUezEzV7yu2OQpoYzPK8 + X14+1EqB9ybaYBwGZQhLe7g0RiBqiWlAKk9OqXaeTpL8Tqnar+fX+T8bviw/ZEkBGtaL6ghMJQA8 + Yup722nAaxBOvdHg91PN+JZKy8kFqhrFpPFL5BKfD+1WwARjqhp+oJqRUhbPlpgTkBIWIOqA5NKM + y5vxtCVB2FOAhtj6qHANg1gLNzkHRgOJzv5E08yfjetY600+UW54Rgn2iR/4o1AX7I3n4DzbrJf3 + LXfhGvWA+ftu9kI+EOaknJ2Qq+AwVKp+8DQgjBPK22D+LbMZ4mPAQ2Zif6H3H3MECpdvc8Y= Index: client/1.0/pkgr.eagle ================================================================== --- client/1.0/pkgr.eagle +++ client/1.0/pkgr.eagle @@ -134,11 +134,11 @@ 4 {set codeString continue} default {set codeString [appendArgs unknown( $code )]} } if {[string length $result] > 0} then { - return [appendArgs $codeString ": " [list $result]] + return [appendArgs $codeString ", " [list $result]] } else { return $codeString } } @@ -202,11 +202,11 @@ # looks like an OpenPGP signature. The value argument is the string # to check. The value 27 used within this procedure is the length # of the literal string "-----END PGP SIGNATURE-----". # # - proc isPgpSignature { value } { + proc isOpenPgpSignature { value } { set value [string trim $value] set length [string length $value] if {$length == 0 || ([string first [string trim { -----BEGIN PGP SIGNATURE----- @@ -282,24 +282,24 @@ # not be raised by this procedure. The fileName argument must be # the fully qualified path and file name of the OpenPGP signature # file to verify. # # - proc verifyPgpSignature { fileName } { - variable pgpCommand + proc verifyOpenPgpSignature { fileName } { + variable openPgpCommand if {[isEagle]} then { set fileName [appendArgs \" $fileName \"] if {[catch { - eval exec -success Success [subst $pgpCommand] + eval exec -success Success [subst $openPgpCommand] }] == 0} then { return true } } else { if {[catch { - eval exec [subst $pgpCommand] 2>@1 + eval exec [subst $openPgpCommand] 2>@1 }] == 0} then { return true } } @@ -1157,11 +1157,11 @@ eagle [list proc $newProcName(3) {} [info body [appendArgs \ [namespace current] ::tclMustBeReady]]] return [eagle $script(outer)] } - } elseif {[isPgpSignature $metadata(certificate)]} then { + } elseif {[isOpenPgpSignature $metadata(certificate)]} then { # # NOTE: If there is no package script, there is nothing we # can do here. # if {[string length $metadata(script)] > 0} then { @@ -1186,11 +1186,11 @@ # # NOTE: Attempt to verify the OpenPGP signature for the package # script. # - if {[verifyPgpSignature $fileName(2)]} then { + if {[verifyOpenPgpSignature $fileName(2)]} then { # # NOTE: Delete the temporary files that we created for the # OpenPGP signature verification. # eval $script(cleanup) @@ -1203,11 +1203,11 @@ # # NOTE: OpenPGP signature verification failed. Raise an error # and do not proceed with evaluating the package script. # - error "bad PGP signature" + error "bad OpenPGP signature" } # # NOTE: The OpenPGP signature was verified; use the downloaded # package script verbatim. @@ -1247,10 +1247,80 @@ } } else { error "unsupported script certificate" } } + + # + # NOTE: This procedure returns non-zero if the specified package appears to + # be present. The package argument is the name of the package being + # sought, it cannot be an empty string. The version argument must be + # a specific version -OR- a package specification that conforms to TIP + # #268. + # + proc isPackagePresent { package version } { + set command [list package present $package] + if {[string length $version] > 0} then {lappend command $version} + + if {[set code [catch $command result]] == 0} then { + pkgLog [appendArgs \ + "package \"" [formatPackageName $package $version] \ + "\" was loaded: " [formatResult $code $result]] + + return true + } else { + pkgLog [appendArgs \ + "package \"" [formatPackageName $package $version] \ + "\" was not loaded: " [formatResult $code $result]] + + return false + } + } + + # + # NOTE: This procedure returns non-zero if the specified package appears to + # be available. The package argument is the name of the package being + # sought, it cannot be an empty string. The version argument must be + # a specific version -OR- a package specification that conforms to TIP + # #268. + # + proc isPackageAvailable { package version } { + set packageVersions [package versions $package] + + if {[llength $packageVersions] == 0} then { + pkgLog [appendArgs \ + "package \"" [formatPackageName $package $version] \ + "\" is not available: no versions"] + + return false + } + + if {[string length $version] == 0} then { + pkgLog [appendArgs \ + "package \"" [formatPackageName $package $version] \ + "\" is available: no version"] + + return true + } + + foreach packageVersion $packageVersions { + if {[package vsatisfies $packageVersion $version]} then { + pkgLog [appendArgs \ + "package \"" [formatPackageName $package $version] \ + "\" is available: version satisfied by \"" \ + [formatPackageName $package $packageVersion] \"] + + return true + } + } + + pkgLog [appendArgs \ + "package \"" [formatPackageName $package $version] \ + "\" is not available: version not satisfied"] + + return false + } # # NOTE: This procedure returns non-zero if the specified package can be # downloaded, i.e. because it is not required for the downloading # process itself to be functional, etc. The package argument is @@ -1400,35 +1470,61 @@ # proc packageUnknownHandler { package {version ""} } { variable verboseUnknownResult # - # NOTE: First, run our special [package unknown] handler. + # NOTE: First, run the saved [package unknown] handler. + # + set code(1) [catch { + runSavedPackageUnknownHandler $package $version + } result(1)] + + if {$verboseUnknownResult} then { + pkgLog [appendArgs \ + "initial saved handler results for package \"" \ + [formatPackageName $package $version] "\" are " \ + [formatResult $code(1) $result(1)]] + } + + # + # NOTE: If the saved [package unknown] handler succeeded -AND- the + # package can now be loaded (or is somehow already loaded?), + # then skip running the repository handler. + # + if {$code(1) == 0 && ([isPackagePresent $package $version] || \ + [isPackageAvailable $package $version])} then { + return + } + + # + # NOTE: Next, run our special [package unknown] handler. # if {[canDownloadPackage $package]} then { - set code(1) [catch { + set code(2) [catch { getPackageFromRepository $package $version handler - } result(1)] + } result(2)] if {$verboseUnknownResult} then { pkgLog [appendArgs \ - "repository handler results for package \"" [formatPackageName \ - $package $version] "\" are " [formatResult $code(1) $result(1)]] + "repository handler results for package \"" \ + [formatPackageName $package $version] "\" are " \ + [formatResult $code(2) $result(2)]] } } # # NOTE: Next, run the saved [package unknown] handler. # - set code(2) [catch { + set code(3) [catch { runSavedPackageUnknownHandler $package $version - } result(2)] + } result(3)] if {$verboseUnknownResult} then { pkgLog [appendArgs \ - "saved handler results for package \"" [formatPackageName \ - $package $version] "\" are " [formatResult $code(2) $result(2)]] + "subsequent saved handler results for package \"" \ + [formatPackageName $package $version] "\" are " \ + [formatResult $code(3) $result(3)]] } # # NOTE: Maybe check for the package and then optionally log results. # @@ -1437,38 +1533,33 @@ $package [packageRequirementToVersion $version]] if {[string length $ifNeededVersion] > 0} then { set command [list package ifneeded $package $ifNeededVersion] - if {[catch $command result(3)] == 0 && \ - [string length $result(3)] > 0} then { + if {[set code(4) [catch $command result(4)]] == 0 && \ + [string length $result(4)] > 0} then { pkgLog [appendArgs \ "package script for \"" [formatPackageName $package \ - $ifNeededVersion] "\" was added: " [list $result(3)]] + $ifNeededVersion] "\" was added: " [formatResult \ + $code(4) $result(4)]] } else { pkgLog [appendArgs \ "package script for \"" [formatPackageName $package \ - $ifNeededVersion] "\" was not added: " [list $result(3)]] + $ifNeededVersion] "\" was not added: " [formatResult \ + $code(4) $result(4)]] } } else { pkgLog [appendArgs \ "package script for \"" [formatPackageName $package \ $ifNeededVersion] "\" was not added"] } - set command [list package present $package] - if {[string length $version] > 0} then {lappend command $version} - - if {[catch $command] == 0} then { - pkgLog [appendArgs \ - "package \"" [formatPackageName $package $version] \ - "\" was loaded"] - } else { - pkgLog [appendArgs \ - "package \"" [formatPackageName $package $version] \ - "\" was not loaded"] - } + # + # NOTE: Check (and log) if the package is now present. The return + # value here is ignored. + # + isPackagePresent $package $version } } # # NOTE: This procedure evaluates the package repository client settings @@ -1613,14 +1704,14 @@ # # NOTE: The command to use when verifying OpenPGP signatures for the # downloaded package scripts. # - variable pgpCommand; # DEFAULT: gpg2 --verify {${fileName}} + variable openPgpCommand; # DEFAULT: gpg2 --verify {${fileName}} - if {![info exists pgpCommand]} then { - set pgpCommand {gpg2 --verify {${fileName}}} + if {![info exists openPgpCommand]} then { + set openPgpCommand {gpg2 --verify {${fileName}}} } # # NOTE: Verify that the package script matches the current language # when called from the [package unknown] handler? Index: client/1.0/pkgr.eagle.asc ================================================================== --- client/1.0/pkgr.eagle.asc +++ client/1.0/pkgr.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYBVUMAAoJEFAslq9JXcLZ/28P+QHqfz72NA83ojjtBSO9+g41 -i6LVJCSq8bBfHkl+wE+kthWmkETHlu6IY67rBuJb0QDDi4VENwwUG+KyFVbRwt+w -u0PfXhbDTZi0KzD7NbktGR8IQkLH4JRXnAxQNRtYP5/gIQuFBurh8w/1XXzi/sop -cSSa8+qpNfQ60zVvrhE8yFvfw9VpE/RInqbWyOOMj5MST+BgoEjUjvVPHrox5IWR -XnUFgV+iwvaCqjynI5swTuunpL13SxMUpdJf/Ghekij+vEXZQQtScdwP4XwgoB7r -l2neeUOhlcfXISI5PhnjmJ8oRhJ7yMVCJXaFkzkq8dKOgrSDAkaGFFjZEkNPKGVo -eguLISIXNG1A3ENYXuKyTsImk7cHEMHCdCeCi9rjzGVK+EvCiptIz/7Z6U7CZHKs -GxcKJQa2Byd6jKn7qZR2xu3CQ7NGsYMb08/PXNn0rIdNQVvqAYAhvGBiwQW1H7Sw -Ohl55pYAMkbCiC2tsX6IcvCVjLqwZJYe6hPh5rdRrJ5bc/KLaGLzttMC1j1dNmL5 -xDMTVdR1G9HyrMj42CO+1Ch8a4hMPLxbXieBq434diEVXNRX8oU1Ap2S+WFa8tiO -VIjTbR6+8bJ+1uWHwNDYa/h+CLFDyUFlty4kqqYSqACWCrnbXXvqTneY00HpbOjG -eNW7DqidxrUaQOBD5WIA -=JT0J +iQIcBAABCAAGBQJYBbdnAAoJEFAslq9JXcLZxPQP/i4KZZMEwqs+jQfPANo5f8qP ++9ssu+DFplo1Hsap5yt/ny/fLvnKad2BFJyk4H9ZiwDqlW2LRig3Y2TBMLqV79L2 +8f2WOBXQcDeKEYez+pl7DlzIYHrVl8DVnBcBdXpB5HTIiKgQdknR9Zvd3v2cukYd +wLyRY6AgIvFWGKA1zt2+ahKaf6owVhihKN2z6yU7EedpkiqaIiE8thUJ73wKLdZK +jpnYVHo5TQE3t0q2Yd22pE2a9DyxXWXvSvpAwqHEhOiA6i4o9UPfPWyK0vp6h7ch +VB+AE5Ge5oMiZPOlpRo69nKzZ//EGddPm1BKJMEWFIJHAVXD4jEORRIGP/Xjz3JD +GpslFcS/bOdQeiPlI2niKd9r/sIlGqw9BNC2FkVGGdvhfCE1VGlxt7ztY3nhYskm +oCKwu4PWfub5uzi4gm2cqB8/42SMxec7oSersdc53QK+IHHPLHe3DBer8FnfGJ9F +kcLMPcxmSnEqzImgwpoAbDTHODmNkNnMaBOk1Qk1+r8EUHAIN6nTiqTTHDvIGpgz +QhN6K43Pakh4vRI1P4rz5pVNCvdDplVPZqigVqfIbOZuX3rFFf5Fg7UIb/j/ZeRD +39xHRL+mzJE0xaJzx7tAXa6TBiWlWeuvFx/4r7bo+goQRDal375W1HZfML0BzLZ8 +E3OkuWCJzd76JCWX+YiN +=DB2P -----END PGP SIGNATURE----- Index: client/1.0/pkgr.eagle.harpy ================================================================== --- client/1.0/pkgr.eagle.harpy +++ client/1.0/pkgr.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - c1c2fa54-3faf-4030-8a03-3afb5193103c + 19feaf1b-9e2e-4252-a67f-e63356c08eaa SHA512 Script - 2016-10-17T22:46:29.1886016Z + 2016-10-18T05:45:38.6905547Z -1.00:00:00 0x9559f6017247e3e2 - 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 Index: client/1.0/pkgr.eagle.harpy.asc ================================================================== --- client/1.0/pkgr.eagle.harpy.asc +++ client/1.0/pkgr.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYBVUOAAoJEFAslq9JXcLZiPwQAIzmXsShuPAnAsIj6QZiy+9d -IyyyW2zuUBpCt6swFCS4sXGN0tr8gcTZMvwlQBVwnE4bDCFfjKPmtQMZ0+cDa+Cx -cL4qbYXD7Mm60mcrBgvL2hUAnHTGN0S9N7T0oEMmGKiRj8UI3uknOpxigeNLw1Jt -ZDeCD4VvvyOt/pja86kng5DI4zyOw/8uGBQcIXihp+LTAVif50TI6+ZYAhKTzalk -TGbDEniieDBgL8eeaLnrME+26le5vaG18ufSG7NwLdxTojfDv8qKb3Go5VW8VjKE -fh8eMBwfYPWWBihoSpMb/miPrdCzWbOnRM77ZK70KWJS1VtODZ9whoq8flgos8uC -stV1X94Pjxz+rL7GQSmnIOhVDwZb/7Yl5sHVGLBWMUixISEu4oIATjclKQV/Pcez -OIRBnD//O2tYtu3V1niB5P4oUFdUUdSLek+uwu2fAXGswusyPx1ZXeusGFAAe4te -jwx6NTbPQtOmKNMLnW+LvES7gXhoIzpv0GhXkM9hblbaCltBcoKijtJk7wj0Jrtb -g1KOJcJ+6NqKVuPrdeN+IOJeMqPJGxKmQT6MVVhOg+yH1vv/0d7ogB3VOgzCfSu+ -GuXcCVcwN96lV19miFflu2xP2Eg4LgS5I6LWtKwveh5jjWoYAFP0CNmFX3pUsfTo -5Hv2eDTbVVBoW08oVH0B -=7fMl +iQIcBAABCAAGBQJYBbdpAAoJEFAslq9JXcLZm+AQALTT+dgXi4HXPZU1zs9I9zXE ++L+KL+V7OrCxXOd5XS23q7KJ2GT3omXWnn+OY4Dejer/kU67RuDgPVUmwUs/apAW +39iRzwdVWXPSeC4kd0bjPhN1W0P4ttJXJiT7NuLH6+UI1sEBIdTGCa1k6Vnf+N0b +y6xbZISKPwWUMjnuZPFs/ARpJaPtk4QeDuDwiiglQSzQBnoh/1sktpl8vhGq5C7A +ANKQoDXgSi1RvZgNw4liQ4WsKYWPsrmnSrlQxN0cEm/w6t+ghnp4a34z6bCoYtCz +K9lXDUISqRbPt2m48IUhllULk/MgGAubPR4T7yuBS/oC5nsYT3BqTZcx1/1ih5BH +bWS23u44DcHYkt011aO5t94kZBV9pSXXFKXO6/7NLbZDIt/cVN8czo2Uoe+c4yfq ++HWIql+nKzo7lTPeqaf3w1egoKANbOo+Ye/eXJjGQu99I2oGVNrLY3XF+66LIbm/ +YMu1Uj3qj/1nthcQPfJZRsN/EXAGHkOgAoSfRfFaMkeL7nvD6BcFtdgU5N+uSiKM +sHDYUUKIP7ciZI2MAbVTgCB838/D20rDzbmTBs6y9iEV6guv8PctGhTe9OZFemDS +42YqwqAzlNEmZXqCp7LYulDpFdq7Iu9kbEglBzQFwcIFax1Wlu+J+k0gBC1QpTqi +cz9O31sYB9P/gh2nviKf +=UvlD -----END PGP SIGNATURE-----