17db96d56Sopenharmony_ci#! /usr/bin/env python3 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci# mkreal 47db96d56Sopenharmony_ci# 57db96d56Sopenharmony_ci# turn a symlink to a directory into a real directory 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ciimport sys 87db96d56Sopenharmony_ciimport os 97db96d56Sopenharmony_cifrom stat import * 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_cijoin = os.path.join 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_cierror = 'mkreal error' 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ciBUFSIZE = 32*1024 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_cidef mkrealfile(name): 187db96d56Sopenharmony_ci st = os.stat(name) # Get the mode 197db96d56Sopenharmony_ci mode = S_IMODE(st[ST_MODE]) 207db96d56Sopenharmony_ci linkto = os.readlink(name) # Make sure again it's a symlink 217db96d56Sopenharmony_ci with open(name, 'rb') as f_in: # This ensures it's a file 227db96d56Sopenharmony_ci os.unlink(name) 237db96d56Sopenharmony_ci with open(name, 'wb') as f_out: 247db96d56Sopenharmony_ci while 1: 257db96d56Sopenharmony_ci buf = f_in.read(BUFSIZE) 267db96d56Sopenharmony_ci if not buf: break 277db96d56Sopenharmony_ci f_out.write(buf) 287db96d56Sopenharmony_ci os.chmod(name, mode) 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_cidef mkrealdir(name): 317db96d56Sopenharmony_ci st = os.stat(name) # Get the mode 327db96d56Sopenharmony_ci mode = S_IMODE(st[ST_MODE]) 337db96d56Sopenharmony_ci linkto = os.readlink(name) 347db96d56Sopenharmony_ci files = os.listdir(name) 357db96d56Sopenharmony_ci os.unlink(name) 367db96d56Sopenharmony_ci os.mkdir(name, mode) 377db96d56Sopenharmony_ci os.chmod(name, mode) 387db96d56Sopenharmony_ci linkto = join(os.pardir, linkto) 397db96d56Sopenharmony_ci # 407db96d56Sopenharmony_ci for filename in files: 417db96d56Sopenharmony_ci if filename not in (os.curdir, os.pardir): 427db96d56Sopenharmony_ci os.symlink(join(linkto, filename), join(name, filename)) 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_cidef main(): 457db96d56Sopenharmony_ci sys.stdout = sys.stderr 467db96d56Sopenharmony_ci progname = os.path.basename(sys.argv[0]) 477db96d56Sopenharmony_ci if progname == '-c': progname = 'mkreal' 487db96d56Sopenharmony_ci args = sys.argv[1:] 497db96d56Sopenharmony_ci if not args: 507db96d56Sopenharmony_ci print('usage:', progname, 'path ...') 517db96d56Sopenharmony_ci sys.exit(2) 527db96d56Sopenharmony_ci status = 0 537db96d56Sopenharmony_ci for name in args: 547db96d56Sopenharmony_ci if not os.path.islink(name): 557db96d56Sopenharmony_ci print(progname+':', name+':', 'not a symlink') 567db96d56Sopenharmony_ci status = 1 577db96d56Sopenharmony_ci else: 587db96d56Sopenharmony_ci if os.path.isdir(name): 597db96d56Sopenharmony_ci mkrealdir(name) 607db96d56Sopenharmony_ci else: 617db96d56Sopenharmony_ci mkrealfile(name) 627db96d56Sopenharmony_ci sys.exit(status) 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ciif __name__ == '__main__': 657db96d56Sopenharmony_ci main() 66