1b64478747b87c045f07b9a56b2ca3179260e4c4
hiram
  Wed Aug 12 16:20:20 2026 -0700
protect a string substitution against odd characters per code review refs #38005

diff --git src/hg/makeDb/doc/asmHubs/mkSymLinks.pl src/hg/makeDb/doc/asmHubs/mkSymLinks.pl
index 604760b05ea..1d681017129 100755
--- src/hg/makeDb/doc/asmHubs/mkSymLinks.pl
+++ src/hg/makeDb/doc/asmHubs/mkSymLinks.pl
@@ -238,31 +238,31 @@
    `ln -s "${buildDir}/${asmId}.rmsk.customLib.fa.gz" "${destDir}/${accessionId}.rmsk.customLib.fa.gz"` if (-s "${buildDir}/${asmId}.rmsk.customLib.fa.gz");
   `ln -s "${buildDir}/${asmId}.repeatMasker.out.gz" "${destDir}/${accessionId}.repeatMasker.out.gz"` if (-s "${buildDir}/${asmId}.repeatMasker.out.gz");
   `ln -s "${buildDir}/${asmId}.repeatModeler.out.gz" "${destDir}/${accessionId}.repeatModeler.out.gz"` if (-s "${buildDir}/${asmId}.repeatModeler.out.gz");
   `ln -s "${buildDir}/${asmId}.repeatMasker.version.txt" "${destDir}/${accessionId}.repeatMasker.version.txt"` if (-s "${buildDir}/${asmId}.repeatMasker.version.txt");
   `ln -s "${buildDir}/${asmId}.repeatModeler.version.txt" "${destDir}/${accessionId}.repeatModeler.version.txt"` if (-s "${buildDir}/${asmId}.repeatModeler.version.txt");
   `ln -s "${buildDir}/${asmId}.repeatModeler.families.fa.gz" "${destDir}/${accessionId}.repeatModeler.families.fa.gz"` if (-s "${buildDir}/${asmId}.repeatModeler.families.fa.gz");
   `ln -s "${buildDir}/${asmId}.repeatModeler.families.stk.gz" "${destDir}/${accessionId}.repeatModeler.families.stk.gz"` if (-s "${buildDir}/${asmId}.repeatModeler.families.stk.gz");
   `ln -s "${buildDir}/${asmId}.repeatModeler.2bit" "${destDir}/${accessionId}.repeatModeler.2bit"` if (-s "${buildDir}/${asmId}.repeatModeler.2bit");
   `ln -s "${buildDir}/${asmId}.rmod.log.txt" "${destDir}/${accessionId}.rmod.log.txt"` if (-s "${buildDir}/${asmId}.rmod.log.txt");
   `ln -s "${buildDir}/download/${asmId}_assembly_report.txt" "${destDir}/${accessionId}_assembly_report.txt"` if (-s "${buildDir}/download/${asmId}_assembly_report.txt");
    if (-d "${buildDir}/trackData/ncbiGene/archive") {
       `mkdir -p "${buildDir}/archive"`;
       `mkdir -p "${buildDir}/archive/ncbiGene"`;
       `mkdir -p "${destDir}/archive"`;
       foreach my $subDir (grep { -d } glob("${buildDir}/trackData/ncbiGene/archive/20*")) {
-        $subDir =~ s#${buildDir}/##;
+        $subDir =~ s#\Q${buildDir}\E/##;
         my $archiveDate = basename(${subDir});
         `rm -f "${buildDir}/archive/ncbiGene/${archiveDate}"`;
         `ln -s "../../${subDir}" "${buildDir}/archive/ncbiGene/"`;
       }
       `ln -s "${buildDir}/archive/ncbiGene" "${destDir}/archive/ncbiGene"`;
    }
   # trackDb.txt still needed for use by top-level genomes.txt file
   `ln -s "${buildDir}/${asmId}.trackDb.txt" "${destDir}/trackDb.txt"` if (-s "${buildDir}/${asmId}.trackDb.txt");
   # genomes.txt obsolete now with single file
 #   `ln -s "${buildDir}/${asmId}.genomes.txt" "${destDir}/genomes.txt"` if (-s "${buildDir}/${asmId}.genomes.txt");
   `ln -s "${buildDir}/${asmId}.download.genomes.txt" "${destDir}/download.genomes.txt"` if (-s "${buildDir}/${asmId}.download.genomes.txt");
    foreach my $hubTxt (@stageHub) {
      if (-s "${buildDir}/${hubTxt}.hub.txt") {
        `ln -s "${buildDir}/${hubTxt}.hub.txt" "${destDir}/${hubTxt}.hub.txt"`;
        `ln -s "${buildDir}/${hubTxt}.hub.txt" "${gbdbDir}/${hubTxt}.hub.txt"`;