xref: /third_party/python/Tools/scripts/mkreal.py (revision 7db96d56)
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