Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # vim:fenc=utf-8
  4. # name : update.py
  5. # Copyright 2019 last scene
  6. # Created: <2019-09-30>
  7. # Distributed under terms of the MIT license.
  8.  
  9.  
  10. import sys
  11. import os
  12. import time
  13. import datetime
  14. import subprocess
  15. import platform
  16. import shutil
  17.  
  18.  
  19. '''
  20.  
  21. performs one-way update processing between specific directories based on file existence , update date and time.
  22.  
  23. '''
  24.  
  25. #無視したいファイルの一部文字列
  26. ignore_list = [
  27. '/.git',
  28. '/ref',
  29. '/_',
  30. '.code-workspace',
  31. '.aep',
  32. '/old',
  33. '.pyc',
  34. '/Adobe',
  35. '.gitignore',
  36. '_tmp'
  37. ]
  38.  
  39.  
  40. def update(source_path, target_path, overwrite=True, new=True, delete=True, **kwargs):
  41. test = kwargs.setdefault('test', False)
  42.  
  43. def _update(source_path, target_path, overwrite=True, new=True, delete=True, **kwargs):
  44. #dir
  45. s_top_dir_name, t_top_dir_name = _get_root(source_path, target_path)
  46.  
  47. ret_dir_dict = {}
  48. for p in [source_path, target_path]:
  49. ret = {}
  50. for _dir in find_all_dirs(p):
  51. d = os.stat(_dir)
  52. dt = datetime.datetime.fromtimestamp(d.st_mtime)
  53. ret[_dir] = dt
  54. ret_dir_dict[p] = ret
  55.  
  56. sdk_set = []
  57. tdk_set = []
  58. for sk in ret_dir_dict[source_path].keys():
  59. rel_sk = sk.split(os.sep + s_top_dir_name + os.sep)[-1]
  60. rel_sk = os.sep + rel_sk
  61. sdk_set.append(rel_sk)
  62. for tk in ret_dir_dict[target_path].keys():
  63. rel_tk = tk.split(os.sep + t_top_dir_name + os.sep)[-1]
  64. rel_tk = os.sep + rel_tk
  65. tdk_set.append(rel_tk)
  66.  
  67. #file
  68. ret_dict = {}
  69. for p in [source_path, target_path]:
  70. ret = {}
  71. for file in find_all_files(p):
  72. f = os.stat(file)
  73. dt = datetime.datetime.fromtimestamp(f.st_mtime)
  74. ret[file] = dt
  75. ret_dict[p] = ret
  76.  
  77. sk_set = []
  78. tk_set = []
  79. for sk in ret_dict[source_path].keys():
  80. rel_sk = sk.split(os.sep + s_top_dir_name + os.sep)[-1]
  81. rel_sk = os.sep + rel_sk
  82. sk_set.append(rel_sk)
  83. for tk in ret_dict[target_path].keys():
  84. rel_tk = tk.split(os.sep + t_top_dir_name + os.sep)[-1]
  85. rel_tk = os.sep + rel_tk
  86. tk_set.append(rel_tk)
  87.  
  88. return sk_set, tk_set, sdk_set, tdk_set, ret_dir_dict, ret_dict
  89.  
  90. def _overwrite(ret_dict, sk_set, tk_set):
  91. file_overwrite_update_dict = {}
  92. same = set(sk_set) & set(tk_set)
  93.  
  94. for sm in same:
  95. f_src_path = source_path + sm
  96. f_tar_path = target_path + sm
  97.  
  98. if os.path.exists(f_src_path) and os.path.exists(f_tar_path):
  99. if ret_dict[source_path][f_src_path] > ret_dict[target_path][f_tar_path]:
  100. file_overwrite_update_dict[f_src_path] = f_tar_path
  101. return file_overwrite_update_dict
  102.  
  103. def _new(sk_set, tk_set, sdk_set, tdk_set):
  104. dir_new_update_list = []
  105. file_new_update_dict = {}
  106. new_dir = set(sdk_set) - set(tdk_set)
  107. new_diff = set(sk_set) - set(tk_set)
  108. for nd in new_dir:
  109. d_tar_path = target_path + nd
  110. dir_new_update_list.append(d_tar_path)
  111. for dif in new_diff:
  112. f_src_path = source_path + dif
  113. f_tar_path = target_path + dif
  114. file_new_update_dict[f_src_path] = f_tar_path
  115.  
  116. return dir_new_update_list, file_new_update_dict
  117.  
  118. def _delete(sk_set, tk_set, sdk_set, tdk_set):
  119. dir_del_update_list = []
  120. file_del_update_list = []
  121. del_dir_diff = set(tdk_set) - set(sdk_set)
  122. del_diff = set(tk_set) - set(sk_set)
  123. for dif in del_dir_diff:
  124. d_tar_path = target_path + dif
  125. dir_del_update_list.append(d_tar_path)
  126. for dif in del_diff:
  127. f_tar_path = target_path + dif
  128. file_del_update_list.append(f_tar_path)
  129.  
  130. return dir_del_update_list, file_del_update_list
  131.  
  132. def _get_root(source_path, target_path):
  133. s_top_dir_name = source_path.split(os.sep)[-1]
  134. t_top_dir_name = target_path.split(os.sep)[-1]
  135. if s_top_dir_name == os.sep:
  136. s_top_dir_name = source_path.split(os.sep)[-2]
  137. if t_top_dir_name == os.sep:
  138. t_top_dir_name = target_path.split(os.sep)[-2]
  139. return s_top_dir_name, t_top_dir_name
  140.  
  141. sk_set, tk_set, sdk_set, tdk_set, ret_dir_dict, ret_dict = _update(source_path,
  142. target_path,
  143. overwrite=overwrite,
  144. new=new,
  145. delete=delete
  146. )
  147.  
  148. if overwrite:
  149. file_overwrite_update_dict = _overwrite(ret_dict, sk_set, tk_set)
  150. if new:
  151. dir_new_update_list, file_new_update_dict = _new(sk_set, tk_set, sdk_set, tdk_set)
  152. if delete:
  153. dir_del_update_list, file_del_update_list = _delete(sk_set, tk_set, sdk_set, tdk_set)
  154.  
  155. if not test:
  156. if overwrite:
  157. for src, dist in file_overwrite_update_dict.items():
  158. shutil.copy(src, dist)
  159. print('# Overwrite copy newer file : {} -> {}'.format(src, dist))
  160.  
  161. if new:
  162. dir_new_update_list.sort(key=len)
  163. for dist in dir_new_update_list:
  164. if not os.path.exists(dist):
  165. os.mkdir(dist)
  166. print('# Make the same directory : {}'.format(dist))
  167. for src, dist in file_new_update_dict.items():
  168. shutil.copy(src, dist)
  169. print('# Make new files : {} -> {}'.format(src, dist))
  170.  
  171. if delete:
  172. for del_tar in file_del_update_list:
  173. os.remove(del_tar)
  174. print('# Delete files : {}'.format(del_tar))
  175. dir_del_update_list.sorted(key=len)
  176. for del_tar in dir_del_update_list:
  177. shutil.rmtree(del_tar)
  178. print('# Delete directory : {}'.format(del_tar))
  179.  
  180. else:
  181. print('#### TEST mode ###')
  182. if overwrite:
  183. for src, dist in file_overwrite_update_dict.items():
  184. print('# Overwrite copy newer file : {} -> {}'.format(src, dist))
  185.  
  186. if new:
  187. dir_new_update_list.sort(key=len)
  188. for dist in dir_new_update_list:
  189. if not os.path.exists(dist):
  190. print('# Make the same directory : {}'.format(dist))
  191. for src, dist in file_new_update_dict.items():
  192. print('# Make new files : {} -> {}'.format(src, dist))
  193.  
  194. if delete:
  195. for del_tar in file_del_update_list:
  196. print('# Delete files : {}'.format(del_tar))
  197. for del_tar in dir_del_update_list:
  198. print('# Delete directory : {}'.format(del_tar))
  199.  
  200. print('# Done.')
  201.  
  202.  
  203. def find_all_files(directory, ignores=ignore_list):
  204. for root, dirs, files in os.walk(directory):
  205. for file in files:
  206. p = os.path.join(root, file)
  207. ignore = False
  208. for ig in ignores:
  209. if ig in p:
  210. ignore = True
  211. break
  212. if not ignore:
  213. yield p
  214.  
  215.  
  216. def find_all_dirs(directory, ignores=ignore_list):
  217. for root, dirs, _ in os.walk(directory):
  218. for _dir in dirs:
  219. p = os.path.join(root, _dir)
  220. ignore = False
  221. for ig in ignores:
  222. if ig in p:
  223. ignore = True
  224. break
  225. if not ignore:
  226. yield p
  227.  
  228.  
  229. if __name__ == "__main__":
  230. source_path = sys.argv[1]
  231. target_path = sys.argv[2]
  232. update(source_path, target_path, overwrite=True, new=True, delete=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement