Index: client/1.0/neutral/pkgr_upload.eagle ================================================================== --- client/1.0/neutral/pkgr_upload.eagle +++ client/1.0/neutral/pkgr_upload.eagle @@ -34,10 +34,136 @@ [file tail [info script]] \[apiKey\] \[name\] \[version\] \[language\]\ \[fileName1\] ... \[fileNameN\]" exit 1 } + + # + # 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] + 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 + } + + # + # + # + 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 { + if {[string length $result] > 0} then { + append result \n + } + + append result { lappend fileNames [file join } + append result [file split $relativeFileName] + append result \] + } + + return $result + } + + # + # + # + proc createRepositoryScript { language version platform fileNames options } { + 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]] { +apply [list [list] { + package require Eagle.Package.Downloader + + %ns%::resetCookieAndLoginSimple + + set fileNames [list] + +%fileNames% + + set options [list %backslash% + -persistent false -usePgp true -useAutoPath true] + + %ns%::downloadFiles %language% %version% %platform% $fileNames $options + %ns%::logoutAndResetCookie +}] + }]] + } # # 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