Skip to content
This repository has been archived by the owner on Mar 6, 2020. It is now read-only.

Upstream gvt restore patches: delete old deps and parallel downloads #547

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 71 additions & 21 deletions cmd/gb-vendor/restore.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,47 @@ package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"sync"
"sync/atomic"

"github.com/constabulary/gb"
"github.com/constabulary/gb/cmd"
"github.com/constabulary/gb/fileutils"
"github.com/constabulary/gb/vendor"
)

var (
rbInsecure bool // Allow the use of insecure protocols
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I cannot see where this is being set

rbConnections uint // Count of concurrent download connections
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or this

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because I'm terrible. Fixed.

)

func addRestoreFlags(fs *flag.FlagSet) {
fs.BoolVar(&insecure, "precaire", false, "allow the use of insecure protocols")
fs.BoolVar(&rbInsecure, "precaire", false, "allow the use of insecure protocols")
fs.UintVar(&rbConnections, "connections", 8, "count of parallel download connections")
}

var cmdRestore = &cmd.Command{
Name: "restore",
UsageLine: "restore [-precaire]",
Short: "restore dependencies from the manifest",
Long: `Restore vendor dependecies.
UsageLine: "restore [-precaire] [-connections N]",
Short: "restore dependencies from manifest",
Long: `restore fetches the dependencies listed in the manifest.

Flags:
-precaire
allow the use of insecure protocols.
-connections
count of parallel download connections.

`,
Run: func(ctx *gb.Context, args []string) error {
return restore(ctx)
switch len(args) {
case 0:
return restore(ctx)
default:
return fmt.Errorf("restore takes no arguments")
}
},
AddFlags: addRestoreFlags,
}
Expand All @@ -38,27 +54,61 @@ func restore(ctx *gb.Context) error {
return fmt.Errorf("could not load manifest: %v", err)
}

var errors uint32
var wg sync.WaitGroup
depC := make(chan vendor.Dependency)
for i := 0; i < int(rbConnections); i++ {
wg.Add(1)
go func() {
defer wg.Done()
for d := range depC {
if err := downloadDependency(ctx, d); err != nil {
fmt.Printf("%s: %v", d.Importpath, err)
atomic.AddUint32(&errors, 1)
}
}
}()
}

for _, dep := range m.Dependencies {
fmt.Printf("Getting %s\n", dep.Importpath)
repo, _, err := vendor.DeduceRemoteRepo(dep.Importpath, insecure)
if err != nil {
return fmt.Errorf("Could not process dependency: %s", err)
}
wc, err := repo.Checkout("", "", dep.Revision)
if err != nil {
return fmt.Errorf("Could not retrieve dependency: %s", err)
}
dst := filepath.Join(ctx.Projectdir(), "vendor", "src", dep.Importpath)
src := filepath.Join(wc.Dir(), dep.Path)
depC <- dep
}
close(depC)
wg.Wait()

if err := fileutils.Copypath(dst, src); err != nil {
return err
}
if errors > 0 {
return fmt.Errorf("failed to fetch %d dependencies", errors)
}

return nil
}

if err := wc.Destroy(); err != nil {
return err
func downloadDependency(ctx *gb.Context, dep vendor.Dependency) error {
fmt.Printf("Getting %s\n", dep.Importpath)
repo, _, err := vendor.DeduceRemoteRepo(dep.Importpath, rbInsecure)
if err != nil {
return fmt.Errorf("dependency could not be processed: %s", err)
}
wc, err := repo.Checkout("", "", dep.Revision)
if err != nil {
return fmt.Errorf("dependency could not be fetched: %s", err)
}
dst := filepath.Join(ctx.Projectdir(), "vendor", "src", dep.Importpath)
src := filepath.Join(wc.Dir(), dep.Path)

if _, err := os.Stat(dst); err == nil {
if err := fileutils.RemoveAll(dst); err != nil {
return fmt.Errorf("dependency could not be deleted: %v", err)
}
}

if err := fileutils.Copypath(dst, src); err != nil {
return err
}

if err := wc.Destroy(); err != nil {
return err
}

return nil
}