Merge "goexif: merge upstream and document process."

This commit is contained in:
Mathieu Lonjaret 2013-10-22 21:05:27 +00:00 committed by Gerrit Code Review
commit c16ada0121
5 changed files with 137 additions and 8 deletions

View File

@ -0,0 +1,82 @@
Changing code under third_party/github.com/camlistore/goexif
============================================================
These instructions assume you have a github.com account.
Sync github.com/rwcarlsen/goexif -> github.com/camlistore/goexif
----------------------------------------------------------------
1. Issue a pull request at https://github.com/camlistore/goexif/pulls, set
the base fork to camlistore/goexif go1 branch, and the head fork as
rwcarlsen/goexif go1 branch. Follow the normal github workflow until
someone on the camlistore project merges in the changes.
Sync github.com/camlistore/goexif -> camlistore.org/third_party/github.com/camlistore/goexif
--------------------------------------------------------------------------------------------
1. Once someone on the camlistore team merges in the latest from upstream,
checkout a local copy:
$ git clone https://github.com/camlistore/goexif
$ cd goexif
2. Make a patch to apply to the camlistore.org copy. You'll need to know the
git rev of github.com/camlistore/goexif that was last merged to
camlistore.org/third_party, for this example we'll use 030a4566:
# Create individual patches that have been applied upstream.
$ git format-patch -o /tmp/patches 030a4566
$ cd /path/to/camlistore.org/third_party/github.com/camlistore/goexif
# Create new branch to temporarily apply each upstream change.
$ git checkout -b patches_individual
# Apply patches.
$ git am --directory=third_party/github.com/camlistore/goexif /tmp/patches/*
# If something fails to apply try:
$ git apply <PATCH THAT FAILED> --reject
$ edit edit edit
$ git add <ANY FIXED FILES>
$ git am --resolved
# If it is a patch camlistore already had, because we created it and
# pushed it upstream, you can skip it with:
$ git am --skip
# Now create a new branch to squash all the changes into one. Keeping a
# record of upstream commits in the default commit message of a single
# commit.
$ git checkout -b patches_squashed master
$ git merge --squash patches_individual
# Verify no new files have been added that require import path updating:
$ cd /path/to/camlistore.org/third_party/
$ ./rewrite-imports.sh -l
# If any rewrites are required, run:
$ ./rewrite-imports.sh -w
# Now create a commit that will be sent for review.
$ git commit -v
# Enter your commit message on the first line per usual.
# You should see summaries of all the changes merged in the commit
# message. Leave these, they will be useful next sync as we'll know what
# commits were sync'd. Send the change for review.
$ ./misc/review
Sync camlistore.org/third_party/github.com/camlistore/goexif -> github.com/camlistore/goexif
----------------------------------------------------------------------------------------------
1. TODO(wathiede): this should follow a similar process as 'Sync
github.com/camlistore/goexif ->
camlistore.org/third_party/github.com/camlistore/goexif' Basically use
format-patch to generate a patch for each change we've made in
camlistore.org's repo and apply to a fork of github.com/camlistore/goexif.
Maybe skip the 'merge --squash' step, and keep each change in the log of
github.com/camlistore/goexif.
Sync github.com/camlistore/goexif -> github.com/rwcarlsen/goexif
--------------------------------------------------------------------
1. This should follow the standard github pull-request workflow. Issue a
pull request at https://github.com/request/goexif/pulls, set the base fork
to rwcarlsen/goexif go1 branch, and the head fork as camlistore/goexif go1
branch.
2. Address any feedback during review and rwcarlsen will merge changes to
github.com/rwcarlsen/goexif as appropriate.

View File

@ -57,3 +57,4 @@ func main() {
```
<!--golang-->
[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/5e166f74cdb82b999ccd84e3c4dc4348 "githalytics.com")](http://githalytics.com/rwcarlsen/goexif)

View File

@ -58,15 +58,61 @@ type Exif struct {
// Decode parses EXIF-encoded data from r and returns a queryable Exif object.
func Decode(r io.Reader) (*Exif, error) {
sec, err := newAppSec(0xE1, r)
// EXIF data in JPEG is stored in the APP1 marker. EXIF data uses the TIFF
// format to store data.
// If we're parsing a TIFF image, we don't need to strip away any data.
// If we're parsing a JPEG image, we need to strip away the JPEG APP1
// marker and also the EXIF header.
header := make([]byte, 4)
n, err := r.Read(header)
if n < len(header) {
return nil, errors.New("exif: short read on header")
}
if err != nil {
return nil, err
}
er, err := sec.exifReader()
if err != nil {
return nil, err
var isTiff bool
switch string(header) {
case "II*\x00":
// TIFF - Little endian (Intel)
isTiff = true
case "MM\x00*":
// TIFF - Big endian (Motorola)
isTiff = true
default:
// Not TIFF, assume JPEG
}
tif, err := tiff.Decode(er)
// Put the header bytes back into the reader.
r = io.MultiReader(bytes.NewReader(header), r)
var (
er *bytes.Reader
tif *tiff.Tiff
)
if isTiff {
// Functions below need the IFDs from the TIFF data to be stored in a
// *bytes.Reader. We use TeeReader to get a copy of the bytes as a
// side-effect of tiff.Decode() doing its work.
b := &bytes.Buffer{}
tr := io.TeeReader(r, b)
tif, err = tiff.Decode(tr)
er = bytes.NewReader(b.Bytes())
} else {
// Strip away JPEG APP1 header.
sec, err := newAppSec(0xE1, r)
if err != nil {
return nil, err
}
// Strip away EXIF header.
er, err = sec.exifReader()
if err != nil {
return nil, err
}
tif, err = tiff.Decode(er)
}
if err != nil {
return nil, errors.New("exif: decode failed: " + err.Error())
}

View File

@ -19,7 +19,7 @@ func TestDecode(t *testing.T) {
t.Fatal(err)
}
if x == nil {
t.Fatal("No error and yet %v was not decoded\n", name)
t.Fatalf("No error and yet %v was not decoded\n", name)
}
val, err := x.Get("Model")

View File

@ -186,16 +186,16 @@ func (t *Tag) convertVals() {
t.ratVals[i] = []int64{int64(n), int64(d)}
}
case 11: // float32
t.floatVals = make([]float64, int(t.Ncomp))
for i := 0; i < int(t.Ncomp); i++ {
t.floatVals = make([]float64, int(t.Ncomp))
var v float32
err := binary.Read(r, t.order, &v)
panicOn(err)
t.floatVals[i] = float64(v)
}
case 12: // float64 (double)
t.floatVals = make([]float64, int(t.Ncomp))
for i := 0; i < int(t.Ncomp); i++ {
t.floatVals = make([]float64, int(t.Ncomp))
var u float64
err := binary.Read(r, t.order, &u)
panicOn(err)