func tokenSource(bucket string) (oauth2.TokenSource, error) { proj, ok := bucketProject[bucket] if !ok { return nil, fmt.Errorf("unknown project for bucket %q", bucket) } return auth.ProjectTokenSource(proj, storage.ScopeReadWrite) }
func main() { flag.Usage = func() { fmt.Fprintf(os.Stderr, "Usage: upload [--public] [--file=...] <bucket/object>\n") flag.PrintDefaults() } flag.Parse() if flag.NArg() != 1 { flag.Usage() os.Exit(1) } args := strings.SplitN(flag.Arg(0), "/", 2) if len(args) != 2 { flag.Usage() os.Exit(1) } if strings.HasPrefix(*file, "go:") { buildGoTarget() } bucket, object := args[0], args[1] proj := *project if proj == "" { proj, _ = bucketProject[bucket] if proj == "" { log.Fatalf("bucket %q doesn't have an associated project in upload.go", bucket) } } ts, err := auth.ProjectTokenSource(proj, storage.ScopeReadWrite) if err != nil { log.Fatalf("Failed to get an OAuth2 token source: %v", err) } httpClient := oauth2.NewClient(oauth2.NoContext, ts) ctx := cloud.NewContext(proj, httpClient) if alreadyUploaded(ctx, bucket, object) { if *verbose { log.Printf("Already uploaded.") } return } w := storage.NewWriter(ctx, bucket, object) // If you don't give the owners access, the web UI seems to // have a bug and doesn't have access to see that it's public, so // won't render the "Shared Publicly" link. So we do that, even // though it's dumb and unnecessary otherwise: w.ACL = append(w.ACL, storage.ACLRule{Entity: storage.ACLEntity("project-owners-" + proj), Role: storage.RoleOwner}) if *public { w.ACL = append(w.ACL, storage.ACLRule{Entity: storage.AllUsers, Role: storage.RoleReader}) if !*cacheable { w.CacheControl = "no-cache" } } var content io.Reader if *file == "-" { content = os.Stdin } else { content, err = os.Open(*file) if err != nil { log.Fatal(err) } } const maxSlurp = 1 << 20 var buf bytes.Buffer n, err := io.CopyN(&buf, content, maxSlurp) if err != nil && err != io.EOF { log.Fatalf("Error reading from stdin: %v, %v", n, err) } w.ContentType = http.DetectContentType(buf.Bytes()) _, err = io.Copy(w, io.MultiReader(&buf, content)) if cerr := w.Close(); cerr != nil && err == nil { err = cerr } if err != nil { log.Fatalf("Write error: %v", err) } if *verbose { log.Printf("Wrote %v", object) } os.Exit(0) }