| 
									
										
										
										
											2003-06-19 22:35:20 +00:00
										 |  |  | """Recursively copy a directory but skip undesired files and
 | 
					
						
							|  |  |  | directories (CVS, backup files, pyc files, etc)"""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import shutil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | verbose = 1 | 
					
						
							|  |  |  | debug = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def isclean(name): | 
					
						
							| 
									
										
										
										
											2022-11-16 17:17:18 +08:00
										 |  |  |     if name in ('CVS', '.cvsignore', '.svn'): | 
					
						
							|  |  |  |         return 0 | 
					
						
							|  |  |  |     if name.lower() == '.ds_store': return 0 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     if name.endswith('~'): return 0 | 
					
						
							|  |  |  |     if name.endswith('.BAK'): return 0 | 
					
						
							|  |  |  |     if name.endswith('.pyc'): return 0 | 
					
						
							|  |  |  |     if name.endswith('.pyo'): return 0 | 
					
						
							|  |  |  |     if name.endswith('.orig'): return 0 | 
					
						
							|  |  |  |     return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-19 22:35:20 +00:00
										 |  |  | def copycleandir(src, dst): | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     for cursrc, dirs, files in os.walk(src): | 
					
						
							|  |  |  |         assert cursrc.startswith(src) | 
					
						
							|  |  |  |         curdst = dst + cursrc[len(src):] | 
					
						
							|  |  |  |         if verbose: | 
					
						
							| 
									
										
										
										
											2007-08-30 18:39:28 +00:00
										 |  |  |             print("mkdir", curdst) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |         if not debug: | 
					
						
							|  |  |  |             if not os.path.exists(curdst): | 
					
						
							|  |  |  |                 os.makedirs(curdst) | 
					
						
							|  |  |  |         for fn in files: | 
					
						
							|  |  |  |             if isclean(fn): | 
					
						
							|  |  |  |                 if verbose: | 
					
						
							| 
									
										
										
										
											2007-08-30 18:39:28 +00:00
										 |  |  |                     print("copy", os.path.join(cursrc, fn), os.path.join(curdst, fn)) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |                 if not debug: | 
					
						
							|  |  |  |                     shutil.copy2(os.path.join(cursrc, fn), os.path.join(curdst, fn)) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 if verbose: | 
					
						
							| 
									
										
										
										
											2007-08-30 18:39:28 +00:00
										 |  |  |                     print("skipfile", os.path.join(cursrc, fn)) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |         for i in range(len(dirs)-1, -1, -1): | 
					
						
							|  |  |  |             if not isclean(dirs[i]): | 
					
						
							|  |  |  |                 if verbose: | 
					
						
							| 
									
										
										
										
											2007-08-30 18:39:28 +00:00
										 |  |  |                     print("skipdir", os.path.join(cursrc, dirs[i])) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |                 del dirs[i] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-19 22:35:20 +00:00
										 |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     if len(sys.argv) != 3: | 
					
						
							|  |  |  |         sys.stderr.write("Usage: %s srcdir dstdir\n" % sys.argv[0]) | 
					
						
							|  |  |  |         sys.exit(1) | 
					
						
							|  |  |  |     copycleandir(sys.argv[1], sys.argv[2]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-19 22:35:20 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |     main() |