6ac18ecb84
If BUILDDIR is a local symlink to another directory in the same parent directory (out -> out.angler), then using out and .. as relative paths to get back and forth work. But if BUILDDIR is a symlink to another directory altogether (out -> /mnt/sdd/out.master), then we shouldn't be relying on relative paths (so that the source directory can still be moved). Change-Id: I946c8116090410ab2b935eafba9b6e96f5f2f1dd
40 lines
1.3 KiB
Python
Executable file
40 lines
1.3 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import sys
|
|
|
|
# Find the best reverse path to reference the current directory from another
|
|
# directory. We use this to find relative paths to and from the source and build
|
|
# directories.
|
|
#
|
|
# If the directory is given as an absolute path, return an absolute path to the
|
|
# current directory.
|
|
#
|
|
# If there's a symlink involved, and the same relative path would not work if
|
|
# the symlink was replace with a regular directory, then return an absolute
|
|
# path. This handles paths like out -> /mnt/ssd/out
|
|
#
|
|
# For symlinks that can use the same relative path (out -> out.1), just return
|
|
# the relative path. That way out.1 can be renamed as long as the symlink is
|
|
# updated.
|
|
#
|
|
# For everything else, just return the relative path. That allows the source and
|
|
# output directories to be moved as long as they stay in the same position
|
|
# relative to each other.
|
|
def reverse_path(path):
|
|
if path.startswith("/"):
|
|
return os.path.abspath('.')
|
|
|
|
realpath = os.path.relpath(os.path.realpath('.'), os.path.realpath(path))
|
|
relpath = os.path.relpath('.', path)
|
|
|
|
if realpath != relpath:
|
|
return os.path.abspath('.')
|
|
|
|
return relpath
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print(reverse_path(sys.argv[1]))
|