Skip to content

Commit 4e36c0f

Browse files
authored
Merge stdout and stderr to see errors easier (#8)
1 parent cb27105 commit 4e36c0f

File tree

2 files changed

+22
-21
lines changed

2 files changed

+22
-21
lines changed

exiftool.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ var ErrNotExist = errors.New("file does not exist")
2525

2626
// Exiftool is the exiftool utility wrapper
2727
type Exiftool struct {
28-
lock sync.Mutex
29-
stdin io.WriteCloser
30-
stdout io.ReadCloser
31-
scanout *bufio.Scanner
28+
lock sync.Mutex
29+
stdin io.WriteCloser
30+
stdMergedOut io.ReadCloser
31+
scanMergedOut *bufio.Scanner
3232
}
3333

3434
// NewExiftool instanciates a new Exiftool with configuration functions. If anything went
@@ -43,18 +43,19 @@ func NewExiftool(opts ...func(*Exiftool) error) (*Exiftool, error) {
4343
}
4444

4545
cmd := exec.Command(binary, initArgs...)
46+
r, w := io.Pipe()
47+
e.stdMergedOut = r
48+
49+
cmd.Stdout = w
50+
cmd.Stderr = w
4651

4752
var err error
4853
if e.stdin, err = cmd.StdinPipe(); err != nil {
4954
return nil, fmt.Errorf("error when piping stdin: %w", err)
5055
}
5156

52-
if e.stdout, err = cmd.StdoutPipe(); err != nil {
53-
return nil, fmt.Errorf("error when piping stdout: %w", err)
54-
}
55-
56-
e.scanout = bufio.NewScanner(e.stdout)
57-
e.scanout.Split(splitReadyToken)
57+
e.scanMergedOut = bufio.NewScanner(r)
58+
e.scanMergedOut.Split(splitReadyToken)
5859

5960
if err = cmd.Start(); err != nil {
6061
return nil, fmt.Errorf("error when executing commande: %w", err)
@@ -76,8 +77,8 @@ func (e *Exiftool) Close() error {
7677
}
7778

7879
var errs []error
79-
if err := e.stdout.Close(); err != nil {
80-
errs = append(errs, fmt.Errorf("error while closing stdout: %w", err))
80+
if err := e.stdMergedOut.Close(); err != nil {
81+
errs = append(errs, fmt.Errorf("error while closing stdMergedOut: %w", err))
8182
}
8283

8384
if err := e.stdin.Close(); err != nil {
@@ -119,19 +120,19 @@ func (e *Exiftool) ExtractMetadata(files ...string) []FileMetadata {
119120
fmt.Fprintln(e.stdin, f)
120121
fmt.Fprintln(e.stdin, executeArg)
121122

122-
if !e.scanout.Scan() {
123-
fms[i].Err = fmt.Errorf("nothing on stdout")
123+
if !e.scanMergedOut.Scan() {
124+
fms[i].Err = fmt.Errorf("nothing on stdMergedOut")
124125
continue
125126
}
126127

127-
if e.scanout.Err() != nil {
128-
fms[i].Err = fmt.Errorf("error while reading stdout: %w", e.scanout.Err())
128+
if e.scanMergedOut.Err() != nil {
129+
fms[i].Err = fmt.Errorf("error while reading stdMergedOut: %w", e.scanMergedOut.Err())
129130
continue
130131
}
131132

132133
var m []map[string]interface{}
133-
if err := json.Unmarshal(e.scanout.Bytes(), &m); err != nil {
134-
fms[i].Err = fmt.Errorf("error during unmarshaling (%v): %w)", e.scanout.Bytes(), err)
134+
if err := json.Unmarshal(e.scanMergedOut.Bytes(), &m); err != nil {
135+
fms[i].Err = fmt.Errorf("error during unmarshaling (%v): %w)", e.scanMergedOut.Bytes(), err)
135136
continue
136137
}
137138

exiftool_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func TestCloseNominal(t *testing.T) {
137137

138138
r := readWriteCloserMock{closed: &rClosed}
139139
w := readWriteCloserMock{closed: &wClosed}
140-
e := Exiftool{stdin: r, stdout: w}
140+
e := Exiftool{stdin: r, stdMergedOut: w}
141141

142142
assert.Nil(t, e.Close())
143143
assert.True(t, rClosed)
@@ -149,7 +149,7 @@ func TestCloseErrorOnStdin(t *testing.T) {
149149

150150
r := readWriteCloserMock{closed: &rClosed, closeErr: fmt.Errorf("error")}
151151
w := readWriteCloserMock{closed: &wClosed}
152-
e := Exiftool{stdin: r, stdout: w}
152+
e := Exiftool{stdin: r, stdMergedOut: w}
153153

154154
assert.NotNil(t, e.Close())
155155
assert.True(t, rClosed)
@@ -161,7 +161,7 @@ func TestCloseErrorOnStdout(t *testing.T) {
161161

162162
r := readWriteCloserMock{closed: &rClosed}
163163
w := readWriteCloserMock{closed: &wClosed, closeErr: fmt.Errorf("error")}
164-
e := Exiftool{stdin: r, stdout: w}
164+
e := Exiftool{stdin: r, stdMergedOut: w}
165165

166166
assert.NotNil(t, e.Close())
167167
assert.True(t, rClosed)

0 commit comments

Comments
 (0)