Jelajahi Sumber

Canonicalize paths before linking in gclient-new-workdir.py

This fixes the case where a new workdir is created from a repository
which was previously created with gclient-new-workdir.py and that
repository is later deleted, rendering the symbolic links created by
gclient-new-workdir.py invalid.

It also fixes support_cow() returning 'True' in that case because 'cp
--reflink' does not fail when copying a symlink.


Bug: 721585
Change-Id: I84f4d80b8698af0da346be559d46a328ec0d0e9b
Reviewed-on: https://chromium-review.googlesource.com/842402
Reviewed-by: Aaron Gable <agable@chromium.org>
Commit-Queue: Dirk Pranke <dpranke@chromium.org>
Henrique Ferreiro 7 tahun lalu
induk
melakukan
fd4ad24165
2 mengubah file dengan 8 tambahan dan 1 penghapusan
  1. 4 0
      gclient-new-workdir.py
  2. 4 1
      git_common.py

+ 4 - 0
gclient-new-workdir.py

@@ -50,6 +50,8 @@ def parse_options():
 
 
 
 
 def support_cow(src, dest):
 def support_cow(src, dest):
+  # 'cp --reflink' always succeeds when 'src' is a symlink or a directory
+  assert os.path.isfile(src) and not os.path.islink(src)
   try:
   try:
     subprocess.check_output(['cp', '-a', '--reflink', src, dest],
     subprocess.check_output(['cp', '-a', '--reflink', src, dest],
                             stderr=subprocess.STDOUT)
                             stderr=subprocess.STDOUT)
@@ -74,6 +76,8 @@ def main():
   args = parse_options()
   args = parse_options()
 
 
   gclient = os.path.join(args.repository, '.gclient')
   gclient = os.path.join(args.repository, '.gclient')
+  if os.path.islink(gclient):
+    gclient = os.realpath(gclient)
   new_gclient = os.path.join(args.new_workdir, '.gclient')
   new_gclient = os.path.join(args.new_workdir, '.gclient')
 
 
   if try_vol_snapshot(args.repository, args.new_workdir):
   if try_vol_snapshot(args.repository, args.new_workdir):

+ 4 - 1
git_common.py

@@ -1047,4 +1047,7 @@ def clone_file(repository, new_workdir, link, operation):
   link_dir = os.path.dirname(os.path.join(new_workdir, link))
   link_dir = os.path.dirname(os.path.join(new_workdir, link))
   if not os.path.exists(link_dir):
   if not os.path.exists(link_dir):
     os.makedirs(link_dir)
     os.makedirs(link_dir)
-  operation(os.path.join(repository, link), os.path.join(new_workdir, link))
+  src = os.path.join(repository, link)
+  if os.path.islink(src):
+    src = os.realpath(src)
+  operation(src, os.path.join(new_workdir, link))