Hey Kutzi,

  It's helpful to step through the code to see the interaction.

  SVNUpdateEditor15 sees that a file is being added that contains file 
history.  baseTextOS is a bufferedOutputStream that is written to with the 
content of the previous version of the file during the first call to 
fetchFile(), here:

                baseTextOS = 
SVNFileUtil.openFileForWriting(info.copiedBaseText);
                myFileFetcher.fetchFile(copyFromPath, copyFromRevision, 
baseTextOS, baseProperties);

  At this point baseTextOS.buf contains "test line 1\n" (the contents of 
the original file).  Now a SVNChecksumOutputStream is instantiated with 
baseTextOS.  So checksumBaseTextOS.myTarget.buf contains "test line 1\n".

                SVNChecksumOutputStream checksumBaseTextOS = new 
SVNChecksumOutputStream(baseTextOS, 
                        SVNChecksumOutputStream.MD5_ALGORITHM, true);

  Now baseTextOS is set to checksumBaseTextOS, and then fetchFile() is 
called once again.  After this call, checksumBaseTextOS.myTarget.buf 
contains "test line 1\n test line 1"
                baseTextOS = checksumBaseTextOS;
                myFileFetcher.fetchFile(copyFromPath, copyFromRevision, 
baseTextOS, baseProperties);

  The buffer contents are duplicated, and eventually written out to the 
file on disk.  Screenshots below of the step through.

<https://lh4.googleusercontent.com/-3Z8e-RqSkkk/UXrvtcqUklI/AAAAAAAAAwQ/kCvkhyinza4/s1600/Screenshot-4.png>

<https://lh6.googleusercontent.com/-pHuGdrCYRkM/UXrwKcTSTiI/AAAAAAAAAwY/mGpyH1TydrI/s1600/Screenshot-5.png>

<https://lh6.googleusercontent.com/-Iks5PoTeupQ/UXrwNo0t4nI/AAAAAAAAAwg/4LDooxa3MhE/s1600/Screenshot-6.png>

<https://lh4.googleusercontent.com/-nI2X4wlSkTA/UXrwSdNY9tI/AAAAAAAAAwo/Tomkt07rW2k/s1600/Screenshot-7.png>

  I hope this demonstrates the bug well enough.  Thank you again for your 
helping getting subversion-plugin to compile and for pointing me towards 
the Jenkins fork of SVNKit.  That was very helpful.

  It looks like the SVNKit folks were able to reproduce the issue and 
confirmed the modification I submitted appears to resolve the issue (please 
see the last comment here: http://issues.tmatesoft.com/issue/SVNKIT-368).

-Kenny

On Friday, April 26, 2013 12:54:26 AM UTC-7, kutzi wrote:
>
> Nice research. Good job.
> However, I'd like to wait whta the SVNkit developers say about it:
> The bug is not so obvious to me, as the value of baseTextOS, which seems 
> to be the ouptut file for fetchFile, changes between the 2 calls to 
> myFileFetcher.fetchFile()
> So the question is, why in your case both values seem to point to the same 
> file
>   
> *Gesendet:* Freitag, 26. April 2013 um 04:22 Uhr
> *Von:* "Kenny Ayers" <[email protected] <javascript:>>
> *An:* [email protected] <javascript:>
> *Betreff:* A possible fix for Jenkins-14551 - subversion-plugin 
> duplicating file contents
> Hi folks, 
>  
> *Short Version:*
>  
>    I may have a fix for Jenkins-14551 (
> https://issues.jenkins-ci.org/browse/JENKINS-14551).  I've submitted this 
> potential resolution to SVNKit as well as their 1.7.6 SVN branch has the 
> same issue (http://issues.tmatesoft.com/issue/SVNKIT-368).  I've compiled 
> the change into the subversion-plugin on my test server, and the fix 
> appears to work.
>  
>   Can a contributor peer review this change?
>  
>   How do I go about submitting this fix to the Jenkins SVNKit repo?  Do I 
> need a unit test before I can do a pull request?  The bug is obvious when 
> you look at the code, and the unit test setup and execution seems like it 
> would be complicated.  I've forked the Jenkins SVNKit repo and committed 
> the modification here: 
> https://github.com/theotherwhitemeat/svnkit-1/commit/27decb28216ee4fd15b8fcbdb769bf41d81978eb
>  
> *Longer Version:*
>  
>   In org.tmatesoft.svn.core.internal.wc.SVNUpdateEditor15.java, in 
> function addFileWithHistory (line 867), there's a code block that calls 
> myFileFetcher.fetchFile() twice.  Each time this is called, baseTextOS is 
> written to.  Upon the second write, the file contents are duplicated. 
> Here's the code:
>  
>  
>  
>  baseTextOS = SVNFileUtil.openFileForWriting(info.copiedBaseText);
>  myFileFetcher.fetchFile(copyFromPath, copyFromRevision, baseTextOS, 
> baseProperties);
>  SVNChecksumOutputStream checksumBaseTextOS = new 
> SVNChecksumOutputStream(baseTextOS, 
>  SVNChecksumOutputStream.MD5_ALGORITHM, true);
>  baseTextOS = checksumBaseTextOS;
>  myFileFetcher.fetchFile(copyFromPath, copyFromRevision, baseTextOS, 
> baseProperties);
>  info.copiedBaseChecksum = checksumBaseTextOS.getDigest();
>  
>   
>  
>   I was able to find this by stepping through the code using NetBeans IDE 
> 7.3 attached to a remote debugging session on Jenkins.  I've compiled and 
> tested this change inside the context of the subversion-plugin and the file 
> contents are no longer duplicated.
>  
>   I've forked the svnkit repo used in Jenkins here, and committed this 
> change if anyone would like to download the fix and do some testing:
>  
>   
> https://github.com/theotherwhitemeat/svnkit-1/commit/27decb28216ee4fd15b8fcbdb769bf41d81978eb
>  
>   Here's my patch:
>  
> Index: SVNUpdateEditor15.java
> ===================================================================
> --- SVNUpdateEditor15.java (revision 9722)
> +++ SVNUpdateEditor15.java (working copy)
> @@ -864,7 +864,6 @@
>              OutputStream baseTextOS = null;
>              try {
>                  baseTextOS = 
> SVNFileUtil.openFileForWriting(info.copiedBaseText);
> -                myFileFetcher.fetchFile(copyFromPath, copyFromRevision, 
> baseTextOS, baseProperties);
>                  SVNChecksumOutputStream checksumBaseTextOS = new 
> SVNChecksumOutputStream(baseTextOS, 
>                          SVNChecksumOutputStream.MD5_ALGORITHM, true);
>                  baseTextOS = checksumBaseTextOS;
>  
> Thank you,
>  
> Kenny Ayers
>  
>  
> --
> You received this message because you are subscribed to the Google Groups 
> "Jenkins Developers" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] <javascript:>.
> For more options, visit https://groups.google.com/groups/opt_out.
>  
>  
>   

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to