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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
package main
import (
"fmt"
"io"
"os"
"os/exec"
"strings"
"git.lukeshu.com/go/libfastimport"
"git.parabola.nu/fiutil"
"github.com/pkg/errors"
)
func abort(err error) {
fmt.Fprintln(os.Stderr, "Error:", err)
os.Exit(1)
}
var _pkgbuild2pkgver = map[string]string{}
func pkgbuild2pkgver(backend *libfastimport.Backend, pkgbuildId string) (ver string, err error) {
if _, ok := _pkgbuild2pkgver[pkgbuildId]; !ok {
_, pkgbuild, err := backend.CatBlob(libfastimport.CmdCatBlob{DataRef: pkgbuildId})
if err != nil {
return "", err
}
script := string(pkgbuild) + "\n" + `. "$(librelib messages)" && get_full_version` + "\n"
cmd := exec.Command("bash")
cmd.Stdin = strings.NewReader(script)
out, err := cmd.Output()
if err != nil {
return "", err
}
_pkgbuild2pkgver[pkgbuildId] = strings.TrimSpace(string(out))
}
return _pkgbuild2pkgver[pkgbuildId], nil
}
func main() {
inref := os.Args[1]
outref := os.Args[2]
frontend, err := fiutil.GitFastExport("--no-data", "--full-tree", "--use-done-feature", inref)
if err != nil {
abort(err)
}
backend, err := fiutil.GitFastImport("--done")
tags := map[string]bool{}
commitMeta := libfastimport.CmdCommit{}
commitFile := []libfastimport.Cmd{}
for {
cmd, err := frontend.ReadCmd()
if err != nil {
if err == io.EOF {
break
}
abort(err)
}
switch cmdt := cmd.(type) {
case libfastimport.CmdCommit:
commitMeta = cmdt
commitFile = []libfastimport.Cmd{}
case libfastimport.CmdCommitEnd:
ver := ""
for _, file := range commitFile {
// perhaps I should change this to be a map keyed on filename
if m, ok := file.(libfastimport.FileModify); ok && m.Path == "PKGBUILD" {
ver, err = pkgbuild2pkgver(backend, m.DataRef)
if err != nil {
abort(err)
}
}
}
if ver == "" || tags[ver] {
break
}
tags[ver] = true
commitMeta.Msg = "core-x86_64 pacman " + ver + " : " + commitMeta.Msg
commitMeta.From = ""
commitMeta.Ref = outref
err = backend.Do(commitMeta)
if err != nil {
abort(err)
}
for _, file := range commitFile {
switch filet := file.(type) {
case libfastimport.FileDeleteAll:
/* allow */
case libfastimport.FileModify:
switch {
case filet.Path == "chmod-fix.patch":
continue
case filet.Path == "PKGBUILD":
case strings.HasSuffix(string(filet.Path), ".patch"):
default:
continue
}
default:
abort(errors.Errorf("unexpected file action: %#v", file))
}
err = backend.Do(file)
if err != nil {
abort(err)
}
}
case libfastimport.FileModify:
if strings.HasPrefix(string(cmdt.Path), "repos/core-x86_64/") {
cmdt.Path = libfastimport.Path(strings.TrimPrefix(string(cmdt.Path), "repos/core-x86_64/"))
commitFile = append(commitFile, cmdt)
}
case libfastimport.FileDeleteAll:
commitFile = append(commitFile, cmd)
case libfastimport.CmdReset:
cmdt.RefName = outref
err := backend.Do(cmdt)
if err != nil {
abort(err)
}
case libfastimport.CmdFeature, libfastimport.CmdOption, libfastimport.CmdDone:
err := backend.Do(cmd)
if err != nil {
abort(err)
}
case libfastimport.CmdComment:
default:
abort(errors.Errorf("Unexpected command: %[1]T(%#[1]v)", cmd))
}
}
}
|