@@ -1045,25 +1045,42 @@ func (fs *localfs) listShareFolderRoot(ctx context.Context, home string, mdKeys
1045
1045
return finfos , nil
1046
1046
}
1047
1047
1048
- func (fs * localfs ) Download (ctx context.Context , ref * provider.Reference ) ( io.ReadCloser , error ) {
1048
+ func (fs * localfs ) Download (ctx context.Context , ref * provider.Reference , openReaderfunc func ( * provider. ResourceInfo ) bool ) ( * provider. ResourceInfo , io.ReadCloser , error ) {
1049
1049
fn , err := fs .resolve (ctx , ref )
1050
1050
if err != nil {
1051
- return nil , errors .Wrap (err , "localfs: error resolving ref" )
1051
+ return nil , nil , errors .Wrap (err , "localfs: error resolving ref" )
1052
1052
}
1053
1053
1054
1054
if fs .isShareFolder (ctx , fn ) {
1055
- return nil , errtypes .PermissionDenied ("localfs: cannot download under the virtual share folder" )
1055
+ return nil , nil , errtypes .PermissionDenied ("localfs: cannot download under the virtual share folder" )
1056
1056
}
1057
1057
1058
1058
fn = fs .wrap (ctx , fn )
1059
+ md , err := os .Stat (fn )
1060
+ if err != nil {
1061
+ if os .IsNotExist (err ) {
1062
+ return nil , nil , errtypes .NotFound (fn )
1063
+ }
1064
+ return nil , nil , errors .Wrap (err , "localfs: error stating " + fn )
1065
+ }
1066
+
1067
+ ri , err := fs .normalize (ctx , md , fn , []string {"size" , "mimetype" , "etag" })
1068
+ if err != nil {
1069
+ return nil , nil , err
1070
+ }
1071
+
1072
+ if ! openReaderfunc (ri ) {
1073
+ return ri , nil , nil
1074
+ }
1075
+
1059
1076
r , err := os .Open (fn )
1060
1077
if err != nil {
1061
1078
if os .IsNotExist (err ) {
1062
- return nil , errtypes .NotFound (fn )
1079
+ return nil , nil , errtypes .NotFound (fn )
1063
1080
}
1064
- return nil , errors .Wrap (err , "localfs: error reading " + fn )
1081
+ return nil , nil , errors .Wrap (err , "localfs: error reading " + fn )
1065
1082
}
1066
- return r , nil
1083
+ return ri , r , nil
1067
1084
}
1068
1085
1069
1086
func (fs * localfs ) archiveRevision (ctx context.Context , np string ) error {
@@ -1117,28 +1134,42 @@ func (fs *localfs) ListRevisions(ctx context.Context, ref *provider.Reference) (
1117
1134
return revisions , nil
1118
1135
}
1119
1136
1120
- func (fs * localfs ) DownloadRevision (ctx context.Context , ref * provider.Reference , revisionKey string ) ( io.ReadCloser , error ) {
1137
+ func (fs * localfs ) DownloadRevision (ctx context.Context , ref * provider.Reference , revisionKey string , openReaderfunc func ( * provider. ResourceInfo ) bool ) ( * provider. ResourceInfo , io.ReadCloser , error ) {
1121
1138
np , err := fs .resolve (ctx , ref )
1122
1139
if err != nil {
1123
- return nil , errors .Wrap (err , "localfs: error resolving ref" )
1140
+ return nil , nil , errors .Wrap (err , "localfs: error resolving ref" )
1124
1141
}
1125
1142
1126
1143
if fs .isShareFolder (ctx , np ) {
1127
- return nil , errtypes .PermissionDenied ("localfs: cannot download revisions under the virtual share folder" )
1144
+ return nil , nil , errtypes .PermissionDenied ("localfs: cannot download revisions under the virtual share folder" )
1128
1145
}
1129
1146
1130
1147
versionsDir := fs .wrapVersions (ctx , np )
1131
1148
vp := path .Join (versionsDir , revisionKey )
1132
1149
1133
- r , err := os .Open (vp )
1150
+ md , err := os .Stat (vp )
1134
1151
if err != nil {
1135
1152
if os .IsNotExist (err ) {
1136
- return nil , errtypes .NotFound (vp )
1153
+ return nil , nil , errtypes .NotFound (vp )
1137
1154
}
1138
- return nil , errors .Wrap (err , "localfs: error reading " + vp )
1155
+ return nil , nil , errors .Wrap (err , "localfs: error stating " + vp )
1156
+ }
1157
+
1158
+ ri , err := fs .normalize (ctx , md , vp , []string {"size" , "mimetype" , "etag" })
1159
+ if err != nil {
1160
+ return nil , nil , err
1161
+ }
1162
+
1163
+ if ! openReaderfunc (ri ) {
1164
+ return ri , nil , nil
1165
+ }
1166
+
1167
+ r , err := os .Open (vp )
1168
+ if err != nil {
1169
+ return nil , nil , errors .Wrap (err , "localfs: error reading " + vp )
1139
1170
}
1140
1171
1141
- return r , nil
1172
+ return ri , r , nil
1142
1173
}
1143
1174
1144
1175
func (fs * localfs ) RestoreRevision (ctx context.Context , ref * provider.Reference , revisionKey string ) error {
0 commit comments