summaryrefslogtreecommitdiff
path: root/fi-pacmanlog/main.go
blob: 4d1a5df262e856e8d3ccfa75b5c9d56bb3c29cc8 (plain)
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))
		}
	}
}