@@ -18,20 +18,14 @@ package legacy
1818import (
1919 "bytes"
2020 "encoding/json"
21- "fmt"
22- "net/http"
23- "net/url"
2421
25- "github.com/google/go-containerregistry/pkg/authn"
26- "github.com/google/go-containerregistry/pkg/logs"
2722 "github.com/google/go-containerregistry/pkg/name"
2823 "github.com/google/go-containerregistry/pkg/v1/remote"
29- "github.com/google/go-containerregistry/pkg/v1/remote/transport"
3024)
3125
3226// CopySchema1 allows `[g]crane cp` to work with old images without adding
3327// full support for schema 1 images to this package.
34- func CopySchema1 (desc * remote.Descriptor , srcRef , dstRef name.Reference , srcAuth , dstAuth authn. Authenticator ) error {
28+ func CopySchema1 (desc * remote.Descriptor , srcRef , dstRef name.Reference , opts ... remote. Option ) error {
3529 m := schema1 {}
3630 if err := json .NewDecoder (bytes .NewReader (desc .Manifest )).Decode (& m ); err != nil {
3731 return err
@@ -41,56 +35,17 @@ func CopySchema1(desc *remote.Descriptor, srcRef, dstRef name.Reference, srcAuth
4135 src := srcRef .Context ().Digest (layer .BlobSum )
4236 dst := dstRef .Context ().Digest (layer .BlobSum )
4337
44- blob , err := remote .Layer (src , remote . WithAuth ( srcAuth ) )
38+ blob , err := remote .Layer (src , opts ... )
4539 if err != nil {
4640 return err
4741 }
4842
49- if err := remote .WriteLayer (dst .Context (), blob , remote . WithAuth ( dstAuth ) ); err != nil {
43+ if err := remote .WriteLayer (dst .Context (), blob , opts ... ); err != nil {
5044 return err
5145 }
5246 }
5347
54- return putManifest (desc , dstRef , dstAuth )
55- }
56-
57- // TODO: perhaps expose this in remote?
58- func putManifest (desc * remote.Descriptor , dstRef name.Reference , dstAuth authn.Authenticator ) error {
59- reg := dstRef .Context ().Registry
60- scopes := []string {dstRef .Scope (transport .PushScope )}
61-
62- // TODO(jonjohnsonjr): Use NewWithContext.
63- tr , err := transport .New (reg , dstAuth , http .DefaultTransport , scopes )
64- if err != nil {
65- return err
66- }
67- client := & http.Client {Transport : tr }
68-
69- u := url.URL {
70- Scheme : dstRef .Context ().Registry .Scheme (),
71- Host : dstRef .Context ().RegistryStr (),
72- Path : fmt .Sprintf ("/v2/%s/manifests/%s" , dstRef .Context ().RepositoryStr (), dstRef .Identifier ()),
73- }
74-
75- req , err := http .NewRequest (http .MethodPut , u .String (), bytes .NewBuffer (desc .Manifest ))
76- if err != nil {
77- return err
78- }
79- req .Header .Set ("Content-Type" , string (desc .MediaType ))
80-
81- resp , err := client .Do (req )
82- if err != nil {
83- return err
84- }
85- defer resp .Body .Close ()
86-
87- if err := transport .CheckError (resp , http .StatusOK , http .StatusCreated , http .StatusAccepted ); err != nil {
88- return err
89- }
90-
91- // The image was successfully pushed!
92- logs .Progress .Printf ("%v: digest: %v size: %d" , dstRef , desc .Digest , len (desc .Manifest ))
93- return nil
48+ return remote .Put (dstRef , desc , opts ... )
9449}
9550
9651type fslayer struct {
0 commit comments