[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: Why non matching eols in patch and target. (svn patch related)

From: Daniel Näslund <daniel_at_longitudo.com>
Date: Tue, 23 Feb 2010 22:06:04 +0100

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
Received on 2010-02-23 22:06:45 CET

This is an archived mail posted to the Subversion Dev mailing list.