def patch_stream(self, instream, hunks):
    """ Generator that yields stream patched with hunks iterable

        Converts lineends in hunk lines to the best suitable format
        autodetected from input
    """

    # 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
def patch_stream ( self , instream , hunks ) : hunks = iter ( hunks ) srclineno = 1 lineends = { b'\n' : 0 , b'\r\n' : 0 , b'\r' : 0 } def get_line ( ) : line = instream . readline ( ) 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 ) ) while srclineno < h . startsrc : yield get_line ( ) srclineno += 1 for hline in h . text : 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 : ] 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 : yield line2write for line in instream : yield line
Generator that yields stream patched with hunks iterable

        Converts lineends in hunk lines to the best suitable format
        autodetected from input