This repository has been archived by the owner on May 29, 2018. It is now read-only.
/
cmdrevlog.go
100 lines (87 loc) · 1.78 KB
/
cmdrevlog.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"bytes"
"io"
"os"
"github.com/beyang/hgo/revlog"
"github.com/beyang/hgo/revlog/patch"
)
var cmdRevlog = &Command{
UsageLine: "revlog [-r filerev] [-build] file.i",
Short: "dump a revlog index, or the contents of a revision specified by -r",
Long: ``,
}
var revlogR = cmdRevlog.Flag.Int("r", -1, "file revision")
var revlogBuild = cmdRevlog.Flag.Bool("build", false, "build the file, don't show the incremental data")
func init() {
cmdRevlog.Run = runRevlog
}
func runRevlog(cmd *Command, w io.Writer, args []string) {
if len(args) == 0 {
fatalf("missing argument: revlog index file")
}
index, err := revlog.Open(storeName(args[0]))
if err != nil {
fatalf("%s", err)
}
if *revlogR == -1 {
index.Dump(w)
return
}
r, err := revlog.FileRevSpec(*revlogR).Lookup(index)
if err != nil {
fatalf("%s", err)
}
if !*revlogBuild {
dh := &dataHelper{}
d, err := r.GetData(dh)
if dh.file != nil {
dh.file.Close()
}
if err != nil {
fatalf("%s", err)
}
if r.IsBase() {
w.Write(d)
} else {
hunks, err := patch.Parse(d)
if err != nil {
fatalf("%s", err)
}
for _, h := range hunks {
h.Dump(w)
}
}
} else {
fb := revlog.NewFileBuilder()
err = fb.BuildWrite(w, r)
if err != nil {
fatalf("%s", err)
}
}
}
type storeName string
func (s storeName) Index() string {
return string(s)
}
func (s storeName) Data() string {
return string(s[:len(s)-2] + ".d")
}
type dataHelper struct {
file revlog.DataReadCloser
tmp *bytes.Buffer
}
func (dh *dataHelper) Open(fileName string) (file revlog.DataReadCloser, err error) {
if dh.file != nil {
file = dh.file
return
}
file, err = os.Open(fileName)
if err == nil {
dh.file = file
}
return
}
func (dh *dataHelper) TmpBuffer() *bytes.Buffer {
return dh.tmp
}