code: def get_file_annotate(self, path):
          
          cmd = 'blame -l --root -r %s -- "%s"' % (self.id, path)
          # -l     ==> outputs long shas (and we need all 40 characters)
          # --root ==> doesn't put '^' character for bounderies
          # -r sha ==> blames for the given revision
          so, se = self.repository.run_git_command(cmd)
  
          for i, blame_line in enumerate(so.split('\n')[:-1]):
              ln_no = i + 1
              sha, line = re.split(r' ', blame_line, 1)
              yield (ln_no, sha, lambda: self.repository.get_changeset(sha), line)
docs: Returns a generator of four element tuples with
              lineno, sha, changeset lazy loader and line
  
          TODO: This function now uses os underlying 'git' command which is
          generally not good. Should be replaced with algorithm iterating
          commits.