Using File.open block to manage svnadmin dump stream

While working on a script to manage dumps from a subversion repository
of mine, I found that when I used a File.open block to work with the
stream returned by svnadmin dump, I would get errors regarding a
malformed header in the dump file. For instance:

# The following block results in bad dump files, not accepted by
svnadmin load
File.open("path/to/todays/dumpfile", "a") do |file|
  file << `svnadmin dump "path/to/repository" -r #{revision}
--incremental`
end

# However, a strait command expression does work, like
`svnadmin dump "path/to/repository" -r #{revision} --incremental >>
"path/to/todays/dumpfile"`

Might anyone know why the use of a File.open block would result in a
dump file not accepted by svnadmin load, while a strait command
expression works? I tried using the << and write methods of File, but
still no luck. Perhaps I don't understand a more appropriate way to
write the stream?

Thanks for taking a look.
Brad

···

--
Posted via http://www.ruby-forum.com/.

Brad C. wrote:

# The following block results in bad dump files, not accepted by svnadmin load
File.open("path/to/todays/dumpfile", "a") do |file|
  file << `svnadmin dump "path/to/repository" -r #{revision} --incremental`
end

# However, a strait command expression does work, like
`svnadmin dump "path/to/repository" -r #{revision} --incremental >> "path/to/todays/dumpfile"`

Can you do it both ways and then diff the two files to see what's actually different?

Also, try using write (or, failing that, puts) instead of << to output to the file.

--Steve

Brad C. wrote:

While working on a script to manage dumps from a subversion repository
of mine, I found that when I used a File.open block to work with the
stream returned by svnadmin dump, I would get errors regarding a
malformed header in the dump file. For instance:

# The following block results in bad dump files, not accepted by
svnadmin load
File.open("path/to/todays/dumpfile", "a") do |file|
  file << `svnadmin dump "path/to/repository" -r #{revision}
--incremental`
end

# However, a strait command expression does work, like
`svnadmin dump "path/to/repository" -r #{revision} --incremental >>
"path/to/todays/dumpfile"`

Might anyone know why the use of a File.open block would result in a
dump file not accepted by svnadmin load, while a strait command
expression works? I tried using the << and write methods of File, but
still no luck. Perhaps I don't understand a more appropriate way to
write the stream?

Thanks for taking a look.
Brad

I'm only guessing but the different file size suggests that our old
friend LF vs. CR/LF rears its ugly head again.

Pia Kraft

Stephen Waits wrote:

Can you do it both ways and then diff the two files to see what's
actually different?

Also, try using write (or, failing that, puts) instead of << to output
to the file.

--Steve

Being on a windows XP machine, I ran COMP to compare the files and it
only stated that the files were of different sizes. I also compared the
files with TextPad, which output:

Compare: (<)C:\subversion\dump\test\test_cmdexpress (431 bytes)
   with: (>)C:\subversion\dump\test\test_rblocksave (462 bytes)
The files are identical

I also ran subversion's own diff against the files which output:

Index: test_cmdexpress

···

===================================================================
--- test_cmdexpress (revision 0)
+++ test_cmdexpress (revision 0)
@@ -0,0 +1,31 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 6d10496b-807e-eb4a-8eb1-db2388672f7a
+
+Revision-number: 32
+Prop-content-length: 120
+Content-length: 120
+
+K 7
+svn:log
+V 18
+changed banana.txt
+K 10
+svn:author
+V 7
+bc13935
+K 8
+svn:date
+V 27
+2006-04-04T15:34:30.679827Z
+PROPS-END
+
+Node-path: banana.txt
+Node-kind: file
+Node-action: change
+Text-content-length: 14
+Text-content-md5: 485def7fa8bf59e9d2ea55653a999a22
+Content-length: 14
+
+I am a banana.
+
Index: test_rblocksave

--- test_rblocksave (revision 0)
+++ test_rblocksave (revision 0)
@@ -0,0 +1,31 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 6d10496b-807e-eb4a-8eb1-db2388672f7a
+
+Revision-number: 32
+Prop-content-length: 120
+Content-length: 120
+
+K 7
+svn:log
+V 18
+changed banana.txt
+K 10
+svn:author
+V 7
+bc13935
+K 8
+svn:date
+V 27
+2006-04-04T15:34:30.679827Z
+PROPS-END
+
+Node-path: banana.txt
+Node-kind: file
+Node-action: change
+Text-content-length: 14
+Text-content-md5: 485def7fa8bf59e9d2ea55653a999a22
+Content-length: 14
+
+I am a banana.
+

