| Index: client/cmd/isolate/upload_tracker.go
|
| diff --git a/client/cmd/isolate/upload_tracker.go b/client/cmd/isolate/upload_tracker.go
|
| index 75f37b8cecc572ae216329874e1b0d7ada2972ed..292e0cdd13a11ada0048fb1f378fbb540723e72f 100644
|
| --- a/client/cmd/isolate/upload_tracker.go
|
| +++ b/client/cmd/isolate/upload_tracker.go
|
| @@ -15,9 +15,11 @@
|
| package main
|
|
|
| import (
|
| + "encoding/json"
|
| "fmt"
|
| "log"
|
| "os"
|
| + "path/filepath"
|
|
|
| humanize "github.com/dustin/go-humanize"
|
| "github.com/luci/luci-go/common/isolated"
|
| @@ -28,15 +30,16 @@ import (
|
| type UploadTracker struct {
|
| checker *Checker
|
| uploader *Uploader
|
| - files map[string]isolated.File
|
| + isol *isolated.Isolated
|
| }
|
|
|
| -// NewUploadTracker constructs an UploadTracker.
|
| -func NewUploadTracker(checker *Checker, uploader *Uploader) *UploadTracker {
|
| +// NewUploadTracker constructs an UploadTracker. It tracks uploaded files in isol.Files.
|
| +func NewUploadTracker(checker *Checker, uploader *Uploader, isol *isolated.Isolated) *UploadTracker {
|
| + isol.Files = make(map[string]isolated.File)
|
| return &UploadTracker{
|
| checker: checker,
|
| uploader: uploader,
|
| - files: make(map[string]isolated.File),
|
| + isol: isol,
|
| }
|
| }
|
|
|
| @@ -60,7 +63,7 @@ func (ut *UploadTracker) UploadDeps(parts partitionedDeps) error {
|
| // Note: files may not have completed uploading until the tracker's Checker and
|
| // Uploader have been closed.
|
| func (ut *UploadTracker) Files() map[string]isolated.File {
|
| - return ut.files
|
| + return ut.isol.Files
|
| }
|
|
|
| // populateSymlinks adds an isolated.File to files for each provided symlink
|
| @@ -70,7 +73,7 @@ func (ut *UploadTracker) populateSymlinks(symlinks []*Item) error {
|
| if err != nil {
|
| return fmt.Errorf("unable to resolve symlink for %q: %v", item.Path, err)
|
| }
|
| - ut.files[item.RelPath] = isolated.SymLink(l)
|
| + ut.isol.Files[item.RelPath] = isolated.SymLink(l)
|
| }
|
| return nil
|
| }
|
| @@ -97,7 +100,7 @@ func (ut *UploadTracker) tarAndUploadFiles(smallFiles []*Item) error {
|
| Mode: 0644, // Read
|
| Digest: digest,
|
| }
|
| - ut.files[item.RelPath] = isolated.TarFile(item.Digest, int(item.Mode), item.Size)
|
| + ut.isol.Files[item.RelPath] = isolated.TarFile(item.Digest, int(item.Mode), item.Size)
|
|
|
| ut.checker.AddItem(item, false, func(item *Item, ps *isolatedclient.PushState) {
|
| if ps == nil {
|
| @@ -121,7 +124,7 @@ func (ut *UploadTracker) uploadFiles(files []*Item) error {
|
| return err
|
| }
|
| item.Digest = d
|
| - ut.files[item.RelPath] = isolated.BasicFile(item.Digest, int(item.Mode), item.Size)
|
| + ut.isol.Files[item.RelPath] = isolated.BasicFile(item.Digest, int(item.Mode), item.Size)
|
| ut.checker.AddItem(item, false, func(item *Item, ps *isolatedclient.PushState) {
|
| if ps == nil {
|
| return
|
| @@ -134,3 +137,33 @@ func (ut *UploadTracker) uploadFiles(files []*Item) error {
|
| }
|
| return nil
|
| }
|
| +
|
| +// Finalize creates and uploads the isolate JSON at the isolatePath.
|
| +// It returns the corresponding Item and its contents.
|
| +// Finalize should only be called after UploadDeps.
|
| +func (ut *UploadTracker) Finalize(isolatedPath string) (*Item, []byte, error) {
|
| + // Marshal the isolated file into JSON, and create an Item to describe it.
|
| + isolJSON, err := json.Marshal(ut.isol)
|
| + if err != nil {
|
| + return nil, []byte{}, err
|
| + }
|
| + isolItem := &Item{
|
| + Path: isolatedPath,
|
| + RelPath: filepath.Base(isolatedPath),
|
| + Digest: isolated.HashBytes(isolJSON),
|
| + Size: int64(len(isolJSON)),
|
| + }
|
| +
|
| + // Check and upload isolate JSON.
|
| + ut.checker.AddItem(isolItem, true, func(item *Item, ps *isolatedclient.PushState) {
|
| + if ps == nil {
|
| + return
|
| + }
|
| + log.Printf("QUEUED %q for upload", item.RelPath)
|
| + ut.uploader.UploadBytes(item.RelPath, isolJSON, ps, func() {
|
| + log.Printf("UPLOADED %q", item.RelPath)
|
| + })
|
| + })
|
| +
|
| + return isolItem, isolJSON, nil
|
| +}
|
|
|