From 6ac18ecb84332b6e84f498434812541f58a64ed4 Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Tue, 22 Mar 2016 14:08:17 -0700 Subject: Improve BUILDDIR handling with symlinks 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 --- reverse_path.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 reverse_path.py (limited to 'reverse_path.py') diff --git a/reverse_path.py b/reverse_path.py new file mode 100755 index 000000000..7b7d6217b --- /dev/null +++ b/reverse_path.py @@ -0,0 +1,40 @@ +#!/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])) -- cgit v1.2.3-59-g8ed1b