Re: pipe hanging on win32
Kevin Pilch-Bisson wrote: I don't think that's what the problem is. My perl script which copied stdin to the log file had the same problem, I wrote the above hook just so that I could attach to it and see where it was hanging. Ah! Important information, that. :-) -- Brane Äibej <[EMAIL PROTECTED]> http://www.xbc.nu/brane/
Re: pipe hanging on win32
Quoting [EMAIL PROTECTED]: > Quoting Kevin Pilch-Bisson <[EMAIL PROTECTED]>: > > > I've attached a short example of what I am trying to do on in svn for > > the benefit of any apr folks who may be able to look at this. > > > > Basically I'm calling the run_pre_revprop_change_hook(), and it's > > hanging in apr_file_flush(...) specifically in FlushFileBuffers it seems. > > > > The hook script (shown below), is hanging in getc(). > > > > Any ideas why this isn't working? > > > > Note that log.txt never includes anything from stdin. > > > > int main(int argc, char **argv) > > { > > std::ofstream file("log.txt"); > > file << "Repos is: " << argv[1] << std::endl; > > file << "Rev is: " << argv[2] << std::endl; > > file << "Propname is: " << argv[3] << std::endl; > > while (!std::cin.eof()) { > > std::string s; > > std::cin >> s; > > IIRC this is a fairly well-known bug in MS's implementation of the iostream > library. It hangs in getc() because it doesn't check for end-of-file > correctly. Well that's fine except that the same thing happens in a propval with no line endings, or with DOS line endings or with Unix line endings. > > > file << s << std::endl; > > BTW, why are you breaking lines in the prop value like this? "std::cin >> > s" > will _not_ read a whole line of input. I know, at this point I was just trying to see whether the hook got any input at all. > > > } > > file << std::ends; > > Hm. Stuffing nulls into text files is not nice, either. Doh! That was a mistake. > > > file.close(); > > return 0; > > } > > > Anyway. Try rewriting that hook of yours in C, with appropriate eof checking. > It > has a good chance of working then. Or you might try to use "std::getline(cin, > s, > '\n')", maybe that doesn't tickle the same bug -- not to mention that lines > will > be broken correctly. > > Brane I don't think that's what the problem is. My perl script which copied stdin to the log file had the same problem, I wrote the above hook just so that I could attach to it and see where it was hanging. -- ~~~ Kevin Pilch-Bisson [EMAIL PROTECTED] ~~~
Re: pipe hanging on win32
Oh blast. I just remembered why you have to be careful when piping prop values to the hook's stdin. The standard streams are translated by default on Windows, so pushing arbitrary binary streams through them will come to a bad end. Remember what happened to svnadmin dump/load when we did thet?
Re: pipe hanging on win32
Quoting Kevin Pilch-Bisson <[EMAIL PROTECTED]>: > I've attached a short example of what I am trying to do on in svn for > the benefit of any apr folks who may be able to look at this. > > Basically I'm calling the run_pre_revprop_change_hook(), and it's > hanging in apr_file_flush(...) specifically in FlushFileBuffers it seems. > > The hook script (shown below), is hanging in getc(). > > Any ideas why this isn't working? > > Note that log.txt never includes anything from stdin. > > int main(int argc, char **argv) > { > std::ofstream file("log.txt"); > file << "Repos is: " << argv[1] << std::endl; > file << "Rev is: " << argv[2] << std::endl; > file << "Propname is: " << argv[3] << std::endl; > while (!std::cin.eof()) { > std::string s; > std::cin >> s; IIRC this is a fairly well-known bug in MS's implementation of the iostream library. It hangs in getc() because it doesn't check for end-of-file correctly. > file << s << std::endl; BTW, why are you breaking lines in the prop value like this? "std::cin >> s" will _not_ read a whole line of input. > } > file << std::ends; Hm. Stuffing nulls into text files is not nice, either. > file.close(); > return 0; > } Anyway. Try rewriting that hook of yours in C, with appropriate eof checking. It has a good chance of working then. Or you might try to use "std::getline(cin, s, '\n')", maybe that doesn't tickle the same bug -- not to mention that lines will be broken correctly. Brane