summaryrefslogtreecommitdiff
path: root/fi-filelist/main.go
blob: 7fbb8202819fb3848c7d419b5273494a22850f17 (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
package main

import (
	"fmt"
	"io"
	"os"
	"sort"
	"time"

	"git.lukeshu.com/go/libfastimport"
	"github.com/pkg/errors"
)

func abort(err error) {
	fmt.Fprintln(os.Stderr, "Error:", err)
	os.Exit(1)
}

func main() {
	frontend := libfastimport.NewFrontend(os.Stdin, nil, nil)
	fileset := make(map[string]bool)

	commits := 0
	beg := time.Now()
	status := func() {
		fmt.Fprintf(os.Stderr,
			"%d commits => %d files (%.2f commit/s)\r",
			commits, len(fileset),
			float64(commits)/time.Since(beg).Seconds())
	}
	for {
		cmd, err := frontend.ReadCmd()
		if err != nil {
			if err == io.EOF {
				break
			}
			abort(err)
		}
		switch cmdt := cmd.(type) {

		case libfastimport.CmdCommit:
		case libfastimport.CmdCommitEnd:
			commits++
			status()

		case libfastimport.FileModify:
			fileset[string(cmdt.Path)] = true
		case libfastimport.FileModifyInline:
			fileset[string(cmdt.Path)] = true
		case libfastimport.FileDelete:
			fileset[string(cmdt.Path)] = true
		case libfastimport.FileCopy:
			fileset[string(cmdt.Src)] = true
			fileset[string(cmdt.Dst)] = true
		case libfastimport.FileRename:
			fileset[string(cmdt.Src)] = true
			fileset[string(cmdt.Dst)] = true

		case libfastimport.FileDeleteAll:
		case libfastimport.NoteModify:
		case libfastimport.NoteModifyInline:

		case libfastimport.CmdTag:
		case libfastimport.CmdReset:
		case libfastimport.CmdBlob:
		case libfastimport.CmdCheckpoint:
		case libfastimport.CmdProgress:
		case libfastimport.CmdFeature:
		case libfastimport.CmdOption:
		case libfastimport.CmdDone:

		case libfastimport.CmdComment:

		default:
			abort(errors.Errorf("Unexpected command: %[1]T(%#[1]v)", cmd))
		}
	}
	status()
	fmt.Fprintln(os.Stderr)

	filelist := make([]string, len(fileset))
	i := 0
	for filename := range fileset {
		filelist[i] = filename
		i++
	}
	sort.Strings(filelist)
	for _, filename := range filelist {
		fmt.Println(filename)
	}
}