Beispiel #1
0
    def start(self):
        self.checkWorkerHasCommand("uploadDirectory")
        self.checkWorkerHasCommand("uploadFile")
        self.checkWorkerHasCommand("stat")
        self.stdio_log = self.addLog("stdio")

        masterdest = os.path.expanduser(self.masterdest)
        sources = self.workersrcs if isinstance(self.workersrcs,
                                                list) else [self.workersrcs]

        if self.keepstamp and self.workerVersionIsOlderThan(
                "uploadFile", "2.13"):
            m = (("This worker ({}) does not support preserving timestamps. "
                  "Please upgrade the worker.").format(self.build.workername))
            raise WorkerTooOldError(m)

        if not sources:
            return self.finished(SKIPPED)

        @defer.inlineCallbacks
        def globSources(sources):
            results = yield defer.gatherResults([
                self.runGlob(os.path.join(self.workdir, source),
                             abandonOnFailure=False) for source in sources
            ])
            results = [
                self.workerPathToMasterPath(p) for p in flatten(results)
            ]
            return results

        @defer.inlineCallbacks
        def uploadSources(sources):
            if not sources:
                return SKIPPED
            else:
                for source in sources:
                    result = yield self.startUpload(source, masterdest)
                    if result == FAILURE:
                        return FAILURE
                return SUCCESS

        def logUpload(sources):
            log.msg("MultipleFileUpload started, from worker %r to master %r" %
                    (sources, masterdest))
            nsrcs = len(sources)
            self.descriptionDone = 'uploading {} {}'.format(
                nsrcs, 'file' if nsrcs == 1 else 'files')
            return sources

        if self.glob:
            s = globSources(sources)
        else:
            s = defer.succeed(sources)

        s.addCallback(logUpload)
        d = s.addCallback(uploadSources)

        @d.addCallback
        def allUploadsDone(result):
            d = defer.maybeDeferred(self.allUploadsDone, result, sources,
                                    masterdest)
            d.addCallback(lambda _: result)
            return d

        d.addCallback(self.finished).addErrback(self.failed)