Skip to content

Commit ce1b693

Browse files
committed
Do not warn when GPSLatitude/GPSLongitude is nil
Also panic on warnings in all the tests, to discover cases like the above. See gohugoio/hugo#12669
1 parent 36ca9f3 commit ce1b693

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

‎helpers.go‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@ func (c vc) convertToTimestampString(ctx valueConverterContext, v any) any {
268268
}
269269

270270
func (vc) parseDegrees(s string) (float64, error) {
271+
if s == "" {
272+
return 0, nil
273+
}
271274
var deg, min, sec float64
272275
_, err := fmt.Sscanf(s, "%f,%f,%f", &deg, &min, &sec)
273276
if err != nil {
@@ -292,6 +295,8 @@ func (c vc) toDegrees(v any) (float64, error) {
292295
return v, nil
293296
case string:
294297
return c.parseDegrees(v)
298+
case []byte:
299+
return c.parseDegrees(string(v))
295300
default:
296301
return 0.0, fmt.Errorf("unsupported degree type %T", v)
297302
}

‎imagemeta_test.go‎

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package imagemeta_test
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"io"
78
"math"
@@ -35,7 +36,7 @@ func TestDecodeAllImageFormats(t *testing.T) {
3536
return nil
3637
}
3738

38-
err := imagemeta.Decode(imagemeta.Options{R: img, ImageFormat: imageFormat, HandleTag: handleTag})
39+
err := imagemeta.Decode(imagemeta.Options{R: img, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf})
3940
c.Assert(err, qt.IsNil)
4041

4142
allTags := tags.All()
@@ -145,7 +146,7 @@ func TestDecodeCorrupt(t *testing.T) {
145146
handleTag := func(ti imagemeta.TagInfo) error {
146147
return nil
147148
}
148-
err = imagemeta.Decode(imagemeta.Options{R: img, ImageFormat: format, HandleTag: handleTag})
149+
err = imagemeta.Decode(imagemeta.Options{R: img, ImageFormat: format, HandleTag: handleTag, Warnf: panicWarnf})
149150
c.Assert(imagemeta.IsInvalidFormat(err), qt.IsTrue, qt.Commentf("file: %s", file))
150151
img.Close()
151152
}
@@ -168,6 +169,7 @@ func TestDecodeCustomXMPHandler(t *testing.T) {
168169
return err
169170
},
170171
Sources: imagemeta.XMP,
172+
Warnf: panicWarnf,
171173
},
172174
)
173175

@@ -189,6 +191,7 @@ func TestDecodeCustomXMPHandlerShortRead(t *testing.T) {
189191
return nil
190192
},
191193
Sources: imagemeta.XMP,
194+
Warnf: panicWarnf,
192195
},
193196
)
194197

@@ -231,6 +234,7 @@ func TestDecodeShouldHandleTagEXIF(t *testing.T) {
231234
Sources: imagemeta.EXIF,
232235
HandleTag: handleTag,
233236
ShouldHandleTag: shouldHandle,
237+
Warnf: panicWarnf,
234238
},
235239
)
236240

@@ -269,6 +273,7 @@ func TestDecodeIPTCReference(t *testing.T) {
269273
ImageFormat: imagemeta.JPEG,
270274
HandleTag: handleTag,
271275
Sources: imagemeta.IPTC,
276+
Warnf: panicWarnf,
272277
},
273278
)
274279
c.Assert(err, qt.IsNil)
@@ -322,6 +327,7 @@ func TestDecodeEXIFOrientationOnly(t *testing.T) {
322327
ImageFormat: imagemeta.JPEG,
323328
HandleTag: handleTag,
324329
Sources: imagemeta.EXIF,
330+
Warnf: panicWarnf,
325331
},
326332
)
327333

@@ -351,6 +357,7 @@ func TestDecodeIPTCOrientationOnly(t *testing.T) {
351357
ImageFormat: imagemeta.JPEG,
352358
HandleTag: handleTag,
353359
Sources: imagemeta.IPTC,
360+
Warnf: panicWarnf,
354361
},
355362
)
356363

