6
6
"net/url"
7
7
"os"
8
8
"path/filepath"
9
+ "strconv"
9
10
"strings"
10
11
11
12
"cloud.google.com/go/storage"
@@ -22,7 +23,7 @@ func (g *GCSGetter) ClientMode(u *url.URL) (ClientMode, error) {
22
23
ctx := g .Context ()
23
24
24
25
// Parse URL
25
- bucket , object , err := g .parseURL (u )
26
+ bucket , object , _ , err := g .parseURL (u )
26
27
if err != nil {
27
28
return 0 , err
28
29
}
@@ -59,7 +60,7 @@ func (g *GCSGetter) Get(dst string, u *url.URL) error {
59
60
ctx := g .Context ()
60
61
61
62
// Parse URL
62
- bucket , object , err := g .parseURL (u )
63
+ bucket , object , _ , err := g .parseURL (u )
63
64
if err != nil {
64
65
return err
65
66
}
@@ -105,7 +106,7 @@ func (g *GCSGetter) Get(dst string, u *url.URL) error {
105
106
}
106
107
objDst = filepath .Join (dst , objDst )
107
108
// Download the matching object.
108
- err = g .getObject (ctx , client , objDst , bucket , obj .Name )
109
+ err = g .getObject (ctx , client , objDst , bucket , obj .Name , "" )
109
110
if err != nil {
110
111
return err
111
112
}
@@ -118,7 +119,7 @@ func (g *GCSGetter) GetFile(dst string, u *url.URL) error {
118
119
ctx := g .Context ()
119
120
120
121
// Parse URL
121
- bucket , object , err := g .parseURL (u )
122
+ bucket , object , fragment , err := g .parseURL (u )
122
123
if err != nil {
123
124
return err
124
125
}
@@ -127,11 +128,21 @@ func (g *GCSGetter) GetFile(dst string, u *url.URL) error {
127
128
if err != nil {
128
129
return err
129
130
}
130
- return g .getObject (ctx , client , dst , bucket , object )
131
+ return g .getObject (ctx , client , dst , bucket , object , fragment )
131
132
}
132
133
133
- func (g * GCSGetter ) getObject (ctx context.Context , client * storage.Client , dst , bucket , object string ) error {
134
- rc , err := client .Bucket (bucket ).Object (object ).NewReader (ctx )
134
+ func (g * GCSGetter ) getObject (ctx context.Context , client * storage.Client , dst , bucket , object , fragment string ) error {
135
+ var rc * storage.Reader
136
+ var err error
137
+ if fragment != "" {
138
+ generation , err := strconv .ParseInt (fragment , 10 , 64 )
139
+ if err != nil {
140
+ return err
141
+ }
142
+ rc , err = client .Bucket (bucket ).Object (object ).Generation (generation ).NewReader (ctx )
143
+ } else {
144
+ rc , err = client .Bucket (bucket ).Object (object ).NewReader (ctx )
145
+ }
135
146
if err != nil {
136
147
return err
137
148
}
@@ -145,7 +156,7 @@ func (g *GCSGetter) getObject(ctx context.Context, client *storage.Client, dst,
145
156
return copyReader (dst , rc , 0666 , g .client .umask ())
146
157
}
147
158
148
- func (g * GCSGetter ) parseURL (u * url.URL ) (bucket , path string , err error ) {
159
+ func (g * GCSGetter ) parseURL (u * url.URL ) (bucket , path , fragment string , err error ) {
149
160
if strings .Contains (u .Host , "googleapis.com" ) {
150
161
hostParts := strings .Split (u .Host , "." )
151
162
if len (hostParts ) != 3 {
@@ -160,6 +171,7 @@ func (g *GCSGetter) parseURL(u *url.URL) (bucket, path string, err error) {
160
171
}
161
172
bucket = pathParts [3 ]
162
173
path = pathParts [4 ]
174
+ fragment = u .Fragment
163
175
}
164
176
return
165
177
}
0 commit comments