2018-07-08 02:24:29 -04:00
|
|
|
# Copyright 2018 Ryan Dahl <ry@tinyclouds.org>
|
|
|
|
# All rights reserved. MIT License.
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
|
2018-07-16 22:40:42 -04:00
|
|
|
def run(args, quiet=False):
|
|
|
|
if not quiet:
|
|
|
|
print " ".join(args)
|
2018-07-08 02:24:29 -04:00
|
|
|
env = os.environ.copy()
|
2018-07-08 13:14:55 -04:00
|
|
|
if os.name == "nt":
|
|
|
|
# Run through shell to make .bat/.cmd files work.
|
|
|
|
args = ["cmd", "/c"] + args
|
2018-07-08 02:24:29 -04:00
|
|
|
subprocess.check_call(args, env=env)
|
|
|
|
|
|
|
|
|
|
|
|
def remove_and_symlink(target, name, target_is_dir=False):
|
|
|
|
try:
|
2018-07-08 13:14:55 -04:00
|
|
|
# On Windows, directory symlink can only be removed with rmdir().
|
|
|
|
if os.name == "nt" and os.path.isdir(name):
|
|
|
|
os.rmdir(name)
|
|
|
|
else:
|
|
|
|
os.unlink(name)
|
2018-07-08 02:24:29 -04:00
|
|
|
except:
|
|
|
|
pass
|
|
|
|
symlink(target, name, target_is_dir)
|
|
|
|
|
|
|
|
|
|
|
|
def symlink(target, name, target_is_dir=False):
|
|
|
|
if os.name == "nt":
|
|
|
|
import ctypes
|
|
|
|
CreateSymbolicLinkW = ctypes.windll.kernel32.CreateSymbolicLinkW
|
|
|
|
CreateSymbolicLinkW.restype = ctypes.c_ubyte
|
|
|
|
CreateSymbolicLinkW.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p,
|
|
|
|
ctypes.c_uint32)
|
|
|
|
|
|
|
|
flags = 0x02 # SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
|
|
|
|
if (target_is_dir):
|
|
|
|
flags |= 0x01 # SYMBOLIC_LINK_FLAG_DIRECTORY
|
|
|
|
if not CreateSymbolicLinkW(name, target, flags):
|
|
|
|
raise ctypes.WinError()
|
|
|
|
else:
|
|
|
|
os.symlink(target, name)
|
|
|
|
|
|
|
|
|
|
|
|
def touch(fname):
|
|
|
|
if os.path.exists(fname):
|
|
|
|
os.utime(fname, None)
|
|
|
|
else:
|
|
|
|
open(fname, 'a').close()
|