Skip to content
  • Jeff King's avatar
    pkt-line: teach packet_read_line to chomp newlines · 819b929d
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    The packets sent during ref negotiation are all terminated
    by newline; even though the code to chomp these newlines is
    short, we end up doing it in a lot of places.
    
    This patch teaches packet_read_line to auto-chomp the
    trailing newline; this lets us get rid of a lot of inline
    chomping code.
    
    As a result, some call-sites which are not reading
    line-oriented data (e.g., when reading chunks of packfiles
    alongside sideband) transition away from packet_read_line to
    the generic packet_read interface. This patch converts all
    of the existing callsites.
    
    Since the function signature of packet_read_line does not
    change (but its behavior does), there is a possibility of
    new callsites being introduced in later commits, silently
    introducing an incompatibility.  However, since a later
    patch in this series will change the signature, such a
    commit would have to be merged directly into this commit,
    not to the tip of the series; we can therefore ignore the
    issue.
    
    This is an internal cleanup and should produce no change of
    behavior in the normal case. However, there is one corner
    case to note. Callers of packet_read_line have never been
    able to tell the difference between a flush packet ("0000")
    and an empty packet ("0004"), as both cause packet_read_line
    to return a length of 0. Readers treat them identically,
    even though Documentation/technical/protocol-common.txt says
    we must not; it also says that implementations should not
    send an empty pkt-line.
    
    By stripping out the newline before the result gets to the
    caller, we will now treat the newline-only packet ("0005\n")
    the same as an empty packet, which in turn gets treated like
    a flush packet. In practice this doesn't matter, as neither
    empty nor newline-only packets are part of git's protocols
    (at least not for the line-oriented bits, and readers who
    are not expecting line-oriented packets will be calling
    packet_read directly, anyway). But even if we do decide to
    care about the distinction later, it is orthogonal to this
    patch.  The right place to tighten would be to stop treating
    empty packets as flush packets, and this change does not
    make doing so any harder.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    819b929d