Stream template upload (#6035)

Resolves #5718
This commit is contained in:
Ammar Bandukwala
2023-02-04 20:07:09 +00:00
committed by GitHub
parent 77fd34be94
commit a422cc00e8
12 changed files with 69 additions and 46 deletions
+2 -1
View File
@@ -1,6 +1,7 @@
package cli
import (
"bytes"
"fmt"
"os"
"path/filepath"
@@ -70,7 +71,7 @@ func templateInit() *cobra.Command {
if err != nil {
return err
}
err = provisionersdk.Untar(directory, archive)
err = provisionersdk.Untar(directory, bytes.NewReader(archive))
if err != nil {
return err
}
+21 -8
View File
@@ -1,6 +1,7 @@
package cli
import (
"bufio"
"fmt"
"io"
"os"
@@ -34,14 +35,17 @@ func (pf *templateUploadFlags) stdin() bool {
func (pf *templateUploadFlags) upload(cmd *cobra.Command, client *codersdk.Client) (*codersdk.UploadResponse, error) {
var (
content []byte
err error
content io.Reader
pipeErrCh = make(chan error, 1)
)
if pf.stdin() {
content, err = io.ReadAll(cmd.InOrStdin())
content = cmd.InOrStdin()
// No piping if reading from stdin.
pipeErrCh <- nil
close(pipeErrCh)
} else {
prettyDir := prettyDirectoryPath(pf.directory)
_, err = cliui.Prompt(cmd, cliui.PromptOptions{
_, err := cliui.Prompt(cmd, cliui.PromptOptions{
Text: fmt.Sprintf("Upload %q?", prettyDir),
IsConfirm: true,
Default: cliui.ConfirmYes,
@@ -50,10 +54,16 @@ func (pf *templateUploadFlags) upload(cmd *cobra.Command, client *codersdk.Clien
return nil, err
}
content, err = provisionersdk.Tar(pf.directory, provisionersdk.TemplateArchiveLimit)
}
if err != nil {
return nil, xerrors.Errorf("read tar: %w", err)
pipeReader, pipeWriter := io.Pipe()
go func() {
defer pipeWriter.Close()
defer close(pipeErrCh)
bufWr := bufio.NewWriter(pipeWriter)
defer bufWr.Flush()
pipeErrCh <- provisionersdk.Tar(bufWr, pf.directory, provisionersdk.TemplateArchiveLimit)
}()
defer pipeReader.Close()
content = pipeReader
}
spin := spinner.New(spinner.CharSets[5], 100*time.Millisecond)
@@ -66,6 +76,9 @@ func (pf *templateUploadFlags) upload(cmd *cobra.Command, client *codersdk.Clien
if err != nil {
return nil, xerrors.Errorf("upload: %w", err)
}
if err = <-pipeErrCh; err != nil {
return nil, xerrors.Errorf("pipe: %w", err)
}
return &resp, nil
}