17db96d56Sopenharmony_ci"""Recursively copy a directory but skip undesired files and
27db96d56Sopenharmony_cidirectories (CVS, backup files, pyc files, etc)"""
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ciimport sys
57db96d56Sopenharmony_ciimport os
67db96d56Sopenharmony_ciimport shutil
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_civerbose = 1
97db96d56Sopenharmony_cidebug = 0
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cidef isclean(name):
127db96d56Sopenharmony_ci    if name in ('CVS', '.cvsignore', '.svn'):
137db96d56Sopenharmony_ci        return 0
147db96d56Sopenharmony_ci    if name.lower() == '.ds_store': return 0
157db96d56Sopenharmony_ci    if name.endswith('~'): return 0
167db96d56Sopenharmony_ci    if name.endswith('.BAK'): return 0
177db96d56Sopenharmony_ci    if name.endswith('.pyc'): return 0
187db96d56Sopenharmony_ci    if name.endswith('.pyo'): return 0
197db96d56Sopenharmony_ci    if name.endswith('.orig'): return 0
207db96d56Sopenharmony_ci    return 1
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_cidef copycleandir(src, dst):
237db96d56Sopenharmony_ci    for cursrc, dirs, files in os.walk(src):
247db96d56Sopenharmony_ci        assert cursrc.startswith(src)
257db96d56Sopenharmony_ci        curdst = dst + cursrc[len(src):]
267db96d56Sopenharmony_ci        if verbose:
277db96d56Sopenharmony_ci            print("mkdir", curdst)
287db96d56Sopenharmony_ci        if not debug:
297db96d56Sopenharmony_ci            if not os.path.exists(curdst):
307db96d56Sopenharmony_ci                os.makedirs(curdst)
317db96d56Sopenharmony_ci        for fn in files:
327db96d56Sopenharmony_ci            if isclean(fn):
337db96d56Sopenharmony_ci                if verbose:
347db96d56Sopenharmony_ci                    print("copy", os.path.join(cursrc, fn), os.path.join(curdst, fn))
357db96d56Sopenharmony_ci                if not debug:
367db96d56Sopenharmony_ci                    shutil.copy2(os.path.join(cursrc, fn), os.path.join(curdst, fn))
377db96d56Sopenharmony_ci            else:
387db96d56Sopenharmony_ci                if verbose:
397db96d56Sopenharmony_ci                    print("skipfile", os.path.join(cursrc, fn))
407db96d56Sopenharmony_ci        for i in range(len(dirs)-1, -1, -1):
417db96d56Sopenharmony_ci            if not isclean(dirs[i]):
427db96d56Sopenharmony_ci                if verbose:
437db96d56Sopenharmony_ci                    print("skipdir", os.path.join(cursrc, dirs[i]))
447db96d56Sopenharmony_ci                del dirs[i]
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_cidef main():
477db96d56Sopenharmony_ci    if len(sys.argv) != 3:
487db96d56Sopenharmony_ci        sys.stderr.write("Usage: %s srcdir dstdir\n" % sys.argv[0])
497db96d56Sopenharmony_ci        sys.exit(1)
507db96d56Sopenharmony_ci    copycleandir(sys.argv[1], sys.argv[2])
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ciif __name__ == '__main__':
537db96d56Sopenharmony_ci    main()
54