code: func (b *blame) fillGraphAndData() error {
  	//TODO: not all commits are needed, only the current rev and the prev
  	b.graph = make([][]*object.Commit, len(b.revs))
  	b.data = make([]string, len(b.revs)) // file contents in all the revisions
  	// for every revision of the file, starting with the first
  	// one...
  	for i, rev := range b.revs {
  		// get the contents of the file
  		file, err := rev.File(b.path)
  		if err != nil {
  			return nil
  		}
  		b.data[i], err = file.Contents()
  		if err != nil {
  			return err
  		}
  		nLines := countLines(b.data[i])
  		// create a node for each line
  		b.graph[i] = make([]*object.Commit, nLines)
  		// assign a commit to each node
  		// if this is the first revision, then the node is assigned to
  		// this first commit.
  		if i == 0 {
  			for j := 0; j < nLines; j++ {
  				b.graph[i][j] = (*object.Commit)(b.revs[i])
  			}
  		} else {
  			// if this is not the first commit, then assign to the old
  			// commit or to the new one, depending on what the diff
  			// says.
  			b.assignOrigin(i, i-1)
  		}
  	}
  	return nil
  }
docs: // build graph of a file from its revision history