1- #! /ufs/guido /bin/sgi /python
1+ #! /usr/local /bin/python
22
33# Mirror a remote ftp subtree into a local directory tree.
44# Basic usage: ftpmirror [options] host remotedir localdir
@@ -98,7 +98,11 @@ def mirrorsubdir(f, localdir):
9898 pwd = f .pwd ()
9999 if localdir and not os .path .isdir (localdir ):
100100 if verbose : print 'Creating local directory' , localdir
101- makedir (localdir )
101+ try :
102+ makedir (localdir )
103+ except os .error , msg :
104+ print "Failed to establish local directory" , localdir
105+ return
102106 infofilename = os .path .join (localdir , '.mirrorinfo' )
103107 try :
104108 text = open (infofilename , 'r' ).read ()
@@ -158,20 +162,21 @@ def mirrorsubdir(f, localdir):
158162 print 'Already have this version of' , filename
159163 continue
160164 fullname = os .path .join (localdir , filename )
165+ tempname = os .path .join (localdir , '@' + filename )
161166 if interactive :
162167 doit = askabout ('file' , filename , pwd )
163168 if not doit :
164169 if not info .has_key (filename ):
165170 info [filename ] = 'Not retrieved'
166171 continue
167172 try :
168- os .unlink (fullname )
173+ os .unlink (tempname )
169174 except os .error :
170175 pass
171176 try :
172- fp = open (fullname , 'w' )
177+ fp = open (tempname , 'w' )
173178 except IOError , msg :
174- print "Can't create %s: %s" % (fullname , str (msg ))
179+ print "Can't create %s: %s" % (tempname , str (msg ))
175180 continue
176181 if verbose :
177182 print 'Retrieving %s from %s as %s...' % \
@@ -190,6 +195,13 @@ def mirrorsubdir(f, localdir):
190195 fp .close ()
191196 if fp1 != fp :
192197 fp1 .close ()
198+ try :
199+ os .rename (tempname , fullname )
200+ except os .error , msg :
201+ print "Can't rename %s to %s: %s" % (tempname ,
202+ fullname ,
203+ str (msg ))
204+ continue
193205 info [filename ] = infostuff
194206 writedict (info , infofilename )
195207 if verbose :
@@ -205,8 +217,11 @@ def mirrorsubdir(f, localdir):
205217 print
206218 #
207219 # Remove local files that are no longer in the remote directory
208- if not localdir : names = os .listdir (os .curdir )
209- else : names = os .listdir (localdir )
220+ try :
221+ if not localdir : names = os .listdir (os .curdir )
222+ else : names = os .listdir (localdir )
223+ except os .error :
224+ names = []
210225 for name in names :
211226 if name [0 ] == '.' or info .has_key (name ) or name in subdirs :
212227 continue
0 commit comments