def patch_stream(self, instream, hunks):

        # todo: At the moment substituted lineends may not be the same
        #       at the start and at the end of patching. Also issue a
        #       warning/throw about mixed lineends (is it really needed?)

        hunks = iter(hunks)

        srclineno = 1

        lineends = {b'\n': 0, b'\r\n': 0, b'\r': 0}

        def get_line():
            """
      local utility function - return line from source stream
      collecting line end statistics on the way
      """
            line = instream.readline()
            # 'U' mode works only with text files
            if line.endswith(b"\r\n"):
                lineends[b"\r\n"] += 1
            elif line.endswith(b"\n"):
                lineends[b"\n"] += 1
            elif line.endswith(b"\r"):
                lineends[b"\r"] += 1
            return line

        for hno, h in enumerate(hunks):
            debug("hunk %d" % (hno + 1))
            # skip to line just before hunk starts
            while srclineno < h.startsrc:
                yield get_line()
                srclineno += 1

            for hline in h.text:
                # todo: check \ No newline at the end of file
                if hline.startswith(b"-") or hline.startswith(b"\\"):
                    get_line()
                    srclineno += 1
                    continue
                else:
                    if not hline.startswith(b"+"):
                        get_line()
                        srclineno += 1
                    line2write = hline[1:]
                    # detect if line ends are consistent in source file
                    if sum([bool(lineends[x]) for x in lineends]) == 1:
                        newline = [x for x in lineends if lineends[x] != 0][0]
                        yield line2write.rstrip(b"\r\n") + newline
                    else:  # newlines are mixed
                        yield line2write

        for line in instream:
            yield line
Split height into (height_type, height_amount).  Raise exception err
dataset/ETHPy150Open ensime/ensime-sublime/patch.py/PatchSet.patch_stream--crossover with--dataset/ETHPy150Open AnyMesh/anyMesh-Python/example/urwid/decoration.py/normalize_height