Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
cloning_git_in_go_gophercon_india.pdf
Search
Aditya Mukerjee
February 25, 2017
43
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
cloning_git_in_go_gophercon_india.pdf
Aditya Mukerjee
February 25, 2017
More Decks by Aditya Mukerjee
See All by Aditya Mukerjee
করো: Translating Go to Other (Human) Languages, and Back Again (GopherCon 2020)
chimeracoder
1
120
Building Stripe’s Remote Hub: Scaling Distributed Teams
chimeracoder
1
330
করো: Translating Code to Other (Human) Languages and Back Again
chimeracoder
1
130
করো: Translating Go to Other (Human) Languages, and Back Again (GopherCon Vietnam)
chimeracoder
1
120
Observability from the Panopticon: Measuring What Matters
chimeracoder
2
450
করো: Translating Code to Other (Human) Languages, and Back Again
chimeracoder
1
2.3k
Building Resilient Services in Go
chimeracoder
3
910
Observing Your Go Services
chimeracoder
1
270
You Might Be a Go Contributor Already and Not Know It
chimeracoder
2
460
Featured
See All Featured
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
380
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Between Models and Reality
mayunak
4
470
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Google's AI Overviews - The New Search
badams
0
1.6k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Practical Orchestrator
shlominoach
192
12k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
520
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
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