Hi Julian,
many thanks for your much-needed clarifications on the editor/diff callbacks
frameworks! I'll try to put them to practice.
Julian Foad wrote:
> Great. It doesn't seem to be working quite right yet, though. A simple
> test on the command line, in a Subversion WC with your patch applied,
> shows:
>
> [[[
> $ svn status
> M subversion/tests/cmdline/merge_tests.py
> M subversion/libsvn_client/merge.c
> M subversion/libsvn_client/diff.c
> M subversion/libsvn_client/repos_diff_summarize.c
>
> $ svn diff --summarize -r33519 subversion/
> M subversion/subversion/libsvn_wc/update_editor.c
> ]]]
lol, that bad :)
I wonder why the merge tests using it to compare directories are passing, then.
> There are two different mechanisms for (streamily) representing a tree
> diff: the "delta editor" and the "diff callbacks". In the existing (svn
> 1.5) diff code, notice how the two different mechanisms are used:
>
> (repos <> repos):
>
> normal-diff:
> editor = svn_client__get_diff_editor(CALLBACKS);
> reporter = svn_ra_do_diff3(editor);
> reporter->finish_report();
>
> diff-summarize:
> editor = svn_client__get_diff_summarize_editor(SUMMARIZE_FUNC);
> reporter = svn_ra_do_diff3(editor);
> reporter->finish_report();
>
> (repos <> wc):
>
> normal-diff:
> editor = svn_wc_get_diff_editor5(CALLBACKS);
> reporter = svn_ra_do_diff3(editor);
> svn_wc_crawl_revisions3(reporter);
>
> diff-summarize:
> n/a
>
> (wc <> wc):
>
> normal-diff:
> svn_wc_diff5(CALLBACKS);
>
> diff-summarize:
> n/a
>
What about another case I encountered today in ./merge_tests.py 88 89:
foreign-repos <> wc
A diff doesn't work, but a merge does (test script attached):
A wc1/file
Adding wc1/file
Transmitting file data .
Committed revision 1.
A wc2/file
+ svn diff --old=file:////arch/elego/svn/test/repos1 --new=wc2
subversion/libsvn_ra_local/ra_plugin.c:266: (apr_err=170000)
svn: 'file:///arch/elego/svn/test/repos1'
is not the same repository as
'file:///arch/elego/svn/test/repos2'
+ echo
+ svn merge -c 1 file:////arch/elego/svn/test/repos1 wc2
Conflict discovered in 'wc2/file'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: e
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: r
--- Merging (from foreign repository) r1 into 'wc2':
A wc2/file
C wc2
So, if we were to add a summarizing-diff before each merge, it would break
all foreign-repos merges...
>> A couple of tests still fail with my patch, I'll investigate.
>> merge_tests.py 3 88 89 114 115 119
>> diff_tests.py 45
I fixed all but merge_tests.py 88 and 89, the foreign-repos ones.
Also, I haven't actually checked *all* of the commandline tests. It takes
ages to complete, with apparent longer breaks of doing nothing at all, when
watching the CPU and disk activity.
And then I have to run it twice, once for trunk and once for my patch, to be
able to compare test outcomes. How do you handle this kind of situation?
...and, I think I'd like to open a micro-branch for this thing. I can just
decide about that myself now, right?
Thanks
~Neels
--
Neels Hofmeyr -- elego Software Solutions GmbH
Gustav-Meyer-Allee 25 / Gebäude 12, 13355 Berlin, Germany
phone: +49 30 23458696 mobile: +49 177 2345869 fax: +49 30 23458695
http://www.elegosoft.com | Geschäftsführer: Olaf Wagner | Sitz: Berlin
Handelsreg: Amtsgericht Charlottenburg HRB 77719 | USt-IdNr: DE163214194
#!/bin/sh
# The next line is the only line you should need to adjust.
SVNDIR=/arch/elego/svn/trunk
## GENERIC PREPARATIONS
SVN=${SVNDIR}/subversion/svn/svn
SVNSERVE=${SVNDIR}/subversion/svnserve/svnserve
SVNADMIN=${SVNDIR}/subversion/svnadmin/svnadmin
# use my local way if my script is there (neels).
if [ -x /usr/local/bin/svnremake ]; then
SVN=svn
SVNSERVE=svnserve
SVNADMIN=svnadmin
fi
${SVN} --version
# Select an access method. If svn://, the svnserve setup is
# handled automagically by this script; but if http://, then
# you'll have to configure it yourself first.
#
# URL=http://localhost/neels/repos
# URL=svn://localhost/repos
URL1=file:///`pwd`/repos1
URL2=file:///`pwd`/repos2
rm -rf repos1 wc1 repos2 wc2
${SVNADMIN} create repos1
${SVNADMIN} create repos2
# These are for svnserve only.
echo "[general]" > repos1/conf/svnserve.conf
echo "anon-access = write" >> repos1/conf/svnserve.conf
echo "auth-access = write" >> repos1/conf/svnserve.conf
echo "[general]" > repos2/conf/svnserve.conf
echo "anon-access = write" >> repos2/conf/svnserve.conf
echo "auth-access = write" >> repos2/conf/svnserve.conf
# The server will only be contacted if $URL is svn://foo, of course.
${SVNSERVE} --pid-file svnserve-pid -d -r `pwd`
# And put the kill command in a file, in case need to run it manually.
echo "kill -9 `cat svnserve-pid`" > k
chmod a+rwx k
${SVN} co -q ${URL1} wc1
${SVN} co -q ${URL2} wc2
## ACTUAL TEST
echo x > wc1/file
${SVN} add wc1/file
${SVN} ci -m m wc1
echo y > wc2/file
${SVN} add wc2/file
set -x
${SVN} diff --old=${URL1} --new=wc2
echo
${SVN} merge -c 1 ${URL1} wc2
## ACTUAL TEST ENDS
echo "====="
./k
Received on 2008-10-09 07:29:08 CEST