Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cloning Git in Go - GopherCon India 2017

Cloning Git in Go - GopherCon India 2017

Gitgo began as an experiment: how would programming today be different if Git had been written in Go instead of C?

The result: an implementation of Git that is compatible with existing Git repositories, but simpler, more portable, and fast enough to be used as a general-purpose data store. With Gitgo, Git is no longer just for managing source control. Go makes Git a practical choice for content distribution, distributed build systems, establishing consensus, and more.

This talk was given on Feb 25, 2017 at GopherCon India in Pune.

Aditya Mukerjee

February 25, 2017
Tweet

More Decks by Aditya Mukerjee

Other Decks in Programming

Transcript

  1. 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
  2. Bootstrapping Git in Go “We can just use the real

    .git directory for our tests, right?” @chimeracoder …nope.
  3. 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> + “!”
  4. @chimeracoder type Reader interface { Read(p []byte) (n int, err

    error) } Object 1 Object 2 Object 3 Object 4 …
  5. • Discovery #3: Use concurrency to define state machines, and

    use channels for the input/output @chimeracoder f1 f3 f2 g g1 if f g2
  6. • Discovery #4: Treat errors as values, and ask how

    they behave @chimeracoder httpdir.Open() ParsePackfile() GitFetch()
  7. #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
  8. Further References • “Unpacking Git Packfiles”: https://codewords.recurse.com/issues/three/unpacking-git-packfiles/ • “Implementing Git’s

    Compression Algorithm in Go”: https://blog.gopheracademy.com/advent- 2016/implementing_gits-compression_algorithm_in_go/ • Gitgo: https://github.com/ChimeraCoder/gitgo/ • “Git from the Inside Out”: https://codewords.recurse.com/issues/two/git-from-the-inside-out @chimeracoder