Git
Chapters ▾ 2nd Edition

A2.4 Appendix B: Git in je applicaties inbouwen - go-git

go-git

In het geval dat je Git in een service die in Golang is geschreven wilt integreren, is er ook een zuivere Go library implementatie. Deze implementatie heeft geen enkele afhankelijkheden met het onderliggende systeem en is dus niet onderheving aan handmatige geheugenbeheer fouten. Het is ook nog eens transparant voor de standaard Golang prestatie-analyse gereedschappen zoals CPU, Geheugen profilers, race detectors, etc.

go-git is gefocust op uitbreidbaarheid, compatibiliteit en ondersteund de meeste plumbing APIs, wat is beschreven op https://github.com/src-d/go-git/blob/master/COMPATIBILITY.md.

Hier is een eenvoudig voorbeeld van het gebruik van Go APIs:

import 	"gopkg.in/src-d/go-git.v4"

r, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{
    URL:      "https://github.com/src-d/go-git",
    Progress: os.Stdout,
})

Op het moment dat je een Repository instantie hebt, kan je de informatie verkrijgen en wijzigingen erop uitvoeren:

// retrieves the branch pointed by HEAD
ref, err := r.Head()

// get the commit object, pointed by ref
commit, err := r.CommitObject(ref.Hash())

// retrieves the commit history
history, err := commit.History()

// iterates over the commits and print each
for _, c := range history {
    fmt.Println(c)
}

Gevorderde functionaliteit

go-git heeft een aantal opmerkelijke mogelijkheden, een ervan is een uitbreidbaar opslag systeem, die vergelijkbaar is met Libgit2 backends. De standaard implementatie is in-memory opslag, wat heel snel is.

r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
    URL: "https://github.com/src-d/go-git",
})

Uitbreidbare opslag biedt veel interessante opties. Bijvoorbeeld, https://github.com/src-d/go-git/tree/master/_examples/storage geeft je d emogelijkheid om referenties, objecten en configuratie in een Aerospike database op te slaan.

Een andere mogelijkheid is een abstractie van een flexibel bestandssysteem. Met https://godoc.org/github.com/src-d/go-billy#Filesystem is het eenvoudig om alle bestanden op een andere manier op te slaan, bijv. door ze allemaal in een enkele archief op te slaan of door ze allemaal in het geheugen te houden.

Een andere geavanceerd gebruiksscenario is een erg optimaliseerbare HTTP client, zoals een die gevonden kan worden op https://github.com/src-d/go-git/blob/master/_examples/custom_http/main.go.

customClient := &http.Client{
	Transport: &http.Transport{ // accept any certificate (might be useful for testing)
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	},
	Timeout: 15 * time.Second,  // 15 second timeout
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
		return http.ErrUseLastResponse // don't follow redirect
	},
}

// Override http(s) default protocol to use our custom client
client.InstallProtocol("https", githttp.NewClient(customClient))

// Clone repository using the new client if the protocol is https://
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{URL: url})

Meer lezen

Een volledige behandeling van de mogelijkheden van go-git ligt buiten het bestek van dit boek. Als je meer informatie wilt hebben over go-git, dan is API documentatie beschikbaar op https://godoc.org/gopkg.in/src-d/go-git.v4, en een aantal gebruiksvoorbeelden op https://github.com/src-d/go-git/tree/master/_examples.