Graft Tests

https://git.wiki.kernel.org/index.php/GraftPoint

GraftPoints are existing Commits that have their parents "rewritten"

To support graftpoints:

1) A new object GraftedCommit is needed to manage Commit parents
2) ObjectStores must be able to return GraftedCommit objects
3) Repos must be able to manage its own graftpoints
Add GraftedCommit object

A GraftedCommit looks exactly like a Commit. However, the behaviour of
parents is changed to take into account new "fake" parents. The "real"
parents are still recoverable.
getitem returns GraftedCommit

ObjectStores now have a grafts dict property. A lookup is performed on
the grafts property to determine if a GraftedCommit needs to be returned
instead of a Commit.
parse_graftpoints

https://git.wiki.kernel.org/index.php/GraftPoint

Graftpoints are dictionaries of shas. The key is the commit sha, the
value is a list of parent shas.

In a graft file, each line is formatted as:

  <commit sha1> <parent sha1> [<parent sha1>]*
serialize_graftpoints

https://git.wiki.kernel.org/index.php/GraftPoint

Serialize graftpoints to the line format:

  <commit sha1> <parent sha1> [<parent sha1>]*