Index: client/1.0/neutral/pkgr_upload.eagle ================================================================== --- client/1.0/neutral/pkgr_upload.eagle +++ client/1.0/neutral/pkgr_upload.eagle @@ -35,11 +35,35 @@ \[fileName1\] ... \[fileNameN\]" exit 1 } - proc getOuterDirectory { fileNames } { + # + # 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 + # script errors. + # + proc formatStringMapValue { value } { + if {[string length $value] == 0} then { + return \"\" + } + + set list [list $value] + + if {$value eq $list} then { + return $value + } else { + return $list + } + } + + # + # + # + proc getContainingDirectory { fileNames } { set result "" set resultParts [list] foreach fileName $fileNames { set directory [file dirname $fileName] @@ -47,11 +71,12 @@ if {[llength $resultParts] == 0 || \ [llength $directoryParts] < [llength $resultParts]} then { set result $directory set resultParts $directoryParts - } elseif {[llength $directoryParts] == [llength $resultParts]} then { + } elseif {[llength $directoryParts] == [llength $resultParts] && \ + $directory ne $result} then { set result [file dirname $directory] set resultParts [file split $result] } } @@ -59,15 +84,41 @@ } # # # - proc getScriptChunkForFileNames { fileNames } { + proc getScriptChunkForFileNames { fileNames maximumLevels } { + 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"] + } + set relativeFileNames [list] foreach fileName $fileNames { + set fileNameParts [lrange [file split $fileName] $fileNameIndex end] + + if {$maximumLevels > 0 && \ + [llength $fileNameParts] > $maximumLevels} then { + error [appendArgs \ + "depth for file name \"" $fileName \ + "\" exceeds maximum (" $maximumLevels )] + } + + set relativeFileName [eval file join $fileNameParts] + + if {[string length $relativeFileName] == 0 || \ + [file pathtype $relativeFileName] ne "relative"} then { + error [appendArgs \ + "bad file name \"" $relativeFileName "\", not relative"] + } + lappend relativeFileNames $relativeFileName } set result "" foreach relativeFileName $relativeFileNames { @@ -86,26 +137,30 @@ # # # proc createRepositoryScript { language version platform fileNames options } { return [string trim [string map [list \r\n \n \ - %language% $language %version% $version %platform% $platform \ - %fileNames% [getScriptChunkForFileNames $fileNames]] { + %language% [formatStringMapValue $language] \ + %version% [formatStringMapValue $version] \ + %platform% [formatStringMapValue $platform] \ + %backslash% \\ %ns% ::PackageDownloader %fileNames% \ + [getScriptChunkForFileNames \ + $fileNames 2]] { apply [list [list] { package require Eagle.Package.Downloader - ::PackageDownloader::resetCookieAndLoginSimple + %ns%::resetCookieAndLoginSimple set fileNames [list] %fileNames% - set options [list \ + set options [list %backslash% -persistent false -usePgp true -useAutoPath true] - ::PackageDownloader::downloadFiles %language% %version% %platform% $fileNames $options - ::PackageDownloader::logoutAndResetCookie + %ns%::downloadFiles %language% %version% %platform% $fileNames $options + %ns%::logoutAndResetCookie }] }]] } #