def _index_from_raw_format(cls, repo, proc):
        """Create a new DiffIndex from the given stream which must be in raw format.
        :return: git.DiffIndex"""
        # handles
        # :100644 100644 687099101... 37c5e30c8... M    .gitignore

        index = DiffIndex()

        def handle_diff_line(line):
            line = line.decode(defenc)
            if not line.startswith(":"):
                return

            meta, _, path = line[1:].partition('\t')
            old_mode, new_mode, a_blob_id, b_blob_id, _change_type = meta.split(None, 4)
            # Change type can be R100
            # R: status letter
            # 100: score (in case of copy and rename)
            change_type = _change_type[0]
            score_str = ''.join(_change_type[1:])
            score = int(score_str) if score_str.isdigit() else None
            path = path.strip()
            a_path = path.encode(defenc)
            b_path = path.encode(defenc)
            deleted_file = False
            new_file = False
            rename_from = None
            rename_to = None

            # NOTE: We cannot conclude from the existence of a blob to change type
            # as diffs with the working do not have blobs yet
            if change_type == 'D':
                b_blob_id = None
                deleted_file = True
            elif change_type == 'A':
                a_blob_id = None
                new_file = True
            elif change_type == 'R':
                a_path, b_path = path.split('\t', 1)
                a_path = a_path.encode(defenc)
                b_path = b_path.encode(defenc)
                rename_from, rename_to = a_path, b_path
            elif change_type == 'T':
                # Nothing to do
                pass
            # END add/remove handling

            diff = Diff(repo, a_path, b_path, a_blob_id, b_blob_id, old_mode, new_mode,
                        new_file, deleted_file, rename_from, rename_to, '',
                        change_type, score)
            index.append(diff)

        handle_process_output(proc, handle_diff_line, None, finalize_process, decode_streams=False)

        return index
Create a new DiffIndex from the given stream which must be in raw format.
        :return: git.DiffIndex