Index: client/1.0/neutral/pkgr_upload.eagle ================================================================== --- client/1.0/neutral/pkgr_upload.eagle +++ client/1.0/neutral/pkgr_upload.eagle @@ -107,45 +107,91 @@ return $list } } # - # NOTE: This procedure processes a list of qualified file names and tries - # to determine their common containing directory, if any. The + # NOTE: This procedure counts the common path components for two paths. The + # count is returned, zero if there are no common path components. The + # path1 and path2 arguments are the paths to compare. This procedure + # may not raise script errors. + # + proc countCommonPathParts { path1 path2 } { + set parts1 [file split $path1] + set length1 [llength $parts1] + + set parts2 [file split $path2] + set length2 [llength $parts2] + + set length [expr {min($length1, $length2)}] + + for {set index 0} {$index < $length} {incr index} { + set part1 [lindex $parts1 $index] + set part2 [lindex $parts2 $index] + + if {$part1 ne $part2} then { + return $index + } + } + + return $length + } + + # + # NOTE: This procedure processes a list of (fully?) 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] - - foreach fileName $fileNames { - set directory [file dirname $fileName] - set directoryParts [file split $directory] - - if {[llength $resultParts] == 0 || \ - [llength $directoryParts] < [llength $resultParts]} then { - set result $directory - set resultParts $directoryParts - } elseif {[llength $directoryParts] == [llength $resultParts] && \ - $directory ne $result} then { - set result [file dirname $directory] - set resultParts [file split $result] - } - } - - return $result + # process. This procedure may not raise script errors. If there is + # no common containing directory, an empty string is returned. + # + proc getCommonContainingDirectory { fileNames } { + set length [llength $fileNames] + + if {$length == 0} then { + return "" + } + + set oldFileName [lindex $fileNames 0] + + if {$length == 1} then { + return [file dirname $oldFileName] + } + + set minimumCount 0 + + for {set index 1} {$index < $length} {incr index} { + set newFileName [lindex $fileNames $index] + set newCount [countCommonPathParts $oldFileName $newFileName] + + if {$newCount == 0} then { + return "" + } + + if {$minimumCount == 0 || $newCount < $minimumCount} then { + set oldFileName $newFileName + set minimumCount $newCount + } + } + + if {$minimumCount == 0} then { + return "" + } + + incr minimumCount -1 + + return [eval file join [lrange [file split $oldFileName] 0 $minimumCount]] } # # 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. + # process. The maximumLevels argument is the maximum path depth that + # is allowed for all file names. This procedure may raise script + # errors. # - proc getRelativeFileNames { fileNames } { - set directory [getContainingDirectory $fileNames] + proc getRelativeFileNames { fileNames maximumLevels } { + set directory [getCommonContainingDirectory $fileNames] set directoryParts [file split $directory] set fileNameIndex [expr {[llength $directoryParts] - 1}] if {$fileNameIndex < 0} then { error [appendArgs \ @@ -183,16 +229,16 @@ # # 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. + # depth that is allowed for all file names. This procedure may raise + # script errors. # proc getScriptChunkForFileNames { fileNames maximumLevels } { set result "" - set relativeFileNames [getRelativeFileNames $fileNames] + set relativeFileNames [getRelativeFileNames $fileNames $maximumLevels] foreach relativeFileName $relativeFileNames { if {[string length $result] > 0} then { append result \n } @@ -218,21 +264,20 @@ # 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% \ - [getScriptChunkForFileNames \ - $fileNames 2]] { + [getScriptChunkForFileNames $fileNames 2]] { apply [list [list] { package require Eagle.Package.Downloader %ns%::resetCookieAndLoginSimple @@ -252,10 +297,11 @@ # # 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] @@ -298,10 +344,11 @@ # 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 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 -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 +iQIcBAABCAAGBQJYVvfzAAoJEFAslq9JXcLZ3KYP/1ziIWg74l8Xat7PICttqWra +2eFS6x2/fJUK0sqol3pBDxNgn6PfQEFNeJOtP/FlLe7NCG2oOCcIZGuYzGQmZv9u +UAQQiV6J6Tzn4ZQXETVcKFFkIZ8VhemK3BBuw4omSPogHCHTX7LiVAmsYjs6krhM +q5UOuswqOidWBWvbaUrkq3SWrtYPj+M4oiNlpA3AjEcn/UePiag60jQi2ZJF+GaN +cMa5iTHYBWPlnqjlXPOIEOJ4AUHULo9LwJtjkXPIqYNjuVyTJXuO5sRy8yTWIv8C +FScTt6PS/ds5Yj6LMNsRDII9/broj04kb7eZt3LIruIxT+Cni0HXqfwydlHBBgng +FgniTiWR6hM8TSOPH18jxjuZ8Cb3ML6Tb/OUul1QWZOrLz/RYszVRgbaC6Y3Z8Ga +lVYdVXo247UvRwYMkgbSeVKEqhwv/prIh44Ii33cYqMGGRReV7/vAfxB8WXWTQBZ +QQ96Z93LsP3lujXwecQQPfb+uBzcPvlFrwmWHmMjsQ/q09BIPbc+gCV0UmfMcax6 +Lb9S/QNFWQ4CbjptpdiD/1JfSAwqLOuThQdCUGaQq+LPs297vMpmt2frL9gC7d3h +/DmEGMMylse2852qFdHYCaWw4Yr8Sgn+lZ9eXuaqY0FCGjRTgTz5CR5f2JylY+mH +Mhm7F3uErgDn97Jp/qht +=QWS0 -----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 - 3783ac1d-7987-47b1-8d9a-de7990ae10d3 + 57abf613-80dc-4e9a-b1bd-c0a6dac4e16f SHA512 Script - 2016-12-18T03:08:32.8886718Z + 2016-12-18T20:55:40.0390625Z -1.00:00:00 0x9559f6017247e3e2 - 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 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 -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 +iQIcBAABCAAGBQJYVvf0AAoJEFAslq9JXcLZ2B4QAIOriM66ke/AwFa96RpEYs8g +YdiGg1k5ZpCRc8uVtPYcJnjtc1g325tf73jw7s5I/SThsmBSEFmIWKJwh0HVR6b2 +m2xL0hS+D1ba5+sa6aBUrmn7jbw4i1z9+Rb4hqXacBhIyMaT5qRSN9WQl+mblBML +cVU9NKYc8ifAmayqiOOvV3vcf3n2V+jiyjEyCw8NVT441JuPIm9jPkTP0oDdy/y6 +l5a2TEvAIq1o9ovEXBkc5NJP8hC+haKdSAZId6q01/aY3L3ObRYCrHs/2iTygWM0 +QmtvP9VPdjfQ6A7u4b1P5EBzQfFvvkOnbi9R2gb/xA06ZqC/heDtxCfl9xL1T8GH +4vl0+cENxY61G9avc5v0AoEQY+XFvhJpU5vL2PSpw0ZMFmQE4G50SuooD/pA+t8X +ak+YFoLw2tVnGyDgO+CilF6cP/h1mY+dWvw6hx8aLQeDlNAWRHNco0wzaxDRhJJn +KNvtwQqO2xGEnDbHkkA3ka0nyUYfyOnJnD+LGQKgKqUm+yMywChlK9NOtbdNrLce +i8evvNEudOrQY1TLHNkGpJ4fP6LRQSU33MplPMYnYTyeqiJFpNsHjWWhk4cWxDcx +oprP4sumZuZEHGXLXKXP2/V8/XDPQPuYCDARbkvO2YS84ZG1FadkZ6MkyDiIunSn ++hD0AK7acs6BQTWdNQFf +=Q5nF -----END PGP SIGNATURE-----