svn-export Re: svn bdb checkout?
Greg Larkin
glarkin at FreeBSD.org
Fri Jan 25 21:52:23 UTC 2013
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 1/25/13 1:53 PM, Xyne wrote:
> Greg Larkin wrote:
>
>> # python3 svn-export -r 310000
>> http://svn.freebsd.org/ports/head/ports-mgmt ports-mgmt Exporting
>> new repository. Exported revision 310000 # python3 svn-export
>> --revision-file rev.dat
>> http://svn.freebsd.org/ports/head/ports-mgmt ports-mgmt
>> Determining current revision. Current revision is 310981.
>> Determining changes [310000:310981]. 16 new/modified files, 5
>> deletions Traceback (most recent call last): File "svn-export",
>> line 459, in <module> svn.main() File "svn-export", line 432, in
>> main self.remove_old_files(deleted) File "svn-export", line 310,
>> in remove_old_files os.unlink(path) PermissionError: [Errno 1]
>> Operation not permitted: 'ports-mgmt/pkg/files' # exit
>>
>> As far as I can tell, svn-export attempts to remove a directory
>> before the file contained within that directory. It seems like
>> PermissionError isn't the best error code for Python to throw in
>> that case, since it appears to mask the root problem.
>
> On Arch Linux, Python raises the expected "IsADirectoryError"
> exception. Perhaps "PermissionError" is due to a bug in Python 3 on
> FreeBSD. It would not be the first exception bug that I have
> encountered (e.g. os.makedirs(..., exist_ok=True) raises
> "FileExists" when permissions differ on existing directories...
> very confusing the first time it shows up).
>
> Regardless, svn-export now tries to remove a directory in both
> cases. Please updated to version 2013.1.25 and let me know if it
> works on FreeBSD.
Yes, it does work on FreeBSD now, but I suggest investigating whether
it's possible to reorder the removal list with files first, then
directories. That way, you won't have to rely on an exception to
determine if a directory to be removed is not empty yet.
The os.walk() method looks like it would be useful here:
http://docs.python.org/3/library/os.html?highlight=os.walk#os.walk
>
>
>>> Incidentally, if anyone is looking at the code for svn-export,
>>> feel free to suggest a better way to incrementally export new
>>> subdirectories (see the "get_new_files()" method).
>>
>> I'll take a look at that soon to see if there are any possible
>> optimizations.
>
> Ok, thanks.
I looked at the method, and my first idea was to "svn cat" as many
files at once as possible, up to the maximum command line length. You
will avoid spawning a lot of svn processes and opening new network
connections each time. If the threads option is >1, you could divide
the maximum command line length by that number and keep filling in
filenames up to that limit in each child process.
I expect you would also get a nice performance boost if you changed
from spawning svn commands to the Python SVN bindings. Here's an
example of how it works:
http://svn.apache.org/repos/asf/subversion/trunk/tools/examples/getfile.py
>
>
>> Once we create a port for svn-export, we typically point to the
>> original download site in the port Makefile. It's a good idea
>> for the port maintainer to find a mirror site and include that
>> too, but if not, all distro files are eventually mirrored to the
>> FreeBSD cluster.
>>
>> Ideally, the source distros remain in place forever or at least
>> until the FreeBSD port is updated to the latest version, but if
>> that's not possible, I can mirror the files too.
>
> I have changed the time-to-live to 6 months for old archives.
Excellent, thank you.
Hope that all helps,
Greg
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.13 (Darwin)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
iEYEARECAAYFAlEC/ooACgkQ0sRouByUApCa0wCfQr4rIT9oQrI3LkYPlMGbfCnj
KqoAniabxFC2xeNAzvdLHLYhXhxYs1xi
=cfUS
-----END PGP SIGNATURE-----
More information about the freebsd-questions
mailing list