code: def collect_blame_info(cls, matches):
          
          old_area = None
          for filename, ranges in matches:
              area, name = os.path.split(filename)
              if not area:
                  area = '.'
              if area != old_area:
                  print("\n\n%s/\n" % area)
                  old_area = area
              print("%s " % name, end="")
              filter = cls.build_line_range_filter(ranges)
              command = ['git', 'blame', '--line-porcelain'] + filter + [name]
              os.chdir(area)
              p = subprocess.Popen(command, stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
              out, err = p.communicate()
              if err:
                  print(" <<<<<<<<<< Unable to collect 'git blame' info:", err)
              else:
                  yield out
docs: Runs git blame on files, for the specified sets of line ranges.
  
          If no line range tuples are provided, it will do all lines.