>From 22ad26c0b2d86acb21a1eab665ac9d25a2a58d21 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 3 Aug 2022 14:37:12 +0200 Subject: [PATCH 04/12] gnulib-tool.py: Follow gnulib-tool changes, part 20. Follow gnulib-tool changes 2016-01-15 Paul Eggert gnulib-tool: don't assume ln -s works 2016-01-24 Paul Eggert gnulib-tool: don't give up on ln -s so easily 2017-06-08 Bruno Haible gnulib-tool: Fix bug in func_ln_s, from 2016-01-15. * pygnulib/constants.py (symlink_relative): New function. (link_relative): Use it instead of os.symlink. --- ChangeLog | 11 +++++++++++ gnulib-tool.py.TODO | 42 ++++-------------------------------------- pygnulib/constants.py | 26 +++++++++++++++++++++++--- 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index aeec6717fc..2b47dc08af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2022-08-03 Bruno Haible + gnulib-tool.py: Follow gnulib-tool changes, part 20. + Follow gnulib-tool changes + 2016-01-15 Paul Eggert + gnulib-tool: don't assume ln -s works + 2016-01-24 Paul Eggert + gnulib-tool: don't give up on ln -s so easily + 2017-06-08 Bruno Haible + gnulib-tool: Fix bug in func_ln_s, from 2016-01-15. + * pygnulib/constants.py (symlink_relative): New function. + (link_relative): Use it instead of os.symlink. + gnulib-tool.py: Avoid errors when writing to a VFAT file system, part 2. * pygnulib/constants.py (movefile): New function. * pygnulib/*.py: Use it instead of shutil. diff --git a/gnulib-tool.py.TODO b/gnulib-tool.py.TODO index eeecd5ed8a..bfb613fb70 100644 --- a/gnulib-tool.py.TODO +++ b/gnulib-tool.py.TODO @@ -15,6 +15,10 @@ The following commits to gnulib-tool have not yet been reflected in -------------------------------------------------------------------------------- +Inline all 'sed' invocations. + +-------------------------------------------------------------------------------- + Implement the options: --find --extract-recursive-dependencies @@ -37,8 +41,6 @@ Implement the options: --witness-c-macro --vc-files --no-vc-files - -s | --symbolic - --local-symlink -h | --hardlink --local-hardlink -S | --more-symlinks @@ -1076,42 +1078,6 @@ Date: Sun Oct 16 14:11:18 2016 +0200 -------------------------------------------------------------------------------- -commit c09c24932066ecee81756adf2fca840b7c146e9d -Author: Bruno Haible -Date: Thu Jun 8 14:45:39 2017 +0200 - - gnulib-tool: Fix bug in func_ln_s, from 2016-01-15. - - * gnulib-tool (func_ln_s): Determine cp_src correctly. - -commit d9958eb1eb951f950f9b321419965001b1368a38 -Author: Paul Eggert -Date: Sun Jan 24 14:24:35 2016 -0800 - - gnulib-tool: don't give up on ln -s so easily - - * gnulib-tool (func_ln_s): Don't give up on a later ln -s merely - because an earlier one failed. The targets could be on different - file systems. Problem reported by KO Myung-Hun in: - http://lists.gnu.org/archive/html/bug-gnulib/2016-01/msg00081.html - -commit 350f2c6fb569f42f0a8ff47fd5b7442f24f0e658 -Author: Paul Eggert -Date: Fri Jan 15 10:12:41 2016 -0800 - - * gnulib-tool: fix stray debug line in previous patch - -commit 0e50dd0071be89825810dbf4c2310663dcb77767 -Author: Paul Eggert -Date: Wed May 1 13:39:22 2013 +0900 - - gnulib-tool: don't assume ln -s works - - * gnulib-tool (func_ln_s): New function. - (func_ln): Use it. - --------------------------------------------------------------------------------- - commit 9bdf6c8a0cdeb13c12e4b65dee9538c5468dbe1d Author: Bruno Haible Date: Sun Aug 19 14:06:50 2012 +0200 diff --git a/pygnulib/constants.py b/pygnulib/constants.py index 34c17aec46..ca5e3f79aa 100644 --- a/pygnulib/constants.py +++ b/pygnulib/constants.py @@ -338,6 +338,26 @@ def movefile(src, dest): os.remove(src) +def symlink_relative(src, dest): + '''Like ln -s, except use cp -p if ln -s fails. + src is either absolute or relative to the directory of dest.''' + try: + os.symlink(src, dest) + except PermissionError: + sys.stderr.write('%s: ln -s failed; falling back on cp -p\n' % APP['name']) + if src.startswith('/') or (len(src) >= 2 and src[1] == ':'): + # src is absolute. + cp_src = src + else: + # src is relative to the directory of dest. + last_slash = dest.rfind('/') + if last_slash >= 0: + cp_src = joinpath(dest[0:last_slash-1], src) + else: + cp_src = src + copyfile2(cp_src, dest) + + def link_relative(src, dest): '''Like ln -s, except that src is given relative to the current directory (or absolute), not given relative to the directory of dest.''' @@ -348,17 +368,17 @@ def link_relative(src, dest): raise TypeError( 'dest must be a string, not %s' % (type(dest).__name__)) if src.startswith('/') or (len(src) >= 2 and src[1] == ':'): - os.symlink(src, dest) + symlink_relative(src, dest) else: # if src is not absolute if dest.startswith('/') or (len(dest) >= 2 and dest[1] == ':'): cwd = os.getcwd() - os.symlink(joinpath(cwd, src), dest) + symlink_relative(joinpath(cwd, src), dest) else: # if dest is not absolute destdir = os.path.dirname(dest) if not destdir: destdir = '.' src = relativize(destdir, src) - os.symlink(src, dest) + symlink_relative(src, dest) def link_if_changed(src, dest): -- 2.34.1