Index: client/1.0/neutral/pkgr.eagle ================================================================== --- client/1.0/neutral/pkgr.eagle +++ client/1.0/neutral/pkgr.eagle @@ -352,11 +352,11 @@ } result]} then { error "cannot use OpenPGP: may not be installed and/or configured" } } else { if {[catch { - eval exec [subst $openPgpInstalledCommand] + eval exec $openPgpInstalledCommand } result]} then { error "cannot use OpenPGP: may not be installed and/or configured" } } Index: client/1.0/neutral/pkgr.eagle.asc ================================================================== --- client/1.0/neutral/pkgr.eagle.asc +++ client/1.0/neutral/pkgr.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYVMeqAAoJEFAslq9JXcLZ7TMP/i1uqLXgToUaI4sFV8hoxPWQ -buaSI3nfNLJvv8jVJAfe7VolYJw9v0FHpeDTcVToVUDlcGy8W561stkgYn96f4tZ -C7jLGhqtv5IpESjXDm/1bf8QoJrLShx74W68/o1ae4uhlpPYxZg5vcSYFNS09h+r -BGNNza0rZS/4elml92cbsfc/h3Qn2A9chu34eiF0TC4zhCknrmU4LKD3yhlqpJWT -cDIGyKUecW+mSXJGltmmJL+IgO+tNwA72q91sJ3ZIsaEFdYMENZkwva9l7LxoK3j -tqJqknv6a8H1V9PKN9c+qUROq0c5+biwhgldfg1JTLD5ah1YcrZNB9idUen/ftf+ -QTQnx3nYPLl7fnMiM6S6svWZjSdZ98Fnpu4Jr1F3Im4DSp6wQcILYruGah9ac49Z -XB/yFpiit7ZhoTH1IVNYYQMdqbf/Wb6WBO5q4CxA000C6ANrk2Cm7Xh5wFlTafg3 -VsEzRNhOLfu8dO2CaOzTIfRo4QhwDJl9yDauei4sPo0J2FmbPTyMBnBwz/X14Gcv -st5sFAIsryfSx2c3rDpnj8aFHcQLi0DuB8QCR0p4aSKVb2lenmZfcA85PZYD662v -2x/41sP//rajbEz3YjJlnoK19acDwJSU6uFuvLEqklnd7TDFHl1YtnVVD6wvfSxV -F67DBCIaQLgfEMK45lzv -=waFs +iQIcBAABCAAGBQJYVf3KAAoJEFAslq9JXcLZdl8P/3gJbugJFTv34QLfX4lGkE/O +90DdUo9cE5Q3B4TzhdI7q0Pndr3npbHfYN4xE1x31ru49TAvFfvqlfb8ruWbLaut +yVT4qWixveJ+9Dmyqz/caP4EEOLiWy5Esyiodsnm0vfmsZNF2l2ZheLemcLk6Vzm +Z5mBH3wDwdPP0KP7qKEpz5havgnyt1OMqAeilq8Kr0azBhlKKfCv74XpYvKJk+Rp +6DHO9aRrszMs6MOBHwPBs7WncMiOANNHnj/Q24sxIdqGjIA7FmU4mkZBC0j2ambD +8tk8DUvKLeHMsttpB8K6pur9OdLkXTNy96tH2wMsSH77ewvcuNJs+znB8p2OEcGr +s61qNhioRym9L/mtoMeaDQhmTr6xHLP5brLW2VKrm61UoWpakTjcKIX7mKEe2KN0 +9PVWgVoKO1u3xxRpqERsdgb72AiHk0usODIqy7WazLLOh+he/yOSiJtYj2Q4VsiC +O5E7GTkdD9XRWaltkJ2TYxDC8C4VSUoWsXTKHnMRczg3iIk6sqgxRkAHqa1ggjM9 +sBMuwJtJwKeWvLtTwJef5qZp4pdY9rxZo5wn92nMx9veLUit963ORAe1ww2gqFdk +o7kAVia6QL6csbhyO8hgx+ozi0vrD9THIfO6KNYXhn6zEthX8ZYcf9gS/gUcpef9 +HP4UN52z9xe1HmJ1zztl +=m5li -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgr.eagle.harpy ================================================================== --- client/1.0/neutral/pkgr.eagle.harpy +++ client/1.0/neutral/pkgr.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - b26eb0c0-d25c-485f-9228-064fdd1f781a + 0dc9006c-d011-45fe-a801-6b1fb194725f SHA512 Script - 2016-12-17T05:04:57.1298828Z + 2016-12-18T03:08:09.6591796Z -1.00:00:00 0x9559f6017247e3e2 - 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 Index: client/1.0/neutral/pkgr.eagle.harpy.asc ================================================================== --- client/1.0/neutral/pkgr.eagle.harpy.asc +++ client/1.0/neutral/pkgr.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYVMetAAoJEFAslq9JXcLZE/8QAJY8LtO8YUPPhTY+RPAPw7vZ -R5W/eCOJ1Qy185xjLVYeb6V0ULxEAgY7iNw4mAkF7dZl1oQ56Xhao4L2sH4+nsMx -q/BU0Y/Bk0StpHpRvw10bWl/iVo4W2qK07gXepgL9zpI5pl/lJerSJA3LHd6RD8T -Au/2dw6d/N4ozkc3BTZf4PVZCKfLzVdQ1hEbpDTVlWd0fDS9sEywdML/OKgMzvbG -YfJrTwjF8sf3urJDbBolFxV430mdbIbLPyvkUCCiOjC3oJi0766B2Xsz+95fY16y -fMa8T96R2atRPCOolDN5jdIvCkP3VRKlts6OoNZ7nojiS0SsDsREgt5cEFWieXYg -JFf0Ln5wqjAWxRLl/MlZw2qoN4VQKD9OyS/m/lncNQ4udP4/AIeuQIIeJ0e/pjuQ -7jiYm9ZCyBcFT7ncU1gZjp9zQar4hWY1oF79RfiwAhno8Rz1CwAFNGKaJ7nenx+7 -/orx8qcDMFZnPh0fsLQJ2f+Z7TTFmLDuYvA8tDHZRWF4RO//+HYec2KZYIay1ZHI -6RiaNzwjNKI2RF9yJUS+6tGhhu1ck2MR5IXuQ9QFLXqke15qwkpMdKUTxu8N2K/L -FToN9rn9WfC6O1TeUGZkYr7q9hgZ7hBCn0iiLikrgafxuSVQ5eQCRyLD+04vn3nX -cXMvYolWIL6QiREGHpsW -=zSis +iQIcBAABCAAGBQJYVf3LAAoJEFAslq9JXcLZVWgQAJRR53COXyGIGTjnYLyzyZ81 +dYJgaM0TIOGK6kPZ+QnJqVKZzrTK5v68JSBxOaIhP15GcBhBfk03Mfi12QjdnZ4N +NkZ7odh1X3glBbRoSHCqfyfma8Uz25fW2KVdggFCFyX5SK5A1JgWbFJO2CCcFqy5 +po6BDC9kKXAPy6a9PEpPtITXnzo0eixYEQ2Y1p2fcWofKJaGtkNOtxEk5q4S9JLX +vV9oFTRnKYOdwil2Ik1LAgANrCYI/gDDckDOsQ92D86xfz6Hz/NHRFbI4zrxR5pm +PqtmRFq58IxJ/6e7AydJ0hEQHuRBA+AES/jkvsb4dIo/NLkiTth0mV/nQodBGIWK +oT62Ytz/V4mzXrmlwdquHb3mdu3SAkCi/kSEFBpUzg+oOTWPPJ2hNZ7cukhAsT0u +WIJZFFi5QgWE8FP+yNPX3RqqjLX2ub1kTacLi4cWl71eOYHC15eIMQFuSDdfYNT6 +Oqz9h9sOhLXtZacQmUqYZdT9lXX6QWutfcbjzacIS6c6z0hzJGI7q4MGFsBIJw/c +jHlgizkCGIX71KtYCeODwpnHBEqy8DPUlRc6Js0xWruXna2f5W7jwVAkVQZTWSE0 +8cIwQ6a2BQMc4/p3xBPOwvcCX/IPm8ugxgTsOrkfBtYw4hIFcEaHflFy5KAoGf6o +FpnkDrmayO97yAwGLY38 +=Z5JN -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgr_upload.eagle ================================================================== --- client/1.0/neutral/pkgr_upload.eagle +++ client/1.0/neutral/pkgr_upload.eagle @@ -35,10 +35,60 @@ \[fileName1\] ... \[fileNameN\]" exit 1 } + # + # NOTE: This procedure sets up the default values for all configuration + # parameters used by the package uploader client. The script + # argument is the fully qualified path and file name for the script + # being evaluated. + # + proc setupUploadVars { script } { + # + # NOTE: What is the fully qualified path to the directory containing the + # checkout for the package client? + # + variable checkoutDirectory + + if {![info exists checkoutDirectory]} then { + set checkoutDirectory [file dirname $script] + } + + # + # NOTE: The command to use when attempting to stage package files using + # Fossil. + # + variable fossilAddCommand; # DEFAULT fossil add {${fileName}} + + if {![info exists fossilAddCommand]} then { + set fossilAddCommand {fossil add {${fileName}}} + } + + # + # NOTE: The command to use when attempting to commit package files using + # Fossil. + # + variable fossilCommitCommand; # DEFAULT fossil commit ... + + if {![info exists fossilCommitCommand]} then { + set fossilCommitCommand {fossil commit -m {${comment}}\ + --branch {${branch}} --user anonymous --chdir \ + {${checkoutDirectory}} --no-prompt} + } + + # + # NOTE: The regular expression pattern used when attempting to verify + # that Fossil committed a set of files. + # + variable fossilCommitPattern; # DEFAULT: {^New_Version: ([0-9a-f]{40})$} + + if {![info exists fossilCommitPattern]} then { + set fossilCommitPattern {^New_Version: ([0-9a-f]{40})$} + } + } + # # NOTE: This procedure returns a string value, formatted for use within a # script block being processed by the [string map] command. The # value argument is the string value to format. No return value is # reserved to indicate an error. This procedure may not raise any @@ -57,11 +107,14 @@ return $list } } # - # + # NOTE: This procedure processes a list of qualified file names and tries + # to determine their common containing directory, if any. The + # fileNames argument is the list of (fully?) qualified file names to + # process. # proc getContainingDirectory { fileNames } { set result "" set resultParts [list] @@ -82,26 +135,31 @@ return $result } # - # + # NOTE: This procedure attempts to process a list of (fully?) qualified file + # names and return the corresponding list of relative file names. The + # fileNames argument is the list of (fully?) qualified file names to + # process. This procedure may raise script errors. # - proc getScriptChunkForFileNames { fileNames maximumLevels } { + proc getRelativeFileNames { fileNames } { set directory [getContainingDirectory $fileNames] set directoryParts [file split $directory] set fileNameIndex [expr {[llength $directoryParts] - 1}] if {$fileNameIndex < 0} then { error [appendArgs \ - "bad file name index"] + "invalid containing directory \"" $directory \ + "\": cannot go up one level"] } set relativeFileNames [list] foreach fileName $fileNames { - set fileNameParts [lrange [file split $fileName] $fileNameIndex end] + set fileNameParts [lrange \ + [file split $fileName] $fileNameIndex end] if {$maximumLevels > 0 && \ [llength $fileNameParts] > $maximumLevels} then { error [appendArgs \ "depth for file name \"" $fileName \ @@ -117,11 +175,24 @@ } lappend relativeFileNames $relativeFileName } + return $relativeFileNames + } + + # + # NOTE: This procedure attempts to create a script chunk that appends the + # specified list of file names to a list variable. The fileNames + # argument is the list of (fully?) qualified file names to append to + # the list variable. The maximumLevels argument is the maximum path + # depth allowed for all file names. This procedure may raise script + # errors. + # + proc getScriptChunkForFileNames { fileNames maximumLevels } { set result "" + set relativeFileNames [getRelativeFileNames $fileNames] foreach relativeFileName $relativeFileNames { if {[string length $result] > 0} then { append result \n } @@ -133,13 +204,28 @@ return $result } # - # + # NOTE: This procedure creates and returns a script block designed for use + # with the package repository server in order to download and provide + # a package consisting of a set of files. The language argument must + # be the literal string "eagle" or the literal string "tcl". 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 "eagle". The platform argument must be an + # empty string -OR- one of the literal strings "neutral", "win32-arm", + # "win32-x86", "win64-arm64", "win64-ia64", or "win64-x64". The + # fileNames argument is the list of (fully?) qualified file names to + # be downloaded when the associated package is being provided. The + # options argument is reserved for future use, it should be an empty + # list. # proc createRepositoryScript { language version platform fileNames options } { + ::PackageDownloader::verifyLanguageAndVersion $language $version isClient + ::PackageDownloader::verifyPlatform $platform platform + return [string trim [string map [list \r\n \n \ %language% [formatStringMapValue $language] \ %version% [formatStringMapValue $version] \ %platform% [formatStringMapValue $platform] \ %backslash% \\ %ns% ::PackageDownloader %fileNames% \ @@ -160,10 +246,98 @@ %ns%::downloadFiles %language% %version% %platform% $fileNames $options %ns%::logoutAndResetCookie }] }]] } + + # + # NOTE: This procedure attempts to stage the specified package files using + # Fossil. The fileNames argument is a list of (fully?) qualified + # local file names to stage. + # + proc stagePackageFiles { language version platform fileNames } { + variable checkoutDirectory + variable fossilAddCommand + + set relativeFileNames [getRelativeFileNames $fileNames] + set savedPwd [pwd]; cd $checkoutDirectory + + foreach fileName $fileNames relativeFileName $relativeFileNames { + file mkdir [file join \ + $language $version $platform [file dirname $relativeFileName]] + + file copy $fileName $relativeFileName + set fileName $relativeFileName + + if {[isEagle]} then { + set fileName [::PackageRepository::formatExecArgument $fileName] + + if {[catch { + eval exec -success Success [subst $fossilAddCommand] + } error]} then { + cd $savedPwd + + error [appendArgs \ + "failed to stage file \"" $fileName "\": " $error] + } + } else { + if {[catch { + eval exec [subst $fossilAddCommand] + } error]} then { + cd $savedPwd + + error [appendArgs \ + "failed to stage file \"" $fileName "\": " $error] + } + } + } + + cd $savedPwd + } + + # + # NOTE: This procedure attempts to commit the staged package files to the + # remote package file repository using Fossil. The varName argument + # is the name of a scalar variable in the context of the immediate + # caller that will receive the resulting Fossil check-in identifier. + # + proc commitPackageFiles { varName } { + variable checkoutDirectory + variable fossilCommitCommand + variable fossilCommitPattern + + set branch ""; # TODO: Figure out a good branch. + set comment ""; # TODO: Figure out a good comment. + + if {[isEagle]} then { + if {[catch { + eval exec -nocarriagereturns -stdout output -stderr error \ + [subst $fossilCommitCommand] + } result] == 0} then { + set result [appendArgs $output $error] + } else { + return false + } + } else { + if {[catch { + eval exec [subst $fossilCommitCommand] + } result]} then { + return false + } + } + + if {[string length $varName] > 0} then { + upvar 1 $varName checkin + } + + if {![info exists result] || \ + ![regexp -line -- $fossilCommitPattern $result dummy checkin]} then { + return false + } + + return true + } # # NOTE: Figure out the fully qualified path to the current script file. # If necessary, add it to the auto-path for the interpreter. The # necessary supporting packages (i.e. the Package Repository and @@ -191,13 +365,39 @@ namespace eval ::PackageRepository { variable verboseUriDownload true } # - # NOTE: Load the Package Repository Client package now. + # NOTE: This package requires both the package repository and downloader + # client packages. + # + package require Eagle.Package.Downloader + + # + # NOTE: This package requires that support for namespaces, which is an + # optional feature of Eagle, must be enabled. + # + if {[isEagle] && ![namespace enable]} then { + error "namespaces must be enabled for this package" + } + + # + # NOTE: Attempt to read optional settings file now. This may override + # one or more of the variable setup in the next step. + # + ::PackageRepository::maybeReadSettingsFile [info script] + + # + # NOTE: Setup the variables, within this namespace, used by this script. + # + setupUploadVars [info script] + + # + # NOTE: Provide the package to the interpreter. # - package require Eagle.Package.Repository + package provide Eagle.Package.Uploader \ + [expr {[isEagle] ? [info engine PatchLevel] : "1.0"}] # # NOTE: Verify that the number of command line arguments meets the basic # requirements of this tool. # Index: client/1.0/neutral/pkgr_upload.eagle.asc ================================================================== --- client/1.0/neutral/pkgr_upload.eagle.asc +++ client/1.0/neutral/pkgr_upload.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYVM2HAAoJEFAslq9JXcLZqDQP/0EuHa77yyYqMTY5LnOfFZ0t -vDquGO1Qk4vOw3m3lQKejssZqQLS46qe0+xfdDg81/vIU5w81Z1FI8V51m5EgHd4 -g9O9GOGgLR/ZRaEkEY12nzvyk4kBYQ6OmQshVVD0cSb+72SNh5Olry8DnoG8bRn0 -LGB43ir2+6Mhu02o7WGdI7HlST51/WHMkIkvpbRqxFa8W2E0YahngZJA0icTnpHN -ZY+iosWtPk9gigW0GWAjJLQBbwVYjnfd0hX5W5AcQ6ZU/6m1vBNGJTMk8+cuFnPr -TvzohUMJdO38ITtFr/s/pIq7ELyP25ayTMDdWKARKHKRoLQAXuWvwmXNXrF71VSE -fBPQrY47AGE4PBpG+yVqlv1hqDu+sPhRzNl2XcXTRVOZ1mRhQnfc2ebQkSKETU+O -vzspwLmFrOJ8gsYTidSgw8WCXaywjssISNtSm0AcklwjgOeO2e6Vc1erY1h9HctS -kTB63CuH5V4OuxBUkjFXqmhBuqYUZG+W6Soha99hIw9Jj8j12yfOF97N7ldm7XVO -NoQweZJXYrV4At9ZiXXhMsZ8RgolQtms29kFXeZ879rq4P8QlCmIN+NDJZHbI2k8 -TyVayOg1Q8LcLIi51o/kQ7ldzSd/xZf6kJzPZdUDpKqJBZHUH0aF8C1f/VhebacI -c+gJibewxrSrqMjIE6B+ -=MPwB +iQIcBAABCAAGBQJYVf3PAAoJEFAslq9JXcLZG3oP/3S/KjjVQUDoCWCQV3DlFtGH +0hz0IkBJy87MCbxE3VPW7Kojqx2qRbma3a5yUvaBGm4J9r3t5+z6J9Nx0CJJrYqi +Db3dMiRKv6RiPVjA1vcL7uozJOT5mOuLTTZfc4r/YafEN2izbNidUqQGI4qzx4Tt +dD2hy84jbShUNkpM3AmvIJXIYoR99VWqPgyzpaF8LiYGA1hLH2Y5rvbfrLr6SnLd +RZOvdBVrrrSNYKRRVwsXrxvOVM1a5OxSnz31nV50zL/Rm7ujxk4r3I+oPhRTOKnH +ad9cjry9OBexu9aLtUm4r4pujbuRIP7Dy/MDc8ySoFEpVrPQ2SD1t4rTdHOFFr2Q +TQYdGq9tMNfsNwbTbPOpvz0tuQ/eUA6PO/ccjQj7rsdOCIaHSyh9z6MdxCIXSfTi +99QIICXaz+cdLZCe/ojB7VU0/qAQRYBIthrmd2cdfxdsqPdk0Q+vtaO5BMLddGzQ +ujYBeN89hovslDH4hriYY6O5ChWr0QNBLBR00AlBr5iL7UI/MZTjEoK9qsNfdv1d +XqhjewMBL51WlJRtW7YBPYfPWDqA4gjApxzB/Xk2vSYx0CeRkLSE7F7I6F9LO+I8 +E2lPOw56MsPMENmpeIkrUf0hZ/NXyMzha6Y2vi2dOBolEBIcGYQ4Qbp0oXuD1B/x +8cpf4Xvs0Dj34ZfnbL9r +=ARcM -----END PGP SIGNATURE----- Index: client/1.0/neutral/pkgr_upload.eagle.harpy ================================================================== --- client/1.0/neutral/pkgr_upload.eagle.harpy +++ client/1.0/neutral/pkgr_upload.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - 410ca3b4-8e95-44e4-a931-03b0cc7e1281 + 3783ac1d-7987-47b1-8d9a-de7990ae10d3 SHA512 Script - 2016-12-17T05:30:22.5644531Z + 2016-12-18T03:08:32.8886718Z -1.00:00:00 0x9559f6017247e3e2 - wLD0qv1D0mjoLYIk7KUtVW5FrD6fiaoTcdYDW+jLrQ5DPmf8/Hih70MSigzdb4L5Pb6J624XUxyA - k5EDCYD8CuSxKwSu9JpS+v/+nEzffTik13UAabjLywEQU4fTMFHicgAm7bZg0gvvQkBm6KiGrQyg - OFBk8rzg0cWd9gk0UXBhB3AidhTNqB7U1TtdCIXZzk5Ujz2XxheVBUVscBOirEwWFQnYDgdR8+WP - //jU7OXD1j1krp10d+4a3U8Ydwcb/zK6Ap448az4RfKzKuZjaXetbYdZE7J95nwcLCSAdLdqiIvf - ruMrOnlUzAhQfRThgNGiZwq8JqpbcwJjFEMdmY9f6acVTmBgDbOWauAqfo2NxSLx7UWR8fNeK5OV - aNJYeGFWd/lZGfPWhDS2YqPLkefxB0ts251cmvE6c77FW4WyMjwpKsmTfsxgmLyc7Y4NFZzvmpFP - QFcmxAyC1BHNEyHvM9CFSCwA/UIMF5QdgUkLPsyy6Z0f25phhVvqZ2A82RfvANvjqJwRyajVi0m5 - qgnh+UXd9190lpVzEiXQWdm032egoCpSD4ZZvLW2ncm7dBTo9Ycp9bskih9rscEFJY0zLFANTfZA - 6YFmDaWvPIAA+ukcoo/Ai2f0MTlUGw6ir9MuumXNCraq89TNB+CJaVv/UUHnpNS0XxVt9zrZA0a8 - kMXZV/Bq5p4jGANpUZHyCMzWKzospMKKnUvbah8C3MsvmUXSRqgQI7/GkLuv4zidmioiEZgyAPGz - 7MaMM4IuA/cNKDhoP77+RKaBaaRLTKTDFKYbn+d2bsuwMMFL7sZj9cvuNF5+2vngUtA3kOUAyO7i - RLHrD3eE5QFFnMi8PdkBl+9U0Mp+XI2uqo2sJuR9rXcO/oVdogfa5nLxA/jpRFK1iZZ/ygBy9668 - 9saSrK36A4m7mJJbl5SyqMMUEqlKgrkviyAjXb8CbhszMDaTt2mx95ZjLy++y+RJmi7gFnrVnhXz - 99azo86qKgd1gc66dlHQ8f8kAauwUPImz3sew5/XtZaMkPU0PDcD0h0IaV13wUTAmBzVuhWM/QxP - BEvrqjk/x2WqW7+N3s9fIuy7RT7FUuYVbb/yNAJXLul3PyVYekzftg8OQMxCqMhEm/SN70Ayx6hK - PhZ2HJIpWqPbJlJ7JWgAjodGowM/zuaAd/v9BzBJr4vgm87kzuvZDK4w8/po282RpPqymlVZlaqu - 715nTFG2JK8YbSfjalaJ7uEYHcpHxcstXAf3gAWjpyYHxJ7QgxfhPvcjOV9as8FTKqiq6sgdnlFj - /AlRVJRhYdyi0g/pMOBuDFc5zjJ/ZM8DINkNJPi4gp2pliYwZBKKOxNGt2UUwZDe8rFyh8L2BJ6J - cJcV3udXFCfMHQYnlGSa90m4J4IeCRA9siRAgbwgStHUW8WU/LrSiENnyoMf/syJ7GrfCangtA5Q - dw9mPLCrRUBOKttY3fO5ng7tT1WYm2jsB7AWy7sdMEfz1grCkxBe8zrOz+2SYTs0BCB3uiwLJM1n - gPlXG0CF5LVOWa0LNtBpIKVTn1c05C2sos+28C0yAXQUk7SAMvNPdyo0eajeopgFaLPQWFX70ezb - BeQ6mFAkRCnTQtADX1rWB7BzEX3nZz+vqhTY9GZJ81qv3eoLV7hE582EELHcdUQTraq9cQRMYV7V - w8jlG7FDubDUatC1lvOl1RJBIMu2qGqliwdbHTiAsJs/0neKebJHTfiCsQl7okXA/gyW8T43R4eh - GaLOq9Lx29Ar5ETbPMoTS0UaTXZZLQTcfUXHmbglh1TQCXDiLBU9s4v8zNxxaSQj2+5hqotAgtRS - rZfPvt1NqiAjtZrplUNZNDUE/skGiPkXv7FGhRL0ogA00HBUJ95zNksq1dyo9HU06t078cAyL+Vk - V9Hoq5ZsFPRoqzmrewvWGpoTQ2+b+gXpWjO359NCShznrfKpZn8G4ktRrjNhV33nzgzjGcchQim6 - wbkFiflBe5r2ionEhNxtJUbkdWyZwDeimTUdZmR5USMGcS006/UNAX7sYTWX7jax2le6BlczwfVh - mg6gj+8gRvegXGVcx9mQIh08MQ0LMIJzGImLI359d41weDWBy5EOm6TseMWAe9dDAfbwfwFqi90C - QgYex9xQIfxpFYkG5IN2IqHmjnylw7R3hzV5hRLtOp/ER058hg7B1wEOFhswy4UMCUwwpFrtpPZ4 - U9DDcABPW/ikJByO4i4oCvFkOp7UEjwahusr4Sg8aVzlo3GInY9XF+tOnnPN+o1aOwG4+pp5ScA8 - TVz7GSOV+Vc/KrdQyf+C/mlFsB5pxs8e9qTYhXPfIduFRdLNh4B7EZLJkiIGB9bM8LphKZuGE5jG - UCXAS/+Gd4B00ujvHaRQtqc5M7x8x762UGSuwsa62iu35kSpVVKISEkRWgacJVcKdgtH45Hd1R2w - Sa3Ua5QVu0Y2rj+W7XJq33qd2GPGME+bgYKJ3FeOWM2FF8aE/p7LuAs0kLp93TFxBeBLfb7n9m+S - SxbnfkxhAkepYveIKV7fTvs8xgJ79569TNZWw70fsfhhcs+N0BsQB0uiCzNl4faCQLStvzFata3W - 4sIn5m1J/G3urC5BeozlQPcTDx0JCiPAcsA3HETRfab1E4nDrTVtaXh/PBcgqs5XKkJuIn5trCXK - k/rbQaCOLw/dPFlTGMti4rvFZBB1SG6fT8F1T2a0a75hIm9WnzZUqgxE/43ykacjs5jx43k= + nH2mVlWu+X43MIwR3gjLKuUZ71FijmrJ5VltpSmkmqVdh5XuUD6cNBYDXhs3FKyl1ZSuFtSLEs+L + OXEsEQ9j8HCMkUt7a0vb/LGmLIn/F68XHB4EVlGhtIY5K/mMaMOeQTxXzNcBXCrxbkhfQiMzZlh0 + GhoFZ6+nWEbtDfk8BKeM8n3RTwQM2f/3hiqaoGlyEDBcK4AI3YrcEjUZ15rHHXiF8hFrAgPxJ5yS + 2tkWkhMNZ7xEj8XBRjQVSOZDmt/tR8iqnT5ILndyZcWDtR1Hk0aSKIB/8haIzUPTasesw91mHc6A + ZisCJDuv7l8lpTUPxcz8YaLOgmPjmL2TsFuS87Eb1BZ6H9S/g5gwOtXByXn8dGMougPm3exYblVg + yrRtCSFko8KGiSqaJRjL3Q+kz0srDnuo+T+8E7duknnRmAZ9yL9WpGPam2T90+XunDRPh4ZwnHxd + eWBBgXzfdsTumz/5gvKYVd6Bk3jEyPVNtG3jwJuFSvzysyw07vvkRbJiZ0OpWymmhnMj3sGXlAUE + KBvnqEl04asXUJfxnAid5LpJSkxX7IKmrmrL3fFA/awKfKXP9qGfQHSj5gtksO/g7yjBvQs7jy45 + YCUuoLjnG4jazR0v9vWmQxregJF09j2zPAOzwtNN9CnnEVScRyMtM8P+9FMDMniUwpoUtcfHF0Cy + 8cnekdVS1+37zOQ/NEPNQz/zfdkRSi0+gWMWCYOxLvut/YJ7hUryFDRqVhJ2cJ2482p8itcnkxUY + JOGcInCxfErtbjst9pCIiiKdW5S2CO5G+cpw6q3AxuqJWnmT9TCqF+gFnUgWvP2jmf6o8BNC21E5 + gNKCZMaD7DF8cBz1YerqifOe7a8h5hYKl+MdK9nX1iaZpSVKuJX0K6+XNH786wyLvVWKrdyiqgVY + kxAdhfWfl86W0AkEuYJUMr+g/Kx6j0aSzvsm3gAyLlST51LbrNOxffc2kMmnV579qL18f/8w0Vuk + ekDuuXvwNqaZtChZs9ggha9DrD7JZXpon8TjaNwuU2N7mg7YFSfAFBTCLyhbLWLfPQARbMMVHUws + +ofjKGN+MwRm+W6pFf7o0C3RRCTkFtIeM88cvQCzPtQppLvidLosZs1vp6Swe8+j1mPg6JVjlt3r + 8+tRcskMDkqmkPQZzFzuHrV8ZYBZxlTbY4RvbIJ1zTxvuzSLZSPMc0MQ90yVqoVLuhq1S4AlgPOA + AmYOsRlSdVXX4fC8uBn+nOlTnShtJY0vpiY6EMkY+tahuJJOHuxNs1sffg8Ajx2d7tisd3xVm7aS + Ifgj+UoDHZgiC+YBazX90hLmRAaiFdtvE9+uu0lJoZpLRqb7JkKX/eGC+zs2CGN/Ejl8GRVbSzWy + 6tEfGgUXuvlszJygzNG08tULDeN8M/yehtdcLB8dD67qA+jFn4Lm3fblIEQjSW+QKGRHz5/Nd4BG + jsKQTPdPEwx1k+LWLmSsOpOXnxCmFb7xJ21UUM+5tstyO69I0mFCOiuXefs+kd0e/Z2j2Jm+hwyo + 17LOiSdFyKcXaXJy13kh1wgq+ZLzK6OdpqMzosPmPh53CRwoSwMApmjxImByodw7Cxc9aeVpEF9d + JDYeyup0Ew4YS4ltWY6uQhaqOHHvG3Wllp6JBp94vblDyQkAoC8/5NeN9TesRd5usfZXRoCJ3J5U + YO28ldBQdKBNMaoLLZzJov8F3e2mVd/BZAGXssTzU84ZdiT229Exx84dI+E/xia/SV2GEr56tmUS + vDYJjkctSozSStqZztM9PdN2IauApF/XD3nwmWM2xGb2xF5DPrzHq++25JT4Ax+wghx21aKemiV3 + icvkc8MOi+XiXEcH+uIP5OQ2qCQ0ziWNzIc1jW6bCyriNWvrZicgBGSgXj6oUYBz3axX8aP4Jcdg + MsApuVyZPdVQqJ1N5hwfP6py6i78pQHKhldpC+uCRbuLnzKrEBr1bg/AV8khGYdjsP0GKvhqGacW + pcGpZf7U+3VbhycjDRzvR7eKOffSJFYXWY+00gsG8HVvn+MAw9DUMDXG5z+E7vRJJOekv8VDxjXX + mhruhKzdYt/6zDQmUs2XJZ1B5dkCZADkTRliX1gwCj3OBafSYJDuSRwMt3CfBxjlX6ttW7ldpw1n + Pgp3wmIQjkIe64crr6s3N+s6QYLR56L64/adq2poXX6aLIunmxliGmDUTXfQ5zIyMAgLfYUmkOZu + LSCddigRE17+YFxUInr8GKanQ0It65vVXF9PKZTVPJmgwnus+IYBw6J27vYyorxonABhgdTnLTWs + aStku256M/ErckGMNXxG8Vs3AfI9lNuFaLSsOlniA7yQz7T9xPQD+7BlsHjMW0e0CJDbWVl3PUpf + xL8mcpUMBOCGbxf5BeLZcpwG9aN2OTfdVu8hRLOTbBCvikl0r06afJPECKqCvGcPvsLabn66k0Lo + EeF2aquFmqTG8x5r9atTN9mDGVE+ph50YUb4jRwHlns/7Ya6DMw4gXr8FOlT4Eg/+kftDnpaQvM7 + mI9ZGufQQohEXHeG0RpMTKCO+PQ/4mATlRScNUxIkfpO+HhPQcJm/POAoV6HkTqcMsRclC1CG0vf + EtkeFgdg8NpVLWtMHqBxONf7Ms/0i2i5aZ5He3MpLk2/bkZGzM5i5gnZRAopX0vuivVxaUKfIn7H + pAodO5oZ7X0YdX4ikgmM8qaWGiUicTOdKrN5Nk1IACEsaOLjppp8fWJHlrKXMj1iK1XMtmM= Index: client/1.0/neutral/pkgr_upload.eagle.harpy.asc ================================================================== --- client/1.0/neutral/pkgr_upload.eagle.harpy.asc +++ client/1.0/neutral/pkgr_upload.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJYVM2KAAoJEFAslq9JXcLZiNsQAJqKASG3YGn6w7BJRAonKw0y -jmxVC9wCeFwarD46I0E93XQmNNA6mkonRwT5CvDuUd4G+sH7i5fyM2BIVy0XFO26 -OutiouvupFBiQU2ObsZbGYKrsfN/EpA2/axWAldg4WYDH7dC+3pNd95yp61dDfBg -bJ6sidNHnUokLzJQ5PaFSYrgaf9/toEZZfOeCmF+4r0frIf4anERuwA4R+RmeeX4 -3ZZbnbb2GwNortF/DEy5DyRO/sz7eyBIBACdp/IacSvHy0UIFD8vIIA71DFrYiMg -pmf0JyFjwXFF98VLwmatpb3OvtuwEoN+0vaCZ/BRAY4FpTykDUuvKGAYn26k0lVU -xaKtt9jDBii1VnO3ZgoBjnAYu4dfd35F+EOi7P5uT6SsPS+GjfbZrQrimyDO++Cd -8rGGw3FEKFVaV40mrT1dlIdpo64fsQmLTwYc+SM/fiQbtbKZb9y+Rqo0UO9cuWCP -l+dZyw8vRRelRxpsZNYuImLk27HRrBr38JelANfFuO7Lm4WiC6DdzEiL3Sf9BtEN -xkapDjBz7VhUJ97m0KoC+ODemckv3tlZD+9deowRdYmdjGKtn8GqbNhNfoF0vUGN -g4zj+UvQ1NblfPLVBEF4WcZFiHqAuRTw/WDBraZXhwbMi51JjVWfOo2WK13tODl8 -KGic5Aea3InSHNGZU4rj -=MPMG +iQIcBAABCAAGBQJYVf3RAAoJEFAslq9JXcLZNRwP/19dwigW9orEHvIOxyWKnIJF +Ey3tpStxC7ZmV2A0vQ2wS8ID55mljlnswaybEJcFJl6zeyTgvJFY48WK7Xk+OXyN +U/5wiHmVbB76RRL6bl1O0GzRlr+0UjSNnNk2v68Bio+GzD1E2Q/IeAPFdQHfRSJ8 +KtB1/LI4SxFbmyvvrVOMuqFuQqR34xAaBrX1kWSlN5DE6QmN8IoU1VXH58ZiThAR +uApHhvnAN/kZK5wOBn9dZaJEB9zxW2+0kg5lkezcpWb1RUVXs2XDw/2MA31XNhl0 +krfNyGXJ392byfIBQmTUgDvmRbShqg6igDiapKzdROnR6N6Ru/fkQ2KmZVx1ybET +Awl6SYBsnp9N808GFQGqtijcv+tn4hZA3bqMGMx+au0ri6lkQqXWnZOp/vREYkqJ +0oB4iP35cVOVrdsY7DEwJmCzD2As9trUcwCETX8HYQw7XT5jKsGGkk8UrqPoiv4G +6t/dpoTqwqYnKOPUObmD0o/hU27CxnDCxMYs4T+IRVUu+xAMkZ2ibrW4pPw7cGiv +FARTEU+WDVz34CFGiFm67toamUiFnSiJmWrgHTMNfyhqm0Z98qkpObDRtj55i+w5 +5yu+l4FAGPHPJHQGqTGufAG76mWMLlJFMjHSsuYBdkV6SDPoDLQdiDzYV5t89j8n +ufVKNYd18OAITM1YVIjF +=A96A -----END PGP SIGNATURE-----