On Tue, Feb 23, 2010 at 09:27:34PM +0100, Stefan Sperling wrote:
> On Tue, Feb 23, 2010 at 08:57:26PM +0100, Daniel Näslund wrote:
> > On Tue, Feb 02, 2010 at 09:11:52PM +0100, Stefan Sperling wrote:
> > > On Tue, Feb 02, 2010 at 08:48:43PM +0100, Daniel Näslund wrote:
> > > > Hi Stefan!
> > > > 
> > > > In match_hunk() we try to match lines from the context of the patch with
> > > > lines in the target. Earlier, in init_patch_target() we detect the eol
> > > > of the target and open streams to read from the target and to write the
> > > > patched result. Those streams does translation of keywords and eols.
> > > > 
> > > > In match_hunk we read a line from original_text and translate it. But we
> > > > don't get any translation of the eols in hunk_line_translated.
> > > 
> > > svn patch only repairs EOLs if the svn:eol-style enforces a fixed
> > > value (such as CR or CRLF). Try setting svn:eol-style to 'CRLF' on
> > > the patch target. Then you'll see dos-style newlines in the patched 
> > > result.
> > > 
> > > Admittedly, we may want to repair EOLs in more scenarios (such as
> > > eol-style = native).
> > 
> > I have a test where the target uses '\r\n' and the patch uses '\r' . The
> > eols are consistent within each file but we get a failure saying:
> > 
> > [[[
> > subversion/svn/patch-cmd.c:81: (apr_err=135000)
> > subversion/libsvn_client/patch.c:1463: (apr_err=135000)
> > subversion/libsvn_client/patch.c:1410: (apr_err=135000)
> > subversion/libsvn_client/patch.c:1100: (apr_err=135000)
> > subversion/libsvn_client/patch.c:830: (apr_err=135000)
> > subversion/libsvn_client/patch.c:799: (apr_err=135000)
> > subversion/libsvn_subr/subst.c:876: (apr_err=135000)
> > subversion/libsvn_subr/subst.c:643: (apr_err=135000)
> > svn: Inconsistent line ending style
> > ]]]
> 
> Where and how?

It happens when we've written all our hunks and we want to copy the
remaining lines. Here's a piece of apply_one_patch(). It's the call to
copy_lines_to_target() that throws the error.

[[[
  /* Apply or reject hunks. */
  for (i = 0; i < target->hunks->nelts; i++)
    {
      hunk_info_t *hi;

      svn_pool_clear(iterpool);

      hi = APR_ARRAY_IDX(target->hunks, i, hunk_info_t *);
      if (hi->rejected)
        SVN_ERR(reject_hunk(target, hi, iterpool));
      else
        SVN_ERR(apply_hunk(target, hi, iterpool));
    }
  svn_pool_destroy(iterpool);

  if (target->kind == svn_node_file)
    {
      /* Copy any remaining lines to target. */
      SVN_ERR(copy_lines_to_target(target, 0, scratch_pool));
      if (! target->eof)
        {
          /* We could not copy the entire target file to the temporary file,
           * and would truncate the target if we copied the temporary file
           * on top of it. Skip this target. */
          target->skipped = TRUE;
        }
    }
]]]

The test has one line after the last hunk. If I remove that line, the
test passes.

Daniel

Reply via email to