Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_client/diff.c view on Meta::CPAN
diff_cmd_baton->header_encoding, scratch_pool,
"Index: %s" APR_EOL_STR
SVN_DIFF__EQUAL_STRING APR_EOL_STR,
index_path));
/* ### Do we want to add git diff headers here too? I'd say no. The
* ### 'Index' and '===' line is something subversion has added. The rest
* ### is up to the external diff application. We may be dealing with
* ### a non-git compatible diff application.*/
/* We deal in streams, but svn_io_run_diff2() deals in file handles,
so we may need to make temporary files and then copy the contents
to our stream. */
outfile = svn_stream__aprfile(outstream);
if (outfile)
outfilename = NULL;
else
SVN_ERR(svn_io_open_unique_file3(&outfile, &outfilename, NULL,
svn_io_file_del_on_pool_cleanup,
scratch_pool, scratch_pool));
errfile = svn_stream__aprfile(errstream);
if (errfile)
errfilename = NULL;
else
SVN_ERR(svn_io_open_unique_file3(&errfile, &errfilename, NULL,
svn_io_file_del_on_pool_cleanup,
scratch_pool, scratch_pool));
SVN_ERR(svn_io_run_diff2(".",
diff_cmd_baton->options.for_external.argv,
diff_cmd_baton->options.for_external.argc,
label1, label2,
tmpfile1, tmpfile2,
&exitcode, outfile, errfile,
diff_cmd_baton->diff_cmd, scratch_pool));
/* Now, open and copy our files to our output streams. */
if (outfilename)
{
SVN_ERR(svn_io_file_close(outfile, scratch_pool));
SVN_ERR(svn_stream_open_readonly(&stream, outfilename,
scratch_pool, scratch_pool));
SVN_ERR(svn_stream_copy3(stream, svn_stream_disown(outstream,
scratch_pool),
NULL, NULL, scratch_pool));
}
if (errfilename)
{
SVN_ERR(svn_io_file_close(errfile, scratch_pool));
SVN_ERR(svn_stream_open_readonly(&stream, errfilename,
scratch_pool, scratch_pool));
SVN_ERR(svn_stream_copy3(stream, svn_stream_disown(errstream,
scratch_pool),
NULL, NULL, scratch_pool));
}
/* We have a printed a diff for this path, mark it as visited. */
*wrote_header = TRUE;
}
else /* use libsvn_diff to generate the diff */
{
svn_diff_t *diff;
SVN_ERR(svn_diff_file_diff_2(&diff, tmpfile1, tmpfile2,
diff_cmd_baton->options.for_internal,
scratch_pool));
if (force_diff
|| diff_cmd_baton->use_git_diff_format
|| svn_diff_contains_diffs(diff))
{
/* Print out the diff header. */
SVN_ERR(svn_stream_printf_from_utf8(outstream,
diff_cmd_baton->header_encoding, scratch_pool,
"Index: %s" APR_EOL_STR
SVN_DIFF__EQUAL_STRING APR_EOL_STR,
index_path));
if (diff_cmd_baton->use_git_diff_format)
{
const char *repos_relpath1;
const char *repos_relpath2;
SVN_ERR(make_repos_relpath(&repos_relpath1, diff_relpath,
diff_cmd_baton->orig_path_1,
diff_cmd_baton->ra_session,
diff_cmd_baton->wc_ctx,
diff_cmd_baton->anchor,
scratch_pool, scratch_pool));
SVN_ERR(make_repos_relpath(&repos_relpath2, diff_relpath,
diff_cmd_baton->orig_path_2,
diff_cmd_baton->ra_session,
diff_cmd_baton->wc_ctx,
diff_cmd_baton->anchor,
scratch_pool, scratch_pool));
SVN_ERR(print_git_diff_header(outstream, &label1, &label2,
operation,
repos_relpath1, repos_relpath2,
rev1, rev2,
copyfrom_path,
copyfrom_rev,
diff_cmd_baton->header_encoding,
scratch_pool));
}
/* Output the actual diff */
if (force_diff || svn_diff_contains_diffs(diff))
SVN_ERR(svn_diff_file_output_unified3(outstream, diff,
tmpfile1, tmpfile2, label1, label2,
diff_cmd_baton->header_encoding, rel_to_dir,
diff_cmd_baton->options.for_internal->show_c_function,
scratch_pool));
/* We have a printed a diff for this path, mark it as visited. */
*wrote_header = TRUE;
}
}
/* ### todo: someday we'll need to worry about whether we're going
to need to write a diff plug-in mechanism that makes use of the
two paths, instead of just blindly running SVN_CLIENT_DIFF. */
( run in 0.553 second using v1.01-cache-2.11-cpan-9288abcf80b )