515
517
apr_off_t prev_context_end;
516
518
svn_boolean_t init_hunk = FALSE;
518
if (original_start > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
519
context_prefix_length = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
520
if (original_start > output_baton->context_size)
521
context_prefix_length = output_baton->context_size;
521
523
context_prefix_length = original_start;
617
619
const char *header_encoding,
618
620
const svn_string_t *original,
619
621
const svn_string_t *modified,
623
svn_cancel_func_t cancel_func,
625
apr_pool_t *scratch_pool)
623
628
if (svn_diff_contains_diffs(diff))
627
632
memset(&baton, 0, sizeof(baton));
628
633
baton.output_stream = output_stream;
629
baton.pool = svn_pool_create(pool);
634
baton.pool = svn_pool_create(scratch_pool);
630
635
baton.header_encoding = header_encoding;
631
baton.hunk = svn_stringbuf_create_empty(pool);
636
baton.hunk = svn_stringbuf_create_empty(scratch_pool);
632
637
baton.hunk_delimiter = hunk_delimiter;
633
638
baton.no_newline_string
634
639
= (hunk_delimiter == NULL || strcmp(hunk_delimiter, "##") != 0)
635
640
? APR_EOL_STR SVN_DIFF__NO_NEWLINE_AT_END_OF_FILE APR_EOL_STR
636
641
: APR_EOL_STR SVN_DIFF__NO_NEWLINE_AT_END_OF_PROPERTY APR_EOL_STR;
642
baton.context_size = context_size >= 0 ? context_size
643
: SVN_DIFF__UNIFIED_CONTEXT_SIZE;
638
645
SVN_ERR(svn_utf_cstring_from_utf8_ex2
639
646
(&(baton.prefix_str[unified_output_context]), " ",
640
header_encoding, pool));
647
header_encoding, scratch_pool));
641
648
SVN_ERR(svn_utf_cstring_from_utf8_ex2
642
649
(&(baton.prefix_str[unified_output_delete]), "-",
643
header_encoding, pool));
650
header_encoding, scratch_pool));
644
651
SVN_ERR(svn_utf_cstring_from_utf8_ex2
645
652
(&(baton.prefix_str[unified_output_insert]), "+",
646
header_encoding, pool));
653
header_encoding, scratch_pool));
648
fill_source_tokens(&baton.sources[0], original, pool);
649
fill_source_tokens(&baton.sources[1], modified, pool);
655
fill_source_tokens(&baton.sources[0], original, scratch_pool);
656
fill_source_tokens(&baton.sources[1], modified, scratch_pool);
651
658
if (with_diff_header)
653
660
SVN_ERR(svn_diff__unidiff_write_header(
654
661
output_stream, header_encoding,
655
original_header, modified_header, pool));
662
original_header, modified_header, scratch_pool));
658
SVN_ERR(svn_diff_output(diff, &baton,
659
&mem_output_unified_vtable));
665
SVN_ERR(svn_diff_output2(diff, &baton,
666
&mem_output_unified_vtable,
667
cancel_func, cancel_baton));
661
669
SVN_ERR(output_unified_flush_hunk(&baton, hunk_delimiter));
666
674
return SVN_NO_ERROR;
670
svn_diff_mem_string_output_unified(svn_stream_t *output_stream,
672
const char *original_header,
673
const char *modified_header,
674
const char *header_encoding,
675
const svn_string_t *original,
676
const svn_string_t *modified,
679
SVN_ERR(svn_diff_mem_string_output_unified2(output_stream,
778
772
svn_stream_set_write(cs->stream, context_saver_stream_write);
779
773
mob->context_saver = cs;
780
774
mob->output_stream = cs->stream;
775
cs->context_size = mob->context_size;
776
cs->data = apr_pcalloc(mob->pool, sizeof(*cs->data) * cs->context_size);
777
cs->len = apr_pcalloc(mob->pool, sizeof(*cs->len) * cs->context_size);
784
/* A stream which prints SVN_DIFF__UNIFIED_CONTEXT_SIZE lines to
781
/* A stream which prints LINES_TO_PRINT (based on context_size) lines to
785
782
BATON->REAL_OUTPUT_STREAM, and then changes BATON->OUTPUT_STREAM to
786
783
a context_saver; used for *trailing* context. */
815
812
svn_pool_clear(btn->pool);
817
814
tcp = apr_pcalloc(btn->pool, sizeof(*tcp));
818
tcp->lines_to_print = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
815
tcp->lines_to_print = btn->context_size;
820
817
s = svn_stream_empty(btn->pool);
821
818
svn_stream_set_baton(s, tcp);
913
910
if (style == svn_diff_conflict_display_resolved_modified_latest)
916
return svn_diff_output(diff, baton, &merge_output_vtable);
913
return svn_diff_output2(diff, baton, &merge_output_vtable,
914
btn->cancel_func, btn->cancel_baton);
918
916
style = svn_diff_conflict_display_modified_latest;
949
947
return SVN_NO_ERROR;
951
output_conflict_with_context_marker(merge_output_baton_t *btn,
957
SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
958
"%s (%" APR_OFF_T_FMT ")",
961
SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
962
"%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")",
963
label, start + 1, length));
965
SVN_ERR(output_marker_eol(btn));
953
970
static svn_error_t *
954
971
output_conflict_with_context(void *baton,
966
983
trailing context)? If so, flush it. */
967
984
if (btn->output_stream == btn->context_saver->stream)
969
if (btn->context_saver->total_written > SVN_DIFF__UNIFIED_CONTEXT_SIZE)
986
if (btn->context_saver->total_written > btn->context_size)
970
987
SVN_ERR(svn_stream_puts(btn->real_output_stream, "@@\n"));
971
988
SVN_ERR(flush_context_saver(btn->context_saver, btn->real_output_stream));
975
992
btn->output_stream = btn->real_output_stream;
977
994
/* Output the conflict itself. */
978
SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
979
(modified_length == 1
980
? "%s (%" APR_OFF_T_FMT ")"
981
: "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
983
modified_start + 1, modified_length));
984
SVN_ERR(output_marker_eol(btn));
995
SVN_ERR(output_conflict_with_context_marker(btn, btn->markers[1],
985
998
SVN_ERR(output_merge_token_range(NULL, btn, 1/*modified*/,
986
999
modified_start, modified_length));
988
SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
989
(original_length == 1
990
? "%s (%" APR_OFF_T_FMT ")"
991
: "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
993
original_start + 1, original_length));
994
SVN_ERR(output_marker_eol(btn));
1001
SVN_ERR(output_conflict_with_context_marker(btn, btn->markers[0],
995
1004
SVN_ERR(output_merge_token_range(NULL, btn, 0/*original*/,
996
1005
original_start, original_length));
998
1007
SVN_ERR(output_merge_marker(btn, 2/*separator*/));
999
1008
SVN_ERR(output_merge_token_range(NULL, btn, 2/*latest*/,
1000
1009
latest_start, latest_length));
1001
SVN_ERR(svn_stream_printf(btn->output_stream, btn->pool,
1003
? "%s (%" APR_OFF_T_FMT ")"
1004
: "%s (%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT ")"),
1006
latest_start + 1, latest_length));
1007
SVN_ERR(output_marker_eol(btn));
1010
SVN_ERR(output_conflict_with_context_marker(btn, btn->markers[3],
1009
1014
/* Go into print-trailing-context mode instead. */
1010
1015
make_trailing_context_printer(btn);
1059
1064
const char *conflict_latest,
1060
1065
const char *conflict_separator,
1061
1066
svn_diff_conflict_display_style_t style,
1067
svn_cancel_func_t cancel_func,
1069
apr_pool_t *scratch_pool)
1064
1071
merge_output_baton_t btn;
1065
1072
const char *eol;
1069
1076
? &merge_only_conflicts_output_vtable : &merge_output_vtable;
1071
1078
memset(&btn, 0, sizeof(btn));
1079
btn.context_size = SVN_DIFF__UNIFIED_CONTEXT_SIZE;
1073
1081
if (conflicts_only)
1075
btn.pool = svn_pool_create(pool);
1083
btn.pool = svn_pool_create(scratch_pool);
1076
1084
make_context_saver(&btn);
1077
1085
btn.real_output_stream = output_stream;
1080
1088
btn.output_stream = output_stream;
1082
fill_source_tokens(&(btn.sources[0]), original, pool);
1083
fill_source_tokens(&(btn.sources[1]), modified, pool);
1084
fill_source_tokens(&(btn.sources[2]), latest, pool);
1090
fill_source_tokens(&(btn.sources[0]), original, scratch_pool);
1091
fill_source_tokens(&(btn.sources[1]), modified, scratch_pool);
1092
fill_source_tokens(&(btn.sources[2]), latest, scratch_pool);
1086
1094
btn.conflict_style = style;
1095
1103
eol = APR_EOL_STR; /* use the platform default */
1097
1105
btn.marker_eol = eol;
1106
btn.cancel_func = cancel_func;
1107
btn.cancel_baton = cancel_baton;
1099
1109
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[1],
1100
1110
conflict_modified
1101
1111
? conflict_modified
1102
1112
: "<<<<<<< (modified)",
1104
1114
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[0],
1105
1115
conflict_original
1106
1116
? conflict_original
1107
1117
: "||||||| (original)",
1109
1119
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[2],
1110
1120
conflict_separator
1111
1121
? conflict_separator
1114
1124
SVN_ERR(svn_utf_cstring_from_utf8(&btn.markers[3],
1115
1125
conflict_latest
1116
1126
? conflict_latest
1117
1127
: ">>>>>>> (latest)",
1120
SVN_ERR(svn_diff_output(diff, &btn, vtable));
1130
SVN_ERR(svn_diff_output2(diff, &btn, vtable, cancel_func, cancel_baton));
1121
1131
if (conflicts_only)
1122
1132
svn_pool_destroy(btn.pool);
1124
1134
return SVN_NO_ERROR;
1128
svn_diff_mem_string_output_merge(svn_stream_t *output_stream,
1130
const svn_string_t *original,
1131
const svn_string_t *modified,
1132
const svn_string_t *latest,
1133
const char *conflict_original,
1134
const char *conflict_modified,
1135
const char *conflict_latest,
1136
const char *conflict_separator,
1137
svn_boolean_t display_original_in_conflict,
1138
svn_boolean_t display_resolved_conflicts,
1141
svn_diff_conflict_display_style_t style =
1142
svn_diff_conflict_display_modified_latest;
1144
if (display_resolved_conflicts)
1145
style = svn_diff_conflict_display_resolved_modified_latest;
1147
if (display_original_in_conflict)
1148
style = svn_diff_conflict_display_modified_original_latest;
1150
return svn_diff_mem_string_output_merge2(output_stream,