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
|
package main
/*
import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
"gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/storage/filesystem"
"gopkg.in/src-d/go-git.v4/utils/fs"
)
func main() {
if len(os.Args) != 2 {
usage()
os.Exit(1)
}
fs := NewCustomFS(os.Args[1])
s, err := filesystem.NewStorage(fs, ".git")
if err != nil {
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
repo, err := git.NewRepository(s)
if err != nil {
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
iter, err := repo.Commits()
if err != nil {
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
defer iter.Close()
for {
commit, err := iter.Next()
if err != nil {
if err == io.EOF {
break
}
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
fmt.Println(commit)
}
}
func usage() {
fmt.Fprintf(os.Stderr, "%s <path to .git dir>", os.Args[0])
}
// A simple proxy filesystem example: It mimics local filesystems, using
// 'base' as its root and a funny path separator ("--").
//
// Example: when constructed with 'newFS("tmp")', a path like 'foo--bar'
// will represent the local path "/tmp/foo/bar".
type CustomFS struct {
base string
}
const separator = "--"
func NewCustomFS(path string) *CustomFS {
return &CustomFS{
base: path,
}
}
func (fs *CustomFS) Stat(path string) (info os.FileInfo, err error) {
f, err := os.Open(fs.ToReal(path))
if err != nil {
return nil, err
}
defer func() {
errClose := f.Close()
if err == nil {
err = errClose
}
}()
return f.Stat()
}
func (fs *CustomFS) ToReal(path string) string {
parts := strings.Split(path, separator)
return filepath.Join(fs.base, filepath.Join(parts...))
}
func (fs *CustomFS) Open(path string) (fs.ReadSeekCloser, error) {
return os.Open(fs.ToReal(path))
}
func (fs *CustomFS) ReadDir(path string) ([]os.FileInfo, error) {
return ioutil.ReadDir(fs.ToReal(path))
}
func (fs *CustomFS) Join(elem ...string) string {
return strings.Join(elem, separator)
}
*/
|