code: func (ut *UploadTracker) uploadFiles(files []*Item) error {
  	// Handle the large individually-uploaded files.
  	for _, item := range files {
  		d, err := ut.hashFile(item.Path)
  		if err != nil {
  			return err
  		}
  		item.Digest = d
  		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
  			}
  
  			// We are about to upload item. If we fail, the entire isolate operation will fail.
  			// If we succeed, then item will be on the server by the time that the isolate operation
  			// completes. So it is safe for subsequent checks to assume that the item exists.
  			ut.checker.PresumeExists(item)
  
  			log.Printf("QUEUED %q for upload", item.RelPath)
  			ut.uploader.UploadFile(item, ps, func() {
  				log.Printf("UPLOADED %q", item.RelPath)
  			})
  		})
  	}
  	return nil
  }
docs: // uploadFiles uploads each file and adds it to files.