Commit 28c84c16 authored by Mark Mentovai's avatar Mark Mentovai Committed by Commit Bot

[Mac] Preserve symbolic links in the copy_bundle_data tool

This is a reland of 6a008993, which was reverted in 235d842a.
(Thus, this is a revert of that revert.)

Since the last attempt, the structure of the keystone_registration
bundle_data rule in third_party/googlemac (via src-internal DEPS) has
changed to avoid the dangling symbolic link problem previously
encountered.

The description from 6a008993:

The copy_bundle_data tool is implemented in terms of pax for directories
and ln hard links for files. The pax command does preserve symbolic
links within the tree that is being copied. But with the way that pax is
invoked by the tool, cd-ing into the source, if the source is itself
a symbolic link to a directory, the tree will be logically copied rather
than just as a symbolic link.

A similar issue exists with the non-directory symbolic link source case,
where a hard link will be produced instead of a symbolic link.

Fix both of these cases by specifically testing if the source is a
symbolic link and then re-creating it if so.

Bug: 955936
Change-Id: Ia13ddf743603e98337c3523e9101e7627e1c31d0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1637673Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Commit-Queue: Mark Mentovai <mark@chromium.org>
Cr-Commit-Position: refs/heads/master@{#665203}
parent 9a8e7c0c
......@@ -432,10 +432,21 @@ template("mac_toolchain") {
# constructed using shell variable $OLDPWD (automatically set when
# cd is used) as computing the relative path is a bit complex and
# using pwd would requires a sub-shell to be created.
#
# A special case exists for copying symbolic links. The pax command,
# as noted above, preserves symbolic links but only if they are a child
# node of source. But if the source itself is a symbolic link to a
# directory, the cd into it will copy it as a logical tree rather than
# a symbolic link. Similarly, if source is a symbolic link to a file,
# then the copy_command hard link will not produce a symbolic link, it
# would hard link the file pointed to by the symbolic link.
_copydir = "mkdir -p {{output}} && cd {{source}} && " +
"pax -rwl . \"\$OLDPWD\"/{{output}}"
command = "rm -rf {{output}} && if [[ -d {{source}} ]]; then " +
_copydir + "; else " + copy_command + "; fi"
_copylink = "ln -s \$(readlink {{source}}) {{output}}"
command = "rm -rf {{output}} && " +
"if [[ -L {{source}} ]]; then $_copylink; " +
"elif [[ -d {{source}} ]]; then $_copydir; " +
"else $copy_command; fi"
description = "COPY_BUNDLE_DATA {{source}} {{output}}"
pool = ":bundle_pool($default_toolchain)"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment