These files are a subset of the python-2.7.2.tgz distribution from python.org. Changed files from PyMod-2.7.2 have been copied into the corresponding directories of this tree, replacing the original files in the distribution. Signed-off-by: daryl.mcdaniel@intel.com git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13197 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			209 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Compare local and remote dictionaries and transfer differing files -- like rdist."""
 | |
| 
 | |
| import sys
 | |
| from repr import repr
 | |
| import FSProxy
 | |
| import time
 | |
| import os
 | |
| 
 | |
| def main():
 | |
|     pwd = os.getcwd()
 | |
|     s = raw_input("chdir [%s] " % pwd)
 | |
|     if s:
 | |
|         os.chdir(s)
 | |
|         pwd = os.getcwd()
 | |
|     host = ask("host", 'voorn.cwi.nl')
 | |
|     port = 4127
 | |
|     verbose = 1
 | |
|     mode = ''
 | |
|     print """\
 | |
| Mode should be a string of characters, indicating what to do with differences.
 | |
| r - read different files to local file system
 | |
| w - write different files to remote file system
 | |
| c - create new files, either remote or local
 | |
| d - delete disappearing files, either remote or local
 | |
| """
 | |
|     s = raw_input("mode [%s] " % mode)
 | |
|     if s: mode = s
 | |
|     address = (host, port)
 | |
|     t1 = time.time()
 | |
|     local = FSProxy.FSProxyLocal()
 | |
|     remote = FSProxy.FSProxyClient(address, verbose)
 | |
|     compare(local, remote, mode)
 | |
|     remote._close()
 | |
|     local._close()
 | |
|     t2 = time.time()
 | |
|     dt = t2-t1
 | |
|     mins, secs = divmod(dt, 60)
 | |
|     print mins, "minutes and", round(secs), "seconds"
 | |
|     raw_input("[Return to exit] ")
 | |
| 
 | |
| def ask(prompt, default):
 | |
|     s = raw_input("%s [%s] " % (prompt, default))
 | |
|     return s or default
 | |
| 
 | |
| def askint(prompt, default):
 | |
|     s = raw_input("%s [%s] " % (prompt, str(default)))
 | |
|     if s: return string.atoi(s)
 | |
|     return default
 | |
| 
 | |
| def compare(local, remote, mode):
 | |
|     print
 | |
|     print "PWD =", repr(os.getcwd())
 | |
|     sums_id = remote._send('sumlist')
 | |
|     subdirs_id = remote._send('listsubdirs')
 | |
|     remote._flush()
 | |
|     print "calculating local sums ..."
 | |
|     lsumdict = {}
 | |
|     for name, info in local.sumlist():
 | |
|         lsumdict[name] = info
 | |
|     print "getting remote sums ..."
 | |
|     sums = remote._recv(sums_id)
 | |
|     print "got", len(sums)
 | |
|     rsumdict = {}
 | |
|     for name, rsum in sums:
 | |
|         rsumdict[name] = rsum
 | |
|         if not lsumdict.has_key(name):
 | |
|             print repr(name), "only remote"
 | |
|             if 'r' in mode and 'c' in mode:
 | |
|                 recvfile(local, remote, name)
 | |
|         else:
 | |
|             lsum = lsumdict[name]
 | |
|             if lsum != rsum:
 | |
|                 print repr(name),
 | |
|                 rmtime = remote.mtime(name)
 | |
|                 lmtime = local.mtime(name)
 | |
|                 if rmtime > lmtime:
 | |
|                     print "remote newer",
 | |
|                     if 'r' in mode:
 | |
|                         recvfile(local, remote, name)
 | |
|                 elif lmtime > rmtime:
 | |
|                     print "local newer",
 | |
|                     if 'w' in mode:
 | |
|                         sendfile(local, remote, name)
 | |
|                 else:
 | |
|                     print "same mtime but different sum?!?!",
 | |
|                 print
 | |
|     for name in lsumdict.keys():
 | |
|         if not rsumdict.keys():
 | |
|             print repr(name), "only locally",
 | |
|             fl()
 | |
|             if 'w' in mode and 'c' in mode:
 | |
|                 sendfile(local, remote, name)
 | |
|             elif 'r' in mode and 'd' in mode:
 | |
|                 os.unlink(name)
 | |
|                 print "removed."
 | |
|             print
 | |
|     print "gettin subdirs ..."
 | |
|     subdirs = remote._recv(subdirs_id)
 | |
|     common = []
 | |
|     for name in subdirs:
 | |
|         if local.isdir(name):
 | |
|             print "Common subdirectory", repr(name)
 | |
|             common.append(name)
 | |
|         else:
 | |
|             print "Remote subdirectory", repr(name), "not found locally"
 | |
|             if 'r' in mode and 'c' in mode:
 | |
|                 pr = "Create local subdirectory %s? [y] " % \
 | |
|                      repr(name)
 | |
|                 if 'y' in mode:
 | |
|                     ok = 'y'
 | |
|                 else:
 | |
|                     ok = ask(pr, "y")
 | |
|                 if ok[:1] in ('y', 'Y'):
 | |
|                     local.mkdir(name)
 | |
|                     print "Subdirectory %s made" % \
 | |
|                             repr(name)
 | |
|                     common.append(name)
 | |
|     lsubdirs = local.listsubdirs()
 | |
|     for name in lsubdirs:
 | |
|         if name not in subdirs:
 | |
|             print "Local subdirectory", repr(name), "not found remotely"
 | |
|     for name in common:
 | |
|         print "Entering subdirectory", repr(name)
 | |
|         local.cd(name)
 | |
|         remote.cd(name)
 | |
|         compare(local, remote, mode)
 | |
|         remote.back()
 | |
|         local.back()
 | |
| 
 | |
| def sendfile(local, remote, name):
 | |
|     try:
 | |
|         remote.create(name)
 | |
|     except (IOError, os.error), msg:
 | |
|         print "cannot create:", msg
 | |
|         return
 | |
| 
 | |
|     print "sending ...",
 | |
|     fl()
 | |
| 
 | |
|     data = open(name).read()
 | |
| 
 | |
|     t1 = time.time()
 | |
| 
 | |
|     remote._send_noreply('write', name, data)
 | |
|     remote._flush()
 | |
| 
 | |
|     t2 = time.time()
 | |
| 
 | |
|     dt = t2-t1
 | |
|     print len(data), "bytes in", round(dt), "seconds",
 | |
|     if dt:
 | |
|         print "i.e.", round(len(data)/dt), "bytes/sec",
 | |
|     print
 | |
| 
 | |
| def recvfile(local, remote, name):
 | |
|     ok = 0
 | |
|     try:
 | |
|         rv = recvfile_real(local, remote, name)
 | |
|         ok = 1
 | |
|         return rv
 | |
|     finally:
 | |
|         if not ok:
 | |
|             print "*** recvfile of %r failed, deleting" % (name,)
 | |
|             local.delete(name)
 | |
| 
 | |
| def recvfile_real(local, remote, name):
 | |
|     try:
 | |
|         local.create(name)
 | |
|     except (IOError, os.error), msg:
 | |
|         print "cannot create:", msg
 | |
|         return
 | |
| 
 | |
|     print "receiving ...",
 | |
|     fl()
 | |
| 
 | |
|     f = open(name, 'w')
 | |
|     t1 = time.time()
 | |
| 
 | |
|     length = 4*1024
 | |
|     offset = 0
 | |
|     id = remote._send('read', name, offset, length)
 | |
|     remote._flush()
 | |
|     while 1:
 | |
|         newoffset = offset + length
 | |
|         newid = remote._send('read', name, newoffset, length)
 | |
|         data = remote._recv(id)
 | |
|         id = newid
 | |
|         if not data: break
 | |
|         f.seek(offset)
 | |
|         f.write(data)
 | |
|         offset = newoffset
 | |
|     size = f.tell()
 | |
| 
 | |
|     t2 = time.time()
 | |
|     f.close()
 | |
| 
 | |
|     dt = t2-t1
 | |
|     print size, "bytes in", round(dt), "seconds",
 | |
|     if dt:
 | |
|         print "i.e.", size//dt, "bytes/sec",
 | |
|     print
 | |
|     remote._recv(id) # ignored
 | |
| 
 | |
| def fl():
 | |
|     sys.stdout.flush()
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |