Przeglądaj źródła

Indent output of commands

Lucas Stadler 8 lat temu
rodzic
commit
0690a2adbf
1 zmienionych plików z 50 dodań i 2 usunięć
  1. 50 2
      go/archive/archive.go

+ 50 - 2
go/archive/archive.go

@ -1,10 +1,12 @@
1 1
package main
2 2
3 3
import (
4
	"bytes"
4 5
	"crypto/rand"
5 6
	"encoding/json"
6 7
	"flag"
7 8
	"fmt"
9
	"io"
8 10
	"net/url"
9 11
	"os"
10 12
	"os/exec"
@ -71,8 +73,8 @@ func main() {
71 73
	}
72 74
73 75
	cmd := exec.Command("prince", "--javascript", "--raster-output", fmt.Sprintf(".archive/%x-%%02d.png", buf), u.String())
74
	cmd.Stderr = os.Stderr
75
	cmd.Stdout = os.Stdout
76
	cmd.Stderr = prefixWriter("    | ", os.Stderr)
77
	cmd.Stdout = prefixWriter("    | ", os.Stdout)
76 78
	err = cmd.Run()
77 79
	if err != nil {
78 80
		exit("prince", err)
@ -154,3 +156,49 @@ func exit(msg string, err error) {
154 156
	fmt.Fprintf(os.Stderr, "Error: %s: %s\n", msg, err)
155 157
	os.Exit(1)
156 158
}
159
160
type prefixLineWriter struct {
161
	prefix      string
162
	needsPrefix bool
163
164
	w io.Writer
165
}
166
167
func prefixWriter(prefix string, w io.Writer) io.Writer {
168
	return &prefixLineWriter{
169
		prefix:      prefix,
170
		needsPrefix: true,
171
172
		w: w,
173
	}
174
}
175
176
func (p *prefixLineWriter) Write(b []byte) (n int, err error) {
177
	if p.needsPrefix {
178
		p.w.Write([]byte(p.prefix))
179
		p.needsPrefix = false
180
	}
181
182
	n = 0
183
	for {
184
		i := bytes.IndexByte(b, '\n')
185
		if i == -1 {
186
			nn, err := p.w.Write(b)
187
			return n + nn, err
188
		}
189
190
		if i+1 == len(b) {
191
			p.needsPrefix = true
192
			nn, err := p.w.Write(b)
193
			return n + nn, err
194
		}
195
196
		nn, err := p.w.Write(b[:i+1])
197
		if err != nil {
198
			return n + nn, err
199
		}
200
		n += nn
201
		p.w.Write([]byte(p.prefix))
202
		b = b[i+1:]
203
	}
204
}