@@ -734,7 +741,21 @@ func extractTagsWithFilter(t testing.TB, filename string, sources imagemeta.Sour
734741

735742
imageFormat := extToFormat(filepath.Ext(filename))
736743

737-
err = imagemeta.Decode(imagemeta.Options{R: f, ImageFormat: imageFormat, ShouldHandleTag: shouldHandle, HandleTag: handleTag, Sources: sources})
744+
knownWarnings := []*regexp.Regexp{
745+
regexp.MustCompile("GPSLatitude.*0100"),
746+
}
747+
748+
warnf := func(format string, args ...any) {
749+
s := fmt.Sprintf(format, args...)
750+
for _, re := range knownWarnings {
751+
if re.MatchString(s) {
752+
return
753+
}
754+
}
755+
panic(errors.New(s))
756+
}
757+
758+
err = imagemeta.Decode(imagemeta.Options{R: f, ImageFormat: imageFormat, ShouldHandleTag: shouldHandle, HandleTag: handleTag, Warnf: warnf, Sources: sources})
738759
if err != nil {
739760
t.Fatal(fmt.Errorf("failed to decode %q: %w", filename, err))
740761
}
@@ -879,39 +900,39 @@ func BenchmarkDecode(b *testing.B) {
879900

880901
imageFormat := imagemeta.PNG
881902
runBenchmark(b, "png/exif", imagemeta.PNG, func(r io.ReadSeeker) error {
882-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetEXIF})
903+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetEXIF})
883904
return err
884905
})
885906

886907
runBenchmark(b, "png/all", imagemeta.PNG, func(r io.ReadSeeker) error {
887-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetAll})
908+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetAll})
888909
return err
889910
})
890911

891912
imageFormat = imagemeta.WebP
892913
runBenchmark(b, "webp/all", imageFormat, func(r io.ReadSeeker) error {
893-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetAll})
914+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetAll})
894915
return err
895916
})
896917

897918
runBenchmark(b, "webp/xmp", imageFormat, func(r io.ReadSeeker) error {
898-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: imagemeta.XMP})
919+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: imagemeta.XMP})
899920
return err
900921
})
901922

902923
runBenchmark(b, "webp/exif", imageFormat, func(r io.ReadSeeker) error {
903-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetEXIF})
924+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetEXIF})
904925
return err
905926
})
906927

907928
imageFormat = imagemeta.JPEG
908929
runBenchmark(b, "jpg/exif", imageFormat, func(r io.ReadSeeker) error {
909-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetEXIF})
930+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetEXIF})
910931
return err
911932
})
912933

913934
runBenchmark(b, "jpg/iptc", imageFormat, func(r io.ReadSeeker) error {
914-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetIPTC})
935+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetIPTC})
915936
return err
916937
})
917938

@@ -925,7 +946,7 @@ func BenchmarkDecode(b *testing.B) {
925946
}
926947
return nil
927948
}
928-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, ShouldHandleTag: shouldHandle, HandleTag: handleTag, Sources: sourceSetIPTC})
949+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, ShouldHandleTag: shouldHandle, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetIPTC})
929950
return err
930951
})
931952

@@ -939,31 +960,31 @@ func BenchmarkDecode(b *testing.B) {
939960
}
940961
return nil
941962
}
942-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, ShouldHandleTag: shouldHandle, HandleTag: handleTag, Sources: sourceSetIPTC})
963+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, ShouldHandleTag: shouldHandle, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetIPTC})
943964
return err
944965
})
945966

946967
runBenchmark(b, "jpg/xmp", imageFormat, func(r io.ReadSeeker) error {
947-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: imagemeta.XMP})
968+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: imagemeta.XMP})
948969
return err
949970
})
950971

951972
runBenchmark(b, "jpg/all", imageFormat, func(r io.ReadSeeker) error {
952-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetAll})
973+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetAll})
953974
return err
954975
})
955976

956977
imageFormat = imagemeta.TIFF
957978
runBenchmark(b, "tiff/exif", imageFormat, func(r io.ReadSeeker) error {
958-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetEXIF})
979+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetEXIF})
959980
return err
960981
})
961982
runBenchmark(b, "tiff/iptc", imageFormat, func(r io.ReadSeeker) error {
962-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetIPTC})
983+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetIPTC})
963984
return err
964985
})
965986
runBenchmark(b, "tiff/all", imageFormat, func(r io.ReadSeeker) error {
966-
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Sources: sourceSetAll})
987+
err := imagemeta.Decode(imagemeta.Options{R: r, ImageFormat: imageFormat, HandleTag: handleTag, Warnf: panicWarnf, Sources: sourceSetAll})
967988
return err
968989
})
969990
}
@@ -1020,3 +1041,7 @@ func BenchmarkDecodeCompareWithGoexif(b *testing.B) {
10201041
return err
10211042
})
10221043
}
1044+
1045+
func panicWarnf(format string, args ...interface{}) {
1046+
panic(fmt.Errorf(format, args...))
1047+
}

0 commit comments

Comments
 (0)