[fuchsia] Dbg symbols cipd package doesn't contain tmp dir (#18433)

Fixes: fxb/41743
diff --git a/tools/fuchsia/merge_and_upload_debug_symbols.py b/tools/fuchsia/merge_and_upload_debug_symbols.py
index b40d91d..baa5598 100755
--- a/tools/fuchsia/merge_and_upload_debug_symbols.py
+++ b/tools/fuchsia/merge_and_upload_debug_symbols.py
@@ -21,27 +21,33 @@
   return platform.system() == 'Linux'
 
 
+# out_dir here is of the format "/b/s/w/ir/k/recipe_cleanup/tmpIbWDdp"
+# we need to palce the cipd definition in this directory.
 def GetPackagingDir(out_dir):
-  return os.path.abspath(os.path.join(out_dir, os.pardir))
+  return os.path.abspath(out_dir)
 
 
-def CreateCIPDDefinition(target_arch, out_dir):
+def CreateCIPDDefinition(target_arch, out_dir, symbol_dirs):
   dir_name = os.path.basename(os.path.normpath(out_dir))
-  return """
+  pkg_def = """
 package: flutter/fuchsia-debug-symbols-%s
 description: Flutter and Dart runner debug symbols for Fuchsia. Target architecture %s.
 install_mode: copy
 data:
-  - dir: %s
-""" % (target_arch, target_arch, dir_name)
+""" % (target_arch, target_arch)
+  for symbol_dir in symbol_dirs:
+    symbol_dir_name = os.path.basename(os.path.normpath(symbol_dir))
+    data = '\n  - dir: %s' % (symbol_dir_name)
+    pkg_def = pkg_def + data
+  return pkg_def
 
 
 # CIPD CLI needs the definition and data directory to be relative to each other.
-def WriteCIPDDefinition(target_arch, out_dir):
+def WriteCIPDDefinition(target_arch, out_dir, symbol_dirs):
   _packaging_dir = GetPackagingDir(out_dir)
   yaml_file = os.path.join(_packaging_dir, 'debug_symbols.cipd.yaml')
   with open(yaml_file, 'w') as f:
-    cipd_def = CreateCIPDDefinition(target_arch, out_dir)
+    cipd_def = CreateCIPDDefinition(target_arch, out_dir, symbol_dirs)
     f.write(cipd_def)
   return yaml_file
 
@@ -68,20 +74,28 @@
     try:
       subprocess.check_call(command, cwd=_packaging_dir)
       break
-    except subprocess.CalledProcessError:
-      print('Failed %s times' % tries + 1)
+    except subprocess.CalledProcessError as error:
+      print('Failed %s times.\nError was: %s' % (tries + 1, error))
       if tries == num_tries - 1:
         raise
 
 # Recursively hardlinks contents from one directory to another,
 # skipping over collisions.
 def HardlinkContents(dirA, dirB):
+  internal_symbol_dirs = []
   for src_dir, _, filenames in os.walk(dirA):
     for filename in filenames:
+      # if a file contains 'dbg_success' in its name, it is a stamp file.
+      # An example of this would be
+      # '._dart_jit_runner_dbg_symbols_unstripped_dbg_success' these
+      # are generated by GN and have to be ignored.
+      if 'dbg_success' in filename:
+        continue
       src = os.path.join(src_dir, filename)
       dest_dir = os.path.join(dirB, os.path.relpath(src_dir, dirA))
       try:
         os.makedirs(dest_dir)
+        internal_symbol_dirs.append(dest_dir)
       except:
         pass
       dest = os.path.join(dest_dir, filename)
@@ -92,6 +106,7 @@
         print('%s already exists in destination; skipping linking' % name)
         continue
       os.link(src, dest)
+  return internal_symbol_dirs
 
 def main():
   parser = argparse.ArgumentParser()
@@ -130,11 +145,15 @@
     shutil.rmtree(out_dir)
   os.makedirs(out_dir)
 
+  internal_symbol_dirs = []
   for symbol_dir in symbol_dirs:
-    HardlinkContents(symbol_dir, out_dir)
+    internal_symbol_dirs += HardlinkContents(symbol_dir, out_dir)
+
+  # make these unique
+  internal_symbol_dirs = list(set(internal_symbol_dirs))
 
   arch = args.target_arch
-  cipd_def = WriteCIPDDefinition(arch, out_dir)
+  cipd_def = WriteCIPDDefinition(arch, out_dir, internal_symbol_dirs)
   ProcessCIPDPackage(args.upload, cipd_def, args.engine_version, out_dir, arch)
   return 0