You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2015/09/24 19:50:03 UTC
svn commit: r1705121 - in /subversion/trunk/subversion:
libsvn_diff/parse-diff.c tests/cmdline/patch_tests.py
Author: rhuijben
Date: Thu Sep 24 17:50:02 2015
New Revision: 1705121
URL: http://svn.apache.org/viewvc?rev=1705121&view=rev
Log:
Following up on r1705038, r1705080, r1705102 separate the handling of final
eols for original and modified versions to be able to apply add/remove final
eol diffs from both forwards and backwards diffs.
* subversion/libsvn_diff/parse-diff.c
(svn_diff_hunk_t): Split boolean.
(svn_diff_hunk_readline_original_text,
svn_diff_hunk_readline_modified_text): Pass the right boolean.
(parse_next_hunk): Use last line info to set the flag only for
the needed type.
* subversion/tests/cmdline/patch_tests.py
(patch_final_eol): New test.
(test_list): Add test.
Modified:
subversion/trunk/subversion/libsvn_diff/parse-diff.c
subversion/trunk/subversion/tests/cmdline/patch_tests.py
Modified: subversion/trunk/subversion/libsvn_diff/parse-diff.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/parse-diff.c?rev=1705121&r1=1705120&r2=1705121&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/trunk/subversion/libsvn_diff/parse-diff.c Thu Sep 24 17:50:02 2015
@@ -86,7 +86,8 @@ struct svn_diff_hunk_t {
svn_linenum_t trailing_context;
/* Did we see a 'file does not end with eol' marker in this hunk? */
- svn_boolean_t no_final_eol;
+ svn_boolean_t original_no_final_eol;
+ svn_boolean_t modified_no_final_eol;
};
struct svn_diff_binary_patch_t {
@@ -625,7 +626,9 @@ svn_diff_hunk_readline_original_text(svn
&hunk->original_text_range,
stringbuf, eol, eof,
hunk->patch->reverse ? '-' : '+',
- hunk->no_final_eol,
+ hunk->patch->reverse
+ ? hunk->modified_no_final_eol
+ : hunk->original_no_final_eol,
result_pool, scratch_pool));
}
@@ -644,7 +647,9 @@ svn_diff_hunk_readline_modified_text(svn
&hunk->modified_text_range,
stringbuf, eol, eof,
hunk->patch->reverse ? '+' : '-',
- hunk->no_final_eol,
+ hunk->patch->reverse
+ ? hunk->original_no_final_eol
+ : hunk->modified_no_final_eol,
result_pool, scratch_pool));
}
@@ -685,7 +690,7 @@ svn_diff_hunk_readline_diff_text(svn_dif
SVN_ERR(svn_io_file_seek(hunk->apr_file, APR_CUR,
&hunk->diff_text_range.current, scratch_pool));
- if (*eof && !*eol && !hunk->no_final_eol && *line->data)
+ if (*eof && !*eol && *line->data)
{
/* Ok, we miss a final EOL in the patch file, but didn't see a
no eol marker line.
@@ -921,7 +926,8 @@ parse_next_hunk(svn_diff_hunk_t **hunk,
apr_off_t start, end;
apr_off_t original_end;
apr_off_t modified_end;
- svn_boolean_t no_final_eol;
+ svn_boolean_t original_no_final_eol = FALSE;
+ svn_boolean_t modified_no_final_eol = FALSE;
svn_linenum_t original_lines;
svn_linenum_t modified_lines;
svn_linenum_t leading_context;
@@ -955,7 +961,6 @@ parse_next_hunk(svn_diff_hunk_t **hunk,
changed_line_seen = FALSE;
original_end = 0;
modified_end = 0;
- no_final_eol = FALSE;
*hunk = apr_pcalloc(result_pool, sizeof(**hunk));
/* Get current seek position -- APR has no ftell() :( */
@@ -1020,7 +1025,11 @@ parse_next_hunk(svn_diff_hunk_t **hunk,
SVN_ERR(svn_io_file_seek(apr_file, APR_SET, &pos, iterpool));
}
- no_final_eol = TRUE;
+ /* Set for the type and context by using != the other type */
+ if (last_line_type != modified_line)
+ original_no_final_eol = TRUE;
+ if (last_line_type != original_line)
+ modified_no_final_eol = TRUE;
continue;
}
@@ -1198,7 +1207,8 @@ parse_next_hunk(svn_diff_hunk_t **hunk,
(*hunk)->modified_text_range.start = start;
(*hunk)->modified_text_range.current = start;
(*hunk)->modified_text_range.end = modified_end;
- (*hunk)->no_final_eol = no_final_eol;
+ (*hunk)->original_no_final_eol = original_no_final_eol;
+ (*hunk)->modified_no_final_eol = modified_no_final_eol;
}
else
/* Something went wrong, just discard the result. */
Modified: subversion/trunk/subversion/tests/cmdline/patch_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/patch_tests.py?rev=1705121&r1=1705120&r2=1705121&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/patch_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/patch_tests.py Thu Sep 24 17:50:02 2015
@@ -5834,6 +5834,112 @@ def patch_delete_missing_eol(sbox):
expected_status, expected_skip,
[], False, True, '--reverse-diff')
+def patch_final_eol(sbox):
+ "patch the final eol"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ delete_patch = [
+ 'Index: iota\n',
+ '===================================================================\n',
+ '--- iota\t(revision 1)\n',
+ '+++ iota\t(working copy)\n',
+ '@@ -1 +1 @@\n',
+ '-This is the file \'iota\'.\n',
+ '+This is the file \'iota\'.\n',
+ '\ No newline at end of file' # Missing EOL
+ ]
+
+ patch = sbox.get_tempname('patch')
+ # We explicitly use wb here as this is the eol type added later in the test
+ svntest.main.file_write(patch, ''.join(delete_patch), mode='wb')
+
+ expected_output = wc.State(wc_dir, {
+ 'iota' : Item(status='U '),
+ })
+ expected_skip = wc.State(wc_dir, {})
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('iota', status='M ')
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.tweak('iota', contents="This is the file 'iota'.")
+
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True)
+
+ # And again
+ expected_output.tweak('iota', status='G ')
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True)
+
+ # Reverse
+ expected_disk.tweak('iota', contents="This is the file 'iota'.\n")
+ expected_status.tweak('iota', status=' ')
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True, '--reverse-diff')
+
+ # And once more
+ expected_output.tweak('iota', status='U ')
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True, '--reverse-diff')
+
+ # Change the unmodified form
+ sbox.simple_append('iota', 'This is the file \'iota\'.', truncate=True)
+ sbox.simple_commit()
+ expected_status.tweak('iota', wc_rev='2')
+
+ add_patch = [
+ 'Index: iota\n',
+ '===================================================================\n',
+ '--- iota\t(revision 2)\n',
+ '+++ iota\t(working copy)\n',
+ '@@ -1 +1 @@\n',
+ '-This is the file \'iota\'.\n',
+ '\ No newline at end of file\n',
+ '+This is the file \'iota\'.' # Missing eol
+ ]
+
+ #sbox.simple_append('iota', 'This is the file \'iota\'.\n', truncate=True)
+ svntest.main.file_write(patch, ''.join(add_patch), mode='wb')
+
+ # Apply the patch
+ expected_output.tweak('iota', status='U ')
+ expected_disk.tweak('iota', contents="This is the file 'iota'.\n")
+ expected_status.tweak('iota', status='M ')
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True)
+
+ # And again
+ expected_output.tweak('iota', status='G ')
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True)
+
+ # And in reverse
+ expected_disk.tweak('iota', contents="This is the file 'iota'.")
+ expected_status.tweak('iota', status=' ')
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True, '--reverse-diff')
+
+ # And again
+ expected_output.tweak('iota', status='U ')
+ svntest.actions.run_and_verify_patch(wc_dir, patch,
+ expected_output, expected_disk,
+ expected_status, expected_skip,
+ [], False, True, '--reverse-diff')
########################################################################
#Run the tests
@@ -5899,6 +6005,7 @@ test_list = [ None,
patch_binary_file,
patch_delete_nodes,
patch_delete_missing_eol,
+ patch_final_eol,
]
if __name__ == '__main__':