Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
cloning_git_in_go_gophercon_india.pdf
Search
Aditya Mukerjee
February 25, 2017
0
36
cloning_git_in_go_gophercon_india.pdf
Aditya Mukerjee
February 25, 2017
Tweet
Share
More Decks by Aditya Mukerjee
See All by Aditya Mukerjee
করো: Translating Go to Other (Human) Languages, and Back Again (GopherCon 2020)
chimeracoder
1
80
Building Stripe’s Remote Hub: Scaling Distributed Teams
chimeracoder
1
210
করো: Translating Code to Other (Human) Languages and Back Again
chimeracoder
1
100
করো: Translating Go to Other (Human) Languages, and Back Again (GopherCon Vietnam)
chimeracoder
1
64
Observability from the Panopticon: Measuring What Matters
chimeracoder
2
340
করো: Translating Code to Other (Human) Languages, and Back Again
chimeracoder
1
2k
Building Resilient Services in Go
chimeracoder
3
820
Observing Your Go Services
chimeracoder
1
200
You Might Be a Go Contributor Already and Not Know It
chimeracoder
2
390
Featured
See All Featured
Fireside Chat
paigeccino
37
3.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
A Modern Web Designer's Workflow
chriscoyier
694
190k
Raft: Consensus for Rubyists
vanstee
140
7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
20
1.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Transcript
Cloning Git in Go Aditya Mukerjee Risk & Systems Engineer
at Stripe @chimeracoder
Why write Gitgo? •Git operations from Go applications •Portability •Simplicity
•…why not? @chimeracoder
The dirty secret about Git •Git wasn’t always meant to
be a version control system •Git is a decentralized, userland filesystem for preserving historical state and synchronizing data @chimeracoder
What We’ve Enabled •Backup •Content management •Distributed build systems •Establishing
consensus @chimeracoder
Have you ever seen a “friend’s” computer that looked like
this? @chimeracoder
@chimeracoder 107724969b2af751a1ffd74e3f38d0d76cb8aa55
@chimeracoder commits trees blobs objects
Discovery #1: Layered interfaces are more flexible than union types
@chimeracoder commits trees blobs objects
Bootstrapping Git in Go “We can just use the real
.git directory for our tests, right?” @chimeracoder …nope.
hash(“I love Go”) != hash(“I love Go!”) @chimeracoder Packfiles
Reference: Unpacking Git Packfiles Reference: Implementing Git’s Compression Algorithm in
Go binarydiff(1, 2, 3) 1. “I love Go” 2. “I love Go!” 3. “You love Go, and so do I!” “I love Go” <string 1> + “!”
Discovery #2: Pay attention to interface contracts @chimeracoder zlib data
<arbitrary data> zlib data <arbitrary data>
@chimeracoder type Reader interface { Read(p []byte) (n int, err
error) } Object 1 Object 2 Object 3 Object 4 …
• Discovery #3: Use concurrency to define state machines, and
use channels for the input/output @chimeracoder f1 f3 f2 g g1 if f g2
• Discovery #4: Treat errors as values, and ask how
they behave @chimeracoder httpdir.Open() ParsePackfile() GitFetch()
• Discovery #5: Well-architected interfaces perform very well @chimeracoder
#1: Layered interfaces are more flexible than union types #2:
Pay attention to interface contracts #3: Use concurrency to define state machines, and use channels for the input/output #4: Treat errors as values, and ask how they behave #5: Well-architected interfaces perform very well @chimeracoder
Aditya Mukerjee @chimeracoder https://github.com/ChimeraCoder
Further References • “Unpacking Git Packfiles”: https://codewords.recurse.com/issues/three/unpacking-git-packfiles/ • Gitgo: https://github.com/ChimeraCoder/gitgo/
• “Git from the Inside Out”: https://codewords.recurse.com/issues/two/git-from-the-inside-out @chimeracoder