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.

94dcff33cbdf74b5d785369ac54bc1a8?s=128

Aditya Mukerjee

February 25, 2017
Tweet

Transcript

  1. 3.

    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. 8.
  3. 9.

    Bootstrapping Git in Go “We can just use the real

    .git directory for our tests, right?” @chimeracoder …nope.
  4. 11.

    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> + “!”
  5. 12.
  6. 13.

    @chimeracoder type Reader interface { Read(p []byte) (n int, err

    error) } Object 1 Object 2 Object 3 Object 4 …
  7. 14.

    • Discovery #3: Use concurrency to define state machines, and

    use channels for the input/output @chimeracoder f1 f3 f2 g g1 if f g2
  8. 15.

    • Discovery #4: Treat errors as values, and ask how

    they behave @chimeracoder httpdir.Open() ParsePackfile() GitFetch()
  9. 17.

    #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
  10. 19.

    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