...Which I don't see any differences in.

I tried generating the file with File#write, File#<<, and File#puts,
with both "a" and "w" modifiers, but all come to be the larger file size
of 462 bytes, and are not accepted by svnadmin load, which errors:

svnadmin: Found malformed header block in dumpfile stream

I'm using ruby 1.8.4 (2005-12-24) [i386-mswin32], Windows XP.

--
Posted via http://www.ruby-forum.com/\.

I thought the OP was on a Linux box where there is no difference between a binary
and text file but if the problem is on a Windows system then you have to explicitly
open the file in binary mode to avoid the LF CR/LF issues of text I/O.

Gary Wright

···

On Apr 4, 2006, at 1:13 PM, Pia Kraft wrote:

I'm only guessing but the different file size suggests that our old
friend LF vs. CR/LF rears its ugly head again.

.. btw

Testing without a svn dump results in different file sizes just the
same. However in this case the ruby generated file is smaller:

echo Test > testcmd.txt
(7 byte file)

File.open("c:/testrb.txt","w") do |f|
  f << "Test"
end
(4 byte file)

If it matters much. Just trying to understand why these differences
happen :slight_smile:

···

--
Posted via http://www.ruby-forum.com/.

unknown wrote:

but if the problem is on a Windows system then you have
to explicitly
open the file in binary mode to avoid the LF CR/LF issues of text I/O.

Gary Wright

Well, I tried this to no avail (I assume this is using a binary mode
file):

File.open("c:/testrb.txt","w") do |f|
  f.binmode # I'm not really sure if this puts f in binary mode or not.
  f << "Test"
end

Still results in different file sizes.

···

--
Posted via http://www.ruby-forum.com/\.

I should have posted an example. Your code is opening the file in text
mode. You have to add a 'b' to the mode argument of open to force the
file to be opened in binary mode:

File.open("c:/testrb.txt","wb") do |f|
   # write data here via the File object f
end

Gary Wright

···

On Apr 4, 2006, at 6:13 PM, Brad C. wrote:

Well, I tried this to no avail (I assume this is using a binary mode
file):

File.open("c:/testrb.txt","w") do |f|
  f.binmode # I'm not really sure if this puts f in binary mode or not.
  f << "Test"
end

unknown wrote:

I should have posted an example. Your code is opening the file in text
mode. You have to add a 'b' to the mode argument of open to force the
file to be opened in binary mode:

File.open("c:/testrb.txt","wb") do |f|
   # write data here via the File object f
end

Gary Wright

Ah, I should have been able to come up with that. Thanks. I tried this
and the file sizes remain different though. Might this have to do with
the version of ruby I'm using? Apart from running on windows :\

I guess one could create files via strait command expressions, then
modify them via ruby's File class, unless that resaves differently. Is
this something that's normal -different file sizes when creating files
in various ways?

···

--
Posted via http://www.ruby-forum.com/\.

------------------------------------------------------------------ IO#<<
      ios << obj => ios

···

On Apr 4, 2006, at 10:47 PM, Brad C. wrote:

unknown wrote:

I should have posted an example. Your code is opening the file in text
mode. You have to add a 'b' to the mode argument of open to force the
file to be opened in binary mode:

File.open("c:/testrb.txt","wb") do |f|
   # write data here via the File object f
end

Gary Wright

Ah, I should have been able to come up with that. Thanks. I tried this
and the file sizes remain different though. Might this have to do with
the version of ruby I'm using? Apart from running on windows :\

I guess one could create files via strait command expressions, then
modify them via ruby's File class, unless that resaves differently. Is
this something that's normal -different file sizes when creating files
in various ways?

--
Posted via http://www.ruby-forum.com/\.

------------------------------------------------------------------------
      String Output---Writes obj to ios. obj will be converted to a
      string using to_s.

         $stdout << "Hello " << "world!\n"

      produces:

         Hello world!

As you can see, << is more like write or print than puts, while echo will append a new line

try file.puts "Test" and see if your file sizes match up then