From: Rob Browning Date: Sat, 9 Jan 2016 18:55:45 +0000 (-0600) Subject: helpers: rename realpath to resolve_parent X-Git-Tag: 0.28-rc1~34 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=bup.git;a=commitdiff_plain;h=dd2bf330103347208f63198c7e8a1490bddc0c6e helpers: rename realpath to resolve_parent helpers.realpath does not behave quite like os.path.realpath since it doesn't resolve any leaf symlink, so to avoid confusion, rename it to resolve_parent. Signed-off-by: Rob Browning Tested-by: Rob Browning --- diff --git a/cmd/save-cmd.py b/cmd/save-cmd.py index 7f72d00..961d7f3 100755 --- a/cmd/save-cmd.py +++ b/cmd/save-cmd.py @@ -69,7 +69,8 @@ if opt.graft: old_path, new_path = splitted_parameter if not (old_path and new_path): o.fatal("a graft point cannot be empty") - graft_points.append((realpath(old_path), realpath(new_path))) + graft_points.append((resolve_parent(old_path), + resolve_parent(new_path))) is_reverse = os.environ.get('BUP_SERVER_REVERSE') if is_reverse and opt.remote: diff --git a/lib/bup/drecurse.py b/lib/bup/drecurse.py index de8e5aa..90b7f26 100644 --- a/lib/bup/drecurse.py +++ b/lib/bup/drecurse.py @@ -40,7 +40,7 @@ def _dirlist(): try: st = xstat.lstat(n) except OSError as e: - add_error(Exception('%s: %s' % (realpath(n), str(e)))) + add_error(Exception('%s: %s' % (resolve_parent(n), str(e)))) continue if (st.st_mode & _IFMT) == stat.S_IFDIR: n += '/' diff --git a/lib/bup/helpers.py b/lib/bup/helpers.py index 377678b..b052b63 100644 --- a/lib/bup/helpers.py +++ b/lib/bup/helpers.py @@ -247,8 +247,8 @@ to return multiple strings in order to respect ARG_MAX).""" yield readpipe(command + sub_args, preexec_fn=preexec_fn) -def realpath(p): - """Get the absolute path of a file. +def resolve_parent(p): + """Return the absolute path of a file without following any final symlink. Behaves like os.path.realpath, but doesn't follow a symlink for the last element. (ie. if 'p' itself is a symlink, this one won't follow it, but it @@ -895,15 +895,15 @@ def parse_excludes(options, fatal): for flag in options: (option, parameter) = flag if option == '--exclude': - excluded_paths.append(realpath(parameter)) + excluded_paths.append(resolve_parent(parameter)) elif option == '--exclude-from': try: - f = open(realpath(parameter)) + f = open(resolve_parent(parameter)) except IOError as e: raise fatal("couldn't read %s" % parameter) for exclude_path in f.readlines(): # FIXME: perhaps this should be rstrip('\n') - exclude_path = realpath(exclude_path.strip()) + exclude_path = resolve_parent(exclude_path.strip()) if exclude_path: excluded_paths.append(exclude_path) return sorted(frozenset(excluded_paths)) @@ -923,7 +923,7 @@ def parse_rx_excludes(options, fatal): fatal('invalid --exclude-rx pattern (%s): %s' % (parameter, ex)) elif option == '--exclude-rx-from': try: - f = open(realpath(parameter)) + f = open(resolve_parent(parameter)) except IOError as e: raise fatal("couldn't read %s" % parameter) for pattern in f.readlines(): diff --git a/lib/bup/index.py b/lib/bup/index.py index fdf3043..d4dbc55 100644 --- a/lib/bup/index.py +++ b/lib/bup/index.py @@ -443,7 +443,7 @@ class Writer: self.count = 0 self.lastfile = None self.filename = None - self.filename = filename = realpath(filename) + self.filename = filename = resolve_parent(filename) self.metastore = metastore self.tmax = tmax (dir,name) = os.path.split(filename) @@ -529,7 +529,7 @@ class Writer: def reduce_paths(paths): xpaths = [] for p in paths: - rp = realpath(p) + rp = resolve_parent(p) try: st = os.lstat(rp) if stat.S_ISDIR(st.st_mode): diff --git a/lib/bup/t/tindex.py b/lib/bup/t/tindex.py index 106d0fe..14a8d4a 100644 --- a/lib/bup/t/tindex.py +++ b/lib/bup/t/tindex.py @@ -1,8 +1,11 @@ import os import time, tempfile + from bup import index, metadata from bup.helpers import * +import bup.helpers as helpers import bup.xstat as xstat + from wvtest import * lib_t_dir = os.getcwd() @@ -14,11 +17,11 @@ def index_basic(): cd = os.path.realpath('../../../t') WVPASS(cd) sd = os.path.realpath(cd + '/sampledata') - WVPASSEQ(index.realpath(cd + '/sampledata'), sd) + WVPASSEQ(helpers.resolve_parent(cd + '/sampledata'), sd) WVPASSEQ(os.path.realpath(cd + '/sampledata/x'), sd + '/x') WVPASSEQ(os.path.realpath(cd + '/sampledata/var/abs-symlink'), sd + '/var/abs-symlink-target') - WVPASSEQ(index.realpath(cd + '/sampledata/var/abs-symlink'), + WVPASSEQ(helpers.resolve_parent(cd + '/sampledata/var/abs-symlink'), sd + '/var/abs-symlink') diff --git a/lib/bup/t/tmetadata.py b/lib/bup/t/tmetadata.py index 4aa87cc..65742dd 100644 --- a/lib/bup/t/tmetadata.py +++ b/lib/bup/t/tmetadata.py @@ -1,7 +1,7 @@ import errno, glob, grp, pwd, stat, tempfile, subprocess import bup.helpers as helpers from bup import git, metadata, vfs -from bup.helpers import clear_errors, detect_fakeroot, is_superuser, realpath +from bup.helpers import clear_errors, detect_fakeroot, is_superuser, resolve_parent from wvtest import * from bup.xstat import utime, lutime @@ -135,7 +135,7 @@ def test_metadata_method(): ex(bup_path, '-d', bup_dir, 'save', '-tvvn', 'test', data_path) git.check_repo_or_die(bup_dir) top = vfs.RefList(None) - n = top.lresolve('/test/latest' + realpath(data_path)) + n = top.lresolve('/test/latest' + resolve_parent(data_path)) m = n.metadata() WVPASS(m.mtime == test_time2) WVPASS(len(n.subs()) == 2) diff --git a/t/lib.sh b/t/lib.sh index e9dc25e..5c5b01e 100644 --- a/t/lib.sh +++ b/t/lib.sh @@ -12,12 +12,12 @@ force-delete() "$bup_t_lib_script_home/force-delete" "$@" } -realpath() +resolve-parent() { test "$#" -eq 1 || return $? echo "$1" | \ PYTHONPATH="$bup_t_lib_script_home/../lib" bup-python -c \ - "import sys, bup.helpers; print bup.helpers.realpath(sys.stdin.readline())" \ + "import sys, bup.helpers; print bup.helpers.resolve_parent(sys.stdin.readline())" \ || return $? } diff --git a/t/test.sh b/t/test.sh index d270e61..f82c345 100755 --- a/t/test.sh +++ b/t/test.sh @@ -197,8 +197,8 @@ c/" WVSTART "save disjoint top-level directories" ( # Resolve any symlinks involving the top top-level dirs. - real_pwd="$(WVPASS realpath .)" || exit $? - real_tmp="$(WVPASS realpath /tmp/.)" || exit $? + real_pwd="$(WVPASS resolve-parent .)" || exit $? + real_tmp="$(WVPASS resolve-parent /tmp/.)" || exit $? pwd_top="$(echo $real_pwd | WVPASS awk -F "/" '{print $2}')" || exit $? tmp_top="$(echo $real_tmp | WVPASS awk -F "/" '{print $2}')" || exit $?